2017-09-20 56 views
0

我目前正在使用LLVM编写通行证,并且有几个关于变量/参数/参数名称的问题。在LLVM IR中提取名称

  1. 说我有这样的结构:

    struct Kid { 
        char name[30]; 
        int age; 
        char hobby[30]; 
    }; 
    

我运行一个模块通,发现Kid的模块中的相应StructType。我想使用Kid的成员的名字,但我不知道如何访问它们。我尝试使用element_iterator,但它只返回成员Type。我如何访问结构的数据成员的名称?

编辑:这样做的目的是让我能够确定,我目前正在处理类型“字符”的成员是否为“名”或“业余爱好”,这样我就可以执行各自不同的动作案件。例如:

case "name" do something; 
    case "hobby" do something else; 

是否有另一种方法来区分同一类型的成员?

  1. 说我有一个功能foo(int a, int b)。 如何获取函数参数的名称? 我试着在foo的电话上运行一个arg_iterator来找到 的参数,但是当我在一个参数上调用getName()时,它返回一个空的StringRef

将不胜感激任何帮助。

回答

1

LLVM IR中没有“字段名称”。事实上,类型的名称只能用于调试目的,所以你不应该依赖它们。用于表示参数的值的名称相同 - 可以很容易地将其删除。

如果您需要源名称,那么您需要依赖调试信息。

+0

好的,谢谢。我将编辑该问题以更具体地说明我想要做什么。 第二个问题呢? – baronzo1

+0

我相信我也回答了第二个问题。所有的“名称”都是源代码级别的功能,所以你在IR中没有它们。这是有原因的,例如否则你将无法处理C/C++联合或位域。因此,如果您需要使用源代码级别的东西,那么您需要在前端内部执行所有操作。或者使用其他方式来恢复必要的信息,例如调试信息。 –

+0

是的,我想编辑该评论,直到某个时刻我才注意到。 谢谢! – baronzo1