如果使用“clang -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 {
为什么clang将参数分成两个foo?有什么方法可以阻止它这样做吗?我希望能够从其他LLVM生成的代码中调用它,该代码只需要一个foo参数。
答案 0 :(得分:1)
由于LLVM无法表示它,因此Clang以这种方式对平台ABI进行编码。在这个特定的例子中,它的struct传递by-value,这是非常ABI特定的。如果您提供不同的目标三元组到clang,您会注意到这一点 - 您会注意到发出的代码是不同的。我假设这个问题是在x64机器上运行的,其中结构可以在寄存器中传递。