【发布时间】:2021-05-08 11:15:41
【问题描述】:
我正在构建一个从 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 的操作数......只是一个变量。你可能会说一个占位符。 例如这里的 x 和 y 变量。
%tmp = add i32 %x, %y
【问题讨论】:
-
你提到的求值叫做常量折叠,是builder做的。您可以自己创建指令,而不是使用BinaryOperator::Create(),IMO 使用 *::Create() 函数与构建器一样容易。至于占位符......我认为一般的答案是编译器只有在拥有操作数时才会生成 IR。出于各种原因。