如何从llvm.dbg.declare IR值(How get IR value from llvm

2019-10-19 00:13发布

给定一个llvm.dbg.declare ,我怎样才能得到它的价值LLVM?

call void @llvm.dbg.declare(metadata !{i32** %r}, metadata !23), !dbg !24

我想获得价值i32** %r ,而不是元!{i32** %r}

请给我的代码!

谢谢!

Answer 1:

metadata !{i32** %r}是调用指令的第一个操作数,以及i32** %r是元数据的第一个操作数。 所以,这样的事情应该工作:

CallInst I = ... // get the @llvm.dbg.declare call
Value* referredValue = cast<MDNode>(I->getOperand(0))->getOperand(0);


Answer 2:

在LLVM的后续版本,它是不允许投MetadataValue (我是在LLVM 7.0.1)。 特殊类MetadataAsValueValueAsMetadata都需要演员。

CallInst *CI;      /* Call to llvm.dbg.declare */
AllocaInst *AI;    /* AllocaInst is the result */

Metadata *Meta = cast<MetadataAsValue>(CI->getOperand(0))->getMetadata();
if (isa<ValueAsMetadata>(Meta) {
  Value *V = cast <ValueAsMetadata>(Meta)->getValue();
  AI = cast<AllocaInst>(V);
}

正如你所看到的, AllocaInst被包裹在里面ValueAsMetadata然后MetadataAsValue

如果您还想要得到DIVariable从这个电话。

DIVariable *V = cast<DIVariable>(cast<MetadataAsValue>(CI->getOperand(1))->getMetadata());


文章来源: How get IR value from llvm.dbg.declare