Как зарегистрировать GIMPLE_PASS?
Я пытаюсь сделать простой пример плагина, как это:
#include "gcc-plugin.h"
#include "tree.h"
#include "gimple.h"
#include "tree-pass.h"
#include <stdio.h>
extern void
test(void*gcc_data, void*b) {
printf("Hellow world\n");
}
extern int plugin_init (struct plugin_name_args *plugin_info,
struct plugin_gcc_version *version)
{
const char * nombre = "Hello world";
register_callback(nombre, GIMPLE_PASS, &test, NULL);
return 0;
}
Но GIMPLE_PASS
не является предопределенным событием в gcc-plugin.h
и я знаю, что должен что-то сделать с PLUGIN_PASS_MANAGER_SETUP
а также struct pass_data
в tree-pass.h
, но я не знаю точно, как и я не нашел никаких примеров.
Кто-нибудь покажет мне, как? iThanks.
1 ответ
Я знаю, что вам, вероятно, это больше не нужно, но это может быть полезно для других, я в последнее время работал над этим, и примерно 0 документов по этому поводу... Все, что вы можете сделать, это найти какой-то пример (есть только немного) и пытаюсь понять, что они пытаются сделать (если это хорошо прокомментировано), я пишу плагин, который как бы разбирает код gimple, вот как мой plugin_init
int plugin_init (plugin_name_args* plugin_info,
plugin_gcc_version* ver)
{
// You can get the plugin name
const char * const plugin_name = plugin_info->base_name;
cerr << "starting ";
// here you can get the plugin args and number of args,
// look at https://gcc.gnu.org/onlinedocs/gccint/Plugins-loading.html#Plugins-loading
// for more information how to give your plugin some args
const int argc = plugin_info->argc;
const struct plugin_argument * const argv = plugin_info->argv;
struct register_pass_info calls_printer_info;
// Here you say where you need to put your plugin, mine is called after ssa
// This is my pass
calls_printer_info.pass = new calls_printer_pass();
calls_printer_info.reference_pass_name = "ssa" ;
calls_printer_info.ref_pass_instance_number = 1;
calls_printer_info.pos_op = PASS_POS_INSERT_AFTER;
register_callback (plugin_name,
PLUGIN_PASS_MANAGER_SETUP,
NULL,
&calls_printer_info);
return 0;
}
Вы должны создать свой пропуск до:
static const struct pass_data calls_printer_pass_data = {
.type = GIMPLE_PASS,
.name = "calls_printer",
.optinfo_flags = OPTGROUP_NONE,
.has_gate = false,
.has_execute = true,
.tv_id = TV_NONE,
.properties_required = PROP_cfg,
.properties_provided = 0,
.properties_destroyed = 0,
.todo_flags_start = 0,
.todo_flags_finish = 0
};
class calls_printer_pass : public gimple_opt_pass {
public:
calls_printer_pass() : gimple_opt_pass(calls_printer_pass_data, g) {}
// put the function you want to execute when the pass is executed
unsigned int execute() { return my_function(); }
};
и не забудьте это для лицензии:
int plugin_is_GPL_compatible;