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

时间:2016-09-01 19:00:28

标签: gcc plugins built-in

GCC插件可以添加新的内置函数吗?如果是这样,怎么做呢?

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

rationale for GCC plugins at gcc-melt.org中提到这是可行的,但我看不出如何。

据我在GCC的来源中看到,内置版是使用gcc/langhooks.c中的add_builtin_function()创建的:

tree
add_builtin_function (const char *name,
                      tree type,
                      int function_code,
                      enum built_in_class cl,
                      const char *library_name,
                      tree attrs)

除了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)?

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

看起来我尝试以这种方式创建内置函数的唯一事件是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 */)

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

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

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

所以我认为我的内置仍然需要一些有效的内置,但我不知道它是什么。那可能是什么?

1 个答案:

答案 0 :(得分:1)

我假设您要执行的操作(根据您的评论和链接文章)是将C代码插入函数中。在那种情况下,我会以为您不需要编写一个编译器插件。看看Boost.Preprocessor,它可以仅使用预处理器对C代码进行非常高级的操作。