如果使用“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 {
为什么克朗把争论一分为二?我有什么办法可以阻止它这样做吗?我希望能够从其他LLVM生成的代码调用它,这些代码只需要foo的一个参数。
最佳答案
由于LLVM无法表示它,Clang用这种方式对平台ABI进行编码。在这个特定的例子中,它是通过值传递的结构,这是非常特定于ABI的。如果向clang提供不同的目标三元组,您会注意到这一点—您会注意到发出的代码是不同的。我假设这个问题是在x64机器上运行的,在这个机器上结构可以在寄存器中传递。