2014-09-02 39 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;