确定函数是否在LLVM IR中内联

确定函数是否在LLVM IR中内联,llvm,Llvm,我们在编译时根据LLVM IR检测源代码。在这个过程中,我们希望跳过已经内联的函数(例如,由于编译时优化) 我们如何确定函数是否已内联到我们的LLVM过程中?这似乎相当模糊,有许多解释 查看foo()。如果是这样,那么至少有一个调用没有内联,即使其他调用可能已经内联 另一种方法是查看调试信息。假设foo()源自foo.c第10到20行。您可以查看bar()中所有指令的调试信息,并检查是否有任何指令引用了foo.c的第10-20行。如果有的话,那么至少有一个调用是内联的,即使其他调用不是 我至少还

我们在编译时根据LLVM IR检测源代码。在这个过程中,我们希望跳过已经内联的函数(例如,由于编译时优化)


我们如何确定函数是否已内联到我们的LLVM过程中?

这似乎相当模糊,有许多解释

查看
foo()。如果是这样,那么至少有一个调用没有内联,即使其他调用可能已经内联

另一种方法是查看调试信息。假设
foo()
源自foo.c第10到20行。您可以查看
bar()
中所有指令的调试信息,并检查是否有任何指令引用了foo.c的第10-20行。如果有的话,那么至少有一个调用是内联的,即使其他调用不是


我至少还能想出另外两种方法,而且我相信还有更多的方法。(编辑:我可以想到三种方法,包括一种非常好的方法:在编译的早期将一些独特的元数据附加到
foo()
中的指令中,并查看在原生codegen之前元数据的位置。)

我们逐渐注意到操作是根据特定的调用站点而不是被调用方函数进行的。因此,一个函数可能没有“inline”属性。对于每个函数,它可能在某些调用点内联,但在其他调用点正常调用,因此我们不应该在仪器过程中跳过它们。

我认为您的问题不够具体,无法回答。您是否有一些函数foo()并想知道它是否内联了bar()?或者,您是否有兴趣查看源代码中的bar()是可内联的还是具有类似于
的内联属性?谢谢。但是,间接调用可能会导致函数没有直接调用方,但它不是内联的。我们检查了
.ll
文件中的元数据,但未发现任何与函数内联相关的内容。任何人都可以定义和添加元数据,包括您。还有一点-如果您的分析无法检测到调用关系,则内联线的分析也无法检测到它,因此在这些情况下,调用肯定不是内联的。