2012-05-16 76 views
28

我已經創建了我自己的(非常簡單的)字節碼語言,並創建了一個虛擬機來執行它。它工作正常,但現在我想使用gcc(或任何其他免費提供的編譯器)從普通的c程序爲本機生成字節碼。所以問題是,我如何修改或擴展gcc,以便它可以輸出我自己的字節碼?請注意,我不想將我的字節碼編譯爲機器碼,我想「編譯」c代碼(我自己的)字節碼。如何爲gcc編寫自己的代碼生成器後端?

我意識到這是一個潛在的大問題,最好的答案可能是「去看看gcc源代碼」。我只需要一些幫助就如何開始這一點。我認爲必須有一些關於這個主題的文章或書籍,可以描述向gcc添加自定義生成器的過程,但我沒有發現任何使用Google搜索的東西。

+19

請看LLVM。 GCC因難以擴展而聞名。 – Mat

+1

本指南可以幫助您:http://www.drdobbs.com/retargeting-the-gnu-c-compiler/184401529「關於如何將GNU C編譯器部署到您選擇的平臺的內部視圖。」 - 一個漂亮的很好的閱讀,雖然我還沒有試圖遵循它。 –

回答

9

這是艱苦的工作。

例如,我也用自己的字節碼設計自己的「架構」,並希望用它爲GCC生成C/C++代碼。這是我如何做到的方式:

  1. 起初,您應該閱讀關於在GCC的manual中移植的所有內容。
  2. 也別忘了太讀GCC Internals
  3. 閱讀關於編譯器的許多事情。
  4. 也看看這個question和答案在這裏。
  5. Google瞭解更多信息。
  6. 問問自己,如果你真的準備好了。
  7. 一定要有一個非常好的咖啡機......你會需要它。
  8. 開始將機器依賴文件添加到gcc。
  9. 以交叉主機 - 目標方式編譯gcc。
  10. 檢查十六進制編輯器中的代碼結果。
  11. 做更多的測試。
  12. 現在有樂趣與自己的架構:d

當你完成,你可以使用C或C++只是沒OS-dependet庫(你有你的架構目前沒有運行OS),你現在應該(如果你需要的話)用你的交叉編譯器編譯許多其他的庫來建立一個好的框架。

PS:LLVMClang)更容易移植...也許你想從那裏開始?

+0

這裏有一些非常實用的建議:)謝謝!海灣合作委員會似乎是一個可怕的野獸。我當然也會看看LLVM。這個項目似乎比我原先想象的要大,但我會給它一個機會...... –

+1

做到這一點:)沒有錯誤的方式來做這樣的事情... – pearcoding

+0

@pearcoding你聲稱LLVM更容易在哪個地方比gcc端口?你是否試圖移植並得出這個結論,還是你使用別人的結論?如果是後者,請參考。謝謝。 – Bregalad

2

這並不難,因爲這一切。如果您的目標機器與另一個機器相似,則將其RTL(?)定義作爲起點並對其進行修改,然後在引導階段執行make compile test;沖洗並重復,直到它工作。你可能不需要編寫任何實際的代碼,只需要定義機器定義模板。

15

我正忙於將gcc移植到我們之前設計的8位處理器上。對於我們的機器來說,這是一項艱鉅的任務,因爲它是8位的,我們只有一個累加器,但是如果你有更多的資源,它可以變得簡單。這是我們如何試圖用gcc 4來管理它。9個,並使用cygwin的:

  1. 下載gcc 4.9源
  2. # Decode aliases for certain CPU-COMPANY combinations.添加您的架構名稱config.sub圍繞線250的外觀在該列表中添加| my_processor \
  3. 在同一文件中找# Recognize the basic CPU types with company name.自己添加到列表:| my_processor-* \
  4. 搜索文件gcc/config.gcc,在文件中查找情況下$ {}的目標是圍繞線880,加入你自己的方式如下:

    ;; 
    my_processor*-*-*) 
        c_target_objs="my_processor-c.o" 
        cxx_target_objs="my_processor-c.o" 
        target_has_targetm_common=no 
        tmake_file="${tmake_file} my_processor/t-my_processor" 
        ;; 
    
  5. 從現有項目創建一個文件夾gcc-4.9.0\gcc\config\my_processor
  6. 複製文件和公正的編輯,或者從頭開始創建你自己的。在我們的項目中,我們已經從MSP430項目複製所有文件和編輯所有
  7. 你應該有以下文件(不是所有的文件都是強制性的):
    • my_processor.c
    • my_processor.h
    • my_processor.md
    • my_processor.opt
    • my_processor-c.c
    • my_processor.def
    • my_processor-protos.h
    • constraints.md
    • predicates.md
    • README.txt
    • t-my_processor
  8. 創建路徑gcc-4.9.0/build/object
  9. 運行../../configure --target=my_processor --prefix=path for my compiler --enable-languages="c"
  10. 使
  11. make install
  12. 做了大量的研究和調試。
  13. 玩得開心。
+2

這個答案值得更多的讚揚。出於好奇,你試圖移植gcc的架構是什麼?你成功的程度如何?您是否也使用binutils,或者您是否使用外部彙編程序?你怎麼能測試發射代碼的完整正確行爲?謝謝。 – Bregalad

+0

@Bregalad我們將從Linux交叉編譯到我們自己的架構,這是我們設計的一個非常簡單的指令集。所以編譯器住在一些Linux服務器上。我們豐富了這個項目,但是學到了很多東西。如果我這樣做,我會花更多時間學習gcc內部。我們根本沒有卸載binutils,但是建立了我們自己的彙編程序。我們的足跡很簡單,可以走這條路。我確定有更好的測試發射代碼的方法,但我們隻手動評估生成的彙編代碼。 – Tanyong

相關問題