0

我正在开发一个 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。但它不起作用

谁能帮我?

4

1 回答 1

0

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

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

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

如果您不需要 SSA,请考虑在"cfg".

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

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

于 2011-11-02T17:16:50.857 回答