问题标签 [gcc-plugins]

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 投票
2 回答
993 浏览

gcc - 修改 GCC 编译器的 AST-tree

需要使用 GCC 插件收集有关翻译单元的必要信息,并在其基础上修改 AST。我已经了解如何收集信息。但我还不明白如何在将 AST 传递到 CRT 之前对其进行修改。关于这个主题的信息很少。请告诉我关于这个主题我应该读什么?分享想法,链接。

谢谢。

PS我已经阅读了这些链接上的所有内容:

http://en.wikibooks.org/wiki/GNU_C_Compiler_Internals/Print_version http://developer.apple.com/library/mac/#documentation/DeveloperTools/gcc-4.2.1/gccint/index.html#Top

0 投票
1 回答
216 浏览

c++ - 带有方法的 GCC 插件在类中声明

我正在开发一个 GCC 插件来处理 SSA 形式的 AST。每次编译 SSA 形式的函数后,我都会创建一个回调运行。

这是我的代码

但是对于在类声明中声明的类的方法,上面的代码不能运行例如,使用此代码

我的插件只为 method1 运行,但不为 method2 运行

一开始,我认为这个问题是因为 method2() 将被视为内联函数,所以我在运行插件时添加了选项 -fno-inline。但它不起作用

谁能帮我?

0 投票
1 回答
366 浏览

gcc - GCC 插件:pass.c 中的“内部编译器错误”

我一直在编写一个 GCC 程序间插件,我必须在程序中的某些点插入 GIMPLE 语句。在此之后,我对整个程序进行数据流分析。当我完成分析后,我将删除那些新插入的 GIMPLE 语句。

我的分析已经完成,但在退出之前会生成以下消息:

内部编译器错误:在 execute_ipa_pass_list 中,在 pass.c:1817

这肯定是因为插入了 GIMPLE 语句,如果我不这样做,我将不会收到此错误消息。

谁能帮我解释一下问题是什么以及如何解决?

0 投票
2 回答
5159 浏览

gcc - GCC 插件入门

所以在网上搜索了一段时间后,我决定在这里尝试一下,因为它似乎是一个很好的讨论论坛。我试图创建一个简单的 gcc 插件。程序代码附在这封邮件的末尾,但用简单的英语它注册插件并确保在注册 pragma 时调用 pragma_init 函数。正是在这里,我使用 c_register_pragma 来截取一些 pragma。

我使用http://gcc.gnu.org/onlinedocs/gccint/Plugins-building.html#Plugins-building中的示例对其进行编译。编译和链接工作正常。但是,当我加载插件时,我得到:

我究竟做错了什么?此外,当包含一些头文件(稍后将需要)时,我得到了很多错误。例如,包括“tree.h”会产生(在 50 个其他错误中):

有人知道我做错了什么吗?

谢谢

0 投票
1 回答
340 浏览

c++ - gcc plugin c c++ find global nonstatic variables

我一直在玩 gcc 4.6 插件 api。为方便起见,我为 api 使用了 python 包装器/插件。

我的目标是找到所有变量的声明:

  • 全局范围
  • 而不是 const
  • 而不是静态的(意味着导出或可见)

在编译单元中并发出警告。例如:

应该产生“glob”

“函数/类之外”和“const”很容易,但我无法获得“静态”限定符。

我正在爬取全局命名空间子树并观察没有 const 标志的 VAR_DECL 节点。

但是“静态”关键字是如何处理的呢?它似乎不是位域标志之一。节点上的“静态谓词”也具有误导性,因为它只是说变量进入静态存储(glob 确实如此——还有 moduleGlob 和内部)。我的问题是“它会以 .so 格式导出”

那么“外部”声明呢?这在 AST 中是如何映射的?

目前我尝试在 *free_lang_data 传递中执行此操作(这是否为时已晚?)

到目前为止,我唯一的提示是:当通过 -fdump-tree-all 开关在 .tu 转储中转储树时,还有一个带有全局变量名称错误的附加节点(在非静态情况下)。

有什么想法可以解决这个问题吗?

0 投票
2 回答
905 浏览

gcc - 构建 gcc 插件的问题

我正在尝试构建简单的 gcc 插件。我是新手,但我想在未来实现更复杂的插件。我阅读了很多手册,似乎我做的一切都是正确的,但有些地方是错误的。我无法建造它。每次我尝试构建我的插件时,我都会收到一个错误:

我不知道出了什么问题。我执行了与我找到的所有手册中描述的相同的步骤。

我有带有 gcc-4.6.3 编译器的 Ubuntu 12.04。

我安装了 gcc-4.6-plugin-dev。

我什至尝试构建基于 gcc_4.6.4 的插件,该插件是我自己仔细下载和构建的。但结果是一样的。

我的制作文件:

插件源代码:

