我正在开发一个GCC插件来处理SSA形式的AST。我创建一个回调运行后,每次SSA形式的函数被编译。
我的代码
char* get_name_node(tree node) {
// return string represent node name
}
void execute_plugin_pass() {
printf("%sn", get_name_node(cfun->decl));
}
struct opt_pass plugin_pass =
{
GIMPLE_PASS,
"plugin_pass",
0,
execute_plugin_pass,
NULL,
NULL,
0,
TV_PLUGIN_RUN,
PROP_gimple_any,
0,
0,
0,
0
};
extern "C" int
plugin_init(plugin_name_args* info, plugin_gcc_version* ver)
{
struct register_pass_info pass_info;
pass_info.reference_pass_name = where;
pass_info.pass = pass;
pass_info.ref_pass_instance_number = 0;
pass_info.pos_op = PASS_POS_INSERT_AFTER;
register_callback("plugin", PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
return 0;
}
但是上面的代码不能运行在类声明中声明的类的方法例如,使用以下代码
class A {
void method1();
void method2() {
// run some code here
}
};
void A::method1() {
// run some code here
}
我的插件只运行method1,不运行method2
一开始,我认为这个问题是因为method2()将被认为是内联函数,所以我在运行插件时添加了选项-fno-inline。但是它不起作用
有人能帮我吗?
问题可能是在执行的传递中插入传递的位置。请记住,执行的GCC传递的集合和顺序随优化而变化(-O0
, -O1
, -O2
,…也是如此)。我不明白你把它插在哪儿了。
我有时也会遇到选择在哪里插入通行证的问题。我经常采用试错法。查看GCC源代码树的gcc/passes.c
文件。
如果您需要SSA形式的Gimple,请考虑在"ssa"
通过之后或"phiopt"
之后插入。
如果不需要SSA,可以考虑在"cfg"
之后插入。
出于好奇,你能解释一下你的GCC插件在做什么吗?
您是否考虑过在您的工作中使用GCC MELT (MELT是用于编写GCC扩展的高级领域特定语言)?