Gcc插件api从4.8到4.9

时间:2014-10-27 16:50:03

标签: gcc plugins

我正在尝试将我的插件从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

也许你们中的一些人有一个小例子让我回到正轨,或者 请指出我错过的一些文档。

1 个答案:

答案 0 :(得分:2)

哈终于找到了答案,事实上非常简单:gcc源文件中包含了一些简单的例子,但它们非常隐藏=),它们在$(GCC_SRC)/gcc/testsuite/gcc.dg/插件/

所以我离解决方案非常接近,这是安装传递的最简单代码

#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);

};