接續前篇繼續看下去…
如果你真的要建立一個後端的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…