2013-10-04 15 views
4

是否有可能說服GCC發射的中間文件,其中示出了:使用GCC輸出評論&註釋的中間文件

  1. 評論
  2. 原始源
  3. 擴展宏定義應用於由
  4. 優化編譯器
  5. 生成的C或C++代碼將被轉換爲彙編代碼?

我寧願看到中間的C/C++而不是彙編程序,但是如果它有足夠的註釋,我也可以使用匯編程序。

我試圖反向工程一個庫,幾乎完全由宏組成,以擴展它。我還想看看優化的效果,以便爲編譯器提供更多機會來進行更多優化。 (換句話說,要查看我以前的嘗試無效)

+1

哪些選項是你已經知道的?我想你知道'-E'用於某些半註釋程序集的預處理(因此擴展宏)和'-S -g -fverbose-asm'。我不確定GCC是否可以在優化後發出中間語言代碼,您可能想看看Clang - 它編譯爲LLVM中間語言,它完全指定並可能比x8​​6 asm更容易讀取。 (我不認爲任何編譯器實際上會對C(++)源進行優化,並因此會發出可讀的C(++)優化代碼。) – us2012

+0

@ us2012:我(部分地)知道'-save-temps ',但由於我無法理解的原因,我無法實現它。如在,我找不到結果文件。 –

回答

5

GCC不是直接在C++代碼中應用優化,而是以某種內部語言獨立格式(稱爲GIMPLE)應用優化,但無法輕鬆恢復爲C++代碼。

取決於你想要什麼,你可以

  • 剛剛展開的巨集:g++ -E

  • 還是看的彙編程序輸出在這裏你可以看到其中的C線++代碼映射到一個彙編塊:

    g++ -g ... && objdump -S output 
    

    我不建議直接從gcc(帶-S)輸出彙編程序,因爲生成的註釋幾乎是useles秒。

2

1和2顯示在原始來源中。

3您可以通過-E獲得具有擴展宏定義(實際上已經完全預處理)的源代碼。

4可以通過-da或各種,-fdump-tree-xxx和其他-fdump-xxx選項獲得各個優化階段的中間代碼。

這些都記錄在這裏:

http://gcc.gnu.org/onlinedocs/gcc-4.8.1/gcc/Debugging-Options.html#Debugging-Options

5,我不認爲GCC確實源到源轉換,因此所得到的C++代碼是原來的C++代碼。

做哪些GCC不會在這裏描述:

http://gcc.gnu.org/onlinedocs/gccint/Passes.html#Passes