在LLVM中,如何获取程序中的所有结构类型



在LLVM中,我们可以使用StructType((来获取模块中的所有结构,但当我们使用多个源文件时,模块是不同的,因此相同的结构类型可能会在不同的模块中多次显示。如何获取程序中的所有结构类型,而不仅仅是单个源文件?有没有什么方法可以记录结构第一次出现的时间和地点?

这是一个很大且相当模糊的问题。这取决于情况。

LLVM具有已命名和未命名的结构类型。您可以很容易地获得命名结构类型的列表,如果您的程序使用单个上下文,则可以合并这些列表,并获得定义的命名结构类型完整列表。这组定义的类型将是所使用的结构类型的超集。

您的程序也可能使用未命名的结构类型,或者程序的某些部分不是来自LLVM模块。

如果使用未命名的结构类型,则生活会更加困难。两个类型可能都是{i32, i32},出于您的目的,这可能是同一类型,也可能是两个碰巧具有相同成员的独立类型。困难的找到它们也更困难:你必须循环所有的函数,找到每个函数使用的值,以及这些值的类型。一个缓慢的循环,写起来很无聊。(但在阳性网站上,当定义了结构类型但从未使用过时,不会出现误报。上面命名的结构类型可能会出现这个问题。(

如果您的语言中两个结构类型可能是同一类型,也可能不是同一类型的,那么这些问题就会变得更加困难。例如,在Java中,所有使用String类型(这是IR级别上的结构类型(的代码也使用Object类型。因此,如果你要列出使用Object的模块,你必须考虑引用String的函数,但如果你要列出使用String的模块,就必须忽略只引用Object的函数。

优化也存在问题。例如SROA,它涉及用更简单的标量替换结构用法。SROA之后,在源中使用String的函数可能不再在IR中使用它。如果你想对使用给定类型的所有功能采取行动,你必须考虑SROA的影响。

这种依赖于语言的复杂性是LLVM(几乎?(没有为这些问题提供帮助函数的原因。人们的要求差异太大。LLVM帮助程序是针对一个大小适合多个大小的问题而存在的。

不存在";第一次出现";在LLVM中,这是每个编译器前端的内部。您可以使用调试信息来找出结构类型在源代码中的位置,也许您会找到一个文件和一个最低的行号"最低行号";就是你所说的";首先;,正确的这不是唯一可能的意义。

相关内容

  • 没有找到相关文章

最新更新