




已阅读5页,还剩68页未读, 继续免费阅读
(计算机软件与理论专业论文)gcc编译系统结构分析与后端移植实践.pdf.pdf 免费下载
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
摘要 y5 8 1 8 5 0 嵌入式系统的丌发特征对开发工具提出了特殊的要求。它对于代码大小,代 码性能,以及可配置性的苛刻要求,使得在桌面以及服务器端丌发中表现良好的 编译系统往往不能胜任。g c c 作为前端支持多语言,后端支持多平台的优化编 译系统,是一个合适的选择。 本文从嵌入式系统开发工具链的需求出发,考查g n u 工具链的特点,集中 在对g c c 的优化流程,前端接口,后端接口等三个方面结构特征的总结分析, g n u 结构上存在如下特征: 1 g n u 前端接口:以树结构作为语言无关的接口,通过回调机制,将g c c 前端同编译主体联系起来。 2 g c c 的中间优化机制特征:g c c 的中间优化是目标体系独立的( 所有 的处理基本集中在r t l 表达式上面) ,同时又是目标体系相关的( 处理 的r t l 表达式同机器描述存在密切联系) 。具备相当完善的局部优化机 制,同时缺乏全局的优化策略,以及针对特定体系结构的优化。 3 g c c 的后端接口:以独特涉及的r t l 语言格式的机器描述,结合c 语 言宏定义完成对于目标体系结构的描述。通过代码生成机制完成特定参 数的代入。作为实践,完成了g c c 的一个移植过程,并由此加深了对 g c c 移植的理解。 最后在此基础上,总结并提出后续工作,主要集中在两个方面:首先是开发 人员友好的后端开发平台:其次是对于g c c 优化机制的改造思路。 关键字:嵌入式系统丌发环境;编译器: r t l :g c c ;移植;优化 束经作菁、导师同意 匆垒文公拓 浙江人学坝 :学位论文 g c c 编译系统结构分析。,后端移植实践 a b s t r a c t d e v e l o p m e n t e n v i r o n m e n to f e m b e d d e ds y s t e mh a si t so w n r e q u i r e m e n t s 。s o m e c h a r a c t e r i s t i co fe m b e d d e ds y s t e ms u c ha sr o m b a s e d ,a g g r e s s i v e d e m a n do f p e r f o r m a n c e ,e t c m a k et h o s eu s u a l l yu s e dc o m p i l e r sc a n ta c ta st h i sr o l ep e r f e c t l y g c ci sas u c c e s s f u lc o m p i l i n gs y s t e mw i t ho p t i m i z a t i o n ,w h i c h s u p p o r t sm a n y h i g h l e v e ll a n g u a g ea n dm a n yp l a t f o r m s i tc a nb e ag o o dc h o i c eo fc o m p i l e ro f e m b e d d e ds y s t e mi d e a f t e rl i s t i n gs o m er e q u i r e m e n t so fe m b e d d e ds y s t e md e v e l o p m e n tt o o l s c h a i n , t h i sp a p e r g i v e st h ea d v a n t a g e o f u s i n gg n u b a s e dt o o l s ,a n ds o m ei n f o r m a t i o na b o u t g c ca r c h i t e c t u r e t h r o u g ht h o s ea n a l y s e s ,w ee x p e c t e dt ok n o wh o ww ec a nd o s o m e t h i n g t oh a v et h eg c c c o m p i l e r t of i to u rp r o j e c t g c ch a sa r c h i t e c t u r ea sf o l l o w : 1 i t sf r o n t e n di n t e r f a c ei sb a s e do nt h et r e es t r u c t u r e a d d i t i o n a l l y , t h eh o o k m e c h a n i s mc o n n e c t st h el a n g u a g e - s p e c i f i cf r o n te n da n dt h eg c cm a i n b o d y 2 a l lg c co p t i m i z a t i o ni s p e r f o r m e d o nt h er t le x p r e s s i o n s i t sl o c a l o p t i m i z a t i o n m e c h a n i s mi si t s a d v a n t a g e , w h i l ei t sl a k eo f a r c h i t e c t u r e s p e c i f i co p t i m i z a t i o na n dw e a k n e s so fg l o b a lo p t i m i z a t i o nh a s d e g r a d a t i o n i t st o t a lg e n e r a t e dc o d ep e r f o r m a n c e , 3 i t sb a c k e n di n t e r f a c ei sb a s e do nt h er t ll a n g u a g e d e v e l o p e rc a l lg e tt h e m a c h i n e - s p e c i f i cb a c k e n dj u s tt h r o u g hd e f i n es o m em a c h i n ei n f o r m a t i o ni n t h r e ef i l e s a sp r a c t i c e ,w eh a v ef i n i s h e dag c c p o r t i n g t om p c 5 5 5 b u ti t s a h a r d j o b ,t h r o u g h i ts e e m ss oe a s y a t l a s t ,t h i sp a p e rg i v e ss o m e i n f o r m a t i o na b o u tt h ef o l l o w i n gw o r k i tf o c u s e so n ad e v e l o p e rf r i e n d l yu s e dg c cb a c k e n di n t e r f a c ea n ds o m ei m p r o v e m e n to ng c c o p t i m i z a t i o n m e c h a n i s m k e y w o r d s :e m b e d d e ds y s t e m ;d e v e l o p m e n te n v i r o n m e m ;c o m p i l e r ;g c c ;r t l ; p o r t i n g ;o p t i m i z a t i o n 1 1 1 导论 计算机技术从问世以来,极大的改变着人们的生活。计算机从最初的昂贵的, 庞大的,需要专人值守,只有大公司才有能力支付的怪物,到日渐融入人们生活 的个人电脑,以及便携式的掌上电脑,甚至出现在其他的日常家电中;从单机运 算,到现在无所不在的网络。计算在人们的生活中无所不在。嵌入式系统应用的 不断发展,给计算机技术的各个方面提出了新的要求和挑战。对嵌入式系统的开 发环境寻求合适的解决方案成为系统开发的一个重要课题。 1 1 项目背景介绍 本文属某面向汽车电子控制的嵌入式软件丌发平台项目的一部分。 该项目属于国家8 6 3 软件专项,由中国第一汽车集团公司申请,合作单位包 括浙江大学、吉林大学。主要是针对我国汽车电子领域的汽车动力总成电子控制 系统的自主国产需求,研制一种面向汽车电子控制的嵌入式软件平台,建立符合 汽车电子控制与通讯0 s e k 标准的、超微型实时安全的嵌入式操作系统,以及面 向汽车电子的嵌入式动力总成控制应用的基础与专用编程接口;基于该平台,研 制开发大型卡车的动力总成电子控制系统,形成行业标准与规范,提升我国汽车 电子领域嵌入式软件自主开发能力。 系统的开发工具链的构造是整个开发平台中的一环。存在各种可行的方案, 在自行编写新的编译器、购买商用的编译平台和利用开放源代码资源这几个方案 中,最终选择采用最后一个方案。原因是多方面的。与自行编写编译器的大工作 量,商用编译器的价格问题、版权甚至技术封锁闯题相比,开放源代码的方案具 有强大的优势。而在开放源代码的工具链选择中,基于g n u 的方案更是值得关 注。 1 2 嵌入式系统开发环境的要求 嵌入式系统的特征为其开发环境提出了特殊的要求。它对于代码大小,代码 性能,以及可配置性的苛刻要求,使得在桌面以及服务器端开发中表现良好的编 译系统往往不能胜任。一般来说,适当的开发工具选择可以极大的提高开发效率, 改善项目的可行性。针对一个项目而言,理想的嵌入式系统开发环境需要具备如 下这些特征。 1 ,首先,当然它必须支持项目中所选择的处理器。如果微处理器的选择 浙江人学坝i 。学位论文 g c c 编译系统结构分析l ,后端移植实践 不受开发工具的约束,那么在其他各方面我们有更多的优势。 2 , 运行主机平台,嵌入式系统的开发工具通常是交叉编译,主机平台的 选择我们同样也不希望受到开发工具的约束。不能想象,我们为了得 到一个开发工具,需要重新熟悉一个平台。目前大多数开发人员对于 w i n d o w s 的熟悉程度,通常都不会希望因为需要开发工具而转移到 l i n u x 或者其他平台上。 3 , 实时操作系统的支持。这个要求并不针对所有的嵌入式系统丌发平 台,但是一旦系统中运行有实时操作系统,那么这个要求就显得分外 突出。 4 , 可以和其他开发工具完美的整合。完整的开发工具链可能需要不同供 应商的产品,没有人希望开发过程中在某一个地方是脱节的。同时良 好的整合也意味这效率的提高。 5 ,是否带有标准库。同样,并不是每一个项目都需要这个东西,但是一 旦需要,就必须认真的考虑标准库的特性,比如它是否是可重入的。 是否包含了完整的函数等等。 6 ,是否提供了系统的启动代码。通常的桌面应用程序开发都不会意识到 启动代码的存在。但是这里需要。而且源代码和关于用法的文档,会 给开发带来很大的好处。 7 ,高效的生成代码。不需要多加解释了,性能对于嵌入式系统的要求不 言而喻。 8 ,空间优化。强调了性能,同样不能忽略空间限制,嵌入式系统一般都 具有很小的存储空间。一个好的编译平台应该具备对代码大小的优化 机制。有时候代码性能和代码大小两者的优化是矛盾的,编译系统应 该提供两者的选择。 9 ,最后如果把目光集中到编译器上,我们应该要求它可以支持嵌入式汇 编,因为嵌入式系统中存在相当数量直接硬件相关的操作,如果支持 嵌入式汇编。开发就容易多了:最好可以有对于中断处理程序的特殊 支持,尽管并不属于语言标准的一部分,这里我们同样需要;还有, 编译器应该可以生成汇编代码,开发人员可以在对性能不满意的时候 进行手工优化,看起来显然的问题,实际上并不是所有的编译器都具 备这样的功能,有很多编译器现在将汇编器集成到了高级语言编译器 中。 另外需要考虑到开发人员的习惯,针对不同的项目如果可以使用同样约定的 开发环境,可以极大的降低培训费用,加速系统的开发。 这里提出了很多的要求,其中有一些是必要的,另外一些是可选的,可是如 浙江人学顺l 学位论文 g c c 编译系统结构分析j j 舌端移植实践 果我们可以得到这样的工具,甚至,它给予的比要求的更多,那么是不是这就应 该是一个合适的选择? 可以说基于g n u 的工具链满足上面大多数必须的要求,同时它们都是丌放 源代码的。意思是说,如果你愿意,可以变得更好。 1 3 g n u 工具链的优势 g n u 工具链一般由下面这样一些工具组成:作为编译器的g c c ( g c c 本身 作为编译器集合包含了对多种语言的支持,这里仅讨论其中的c 编译器) 、b i n t u i l s 软件包中作为汇编器的g a s 、作为连接器以及定位工具的l d 和可以对二进制目 标文件进行变化处理的其他工具、作为标准c 库的n e w l i b 或者g l i b c 、作为调试 器的g d b 。 可以按照上述的要求来考查一下基于g n u 的工具链是否满足嵌入式系统的 开发要求。 1 ,首先,广泛的支持多种体系结构的目标处理器,满足嵌入式系统处理器 多样化的特点;只需要进行配置和构造,就可以得到针对各式各样微处 理器的编译环境。 2 ,其次,这个环境支持绝大多数当前流行的主机操作系统,从l i n u x ,类 u n i x 操作系统到w i n d o w s 的各个版本都有其变种。不论开发人员习惯于 w i n d o w s 环境,还是u n i x 环境,通过配置安装都可以得到。 3 ,另外,g n u 提供了完整一致的工具,基本无需额外考虑与其他外部工具 的整合问题,即使这种情况出现了,g n u 是开放的,它支持多种开放的 目标文件格式,以及调试格式; 4 ,存在多种形式的开源c 标准库可以使用,可以和编译器连接器完美整合, 尤其是n e w l i b 特别适合于嵌入式系统的应用,它的代码可重入,非常灵 活;而且n e w l i b 是一个完整的标准c 函数库,满足开发人员对于标准函 数的所有要求。而且n e w l i b 中定义了相当多针对不同处理器的启动代码, 也可以自行配置。 5 ,g c c 编译器可以设置不同的优化等级,按照需求进行代码优化; 6 ,c r c c 编译器也可以对代码大小做可选的优化,满足嵌入式系统较小r o m 空间的特征要求; 7 ,g c c 编译器支持内嵌汇编代码,可以方便的利用这个扩展特性在c 语言 代码中嵌入汇编代码以提高性能或者减小体积; 8 ,g c c 可生成汇编代码而不是直接生成目标代码,方便了用户对于代码的 手工优化;最后一点,g n u 的开源特性,给系统的开发人员提供了最大 浙江人学坝l j 学位论文 g c c 编译系统结构分析1 j 后端移橇实践 化定制自己开发工具链的可能。 1 4 主要工作以及意图 选择基于g n u 的工具链并不意味着万事大吉。因为没有什么东西是完美的。 我们同样需要作一些工作来满足需求。 第一个问题,对于大多数情况下,项目所选择的微处理器可能是在工具链的 支持列表中的,同样也可能不是。在后者的情况下,需要开发g c c 新的后端。 这么作也是值得的,g n u 工具链提供的其他优点,将会弥补这里需要开发新后 端的缺陷。 第二个问题,优化问题,g c c 的优化机制并不是毫无缺憾的,尽管在g c c 的发展历史上,它的效率一直为人所称道,但是近来的表现并不尽如人意。比如, i n t e l 声称它的编译器效率在i n t e l 系列处理器上的表现比g c c 高出3 2 。而对 效率要求相当苛刻的嵌入式系统,需要做的很多,同时由于开源的缘故,可以作 的也很多。 第三个问题,嵌入式系统涉及大量板级支持的问题。可能需要c 标准库 n e w l i b ,调试器g d b ,以及汇编器,连接器作一定的定制。好消息是,存在两种 途径得到我们需要的,首先是可能项目需要做的定制,外部已经有丌发人员完成; 其次大量的这一类工作可以拷贝类似系统的配置,作适当的修改可以完成,这一 种情况事实上也并不糟糕,g n u 的设计思想已经考虑到了涉及移植的处理。 作为工具链的核心,前两个问题集中在g c c 编译器上面。本文将集中在为 前面两个问题的解决提供思路。因此作如下安排 首先在第二章对g c c 做概括介绍,它的发展,它支持的前端语言,后端目 标机器,以及它在g n u 工具链中的位黄。 第三章对g c c 的结构,流程以及不同的流程阶段涉及模块做一介绍。主要 集中在对于g c c 主体( 也就是独立于前端语言,后端处理器部分) 的介绍。这 部分主要功能在于优化。 第四章主要集中在g c c 的前端。主要介绍它针对不同语言的接口,树。前 端接口影响对于不同语言的支持。 第五章集中对g c c 的后端接口做一描述。后端接口定义了g c c 对于不同目 标机器的支持方式。 第六章通过对m p c 5 5 5 的后端支持分析以及重写,从感性上理解g c c 的后 端扩展机制,并且熟悉了实际项目相关的p o w e r p c 体系结构特征,为进一步的 优化提供可能。另外一方面,p o w e r p ce a b i 的定义对于其他嵌入式系统的应用 程序二进制接口( a p p l i c a t i o nb i n a r yi n t e r f a c e ) 具有借鉴意义。 4 浙江人学坝1 1 学位论文g c c 编译系统结构分析i 后端移植实践 最后。第七章,指出对于在本项目中,对于g c c 可以做的工作。主要是两 个方面的思路。首先是针对后端编辑器的考虑:其次是对于g c c 针对体系结构 特定的优化,或者从整体改善g c c 的优化性能。所有的这些考虑都以本文作为 基础。 浙江人学坝f 学位论文 g c c 编译系统结构分析o ,后端移植实践 2 g c c 介绍 g c c 表示g n u c o m p i l e r c o l l e c t i o n 。包含一系列针对不同语言和不同目标平 台,以及可运行在不同主杌系统上的编译器。 2 1 g c c 历史与发展 g c c 最初只是r i c h a r ds t a l l m a n 于1 9 8 7 年编写的一个c 的编译器,当时也 叫做g c c ,不过表示的是g n ucc o m p i l e r 。1 9 8 7 年发布t 0 版,到1 9 9 2 年发 布基于新的开发框架的g c c 2 ,1 9 9 7 年g c c 的一个分支e g c s ( e x p e r i m e n t a l e i l l l a n t e dg n u c o m p i l e rs y s t e m ) 并入g c c 官方发布版本,版本号为2 9 5 ,目 前最新发布版本3 4 。 g c c 的代码来源,目前有两种方式,一种是遍布于全世界各地的开发人员无 偿的奉献,另外一种是商业公司的资助。 g c c 依据g n ug e n e r a lp u b , l i el i c e n s e 发布,其主要立场在于可以获得g c c 的源代码,但是对其作出的修改也应当以相同的协议发布。 2 2 g c c 支持的前端 g c c 定义的主体结构为语言前端提供了接口,目前为止g c c 支持的语言包 括:c ( g e e ) ,c + + ( g + + ) ,o b j e c t i v ec ,f o r t r a n ( 9 7 7 ) ,j a v a ( g c j ) ,a n da d a ( g n a t ) 。 同时开发中的语言包括有p a s c a l ( g p c ) 、m e r c r y ,c o b o l ,g n u m o d u l a - - 2 、 k s i 、f i l i m 、g h d l ( f o rv h d l ) 、p l 1 。详细列表以及成熟情况可以参见 h t t p :g c c g n u o r g f r o n t e n d s h t m l a 在g c c 的发布包中包括的语言有c ,c + + ,o b j e c t i v e c ,a d a ,f o r t r a n ,j a v a , 以及一个玩具语言t r e e l a n g 。 2 3 g c c 支持的后端 g c c 灵活方便的后端扩展机制使得它能够支持多种类型的体系结构,从 r i s c 、c i s c 到d s p 都有支持。事实上,几乎所有现在被广泛使用的微处理器在 g c c 中都有支持。据统计,g c c 现在支持的体系结构包括有几十家公司( 包括 i n t e l 、a p l l o 、c o i n f v e x 、d e c 、h p 、i b m 、m i p s 、m o t o r o l a 、s g i :、 s o n y 、s u n 等) 的三十多种体系结构( a l p h a 、i 3 8 6 系列、i 9 6 0 、m 6 8 0 0 0 6 浙江人学坝j j 学位论文 g c c 编译系统结构分析,后端移植实践 系列、m i p s 系列、r s 6 0 0 0 、s p a r c 等等) ,如果按照处理器来算则更多了。 更加详细的g c c 支持后端信息可以参见h t t p :g c c , g n u o r f f o a c k e n d s , h t m l ,以及在 g c c 软件包附带文档中的处理器列表。 2 4 g c c 支持的主机系统 它可以运行在几乎所有的操作系统平台上面,其中包括将它作为系统编译器 的g n u l i n u x 、其他自由软件平台( 比如b s d 系列) 以及o s x ,还存在它的一 些变种可以运行在u n i x 系统或者其他类u n i x 系统中;通过c y g w i n 或者其他一 些工具,g c c 也可以运行在m sd o s 、m sw i n d o w s 的多个版本的平台上。 2 5 g c c 如此成功的原因 之所以g c c 可以前端支持众多的语言,后端支持多个目标体系结构,并且 被广泛的运行于多种主机系统平台,从技术层面上来讲存在多方面的原因: 1 ,它对于多语言的支持得益于前端结构的可扩展性,因此用户只需要实 现一个语言的前端就得到了一个可以运行于多种宿主平台,可以生成 数十种目标体系结构代码的编译器; 2 ,它独特的代码生成机制,使得用户可以通过定义机器描述来得到需要 的g c c 后端代码生成器,同样节省了大量的工作。 3 ,更加可贵的是,在同时具备了前面两个优点的情况下,它的中间代码 优化机制提供了几乎可以和某些商业编译器媲美的生成代码。 4 ,良好的标准兼容性。g c c 现在支持的c 语言标准包括c 8 9 ,c 9 5 。对 于c 9 9 的支持现在还在进行中,详细的信息可以参见 h t t p :g c c g n u o r g c 9 9 s t a t u s h t m l 。g c c 对于其他支持语言的标准可以参 见对应语言的手册。同时提供了一些与标准兼容的扩展机制,增强语 言功能。 5 ,支持作为主机编译器,或者交叉编译器。为它在不同领域的应用提供 了先决条件。 当然,除此之外,g c c 基于g n up u b l i c l i c e n s e 的发布,丌放源代码的独特 魅力,也吸引了众多开发人员的加入,这同样也是g c c 成功非常重要的原因。 2 6 g c c 的组成 压缩包的g c c 源代码包解开以后在g e e 一+ 的目录中,4 4 + 是相应的版本 号。( 后文中所指的所有对应文件的位置均以此作为根目录) 。所有g c c 的源代 浙江人学坝i 学位论文g c c 编详系统结构分析与后端移植实践 码按照目录,以及文件来划分模块。粗略的区分大概有如下几类,一是g c c 的 编译主体部分c 源代码,二是所支持语言的运行时库,比如j a v a 的支持库等, 另外一类是脚本文件,用于安装,维护等等。 按照模块功能,以及开发语言区分,各自的代码量( 单位为行) 统计如图所 述( 据g c cs u m m i t ) 对于g c cv 3 3 1 的统计: 编译器核心 后端合计 2 5 0 ,0 0 0 4 1 0 ,0 0 0 1 5 2 5 最大的后端4 0 ,0 0 0 ( r s 6 0 0 0 ) 最小的后端2 ,2 0 0 ( f r 3 0 0 ) 中等的后端6 ,5 0 0 ( v 8 5 0 ) 前端合计4 8 0 ,0 0 0 2 9 最大的前端2 2 1 ,0 0 0 ( a d a ) 最小的前端2 ,5 0 0 ( t r e e l a n g ) 中等的前端5 9 ,0 0 0 ( j a v a ) 运行时库4 5 8 ,0 0 0 2 7 最大的运行时库2 7 4 ,0 0 0 ( j a v a ) 最小的运行时库8 , 2 0 0 ( o b j c ) 中等的运行时库1 1 ,0 0 0 ( f 7 7 ) 合计1 , 6 3 9 0 0 0 浙江人学颂i 等:位论文g c c 编译系统结构分析1 j 后端移植实践 3 g c c 编译器结构以及流程 本节首先将g c c 放在g n u 丌发工具链中考查它的核心地位,然后依次深入, 从g c c 编译器的框架结构,编译流程,一直到编译器中的重要模块分析。试图 提供一个g c c 编译器全景。 3 1 g n u 工具链中的g c c 首先,简要的回顾一下在嵌入式系统开发中编译器是如何工作的。通常我们 为了从源代码得到可执行文件需要通过如下几步:预处理,编译,汇编,连接( 以 c 语言为例) 。如图所示 图1g c c 工具链过程 下面对g n u 工具链的几个主要成员做一介绍 c p p 是c 预处理器。c 语言预处理器是一个相当简单的工具。它删除了所有 的源代码中的注释,然后执行所有的在第- - n 有一个# 号的行中的命令。也就是 说,当我们在一个源文件中有这样样i n d l u c e 的标记,它会处理将气候跟随的头文 件包含在其中,同时它也会处理条件,比如# i f , 也会扩展用在这个c 源文件中的 宏。c 语言预处理器的输出还是一个c 源代码,但是已经没有注释,和所有的预 处理指示符。除了c 语言之外的大多数的语言都没有预处理器。 e e l 是实际上的c 编译器,负责实际上的c 源代码到汇编代码的翻译,然后 才由汇编器进一步的将汇编代码翻译成目标代码。有一些编译器具有一个集成的 汇编器,也就是说他们略过了汇编源代码,而是直接编译成为二进制目标代码, 而c o l 生成的仅仅是目标平台相关的汇编代码。 g n u a s 本来仅仅作为编译遍中的一个功能,现在它也可以用作源代码层次 上的汇编器。当用作源代码层次上的汇编器时,它有一个称为g a s p 的汇编预处 理器。g a s 从汇编代码生成可重定位目标文件。可重定位意味这这里没有代码 9 浙江人学坝i j 学位论立 g c c 编译系统结构分析i j 后端移植实践 是通过绝对地址来进行寻址的,而是相反,如果必须由一个绝对的地址,那么这 单会有一个标记,那个标记将会被连接器的实际地址所代替。目标代码文件包含 一个外部符号输出的表,可以被其他二进制文件所使用,而没有被定义的符号需 要在其他的目标文件中被定义。目标代码包括应用程序的可执行部分,以及调试 信息。 l d 的任务时解析地址和符号到确定的地方,以得到一个完整的映象。实际 上l d 具有两种功能,一是连接器( l i n k e r ) ,它的输出还是一个可重定位文件。 但是通过连接,将所有的二进制代码集成到一个文件中,用地址替代符号标记, 将函数调用和符号访问链接到其他的二进制文件中去,以得到一个实际的符号定 义。这些目标文件中的一些可能是从一些外部的库中取得的,比如说c 函数库, 数学库等等:二是作为定址器( r e l o c a t e r ) ,根据用户给出目标系统内存大小以及 内存映射,将可重定位文件的地址变成绝对地址,这样才可以将代码烧入r o m 。 尽管有一些r t 0 s 使用可重定位目标文件格式,比如a o u t ,但是对于大多数嵌 入式系统因为没有底层平台载入器( 1 0 a d e r ) ,代码直接需要被定位到绝对地址。 这是嵌入式系统软件开发和应用程序软件开发区别最大的个地方。 n e w l i b 库,标准c 库函数,数学库,以及一些板级支持代码库。 o b j c o p y 负责将得到的可执行文件转化成为m o t o r o l as r e c o r d 格式的文件以 烧入r o m 。并不是所有的开发平台上都有必要做这一步,有一些存在r o m 监 控器的设备可以直接加载可执行文件。 g d b 负责程序调试工作。g d b 远程调试有多种模式,但是基本上每一种模 式都会有部分代码( 称为存根s t u b ) 需要在目标机器上运行以建立主机与目标平 台之间的通信联系。 最后上面的所有工具都是通过g e e 这样一个编译驱动程序来调用完成的。它 完成如下动作: l ,解释命令行参数。 2 ,从选项中确定文件名。 3 ,考虑文件名的主要内容,哪一种语言的编译器被调用,或者要运行哪一 些工具程序。比如链接器,或者预处理器,运行的参数是什么,然后实 际的运行他们。它会为各个过程格式化命令行参数,然后传递给他们。 一般g c c 用于最后的连接阶段的命令行都有l d 连接缺省的启动代码和额 外的库,在嵌入式环境中则是一个需要定制的部分。 对于c 语言而言,它的工作过程是这样的: 当我们输入g c c 一0 2 - d a m a c r o = 4 1a f l i e c - ot h e _ p r o g r a m ”的编译命令 来产生一个可执行文件的时候,真正做的工作是这样的: j 0 浙江人学坝1 学位论文 g c c 编译系统结构分析,后端移植实践 图2 g c c 编译流程 值得一提的是,上图中汇编器,连接器,在定义了相同的输出接口的情况下 是可以替换成系统提供的汇编器和连接器。 g c c 提供了一系列选项,实际上可以控制编译过程中各个工具的行为,就像 上图中显示的,g c c 并不直接处理选项,而是根据分析将选项传递给能够接受它 的工具,当然也有一些选项可以用来控制g c c 最后做到哪一步,下面就是介绍一 些的选项: 1 ,e :输出预处理结果,通过这个选项,可以清楚的看到预处理器的功能。 2 ,g ;在可执行文件中输出调试信息,通常是为调试器g d b 所用。 3 ,0 0 0 1 :定义了不同级别的优化选项,实际上具有更细粒度的选项可 以控制编译器在编译过程中的优化,是否需要优化,使用哪一种优化方 法来进行优化。在后文中我们可以看到。一般如果没有给出这个选项的 话,缺省是0 1 4 ,x l a n g u a g e指定输入文件的语言,通常情况下g e e 可以根据文件扩展 名来获得关于输入文件语言的信息。这里可以指定。比如说,可以这样 编译j a v a 程序:g e e - xj a v at e s t j a v a 。 5 ,s :输出汇编语言,这也是一个常用的选项,尤其在嵌入式系统软件开 发过程中,可能需要手工处理代码,进行优化处理。 6 。m + :某一些c p u 可能具有一些特别的处理,这个选项就是用来为这 些c p u 指定的。比如说:g e e - m 6 8 0 0 0t e s t e 或者g e e - m c p u = i 6 8 6 t e s t c 7 ,i d i r :指定头文件搜寻目录,g c c 按照它的约定顺序在一些目录中来搜寻 头文件,这个选项给予指定。比如:g c c - i h o m e p s c h e n i n c l u d e t e s t c 8 ,l d i r :指定在目录中需要搜寻的库。 9 ,d a :输出所有的r t l 文件,代码优化过程中,都是在对代码的中间表 示进行处理,r t l 就是一种g c c 内部用来作为中间便是的语言。通过这 个选项,可以看到每一步优化的结果。 下文中如果没有特别指定,提到g c c 编译器,所指即是在编译系统中负责 浙江人学坝i :学位论文 g c c 编译系统结杠j 分析j 后端移植实践 将源语言代码转化成目标机器汇编代码的工具。 3 2 g c c 的结构 g c c 是一个典型的现代优化编译器。从技术上来讲,是一个语法制导,一遍 优化编译器。它具有这样的结构: 图3 g c c 编译器结构 前端通过词法分析,语法分析,语义分析,生成分析树,分析树进行简单的 优化之后,转化成为中间代码,对中间代码进行优化过以后,生成汇编。作为一 个支持多语言的编译器,对于不同的语言,g c c 中存在有不同的前端,他们以 树作为前端的接口。而作为支持多目标平台的编译器,不同目标平台的代码生成 器是在构造编译器的时候生成的。上图显示了经过配置构造得到的编译器处理源 程序的各个模块的功能。各个模块功能如下所述: 1 ,词法分析模块:负责在输入流中分离记号并且决定他们的类和表示, 可以手工生成或者由词法分析程序生成器根据记号描述定义生成。 2 ,语法分析模块:负责将记号流转化成抽象语法树( a s t ) 。语法分析 模块同样可以手工生成,或者由语法分析程序生成器根据语法规则定 义生成。 3 ,语义分析模块:从程序的不同地方收集上下文信息,并且用收集到的 结果对抽象语法树进行注释。而这些注释随后被用来执行上下文检验 或者传递给后继模块。最后生成分析树。 4 ,分析树优化模块:对源程序作基本的优化。对于某一些优化而言,分 析树的结构处理可能更加方便。下文中有更详细的信息。 5 ,r t l 生成模块:负责将分析树中语言特定的结构翻译称为更加一般的 结构,这些一般的结构构成中间代码表示。r t l 语言是g c c 中定义 的语言。它的结构是一种层次的结构,因此它在从分析树的转化中比 2 浙江人学硕l 学位论文 g c c 编译系统结构分析与后端移植实践 较方便,同时也适合于最后生成对应的目标机器指令。r t l 语言是 g c c 编译器后端的核心。 6 , r t l 优化模块:负责对程序执行效率或者占用空问大小进行优化。这 是编译程序中非常重要的一部分。g c c 中所有的优化功能几乎都集 中在r t l 表达式上,r t l 对于代码重用有很大的贡献。 7 , 代码生成模块:负责将中间代码表示转化成为目标机器对应的指令, 这里指汇编代码。 上图中没有指出的两个模块:错误处理模块和符号表处理模块,顾名思义, 负责错误处理以及符号表管理,它几乎要被其他所有的模块所调用。 编译系统前端是语言相关的,后端是目标机器相关的。g c c 为前端不同的语 言定义连接接口,为后端不同的目标体系结构定义了机器描述的扩展机制。在后 面的两个章节中,将重点讨论这两个问题。而支持多语言,多目标机器的编译系 统的根本基础是引入了两种中间表示:前端的树作为高层的中间表示,接近于语 言的各种基本构造;后端r t l 作为中层以及底层的中间表示,用来处理优化, 定义机器模型,以及代码生成。 3 3 g c c 主体的编译流程与相关模块 根据g c c 中程序语义的转化过程,通过简化上面的结构图,g c c 的编译流 程可以大略的分为这样几个步骤。 图4 编译流程的的程序语义转换 第一步,从高级语言源代码到树的转换是分别在语言相关的语言前端中完成 的,不同的语言有不同的处理方式,g c c 提供接口以及整合方式将前端同g c c 的编译器主体连接起来。这部分是本文第四章的重点内容。这里仅仅做一介绍。 第二步,树结构的优化,编译器的部分优化技术在树这样一个和高级语言比 较接近的中间表示上进行比在低级中间表示上进行处理器来方便。这里面大部分 是通用的,独立的语言前端可能引入不同的做法。这是本章介绍的内容。 第三步,树结构转化成为r t l 。从高层的中间表示转化成为中层以及底层的 中间表示。g c c 提供了对于大多数语言构造的适用的r t l 生成函数,语言前端 可以调用;同时,g c c 也提供机会,语言独立的前端可以针对语言独特的构造 直接自行生成r t l 表达式。这也是本章的内容。 浙江人学颅i :学位论文 g c c 编洋系统结构分析1 j 后端移槽实践 第四步,r t l 表示之间的转化。这罩是g c c 编译器的重点所在,这里所有 的优化算法都是公用的,这是g c c 真正吸引人的地方。通过在r t l 表达式上进 行优化处理,从而将优化算法同具体的体系结构隔离来开,起到代码重用的效果。 另一方面,也是g c c 性能问题的一个来源,基于公用的优化算法针对具体的体 系结构而占总有不能完全发挥特定处理器性能的地方。这个也是本章主要关注的 内容。实际上优化过程并不完全脱离了体系结构进行的,在第五章,将会看到 机器描述信息如何在编译的较早阶段介入流程的。 第五步,r t l 到汇编代码的转化过程。在r t l 的最后表达形式上,每一条 表达式基本上同汇编代码具有一一对应的关系。因此这一步的处理相对简单。而 这早i n s n 对于指令的对应关系来源于g c c 对于机器描述的约定。因此这里的部 分内容是第五章的内容。 下面来看一下g c c 的编译流程以及简单的介绍一下每一个流程所涉及的文 件模块。 g c c 源代码编译后会生成两个主要的可执行文件,一个是g e e ,另外一个是 e e l ( 以c 语言为例) 。如前所述,c c l 的等价物是本文讨论的核心内容。 e e l ( 或者其他编译器比如说g + + ) 对应的m a i n ( ) 匪l 数在文件g e e m a i n c 文件 中。这个文件只是一个简单的m a i n ( ) 酲i 数,直接调用g c c t o p l e v e 中的t o p l e v _ m a i n 0 函数。t o p l e v e 是实际上的编译器顶层模块。编译器所有的控制结构都在t o p l e v c 文件中,这个文件负责初始化,解码参数,打开关闭文件以及随后几个阶段的处 理。t o p l e v c 采用回调的机制,调用语言前端进行分析处理。 对于每一个完整的输入,分析阶段只调用一次。然后每次对每一个函数输入 生成一个顶层的树表示。这个树表示随后转化成为r t l 中问代码,并对中间代 码进行处理。从树的表示转化成为r t l 表示涉及下面这些文件e x p r e ,e x p m e d c 和s t r u t e 。出于内联处理以及其他的一些考虑,树被转化成r t l 的处理的顺序并 不一定和它从输入生成的顺序一致。 每次分析过程读到一个完整的函数定义或者顶层的声明,它就调用t o p l e v c 中r e s to f或者 函数。这两个函数负责处理_ c o m p i l a t i o n r e s to fd e c lc o m p i l a t i o n 所有后继的工作,直到输出汇编语言代码。所有分析阶段之后其他编译阶段的工 作,都在r e s to fc o m p i l a t i o n 函数中。当这个r e s to fc o m p i l a t i o n 函数处理完一个 完整函数的定义,返回时,所有为了处理这个函数而申请的内存空间就完全被释 放,除非这是一个内联函数,或者出于其他的原因而被延迟( 比方说在处理 t e m p l a t e 的时候) 。( 参见u s i n gt h eg n uc o m p i l e rc o l l e c t i o ng c c 中a n i n l i n e f u n c t i o n i s a s f a s ta s a m a e r o ) 这里一个编译器处理过程的阶段列表,他们所涉及的文件,以及在那一个阶 段通过d 选项可以导出调试信息。 浙江人学坝i 学位论史g c c 编译系统结构分析j 后端移植实践 1 ,分析: 这个过程读入函数定义的完整文本,构造一个高级的树表示。( 由于语义分 析同时也包含在这个阶段中间,所以这里的分析阶段含义区别于一般意义上的分 析) 。 树表示并不完全符合c 的语义,因为它也用来支持其他语言。 语言相关的数据类型分析也是在这个过程中进行的,每一个表示一个表达式 的树节点都有一个相关的数据类型。变量用声明节点的形式来表示。 从细节上来讲,这个阶段实际上包含了多个部分:词法分析,语法分析,语 义分析,以及最终的分析树生成。 主要涉及的模块包括: 1 ,g c c 主体文件:t r e e c ,f o l d c o n s t c s t o r - l a y o u t c ,t r e e h ,t r e e d e f 。这里 的几个文件都相当重要。在后文中有较详细的解释。 2 ,语言相关的模块,g c c 针对不同语言约定了存放目录。比如a d a 语言 对应a d a 目录,o b j e c t i v ec 语言对应o b j c 目录,而c + + 语言对应的目录 则是c p 。 c 语言可能由于是第一个g c c 支持的源语言,它相关的源代码主要在 g c c 的顶层目录下面。c 语言的预处理,为语言前端所用,在c p p l i b 中 执行,这部分内容在另外的文档中,特别的其内部机制在c p p l i b i n t e r n a l s 的c p p l i bi n t e r n a l s 一节中有解释。分析c 语言所涉及的源文件主要是下 面这些,它们都在顶层的目录中,而且按照约定都以c 开头。这些文件 中的几个也用于处理和c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年文化创意产业发展规划师资格认证考试试卷及答案
- 2025年文化产业规划设计师资格考试试卷及答案
- 2025年温泉理疗师执业考核试题及答案
- 2025年网页设计师职业技能认证考试试题及答案
- 难度偏高的高考数学试卷
- 2025年复配色粉项目发展计划
- 莆田一检数学试卷
- 庐山区中考一模数学试卷
- 龙港列宁小学数学试卷
- 期末最难数学试卷
- 慢性疾病管理与健康指导手册
- 直播带货平台合作协议范本
- 2025年高中音乐教师招聘考试测试题及参考答案
- 主持人基础知识培训课件
- 《新锅规》锅炉产品合格证
- 医院产后出血的应急演练脚本
- 中药熏洗法操作评分标准与流程
- 光伏发电项目监理工作制度
- GB∕T 25119-2021 轨道交通 机车车辆电子装置
- 监理平行检查方案
- 喷塑工序作业指导书(最新)
评论
0/150
提交评论