如何使用LLVM生成调用图?

如何使用LLVM生成调用图?,llvm,static-analysis,call-graph,Llvm,Static Analysis,Call Graph,我正在研究为linux内核生成一个包含函数指针的调用图(有关更多信息,请参阅我前面的问题)。我被告知LLVM应该适合此用途,但我无法在LLVM.org上找到相关信息 任何帮助,包括指向相关文档的指针,都将不胜感激。首先,您必须将内核编译为LLVM IR(而不是本机对象文件)。然后,使用llvm ld,将所有IR对象文件合并到一个大模块中。这可能是一件非常棘手的事情,您必须大量修改makefile,但我相信这是可行的 现在你可以做你的分析了。使用带有-dot callgraphpass的opt工具

我正在研究为linux内核生成一个包含函数指针的调用图(有关更多信息,请参阅我前面的问题)。我被告知LLVM应该适合此用途,但我无法在LLVM.org上找到相关信息


任何帮助,包括指向相关文档的指针,都将不胜感激。

首先,您必须将内核编译为LLVM IR(而不是本机对象文件)。然后,使用
llvm ld
,将所有IR对象文件合并到一个大模块中。这可能是一件非常棘手的事情,您必须大量修改makefile,但我相信这是可行的

现在你可以做你的分析了。使用带有
-dot callgraph
pass的
opt
工具可以生成一个简单的调用图。它不太可能处理函数指针,因此您可能需要修改它


跟踪所有可能携带函数指针的数据流路径是一个相当大的挑战,在一般情况下是不可能做到的(如果有指向整数强制转换的指针,如果指针存储在复杂的数据结构中,等等)。对于大多数特定情况,您可以尝试实现全局抽象解释,以近似指针的所有可能数据流路径。当然,这并不准确,但至少会得到一个保守的近似值。

您真的不想为800万行代码生成点调用图。如果dot能画的话,它会覆盖一个网球场,但它不能。除此之外,这是对OP:-}的另一个问题注释的回答的一个很好的回应,特别强调了函数指针是多么有趣。@IraBaxter,当然你不想为任何比“hello,world!”更大的东西显示点调用图。但您可能希望使用该.dot文件进行进一步分析。我通常解析.dot文件并将其存储到数据库中。感谢您指出
opt
工具。是的,Ira,我不打算生成调用图的图形表示。有任何可分析的格式是可以的,这是点格式的资格。关于函数指针,我被告知LLVM应该能够对函数指针进行一些分析。显然,我并没有打算自己实现这一点。
llvm-ld
已被弃用,请改用
llvm-link
或gold-plugin。