在代码生成之后,在最后一个CreateRet之前更改llvm :: Function签名

时间:2011-03-20 16:34:08

标签: c++ llvm

我正在尝试实现以下功能;

  • 默认情况下,没有显式返回的函数将返回上次执行的块中的最后一次评估

所以,目前我正在做的过程是

1)创建一个函数

llvm::Function* result = llvm::Function::Create(Compiler::Detail::getAnonymousFunctionSignature(llvmContext),
                            llvm::GlobalValue::ExternalLinkage,
                            name,
                            module());
                    result->setCallingConv( llvm::CallingConv::C );

2)向块添加块和评估

builder.createFoo.....

但是,只有在第二阶段,我才有默认使用的llvm :: Value *(和编译时类型)作为返回值。问题是我需要使用这种类型来确定所创建函数的签名

问题:

我该如何解决这个问题?

  • 可以在创建功能后更改签名吗?这是合法的吗?
  • 我是否需要使用更新的签名创建一个新函数,并将第一个函数的输入块复制/分配给它,那就是它?或者我是否需要重新评估所有表达方式?
  • 是否可以在代码生成之前不创建函数?如果是这样,我应该在什么时候创建这个功能?

如何实现这一目标的代码示例将是非常棒的。谢谢!

2 个答案:

答案 0 :(得分:4)

您无法更改功能签名,因为这意味着它将具有不同的类型(因此您将需要更新所有用户等;在大多数情况下,此过程无法自动完成)。

有多种可能的解决方案,例如,您可以使用更新的签名创建函数,然后使用lib / Transforms / Utils / CloneFunction.cpp中的函数复制函数体,然后破解返回类型。< / p>

答案 1 :(得分:0)

根据https://stackoverflow.com/a/18751365/2024042,存在比CloneFunctionInto()更好的解决方案:

  

NF-&gt; getBasicBlockList()。splice(NF-&gt; begin(),F-&gt; getBasicBlockList());

     

NF是您要克隆的新功能,而F是您刚刚克隆的旧功能。