(计算机软件与理论专业论文)基于gcc的dsp芯片编译器的研究与开发.pdf_第1页
(计算机软件与理论专业论文)基于gcc的dsp芯片编译器的研究与开发.pdf_第2页
(计算机软件与理论专业论文)基于gcc的dsp芯片编译器的研究与开发.pdf_第3页
(计算机软件与理论专业论文)基于gcc的dsp芯片编译器的研究与开发.pdf_第4页
(计算机软件与理论专业论文)基于gcc的dsp芯片编译器的研究与开发.pdf_第5页
已阅读5页,还剩57页未读 继续免费阅读

(计算机软件与理论专业论文)基于gcc的dsp芯片编译器的研究与开发.pdf.pdf 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

重庆邮电大学硕士论文摘要 摘要 随着新型嵌入式芯片层出不穷,相应的高级语言编译器是必不可少 的。然而,编译器的复杂性决定了不可能在短时间内重新为一款新型芯片 开发出高级语言编译器。因此,不断出现的新型芯片与新型芯片编译器的 需求产生了尖锐的矛盾。 采用开源编译器来实现特定编译器是一个可行的方法,它满足丌发时 限的要求,并且具有普遍适用性。通过比较各种编译器项目的优缺点和研 究大量的新型芯片的体系结构,最后选用g c c 和z s p 4 0 0d s p 芯片,作为 源编译器和目标机器。g c c 是目前嵌入式领域应用最为广泛的编译器,软 件质量已经在工业界被反复验证过,并且文档齐全,便于丌展工作:g c c 使用r t l 语言进行与目标机无关的代码优化,可以在新后端中直接使用; 虽然g c c 已经被移植到了许多经典的体系结构上,但对于芯片类型更新 较快的d s p 领域,移植g c c 的方案还没有被广泛应用:而z s p 4 0 0d s p 芯片是业界性能较高的一款d s p 芯片,在移动通信领域有广泛的应用;同 时,z s p 4 0 0 芯片的体系结构体现了芯片的普遍结构,具有可推广性;另 外,在g c c 中还没有实现z s p 4 0 0 芯片的后端,这对l i n u x 操作系统环境 下的开发是不利的。因此,实现基于g c c 的z s p 4 0 0 编译器,对于学术研 究和工业应用都有比较深远的意义。 论文中实现了基于g c c 的z s p 4 0 0 编译器和一个z s p 4 0 0 汇编语言模 拟器。由z s p 4 0 0 编译器生成的z s p 4 0 0 汇编文件,可以在z s p 4 0 0 模拟器 中进行解释执行。在实现z s p 4 0 0 芯片编译器的过程中,采用了增量编程 的方法。首先为后续开发搭建了一个运行环境,将z s p 4 0 0 的体系结构用 g c c 可以接受的方式进行描述;在此基础上,分别实现c 语言中的各种基 本结构,并进行单元测试;最后在z s p 4 0 0 模拟器上进行系统测试。从而 实现了基于g c c 的z s p 4 0 0d s p 芯片编译器。 关键词:g c c ,r t l 语言,代码生成,后端移植,代码优化 重庆邮电大学硕士论文摘要 a b s t r a c t n o w , m a n yn e wk i n d so fe m b e d d e dc h i p sh a v eb e e nd e v e l o p e d s oh i g h l e v e lp r o g r a ml a n g u a g ec o m p i l e ri sn e c c e s s a r y b u tc o m p i l e ri ss oc o m p l i c a t e t h a ti m p l e m e n t i n gac o m p i l e rf o ran e wk i n d o fc h i pf r o ms c r a t c hi ns h o r tt i m e i si m p o s s i b l e ,s on e wk i n do fc h i p si sc o n f l i c tw i t ht h er e q u i r e m e n to fn e w c o m p i l e r o p e ns o u r c ec o m p i l e rc a nb eu s e dt oa c h e i v et h i sp u r p o s e ,i tc a ns a t i s f y t h et i m er e q u i r e m e n ta n dc a nb eu s e dg e n e r a l l y t h r o u g hc o m p a r i n gs o m e k i n d so fc o m p i l e rp r o j c o t s ,a n ds t u d yal o to fc h i pa r c h i t e c t u r e s ,g c ca n d z s p 4 0 0d s pc h i pi sag o o dc h o i c e g c ch a v eb e e np o r t e dt om a n gk i n d so f c l a s s i c a la r c h i t e c t u r e s ,f o re x a m p l e :x 8 6 ,m i p s ,e t c b u ti nd s pa r e a ,t h i sp l a n i s n tu s e dv e r yo f t e n g c ci sav e r yc o m m o nc o m p i l e ru s e di ne m b e d d e d s o f t w a r ed e v e l o p i n g ,i t sq u a l i t yh a sb e e nv e r i f i e dm a n yt i m e s ,a n dc o m p l e t e l y d o c u m e n t sa r eg o o df o rd e v e l o p i n gw o r k g c cc a no p t i m i z et h ec o d et h r o u g h m a c h i n e - i n d e p e n d e n tm e t h o d ,s on e wc o m p i l e r n e e dn o tt oi m p l e m e n ti t ; z s p 4 0 0i sah i g hp e r f o r m a n c ed s pc h i p ,i th a sb e e nw i d e l yu s e di nm o b i l e c o m m u n i c a t i o na r e a ;i th a sac o m m o na r c h i t e c t u r ew h i c ha p p e a r e di ns o m e o t h e rd s pc h i p s ;a n da l s o ,n o wg c cc a n ts u p p o r tt h eb a c k e n do fz s p 4 0 0 ,s o t h i si sn o tv e r yg o o df o rd e v e l o p m e n tu n d e rl i n u x b a c k e n dp o r t i n gt o z s p 4 0 0h a sp r o f o u n dm e a n i n gt or e s e a r c hp u r p o s ea n di n d u s t r ya p p l i c a t i o n i nt h i sp a p e r ,z s p 4 0 0b a c k e n da n dz s p 4 0 0e m u l a t o rw e r ed e v e l o p e d z s p 4 0 0a s s e m b l yl a n g u a g ef i l ec a nb ee x e c u t e di nz s p 4 0 0e m u l a t o r w h e n d e v e l o p i n gt h ez s p 4 0 0b a c k e n d ,i n c r e a s i n gp r o g r a m m i n gm e t h o dh a sb e e n a d o p t e d f i r s t l y ,a ne x e c u t i n ge n v i r o n m e n ti sb u i l tf o rp o s td e v e l o p i n g ,w h i c h d e s c r i b st h ez s p 4 0 0a r c h i t e c t u r ei ng c c t h e nt h ef u n d a m e n t a ls t r u c t u r eo fc p r o g r a m m i n gl a n g u a g e c a nb e i m p l e m e n t e d ,a n d u n i tt e s tc a nt e s tt h e c o r r e c t i o n f i n a l l y , t h ee m u l a t o rc a nb e u s e dt o t e s tw h o l ec o m p i l e r i n e m u l a t o r ,b o t hs i n g l es t r u c t u r ea n dm i x e ds t r u c t u r e c a nb ev e r i f i e d u s i n g t h e s em e t h o d s ,z s p 4 0 0b a c k - e n df o rg c cc a nb ei m p l e m e n t e d k e y w o r d :g c c ,r t ll a n g u a g e ,c o d eg e n e r a t i o n ,b a c k e n dp o r t i n g ,c o d e o p i t i m i z a t i o n n 独创性声明 本人声明所呈交的学位论文是本人在导师指导下进行的研究工作及 取得的研究成果。据我所知,除了文中特别加以标注和致谢的地方外,论 文中不包含其他人已经发表或撰写过的研究成果,也不包含为获得重医 整曳塞堂 或其他教育机构的学位或证书而使用过的材料。与我一同工作 的同志对本研究所做的任何贡献均己在论文中作了明确的说明并表示谢 意。 学位论文作者签名:降堵签字日期:刍呷年多胃尹日 学位论文版权使用授权书 本学位论文作者完全了解重医邮电盔堂有关保留、使用学位论 文的规定,有权保留并向国家有关部门或机构送交论文的复印件和磁盘, 允许论文被查阅和借阅。本人授权重医邮电太生可以将学位论文的 全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等 复制手段保存、汇编学位论文。 ( 保密的学位论文在解密后适用本授权书) 学位论文作者签名:胁硌 导师签名 签字吼岬年月j 7 日签字嗍岬年月7 甲 重庆邮电大学硕士论文第一章引言 1 1 研究背景 第一章引言 随着新型嵌入式芯片层出不穷,需要高级语言编译器的支持。然而, 编译器的复杂性决定了,不可能在短时间内重新为一款新型芯片开发出高 级语言编译器。这样就在不断出现的新型芯片和新型芯片编译器的需求之 间产生了尖锐的矛盾。 要迅速为新型芯片开发编译器,只有从已经存在的编译器入手。现有 编译器主要分为商用编译器和开源编译器两大类。由于商业机密,要在商 用编译器上进行二次开发来支持新型芯片基本是不可能的,所以只有从开 源编译器项目中迸行选择。 文中采用了z s p 4 0 0d s p 芯片作为后端移植的目标机器,选择z s p 4 0 0 d s p 芯片的原因是: 大多数的d s p 芯片都具有和z s p 4 0 0d s p 芯片类似的体系结构。因 此,实现针对z s p 4 0 0 芯片的移植,对其它体系结构的移植具有借鉴作用。 还没有任何的开源编译器支持z s p 4 0 0d s p 芯片。因此,实现对一 种新型体系结构的编译器支持,也具有很大的现实意义。 以下主要介绍业界比较有名的开源编译器项目,以及选择开源编译器 的方法。 1 2 编译器项目介绍 1 2 1 开源编译器的优点和选择标准 优点 自由软件因为其开放源代码的特点,以及所遵循的开放软件协议,与 商业软件相比有以下几个优点: 1 ) 研究者能够不受限制的发布他们的研究成果。 2 ) 任何人都可以发布和使用软件补丁,这也促进了相应研究的开展。 3 ) 项目可以在以前的研究基础上展开,而不必从头开始。而在编译器 领域,新的优化算法可以马上在已存在的编译器中检验。这一点特别有用。 重庆邮电大学硕士论文第一章引言 选择标准 在选择一个编译器项目时,要尽量考虑采用遵循f s f 协议1 1 】的免费开 源项目,这是因为f s f 协议对自由软件的权责有明确定义,并且还要注意 以下衡量开源编译器的指标: 1 ) 已经支持的目标机器的数目:如果一个编译器能够支持的处理器类 型越多,将目标机器的体系结构高效地映射到编译器上可能就越容易。 2 ) 已经支持的输入语言的数目:新型编译器后端可以直接被此编译器 所接受的语言种类。支持的语言越多,编译器就可能越有用。 3 ) 容易移植到宿主机上:如果支持的宿主机越多,则其移植性越好。 在这里宿主机就是就是交叉编译器的运行机器。 1 2 2 开源编译器项目 通过调查研究,目前流行的开放源代码编译器项目主要有以下几种: 6 c c 是g n uc o m p i l e rc o l l e c t i o n 的简称口l ,其目标是在自由软件 协议下,为尽量多的高级语言、优化算法和目标机器提供支持。此外,g c c 项目也宣称它是与平台无关的编译器项目,可以在许多宿主机上运行。 在编译过程中,g c c 进行一系列的优化遍,可以生成十分高效的代码。 但是,g c c 在生成优化代码时,需要考虑大量的特例,这就要求大量的予 程序来进行处理。所以g c c 的代码量很大,维护性较差。 l c c l 习是一个专注于可变目标的编译器项目。它的作者采用了一些 技巧来保持编译器的简洁,因此编译速度要比g c c 快得多,但是优化效 率不高,不利于工业化。l c c 的前端完全由手工写成,因此可移植性较差。 s u i f 并行优化编译器1 4 是一个专注于代码优化和并行化的编译器 项目。国际上对其进行了深入雨广泛的研究,加入了大量的优化功能,因 此它看上去更适合用来进行优化编译器的研究工作。文档也是s u i f 的优 点之一,它的官方网站上有大量的研究论文可供参考,但后端移植的文档 很少。 o p e n i m p a c t 编译器1 5 是另一个专注于代码优化的编译器项目,它 的目的也是用于进行编译器研究。编译器研究人员可以在此项目上实验新 的优化算法。而不必重薪开始。它的文档也很齐全,可以在i m p a c t 的官 方网站查阅。 通过调研,以上几种开源编译器目前都不支持z s p 4 0 0d s p 芯片。 重庆邮电大学硕士论文第一章引言 1 2 3 最终选择 按照前面提到的选择标准,并且对目前流行的开源编译器进行分析、 比较论文中最终采用了g c c 来进行z s p 4 0 0 的后端移植。这是因为g c c 中实现了许多与目标机器无关的优化算法,可以被新的目标机器直接使 用;g c c 在嵌入式领域被广泛使用,并支持大量目标机的编译器;此外, g c c 提供了非常全面的文档可供后端移植者参考,这是其它的开源编译器 无法比拟的优势。因此,采用g c c 来进行z s p 4 0 0 的后端移植。无疑具有 最好的前景。 以下对基于g c c 的z s p 4 0 0 编译器的设计思路进行简要介绍。 1 2 4 设计思路 本节将g c c 和目标机器z s p 4 0 0 相结合,介绍了g c c 工具链、g c c 中的一些重要概念及g c c 的编译过程。说明了g c c 的原理,并且提出 z s p 4 0 0 编译器的设计思路和开发目标。目的是从整体上描述论文的研究 内容,也可以加深对后面的z s p 4 0 0 实际移植过程的理解。 g c c 工具链 g c c 由多个程序组成,在编译时,会被顺序执行,因此被称为工具链。 工具链是由编译器驱动程序进行控制的。g c c 工具链结构如图1 1 所示。开 c 源代码 i 预处坪 预处理的c 源代 i 士c 语言绢 汇编代码 i 汇编 二进制目标代码 l 镂接器1 可执行文件 器 图1 ig c c j 二具链 始,g c c 将所有的c 源文件交给c e l 程序进行处理,c c l 程序会预处理每个 源代码文件,展开它所遇到的宏。生成的结果又传递到由语法分析器,识 别c 语言的所有元素,并且根据语法规则将符号归约为非终结符。当语法 重庆邮电大学硕士论文第一章引言 分析器将目标函数归约以后,就会调用相应的函数来完成目标函数的编 译,从而产生此函数对应的汇编代码。然后,语法分析器又去处理同一文 件中的其它函数。当一个源代码文件处理完毕以后,控制权又返回到g c c 中,它将产生的汇编代码交给g a s ,进行后续处理。 g a s 将输入的汇编语句转换成可以在z s p 4 0 0 芯片上运行的,可重定位 的二进制目标代码。g a s 采用二进制格式描述符库b f d ( b i n a r yf o r m a td e s c r i p t o r 卅) 来输出可重定位的二进制目标格式。 当所有这些工作完成以后,g n u 链接器l d 将从各个c 代码文件产生的 目标文件组合到一起,生成可执行文件。 了解了工具链的结构以后,可以知道要将g c c 后端移植到z s p 4 0 0 芯 片,最重要的步骤是: 1 ) 在c o l 中增加对z s p 4 0 0 芯片的支持; 2 ) 在g a s 中增加对z s p 4 0 0 芯片的支持; 3 1 在b f d 库中增加所需要的二进制目标文件格式。 而论文的主要工作是在c o l 中实现对z s p 4 0 0 芯片的支持。 g c c 的重要概念 下面介绍在后面具体的移植过程中会经常用到的几个概念。 1 ) c c l 程序:g c c 中的c c l 程序是g c c 编译器的核心,它会将高级语言 写成的源代码转换成汇编代码,并且在转换的过程中,进行了所有与目标 机器无关的代码优化。 2 ) e p 间代码一一i 汀l :当转换一个c 代码模组时,g c c 不能直接生成相 应的汇编代码,而是先要将其转换成一种由中问语言表示的代码,这种语 言就是r t l ( r e g i s t e rt r a n s f e rl a n g u a g e l 7 1 ) 。 3 ) 寄存器分配:为了充分发挥目标机器的性能,而为c 语言变量分配 寄存器的过程。 4 ) 伪寄存器和实寄存器:如果将中自j 代码生成和寄存器分配作为一个 整体,将会使系统极为复杂。因此,g c c 中引入了伪寄存器。伪寄存器是 一个接口,它能在两个独立遍中完成寄存器分配。首先代码生成遍会分配 无穷多个伪寄存器并且产生相应的r t l 代码。然后,在生成汇编代码之前, 它们会被映射到真正的c p u 寄存器上。c p u 的寄存器就是实寄存器,映射 寄存器由寄存器分配器完成。 5 1 虚拟寄存器和寄存器实例化:伪寄存器包含虚拟寄存器,所有的虚 拟寄存器没有直接对应的实寄存器,但是当编译器收集到足够信息以后, 会将其替换为实寄存器,这个替换过程就被称为寄存器实例化。 重庆邮电大学硕士论文第一章引言 6 ) 基本块:一个基本块由一系列连续语句组成,基本块中,控制流从 基本块的第一条语句进入,从最后一条语句离开。在对r t l 代码进行处理 的算法中,基本块的概念会经常出现。 编译过程 将c 语言代码翻译成汇编代码的过程可以分为三个子过程:前端、中 端和后端。下面用一个实例来演示这个过程,考虑如下一段代码: v o i dm a i n ( ) i n ta = 1 ,b = 2 : a = a + b : r e t u r n ; , 在这里假设所有的优化策略均没有使用。下面就是运算和赋值操作a = a + b 被编译成汇编代码的过程。 1 ) 前端 首先,语法分析器将会为这条语句生成一个树形表示。由于语法分析 器只能识别词素( 在语法分析器中,它是一个符号值常量) ,因此它会调用 词法分析器将输入流划分为词素。每次调用词法分析器,词法分析器都会 返回一个词素值:a ,一,a ,+ ,b ,并且最后是;。 语法分析器将会根据c 语言的规约规则,利用词法分析器返回的词素 构建语法树。a = a + b 的语法树如图1 2 所示。每个方框都是一个类型为a n i o n 图1 2a f a + b 的语法树 t r e e n o d e 的数据结构,它能够用来描述一个c 语言的基本或者复合元素a 重庆邮电大学硕士论文第一章引言 结构体中的c o d e 域用来表示此节点所代表的c 语言元素类型。在图1 2 中的 方框中最上面的就是c o d e 域,在方框中的其它域还有:n a m e 和t y p e 域。 t y p e 域对于每种c 表达式类型都有效,它用来描述相应的c 语言变量类 型。n a m e 域会被应用于d e c l 节点,比如a 和b 变量节点,它用来表明 源代码中被声明的变量名。表达式节点中包含操作数,但同时也允许其操 作数是另一个表达式。如p l u se x p r 节点就是一个表达式操作数节点,它 有两个操作数,表示相加操作。 当一个c 函数的语法树构建完成以后,它就会被转换成r t l 语句。这 个过程被称为展开。因为这些结构化的树,最后会被转换成一个或多个线 性链表,这些线性链表接下来又会被转换成汇编语句。 r t l 表达式( r t x ) 与l i s p 语言表达式比较类似。它在g c c 中有两种形 式:内部表示和文本形式。这里看到的是文本形式,两内部表示采用了链 接树的形式。因为可以直接访问r t l 表达式内部表示的结构,所以r t l 表 达式的内部表示更有利于优化算法对其进行变换和处理。在g c c 中,几乎 所有的编译器遍都会对r t l 的内部表示进行处理。r t l 的主要优点是它的 抽象性,r t l 操作都与具体的汇编语句无关,因此也与目标平台无关,这 样就可以将优化策略应用于所有想要移植的平台。接下来简要介绍一下 r t l 语言。 考虑图1 2 中的语法树,它的文本形式的r t l 语法如下所示: ( s e t ( r e g :s i7 ) ( m e m :s i ) ) ( s e t ( r e g :s l8 ) ( m e m :s i ) ) ( s e t ( r e g :s i7 ) ( p l u s :s i ( r e g :s i7 ) ( r e g :s i8 ) ) ) ( s e t ( m e m :s l ) ( r e g :s i7 ) ) 第一条语句是一个s e t 操作,它表示将第二操作数的值赋给第一个操作数。 m e m 表示内存地址为a n 内存单元的值,这里就表示变量a 。r e g 表示目标机 器的7 号寄存器。所以这个赋值操作实际上是一个l o a d 操作,它会被翻译 为:”l dr 7 。r 1 0 ”,其中r 1 0 中是变量a 的地址。关于变量的数据宽度由”:s i ” 决定,它是s i n g l ei n t e g e r 的简称,在g c c 中是4 个字节。第二条r t l 语句与 第一条是相同的,将变量b 载入8 号寄存器中。第三条语句还是s e t 操作,只 不过它的源操作数是p l u s ,代表r 7 与r 8 的和。结果写入r 7 寄存器中。所以 其相应的汇编代码是:a d dr 7 ,r 8 。最后一条语句是将加法结果存入变量a 中。 值得注意的是,将树型表示转换位r t l 时,在理想的情况下,编译器 可以无需知道载入,存储或相加操作的汇编代码,因为所有操作都是用r t l 6 重庆邮电大学硕士论文第一章引言 语言表示的。而实际上这是不可能的,因为根据目标机器的特点,g c c 不 能任意生成r t l 语句,必须满足目标机器的约束条件。例如,一个目标机 器不能执行s i 模式的加法操作,但是能够完成h i 模式的加法,这样g c c 就 可以用两条h i 模式的加法操作来实现一条s i 加法操作。可以在目标机器描 述文件中定义目标机器的硬件特点。 2 ) 中端 当完成了r t l 代码生成以后,就会进入g c c 的中端。接下来g c c 会将 r t l 代码进行优化,然后又输出优化过的r t l 语句。除此以外,中端还要 保证所生成的汇编代码的有效性。因此它还包含了重载遍、局部和全局寄 存器分配遍。 3 ) 后端 当中端完成了所有工作以后,它会进入后端,此函数用于将r t l 语句 编译成汇编语句。在这个阶段,所有伪寄存器都会被替换为实寄存器,并 且所有中间r t l 代码都会被丢弃。g c c 中必须具有相应的匹配模式,才能 将r t l 翻译成对应的汇编语句。这些模式要在机器描述文件t m m d 中定义。 例如,对于如下r t l 语句: ( s e t ( r e g :s i6 ) ( p l u s :s i ( r e g :s i7 ) ( r e g :s i8 ) ) ) 这条r t l 语句必须有相应的匹配模板,如下: ( d e f i n e i n s n “a d d s i 3 ” ( s e t ( p l u s :s i ) ) 】 “ ” “a d d 1 ,2 ,o ”) 其中t e m p l a t ev a r i a b l eo g i 会被实例化为( r e g :s i6 ) ,v a r i a b l el 会被实例化为 ( r e g :s i7 ) ,v a r i a b l e2 实例化为( r e g :s i8 ) 。汇编语言输出模板包含对这些 变量的引用,在输出时要被替换为相应的操作数,因此这里生成的汇编代 码为a d dr 6 ,r 7 ,r 8 。关于指令模式和模板变量更详细的内容,会在后面进行 说明。 1 3 论文结构 本文主要分为六章,内容如下: 第一章介绍了编译器领域的现状,以及各种开源编译器的特点,着重介 7 重庆邮电大学硕士论文第一章引言 绍了g c c 编译器的软件体系结构和移植的设计思想。 第二章主要介绍了g c c 编译器中重要模块的实现,以及g c c 后端移 植机制。 第三章着重研究目标机z s p 4 0 0 的体系结构,将其抽象为适合g c c 进 行后端移植的模型。并且基于z s p 4 0 0 体系结构丌发了一个模拟器,用于 进行系统测试。 第四章详细介绍基于g c c 的z s p 4 0 0 芯片后端移植的过程和方法,这 是全文的重点。 第五章主要介绍将z s p 4 0 0 后端并入g c c 源代码的方法,以及采用 z s p 4 0 0 模拟器进行z s p 4 0 0 编译器测试的过程和方法。 第六章主要总结了基于g c c 的z s p 4 0 0 芯片后端移植的过程和方法, 并提出了今后所要开展的相关工作。 重庆邮电大学硕士论文 第二章g c c 编译器的实现 第二章g c c 编译器的实现 在引言中,已经简单介绍了g c c 将c 语言翻译成汇编代码的过程, 本章简要介绍那些在编译过程中所要使用的重要模块的实现,以及g c c 的后端移植机制。 2 ,1g c c 重要模块 本节主要介绍g c c 中的重要模块,按照前端、中端和后端进行分类 如下: 前端,包括词法分析和语法分析模块。 中端,主要是r t l 代码生成模块。 后端,最终遍模块,用于进行汇编代码输出。 2 1 1 词法分析模块 g c c 采用软件l e x 自动生成词法分析器i s , 9 l 。在编译过程中。当语法分 析器需要下一个词素时,便会调用词法分析器。词法分析函数( y y l e x ) 的主 要任务是查找标识符,并且确定其是类型名还是变量名( 或函数名) ,然后 将识别出来的词素所对应的符号值返回给语法分析器。此外,词法分析器 还用来将词素翻译成语法分析中使用的终结符。 y y l e x 会调用其它函数来解析每个词素中的语义信息。例如,数字字符 串3 2 将会被解释为c p pn u m b e r ,其语义信息是一个整数值3 2 。y y l e x 会 把这些信息放到类型为u n i o n 的t r e en o d e 数据结构中,并且将其作为词素的 语义信息返回给语法分析器。 函数c p pg e tt o k e n 实现了词法分析器的核心功能,如表2 1 所示。 表2 1 词法分析器核心函数 宏定义关键字处理( 如; c p p g e t t o k e n # d e f i n e ,# i n c l u d e ,等) - c p p 1 e x t o k e n - - ) _ c p p h a n d l e d i r e c t i v e 宏定义展开 c p p _ g e tt o k e n 9 重庆邮电大学硕士论文第二章g c c 编译器的实现 - - e n t e r _ m a c r o c o n t e x t 数字和字符串分类,识剐 c p p g e t t o k e n 操作符 专一c p p l e x t o k e n c p pl e x d i r e c t 对于输入的c 语言标识符,将会进行特殊处理。因为词法分析器不能 立刻确定它正在处理的是用户定义的宏,还是一个c 语言变量、类型或函 数的标识符。如果是一个宏名,则词法分析器会将其展开,而如果是标识 符,将不会做任何修改。处理标识符的函数调用顺序如图2 1 所示。 c p p g e t t o k e n - 9 c p p l e x _ t o k e n - 9 c p p l e x d i r e c t - 9 p a r s e i d e n t i f i e r h t l o o k u p 图2 1 调用顺序 如果被返回的数据结构c p p - h a s h n o d e 的t y p e 域是n t m a c r o ,预处理程序 就会将其进行宏展开。否则,就表示的是c 语言标识符的定义信息。 2 1 2 语法分析模块 g c c 采用b i s o n 语法分析器生成器来生成语法分析器1 8 ,l 吼1 1 1 。由b i s o n 产生的是一个自底向上的语法分析器,这意味着,语法分析过程是通过堆 栈来实现的,而此堆栈被称为状态栈,它的作用是识别语法规则。自底向 上的方法可以将堆栈顶部的若干符号规约为一个非终结符。在规约时,会 将匹配上的符号从栈中弹出,然后将规约的目标符号压入栈中,此符号又 可以和其它符号一起被规约。如果一段c 代码是正确的,语法分析最后就 可以将c 程序规约为c 语言语法的开始符号。 与状态栈f y y s s ) 对应的是一个语义值堆栈( y y v s ) ,它由语法分析函数 y y p a r s e 维护。当发生一个规约操作时,语法分析器还可以执行相应的语义 动作,语义动作由用户提供。例如,考虑以下的语法规则: e x p l n o _ c o m m a s : e x p r 一1 1 0 c o m m a s + e x p rn o c o m m a s 1 0 重庆邮电大学硕士论文第一二章g c c 编译器的实现 $ $ = p a r s e r _ b u i l d b i n a r y o p ( $ 2 ,$ l ,$ 3 ) ;) 当此规则匹配以后,由操作符+ 连接的c 表达式会被语法分析器识别出来。 而这两个表达式的语法树就是它们的语义值。在语义动作中,它们可以由 符号$ l 和$ 3 来弓1 用。而符号$ 2 表示+ 操作符的语义值。当语法状态栈由语 法分析器自动更新的同时,通过对符号$ $ 赋值,新的语义值就会被压入语 义值堆栈。函数p a r s e rb u i l db i n a r yo p 可以将两棵语法树合并为一棵新的 语法树。以上便是加法表达式的语法规约过程。 到此为止,介绍了g c c 的前端的设计和实现7 , 1 2 , 1 3 1 。 2 1 3r t l 代码生成模块 当语法分析器完成以后,c 语言函数语法树会被构建出来,函数中的 语句都会被翻译成r t l 语言进行代码优化【1 4 07 1 和进一步的处理。r t l 生成 的过程被称为r t l 生成遍。它由函数ee x p a n db o d y 控制。 r t l 生成遍是将当前函数体中鲍所有c 语言语句展开,然后通过函数 ce x p a n db o d y 和e x p a n ds t m t 将c 语吉语句转换成r t l 链表的形式。在此过 程中调用函数a d ds t m t 将新的r t l 语句插入r t l 链表。 当函数ce x p a n db o d y 将当前函数的树型表示完全展开以后,它将会调 用函数r e s to fc o m p i l a t i o n 用来初始化以后的处理,到此编译器就会从前端 的处理切换到中端。中端主要优化前端生成的r t l 代码,以及进行寄存器 分配( 为伪寄存器和虚寄存器分配实寄存器) 和重载( 将内存引用的变量放 入寄存器中) ,并且将其传递给后端。 2 1 4 最终遍模块 最终遍实际就是g c c 的后端,采用基于模式匹配的方式,将r t l 代码 翻译成汇编代码。 最终遍由函数f i n a l 实现。它会调用函数f i n a l s c a n i n s n ,来控制汇编代 码的生成。函数g c i i n s n t e m p l a t e f f 来获取相应的汇编输出模板。汇编模 板中包含了操作数占位符,它们会被替换为实际的操作数,然后输出到文 件。 当前函数中的所有指令都被处理以后,最终遍结束。如果源代码中还 有其它函数,编译器又会继续以与上面相同的过程对后面的函数进行处 理。 重庆邮电大学硕士论文第二章g c c 编译器的实现 2 2 后端移植技术 g c c 支持编译器的后端移植,通过研究和归纳g c c 源代码,g c c 后端 移植的基本思想是:将目标机器体系结构按照g c c 可以接受的方式进行描 述,这样g c c 便可以识别目标机器了;然后,针对高级语言中的基本结构, 在g c c 中分别实现相应结构的r t l 模式,g c c 就是根据这些模式进行代码 生成的。因此从大方面来看,可以分为两个过程:目标机器定义,r t l 模 式定义。以下主要介绍其中涉及的概念及具体的实现。 g c c 提供了一种描述目标机器的机制,这样通过开发目标机器描述就 可以将g c c 移植到其它体系结构上。 在g c c 中,一个新的体系结构的机器描述主要由t m c ,t m m d 和t m h 三 个文件组成。t m c 文件中是目标机器后端中所要使用的一些辅助函数:t m m d 文件包含了定义的与目标机器相关的指令模式:t m h 是一个c 语言头文 件,其中定义了目标机器的硬件特性和一些底层的软件特性,如寄存器, 以及堆栈增长方向等。由于目标机器描述的t m m d 是整个g c c 后端的核心, 所以下面主要介绍t m m d 文件的一些内容,其它两个文件在后面实际进行 移植时还会提到。 指令模式 指令模式在文件t m m d 中定义,它们指定了可以直接翻译成汇编语句 的r t l 语句模式及翻译的方法。指令模式具有以下的形式: ( d e f i n e i n s n “a d d s i 3 ” 【( s e t ( p l u s :s l ) ) 】 ” “a d d l ,2 ,o ”) 可以看到,一个指令模式由5 个操作数组成,下面分别说明: 1 ) 名字:用于标识此r t l 模版的作用,在指令模式中可以忽略,但在 展开模板的定义中必须指定名字。 2 ) r t l 模板:它用来指定将要被匹配的r t x 结构。被匹配的r t x 中的某 1 2 重庆邮电大学硕士论文第二章g c c 编译器的实现 些部分要与模板所指定的相一致,例如。s e t 和p l u s :s i 。而其它部分对应的 模板变量( 就是所谓的占位符) ,可以有多种结构。但是,只有当它们满足 由( m a t c h o p e r a n d ) 中所指定的约束条件时,才能匹配上。例如,约束条 件要求操作数为立即数值( c o n s ti n t ) ,但是如果实际的操作数是寄存器 或者内存引用,匹配就会失败。 3 ) 条件:对于无名指令模式来说,这是一个包含b o o l e a n 类型的c 表达 式的字符串,它的值决定了这个模式是否能被匹配。如果r t l 代码已经匹 配,但是这个条件为假,则此r t l 也不能与指令模板相匹配。 4 ) 汇编输出模板:用来指定所要输出的汇编代码。它包含操作数占位 符,在输出汇编代码时,这些操作数占位符会被替换为真正的操作数。 在编写t m m d 文件时,输出模板是由双引号包含的字符串,它具有三 种形式,由字符串的第一个字符来区分,如下; 普通字符串:不能由字符 或开始。字符串形如:a d d l ,2 ,o , 这就是在后面将占位符替换以后输出的汇编语句。 固模板:包含了多个普通字符串模板。每一行都对应了一个相应的可 选项。最终,只有一个可选项被选择,并且相应的输出模板作为汇编代码 输出。多条指令可以被写到同一行中,它们由分隔。 模板:当此模板被提取出来以后,会被放入一个新的c 函数中,这 个函数将会被写入i n s n o u t p u t c 中。所以,编译器运行时,函数 g e ti n s n在需要获取普通字符串输出汇编代码时,便能够调用这template 个函数。 5 ) 属性值:当跳转发生时,编译器需要知道被跳转过的指令长度,这 样才能产生一条有效的相对跳转指令。小范围的跳转可以使用立即数操作 数,而大范围的跳转就需要使用寄存器。 这种信息不能够由输出模板计算,而需要独立提供。属性机制就可以 实现这种功能。 展开模板定义 在r t l 生成遍中,被语法分析器解析的c 语言函数的树型表示会被展 开成语义上等价的r t l 代码。这可以由展开模板定义来实现,对于每种体 系结构,它必须在机器描述文件t m m d 中提供。 每个展开模板定义需要提供一个模板名,它是g c c 中定义的标准名。 标准名与特定的动作类型相联系,如算术运算,跳转,函数调用,或者数 据移动操作,它们会输出相应的r t l 代码。 展开模板在g c c 中的使用方法,与指令模式基本相同,只是输出不同, 重庆邮电大学硕士论文第二章g c c 编译器的实现 指令模式输出汇编代码,而展开模板输出的是r t l 代码。因此不再赘述其 执行过程。下面给出了展开模板定义的格式: ( d e f i n e e x p a n d 【 】 “ ” “ ” 其中展开模板定义中的4 个参数的意义可以参考7 1 。 2 3g c c 小结 本章介绍了g c c 中词法分析模块、语法分析模块、r t l 代码生成模 块的实现及运作过程,说明了g c c 是如 可对目标机器体系结构进行支持 的。此外还着重介绍了g c c 的后端移植机制,以及实现后端移植的基本 思路。后端移植技术是本文的基础,后面具体移植过程将会在此基础上进 行。关于g c c 的实现和基本概念更为详细的说明可以参考g c c 的官方文 档 7 1 ,g c c 的具体使用方法可见参考文献【1 8 1 。 1 4 重庆邮电大学硕士论文 第三章目标机z s p 4 0 0 体系结构研究 第三章目标机z s p 4 0 0 体系结构研究 本章主要介绍z s p 4 0 0d s p 芯片体系结构 1 9 l 的特点,并且将z s p 4 0 0 的体系结构抽象为g c c 可以接受的模型,最后介绍了由笔者开发的 z s p 4 0 0 模拟器的架构和功能。其中,详细说明z s p 4 0 0 的寄存器和寄存器 类型、流水线结构、寻址模式和指令集1 2 。在对g c c 进行后端移植时, 需要考虑这些资源的使用方法,才能产生正确的代码。对o c c 进行后端 移植,就是要将c 语言的基本结构映射到恰当的汇编语句,从而实现相应 的从高级语言到汇编语言的编译。z s p 4 0 0 模拟器是为了进行系统测试而 开发的,本章末尾会说明其功能和架构。 3 1z s p 4 0 0 各个功能单元 图3 ,l 是一个典型的z s p 4 0 0 系统,图中描述了z s p 4 0 0 的各个功能单 元,以及它们之间的关系,还进一步描述了功能单元与外设的关系。 对照图3 1 ,以下分别介绍z s p 4 0 0 中的各个功能单元,以及它们之间 的关系和执行顺序。这样有助于理解整个芯片的执行过程,对实现后端移 植方法的理解有很大帮助。 控制寄存器 z s p 4 0 0 体系结构包含了一组控制寄存器,用于进行运行模式控制、 记录状态和符号信息。它具有3 2 个】6 位的控制寄存器。在o c c 中,可 以将控制寄存器定义为一种寄存器类型。 流水线控制单元 流水线控制单元( p i p l i n ec o n t r o lu n i t 简称e c u ) 在取指和解码阶段从 存储器中提取指令。它会检查指令之间的依赖,并且进行一些组合,然后 将指令发射到相应的数据单元。只有能够并行执行的指令才能在同一个周 期中被发射,并且z s p 4 0 0 不支持乱序执行( o u to f o r d e r ) 。 p c u 可以在一个周期中同时发射4 条指令,它会通知指令单元,哪4 条指令会被组合成下一个指令包。数据单元接下来读入最多2 个3 2 位操 作数,并且将它们发送到指令执行单元。指令执行单元进行一些相应的操 作,就会将得到的操作结果写入一个通用寄存器或者写回数据单元存入内 存中。写存储器操作在流水线的写回周期执行。 重庆邮电大学硕士

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论