APP下载

基于GCC的cmdsp2f01编译工具移植开发

2018-01-23张梅娟

电子与封装 2018年1期
关键词:编译器套件寄存器

张梅娟,张 荣,张 铆,韦 祎

(中国电子科技集团公司第五十八研究所,江苏无锡 214072)

1 引言

编译工具是指一组编译套件,实现把某种编程语言编写的代码转变成另一种计算机语言的功能。编译技术是计算机领域的关键技术之一,随计算机语言和处理器体系结构的发展而发展,目前计算机系统高级语言已几乎完全代替了汇编语言。常用的编译工具包含了高级语言编译器(C/C++等)、汇编器、链接器和其他二进制工具。

高级语言编译工具是一个大型系统软件,开发难度较大,最早期的高级语言编译工具共花费了18人/年的时间[1]。研究者们经过几十年的不懈努力,在编译理论、技术和实验上积累了丰富的成果[2,3,4]。随着嵌入式系统的发展和高性能体系结构的出现,编译工具的开发速度和质量有了更高的要求,推动了可重定向编译系统的研究,逐步将与高级语言相关的词法语法分析模块设计成可复用的前端,机器相关的部分被封装起来,前端通过间接调用的方式与机器相关的部分发生关系。如图1所示,针对不同处理器,只需要进行目标机器信息的描述(即编译工具的移植),即可快速生成一套编译工具。这大大减小了编译工具的开发难度和开发时间。

图1 可重定向编译系统

可重定向编译系统结构定义良好,针对不同的后端,前端代码基本上不用修改,做到了最大限度的代码复用。但是前端只进行了一些通用的代码优化,没有做与目标机相关的优化,运行效率有一定的提升空间。

GCC(GNU Compiler Collection,GNU 编译器套件),是一套以GPL及LGPL许可证所发行的自由软件,是可重定向编译系统的代表,常被认为是跨平台编译工具移植的事实标准。该系统在所有平台上都能使用同一个前端处理程序,产生相同的中间代码,因此在不同平台上,使用GCC系统移植编译工具,不仅可以保证编译工具的性能质量,还能缩短开发周期[5]。但是嵌入式处理器体系结构一般都不规则,对代码质量要求严格,必须对编译系统的前端和后端进行针对性的优化设计才能满足要求,因此移植具有其特殊的难度和复杂性[6]。

本文基于可重定向的GCC编译系统的移植,成功构建了cmdsp2f01处理器的编译工具套件,经测试验证,编译工具套件编译功能正确。

2 cmdsp2f01结构

编译工具的移植,需要描述目标机器信息。cmdsp2f01是中国电科第58所开发的一款高性能DSP芯片,该芯片处理器采用超长指令字(VLIW)架构,支持单周期5条指令并行执行,支持单指令多数据流(SIMD),使数据处理并行度更高,128 bit程序总线,双256 bit数据总线,具备单精度浮点运算,支持16 bit、24 bit指令编码。其内部流水线支持7级,运算能力达12.8 GMACs。

cmdsp2f01的DSP内核架构支持1字节、2字节和4字节数据格式,另支持32 bit单精度浮点数据格式和40 bit累加器值(MAC16时使用)。所有存储在内存的数据CPU都是字节寻址,字节顺序固定为小端模式,即0字节是最低有效位字节。核指令基于32 bit虚拟和物理内存寻址,指令和数据寻址可达4 GB寻址空间。寻址方式支持寄存器加立即数寻址。

图2 处理器架构信息

如图2所示,cmdsp2f01 DSP除支持通用运算和存取指令外,还增加了专用定点矢量指令。其中,通用指令包含Move指令、加减指令、乘加指令、比较指令、分支指令、地址运算指令和存取指令。

3 移植设计

本文所述的编译工具是指一组编译套件,含C编译器和汇编器、链接器等二进制工具集。移植的主要任务是目标机器信息的描述。GCC系统中,机器信息的描述主要采用寄存器转换语言RTL(Register Transfer Language)语言实现,辅助以C接口函数(API)的设计。RTL中间表作为GCC C编译器后端的核心内容,将后端中可重用的部分剥离出来,再通过相应的接口为不同的目标机器定义各自的映射规则,这种方式极大地提高了GCC的适应性,也增强了它的可维护性、可扩展性以及可移植性[7]。

