2016-11-17 54 views
6

Bir yapıya dönen 2 C işlevi karşılaştırdım. ABI seviyesinde büyük yapıların birinci işlev argümanı olarak işaretçiden geçeceğini biliyoruz.Aslında ne anlama geliyor?

struct S { 
    int words[8]; 
}; 

struct S fsret() { 
    struct S s; 
    s.words[0] = 1; 
    return s; 
} 

void fout(struct S* s) { 
    s->words[0] = 1; 
} 

Bu işlevler için x86_64 Linux ve Windows için derlemeyi kontrol ettim. fsret, void @fsret(%struct.S* sret %s) olarak beyan edilmiştir.

Bu iki varyantı karşılaştırarak, callee tarafında bir fark yoktur. Bununla birlikte, işlevlerin içinde fsret ek olarak ilk argümanını (yaprağa işaretçi) RAX kaydına kopyalar. Niye ya?

+0

Ne (fsret() kelimeler [0] == 10.) {Do_something eğer) ('yaparsanız; } '? Derleyici bu durumda bir dönüş değeri gerektirir (emin değilim, sadece bir fikir) –

cevap

4

nedeni this yorum diff yatıyor:

if (Subtarget->is64Bit() || Subtarget->isTargetKnownWindowsMSVC()) { 
    for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) { 
    // The x86-64 ABIs require that for returning structs by value we copy 
    // the sret argument into %rax/%eax (depending on ABI) for the return. 
    // Win32 requires us to put the sret argument to %eax as well. 
    // Save the argument into a virtual register so that we can access it 
    // from the return points. 

yüzden Aranan arayan tarafından sağlanan hafızayı doldurmak için vardır ve de geçti işaretçi döndürür.

Bu

Değerler dönen x86_64 r252 Sistem V ABI belge

ile teyit edilir değerlerinin geri aşağıdaki algoritmaya göre yapılır:

  1. sınıflandırılması sınıflandırma ile dönüş türü algoritması.
  2. tip sınıfı BELLEK varsa (ndMarco: büyük madde yani), daha sonra arayanın dönüş değeri için yer sağlar ve işlevinin ilk bağımsız değişken sanki% RDI bu depolama adresini geçer . Aslında, bu adres “gizli” bir ilk argüman haline gelir. Bu depolama alanı, bu bağımsız değişkenin diğer adlarını aracılığıyla aranan veriler tarafından örtüşmemelidir. Dönüşte% rax,% rdi içinde arayan tarafından iletilen adresi içerecektir.
+1

Büyük cevap! Diğer hedefler için benzer gereksinimlerin olup olmadığını biliyor musunuz? –

+0

@ PawełBylica [o32 ve eabi] (http://www.brunocardoso.cc/blog/?p=27), birçok ABI belgesi oldukça zayıftır –