ASTをSSA形式で処理するためのGCCプラグインを開発しています。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を追加します。しかし、それは機能しません
誰か助けてもらえますか?