给定一个llvm.dbg.declare
,我怎样才能得到它的价值LLVM?
如
call void @llvm.dbg.declare(metadata !{i32** %r}, metadata !23), !dbg !24
我想获得价值i32** %r
,而不是元!{i32** %r}
请给我的代码!
谢谢!
给定一个llvm.dbg.declare
,我怎样才能得到它的价值LLVM?
如
call void @llvm.dbg.declare(metadata !{i32** %r}, metadata !23), !dbg !24
我想获得价值i32** %r
,而不是元!{i32** %r}
请给我的代码!
谢谢!
metadata !{i32** %r}
是调用指令的第一个操作数,以及i32** %r
是元数据的第一个操作数。 所以,这样的事情应该工作:
CallInst I = ... // get the @llvm.dbg.declare call
Value* referredValue = cast<MDNode>(I->getOperand(0))->getOperand(0);
在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());