如何从 LLVM IR 的指令元数据中提取操作数?

Posted

技术标签:

【中文标题】如何从 LLVM IR 的指令元数据中提取操作数?【英文标题】:How do I extract operands from an instruction's metadata from LLVM IR? 【发布时间】:2016-05-17 10:55:16 【问题描述】:

我正在尝试提取 LLVM IR 中 if 指令中使用的操作数。 例如:对于像if(x==10) 这样的指令,我想要x10 作为输出。

这不应该是这样吗:

if (ICmpInst* iCmpInst = dyn_cast<ICmpInst>(&*i))

  errs() << "Conditional Instruction found: ";
  errs() << iCmpInst->getOpcodeName() << '\t';
  errs() << iCmpInst->getPredicate() << '\t';

  MDNode* metadata = iCmpInst->getMetadata("dbg");
  llvm::MDNode::op_iterator o_begin = metadata->op_begin();
  llvm::MDNode::op_iterator o_end = metadata->op_end();

  for(; o_begin != o_end; ++o_begin)
  
    errs() << o_begin << "\n";
  

对于x之类的字面量,我必须扫描`我认为的存储指令...

【问题讨论】:

旁注:使用isa&lt;&gt; 而不是dyn_cast&lt;&gt; @arrowd 我参考this 和this 来解决我的问题,你能告诉我为什么DDI-&gt;getAddress() == V 行不起作用吗?? 【参考方案1】:

如果你只是想得到操作数,也许你可以试试,

Value* opl = iCmpInst -> getOperand(0);
Value* opr = iCmpInst -> getOperand(1);

【讨论】:

以上是关于如何从 LLVM IR 的指令元数据中提取操作数?的主要内容,如果未能解决你的问题,请参考以下文章

从 LLVM IR 获取精确的行/列调试信息

LLVM IR:有效地对向量求和

如何在 LLVM IR 的 switch 指令中使用 char*?

LLVM IR:具有可变 BasicBlock 目标的分支指令?

X86 'cmpps' 指令和 LLVM IR 'fcmp' 指令是不是可以互换?

如何从给定 LLVM IR 的源代码中获取变量的所有行号?