0

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を追加します。しかし、それは機能しません

誰か助けてもらえますか?

4

1 に答える 1

0

おそらく問題は、実行されたパスのどこにパスを挿入するかです。実行される GCC パスのセットと順序は、最適化によって異なることに注意してください (したがって-O0-O1-O2、 ... とは異なります)。どこに挿入されているのかわかりません。

また、パスを挿入する場所を選択するという同じ問題が発生することもあります。私はしばしば試行錯誤のアプローチをとっています。gcc/passes.cGCC ソース ツリーのファイルを調べます。

Gimple の SSA 形式が必要な場合は、"ssa"pass の後に挿入するか、 の後に挿入することを検討して"phiopt"ください。

SSA が必要ない場合は、 の後に挿入することを検討してください"cfg"

好奇心から、GCC プラグインが何をしているのか説明していただけますか?

仕事でGCC MELT (MELT は GCC 拡張機能をコーディングするための高レベルのドメイン固有言語) の使用を検討しましたか?

于 2011-11-02T17:16:50.857 に答える