如何使用编译数据库为文件生成LLVM比特码

How to generate LLVM bitcode for a file using a compilation database?

本文关键字:LLVM 文件 何使用 编译 数据库      更新时间:2023-10-16

我想生成大量C源文件的LLVM比特代码,我为其提供了一个编译数据库。是否可以调用clang,以便它读取编译数据库并使用适当的标志?

背景

对于玩具程序,生成LLVM比特码的命令很简单:

clang -emit-llvm -c foo.c -o foo.bc

但是,大型项目中的源文件需要许多其他编译标志,包括-I S和-D S和Whatnot。

我想编写一个脚本,该脚本在大量源文件上迭代,并在每个源文件上调用clang -emit-llvm ...以生成LLVM比特码。困难是每个clang -emit-llvm ...命令必须具有特定于该源文件的标志。我有一个针对这些源文件的汇编数据库,该数据库完美地捕获了每个源文件所需的标志。有没有办法使clang -emit-llvm ...了解我的汇编数据库?

我想到的一种解决方案是自己解析编译数据库,并为每个源文件找到适当的条目,然后将command条目修改为(a)包括-emit-llvm和(b)将-o foo.o更改为-o foo.bc,然后运行命令。这可能起作用,但似乎有些骇人。

代替自己解析编译数据库,您可以依靠python绑定来做到这一点。从绑定的测试套件来看,您可以做类似的事情:

cdb = CompilationDatabase.fromDirectory(kInputsDir)
cmds = cdb.getAllCompileCommands()

,然后稍微更新cmds的内容。