苍井优一级毛片免费观看,成年网站在线观看,日本一二三不卡视频,日日天天人人夜夜九九

24小時(shí)論文定制熱線(xiàn)

熱門(mén)畢設:土木工程工程造價(jià)橋梁工程計算機javaasp機械機械手夾具單片機工廠(chǎng)供電采礦工程
您當前的位置:論文定制 > 畢業(yè)設計論文 >
快速導航
畢業(yè)論文定制
關(guān)于我們
我們是一家專(zhuān)業(yè)提供高質(zhì)量代做畢業(yè)設計的網(wǎng)站。2002年成立至今為眾多客戶(hù)提供大量畢業(yè)設計、論文定制等服務(wù),贏(yíng)得眾多客戶(hù)好評,因為專(zhuān)注,所以專(zhuān)業(yè)。寫(xiě)作老師大部分由全國211/958等高校的博士及碩士生設計,執筆,目前已為5000余位客戶(hù)解決了論文寫(xiě)作的難題。 秉承以用戶(hù)為中心,為用戶(hù)創(chuàng )造價(jià)值的理念,我站擁有無(wú)縫對接的售后服務(wù)體系,代做畢業(yè)設計完成后有專(zhuān)業(yè)的老師進(jìn)行一對一修改與完善,對有答辯需求的同學(xué)進(jìn)行一對一的輔導,為你順利畢業(yè)保駕護航
代做畢業(yè)設計
常見(jiàn)問(wèn)題

基于LLVM的SIC單片機編譯器研發(fā)

添加時(shí)間:2021/08/26 來(lái)源:未知 作者:樂(lè )楓
LLVM工具是集編譯、鏈接和調試為一體的編譯器系統開(kāi)發(fā)框架。整體上分為前端、中間代碼和后端等三部分。其內部將一些重復性的工作進(jìn)行封裝和模塊化以提供給開(kāi)發(fā)人員進(jìn)行調用。
以下為本篇論文正文:

