LLVM 後端開發 (2)

接續前篇繼續看下去…

如果你真的要建立一個後端的compiler,需要建立跟改動一些檔案,在這邊只是最基本的一些說明及討論
如果真的要做到完全是平台獨立的後端的compiler的話,則還需要詳細的執行LLVM Target-Independent Code Generator這份文件內的說明

天啊~~~~

不過還是先從這邊大致瞭解一下
首先還是先去下載原始碼下來

因為要建立一個後端的compiler,所以我們先在lib/Target裡面建立一個自己的資料匣,假設你的平台叫Dummy,那就建一個叫lib/Target/Dummy的資料匣吧

再來就是在資料匣內建立CMakeLists.txt這份文件,不知道怎麼寫沒關係,直接去其它的Target資料匣copy一份過來改

在這份文件內呢,至少要有一個LLVM_TARGET_DEFINITIONS的變數存在

set(LLVM_TARGET_DEFINITIONS AVR.td)

tablegen(LLVM AVRGenAsmMatcher.inc -gen-asm-matcher)
tablegen(LLVM AVRGenAsmWriter.inc -gen-asm-writer)
tablegen(LLVM AVRGenCallingConv.inc -gen-callingconv)
tablegen(LLVM AVRGenDAGISel.inc -gen-dag-isel)
tablegen(LLVM AVRGenDisassemblerTables.inc -gen-disassembler)
tablegen(LLVM AVRGenInstrInfo.inc -gen-instr-info)
tablegen(LLVM AVRGenMCCodeEmitter.inc -gen-emitter)
tablegen(LLVM AVRGenRegisterInfo.inc -gen-register-info)
tablegen(LLVM AVRGenSubtargetInfo.inc -gen-subtarget)

add_public_tablegen_target(AVRCommonTableGen)

add_llvm_target(AVRCodeGen
  AVRAsmPrinter.cpp
  AVRExpandPseudoInsts.cpp
  AVRFrameLowering.cpp
  AVRInstrInfo.cpp
  AVRISelDAGToDAG.cpp
  AVRISelLowering.cpp
  AVRMCInstLower.cpp
  AVRRelaxMemOperations.cpp
  AVRRegisterInfo.cpp
  AVRSubtarget.cpp
  AVRTargetMachine.cpp
  AVRTargetObjectFile.cpp

  DEPENDS
  intrinsics_gen
)

add_subdirectory(AsmParser)
add_subdirectory(Disassembler)
add_subdirectory(MCTargetDesc)
add_subdirectory(TargetInfo)

函式庫則可以取名叫LLVMDummy或是分成LLVMDummyCodeGen及LLVMDummyAsmPrinter,然後 LLVMDummyAsmPrinter 應該在 lib/Target/Dummy資料匣內實作他們
如:建立一個LLVMDummyAsmPrinter.cpp
內容嘛一樣先不管他,直接先從其它Target資料匣copy一份過來改

接下來,要實作TargetMachine的子類別
在資料匣內建一個LLVMDummyTargetMachine.cpp,同上一樣去copy過來改
先把裡面其它Target的名字替換成自己的

接下來就是怎麼build你專屬的Target了
用cmake帶參數 -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=Dummy即可
這樣就可以建立一個什麼都沒有的後端了 Q__Q

待其它東西陸續穩定完成後,再加到CMakeLists.txt這個文件內,放到add_llvm_target內再重新編譯即可。

今天就寫到這,下篇寫TargetMachine…

發佈留言