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



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

我的代码

char* get_name_node(tree node) {
     // return string represent node name
}
void execute_plugin_pass() { 
     printf("%sn", 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。但是它不起作用

有人能帮我吗?

问题可能是在执行的传递中插入传递的位置。请记住,执行的GCC传递的集合和顺序随优化而变化(-O0, -O1, -O2,…也是如此)。我不明白你把它插在哪儿了。

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

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

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

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

您是否考虑过在您的工作中使用GCC MELT (MELT是用于编写GCC扩展的高级领域特定语言)?

相关内容

  • 没有找到相关文章

最新更新