在gcc 5.1.0中注册一个GIMPLE通道



嗨,我一直在为gcc 4.8和4.9做gcc插件,但我在gcc 5.1.0中遇到了问题。问题是我不能在这个新的gcc版本中注册GIMPLE pass。

下面是一个示例插件代码:
int plugin_is_GPL_compatible;
static bool gateCheck(void)
{
    printf("BBBBBn");
    return true;
}
static unsigned int executeCheck(void)
{
    printf("CCCCCn");
    return 0;
}
const pass_data gimplePass =
{
    GIMPLE_PASS,    // opt type name
    "exampleChecker",  // name
    OPTGROUP_NONE,  // optinfo_flags
    TV_NONE,        // tv_id
    PROP_ssa,       // properties_required
    0,              // properties_provided
    0,              // properties_destroyed
    0,              // todo_flags_start
    0,              // todo_flags_finish
};
class passAttrChecker : public gimple_opt_pass
{
public:
    passAttrChecker(gcc::context* ctxt)
        : gimple_opt_pass(gimplePass, ctxt)
    {}
    bool gate (){return gateCheck();}
    unsigned int execute(){return executeCheck();}
};

extern int plugin_init(struct plugin_name_args* plugin_info,
                struct plugin_gcc_version* version)
{
    const char * name = "exampleChecker";
    struct register_pass_info pass_info;
    pass_info.pass = new passAttrChecker(g);
    pass_info.reference_pass_name = "ssa";
    pass_info.ref_pass_instance_number = 1;
    pass_info.pos_op = PASS_POS_INSERT_AFTER;
    register_callback(name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
    return 0;
}

当用这个插件编译一些文件时,应该打印一些B和C,但是没有打印。

与gcc 4.9的不同之处在于"pass_data"类型比以前少了两个字段(has_gate和has_execute)。其他一切似乎都和以前一样。如果有人知道我做错了什么,或者我错过了什么,我会很感激的帮助。

我已经解决了。这是一个相当愚蠢的错误。现在在gcc 5.1.0中,来自otp_pass的execute和gate方法接收一个参数,而不是void。

示例如下:

class passAttrChecker : public gimple_opt_pass
{
public:
    passAttrChecker(gcc::context* ctxt)
        : gimple_opt_pass(gimplePass, ctxt)
    {}
    bool gate (function *) 
    {
        std::cout << "GATEn";
        return true;
    }
    unsigned int execute(function *)
    {
        std::cout << "EXECUTEn";
        return 1;
    }
};

相关内容

  • 没有找到相关文章

最新更新