Eug*_*ene 38 gcc built-in gcc-plugins
GCC插件可以添加新的内置函数吗?如果是这样,如何正确地做到这一点?
GCC版本是5.3(或更新).插件编译和处理的代码用C语言编写.
在gcc-melt.org的GCC插件的基本原理中提到这是可行的,但我看不出如何.
至于我可以在GCC的来源看,利用创建的建宏add_builtin_function()从GCC/langhooks.c:
tree
add_builtin_function (const char *name,
tree type,
int function_code,
enum built_in_class cl,
const char *library_name,
tree attrs)
Run Code Online (Sandbox Code Playgroud)
除了函数function_code的唯一数字ID 之外,该函数的参数应具有哪些值或多或少的清晰度.
看起来(请参阅参考资料add_builtin_function_common()),enum built_in_function预计会有一个值,但GCC插件无法更改该枚举.
人们可以不通过任何随机值大于END_BUILTINS作为function_code要么,它似乎.builtin_decl_implicit()并且builtin_decl_explicit()在这种情况下会有一个失败的断言.
那么,在GCC插件中添加内置的正确方法是什么(不使用MELT等,只需要GCC插件API)?
更新
我再次查看了C 的实现add_builtin_function_common()以及langhooks.builtin_function()C 的实现以及如何在GCC中使用它们.似乎0 function_code在某些情况下是可以接受的.你不能使用builtin_decl_implicit()然后你可以保存返回的DECL add_builtin_function()并在以后使用它.
看起来像我尝试以这种方式创建内置函数的唯一事件是PLUGIN_START_UNIT(否则GCC可能因external_scope变量为NULL 而崩溃).
我在那个阶段尝试了以下内容(fntype之前创建过):
decl = add_builtin_function (
"my_helper", fntype,
0 /* function_code */,
BUILT_IN_NORMAL /* enum built_in_class cl */,
NULL /* library_name */,
NULL_TREE /* attrs */)
Run Code Online (Sandbox Code Playgroud)
my_helper在与主源文件编译和链接的不同C源文件中定义.然后我使用decl gimple_build_call在我的GIMPLE传递期间将对该函数的调用插入到其他函数()中.
GCC输出没有错误,确实插入了调用my_helper但作为普通函数的调用.我实际上需要一个内置来避免调用,而是插入函数的主体.
另一方面,tsan0pass在我的传递之后立即执行,插入内置函数的调用就像人们期望的那样:结果没有显式调用,只插入了函数体.然而,它的内置是由GCC本身而不是插件定义的.
所以我想我的内置仍然需要一些有效的内置,但我不知道它是什么.那可能是什么?
我假设您想要做的(根据您的评论和链接的帖子)是将 C 代码插入到函数中。在这种情况下,我认为您不需要编写编译器插件。看一下Boost.Preprocessor,它可以仅使用预处理器对 C 代码进行非常高级的操作。