本文的移植是结合cmdsp2f01处理器特点,对机器描述进行设计和实现,构建一套新的编译工具。编译工具套件基本功能如下:

(1)C编译器(C-Compiler),将C语言程序代码编译成cmdsp2f01处理器对应的汇编代码,编译器包括外壳程序(shell program)、优化器和预处理器;

(2)汇编器(Assembler),把汇编语言源文件转换成基于公用目标文件(ELF)的机器目标文件,也就是常用的*.out文件;

(3)链接器(Linker),把多个目标文件组合成单个可执行目标模块,除了能够创建可执行文件外,还可以调整外部符号的引用,链接器输入的是可重定位的目标文件和目标文件库;

(4)归档器(archiver),允许用户将一组文件收集到一个归档文件中,也叫归档库,其最常见的用法是创建目标文件库,也可以通过删除、替换、提取或添加文件操作来调整库;

(5)Objdump,用来查看目标程序中的段信息和调试信息,也可以用来对目标程序进行反汇编;

(6)Objcopy,用来拷贝或是翻译目标文件;

(7)Nm,列出目标文件、库或是可执行文件中的代码符号及代码符号所对应的程序开始地址;

(8)Size,显示程序文件的段信息。

3.1 移植思路

编译工具包含C/C++编译器及二进制工具集(汇编、链接等工具),需要分别基于两套代码系统进行移植。GCC是高级语言编译器相关的工具代码,移植后可生成预处理器、高级语言编译器等工具,binutils是二进制工具集代码,移植后可生成汇编器、链接器、反汇编器等二进制工具。

通常在编译过程中所使用的GCC是一个驱动程序,在实际执行编译的过程中将根据输入的命令参数,调用不同的程序(包括预处理器、编译器、汇编器以及链接器等)进行分析处理,实现对整个编译过程的控制。

编译工具移植实现步骤如下:

(1)移植环境准备(源代码获取、移植环境选择);

(2)分析处理器结构及指令特点,进行目标机信息的描述;

(3)构建编译工具;

(4)测试验证编译工具。

3.2 移植实现过程

GCC几乎可以运行在所有操作系统平台上,如GNU/Linux、其他自由软件平台(BSD系列)等。通过Cygwin(或MinGW)工具,GCC也可以运行在MS DOS、MS Windows多个版本的平台上。本文移植工作主机系统选择Windows平台,采用Cygwin作为虚拟环境。必要的源代码包括gcc-5.2.0、二进制工具源代码binutils-2.23.1。代码阅读使用Source Insight3.5工具。

3.2.1 编译器代码移植

代码移植就是在GCC框架内添加目标机器信息的描述,在./gcc-5.2.0/gcc/路径中创建target文件夹,并在该文件夹中创建机器描述文件(如target.c、target.h、target.md等文件)。target.h定义大小端、指令类型、数据类型及字长、内存边界及对齐、寻址模式类型、标准寄存器的分配等信息。

cmdsp2f01处理器有16个32位通用地址寄存器,分别为a0~a15。设计 a1用作栈指针sp,a2~a7用于函数调用处理。处理器寄存器信息定义如图3所示。

target.c文件中定义一些API接口函数,供target.md描述指令时使用。如图4所示,在target.c文件中定义有符号8位立即数。

在target.md中描述加法操作数时引用该接口函数,加法操作数详细描述方法如图5所示。

target.md文件中,使用RTL语言对机器指令特点进行描述,描述语句遵循RTL语言规则。处理器支持5种加法类型指令,16位寄存器寻址加法指令add.n,16位立即数寻址加法指令,24位寄存器寻址加法指令add,24位立即数寻址加法指令addi,24位立即数寻址加法指令addmi,立即数寻址时左移8位。加法指令的描述如图6所示。

图3 target.h文件内容摘要

图4 8位立即数API定义

图5 加法操作数定义

图6 加法指令描述

3.2.2 编译器构建过程

