给定 a llvm.dbg.declare
,我怎样才能得到它的 llvm 值?
例如
call void @llvm.dbg.declare(metadata !{i32** %r}, metadata !23), !dbg !24
我想得到 Value i32** %r
,而不是 metadata !{i32** %r}
。
请给我代码!
谢谢!
在更高版本的 LLVM 中,不允许Metadata
从Value
(我在 LLVM 7.0.1 上)进行转换。特殊课程MetadataAsValue
,ValueAsMetadata
是演员所必需的。
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());
metadata !{i32** %r}
是调用指令的第一个操作数,并且i32** %r
是元数据的第一个操作数。所以这样的事情应该有效:
CallInst I = ... // get the @llvm.dbg.declare call
Value* referredValue = cast<MDNode>(I->getOperand(0))->getOperand(0);