将inreg属性添加到LLVM IR函数参数

时间:2016-02-07 20:31:36

标签: compiler-construction llvm llvm-ir llvm-c++-api

我正在使用LLVM,我想用API重新创建一段IR:

declare void @fun(i32* inreg, i32 inreg)

但我似乎无法真正做到这一点。

我目前的尝试是:

Function* fun = cast<Function>(M.getOrInsertFunction("fun",type));

((fun -> getAttributes()).getParamAttributes(0)).addAttribute(c,0,Attribute::InReg);

((fun -> getAttributes()).getParamAttributes(1)).addAttribute(c,0,Attribute::InReg);

在第1行,第2行和第3行被完全忽略之后,这段代码确实没有做任何事情,而我在IR输出中获得的只是:

declare void @fun(i32* , i32 )

如何让它正常工作?

2 个答案:

答案 0 :(得分:2)

管理LLVM中的函数属性非常不方便,因为属性被打包到不可变和全局集中。为函数参数赋值属性实际上意味着用新的函数替换表示所有函数和参数属性的集合。

幸运的是,至少有辅助函数可以使这项工作更容易一些。我建议使用llvm::Function::addAttribute()方法。

Function* fun = cast<Function>(M.getOrInsertFunction("fun", type));
fun->addAttribute(1, Attribute::InReg);
fun->addAttribute(2, Attribute::InReg);

请记住,索引0表示 function 属性,参数属性从索引1开始。

答案 1 :(得分:0)

您的代码段有三个问题。

首先,第一个参数的索引是1,而不是0.所以你应该使用索引1和2,而不是0和1。

其次,addAttribute()不修改其接收器,而是返回一个新的集合。因此,改变属性的正确方法是:

fun->setAttributes(fun->getAttributes().addAttribute(1, ...));

最后,上面有一个简写,就是这样做:

fun->addAttribute(1, ...);