在gcc 8.2.0中新建一个pass
参考的是GCC Resource Center,里面有对gcc的讲解slice。
- 在/gcc8.2.0/gcc目录下添加一个文件test.c,然后创建一个主函数,这里主函数我暂时没加,只建了一个空pass。
- 在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);
}
- 在tree-pass.h中添加如下代码:
extern gimple_opt_pass *make_pass_struct (gcc::context *ctxt);
- 在passes.def中添加一个宏:
NEXT_PASS (pass_struct);
- 在timevar.def中添加
DEFTIMEVAR (TV_TREE_STRUCT , "tree test struct")
- 在gcc-8.2.0/gcc/Makefile.in中添加test.c以及test.o
- 重新configure & make & install
完成,下面就是往pass里添加功能。
来源:CSDN
作者:qiusi0225
链接:https://blog.csdn.net/qiusi0225/article/details/103985963