2

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

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

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

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

4

1 回答 1

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());
于 2021-02-25T09:44:46.830 回答