2014-03-02 49 views
12

我正在創建一個GCC插件。GCC插件,添加新的優化雜注

我想創建一個特定的循環轉換插件 - 展開循環正好N(參數給定)次。 我已經正確安裝了插件,我可以在編譯過程中成功註冊我的編譯指示。 當我註冊函數c_register_pragma的編譯指示時,我可以在詞法分析(功能handle_my_pragma)中處理它,但是如何才能找到它?

我也可以定義自己的pass和遍歷GIMPLE,但是沒有任何pragma的痕跡。 所以我的問題是:我的編譯指南在哪裏,我如何影響我的代碼? 或者你會提出什麼來達到我的目標?它不一定要與雜注,但它似乎是一個好主意。 另外,我知道融化,但GCC的研究中,我寧願純插件在C.

我的代碼

static bool looplugin_gate(void) 
{ 
    return true; 
} 

static unsigned looplugin_exec(void) 
{ 
    printf("===looplugin_exec===\n"); 

    basic_block bb; 
    gimple stmt; 
    gimple_stmt_iterator gsi; 

    FOR_EACH_BB(bb) 
    { 
     for (gsi=gsi_start_bb(bb); !gsi_end_p(gsi); gsi_next(&gsi), j++) 
     { 
      stmt = gsi_stmt(gsi); 
      print_gimple_stmt (stdout, stmt, 0, TDF_SLIM); 
     } 
    } 
    return 0; 
} 


void handle_my_pragma(cpp_reader *ARG_UNUSED(dummy)) 
{ 
    printf ("=======Handling loopragma=======\n"); 
    enum cpp_ttype token; 
    tree x; 
    int num = -1; 

    token = pragma_lex (&x); 
    if (TREE_CODE (x) != INTEGER_CST) 
     warning (0, "invalid constant in %<#pragma looppragma%> - ignored"); 
    num = TREE_INT_CST_LOW (x); 
    printf("Detected #pragma loopragma %d\n", num); 
} 

static void register_my_pragma (void *event_data, void *data) 
{ 
    warning (0, G_("Callback to register pragmas")); 
    c_register_pragma (NULL, "loopragma", handle_my_pragma); 
} 


static struct opt_pass myopt_pass = 
{ 
    .type = GIMPLE_PASS, 
    .name = "LoopPlugin", 
    .gate = looplugin_gate, 
    .execute = looplugin_exec 
}; 

int plugin_init(struct plugin_name_args *info, /* Argument infor */ 
struct plugin_gcc_version *ver) /* Version of GCC */ 
{ 
const char * plugin_name = info->base_name; 
struct register_pass_info pass; 

pass.pass = &myopt_pass; 
pass.reference_pass_name = "ssa"; 
pass.ref_pass_instance_number = 1; 
pass.pos_op = PASS_POS_INSERT_BEFORE; 

register_callback(plugin_name, PLUGIN_PRAGMAS, register_my_pragma, NULL); 
register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass); 

return 0; 
} 

PS:如果有一個人熟悉GCC插件的開發,並有好心:),請聯繫我(mbukovy gmail com)。我是這樣做的,因爲我的最終論文(自己的選擇),我歡迎任何靈魂伴侶。

+0

broadcom的Bingfeng Mei爲gcc提供了「pragma unroll」補丁 - http://gcc.gnu.org/ml/gcc/2008-05/msg00426.html PS您的GCC版本是什麼? – osgx

回答

3

當我註冊編譯與功能c_register_pragma,我可以在詞法分析(與功能handle_my_pragma)處理它,但我怎樣才能找到它呢?

解析時,有一個選項(實際上是一個黑客)在編譯指示的地方創建虛構的幫助函數調用。然後你可以在中間表示中通過名字來檢測這個函數。

Aslo,幾天前,felix.yang(huawei)在GCC ML上有一個問題:「如何將循環相關的附註信息從TREE傳遞到RTL? - http://comments.gmane.org/gmane.comp.gcc.devel/135243 - 檢查線

從列表中的一些建議:

看看我們是如何實現的#pragma ivdep(見replace_loop_annotate() 和Fortran /跨stmt.c在那裏建立ANNOTATE_EXPR)。

補丁與replace_loop_annotate()功能添加和ivdep編譯執行:"Re: Patch: Add #pragma ivdep support to the ME and C FE"由Tobias Burnus(2013年8月24日)。

+0

嘿,謝謝你的回答!關於編譯器替換的這個「黑客」是什麼 - 我在哪裏找到關於它的東西?如何使用它? 我找不到任何關於pragma ivdep的實現,所以這個替換看起來可用。不幸的是,我沒有多少時間了,所以我需要使用更快的方法:/ –

+0

Michal,有ivdep補丁(用「replace_loop_annotate」搜索):http://gcc.gnu.org/ml/gcc- patch/2013-10/msg02031.html - 如果在ivdep中存在循環,則在'c_parser_for_statement'中調用代碼'build2(ANNOTATE_EXPR ..'),此外還有文本添加到'extend.texi' - http:// gcc.gnu.org/onlinedocs/gcc/Loop-Specific-Pragmas.html – osgx

+0

Michal,你是否只需要「GCC插件」,或者修補gcc的代碼庫是否允許? – osgx