如果使用“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机器上运行的,在这个机器上结构可以在寄存器中传递。

10-06 07:11