gcc 8.2.0中新建一个pass

怎甘沉沦 提交于 2020-01-16 05:45:20

在gcc 8.2.0中新建一个pass

参考的是GCC Resource Center,里面有对gcc的讲解slice。

  1. 在/gcc8.2.0/gcc目录下添加一个文件test.c,然后创建一个主函数,这里主函数我暂时没加,只建了一个空pass。
  2. 在test.c中创建一个pass的数据结构:
    在这里插入图片描述
    这里有个问题是,gcc 8.2.0里已经不是结构体存储pass信息了,变成了类。比如tree-pass.h中找到make_pass_build_cfg:
extern gimple_opt_pass *make_pass_build_cfg (gcc::context *ctxt);

点进去后进入tree-cfg.c,这应该就是build_cfg的pass了:

gimple_opt_pass *
make_pass_build_cfg (gcc::context *ctxt)
{
  return new pass_build_cfg (ctxt);
}

找到类pass_build_pass:

namespace {

const pass_data pass_data_build_cfg =
{
  GIMPLE_PASS, /* type */
  "cfg", /* name */
  OPTGROUP_NONE, /* optinfo_flags */
  TV_TREE_CFG, /* tv_id */
  PROP_gimple_leh, /* properties_required */
  ( PROP_cfg | PROP_loops ), /* properties_provided */
  0, /* properties_destroyed */
  0, /* todo_flags_start */
  0, /* todo_flags_finish */
};

class pass_build_cfg : public gimple_opt_pass
{
public:
  pass_build_cfg (gcc::context *ctxt)
    : gimple_opt_pass (pass_data_build_cfg, ctxt)
  {}

  /* opt_pass methods: */
  virtual unsigned int execute (function *) { return execute_build_cfg (); }

}; // class pass_build_cfg

} // anon namespace

发现它继承自gimple_opt_pass,而gimple_opt_pass又继承自opt_pass,你会发现pass_build_cfg与一个pass_data类型的常量pass_data_build_cfg同时处于一个namespace里,而这个pass_Data_build_cfg就跟原来的tree_opt_pass结构体很像了。因此,我在test.c中依葫芦画瓢,创建一个了一个相应的namespace:

static unsigned int
execute_struct (void)
{
  return 0;
}

namespace {

const pass_data pass_data_struct=
{
  GIMPLE_PASS, /* type */
  "struct", /* name */
  OPTGROUP_NONE, /* optinfo_flags */
  TV_TREE_STRUCT, /* tv_id */
  0, /* properties_required */
  0, /* properties_provided */
  0, /* properties_destroyed */
  0, /* todo_flags_start */
  0, /* todo_flags_finish */
};

class pass_struct : public gimple_opt_pass
{
public:
  pass_struct (gcc::context *ctxt)
    : gimple_opt_pass (pass_data_struct, ctxt)
  {}

  /* opt_pass methods: */
  virtual unsigned int execute (function *) { return execute_struct (); }

}; // class pass_struct
} // anon namespace

gimple_opt_pass *
make_pass_struct (gcc::context *ctxt)
{
  return new pass_struct (ctxt);
}
  1. 在tree-pass.h中添加如下代码:
extern gimple_opt_pass *make_pass_struct (gcc::context *ctxt);
  1. 在passes.def中添加一个宏:
  NEXT_PASS (pass_struct);
  1. 在timevar.def中添加
DEFTIMEVAR (TV_TREE_STRUCT		     , "tree test struct")
  1. 在gcc-8.2.0/gcc/Makefile.in中添加test.c以及test.o
  2. 重新configure & make & install
    完成,下面就是往pass里添加功能。
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!