问题标签 [clang-plugin]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
82 浏览

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

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

但是,我无法弄清楚哪个对象包含编译期间生成的错误列表。

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

谢谢你。

0 投票
0 回答
1140 浏览

c++ - clang 插件:在编译期间修改 AST

我正在开发一个用于外部化日志字符串的clang插件(以减少嵌入式项目的二进制大小),它需要修改AST(因此在预处理器之后,在编译之前)。

目前,我能够成功匹配我想要替换的节点(使用RecursiveASTVisitor<T>),并正确提取构建替换所需的数据。

VisitStmt我的访问者的方法中,我正在迭代子节点,当找到匹配项时,我试图通过迭代器分配CallExpr用新节点()替换匹配的表达式节点(,返回 int) :IntegerLiteral

*it = clang::IntegerLiteral::Create(context, { 32, value, false }, context.IntTy, old->getLocStart()).

但是,当我尝试使用我的插件编译示例程序时,clang 返回成功状态代码但没有生成目标文件:

如果我尝试转储 AST 以验证我是否已正确修改它,那么 clang 也不会提供任何输出。但是如果我禁用我的插件(删除与它相关的所有参数),那么我可以转储(原始的,未修改的)AST。

我正在尝试进行的特定 AST 修改是用整数文字(由插件确定的值)替换对占位符函数(返回 int)的调用。

例如,将此CallExpr子树替换为IntegerLiteral

或将此CallExpr子树替换为IntegerLiteral

0 投票
1 回答
64 浏览

c++ - 如何在构建 clang 插件时绕过依赖构建?

是否可以使用已构建的 clang 版本构建 clang 插件?

我已经完成了下载和构建 clang 的所有步骤,但我不知道如何设置一个工具,以便Makefile每次编译我的工具时都不会遍历整个 llvm 和 clang 目录(遍历Makefile似乎需要大约只要构建我的单文件插件)。

谢谢。

0 投票
1 回答
125 浏览

c++ - 确保每个字符串文字都包含在宏中

我想用宏包装我项目中的每个字符串文字。我想确保我的项目中的每个字符串文字都用宏包装,并有一些外部工具帮助我提供未包装在宏中的字符串文字的位置。

有什么方法可以使用 Clang 插件来确保每个字符串文字都包含在宏中?

我要处理的案例:

  1. #Y 应该被警告为未包装的字符串文字。

  2. 它将要求整个事物都在一个宏中,如下所示:

    /li>

我怎么能用 Clang 插件做到这一点,或者一般有其他方法吗?

0 投票
0 回答
136 浏览

c++ - 使用 Clang 插件将不推荐使用的标签添加到声明中

我有一个带有要弃用的函数声明的示例文件。我想添加此C++ 标记以使编译器在调用此函数时发出警告,如下所示:

我写了一个示例插件:

但是当我调用它时,它不会发出任何警告。如果我转储 ast,我会看到已添加弃用属性,但我没有收到任何警告。

如果我使用 HandleTopLevelDecls 它可以工作,但我需要匹配器来实现我想要的。

我的猜测是在遍历 ast 之后添加标签(第一个提示:getNodeAs 返回一个 const obj),因此添加标签为时已晚。

但是我认为通过覆盖 getActionType 我可以实现该结果,但似乎情况并非如此?

0 投票
0 回答
66 浏览

c++ - 是否可以编写一个 CLang 插件来警告使用 RAW 指针?

需要停止(或最小化)在我们的源代码库中使用原始 C/C++ 指针(即应使用引用或智能指针等其他选项)。

是否可以编写一个 CLang 插件来警告使用原始指针(作为本地/全局/成员变量,作为函数返回值,作为函数参数)?或者这绝对是不可能的事情?

如果可能的话,如果您能提供一些指导/参考,我们将不胜感激。

0 投票
1 回答
573 浏览

windows - 如何在 Windows 中构建和运行 Clang 插件

我已经克隆了 llvm-project 存储库。

然后我为项目生成了一个 Visual Studio 解决方案,使用

DLLVM_EXPORT_SYMBOLS_FOR_PLUGINS正如这里所建议的,重要的部分是。

生成解决方案和所有项目。然后我构建 Clang 本身和 llvm-project 源中已经提供的示例 clang 插件。PrintFunctionNames 似乎是 Clang 插件的 hello world,所以我根据llvm 文档构建了它。

构建成功运行,现在我在安装目录中有 llvm/clang,带有 PrintFunctionNames 插件。

有两种方法可以告诉 clang 使用插件:

第一个有效,但是,第二个无效。此外,使用带有第一个命令行参数的 clang++ 也不起作用。这两个命令都适用于 clang,但不适用于 clang++,因此看起来 clang++ 存在问题。此外,省略 -c 命令并实际构建带有激活插件的可执行文件会产生链接错误 (1137)。

似乎 clang++ 不适用于 dll 插件,这很奇怪,因为 clang++ 似乎是同一个 clang 驱动程序,除了用于与 c++ 库链接的不同预设。

我遇到的另一个问题是,在构建树外时,cmake install 命令无法将库文件clang.lib 复制到安装目录,否则无法构建树外插件。手动设置此库的路径(位于原始输出目录中,而不是 cmake install 将移动其他构建输出的位置)似乎允许正确构建树外插件。

但是问题仍然存在:您不能在 Windows 上使用 Xclang 插件加载器或带有插件的 clang++ 驱动程序。不是使用提供的示例插件,也不是使用由树制成的测试插件。

问题是:我是在构建 clang 还是插件错误?如果是这样,为什么-cc1 -load可以使用带有clang.exe的插件?如何构建提供的示例插件并使其与 clang++ 驱动程序一起使用?我查看了这个实现基本树外插件的GitHub 存储库,但它没有提供有关在 Windows 上构建的任何信息。

0 投票
0 回答
133 浏览

c++ - 用于打印函数调用位置的 Clang 插件

这是一个最小的 Clang 插件,用于打印函数调用的位置。

我有一个名为 FuncCallVisitor 的 RecursiveASTVisitor 访问者,它使用 ASTContext 进行初始化,并尝试打印 CallExpr 的源位置。

上面代码中的这个表达式会导致 SEGFAULT

https://i.stack.imgur.com/AQQWU.png

叮当声调用: