问题标签 [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 投票
1 回答
151 浏览

c++ - 使用其他文件构建 gcc 插件

你可能不需要对 gcc 插件了解很多就可以理解这个问题

嗨,我正在尝试创建一个使用其他文件的 gcc 插件,当我没有引用其他类classTree.cppfield.cpp,我在构建插件时从来没有遇到过问题:顺便说一下,我正在使用这个命令:

并将它与这个一起使用:

所有如gcc plugins Doc所示,他们还说当我使用其他文件时,我只需要添加我的文件名,如下所示:

当我使用它时,plugin.so它被创建了,但是当我尝试像以前一样运行它时,我收到了这个错误:

错误是什么意思?特别是symbol: _ZTV5field

0 投票
0 回答
61 浏览

gcc - 用于从二进制文件中列出源文件的 GCC 插件

我想问这个问题,gcc 是否有“插件”,它可以从二进制文件中列出源文件(二进制文件没有被剥离)? 如果插件不可用,那么任何人都可以指导我“如何实现与 gcc 相同的功能。

0 投票
1 回答
238 浏览

c++ - 使用 gcc 插件获取类注释

我正在创建一个gcc 插件,在解析 C++ 文件后对其进行分析。该插件遍历这些类并生成一些关于它们的信息。该插件正在工作,这就是我如何通过课程。

我想选择他可以分析的课程和他不能分析的课程。我的第一个想法是添加某种注释,我会在解析类时阅读它,并决定是否分析它。

我从未在 C++ 中使用过任何类型的注释,所以我不知道这是否可能。如果是这样,你会如何推荐我使用它们,并在插件中获取注释?如果不是,有什么好方法可以做我需要的吗?

0 投票
1 回答
294 浏览

c++ - 在 gcc 5.1.0 中注册一个 GIMPLE pass

嗨,我一直在为 gcc 4.8 和 4.9 做 gcc 插件,但我在 gcc 5.1.0 中遇到了问题。问题是我无法在这个新的 gcc 版本中注册 GIMPLE 通行证。

这是一个示例插件代码:

使用此插件编译某些文件时,应打印一些 B 和 C,但没有打印任何内容。

与 gcc 4.9 的不同之处在于“pass_data”类型比以前少了两个字段(has_gate 和 has_execute)。其他一切似乎都和以前一样。如果有人知道我做错了什么或我错过了什么,我将不胜感激。

0 投票
1 回答
159 浏览

gcc - 带有动态链接 GCC 插件的 Valgrind

我已经使用分析工具 valgrind 有一段时间了。它需要一个可执行文件才能运行,即

我想在动态链接的 GCC 插件上使用它,并列出插件中使用的每个函数所花费的时间和调用次数。我正在运行 GCC 插件,如下所示:

当我运行以下命令时,valgrind 只报告 gcc 而不是 plugin.so 的内存泄漏。我需要一种专门在我的插件上运行 valgrind 的方法,这是一个 .so 文件。

甚至有可能做到这一点吗?我已经对此进行了很多搜索,但没有找到任何具体的答案。

0 投票
1 回答
84 浏览

gcc - 如何在 gcc 中间表示中保存树?可能吗?

我想以二进制形式将一棵树(特别是树的类型)保存在一个文件中,并且我需要在其他编译单元中加载这棵树。例如:

我有一个带有 2 个功能的 main.c:

我想保存结构的类型(myTypeStruct)并将其加载到另一个涉及 test.c 的编译单元中:

使用 gcc 插件,我想加载类型并构建该类型的变量以将 test.c 转换为:

我知道是指向tree_node的指针,而 tree_node 是结构的联合。问题是一棵树与它有关系,并且有一系列难以理解的结构。在构建特定类型的变量时,我需要知道哪些数据需要树。

PD:关于 LTO 如何做这样的事情的文档不足。PD2:对不起我的英语

0 投票
0 回答
133 浏览

c++ - 将枚举声明注入当前编译单元的 GCC 插件

向 GCC 中的当前编译单元注入枚举声明的最佳方法是什么?例如,我想注入枚举 global_ids:

免责声明:我正在尝试了解 GCC 内部结构,并希望直接在我的项目中使用 GCC 插件,一旦我对 GCC 内部结构有了很好的了解,我就会查看 MELT/GCC Python 插件。

0 投票
1 回答
95 浏览

gcc - How to determine which stages of compilation?

I have tried all the register_callback defined in the list of plugin.def. Now I need to determine which plugin to use at which stage of compilation. The following are my questions:

1) May I know what are the source codes related to generating the RTL tree 2) Is it possible to have my plugin intercept between the stages of GIMPLE or RTL? Thanks. Thanks

