2

给定 a llvm.dbg.declare,我怎样才能得到它的 llvm 值?

例如

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

我想得到 Value i32** %r,而不是 metadata !{i32** %r}

请给我代码!

谢谢!

4

2 回答 2

3

在更高版本的 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);
}

如您所见, theAllocaInst被包裹在里面ValueAsMetadata,然后MetadataAsValue.

如果您还想DIVariable从此调用中获取。

DIVariable *V = cast<DIVariable>(cast<MetadataAsValue>(CI->getOperand(1))->getMetadata());
于 2019-08-03T19:15:03.193 回答
1

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

CallInst I = ... // get the @llvm.dbg.declare call
Value* referredValue = cast<MDNode>(I->getOperand(0))->getOperand(0);
于 2013-11-13T07:21:36.043 回答