我正在开发一个GCC插件来处理SSA形式的AST。 在编译SSA形式的函数后,我每次都创建一个回调运行。
这是我的代码
char* get_name_node(tree node) {
// return string represent node name
}
void execute_plugin_pass() {
printf("%s\n", 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。但它不起作用
任何人都可以帮助我吗?
答案 0 :(得分:0)
问题可能是在执行的传递中插入传球的问题。请记住,执行的GCC通行证的设置和顺序因优化而异(因此-O0
,-O1
,-O2
,...不同。我不明白你在哪里插入它。
我有时也有同样的问题选择我应该在哪里插入我的通行证。我经常有试错法。查看GCC源代码树的文件gcc/passes.c
。
如果您需要SSA形式的Gimple,请考虑在"ssa"
通过后或"phiopt"
之后插入。
如果您不需要SSA,请考虑在"cfg"
之后插入。
出于好奇,你能解释一下你的GCC插件正在做什么吗?
您是否考虑过为您的工作使用GCC MELT(MELT是一种用于编码GCC扩展的高级域特定语言)?