2

我正在尝试将我的插件从 gcc4.8.3 更新到 GCC 的 4.9.1 版本,界面似乎有所改变,我不再了解一些基本的东西。我没有在 GCC 文档上找到任何关于如何使用新界面注册通行证的插件或互联网示例。我只想在我的插件中安装一个新的通行证,所以我正在填充结构 register_pass_info 并以这种方式将其传递给 register_callback :

        register_callback("my_plugin_
name", PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);

我不明白如何填写结构 register_pass_info 的字段“pass”。现在看来,这个字段是一个 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 中定义,其中包括不在插件 API 中的“pass-instances.def”

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

4

1 回答 1

2

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

所以我离解决方案很近,这是安装通行证的最简单的代码

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

};
于 2014-10-28T17:01:59.647 回答