摘要
用C語言而不是匯編語言對SIC單片機開發,可以提高效率和降低學習成本。這樣的需求需要交叉編譯器把C語言代碼編譯成對應的單片機匯編語言。SIC單片機是由PIC單片機改進而成。編譯器開發是個復雜的過程,包括詞法分析、語法分析、中間代碼、寄存器分配、指令優化和指令輸出等工序。這其中許多工作是具有普遍性和重復性的。為了在開發過程中減少工作量和提高開發效率,便有了LLVM工具。
LLVM工具是集編譯、鏈接和調試為一體的編譯器系統開發框架。整體上分為前端、中間代碼和后端等三部分。其內部將一些重復性的工作進行封裝和模塊化以提供給開發人員進行調用。后端部分是移植工作的重點,主要包括對目標機器的寄存器描述、指令集描述、調用約定以及匯編指令的輸出等。同時內部還包含了大量的優化工作。這些所有的功能都提供了相應的接口,在編譯器的開發過程中,開發者可以直接調用這些接口來完成相應的功能開發。在LLVM工具內部定義SIC單片機時,先在LLVM源碼中進行目標機器信息的注冊。之后的重點工作是用LLVM內部的TD語言去描述SIC單片機的寄存器和指令集信息。然后對SIC單片機指令中不支持的一些IR指令進行合法化處理。在指令選擇階段使用自定義的指令選擇信息完成由IR指令到SIC單片機指令的匹配,同時處理SIC中工作寄存器被當作默認操作數的問題。最后處理匯編指令的格式輸出。
完成源碼的編譯后,對SIC單片機的使用方法便和其內部原有的目標機一樣。
通過參數指定SIC單片機作為后端目標機,已經能夠輸出完整的SIC匯編指令。對SIC單片機中獨特部分的處理也得到了解決。
關鍵詞:SIC單片機、LLVM框架、寄存器描述、指令選擇、后端移植
abstract
It can improve efficiency and reduce the cost of learning new knowledge when we develop programs with C language rather than assembly language on the Microcontrollers. We need a cross-compiler that can compile the C program to the assembly language of singlechip to meet this demand. SIC Microcontrollers we discuss here customized from PIC Microcontrollers. Developing compiler is a complicated task that includes lexical analysis, syntax analysis, intermediate representation, register allocated and instruction optimization procedures. There are lots of repeated task existed in above procedures.Thus, LLVM is developed.
Llvm tool is a compiler system development framework integrating compilation, linking and debugging. On the whole, it is pided into three parts: front end, intermediate code and back end. It encapsulates and modularizes some repetitive work to provide developers with calls. The back-end part is the focus of the migration work, mainly including the register description, instruction set description, call Convention and assembly instruction output of the target machine. At the same time, it also contains a lot of optimization work. All these functions provide corresponding interfaces. In the development process of the compiler, developers can directly call these interfaces to complete the corresponding function development. When defining SiC MCU in llvm tool, first register the target machine information in llvm source code. After that, the key work is to use the TD language inside llvm to describe the register and instruction set information of SiC MCU. Then legalize some IR instructions that are not supported in SiC MCU instructions. In the instruction selection stage, the user-defined instruction selection information is used to complete the matching from IR instruction to SiC MCU instruction, and deal with the problem that the working register in SiC is regarded as the default operand. Finally, the format output of assembly instructions is processed.
After compiling the source code, the use method of SiC MCU is the same as its original target machine.
By specifying SiC MCU as the back-end target machine through parameters, it has been able to output complete SiC assembly instructions. The processing of the unique part of SiC single chip microcomputer has also been solved.
Key words: SiC MCU, llvm framework, register description, instruction selection, back-end transplantation
目 錄
1 緒論
1.1 研究背景與意義
在萬物聯網的環境下,單片機的使用領域越來越廣泛。在單片機環境中進行開發成了一項重要的技能。但單片機下的開發通常采用匯編語言進行。為了更好的適應產品的需求和提升性能,有些企業還對單片機芯片進行定制。這樣的結果使得單片機下的編程效率不高。因為在利用匯編語言編程的同時還要掌握不同定制芯片間的差異問題。在這樣一個背景下,如何提高在單片機下的編程效率便成了一個值得探究的問題。而其中一個便捷的方法莫過于直接在編程方式上進行改進,即通過高級語言直接對單片機進行程序的開發,之后再用編譯器把高級語言編譯成對應單片機的匯編語言。這樣開發人員只需要關注如何用高級語言進行開發而不用再關心如何掌握對應芯片的匯編語言以及底層各芯片間的差異問題。這其中的轉換都將由編譯器來完成,而如何開發這編譯器便是本文項目要研究的內容。
眾所周知,無論是計算機下的芯片還是單片機中的芯片,都只能識別二進制形式的可執行代碼。但進行程序的開發工作卻是由高級語言來完成的。如何由高級語言轉換到二進制形式便是編譯器的工作。編譯器的設計直接受一門高級語言語法格式、編程風格的影響;同時設計的好壞又會影響著語言的運行性能及適用范圍。例如對于 C/C++高級語言,GNU(GNU is Not Unix)下的編譯器和 Studio Visual 中的編譯器雖然完成一樣的功能,但是在一些細節處理如虛繼承、多重繼承等中也會存在著差異。而 Java 語言則是實現一次編譯,多次運行的跨平臺移植。它先將 Java 源代碼先編譯成字節碼,之后再由 Java 的虛擬機 JVM(Java Virtual Machine)對其解釋執行。只要安裝不同操作系統下的 JVM 工具,便可以在不同平臺上運行了。即使各語言間存在著巨大的語法差異,以及同一門語言中的不同編譯器也有著設計上的不同。但它們的本質功能都是為了把程序翻譯成在運行性能盡可能好的二進制文件。
雖然編譯器的功能本質上就是翻譯,但編譯器的內部工作流程以及開發卻是相當復雜的工程,它涉及到高級語言中語法特性,大量的底層硬件信息和對于生成的代碼的優化工作。如果整個流程都親自完成,那么對于開發功能簡單和時間緊的項目來講卻是性價比比較低的工作。在這樣的背景下便出現了輔助編譯器開發的工具模塊。這些工具把編譯器開發中的一些重復性、通用性的工作進行封裝和模塊化,開發人員在開發時只需要直接調用即可。開發人員只需要關注高級語言和后端目標機中的獨特特性即可,只有針對這些特性才需要作相應的開發工作。本文項目中要用到的 LLVM 工具便是這樣的一個輔助工具。它大大減少了編譯器開發中的工作量和難度,同時利用了其本身自帶的優化工具。為開發人員節省了大量的時間和精力。
本文要研究的就是這樣一個項目,采用 LLVM 工具開發一個能夠將高級語言編譯成對應單片機匯編語言的交叉編譯器。這樣的一個研究項目能夠解決實際生產中的需求,同時對 LLVM 工具本身的設計結構和編譯器后端的具體實現流程也有一定的研究意義。
1.2 國內外研究現狀
1.2.1 編譯器概述
編譯器作為連接高級語言和機器語言的工具,既要支持高級語言中各種高度抽象的特性,同時也要處理底層中煩瑣的硬件信息以及如何對生成的代碼進行優化[1].
對于開發人員來講,這無疑是個復雜費力的研究。而借用于已有的開源工具鏈,在其基礎上進行修改便成為了一種便捷可靠的開發方法。GCC(GNU CompilerCollection)作為前端支持多種高級語言,后端支持多種目標平臺的編譯系統,對于后端的移植開發來講是一個合適的輔助開發工具。李杰[2](2004)探討了在 GCC 下的移植工作。孟昭天[3](2010)利用 GCC 的目標可重定位特性,探索了 GCC 系統下的移植方法,生成了適用于 ARCA3 的編譯器。張梅娟、張榮[4](2018)基于 GCC 的編譯工具開發。GNU 下的 GCC 工具有多年的發展歷程和豐富的工具鏈,這些優勢本應成為輔助編譯器開發的一個最佳的選擇。只是由于 GCC 工具設計之初的目的并不在于復用性和易修改性,對于其內部的一些功能也沒有提供太多的調用接口。加上多年的發展,GCC 代碼的閱讀和修改已經是一個異常困難的任務了。這種困難性主要體現在GCC 的中間代碼 RTL(Register Transfer Language)、錯誤信息的提示以及對于信息接口的設計上[5](2004)。因此在關于輔助編譯器開發中需要一個新的框架來支持。
基于這種需求,2000 年 illinois 大學開始了 LLVM 項目[6].Chris Lattner 和Vikram Adved 在早年發表的論文[7](2003)[8](2004)中設計了一個編譯框架支持編譯器的開發工作。在文中討論了對于 LLVM 整體結構的設計,并闡明其目的是封裝相應的功能模塊然后通過提供接口來簡化對編譯器的開發工作,盡可能讓更多的編譯器工作自動化生成。隨著蘋果公司加入該項目,該項目更是獲得了長足的發展和商用化[9].現在 LLVM 擁有資料詳盡的文檔介紹和一個良好的社區環境,還有一年兩次的開發者大會[10](2018),對于開發問題的探討和相關論文的分享。對于 LLVM 的介紹,Chris Lattner[11](2002)[12](2008)[13](2018)還提供了一個文檔以幫助開發人員進行理解。
1.2.2 國內研究現狀
國內較早關注 LLVM 工具的研究者董峰[14](2007)。在 2007 年就詳細闡述和分析了LLVM 架構的基本結構,其組成部分中的各項具體功能和 LLVM 的后端移植機制。并且對 ARM 的基本特性也作了詳細的介紹,之后實現了對 ARM 后端移植的支持。對于特定的芯片的移植,趙曄[15](2015)利用 LLVM 編譯工具和 PowerPC970 處理器設計了一款交叉編譯器。它是把高級語言翻譯成了 PowerPC970 目標機器的匯編代碼。而任艷珍[16](2017)則以國產自主研發的 STX 專用處理器作為目標芯片,實現了對于這款芯片的移植。而這款芯片主要是用于嵌入式的處理中。胡敏[17](2014)成功實現了 C-SKY自主知識產權的高性能嵌入式 CPU 在 LLVM 系統上的移植。張祖羽[18](2012)的 C*Core嵌入式處理器架構移植及盧念[19]對于 NiosII 后端的移植。后端機器的移植基本上完成了所有的后端流程,是深深的立足于 LLVM 工具本身的研究。
LLVM 的優越性之一是內部良好的結構設計和優化機制,而這種友好性除了在工具內部使用外,同時也可以通過接口被開發人員所調用。所以 LLVM 另外一個常用的地方是利用其內部的功能來完成某些特定的功能。如使用 LLVM 內部的 DAG 圖信息,陳星昊[20](2018)利用 LLVM 內部的程序代碼依賴圖和程序依賴圖在克隆代碼檢測中具有分析全面和精確度高的特點。提出了一個利用 LLVM 工具的克隆代碼檢測的技術。
在 LLVM 優化機制的使用上。安龍飛[21](2015)利用 LLVM 編譯器的內部架構實現對函數內聯模型進行改進。通過該技術他遍歷程序的效率平均提高了 1.52%.裴根[22](2013)則對異構編譯的優化進行研究。用于在異構計算機系統中開發可移植的并行應用程序。李昊[23](2017)用 LLVM 實現軟件代碼的靜態檢測,以降低軟件測試所 需花費成本,提高整體開發的效率。在靜態程序的處理上,還有陳云瀟[24](2018)、徐晨晨[25](2017)等也做了相關的研究。利用 LLVM 工具的中間代碼 IR 設計,趙天宇[26](2016)把 IR 轉換成腳本語言,從而實現了從一種高級語言到另一種高級語言的轉換。王時雨[27](2018)把 LLVM 工具應用于圖像處理,提高處理速度。Clang 工具是 LLVM 的前端組成部分,這一工具也提供了眾多接口。張代遠[28](2015)、李樹芳[29](2017)用 Clang 提供的工具完成了對 C 語言的分析處理。
1.2.2 國外研究現狀
國外對于 LLVM 工具的研究也主要分布于后端目標機的移植和工具的內部模塊及優化機制。Bruno Cardoso Lopes 和 Rafael Auler[30]撰寫的著作對于 LLVM 工具的整體結構和各個接口作了詳盡的描述。這是目前了解 LLVM 的一個權威書籍。目前關于LLVM領域內的另一本書籍為Mayur Pandey[31]所著。Juneyoung Lee和Yoonseung Kim[32]
。2017)研究了中間代碼 IR 的未定義行為。未定義行為不一定代表不安全的程序,但可能有對一些語法的處理的缺陷。通過處理這些未定義的行為可以對程序代碼作更進一步的優化。Juneyoung Lee 和 Chung-Kil Hur[33](2018)探究了內存模型,實現對 LLVM 內部的優化和底層代碼進行進一步處理。在利用 LLVM 進行后端移植的研究中,Connor Goldberg[34](2017)完成了對于自定義的 32 位精簡指令集 CPU 的移植。Chen Chung-Shu 和 Anoushe Jamshid[35]用自定義的 Cpu0 芯片,詳細描述了如何在 LLVM 工具進行移植的方法。這是一個詳盡的教程,對于 LLVM 后端的移植具有很強的指導意義。對編譯器的研究可以知道,大量的窺孔優化存在于編譯器之中,但這其中的一些優化可能會成為Bug的來源。David Menendez和Santosh Nagarakatte[36]
。2016)探討了利用自動檢測技術驗證窺孔優化技術的正確性。以及對于浮點數的檢測處理[37].同時也有 Alex Denisov 和 Stanislav Pankevich[38](2018)對工作在IR 代碼上的異常檢測研究。Yi-Hong Lyu 和 Ding-Yong Hong[39](2014)利用 LLVM 后端開發了一個動態二進制庫來作為程序執行時調試工具的核心組成部分。
LLVM 工具的功能非常多,從各種研究中也可以看到在應用上有各種各樣的使用和嘗試。而國內外的研究更多地聚焦于后端移植和內部優化。通過這些研究,對 LLVM工具的框架結構和內部機制有了更深入和全面的了解。
1.3 本文的研究內容
本文的主要研究目的是如何在 LLVM 工具內部定義一個單片機的芯片。因此研究該款 SIC 單片機芯片結構、了解 LLVM 框架的設計結構和學習如何把 SIC 單片機定義在 LLVM 工具中將成為本文的主要研究內容。
。1)SIC 單片機結構的研究SIC 單片機是基于 PIC 單片機而改進的。在改進的過程,針對特定的功能和需求進行了相應的精簡。為了更好的在 LLVM 工具下進行移植,便需要先從整體的角度來了解 SIC 單片機。這包括 SIC 的指令結構、內存布局、中斷函數、堆棧結構等重要組成部分,這其中有些信息將會在 LLVM 工具中直接用到的,而其中的一些則可能會需要特別處理。如 SIC 單片機中所有的指令都需要用到一個工作寄存器,這樣的設計跟一般的計算機指令有很大的不同,在編譯過程中怎樣處理將是一個需要考慮的問題。所以首要的工作便是要充分了解這些信息,了解單片機內部的運行和組成結構。因為在 LLVM 后端移植中用的最多的是它的內存布局和指令集等信息,所以對于單片機結構的研究也將更集中于這些方面。
。2)LLVM 架構分析對 LLVM 工具的框架研究則是另一個主要的內容。隨著多年的發展,LLVM 工具和整個框架體系不斷豐富擴大,由最初的底層虛擬機演變成了構架編譯器的框架系統。
現在的 LLVM 工具能夠在眾多領域中發揮作用,并都有著不錯的表現。LLVM 工具的更新迭代比較快,本文結合在項目中的研究工作,將采用 LLVM3.9 版本作為研究對象。
將重點關注 LLVM 的整體框架和基本工作流程;同時學習單片機這種內存較為簡單,但與一般的計算機系統結構有較大差異的芯片結構在 LLVM 工具中如何定義和實現的方法。通過 LLVM 架構的分析使得對其有一個深入的了解和掌握,這樣可以更大限度的挖掘其能力,F在興起的人工智能熱中,有些企業在開發能夠更快處理圖像的處理器,以及利用 LLVM 對數據庫引擎進行優化處理。這些處理器都需要定制相應的編譯器去支持,這些完全可以采 LLVM 工具來輔助開發。同時 LLVM 工具內部除了提供自帶的優化機制外,還有相應的接口給開發人去增添優化處理功能。這對于需要更快性能的內核來講是一個極大的便利。因此可以預見到,LLVM 工具具有遠大的使用前景。本文希望可以借此為 LLVM 工具的廣泛應用貢獻一份綿薄之力。
。3)SIC 編譯器的實現在 LLVM 內定義一個目標機后端將是本文重點研究的內容。在完成了對 SIC 單片機和 LLVM 框架的分析后,將會對 SIC 編譯器的操作和實現過程有了大概的了解。但由于SIC單片機與一般計算機系統上的差異,還將要重點要關注如何調整修改LLVM,使其能夠處理單片機下內存簡單,指令精簡的情況。雖然 LLVM 工具在內部有提供相應的接口使開發人員能夠去修改,但在實操中才會發現所有的修改都是非常復雜的工程。所以在實現了對單片機芯片的定義后,將對這次項目的經驗進行歸納總結,甚至是添加一個新的接口,把對于這類單片機的特定處理過程進一步簡化。從而可以為以后的深入探索提供幫助。
1.4 本文的組織結構
本文內容的組織結構主要分為以下幾個部分:
第一章,緒論。介紹本文的研究背景和意義。探討了當前國內外學者對于 LLVM工具的研究現狀和應用示例,LLVM 官方對于 LLVM 未來發展的展望。以及對于把 LLVM工具移植到 SIC 芯片中的意義和 LLVM 工具的學習價值。
第二章,SIC 結構研究。SIC 單片機是本文要進行移植的目標機器,在這里探討了其內部特色的內存設計和二地址式指令集的組成。并與一般的計算機系統結構進行對比,及分析這種差異會給編譯器的設計帶來什么影響。
第三章,LLVM 框架分析。了解其自動生成編譯器代碼的主要的工作原理和設計思想。理清LLVM工具的組成部分和后端編譯過程中各模塊和功能的組成,指令在LLVM各個階段中的演變和提供了哪些接口進行定制化處理。
第四章,SIC 編譯器實現。給出基于 LLVM 工具的 SIC 單片機后端移植的具體實現。介紹對寄存器、指令集、調用約定和匯編指令的處理。同時還有對于 SIC 芯片中的特殊性部分的處理方法。
第五章,測試結果。介紹 LLVM 源碼的編譯和使用命令,并給出測試結果。
第六章,總結與展望。對整個項目的工作進行歸納總結,并展望在以后的工作中可以作進一步研究的地方。
2 SIC 結構研究
2.1 SIC 單片機 CPU
2.2 內存存儲結構
2.3 指令集組成
2.4 本章小結
3 LLVM 框架分析
3.1 LLVM 整體框架結構
3.2 LLVM 編譯流程之前端
3.3 LLVM 編譯流程之中間代碼 IR
3.4 LLVM 編譯流程之后端
3.5 LLVM 后端的具體接口
3.6 本章小結
4 SIC 編譯器實現
4.1 配置文件的處理
4.2 指令集的處理
4.3 寄存器的處理
4.4 調用約定的處理
4.5 指令周期的處理
4.6 合法化的處理
4.7 指令選擇的處理
4.8 輸出結果的處理
4.9 本章小結
5 測試結果
5.1 源碼編譯處理
5.2 結果輸出
6 總結與展望
6.1 本文工作總結
開發編譯器是一個復雜的工程,如果全部的內容都由開發者自己完成。這無疑是一個巨大和艱巨的工作。為了解決這一問題,產生了專門用來輔助開發人員進行編譯器開發的工具。LLVM 便是這樣的一個集編譯、鏈接和調試為一體的編譯系統。本文項目利用 LLVM 工具輔助開發了一個 SIC 單片機的交叉編譯器,它將 C 語言編譯成SIC 單片機的匯編語言,提高生產工人的工作效率。
。1)在項目的伊始階段是對 SIC 單片機內部的結構進行了解和分析。SIC 單片機與一般的計算機系統一樣,具有 CPU、內存等結構以及匯編語言。但在具體細節上也存在著一定的差異。如內存結構的組成上,SIC 單片機全部由寄存器完成,而不像計算機系統中有寄存器、緩存、主存及硬盤存儲等。而另一個較大的差異則是 SIC單片機的匯編指令格式為二地址式,采用一個默認的工作寄存器來充當其中的一個操作數。
。2)LLVM 的整體結構分為前端、中間代碼和后端等部分。中間代碼是 LLVM 框架的基石,它由前端工具 Clang 生成,而用于后端的指令編譯。中間代碼采用了 SSA形式,便于支持高級語言的語法和對其進行優化。前端主要完成了詞法分析、語法分析、語義分析等編譯器的基本操作,這一部分在 LLVM 中定義 SIC 單片機時直接沿襲,未作修改。后端部分是在 LLVM 中定義一個新目標機器時的重要部分,其內部由眾多階段組成。每一個階段基本上代表著一個功能模塊,主要的功能有寄存器描述、指令集描述、指令的合法化和指令選擇等。
。3)對于后端的各個功能模塊,LLVM 提供了相應的接口給開發人員進行功能的完成。本文中主要是解決了 LLVM 中 TD 語言對于 SIC 單片機寄存器和指令集的描述;同時還在 C++代碼里面解決 LLVM 的中間代碼 IR 不被 SIC 匯編指令支持的問題;接著解決了指令的輸出和格式化問題。最后是對所作的工作進行了測試和驗證。
6.2 工作展望
本次在 LLVM 工具中定義一個目標機的過程中,對于其整個框架結構和功能實現都有了較為深入的學習與了解。雖然在項目研究中只用到了 LLVM 工具的一部分功能,但已經充分認識到該工具的強大性和應用范圍的廣泛性。展望今后的學習,如果有幸繼續耕耘于此領域,那么將會更多的關注 LLVM 工具內部自帶的優化工具及添加自定義的優化程序。因為在 LLVM 工具的后端部分,針對每次生成的指令代碼都會做一次優化遍歷。這種處處優化的精神無疑有著其內部良好結構設計的支持,同時這對開發一個追求運行速度的編譯器來講具有很大的吸引力,因此值得在這方面繼續深入探究。
致謝
春盡夏立,柳絮飄盡,梧桐花散。在本是初夏燥熱時節,灰鉛色的天空卻像極了暮秋之感。在此情此景下,此時此刻的我坐在圖書館里,追憶往昔。
回首過去兩年研究生生活,那些個片段如走馬燈般呈現,內容若隱若現。人們常說不念過往,但不念過往又哪來的對生活的蛛絲馬跡。過去的種種筑壘起了如今的一切,無論是喜或憂,都深深的嵌在了腳下,F在在這樣的一個時節中,于我,則寄望可以帶著過去奔赴將來,去走進下一段旅程。
在兩年的學習中,感謝徐麗萍老師在學習和項目工作中的幫助,使得我可以完成研究生階段的各項任務。感謝兩位同窗,鄭展和王芳同學,兩年的學習,我們從最開始的研究生復試開始認識,一起完成研究生的學習。感謝學弟嚴智康,我們一起進入項目,在開發過程中他提供了很多的幫助。實驗室里的謝云菲、王凱和李碩琳,大家一起歡聚的時光為單調的學習日子增添了不一樣的色彩。向大家伙兒致謝!同時對于花費時間和精力來參與論文答辯的老師表示感謝!
參考文獻
[1] 張素琴,呂映芝。編譯原理。版本(第 2 版)。北京:清華大學出版社,2005.
[2] 李杰。GCC 編譯系統結構分析與后端移植實踐:[碩士學位論文].杭州:浙江大學圖書館,2004.
[3] 孟昭天; GCC 的 ARCA3 的編譯器移植:[碩士學位論文].哈爾濱:哈爾濱工業大學圖書館,2010.
[4] 張梅娟,張榮; GCC 的 cmdsp2f01 編譯工具移植開發。電子與封裝,2018,18(1):26~42.
[5] Clang vs GCC[EB/OL]. http://clang.llvm.org/comparison.html#gcc,2019-05-01.
[6] The LLVM Compiler Infrastructure[EB/OL]. https://llvm.org/.2019-05-01.
[7] Vikram Adve,Chris Lattner,Michael Brukman et al.LLVA: A Low-level VirtualInstruction Set Architecture.in: Proceedings of the 36th annual ACM/IEEEinternational symposium on Microarchitecture (MICRO-36)。San Diego,CA,December 2003.
[8] Chris Lattner,Vikram Adve.LLVM: A Compilation Framework for LifelongProgram Analysis & Transformation.Technical Report #UIUCDCS-R-2003-2380,Computer Science Dept. Univ. of Illinois,Sep.2003.
[9] LLVM Users[EB/OL].http://llvm.org/Users.html,2019-05-01.
[10] LLVM Developers' Meeting[EB/OL].http://llvm.org/devmtg/,2019-05-01.
[11] Chris Lattner.LLVM: An Infrastructure for Multi-Stage Optimization: [M.SThesis].Urbana,IL:Computer Science Dept.,University of Illinois atUrbana-Champaign,2002.
[12] Chris Lattner.Introduction to the LLVM Compiler System.AdvancedComputing and Analysis Techniques in Physics Research,Erice,Sicily,Italy,Nov.2008.
[13] Tatiana Shpeisman,Chris Lattner.MLIR: Multi-Level IntermediateRepresentation for Compiler Infrastructure.2019 European LLVM DevelopersMeeting,April 2019.
[14] 董峰。LLVM 編譯系統結構分析與后端移植:[碩士學位論文].上海:上海交通大學圖書館,2007.
[15] 趙曄; LLVM 的交叉編譯器的設計與實現:[碩士學位論文].西安:西安電子科技大學圖書館,2015.
[16] 任艷珍; LLVM 的專用 CPU 后端移植分析與設計:[碩士學位論文].成都:成都理工大學圖書館,2017.
[17] 胡敏; LLVM 編譯架構的 CSKY 后端移植:[碩士學位論文].杭州:浙江大學圖書館,2014.
[18] 張祖羽; LLVM 的 C_Core 后端移植研究:[碩士學位論文].哈爾濱:哈爾濱工程大學圖書館,2012.
[19] 盧念; LLVM 的 NiosⅡ處理器后端快速移植及優化:[碩士學位論文].長沙:中南大學圖書館,2011.
[20] 陳星昊; LLVM 克隆代碼檢測關鍵技術研究:[碩士學位論文].南京:南京郵電大學圖書館,2018.
[21] 安龍飛; LLVM 的函數內聯優化技術研究:[碩士學位論文].哈爾濱:哈爾濱工程大學圖書館,2015.
[22] 裴根; LLVM 的異構編譯優化方法研究:[碩士學位論文].重慶:重慶交通大學圖書館,2013.
[23] 李昊; LLVM_Clang 的軟件靜態檢測工具研究與實現:[碩士學位論文].西安:西安理工大學圖書館,2017.
[24] 陳云瀟; LLVM 的靜態程序有界模型檢測:[碩士學位論文].福州:華僑大學圖書館,2018.
[25] 徐晨晨; LLVM 的靜態程序切片方法研究:[碩士學位論文].南京:南京郵電大學圖書館,2017.
[26] 趙天宇; LLVM 的腳本語言后端工具設計與實現:[碩士學位論文].長春:吉林大學圖書館,2016.
[27] 王時雨; LLVM 架構的圖像處理程序的并行分類。 微電子學與計算機,2018,35(1):66~71.
[28] 張代遠;贑lang的C語言代碼并行化轉換工具的設計與實現:[碩士學位論文].長春:吉林大學圖書館,2015.
[29] 李樹芳。采用 Clang_LLVM 的 C_源代碼覆蓋率分析插裝方法。 計算機科學,2017,44(11):191~194.
[30] Bruno Cardoso Lopes,Rafael Auler.Getting Started with LLVM CoreLibraries.Edition(1st Edition)。UK: Packt Publishing Ltd,2014.
[31] Mayur Pandey.LLVM Cookbook.Edition(1st Edition)。UK:Packt Publishing Ltd,2015.
[32] Juneyoung Lee,Yoonseung Kim,Youngju Song et al.Taming Undefined Behaviorin LLVM.in:Proc.of the 38th ACM SIGPLAN Conference on ProgrammingLanguage Design and Implementation (PLDI),June 2017.
[33] Juneyoung Lee,Chung Kil Hur, Ralf Jung et al.Reconciling High-LevelOptimizations and Low-Level Code in LLVM.in:Proc.of the ACM onProgramming Languages,Volume 2 Issue OOPSLA,Nov.2018.
[34] Connor Jan Goldberg.The Design of a Custom 32-bit RISC CPU and LLVMCompiler Backend.Master's Thesis, Rochester Institute of Technology,Aug.2017.
[35] Chen Chung Shu,Anoushe Jamshidi.Tutorial LLVMBankend Cpu0.
[36] David Menendez,Santosh Nagarakatte.Termination-Checking for LLVMPeephole Optimizations.
[37] David Menendez,Santosh Nagarakatte,Aarti Gupta.Alive-FP:AutomatedVerification of FloatingPoint Based Peephole Optimizations in LLVM.Proceedings of the 23rd Static Analysis Symposium (SAS 2016),Aug.2016.
[38] Alex Denisov,Stanislav Pankevich.Mull It Over: Mutation Testing Based onLLVM. IEEE International Conference on Software Testing, Verification andValidation Workshops (ICSTW),Apr.2018.
[39] Yi Hong Lyu,Ding Yong Hong,Tai Yi Wu et al.DBILL: An Efficient andRetargetable Dynamic Binary Instrumentation Framework Using LLVM Backend.in: Proceedings of the Tenth ACM SIGPLAN/SIGOPS International Conferenceon Virtual Execution Environments (VEE 2014),Mar.2014.
[40] LLVM Download Page[EB/OL].http://releases.llvm.org/,2019-05-01.
[41] Chris Lattner.The Architecture of Open Source Applications[EB/OL].http://www.aosabook.org/en/llvm.html,2019-05-01.
(如您需要查看本篇畢業設計全文,請您聯系客服索。