【问题标题】:Translating armv7m instructions to llvm IR将 armv7m 指令翻译成 llvm IR
【发布时间】: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。出于各种原因。

标签: c++ binary llvm lifting


【解决方案1】:

您收到i32 83 而不是添加指令的原因是llvm::IRBuilder 的默认FolderTy 模板参数是llvm::ConstantFolder。

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

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

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

【讨论】:

    猜你喜欢
    • 2021-08-05
    • 2018-01-12
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    相关资源
    最近更新 更多