如何访问序列化的clang抽象语法树(AST)

时间:2018-04-01 21:55:53

标签: c++ abstract-syntax-tree clang++ libtooling

我已经能够实现ASTFrontendAction来创建ASTConsumer,它使用RescursiveASTVisitor遍历翻译单元decl,从而访问AST的所有节点对于给定的源文件。我是通过实现传递给ToolAction的{​​{1}}来实现的。此工具会覆盖ClangTool::run(ToolAction *action)成员函数,以便在每次调用ToolAction::runInvocation之间进行一些处理。到目前为止一切顺利,一切都按预期工作,我的自定义clang工具正在帮助我更好地探索一个超过15年的代码库。

但是,每次我想运行我的工具时,我都需要对AST进行全面的解析。正如我所提到的,这是一个相当大的代码库,所以一次运行需要一段时间。通过查看代码,我收集了可以从保存的文件创建和遍历AST,而不是执行解析。谷歌搜索确认可以保存AST,通过查看ASTFrontendActionClangTool API,它似乎很容易做到。

虽然保存 AST似乎很简单,但在运行我的自定义clang工具时,我不知道如何使用保存的AST。查看运行工具的代码路径,我发现有一个点可以通过解析源文件或从文件中读取来创建AST。我想要做的是将所有AST都放在一个文件中,这样我的工具的每次运行都会从一个文件创建AST,而不需要执行完整的解析(我认为这会很多)快)。

有人可以帮忙吗?提前谢谢!

1 个答案:

答案 0 :(得分:0)

这对我有用:

clang::CompilerInstance CI;
CI.createDiagnostics();
std::shared_ptr<clang::TargetOptions> TO = std::make_shared<clang::TargetOptions>();
TO->Triple = "x86_64-pc-win32"; // see clang -v
CI.setTarget(clang::TargetInfo::CreateTargetInfo(CI.getDiagnostics(), TO));

std::unique_ptr<ASTUnit> ast = ASTUnit::LoadFromASTFile("TheAstFile.ast", 
    CI.getPCHContainerReader(), 
    ASTUnit::LoadEverything, 
    &CI.getDiagnostics(), 
    CI.getFileSystemOpts());

MyAstConsumer consumer(ast->getASTContext());
consumer.HandleTranslationUnit(ast->getASTContext());
相关问题