声明和属性集中的 LLVM 属性之间是否存在差异

Is there a difference between LLVM attributes in the declare and in an attribute set

比较 LLVM

declare "wasm-import-module"="hellowasi" "wasm-import-name"="reverse" void @reverse(i8*, i32, i8*)

declare void @reverse(i8*, i32, i8*) #1

attributes #1 = { "wasm-import-module"="hellowasi" "wasm-import-name"="reverse" }

除了能够在其他函数上使用 #1 属性列表之外,这两个 LLVM IR 片段之间有什么区别吗?

回答我自己。第一个将属性添加到 return 值,而第二个将属性添加到函数。添加属性时,LLVM 可以接受一个“索引”,其中 0 表示 return 值,~0(按位非 0)是函数,其他值是参数编号。