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 への引数を 2 つに分割するのはなぜですか? それを防ぐ方法はありますか?foo への引数を 1 つだけ期待する他の LLVM 生成コードから呼び出すことができるようにしたいと考えています。

4

1 に答える 1

1

LLVM にはそれを表現する方法がないため、Clang はこの方法でプラットフォーム ABI をエンコードします。この特定の例では、非常に ABI 固有の値渡し構造体です。これは、clang に別のターゲット トリプルを指定した場合に気付くでしょう。出力されるコードが異なることに気付くでしょう。質問から、これはレジスタで構造体を渡すことができる x64 マシンで実行されると思います。

于 2013-10-22T20:00:15.983 に答える