Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我如何理解llvm何时将签名更改为函数_C++_C_Llvm - Fatal编程技术网

C++ 我如何理解llvm何时将签名更改为函数

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

我有这样的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;博士:您选择了一个非常恶劣的角落进行探索。如果您真的关心这样的函数签名,那么从查看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++世界的东西。伊莱说得对。