2013-10-22 78 views
1

如果您編譯下面的 「鐺-S -emit-LLVM struct.c」鏘分割函數參數

struct _mystruct { 
    long long int a; 
    long long int b; 
}; 

struct _mystruct foo(struct _mystruct s) { 
    s.a += 1; 
    return s; 
} 

int main(void) { 
    struct _mystruct s; 
    s.a = 8; 
    s.b = 9; 
    s = foo(s); 
    return s.a; 
} 

...你(除其他事項外):

define { i64, i64 } @foo(i64 %s.coerce0, i64 %s.coerce1) #0 { 

爲什麼鏗鏘將這個論點分成兩部分呢?有什麼辦法可以阻止它這樣做嗎?我希望能夠從其他LLVM生成的代碼中調用它,這些代碼只需要foo的一個參數。

+0

傳遞一個指針? –

+0

您確定LLVM不會生成正確的調用代碼嗎?我懷疑它會做正確的事情。在C代碼中傳遞一個結構體,llvm將變爲兩個long。我錯過了什麼嗎? –

+0

調用它的代碼將使用LLVM生成,但不是鏗鏘聲。 – brooks94

回答

1

由於LLVM無法表示它,Clang以這種方式編碼平臺ABI。在這個特定的例子中,它是通過值非常ABI的結構傳遞。你會注意到這一點,如果你提供不同的目標三倍叮 - 你會注意到,發出的代碼是不同的。我從這個問題假設這是在x64機器上運行的,結構可以在寄存器中傳遞。