如何从llvm的元数据中获取字段名称

时间:2013-11-13 06:18:23

标签: metadata field llvm

我有一个问题:

鉴于getelementptr指令,我如何使用元数据获取字段名称?

e.g。

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

我希望得到它的字段名称“b”。

请发布代码!提前谢谢!

2 个答案:

答案 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)如果IGetElementPtr指令,我们可以使用以下代码来获得它的偏移量。

int offset=0;
ConstantInt* CI=dyn_cast<ConstantInt>(I->getOperand(2));
offset=CI->getSExtValue();