摘要

  用C語(yǔ)言而不是匯編語(yǔ)言對SIC單片機開(kāi)發(fā),可以提高效率和降低學(xué)習成本。這樣的需求需要交叉編譯器把C語(yǔ)言代碼編譯成對應的單片機匯編語(yǔ)言。SIC單片機是由PIC單片機改進(jìn)而成。編譯器開(kāi)發(fā)是個(gè)復雜的過(guò)程,包括詞法分析、語(yǔ)法分析、中間代碼、寄存器分配、指令優(yōu)化和指令輸出等工序。這其中許多工作是具有普遍性和重復性的。為了在開(kāi)發(fā)過(guò)程中減少工作量和提高開(kāi)發(fā)效率,便有了LLVM工具。

  LLVM工具是集編譯、鏈接和調試為一體的編譯器系統開(kāi)發(fā)框架。整體上分為前端、中間代碼和后端等三部分。其內部將一些重復性的工作進(jìn)行封裝和模塊化以提供給開(kāi)發(fā)人員進(jìn)行調用。后端部分是移植工作的重點(diǎn),主要包括對目標機器的寄存器描述、指令集描述、調用約定以及匯編指令的輸出等。同時(shí)內部還包含了大量的優(yōu)化工作。這些所有的功能都提供了相應的接口,在編譯器的開(kāi)發(fā)過(guò)程中,開(kāi)發(fā)者可以直接調用這些接口來(lái)完成相應的功能開(kāi)發(fā)。在LLVM工具內部定義SIC單片機時(shí),先在LLVM源碼中進(jìn)行目標機器信息的注冊。之后的重點(diǎn)工作是用LLVM內部的TD語(yǔ)言去描述SIC單片機的寄存器和指令集信息。然后對SIC單片機指令中不支持的一些IR指令進(jìn)行合法化處理。在指令選擇階段使用自定義的指令選擇信息完成由IR指令到SIC單片機指令的匹配,同時(shí)處理SIC中工作寄存器被當作默認操作數的問(wèn)題。最后處理匯編指令的格式輸出。

  完成源碼的編譯后,對SIC單片機的使用方法便和其內部原有的目標機一樣。

  通過(guò)參數指定SIC單片機作為后端目標機,已經(jīng)能夠輸出完整的SIC匯編指令。對SIC單片機中獨特部分的處理也得到了解決。

  關(guān)鍵詞: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 研究背景與意義

  在萬(wàn)物聯(lián)網(wǎng)的環(huán)境下,單片機的使用領(lǐng)域越來(lái)越廣泛。在單片機環(huán)境中進(jìn)行開(kāi)發(fā)成了一項重要的技能。但單片機下的開(kāi)發(fā)通常采用匯編語(yǔ)言進(jìn)行。為了更好的適應產(chǎn)品的需求和提升性能,有些企業(yè)還對單片機芯片進(jìn)行定制。這樣的結果使得單片機下的編程效率不高。因為在利用匯編語(yǔ)言編程的同時(shí)還要掌握不同定制芯片間的差異問(wèn)題。在這樣一個(gè)背景下,如何提高在單片機下的編程效率便成了一個(gè)值得探究的問(wèn)題。而其中一個(gè)便捷的方法莫過(guò)于直接在編程方式上進(jìn)行改進(jìn),即通過(guò)高級語(yǔ)言直接對單片機進(jìn)行程序的開(kāi)發(fā),之后再用編譯器把高級語(yǔ)言編譯成對應單片機的匯編語(yǔ)言。這樣開(kāi)發(fā)人員只需要關(guān)注如何用高級語(yǔ)言進(jìn)行開(kāi)發(fā)而不用再關(guān)心如何掌握對應芯片的匯編語(yǔ)言以及底層各芯片間的差異問(wèn)題。這其中的轉換都將由編譯器來(lái)完成,而如何開(kāi)發(fā)這編譯器便是本文項目要研究的內容。

  眾所周知,無(wú)論是計算機下的芯片還是單片機中的芯片,都只能識別二進(jìn)制形式的可執行代碼。但進(jìn)行程序的開(kāi)發(fā)工作卻是由高級語(yǔ)言來(lái)完成的。如何由高級語(yǔ)言轉換到二進(jìn)制形式便是編譯器的工作。編譯器的設計直接受一門(mén)高級語(yǔ)言語(yǔ)法格式、編程風(fēng)格的影響;同時(shí)設計的好壞又會(huì )影響著(zhù)語(yǔ)言的運行性能及適用范圍。例如對于 C/C++高級語(yǔ)言,GNU(GNU is Not Unix)下的編譯器和 Studio Visual 中的編譯器雖然完成一樣的功能,但是在一些細節處理如虛繼承、多重繼承等中也會(huì )存在著(zhù)差異。而 Java 語(yǔ)言則是實(shí)現一次編譯,多次運行的跨平臺移植。它先將 Java 源代碼先編譯成字節碼,之后再由 Java 的虛擬機 JVM(Java Virtual Machine)對其解釋執行。只要安裝不同操作系統下的 JVM 工具,便可以在不同平臺上運行了。即使各語(yǔ)言間存在著(zhù)巨大的語(yǔ)法差異,以及同一門(mén)語(yǔ)言中的不同編譯器也有著(zhù)設計上的不同。但它們的本質(zhì)功能都是為了把程序翻譯成在運行性能盡可能好的二進(jìn)制文件。

  雖然編譯器的功能本質(zhì)上就是翻譯,但編譯器的內部工作流程以及開(kāi)發(fā)卻是相當復雜的工程,它涉及到高級語(yǔ)言中語(yǔ)法特性,大量的底層硬件信息和對于生成的代碼的優(yōu)化工作。如果整個(gè)流程都親自完成,那么對于開(kāi)發(fā)功能簡(jiǎn)單和時(shí)間緊的項目來(lái)講卻是性?xún)r(jià)比比較低的工作。在這樣的背景下便出現了輔助編譯器開(kāi)發(fā)的工具模塊。這些工具把編譯器開(kāi)發(fā)中的一些重復性、通用性的工作進(jìn)行封裝和模塊化,開(kāi)發(fā)人員在開(kāi)發(fā)時(shí)只需要直接調用即可。開(kāi)發(fā)人員只需要關(guān)注高級語(yǔ)言和后端目標機中的獨特特性即可,只有針對這些特性才需要作相應的開(kāi)發(fā)工作。本文項目中要用到的 LLVM 工具便是這樣的一個(gè)輔助工具。它大大減少了編譯器開(kāi)發(fā)中的工作量和難度,同時(shí)利用了其本身自帶的優(yōu)化工具。為開(kāi)發(fā)人員節省了大量的時(shí)間和精力。

  本文要研究的就是這樣一個(gè)項目,采用 LLVM 工具開(kāi)發(fā)一個(gè)能夠將高級語(yǔ)言編譯成對應單片機匯編語(yǔ)言的交叉編譯器。這樣的一個(gè)研究項目能夠解決實(shí)際生產(chǎn)中的需求,同時(shí)對 LLVM 工具本身的設計結構和編譯器后端的具體實(shí)現流程也有一定的研究意義。

  1.2 國內外研究現狀

  1.2.1 編譯器概述

  編譯器作為連接高級語(yǔ)言和機器語(yǔ)言的工具,既要支持高級語(yǔ)言中各種高度抽象的特性,同時(shí)也要處理底層中煩瑣的硬件信息以及如何對生成的代碼進(jìn)行優(yōu)化[1].

  對于開(kāi)發(fā)人員來(lái)講,這無(wú)疑是個(gè)復雜費力的研究。而借用于已有的開(kāi)源工具鏈,在其基礎上進(jìn)行修改便成為了一種便捷可靠的開(kāi)發(fā)方法。GCC(GNU CompilerCollection)作為前端支持多種高級語(yǔ)言,后端支持多種目標平臺的編譯系統,對于后端的移植開(kāi)發(fā)來(lái)講是一個(gè)合適的輔助開(kāi)發(fā)工具。李杰[2](2004)探討了在 GCC 下的移植工作。孟昭天[3](2010)利用 GCC 的目標可重定位特性,探索了 GCC 系統下的移植方法,生成了適用于 ARCA3 的編譯器。張梅娟、張榮[4](2018)基于 GCC 的編譯工具開(kāi)發(fā)。GNU 下的 GCC 工具有多年的發(fā)展歷程和豐富的工具鏈,這些優(yōu)勢本應成為輔助編譯器開(kāi)發(fā)的一個(gè)最佳的選擇。只是由于 GCC 工具設計之初的目的并不在于復用性和易修改性,對于其內部的一些功能也沒(méi)有提供太多的調用接口。加上多年的發(fā)展,GCC 代碼的閱讀和修改已經(jīng)是一個(gè)異常困難的任務(wù)了。這種困難性主要體現在GCC 的中間代碼 RTL(Register Transfer Language)、錯誤信息的提示以及對于信息接口的設計上[5](2004)。因此在關(guān)于輔助編譯器開(kāi)發(fā)中需要一個(gè)新的框架來(lái)支持。

  基于這種需求,2000 年 illinois 大學(xué)開(kāi)始了 LLVM 項目[6].Chris Lattner 和Vikram Adved 在早年發(fā)表的論文[7](2003)[8](2004)中設計了一個(gè)編譯框架支持編譯器的開(kāi)發(fā)工作。在文中討論了對于 LLVM 整體結構的設計,并闡明其目的是封裝相應的功能模塊然后通過(guò)提供接口來(lái)簡(jiǎn)化對編譯器的開(kāi)發(fā)工作,盡可能讓更多的編譯器工作自動(dòng)化生成。隨著(zhù)蘋(píng)果公司加入該項目,該項目更是獲得了長(cháng)足的發(fā)展和商用化[9].現在 LLVM 擁有資料詳盡的文檔介紹和一個(gè)良好的社區環(huán)境,還有一年兩次的開(kāi)發(fā)者大會(huì )[10](2018),對于開(kāi)發(fā)問(wèn)題的探討和相關(guān)論文的分享。對于 LLVM 的介紹,Chris Lattner[11](2002)[12](2008)[13](2018)還提供了一個(gè)文檔以幫助開(kāi)發(fā)人員進(jìn)行理解。

  1.2.2 國內研究現狀

  國內較早關(guān)注 LLVM 工具的研究者董峰[14](2007)。在 2007 年就詳細闡述和分析了LLVM 架構的基本結構,其組成部分中的各項具體功能和 LLVM 的后端移植機制。并且對 ARM 的基本特性也作了詳細的介紹,之后實(shí)現了對 ARM 后端移植的支持。對于特定的芯片的移植,趙曄[15](2015)利用 LLVM 編譯工具和 PowerPC970 處理器設計了一款交叉編譯器。它是把高級語(yǔ)言翻譯成了 PowerPC970 目標機器的匯編代碼。而任艷珍[16](2017)則以國產(chǎn)自主研發(fā)的 STX 專(zhuān)用處理器作為目標芯片,實(shí)現了對于這款芯片的移植。而這款芯片主要是用于嵌入式的處理中。胡敏[17](2014)成功實(shí)現了 C-SKY自主知識產(chǎn)權的高性能嵌入式 CPU 在 LLVM 系統上的移植。張祖羽[18](2012)的 C*Core嵌入式處理器架構移植及盧念[19]對于 NiosII 后端的移植。后端機器的移植基本上完成了所有的后端流程,是深深的立足于 LLVM 工具本身的研究。

  LLVM 的優(yōu)越性之一是內部良好的結構設計和優(yōu)化機制,而這種友好性除了在工具內部使用外,同時(shí)也可以通過(guò)接口被開(kāi)發(fā)人員所調用。所以 LLVM 另外一個(gè)常用的地方是利用其內部的功能來(lái)完成某些特定的功能。如使用 LLVM 內部的 DAG 圖信息,陳星昊[20](2018)利用 LLVM 內部的程序代碼依賴(lài)圖和程序依賴(lài)圖在克隆代碼檢測中具有分析全面和精確度高的特點(diǎn)。提出了一個(gè)利用 LLVM 工具的克隆代碼檢測的技術(shù)。

  在 LLVM 優(yōu)化機制的使用上。安龍飛[21](2015)利用 LLVM 編譯器的內部架構實(shí)現對函數內聯(lián)模型進(jìn)行改進(jìn)。通過(guò)該技術(shù)他遍歷程序的效率平均提高了 1.52%.裴根[22](2013)則對異構編譯的優(yōu)化進(jìn)行研究。用于在異構計算機系統中開(kāi)發(fā)可移植的并行應用程序。李昊[23](2017)用 LLVM 實(shí)現軟件代碼的靜態(tài)檢測,以降低軟件測試所 需花費成本,提高整體開(kāi)發(fā)的效率。在靜態(tài)程序的處理上,還有陳云瀟[24](2018)、徐晨晨[25](2017)等也做了相關(guān)的研究。利用 LLVM 工具的中間代碼 IR 設計,趙天宇[26](2016)把 IR 轉換成腳本語(yǔ)言,從而實(shí)現了從一種高級語(yǔ)言到另一種高級語(yǔ)言的轉換。王時(shí)雨[27](2018)把 LLVM 工具應用于圖像處理,提高處理速度。Clang 工具是 LLVM 的前端組成部分,這一工具也提供了眾多接口。張代遠[28](2015)、李樹(shù)芳[29](2017)用 Clang 提供的工具完成了對 C 語(yǔ)言的分析處理。

  1.2.2 國外研究現狀

  國外對于 LLVM 工具的研究也主要分布于后端目標機的移植和工具的內部模塊及優(yōu)化機制。Bruno Cardoso Lopes 和 Rafael Auler[30]撰寫(xiě)的著(zhù)作對于 LLVM 工具的整體結構和各個(gè)接口作了詳盡的描述。這是目前了解 LLVM 的一個(gè)權威書(shū)籍。目前關(guān)于LLVM領(lǐng)域內的另一本書(shū)籍為Mayur Pandey[31]所著(zhù)。Juneyoung Lee和Yoonseung Kim[32]

  (2017)研究了中間代碼 IR 的未定義行為。未定義行為不一定代表不安全的程序,但可能有對一些語(yǔ)法的處理的缺陷。通過(guò)處理這些未定義的行為可以對程序代碼作更進(jìn)一步的優(yōu)化。Juneyoung Lee 和 Chung-Kil Hur[33](2018)探究了內存模型,實(shí)現對 LLVM 內部的優(yōu)化和底層代碼進(jìn)行進(jìn)一步處理。在利用 LLVM 進(jìn)行后端移植的研究中,Connor Goldberg[34](2017)完成了對于自定義的 32 位精簡(jiǎn)指令集 CPU 的移植。Chen Chung-Shu 和 Anoushe Jamshid[35]用自定義的 Cpu0 芯片,詳細描述了如何在 LLVM 工具進(jìn)行移植的方法。這是一個(gè)詳盡的教程,對于 LLVM 后端的移植具有很強的指導意義。對編譯器的研究可以知道,大量的窺孔優(yōu)化存在于編譯器之中,但這其中的一些優(yōu)化可能會(huì )成為Bug的來(lái)源。David Menendez和Santosh Nagarakatte[36]

  (2016)探討了利用自動(dòng)檢測技術(shù)驗證窺孔優(yōu)化技術(shù)的正確性。以及對于浮點(diǎn)數的檢測處理[37].同時(shí)也有 Alex Denisov 和 Stanislav Pankevich[38](2018)對工作在IR 代碼上的異常檢測研究。Yi-Hong Lyu 和 Ding-Yong Hong[39](2014)利用 LLVM 后端開(kāi)發(fā)了一個(gè)動(dòng)態(tài)二進(jìn)制庫來(lái)作為程序執行時(shí)調試工具的核心組成部分。

  LLVM 工具的功能非常多,從各種研究中也可以看到在應用上有各種各樣的使用和嘗試。而國內外的研究更多地聚焦于后端移植和內部?jì)?yōu)化。通過(guò)這些研究,對 LLVM工具的框架結構和內部機制有了更深入和全面的了解。

  1.3 本文的研究?jì)热?/strong>

  本文的主要研究目的是如何在 LLVM 工具內部定義一個(gè)單片機的芯片。因此研究該款 SIC 單片機芯片結構、了解 LLVM 框架的設計結構和學(xué)習如何把 SIC 單片機定義在 LLVM 工具中將成為本文的主要研究?jì)热荨?/p>

  (1)SIC 單片機結構的研究SIC 單片機是基于 PIC 單片機而改進(jìn)的。在改進(jìn)的過(guò)程,針對特定的功能和需求進(jìn)行了相應的精簡(jiǎn)。為了更好的在 LLVM 工具下進(jìn)行移植,便需要先從整體的角度來(lái)了解 SIC 單片機。這包括 SIC 的指令結構、內存布局、中斷函數、堆棧結構等重要組成部分,這其中有些信息將會(huì )在 LLVM 工具中直接用到的,而其中的一些則可能會(huì )需要特別處理。如 SIC 單片機中所有的指令都需要用到一個(gè)工作寄存器,這樣的設計跟一般的計算機指令有很大的不同,在編譯過(guò)程中怎樣處理將是一個(gè)需要考慮的問(wèn)題。所以首要的工作便是要充分了解這些信息,了解單片機內部的運行和組成結構。因為在 LLVM 后端移植中用的最多的是它的內存布局和指令集等信息,所以對于單片機結構的研究也將更集中于這些方面。

  (2)LLVM 架構分析對 LLVM 工具的框架研究則是另一個(gè)主要的內容。隨著(zhù)多年的發(fā)展,LLVM 工具和整個(gè)框架體系不斷豐富擴大,由最初的底層虛擬機演變成了構架編譯器的框架系統。

  現在的 LLVM 工具能夠在眾多領(lǐng)域中發(fā)揮作用,并都有著(zhù)不錯的表現。LLVM 工具的更新迭代比較快,本文結合在項目中的研究工作,將采用 LLVM3.9 版本作為研究對象。

  將重點(diǎn)關(guān)注 LLVM 的整體框架和基本工作流程;同時(shí)學(xué)習單片機這種內存較為簡(jiǎn)單,但與一般的計算機系統結構有較大差異的芯片結構在 LLVM 工具中如何定義和實(shí)現的方法。通過(guò) LLVM 架構的分析使得對其有一個(gè)深入的了解和掌握,這樣可以更大限度的挖掘其能力。現在興起的人工智能熱中,有些企業(yè)在開(kāi)發(fā)能夠更快處理圖像的處理器,以及利用 LLVM 對數據庫引擎進(jìn)行優(yōu)化處理。這些處理器都需要定制相應的編譯器去支持,這些完全可以采 LLVM 工具來(lái)輔助開(kāi)發(fā)。同時(shí) LLVM 工具內部除了提供自帶的優(yōu)化機制外,還有相應的接口給開(kāi)發(fā)人去增添優(yōu)化處理功能。這對于需要更快性能的內核來(lái)講是一個(gè)極大的便利。因此可以預見(jiàn)到,LLVM 工具具有遠大的使用前景。本文希望可以借此為 LLVM 工具的廣泛應用貢獻一份綿薄之力。

  (3)SIC 編譯器的實(shí)現在 LLVM 內定義一個(gè)目標機后端將是本文重點(diǎn)研究的內容。在完成了對 SIC 單片機和 LLVM 框架的分析后,將會(huì )對 SIC 編譯器的操作和實(shí)現過(guò)程有了大概的了解。但由于SIC單片機與一般計算機系統上的差異,還將要重點(diǎn)要關(guān)注如何調整修改LLVM,使其能夠處理單片機下內存簡(jiǎn)單,指令精簡(jiǎn)的情況。雖然 LLVM 工具在內部有提供相應的接口使開(kāi)發(fā)人員能夠去修改,但在實(shí)操中才會(huì )發(fā)現所有的修改都是非常復雜的工程。所以在實(shí)現了對單片機芯片的定義后,將對這次項目的經(jīng)驗進(jìn)行歸納總結,甚至是添加一個(gè)新的接口,把對于這類(lèi)單片機的特定處理過(guò)程進(jìn)一步簡(jiǎn)化。從而可以為以后的深入探索提供幫助。

  1.4 本文的組織結構

  本文內容的組織結構主要分為以下幾個(gè)部分:

  第一章,緒論。介紹本文的研究背景和意義。探討了當前國內外學(xué)者對于 LLVM工具的研究現狀和應用示例,LLVM 官方對于 LLVM 未來(lái)發(fā)展的展望。以及對于把 LLVM工具移植到 SIC 芯片中的意義和 LLVM 工具的學(xué)習價(jià)值。

  第二章,SIC 結構研究。SIC 單片機是本文要進(jìn)行移植的目標機器,在這里探討了其內部特色的內存設計和二地址式指令集的組成。并與一般的計算機系統結構進(jìn)行對比,及分析這種差異會(huì )給編譯器的設計帶來(lái)什么影響。

  第三章,LLVM 框架分析。了解其自動(dòng)生成編譯器代碼的主要的工作原理和設計思想。理清LLVM工具的組成部分和后端編譯過(guò)程中各模塊和功能的組成,指令在LLVM各個(gè)階段中的演變和提供了哪些接口進(jìn)行定制化處理。

  第四章,SIC 編譯器實(shí)現。給出基于 LLVM 工具的 SIC 單片機后端移植的具體實(shí)現。介紹對寄存器、指令集、調用約定和匯編指令的處理。同時(shí)還有對于 SIC 芯片中的特殊性部分的處理方法。

  第五章,測試結果。介紹 LLVM 源碼的編譯和使用命令,并給出測試結果。

  第六章,總結與展望。對整個(gè)項目的工作進(jìn)行歸納總結,并展望在以后的工作中可以作進(jìn)一步研究的地方。

  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 編譯器實(shí)現

  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 本文工作總結

  開(kāi)發(fā)編譯器是一個(gè)復雜的工程,如果全部的內容都由開(kāi)發(fā)者自己完成。這無(wú)疑是一個(gè)巨大和艱巨的工作。為了解決這一問(wèn)題,產(chǎn)生了專(zhuān)門(mén)用來(lái)輔助開(kāi)發(fā)人員進(jìn)行編譯器開(kāi)發(fā)的工具。LLVM 便是這樣的一個(gè)集編譯、鏈接和調試為一體的編譯系統。本文項目利用 LLVM 工具輔助開(kāi)發(fā)了一個(gè) SIC 單片機的交叉編譯器,它將 C 語(yǔ)言編譯成SIC 單片機的匯編語(yǔ)言,提高生產(chǎn)工人的工作效率。

  (1)在項目的伊始階段是對 SIC 單片機內部的結構進(jìn)行了解和分析。SIC 單片機與一般的計算機系統一樣,具有 CPU、內存等結構以及匯編語(yǔ)言。但在具體細節上也存在著(zhù)一定的差異。如內存結構的組成上,SIC 單片機全部由寄存器完成,而不像計算機系統中有寄存器、緩存、主存及硬盤(pán)存儲等。而另一個(gè)較大的差異則是 SIC單片機的匯編指令格式為二地址式,采用一個(gè)默認的工作寄存器來(lái)充當其中的一個(gè)操作數。

  (2)LLVM 的整體結構分為前端、中間代碼和后端等部分。中間代碼是 LLVM 框架的基石,它由前端工具 Clang 生成,而用于后端的指令編譯。中間代碼采用了 SSA形式,便于支持高級語(yǔ)言的語(yǔ)法和對其進(jìn)行優(yōu)化。前端主要完成了詞法分析、語(yǔ)法分析、語(yǔ)義分析等編譯器的基本操作,這一部分在 LLVM 中定義 SIC 單片機時(shí)直接沿襲,未作修改。后端部分是在 LLVM 中定義一個(gè)新目標機器時(shí)的重要部分,其內部由眾多階段組成。每一個(gè)階段基本上代表著(zhù)一個(gè)功能模塊,主要的功能有寄存器描述、指令集描述、指令的合法化和指令選擇等。

  (3)對于后端的各個(gè)功能模塊,LLVM 提供了相應的接口給開(kāi)發(fā)人員進(jìn)行功能的完成。本文中主要是解決了 LLVM 中 TD 語(yǔ)言對于 SIC 單片機寄存器和指令集的描述;同時(shí)還在 C++代碼里面解決 LLVM 的中間代碼 IR 不被 SIC 匯編指令支持的問(wèn)題;接著(zhù)解決了指令的輸出和格式化問(wèn)題。最后是對所作的工作進(jìn)行了測試和驗證。

  6.2 工作展望

  本次在 LLVM 工具中定義一個(gè)目標機的過(guò)程中,對于其整個(gè)框架結構和功能實(shí)現都有了較為深入的學(xué)習與了解。雖然在項目研究中只用到了 LLVM 工具的一部分功能,但已經(jīng)充分認識到該工具的強大性和應用范圍的廣泛性。展望今后的學(xué)習,如果有幸繼續耕耘于此領(lǐng)域,那么將會(huì )更多的關(guān)注 LLVM 工具內部自帶的優(yōu)化工具及添加自定義的優(yōu)化程序。因為在 LLVM 工具的后端部分,針對每次生成的指令代碼都會(huì )做一次優(yōu)化遍歷。這種處處優(yōu)化的精神無(wú)疑有著(zhù)其內部良好結構設計的支持,同時(shí)這對開(kāi)發(fā)一個(gè)追求運行速度的編譯器來(lái)講具有很大的吸引力,因此值得在這方面繼續深入探究。

