c++ - 在 gcc 5.1.0 中注册一个 GIMPLE pass

标签 c++ c gcc gimple gcc-plugins

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

这是一个示例插件代码:

int plugin_is_GPL_compatible;

static bool gateCheck(void)
{
    printf("BBBBB\n");
    return true;
}

static unsigned int executeCheck(void)
{
    printf("CCCCC\n");
    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 << "GATE\n";
        return true;
    }
    unsigned int execute(function *)
    {
        std::cout << "EXECUTE\n";
        return 1;
    }
};

关于c++ - 在 gcc 5.1.0 中注册一个 GIMPLE pass,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30265760/

相关文章:

c++ - 什么是 "Argument-Dependent Lookup"(又名 ADL,或 "Koenig Lookup")?

c++ - 计算线性系统的误差 - 提取每一列

optimization - float 代码与 GCC 的一致行为

c++ - 将 vector 从一个类传递到另一个类作为对象

C++ - 无法推导出模板参数

c++ - 在 CUDA C 项目中使用 C++

c - 从文件中扫描单词并将其保存在数组中

c++ - 结构尺寸太大,需要优化

c++ - ntoh功能在RHEL/GCC下是如何实现的?

c++ - 比较 2 个 LBP (OpenCV C++)