使用clang编译程序时,我在LLVM IR中观察到以下内容:
给出以下函数声明:
declare i32 @atoi(i8*) #2
具有以下属性:
attributes #2 = { nounwind readonly "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
当调用该函数时,我可以看到:
%26 = call i32 @atoi(i8* %25) #5
为其定义/重新定义更多属性:
attributes #5 = { nounwind readonly }
我知道#2
attribute group包含可以添加到Function
方法的addFnAttr(Attribute Attr)
with方法中的“函数属性”。我也知道,我可以添加到CallInst
with addAttribute(0, Attribute Attr)
的“返回属性”,也可以使用相同的方法或{{3 }} AttributeList
/ Set
。例如,这给了我%26 = call nounwind i32 @atoi(i8* nounwind %25)
。
但是如何添加#5
属性组中的属性?他们叫什么?它们是否不同于其他属性?在这种情况下,它们是否多余?