问题标签 [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.
c++ - 在一个clang插件中,如何查看编译翻译单元是否出错?
如果为我的插件将要运行的 AST 编译代码时出错,我希望我的 clang 插件实际上不做任何事情。
但是,我无法弄清楚哪个对象包含编译期间生成的错误列表。
是否有一个布尔查询是否有错误或一个列表 API 用于获取 TU 编译期间生成的所有错误(或所有诊断)?
谢谢你。
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
:
c++ - 如何在构建 clang 插件时绕过依赖构建?
是否可以使用已构建的 clang 版本构建 clang 插件?
我已经完成了下载和构建 clang 的所有步骤,但我不知道如何设置一个工具,以便Makefile
每次编译我的工具时都不会遍历整个 llvm 和 clang 目录(遍历Makefile
似乎需要大约只要构建我的单文件插件)。
谢谢。
c++ - 确保每个字符串文字都包含在宏中
我想用宏包装我项目中的每个字符串文字。我想确保我的项目中的每个字符串文字都用宏包装,并有一些外部工具帮助我提供未包装在宏中的字符串文字的位置。
有什么方法可以使用 Clang 插件来确保每个字符串文字都包含在宏中?
我要处理的案例:
-
#Y 应该被警告为未包装的字符串文字。
-
它将要求整个事物都在一个宏中,如下所示:
/li>
我怎么能用 Clang 插件做到这一点,或者一般有其他方法吗?
c++ - 使用 Clang 插件将不推荐使用的标签添加到声明中
我有一个带有要弃用的函数声明的示例文件。我想添加此C++ 标记以使编译器在调用此函数时发出警告,如下所示:
我写了一个示例插件:
但是当我调用它时,它不会发出任何警告。如果我转储 ast,我会看到已添加弃用属性,但我没有收到任何警告。
如果我使用 HandleTopLevelDecls 它可以工作,但我需要匹配器来实现我想要的。
我的猜测是在遍历 ast 之后添加标签(第一个提示:getNodeAs 返回一个 const obj),因此添加标签为时已晚。
但是我认为通过覆盖 getActionType 我可以实现该结果,但似乎情况并非如此?
c++ - 是否可以编写一个 CLang 插件来警告使用 RAW 指针?
需要停止(或最小化)在我们的源代码库中使用原始 C/C++ 指针(即应使用引用或智能指针等其他选项)。
是否可以编写一个 CLang 插件来警告使用原始指针(作为本地/全局/成员变量,作为函数返回值,作为函数参数)?或者这绝对是不可能的事情?
如果可能的话,如果您能提供一些指导/参考,我们将不胜感激。
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 上构建的任何信息。
c++ - 用于打印函数调用位置的 Clang 插件
这是一个最小的 Clang 插件,用于打印函数调用的位置。
我有一个名为 FuncCallVisitor 的 RecursiveASTVisitor 访问者,它使用 ASTContext 进行初始化,并尝试打印 CallExpr 的源位置。
上面代码中的这个表达式会导致 SEGFAULT
https://i.stack.imgur.com/AQQWU.png
叮当声调用: