2014-09-02 107 views
1

我試圖做這樣一個簡單的插件例如:如何註冊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_PASSgcc-plugin.h一個預定義的事件,我知道我必須做一些事情,在tree-pass.hPLUGIN_PASS_MANAGER_SETUPstruct pass_data,但我不」我完全不知道如何和我沒有找到任何例子。

有人會告訴我如何? 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;