我有个问题:
给定 getelementptr 指令,如何使用元数据获取字段名称?
例如
%b = getelementptr inbounds %struct.T* %7, i32 0, i32 1, !dbg !31
我想得到它的字段名“b”。
请贴出代码!先感谢您!
如果您的意思是您只想b
从该指令中获取字符串,您可以通过调用getName()
它来实现。但这不是找到 gep 所指的实际字段名称的可靠方法。找到这个需要更多的努力:基本上你需要找出 gep 的第一个参数指向的类型 ( %struct.T
),然后从 gep 的偏移量中了解 gep 所指的结构中的哪个字段。
在这里编写完整的代码对我来说太复杂了,但通常您希望使用 DebugInfo.h 中的 DI 类 - 阅读该文件中的文档以了解如何使用这些类。具体来说,要将偏移量与类型匹配,我认为您需要使用 aDICompositeType
并检查其中包含的所有类型(getTypeArray()
可能会这样做)。
要让类型开始,您需要找到@llvm.dbg.value
gep 的第一个参数(第一个参数是引用该结构指针的元数据的那个) - 第三个参数应该是来自 arg 的元数据,并且使用DIVariable::getType()
应该在这里帮助你。
您的问题可能有比上述更简单的解决方案,但我不知道...
1)如果有一个指针指向一个结构,其元数据是meta
,我们可以使用下面的函数getFieldName
来获取一个偏移量的字段名称offset
。
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();