在一个clang插件中,如何查看编译翻译单元是不是出错?

Posted

技术标签:

【中文标题】在一个clang插件中,如何查看编译翻译单元是不是出错?【英文标题】:In a clang plugin, how do you see whether there was an error compiling the translation unit?在一个clang插件中,如何查看编译翻译单元是否出错? 【发布时间】:2017-12-15 15:36:41 【问题描述】:

如果为要运行我的插件的 AST 编译代码时出错,我希望我的 clang 插件实际上不做任何事情。

但是,我不知道哪个对象包含编译期间生成的错误列表。

是否有用于获取在 TU 编译期间生成的所有错误(或所有诊断)的布尔查询或列表 API?

谢谢。

【问题讨论】:

【参考方案1】:

我最终找到了一种从 CompilerInstance 对象中获取错误计数的方法:

auto & ast_context = compiler_instance.getASTContext();
auto & diagnostics_engine = ast_context.getDiagnostics();
auto diagnostic_consumer = diagnostics_engine.getClient();
auto error_count = diagnostic_consumer->getNumErrors();
if (error_count > 0) 
    llvm::report_fatal_error("Errors during compilation, plugin aborting");

我不知道这是否是最好的方法,但是当我将上面的代码放在我从 ast_matchers::MatchFinder::MatchCallback 派生的类的 onStartOfTranslationUnit 中时,它对我有用。

【讨论】:

以上是关于在一个clang插件中,如何查看编译翻译单元是不是出错?的主要内容,如果未能解决你的问题,请参考以下文章

如何调试 dsymutil 错误:“Clang 模块预计只有 1 个编译单元。”

iOS学习使用 Xcode 开发 Clang 插件

使用 clang 和插件编译

iOS底层探索之LLVM——自定义Clang插件(下)

从多个编译单元引用模板化静态变量时,Clang 链接到不同位置

clang 插件编译错误:未定义符号 llvm::Registry<clang::PluginASTAction, llvm::RegistryTraits<clang::PluginAS