根据https://llvm.org/docs/LangRef.html#functions
LLVM 函数定义由“define”关键字、可选链接类型、可选运行时抢占说明符、可选可见性样式、可选 DLL 存储类、可选调用约定、可选 unnamed_addr 属性、返回类型、可选返回类型的参数属性...
因此,返回类型,然后是返回类型的参数属性。
但鉴于:
int main() {
std::cout << "Hello, world!\n";
return 0;
}
发出铿锵声:
define dso_local noundef i32 @main() #0 {
i32
是返回类型,noundef
是参数属性,但后者放在前者之前。
我错过了什么?
我用一个简短的评论来回答,但我认为它需要一个正确的答案......
noundef i32
说调用者可以依赖返回值而不是undef
。但为什么这是一个参数属性,对吧?
LLVM 中的一切都是一个值。返回值是通过调用某些东西提供的值,参数是由调用者提供的值,1+1 是通过将其他两个值加在一起提供的值,全局变量是拥有一些 RAM 的值。
由于这种单一的一切都是价值的理念,属性有点属于价值。大多数值都有一个可计算的“noundef”状态(x+y 表示如果任一加数表示它可以是 undef,则它可以是 undef),参数和返回值很特殊,因为编译器前端告诉它们如何描述其“noundef”状态通过一些语法:属性。
(写到这里让我想知道load指令。如果编译器确定它读取的全局变量在读取时已初始化,那么load指令是否可以声明为noundef。如果现在不能声明为noundef ,明年有人会提交补丁,因为从概念上讲,负载只是另一个值,如果传递中有任何代码具有特殊的 undef 行为,它应该将该负载视为参数......你明白了。)