【问题标题】:How to create instruction in function without basic block by LLVM C++ API?如何通过 LLVM C++ API 在没有基本块的函数中创建指令?
【发布时间】:2020-10-29 08:31:47
【问题描述】:

我想在没有基本块的函数中插入指令,例如:

define void @_Z2f2v() nounwind {
  %a = alloca i32, align 4
  %b = alloca i32, align 4
  store i32 2, i32* %a, align 4
  %1 = load i32* %a, align 4
  %2 = icmp sgt i32 %1, 0
  ret void
}

但我阅读了 LLVM 文档,我拥有的所有 C++ API 都是:

BasicBlock *bb = BasicBlock::Create(...);
irBuilder.setInsertPoint(bb);
irBuilder.CreateXXXInst(...);

Instruction *inst = new XXXInst(..., Instruction *insertBefore);
Instruction *inst = new XXXInst(..., BasicBlock *insertAtEnd);

看来我必须在函数的开头创建一个BasicBlock。

如何通过 C++ API 在没有 BasicBlock 的情况下将指令创建到函数中?

【问题讨论】:

  • 它不需要BasicBlock,它只需要一个插入指令的位置。
  • 我应该使用什么位置?你能给我一个简短的例子吗?
  • 任何指令本身就是一个位置,正如您可以从“insertBefore”参数名称中推断的那样。此外,您可以使用现有指令作为 setInsertPoint 的参数。
  • @oakad,您能告诉我,在我通过llvm::Function::Create(...) 创建函数后,我可以获得哪些现有指令?或者你的意思是llvm::Function 本身就是一个指令?
  • 指令肯定需要一个基本块。但是:为什么要避免使用基本块?这里真正的问题是什么?

标签: c++ llvm llvm-ir


【解决方案1】:

我想在没有基本块的函数中插入指令,例如:

define void @_Z2f2v() nounwind {
  %a = alloca i32, align 4
  %b = alloca i32, align 4
  store i32 2, i32* %a, align 4
  %1 = load i32* %a, align 4
  %2 = icmp sgt i32 %1, 0
  ret void
}

该函数只包含一个基本块,而不是零。要创建这样的函数,请将所有指令添加到函数的入口块中。

如何通过 C++ API 在没有 BasicBlock 的情况下将指令创建到函数中?

你不能——既不使用 C++ API 也不使用任何其他方式。根据定义,每条指令都必须是基本块的一部分。

基本块是CFG中的节点,所以如果你有一条没有基本块的指令,它就不是CFG的一部分,因此永远不会被执行,这是没有意义的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多