【问题标题】:changing llvm::Function signature after code generation, before last CreateRet在代码生成后更改 llvm::Function 签名,在最后一个 CreateRet 之前
【发布时间】:2011-03-20 16:34:07
【问题描述】:

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

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

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

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*(和编译时类型)。问题是我需要使用这种类型来确定创建函数的签名

问题:

我该如何解决这个问题?

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

如何实现这一点的代码示例会很棒。谢谢!

【问题讨论】:

    标签: c++ llvm


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,我以为这会是最终的答案,但我想确定
    【解决方案2】:

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

    NF->getBasicBlockList().splice(NF->begin(), F->getBasicBlockList());

    NF 是您要克隆到的新函数,F 是您刚刚克隆的旧函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-22
      • 2021-06-29
      • 2017-02-05
      • 2021-10-03
      • 1970-01-01
      • 1970-01-01
      • 2018-10-23
      • 1970-01-01
      相关资源
      最近更新 更多