致謝

  春盡夏立,柳絮飄盡,梧桐花散。在本是初夏燥熱時(shí)節,灰鉛色的天空卻像極了暮秋之感。在此情此景下,此時(shí)此刻的我坐在圖書(shū)館里,追憶往昔。

  回首過(guò)去兩年研究生生活,那些個(gè)片段如走馬燈般呈現,內容若隱若現。人們常說(shuō)不念過(guò)往,但不念過(guò)往又哪來(lái)的對生活的蛛絲馬跡。過(guò)去的種種筑壘起了如今的一切,無(wú)論是喜或憂(yōu),都深深的嵌在了腳下。現在在這樣的一個(gè)時(shí)節中,于我,則寄望可以帶著(zhù)過(guò)去奔赴將來(lái),去走進(jìn)下一段旅程。

  在兩年的學(xué)習中,感謝徐麗萍老師在學(xué)習和項目工作中的幫助,使得我可以完成研究生階段的各項任務(wù)。感謝兩位同窗,鄭展和王芳同學(xué),兩年的學(xué)習,我們從最開(kāi)始的研究生復試開(kāi)始認識,一起完成研究生的學(xué)習。感謝學(xué)弟?chē)乐强担覀円黄疬M(jìn)入項目,在開(kāi)發(fā)過(guò)程中他提供了很多的幫助。實(shí)驗室里的謝云菲、王凱和李碩琳,大家一起歡聚的時(shí)光為單調的學(xué)習日子增添了不一樣的色彩。向大家伙兒致謝!同時(shí)對于花費時(shí)間和精力來(lái)參與論文答辯的老師表示感謝!

  參考文獻

  [1] 張素琴,呂映芝。編譯原理。版本(第 2 版)。北京:清華大學(xué)出版社,2005.

  [2] 李杰。GCC 編譯系統結構分析與后端移植實(shí)踐:[碩士學(xué)位論文].杭州:浙江大學(xué)圖書(shū)館,2004.

  [3] 孟昭天。基于 GCC 的 ARCA3 的編譯器移植:[碩士學(xué)位論文].哈爾濱:哈爾濱工業(yè)大學(xué)圖書(shū)館,2010.

  [4] 張梅娟,張榮。基于 GCC 的 cmdsp2f01 編譯工具移植開(kāi)發(fā)。電子與封裝,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 編譯系統結構分析與后端移植:[碩士學(xué)位論文].上海:上海交通大學(xué)圖書(shū)館,2007.

  [15] 趙曄。基于 LLVM 的交叉編譯器的設計與實(shí)現:[碩士學(xué)位論文].西安:西安電子科技大學(xué)圖書(shū)館,2015.

  [16] 任艷珍。基于 LLVM 的專(zhuān)用 CPU 后端移植分析與設計:[碩士學(xué)位論文].成都:成都理工大學(xué)圖書(shū)館,2017.

  [17] 胡敏。基于 LLVM 編譯架構的 CSKY 后端移植:[碩士學(xué)位論文].杭州:浙江大學(xué)圖書(shū)館,2014.

  [18] 張祖羽。基于 LLVM 的 C_Core 后端移植研究:[碩士學(xué)位論文].哈爾濱:哈爾濱工程大學(xué)圖書(shū)館,2012.

  [19] 盧念。基于 LLVM 的 NiosⅡ處理器后端快速移植及優(yōu)化:[碩士學(xué)位論文].長(cháng)沙:中南大學(xué)圖書(shū)館,2011.

  [20] 陳星昊。基于 LLVM 克隆代碼檢測關(guān)鍵技術(shù)研究:[碩士學(xué)位論文].南京:南京郵電大學(xué)圖書(shū)館,2018.

  [21] 安龍飛。基于 LLVM 的函數內聯(lián)優(yōu)化技術(shù)研究:[碩士學(xué)位論文].哈爾濱:哈爾濱工程大學(xué)圖書(shū)館,2015.

  [22] 裴根。基于 LLVM 的異構編譯優(yōu)化方法研究:[碩士學(xué)位論文].重慶:重慶交通大學(xué)圖書(shū)館,2013.

  [23] 李昊。基于 LLVM_Clang 的軟件靜態(tài)檢測工具研究與實(shí)現:[碩士學(xué)位論文].西安:西安理工大學(xué)圖書(shū)館,2017.

  [24] 陳云瀟。基于 LLVM 的靜態(tài)程序有界模型檢測:[碩士學(xué)位論文].福州:華僑大學(xué)圖書(shū)館,2018.

  [25] 徐晨晨。基于 LLVM 的靜態(tài)程序切片方法研究:[碩士學(xué)位論文].南京:南京郵電大學(xué)圖書(shū)館,2017.

  [26] 趙天宇。基于 LLVM 的腳本語(yǔ)言后端工具設計與實(shí)現:[碩士學(xué)位論文].長(cháng)春:吉林大學(xué)圖書(shū)館,2016.

  [27] 王時(shí)雨。基于 LLVM 架構的圖像處理程序的并行分類(lèi)。 微電子學(xué)與計算機,2018,35(1):66~71.

  [28] 張代遠。基于Clang的C語(yǔ)言代碼并行化轉換工具的設計與實(shí)現:[碩士學(xué)位論文].長(cháng)春:吉林大學(xué)圖書(shū)館,2015.

  [29] 李樹(shù)芳。采用 Clang_LLVM 的 C_源代碼覆蓋率分析插裝方法。 計算機科學(xué),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.

(如您需要查看本篇畢業(yè)設計全文,請您聯(lián)系客服索取)

相關(guān)內容
相關(guān)標簽:單片機畢業(yè)設計
好優(yōu)論文定制中心主要為您提供代做畢業(yè)設計及各專(zhuān)業(yè)畢業(yè)論文寫(xiě)作輔導服務(wù)。 網(wǎng)站地圖
所有論文、資料均源于網(wǎng)上的共享資源以及一些期刊雜志,所有論文僅免費供網(wǎng)友間相互學(xué)習交流之用,請特別注意勿做其他非法用途。
如有侵犯您的版權或其他有損您利益的行為,請聯(lián)系指出,論文定制中心會(huì )立即進(jìn)行改正或刪除有關(guān)內容!