我正在尝试将我的插件从gcc4.8.3更新到4.9.1版本 GCC的界面似乎有变化,我不明白 一些基本的东西了。我在海湾合作委员会没有找到任何例子 有关如何注册传递的插件或互联网的文档 新的界面。 我只是想在我的插件中安装一个新的传递,所以我填补了 结构register_pass_info并将其传递给register_callback 方式:
register_callback("my_plugin_
name", PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
我不明白如何填写结构的“通过”字段 register_pass_info。现在看来这个字段是opt_pass类 不再是一个简单的结构,与内部传递相同的类 GCC。所以我自然而然地试图复制内部传递正在做的事情 创建一个新的传球,我为我的传球做了这个:
class pass_greg : public gimple_opt_pass
{
public:
pass_greg (gcc::context ctxt)
: gimple_opt_pass (pass_data_greg, gcc::context ctxt)
{}
bool gate () { return greg_gate(); }
unsigned int execute () { return greg_pass (); }
};
但我没有说明我需要的这个参数gcc :: context是什么 实例化我的通行证。此外,opt_pass符号定义于 pass_manager包含一个不在的“pass-instances.def” 插件API
也许你们中的一些人有一个小例子让我回到正轨,或者 请指出我错过的一些文档。
答案 0 :(得分:2)
所以我离解决方案非常接近,这是安装传递的最简单代码
#include <gcc-plugin.h>
#include <context.h> //This is is the context g that is needed for the pass constructor
const pass_data pass_data_greg =
{
GIMPLE_PASS, /* type */
"Greg's Plugin", /* name */
OPTGROUP_LOOP, /* optinfo_flags */
true, /* has_gate */
true, /* has_execute */
TV_TREE_PREFETCH, /* tv_id */
( PROP_cfg | PROP_ssa ), /* properties_required */
0, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
0, /* todo_flags_finish */
};
class pass_greg : public gimple_opt_pass
{
public:
pass_greg (gcc::context ctxt)
: gimple_opt_pass (pass_data_greg, gcc::context ctxt)
{}
bool gate () { return greg_gate(); }
unsigned int execute () { return greg_pass (); }
int plugin_init(struct plugin_name_args *info, /* Argument infor */
struct plugin_gcc_version *ver) /* Version of GCC */
{
//... Some version check and so ...
pass.pass = make_pass_greg(g);
pass.reference_pass_name = "ssa";
pass.ref_pass_instance_number = 1;
pass.pos_op = PASS_POS_INSERT_AFTER;
register_callback("rodetect", PLUGIN_PASS_MANAGER_SETUP, NULL, &pass);
};