如何通过 LLVM C++ API 在没有基本块的情况下在函数中创建指令?
How to create instruction in function without basic block by LLVM C++ API?
我想在没有基本块的函数中插入指令,例如:
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++ 在没有 BasicBlock 的情况下将指令创建到函数中 API?
I want to insert instructions into function without basic block, for example:
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
}
该函数只包含一个基本块,而不是零。要创建这样的函数,您需要将所有指令添加到函数的入口块。
How could I create instruction into function without BasicBlock by C++ API ?
您不能 - 既不能使用 C++ API 也不能使用任何其他方式。根据定义,每条指令都必须是基本块的一部分。
基本块是 CFG 中的节点,因此如果您有一条没有基本块的指令,它就不会成为 CFG 的一部分,因此永远不会被执行,这将毫无意义。
我想在没有基本块的函数中插入指令,例如:
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++ 在没有 BasicBlock 的情况下将指令创建到函数中 API?
I want to insert instructions into function without basic block, for example:
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 }
该函数只包含一个基本块,而不是零。要创建这样的函数,您需要将所有指令添加到函数的入口块。
How could I create instruction into function without BasicBlock by C++ API ?
您不能 - 既不能使用 C++ API 也不能使用任何其他方式。根据定义,每条指令都必须是基本块的一部分。
基本块是 CFG 中的节点,因此如果您有一条没有基本块的指令,它就不会成为 CFG 的一部分,因此永远不会被执行,这将毫无意义。