2013-10-22 77 views
1

如果您编译下面的 “铛-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的一个参数。

+0

传递一个指针? –

+0

您确定LLVM不会生成正确的调用代码吗?我怀疑它会做正确的事情。在C代码中传递一个结构体,llvm将变为两个long。我错过了什么吗? –

+0

调用它的代码将使用LLVM生成,但不是铿锵声。 – brooks94

回答

1

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