1

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

4

1 回答 1

1

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

于 2013-10-22T20:00:15.983 回答