我正在尝试实现以下功能;
所以,目前我正在做的过程是
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 *(和编译时类型)作为返回值。问题是我需要使用这种类型来确定所创建函数的签名
问题:
我该如何解决这个问题?
如何实现这一目标的代码示例将是非常棒的。谢谢!
答案 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
是您刚刚克隆的旧功能。