0 投票
1 回答
265 浏览

gcc - 如何从 GCC 插件将元数据嵌入到目标文件中

我正在尝试编写一个 GCC 插件,对它编译的程序进行一些特定于域的分析。我想知道将分析结果作为某种元数据(如调试信息)嵌入到生成的目标文件中的最佳方法。

理想情况下,一些元数据(在我的例子中是文本)应该嵌入到每个对象文件中,链接器应该保留它链接的所有对象的数据,最后我应该有某种方法来访问最终二进制文件中的所有元数据,objdump使用readelf或类似的。

我目前的想法是尝试通过将其添加到 GIMPLE AST 来为每个编译单元添加一个唯一命名的全局字符串变量。但是,我想知道是否有更“有纪律”的方式;插件如何生成调试信息或其他此类元数据?

0 投票
1 回答
1728 浏览

c - 如何在 GCC 插件中添加内置函数?

GCC 插件可以添加新的内置函数吗?如果是这样,如何正确地做到这一点?

GCC 版本是 5.3(或更新)。代码由用 C 编写的插件编译和处理。

在 gcc-melt.org 的 GCC 插件的基本原理中提到这是可行的,但我看不出如何。

据我在 GCC 的源代码中所见,内置函数是使用add_builtin_function()gcc /langhooks.c创建的:

这个函数的参数应该具有哪些值或多或少是清楚的,除了函数function_code的唯一数字 ID。

看起来(请参阅 参考资料add_builtin_function_common()),那里应该有一个值,enum built_in_function但 GCC 插件无法更改该枚举。

似乎不能传递任何大于两者的随机值END_BUILTINS。并且在这种情况下会有一个失败的断言。function_codebuiltin_decl_implicit()builtin_decl_explicit()

那么,在 GCC 插件中添加内置函数的正确方法是什么(不使用 MELT 等,只使用 GCC 插件 API)?

更新 我再次查看了 C 的add_builtin_function_common()和 of的实现langhooks.builtin_function()以及它们在 GCC 中的使用方式。function_code在某些情况下,0 似乎是可以接受的。那时你不能使用builtin_decl_implicit(),但你可以保存返回的 DECLadd_builtin_function()并在以后使用它。

看起来我可以尝试以这种方式创建内置插件的唯一事件是 PLUGIN_START_UNIT (否则 GCC 可能由于external_scope变量为 NULL 而崩溃)。

我在那个阶段尝试了以下(fntype之前创建的):

my_helper在与主源文件编译和链接的不同 C 源文件中定义。gimple_build_call然后我使用 decl在我的 GIMPLE 传递期间将该函数的调用插入到其他函数 ( ) 中。

GCC 没有输出任何错误,并且确实插入了对my_helper但作为对普通函数的调用的调用。我实际上需要一个内置函数来避免调用,而是插入函数体。

另一方面,tsan0在我的 pass 之后立即执行的 pass 插入了内置函数的调用,就像人们期望的那样:结果没有显式调用,只是插入了函数的主体。然而,它的内置函数是由 GCC 本身而不是插件定义的。

所以我想我的内置仍然需要一些东西才能成为有效的内置,但我不知道它是什么。那会是什么?