给定llvm.dbg.declare
,我如何获得其llvm值?
e.g。
call void @llvm.dbg.declare(metadata !{i32** %r}, metadata !23), !dbg !24
我希望获得值i32** %r
,而不是元数据!{i32** %r}
。
请给我代码!
谢谢!
答案 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上)。强制转换需要特殊的类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);
}
如您所见,AllocaInst
包裹在ValueAsMetadata
内,然后包裹在MetadataAsValue
内。
如果您还希望从此呼叫中获取DIVariable
。
DIVariable *V = cast<DIVariable>(cast<MetadataAsValue>(CI->getOperand(1))->getMetadata());