注释的源代码也包含链接器未定义的函数调用。据我了解,问题与register_callback功能相同。

有人可以帮我解决这个问题吗?关于 gcc 插件编写的优秀、详细、不过时的手册也将非常有用。任何帮助将不胜感激。

0 投票
1 回答
145 浏览

debugging - Gcc:在编译期间添加自动调试信息

我被要求实现一种 gcc 插件。基本上我要做的就是添加一些调试代码,以便将调试信息添加到编写的代码中。

让我们用一个例子来解释我需要什么。假设我们有以下函数

现在我想在执行后得到的是函数的踪迹,我的意思是我需要打印出每次调用中收到的参数值和返回值。例如,如果我执行 factorial(4),我希望得到以下输出:

  • 称为 arg n 的阶乘:4
  • 称为 arg n 的阶乘:3
  • 称为 arg n 的阶乘:2
  • 称为 arg n 的阶乘:1
  • 返回值为 1 的阶乘
  • 返回值为 2 的阶乘
  • 返回值为 6 的阶乘
  • 阶乘返回值为 24

所以,我需要的是这段代码中所有函数的输出。我不知道我是否让我理解,但关键是我想避免手动添加此调试信息,而是通过编译步骤。有人建议我使用MELT,我第一次尝试使用它,但我想知道是否还有其他选择。欢迎各种意见或建议。

0 投票
2 回答
759 浏览

windows - 是否有任何支持 GCC 插件的 mingw-w64 构建?

很长时间以来,我一直在 windows 上使用mingw-builds 的构建,但我想尝试GCC 插件,mingw-builds 项目不支持。所以我尝试搜索支持它的其他一些版本,但找不到。GCC 的插件功能在 Windows 上根本就坏了吗?你知道是否有人使用插件支持(--enable-plugin)构建 mingw-w64 吗?我认为像 gcc-melt 或 gcc-python-plugin 这样的东西在 Windows 上也会非常有趣。

PS:不,我真的不想自己构建它,谢谢!

0 投票
1 回答
1180 浏览

c++ - GCC 插件,添加新的优化编译指示

我正在创建一个 GCC 插件。

我正在尝试为特定的循环转换创建一个插件 - 精确地展开循环 N(给定参数)次。我已经正确安装了插件,并且可以在编译过程中成功注册我的编译指示。当我用 function 注册 pragma 时c_register_pragma,我可以在词法分析中处理它(用 function handle_my_pragma),但是我怎样才能找到它呢?

我也可以定义自己的 pass 并遍历 GIMPLE,但是没有任何 pragma 的踪迹。所以我的问题是:我的编译指示在哪里,我如何影响我的代码?或者你会建议什么来达到我的目标?它不必与 pragma 一起使用,但这似乎是一个好主意。另外,我知道 MELT,但在 GCC 的研究中,我更喜欢纯 C 插件。

我的代码

PS:如果有熟悉 GCC 插件开发并且有好心的人:),请联系我(mbukovy gmail com)。我这样做是因为我的最终论文(自己的选择),我欢迎任何灵魂伴侣。

0 投票
1 回答
589 浏览

c - GCC插件:复制函数的参数

我开发了一个 GCC 插件来检测正在编译的应用程序。这些应用程序是用 C 语言编写的,并在 x86 Linux 系统上使用 GCC 4.7(4.8 和 4.9 也是一个选项)构建。

我的插件实现了一个编译通道,它放置在“ssa”标准通道之后并在 GIMPLE 表示上运行。除其他事项外,我需要实现以下内容,但目前无法弄清楚如何正确执行。

在处理 C 函数时,我需要在其开头插入将其参数复制到我创建的局部变量的代码,以供将来处理。

我的第一个天真的实现如下所示:

但是,这种方式会根据转储创建对变量的参数声明的无效分配:

D.2206_11对应于我创建的局部变量par- 我要复制的函数的参数。

结果,GCC 在稍后的某个阶段崩溃,试图处理这个添加的语句。我想这是因为p不是保存相应参数值的变量,而是该变量的声明。是这样吗?以及如何获得该变量?

我尝试使用gimple_build_assign_with_ops(NOP_EXPR, copy_par, p, NULL_TREE)而不是,gimple_build_assign()但它也没有这样做。GCC 仍然在同一个地方崩溃。我可以提供回溯,但我觉得我只是缺少一些基本的东西。

我还查看了从TYPE_ARG_TYPES (TREE_TYPE (current_function_decl))via 开始并进一步遍历树,TREE_CHAIN(...)但这似乎给出了参数的类型而不是相应的变量。

所以,问题是,如何正确添加函数参数的复制。

注意 也许,这可以在 MELT 或 GCC Python 插件的帮助下完成,但在这个项目中,我需要仅使用 GCC 本身提供的代码来执行所有代码转换。