1

我正在构建一个从 armv7m 指令提升到 llvm IR 的升降机。所以我试图将所有 armv7m 指令转换为它们等效的 llvm 指令。我是 llvm 的新手,我想创建和打印一个 llvm 指令。所以从一个简单的添加指令开始,我的代码是:

            llvm::LLVMContext TheContext;

            llvm::IRBuilder<> Builder(TheContext);  

            auto* L = ConstantInt::get(Type::getInt32Ty(TheContext), 41);

            auto* R = ConstantInt::get(Type::getInt32Ty(TheContext), 42);       

            llvm::Value* Add=Builder.CreateAdd(L, R, "addtmp");             

            Add->print(llvm::errs());

我想要的输出是

%addtmp = add i32 41, i32 42;

我得到的输出是

i32 83

第一点,请问如何在不被评估的情况下显示指令?

第二点。正如你在上面的代码中看到的

auto* L = ConstantInt::get(Type::getInt32Ty(TheContext), 41);

auto* R = ConstantInt::get(Type::getInt32Ty(TheContext), 42);

我正在为我的 add 指令创建两个常量 int 作为操作数,现在如何为 add 指令创建一个不是 int 的操作数 ..just 一个变量。你可能会说一个占位符。例如这里的 x 和 y 变量。

 %tmp = add i32 %x, %y
4

1 回答 1

1

您收到 ani32 83而不是 add 指令的原因是默认的 FolderTy 模板参数llvm::IRBuilderllvm::ConstantFolder.

https://llvm.org/doxygen/classllvm_1_1IRBuilder.html

template <typename FolderTy = ConstantFolder,
          typename InserterTy = IRBuilderDefaultInserter>
class IRBuilder : public IRBuilderBase {

为了解决这个问题,您可以使用llvm::NoFolderwhich 不执行常量折叠。https://llvm.org/doxygen/classllvm_1_1NoFolder.html#details

于 2021-05-09T22:00:37.470 回答