在LLVM中,我们可以使用StructType()获取模块中的所有结构,但是当我们使用多个源文件时,模块是不同的,因此相同的结构类型可能在不同的模块中显示多次。如何获取程序中的所有结构类型,而不仅仅是一个源文件?是否有记录结构第一次出现的地点或时间的方法?
发布于 2022-09-19 09:51:43
这是一个很大而且相当模糊的问题。那得看情况。
LLVM有命名的和未命名的结构类型。您可以轻松地使用获取命名结构类型的列表。,如果您的程序使用单个上下文,则可以合并列表,并将有定义的命名结构类型的完整列表。定义的类型集将是使用的结构类型的超集。
您的程序也可能使用未命名的struct类型,或者程序的某些部分不来自LLVM模块。
如果您使用未命名的结构类型,生活将更加困难。两种类型可能都是{i32, i32},可能这是同一类型的目的,也许是两种独立的类型恰好有相同的成员。很难。找到它们也更加困难:您必须遍历所有函数,并找到每个函数使用的值,以及这些值的类型。缓慢的循环,枯燥的写作。(但在正的站点上,如果定义了结构类型,但从未使用过,则不会出现假阳性。上面命名的struct类型可能存在这个问题。)
如果您的语言是两种结构类型可能是或可能不是相同类型的语言,那么这些问题就会变得更加困难。例如,在Java中,所有使用字符串类型(在IR级别上是struct类型)的代码也使用对象类型。所以如果你列了一个使用对象的模块列表,你必须考虑引用字符串的函数,但是如果你要列出使用字符串的模块列表,你必须忽略那些只引用对象的函数。
还有一些关于优化的问题。例如,SROA,它涉及用更简单的标量替换结构使用。在SROA之后,在源中使用字符串的函数可能不再在IR中使用它。如果要对使用给定类型的所有函数进行操作,则必须考虑SROA的效果。
这种依赖于语言的复杂性是LLVM提供(几乎?)没有针对这些问题的辅助函数。人们的要求差别太大了。LLVM帮助器存在于一个大小适合多个问题的问题上。
在LLVM中没有“第一次出现”,这是每个编译器前端的内部。您可以使用调试信息来找出在源代码中发生结构类型的位置,也许您会找到一个文件和一个最低的行号。“最低行号”就是你所说的“第一”,对吗?这不是唯一可能的意思。
https://stackoverflow.com/questions/73766532
复制相似问题