【问题标题】:How to get the register name from the load instruction in llvm如何从llvm中的加载指令中获取寄存器名称
【发布时间】:2014-01-04 20:15:37
【问题描述】:

我正在尝试从 LoadInst 指针获取存储加载指令结果的寄存器的名称。
例如,如果我的 loadInst 指针指向这个指令 %0 = load i32* %i, align 4 那么我应该如何从指令中获得 %0?

【问题讨论】:

    标签: compiler-construction llvm


    【解决方案1】:

    %0 是指令的名称,而不是寄存器名称 - LLVM 中间表示中没有寄存器。

    在任何情况下,所有指令都继承自 Value 类,该类定义了 getName() 方法,这就是您应该调用的。但是,请记住,通常许多指令都是未命名的,因此 getName() 不会返回任何有用的信息 - 诸如 %0 之类的名称仅在以文本形式发出模块时分配,并且在此之前不存在。

    【讨论】:

      【解决方案2】:

      首先,%0 只是一个标签。如果我们想明确地给它一个名字,有一个名为instnamer的LLVM pass。以下 cmd 我曾经使用instnamer pass 为每个标签显式指定名称

      $ clang++  -std=c++11 -g -emit-llvm -c hello.c -o hello.bc
      $ opt -instnamer -load ../your/path/to/library.so -passname   <hello.bc> hello.bc
      

      然后在您的 LLVM 通行证中,即 LLVM API:

      if (LoadInst *loadInst = dyn_cast<LoadInst>(&I)) {
         loadInst->dump();
         errs()<<loadInst->getName(); // This is your %temp0  not %0 anymore the pass explicitly rewritten the LLVM IR to %temp0.
      }
      

      希望这会有所帮助..

      【讨论】:

      • 这应该是正确的答案。我尝试了很多功能,只有添加“-instnamer”才能输出显式名称。
      【解决方案3】:

      一个 callInst 继承自 Value,因此您可以通过 getName() 获取 Name。但是,如果该值是未命名的(具有类似 %0 的名称),那么这将不起作用,因为返回的值没有任何意义。所以如果你想得到一个名字,你需要给它一个名字。

      【讨论】:

      • 是的,我说的是 llvm api。例如 LoadInst *loadInst = dyn_cast(&*inst);现在对于 ICmpInst 和 AllocaInst,getName 函数将注册器的名称返回为 const char * 但我找不到任何相同的 LoadInst api。
      • 像下面的例子一样,我想对 LoadInst 做同样的事情。 AllocaInst *alloca = dyn_cast(&*inst); errs()getName()
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-28
      相关资源
      最近更新 更多