3

こんにちは、gcc 4.8 および 4.9 用の gcc プラグインを使用していますが、gcc 5.1.0 で問題が発生しています。問題は、この新しい gcc バージョンで GIMPLE パスを登録できないことです。

プラグイン コードの例を次に示します。

int plugin_is_GPL_compatible;

static bool gateCheck(void)
{
    printf("BBBBB\n");
    return true;
}

static unsigned int executeCheck(void)
{
    printf("CCCCC\n");
    return 0;
}

const pass_data gimplePass =
{
    GIMPLE_PASS,    // opt type name
    "exampleChecker",  // name
    OPTGROUP_NONE,  // optinfo_flags
    TV_NONE,        // tv_id
    PROP_ssa,       // properties_required
    0,              // properties_provided
    0,              // properties_destroyed
    0,              // todo_flags_start
    0,              // todo_flags_finish
};

class passAttrChecker : public gimple_opt_pass
{
public:
    passAttrChecker(gcc::context* ctxt)
        : gimple_opt_pass(gimplePass, ctxt)
    {}

    bool gate (){return gateCheck();}
    unsigned int execute(){return executeCheck();}
};


extern int plugin_init(struct plugin_name_args* plugin_info,
                struct plugin_gcc_version* version)
{
    const char * name = "exampleChecker";
    struct register_pass_info pass_info;
    pass_info.pass = new passAttrChecker(g);
    pass_info.reference_pass_name = "ssa";
    pass_info.ref_pass_instance_number = 1;
    pass_info.pos_op = PASS_POS_INSERT_AFTER;
    register_callback(name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
    return 0;
}

このプラグインを使用してファイルをコンパイルすると、いくつかの B と C が出力されるはずですが、何も出力されません。

gcc 4.9 との違いは、型「pass_data」のフィールドが以前よりも 2 つ少ないことです (has_gate と has_execute)。それ以外は以前と同じようです。誰かが私が間違っていることや欠けていることを知っていれば、助けていただければ幸いです。

4

1 に答える 1

4

私はすでにそれを解決しました。それはかなりばかげた間違いでした。gcc 5.1.0 では、otp_pass の execute および gate メソッドは、void ではなく 1 つの引数を受け取ります。

このように例は動作します:

class passAttrChecker : public gimple_opt_pass
{
public:
    passAttrChecker(gcc::context* ctxt)
        : gimple_opt_pass(gimplePass, ctxt)
    {}

    bool gate (function *) 
    {
        std::cout << "GATE\n";
        return true;
    }
    unsigned int execute(function *)
    {
        std::cout << "EXECUTE\n";
        return 1;
    }
};
于 2015-05-15T20:03:53.437 に答える