gcc-5.2.0版本的编译需要mpc的支持,而mpc又依赖于gmp和mpfr库,因此需要从官网上下载源代码mpc-0.8.1、gmp-4.3.2、mpfr-2.4.2。分别安装3个库,由于库之间有依赖关系,库的安装有先后顺序,安装顺序为gmp/mpfr/mpc。3个库安装在默认库的路径下(./usr/lib)。

GCC构建时,按照configure/make的步骤,详细步骤如下:

构建好的工具在路径./usr/local/bin下。

3.2.3 二进制代码构建

在../Binutils-2.23.1/include/路径下,创建文件target-isa.h进行处理器架构宏定义。在../Binutils-2.23.1/gas/config路径下,创建target.c和target.h指令集描述文件,实现对指令集的映射。构建过程与GCC构建过程类似,配置选项相对简单很多。

3.3 应用验证

编译工具本身结构复杂,进行全面的测试比较困难。编译工具的测试与其他类型软件的测试一样,同样分为黑盒测试与白盒测试。在实际工程应用中,通常以黑盒测试为主,以白盒测试为辅[8]。黑盒测试具体是提供测试用例,将产生的结果与预期结果进行比较,测试用例的设计和选择尤为重要。为了避免测试用例受到开发人员经验、偏好等因素的影响,本文选择处理器性能评价标准程序为测试用例,对本文构建的编译工具进行测试验证。黑盒测试流程如图7所示。

表1 标准benchmark测试程序

测试程序执行如图8所示的自定义makefile文件后,输出编译中间结果及最终可执行二进制文件。使用移植后的gdb加载运行后,执行结果与VS2008下编译程序执行的结果比较,结果正确无误。

白盒测试,C语言编译器输出汇编代码,编写简单的C源代码如图9 a.c文件,执行taret-gcc5.2.0.exe-S a.c-o a.S命令后,输出相应汇编代码,如图9所示。加法操作被翻译为16位寄存器寻址的加法指令add.n。常量数据放入特定的数据段.literal,每个变量定义了地址标号,便于立即寻址。

图7 黑盒测试流程

图8 自定义makefile文件

图9 C语言编译结果

4 结束语

本文基于GCC,针对特定目标处理器实现了编译工具的移植,全面描述了编译工具移植的实施流程,针对目标处理器架构特点,设计了机器描述文件内容,成功构建了特定处理器的编译工具套件,并对工具套件进行了功能验证。本文描述的技术同样可用于其他处理器架构编译工具的移植开发,可节省开发调试时间。

[1]Backus,J W,R J Beeber,S Best,et al.The Fortran automatic coding system[C].Western Joint Computer Conference,1957:188-198.

[2]Appel A W,Palsberg J.Modern Compiler Implementation in Java[M].Cambridge University Press,second edition,2002.

[3]Aho A V,Sethi R,Ullman JD.Compilers Principles,Techniques,and Tools[M].Person Education,1986.

[4]Muchnick S S.Advanced Compiler Design and Implementation[M].San Francisco,California:Morgan Kaufmann,1997.

[5]Wang Xiaowei,Wang Kuixing,Yang Quansheng.Research and DevelopmentofCompilerBased on GCC[C].CSIE 2011,LNEE 126:809-814.

[6]Rainer Leupers,Peter Marwedel.Retargetable compiler technology for embeded systems,tools and applications[M].Kluwer Academic Publishers,October 2001.

[7]石博慧,陈英.GCC代码优化技术研究[J].微机发展,2004(8):67-70.

[8]陈慈勇.基于GCC的交叉编译器移植开发及其测试方案的设计研究[D].厦门,2011:67.

猜你喜欢

编译器套件寄存器
STM32和51单片机寄存器映射原理异同分析
基于维修费用的关键部套件分析
Lite寄存器模型的设计与实现
“龙吟套件”创作感悟
基于相异编译器的安全计算机平台交叉编译环境设计
工业照明超频三天棚灯套件改造工程
CSRmesh开发套件加速物联网产品开发
通用NC代码编译器的设计与实现
高速数模转换器AD9779/AD9788的应用
一种可重构线性反馈移位寄存器设计