cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON path/to/llvm/sources可以生成 compile_commands.json
然后clang怎么用这个文件来生成ast文件吗?如果可以的话,clang这个功能是什么版本开始支持的?
谢谢。
compile_commands.json 文件是用来描述编译过程的 JSON 格式文件。在使用 Clang 分析源代码时,可以通过该文件来指定编译选项,以及编译源文件的命令。Clang 工具可以通过读取 compile_commands.json 文件来获取编译选项和编译命令,然后对源代码进行静态分析。
要使用 compile_commands.json 文件来生成 AST 文件,可以使用 Clang 工具中的 clang-tool。 clang-tool 可以根据 compile_commands.json 文件中的信息来构建代码,生成 AST 文件。
具体来说,可以使用以下命令来生成 AST 文件:
clang-tool -p /path/to/build/folder /path/to/source.cpp
其中,-p 参数指定编译数据库的路径,即 compile_commands.json 所在的路径,/path/to/source.cpp 是需要生成 AST 文件的源文件路径。
Clang 从 3.4 版本开始支持 compile_commands.json 文件。
在使用Clang生成AST时,可以使用clang-check工具,它可以在不生成目标文件的情况下分析源代码并生成AST。同时,也可以使用clang-tidy工具,该工具可以进行代码分析,并使用Clang AST来诊断C++源代码,并提供自动化修复建议。
生成AST的命令示例:
clang-check -ast-dump -extra-arg=-std=c++11 source.cpp -- -I./include
其中,-ast-dump参数指示clang-check生成AST并将其转储到标准输出,-extra-arg参数指示额外的编译参数。
关于compile_commands.json文件,可以在clang-check和clang-tidy命令中使用-p参数指定该文件的路径,以提供编译参数。
clang-check和clang-tidy功能从Clang 3.5版本开始支持。
不知道你这个问题是否已经解决, 如果还没有解决的话:我们可以通过如下的命令查看源码的AST结构:
clang -Xclang -ast-dump -c test.c
打印出来的AST信息,其实是预处理之后展开的源码信息,源码的AST内容在打印出来的内容的最下面。
如下面的代码:
#include <stdio.h>
int main() {
printf("hello");
return 0;
}
打印出来的部分AST(仅根当前文件内容匹配部分)如下:
头上的头文件引用等已经展开,没有了,但是下面的 main 函数定义,则如上面的 FunctionDecl 所示,并且给出了 代码中的位置。这里就不详细分析AST的结构了,写几个例子比对一下就很容易理解。