给定 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);