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

时间:2011-11-02 16:42:15

标签: plugins gcc css

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

这是我的代码

char* get_name_node(tree node) {
     // return string represent node name
}

void execute_plugin_pass() { 
     printf("%s\n", get_name_node(cfun->decl));
}

struct opt_pass plugin_pass = 
{
    GIMPLE_PASS,
    "plugin_pass",
    0,
    execute_plugin_pass,
    NULL,
    NULL,
    0,
    TV_PLUGIN_RUN,
    PROP_gimple_any,
    0,
    0,
    0,
    0
};



extern "C" int
plugin_init(plugin_name_args* info, plugin_gcc_version* ver)
{
    struct register_pass_info pass_info;
    pass_info.reference_pass_name = where;
    pass_info.pass = pass;
    pass_info.ref_pass_instance_number = 0;
    pass_info.pos_op = PASS_POS_INSERT_AFTER;
    register_callback("plugin", PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
    return 0;   
}

但是上面的代码没有运行在类声明中声明的类的方法 例如,使用此代码

class A {
    void method1();
    void method2() {
         // run some code here
    }
};

void A::method1() {
    // run some code here
}

我的插件仅针对method1运行,但不针对method2运行

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

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

问题可能是在执行的传递中插入传球的问题。请记住,执行的GCC通行证的设置和顺序因优化而异(因此-O0-O1-O2,...不同。我不明白你在哪里插入它。

我有时也有同样的问题选择我应该在哪里插入我的通行证。我经常有试错法。查看GCC源代码树的文件gcc/passes.c

如果您需要SSA形式的Gimple,请考虑在"ssa"通过后或"phiopt"之后插入。

如果您不需要SSA,请考虑在"cfg"之后插入。

出于好奇,你能解释一下你的GCC插件正在做什么吗?

您是否考虑过为您的工作使用GCC MELT(MELT是一种用于编码GCC扩展的高级域特定语言)?