Clang拆分函数参数

时间:2013-10-22 18:48:20

标签: c clang llvm

如果使用“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参数。

1 个答案:

答案 0 :(得分:1)

由于LLVM无法表示它,因此Clang以这种方式对平台ABI进行编码。在这个特定的例子中,它的struct传递by-value,这是非常ABI特定的。如果您提供不同的目标三元组到clang,您会注意到这一点 - 您会注意到发出的代码是不同的。我假设这个问题是在x64机器上运行的,其中结构可以在寄存器中传递。