C++ 我如何理解llvm何时将签名更改为函数
我有这样的C代码:C++ 我如何理解llvm何时将签名更改为函数,c++,c,llvm,C++,C,Llvm,我有这样的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} ... cal
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;博士:您选择了一个非常恶劣的角落进行探索。如果您真的关心这样的函数签名,那么从查看AMD64 ABI(或ARM ABI)开始,看看通过寄存器传递结构的规则。如果你真的不关心这些特定的用例,那么就找一些简单的例子来使用。那么,@Collin this is RVO是怎么说的呢。 我们可以理解llvm何时将签名更改为按属性函数。
在代码中,我们可以使用方法检测到这一点我假设这是
llvm
(clang
)的实现方式,我使用-O0选项编译C文件(到位代码)(是的,通过clang)我想你必须仔细研究clang代码才能确定这一点,但是,这种方式返回类类型可能是clang
编译方式的基础,即使-O0
也无法关闭它。也许你知道如何在clang
中禁用RVO吗?p.s.RVO不能禁用。它不是RVO。RVO是完全不同于C++世界的东西。伊莱说得对。