我有一个问题:
鉴于getelementptr指令,我如何使用元数据获取字段名称?
e.g。
%b = getelementptr inbounds %struct.T* %7, i32 0, i32 1, !dbg !31
我希望得到它的字段名称“b”。
请发布代码!提前谢谢!
答案 0 :(得分:2)
如果您的意思是只想从该指令中获取字符串b
,则可以通过调用getName()
来执行此操作。但这并不是找到gep所指的实际字段名称的可靠方法。找到这个需要付出更多的努力:基本上你需要找出gep的第一个参数所指向的类型(%struct.T
),然后从gep的偏移中了解结构中的哪个字段gep指的是。
在这里编写完整的代码对我来说太复杂了,但通常你想要使用DebugInfo.h中的DI类 - 阅读该文件中的文档以了解如何使用那些课程。具体来说,为了将偏移与类型相匹配,我认为您需要使用DICompositeType
并查看其中包含的所有类型(getTypeArray()
将会这样做。)
要让你开始输入类型,我需要找到gep的第一个参数@llvm.dbg.value
(第一个参数是引用该结构指针的元数据) - 第三个参数应该是arg中的元数据,使用DIVariable::getType()
可以帮助你。
您的问题可能比上述解决方案更简单,但我不知道...
答案 1 :(得分:0)
1)如果指针指向结构,其元数据为meta
,我们可以使用以下函数getFieldName
来获取偏移量offset
的字段名称。 / p>
std::string getFieldName(MDNode* meta,int offset){
if(!meta){
errs()<<"The meta is NULL\n";
return "";
}
DIVariable div(meta);
DIType dit=div.getType();
DIDerivedType didt=static_cast<DIDerivedType>(dit);
DICompositeType dict=static_cast<DICompositeType>(didt.getTypeDerivedFrom());
DIArray dia=dict.getTypeArray();
assert(offset<dia.getNumElements());
DIType field=static_cast<DIType>(dia.getElement(offset));
//errs()<<"Field'name is "<<field.getName()<<"\n";
return field.getName();
}
2)如果I
是GetElementPtr
指令,我们可以使用以下代码来获得它的偏移量。
int offset=0;
ConstantInt* CI=dyn_cast<ConstantInt>(I->getOperand(2));
offset=CI->getSExtValue();