3

我有个问题:

给定 getelementptr 指令,如何使用元数据获取字段名称?

例如

%b = getelementptr inbounds %struct.T* %7, i32 0, i32 1, !dbg !31

我想得到它的字段名“b”。

请贴出代码!先感谢您!

4

2 回答 2

2

如果您的意思是您只想b从该指令中获取字符串,您可以通过调用getName()它来实现。但这不是找到 gep 所指的实际字段名称的可靠方法。找到这个需要更多的努力:基本上你需要找出 gep 的第一个参数指向的类型 ( %struct.T),然后从 gep 的偏移量中了解 gep 所指的结构中的哪个字段。

在这里编写完整的代码对我来说太复杂了,但通常您希望使用 DebugInfo.h 中的 DI 类 - 阅读该文件中的文档以了解如何使用这些类。具体来说,要将偏移量与类型匹配,我认为您需要使用 aDICompositeType并检查其中包含的所有类型(getTypeArray()可能会这样做)。

要让类型开始,您需要找到@llvm.dbg.valuegep 的第一个参数(第一个参数是引用该结构指针的元数据的那个) - 第三个参数应该是来自 arg 的元数据,并且使用DIVariable::getType()应该在这里帮助你。

您的问题可能有比上述更简单的解决方案,但我不知道...

于 2013-11-13T08:13:54.377 回答
1

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();
于 2013-11-15T01:29:24.473 回答