Я разрабатываю плагин GCC для обработки AST в форме SSA.
Я создаю функцию обратного вызова каждый раз после того, как форма функции 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 при запуске плагина. Но это не работает
Кто-нибудь может мне помочь?