[英]Register a GIMPLE pass in gcc 5.1.0
嗨,我一直在为gcc 4.8和4.9做gcc插件,但是我在gcc 5.1.0中遇到问题。 问题是我无法在此新gcc版本中注册GIMPLE通行证。
这是一个示例插件代码:
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;
}
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.