我有这样的C代码:
typedef struct {
int a1;
double a2;
} str3;
...
extern void someVoidFunc(int a);
extern str3 someStrFunc(int b);
int main() {
someVoidFunc(0);
someStrFunc(0);
return 0;
}
在llvm重新表达中,这看起来像:
%struct.str3 = type { i32, double}
...
call void @someVoidFunc(i32 0)
call void @someStrFunc(%struct.str3* sret %tmp, i32 0)
...
所以,我不明白,为什么llvm会更改签名,以及我怎么才能知道哪种类型真正返回函数?
最佳答案
按值传递给函数并按值返回的结构很棘手。它们很棘手,因为它们需要有关编译器如何将它们转换为程序集(平台ABI)的非常具体的规则。尽管LLVM试图保持平台独立性,但是C在这方面很大程度上依赖于平台,因此Clang进行了ABI特定的对按值传递的结构和按值返回的结构的降低,以便随后的LLVM IR->本机代码降低正常工作。
TL; DR:您选择了一个非常讨厌的角落进行探索。如果您真的很在意这样的函数签名,那么首先要通过AMD64 ABI(或ARM ABI)来研究通过寄存器传递结构的规则。如果您真的不关心这些特定的用例,那么可以找到一些更简单的示例。
关于c++ - 我如何理解llvm何时将签名更改为功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16197702/