标签: gcc-plugins

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

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 …
Run Code Online (Sandbox Code Playgroud)

gcc built-in gcc-plugins

38
推荐指数
1
解决办法
846
查看次数

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

我正在创建一个GCC插件.

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

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

我的代码

static bool looplugin_gate(void)
{
    return true;
}

static unsigned looplugin_exec(void)
{
    printf( "===looplugin_exec===\n" );

    basic_block bb;
    gimple stmt;
    gimple_stmt_iterator gsi;

    FOR_EACH_BB(bb)
    {
        for (gsi=gsi_start_bb(bb); !gsi_end_p(gsi); gsi_next(&gsi), j++)
        {
            stmt = gsi_stmt(gsi);
            print_gimple_stmt (stdout, stmt, 0, TDF_SLIM);
        }
    }
    return 0;
}


void handle_my_pragma(cpp_reader *ARG_UNUSED(dummy))
{
    printf ("=======Handling loopragma=======\n" );
    enum cpp_ttype token;
    tree x;
    int num = -1;

    token = pragma_lex (&x);
    if (TREE_CODE (x) != INTEGER_CST)
        warning (0, "invalid …
Run Code Online (Sandbox Code Playgroud)

c c++ gcc pragma gcc-plugins

13
推荐指数
1
解决办法
934
查看次数

GCC插件入门

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

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

gcc -c -fplugin=plugin.so   test.c -o test.o 

cc1: error: cannot load plugin plugin.so

plugin.so: undefined symbol: warning
Run Code Online (Sandbox Code Playgroud)

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

/machmode.h:262:1: error: unknown type name 'class'

 class bit_field_mode_iterator
 ^
/machmode.h:263:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token

 {
 ^
/plugin/include/tree.h:27:0,
             from conftest.c:63:

/vec.h:220:8: error: field 'register_overhead' declared as a function
Run Code Online (Sandbox Code Playgroud)

任何人都知道我做错了什么?

谢谢

gcc symbols undefined gcc-plugins

7
推荐指数
1
解决办法
4451
查看次数

使用gcc插件插入全局变量声明

我想知道是否可以使用gcc插件插入全局变量声明.例如,如果我有以下代码:

test.c的:

int main(void) {
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我想把它变成:

int fake_var;

int main(void) {
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

那可能吗?如果可能,通过哪个通道,我该怎么办?

c c++ gcc gcc-plugins

5
推荐指数
0
解决办法
547
查看次数

标签 统计

gcc ×4

gcc-plugins ×4

c ×2

c++ ×2

built-in ×1

pragma ×1

symbols ×1

undefined ×1