Плагин GCC с методом был объявлен внутри класса - PullRequest
0 голосов
/ 02 ноября 2011

Я разрабатываю плагин 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 при запуске плагина. Но это не работает

Кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 02 ноября 2011

Вероятно, проблема в том, куда вставить ваш проход в выполненные проходы. Помните, что набор и порядок выполненных проходов GCC варьируются в зависимости от оптимизации (так же отличается с -O0, -O1, -O2, ...). Я не понимаю, куда вы вставляете это.

У меня тоже иногда возникает проблема с выбором места пропуска. У меня часто бывает метод проб и ошибок. Просмотрите файл gcc/passes.c исходного кода GCC.

Если вам нужна форма Gimple SSA, рассмотрите возможность вставки после прохода "ssa" или, возможно, после "phiopt".

Если вам не нужен SSA, рассмотрите возможность вставки после "cfg".

Из любопытства, не могли бы вы объяснить, что делает ваш плагин GCC?

Рассматривали ли вы использование GCC MELT (MELT - это высокоуровневый язык, специфичный для предметной области, для кодирования расширений GCC) для вашей работы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...