如何从llvm.dbg.declare获取IR值

时间:2013-11-13 07:14:36

标签: metadata llvm llvm-ir

给定llvm.dbg.declare,我如何获得其llvm值?

e.g。

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

我希望获得值i32** %r,而不是元数据!{i32** %r}

请给我代码!

谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

在更高版本的LLVM中,不允许从Metadata强制转换Value(我在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());