用于实现有双端序能力的编译器的方法和装置的制作方法

文档序号:6553287阅读:115来源:国知局
专利名称:用于实现有双端序能力的编译器的方法和装置的制作方法
用于实现有双端序能力的编译器的方法和装置
领域
本发明的实施例涉及编译器。本发明的实施例尤其涉及用于实现具有双端序
(bi-endian)功能的编译器的方法和装置。 背景
字节端序(endianess)是在其中数据存储和数据检索支持多种存取大小的一 种数据存储和检索属性。较细粒度存取允许程序员了解较大型存取在存储器内存储 字节的顺序。大尾端(bigendian)数据以与小尾端(littleendian)数据相反的字节 顺序被存储在存储器中。小尾端数据以其最低有效字节在最低存储器字节地址内来 存储(从左向右存储)。而大尾端数据以其最高有效字节在最低存储器字节地址内 来存储(从右向左存储)。具有相同值的大尾端和小尾端变量在CUP寄存器内是 相等的,但是在存储器内具有不同的顺序。
使 用一种字节端序约定编写的源代码在未识别某些数据是如何存储在存储器 内的不同顺序的情况下是无法在使用另一种字节端序约定的平台或目标系统上执 行的。例如,为保存正确的软件行为,当共用体或指针存取可能会使得这一顺序对 程序员可见时必须保存数据内的端序字节顺序。同时还需保存超出程序范围写入或 读取的数据的字节顺序。
在过去,某些平台被配置为带有可被置位以支持用一种或其他字节端序约定 编写的源代码的执行的模式位。然而这种方法对正在平台上运行的所有代码都给予 支持,从而无法解决在小尾端操作系统上运行大尾端程序的问题。
于是,需要一种用于在一种端序约定的计算机系统平台上执行以一不同的端 序约定编写的代码的高效且有效的方法和装置。
附图简述
本发明各实施例的特征和优点以示例的方式示出,但是并不旨在将本发明实 施例的范围限于所示的具体实施例。


图1是在其中可实现本发明实施例的示例性计算机系统的框图。 图2是示出了根据本发明一个示例实施例的有双端序能力的编译器的框图。
图3是根据本发明一个示例实施例的用于在编译代码时促进双端序支持的方 法的流程图。
图4是根据本发明一个示例实施例的使用隐式声明向数据分配端序类型的方 法的流程图。
图5是根据本发明一个示例实施例的使用显式声明向数据分配端序类型的方 法的流程图。
图6是根据本发明一个示例实施例的使用隐式和显式声明向数据分配端序类 型的方法的流程图。
图7 ^^出了根据本发明一个示例实施例的使用隐式声明将端序类型与数据相 关联的一个示例。
详细描述
在随后的描述中,为了解释将阐明许多具体的术语以提供对本发明实施例的 透彻理解。然而本领域普通技术人员应该理解,无需说明书中这些具体细节也可以 实践本发明的实施例。在其他实例中,以框图的形式示出了公知的组件、程序和过 程以免淡化本发明的主题。
图1是根据本发明一个实施例的示例性计算机系统100的框图。计算机系统 100包括处理数据信号的处理器101以及存储器113。计算机系统.100可以是其中 处理器101在最低地址处存储一数字的低位字节而在最高地址处存储该数字的髙 位字节(小尾端约定),或者在最低地址处存储一数字的高位字节而在最高地址处 存储该数字的低位字节(大尾端约定)的大尾端型或者小尾端型。
处理器101可以是复杂指令集计算机微处理器、精简指令集计算机微处理器、 超长指令字微处理器、实现指令集组合的处理器或其他处理器设备。图1示出了带 有单个处理器的计算机系统100。然而应该理解,计算机系统IOO可用多个处理器
来操作。此外,这一个或多个处理器中的每个处理器都可以支持一个或多个硬件线
程。处理器101耦合至在处理器101和计算机系统100内的其他组件之间传送数据 信号的CPU总线110。
存储器113可以是动态随机存取存储器设备、静态随机存取存储器设备、只 读存储器和/或其他的存储器设备。存储器113可以存储由数据信号表示并可由处
理器101执行的指令和代码。根据计算机系统100的一个示例实施例,有双端序能
力的编译器可以被存储在存储器113内并且可由计算机系统100内的处理器101 实现以在编译软件时提供双端序支持。通过在存储之前执行端序翻转(字节交换) 操作,通常以小尾端顺序存储在存储器113内的数据能以大尾端顺序来存储,反之 亦然。该值可通过在检索存储器113之后执行端序翻转操作来检索。应该认识到, 可以为对准或未对准引用而在写入数据之前(预写入)和读取数据之后(后读取) 执行端序翻转操作。端序翻转操作可以使用单独的指令、单独的机器操作或者一特 定加载或存储操作的副作用来实现。
高速缓冲存储器102位于处理器101内,它存储被存储在存储器113.内的数 据信号。高速缓存102利用其存取位置来加速处理器101对存储器的存取。在计算 机系统100的另一实施例中,高速缓存102位于处理器101外部。桥存储器控制器 111耦合至CPU总线110和存储器113。桥存储器控制器lll在处理器101、存储 器113和计算机系统100内的其他组件之间定向数据信号并在CPU总线110、存 储器113和第一 10总线120之间桥接数据信号。
第一10总线120可以是单根总线或者是多根总线的组合。第一 10总线120 提供计算机系统100内各组件之间的通信链路。网络控制器121耦合至第一 10总 线120。网络控制器121可以将计算机系统IOO链接至计算机网络(未示出)并支 持机器间的通信。显示设备控制器122耦合至第一IO总线120。显示设备控制器 122允许显示设备(未示出)与计算机系统IOO的耦合并起到显示设备和计算机系 统100之间接口的作用。
第二 10总线130可以是单根总线或者是多根总线的组合。第二 10总线130 提供计算机系统100内各组件之间的通信链路。数据存储设备131耦合至第二 10 总线130。数据存储设备131可以是硬盘驱动器、软盘驱动器、CD-ROM设备、闪 存设备或其他大容量存储设备。输入接口 132耦合至第二IO总线130。输入接口 132例如可以是键盘和/或鼠标控制器或其他输入接口。输入接口 132可以是专用设 备或者可以位于诸如总线控制器或其他控制器等另一设备内。输入接口 132允许输 入设备与计算机系统100之间的耦合并将数据信号从输入设备传送至计算机系统 100。音频控制器133耦合至第二 10总线130。音频控制器133用以协调声音的记 录和播放并且也耦合至10总线130。总线桥123将第一 10总线120耦合至第二 10 总线130。总线桥123用以缓冲并桥接第一 IO总线120和第二 10总线130之间的 数据信号。
图2是示出了根据本发明一个示例实施例的有双端序能力的编译器200的框 图。有双端序能力的编译器200包括编译器管理器210。编译器管理器210接收源 代码以供编译。编译器管理器210与有双端序能力的编译器200内的其他组件接口 并在其间传送信息。
有双端序能力的编译器200包括前端单元220。根据有双端序能力的编译器 200的一个实施例,前端单元220用于对源代码进行语法分析并将其转换成抽象句 法树。前端单元220还可以为源代码内的数据分配端序类型。根据前端单元220 的第一实施例,将该源代码所起源的文件的特性与可具有相关联端序类型的隐式声 明准则相比较。该隐式声明准则例如可包括源代码起源的文件的位置,诸如路径名 或目录。隐式声明准则还可以包括目录内的文件的特性或其他信息。在此实施例中, 前端单元220基于与该隐式声明准则相关联的端序为源代码中的数据分配端序类 型。根据前端单元220的第二实施例,源代码内的数据可以与该声明内的端序类型 相关联。在此实施例中,前端单元120基于与该声明中其相关联的端序类型为数据 分配端序类型。应该认识到,前端单元220可以实现其中端序类型的显式声明优先 于与隐式声明准则相关联的端序的这两个实施例。源代码中的数据可以包括基本数 据类型,以及诸如数据结构和共用体等集合体。
有双端序能力的编译器200包括中间语言单元230。中间语言单元230把抽象 句法树转化为公共中间形式,诸如中间表示。有双端序能力的编译器230确定在中 间表示的哪里执行端序翻转操作并在这些位置处放置端序翻转操作符。根据有双端 序能力的编译器200的一个实施例,当一种端i^型的数据与艮标或平台系统的端 序类型不同时,在向目标或平台系统的存储器写入数据之前以及在从该存储器中读 取数据之后执行端序翻转。应该认识到,中间语言单元230可以将抽象句法树转化 成一个或多个公共中间形式。
有双端序能力的编译器200包括优化器单元240。优化器单元240包括公共子 表达式消除(CSE)单元241。 CSE单元241在确定数据的值未改变时消除冗余的 端序翻转操作并简化中间表示。优化器单元240包括代码移动单元242。代码移动 单元242在从性能的观点来看执行端序翻转操作更为高效时将端序翻转操作移至 一指令的较早部分。优化器单元240包括常数传播单元243。常数传播单元243在 从常数传播分析中确定数据的值未改变并由此无需从存储器的读取时消除对一常 数的端序翻转操作。
有双端序能力的编译器200包括代码生成器250。代码生成器250将中间表示
转换成机器码。根据有双端序能力的编译器200的一个实施例,代码生成器250 插入机器码指令以执行端序翻转操作。在一个实施例中,使用一个或多个BSWAP 和/或移位指令来实现该端序翻转操作。
根据有双端序能力的编译器200的一个实施例,可以如下示例所示地分解对 大尾端数据的操作。
extern int x; extern short
x++;
y++;
可以被翻译为 J X++
MOV EAX, x
BSWAP EAX
INC EAX
BSWAP EAX
MOV x, EAX
;y++
MOV AX, y
BSWAP EAX
SHR EAX, 16
INC EAX
BSWAP EAX
SHR EAX, 16
MOV y, AX
有双端序能力的编译器200包括寄存器分配器260。寄存器分配器260标识中 间表示中可以被存储在处理器的寄存器内而非存储器内的数据。寄存器分配器260 将寄存器分配给具有该计算机系统的端序类型的数据。
图3是根据本发明一个实施例用于在编译代码时促进双端序支持的方法的流 程图。在301处,将端序类型分配给数据。端序类型可以通过隐式声明、显式声明
或隐式和显式声明的组合被分配给数据。
在302处,确定是否要将数据从一种端序类型转换成另一种端序类型。根据
本发明的一个实施例,当一种端序类型的数据与目标或平台系统的端序类型不相同 时,在向该目标或平台系统的存储器写入数据之前以及在从该存储器中读取数据之 后执行端序翻转。端序翻转操作符可以被放置在中间语言中需要执行端序翻转操作 的各个位置处。
根据本发明的一个实施例,只为在大尾端和小尾端表示之间存在可能的语义 差异的数据插入端序翻转。这一情况例如可由编译器确定。在一个实施例中,非外 部的、易失性的或作为共同体一部分的且不具备由代码显式引用的地址的数据变量 在不对程序产生任何语义影响的情况下以任一表示来存储。可以执行进一步的分析 以进一步减少需要端序翻转的变量的类。在源和目的地的端序类型相同并且该操作 是其中端序表示无关紧要的操作,例如逐位布尔操作(与、或、异或、非)的情况 下,也可以消除端序翻转。
在303处,执行端序翻转的优化。优化可以涉及在执行代码时移动或消除端 序翻转操作以减少处理器循环。根据本发明的一个实施例,优化可以涉及在确定数 据的值未改变时消除冗余的端序翻转操作、在从性能的观点看来更为高效时将端序 翻转操作移至一指令流的较早或较晚部分、或执行其他过程。
在304处,将机器指令插入机器码中以实现端序翻转操作。根据其中端序翻 转操作翻转各字节以支持大尾端数据和小尾端数据之间的转换的本发明一个实施 例中,可以使用一个或多个BSWAP和/或移位指令。
在305处,执行寄存器分配。根据本发明的一个实施例,中间表示的数据被 标识为要存储在处理器的寄存器中而非存储器中。
图4是根据本发明的一个实施例使用隐式声明向数据分配端序类型的方法的 流程图。图4中示出的方法可以在图3中的301处实现。在401处,将要被编译代 码的文件的特性与隐式声明准则进行比较。隐式声明准则例如可包括诸如其路径或 目录名等文件的位置、该目录内另一文件的特性或其他准则。隐式声明准则可以具 有与其相关联的端序类型。
在402处,基于401处的比较将用于该代码内的所有数据的全局标志置位。 根据本发明的一个实施例,该全局标志可以是指示与该代码内的所有数据相关联的 端序类型的指示符。
在403处,对该代码内的数据进行语法分析并将上述全局标志分配给代码内
的数据。
如图4所示的隐式声明允许写在利用第一端序类型的第一目标或平台系统上 编写的软件在利用第二端序类型的第二目标或平台系统上被编译、链接或调试而无 需修改源代码。图4所示的实施例允许有双端序能力的编译器同时支持对于基础数 据字节的大尾端和小尾端类型排序。例如,如果隐式声明准则是与端序类型相关联 的路径名,则在具有该路径名的目录内的所有源文件都可以用相关联的端序类型来 编译。也可以实现其他隐式声明准则。例如,可以使用与待编译的文件共享同一目 录的文件的名字来关联端序类型。根据本发明的一个实施例,可以使用调用时对编 译器的命令来做出隐式声明准则与端序类型的关联。根据本发明的另一实施例,在 包括了源文件或头文件之前设置端序模式并在其后重置该端序模式的文件可以被 自动包括在关联内。应该认识到也可使用用于关联的其他过程。
图5是是根据本发明的一个实施例使用显式声明向数据分配端序类型的方法 的流程图。图5中示出的方法可以在图3中的301处实现。在501处,对要被编译 的代码内的数据进行语法分析。
在502处,确定一端序类型是否与该数据相关联。根据本发明的一个实施例, 可以检查数据声明的类型区分符、属性限定符或者可以指示与该数据相关联的端序 的其他标签。如果确定端序类型不与该数据相关联,则控制行进至503。如果确定 有一端序类型与该数据相关联,则控制行进至504。
在503处, 一标志被分配给该数据以指示默认端序类型。根据本发明的一个 实施例,一标志被分配给该数据以净旨示与该代码所起源的平台系统相对应的端序类 型、与该代码要在其上执行的平台系统相对应的端序类型或其他端序类型。
在504处, 一标志被分配给该数据以指示与声明中的数据相关联的端序类型。
如图5所示的显式声明允许编译器通过对源代码的显式修改来同时支持和处 理大尾端和小尾端类型。双端序支持允许大尾端软件和小尾端软件的集成。诸如整 数、指针、浮点和位字段之类的基础数据类型的实例可由类型区分符、属性限定符 或者其他标签技术关于其端序显式地限定。在缺乏显式声明的情况下,基础数据类
型的端序可以是编译器或其他组件的默认设置。显式声明的示例如下所示。
—big endian int i; /*大尾端整数*/
int* bigendianp; /*指向默认整数的大尾端指针*/
struct {littleendian inta; bigendian int b} c; /*双端序结构*/
union { little endian int 1; bigendian int b} d; /*双端序共用体*/
int il 一atribute ((bigendian)) /*显式声明端序属性的可选方法*/
图6是根据本发明的一个实施例使用隐式和显式声明向数据分配端序类型的 方法的流程图。图6中示出的方法可以在图3中的301处实现。在601处,将要编 译代码的文件的特性与隐式声明准则进行比较。隐式声明准则例如可包括诸如其路 径或目录名等文件的位置或者该目录内另一文件的特性。隐式声明准则可以具有与 其相关联的端序类型。
在602处,基于601处的比较将一全局标志置位。根据本发明的一个实施例, 该全局标志可以是指示与该代码内的所有数据相关联的端序类型的指示符。
在603处,对要代码内的数据进行语法分析。
在604处,确定一端序类型是否与该数据相关联。根据本发明的一个实施例, 可以检査数据声明的类型区分符、属性限定符或者可以指示与该数据相关联的端序 的其他标签。如果确定端序类型不与该数据相关联,则控制行进至605。如果确定 有一端序类型与该数据相关联,则控制行进至606。
在605处,该全局标志被分配给该代码内的数据。
在606处, 一标志被分配给该数据以指示与该声明内的数据相关联的端序类 型。第二标志也可以被分配给该数据以指示该端序类型是被显式确定的。
图3至图6是示出根据本发明实施例的方法的流程图。在这些图中示出的某 些技术和过程可以被顺序、并行或者以除所描述的顺序之外的其他顺序执行。应该 认识到,并不要求执行所描述的所有技术和过程,可以添加另外的技术和过程,并 且可以用其他技术和过程来代替某些示出的技术和过程。
图7示出了根据本发明的一个实施例使用隐式声明来将端序类型与数据相关 联的一个示例。在此示例中,隐式声明准则是要被编译的代码的位置。位置710 与大尾端的文件相关联。位置720与小尾端的文件相关联。位置710包括定义数据 结构tlbe和t2be的.h文件711。因为这两个数据结构都在位于具有大尾端类型关 联的位置内的.h文件中,所以两个数据结构tlbe和t2be都被分配了大尾端的端序 类型。位置720包括定义数据结构tlle和t21e的,h文件721。因为这两个数据结构 都在位于具有小尾端类型关联的位置内的.h文件中定义,所以这两个数据结构tlle 和t21e都被分配了大尾端的端序类型。
位置710包括声明变量及其相应的数据结构(如果有的话)的.c文件712。变 量vl和v3是大尾端的。变量v2和v4是小尾端的。位置720包括声明变量及其相
应的数据结构(如果有的话)的x文件722。变量v5和v8是小尾端的。变量v6 和v8是大尾端的。
参见.c文件712,注意到当大尾端的变量vl被置为小尾端的v2时,变量v2 从小尾端转换成大尾端。当大尾端的变量v3被置为小尾端的v4时,变量v4也从 小尾端转换成大尾端。
参见.c文件722,注意到当小尾端的变量v5被置为大尾端的v6时,变量v6 从大尾端转换成小尾端。当小尾端的变量v7被置为大尾端的v8时,变量v8也从 大尾端转换成小尾端。
本发明的实施例可以作为包括其上存储有指令的机器可读介质的计算机程序 产品或软件来提供。机器可读介质可用于对计算机系统或其他电子设备编程。机器 可读介质包括但不限于软盘、光盘、CD-ROM和磁光盘或适用于存储电子指令的 其他类型的媒体/机器可读介质。在此描述的技术不限于任何特定的软件配置。这 些技术可适用于任何计算或处理环境。在此使用的术语"计算机可读介质"应该包 括能够存储或编码一指令序列以供机器执行并使得该机器执行在此所述的任一方 法的任何介质。此外,在本领域中通常以不同的方式提及软件(例如,程序、过程、 进程、应用程序、模块、单元、逻辑等等)为采取某种行动或引起某种结果。这些 表述只是陈述由处理系统执行软件引发该处理器执行一动作从而产生一结果的简
易方式o
在本发明的前述说明书中已经参考其具体的示例性实施例做出了描述。然而 显而易见的是可以从中做出各种修改和改变而不背离本发胡实」施例的广义精神和 范围。因此,说明书和附图旨在说明而非限制。
权利要求
1.一种编译代码的方法,包括将一端序类型分配给数据;以及基于所述数据和目标系统的端序类型执行一端序翻转操作。
2. 如权利要求l所述的方法,其特征在于,还包括从所述代码内所述数据的声明中确定所述数据的端序类型。
3. 如权利要求l所述的方法,其特征在于,还包括基于隐式声明准则确定所 述数据的端序类型。
4. 如权利要求3所述的方法,其特征在于,所述隐式声明准则包括所述代码 的位置。
5. 如权利要求3所述的方法,其特征在于,所述隐式声明准则包括在带有所 述代码的目录中的文件的特性。
6. 如权利要求1所述的方法,其特征在于,执行所述端序翻转操作包括交换 对应于所述数据的字节。
7. 如权利要求6所述的方法,其特征在于,交换对应于所述数据的字节是在 向存储器中写入所述数据之前以及在从所述存储器中读取所述数据之后执行的。
8. 如权利要求6所述的方法,其特征在于,交换字节包括在机器码中插入一 个或多个机器指令。
9. 如权利要求8所述的方法,其特征在于,所述一个或多个机器指令包括 BSWAP指令。
10. 如权利要求1所述的方法,其特征在于,还包括在确定一公共子表达式 的存在时消除端序翻转操作。
11. 如权利要求1所述的方法,其特征在于,还包括将所述端序翻转操作移 至一指令流的较早部分。
12. —种含有包括了一指令序列的机器可访问介质的制品,所述指令序列包 括当被执行时使得所述机器执行以下动作的指令将一端序类型分配给数据;以及基于所述数据和目标系统的端序类型执行一端序翻转操作。
13. 如权利要求12所述的制品,其特征在于,还包括当被执行时还使得所述机器执行从代码内所述数据的声明中确定所述数据的端序类型的指令。
14. 如权利要求12所述的制品,其特征在于,还包括当被执行时还使得所述 机器执行基于隐式声明准则确定所述数据的端序类型的指令。
15. 如权利要求12所述的制品,其特征在于,执行所述端序翻转操作包括交换对应于所述数据的字节。
16. 如权利要求15所述的制品,其特征在于,交换对应于所述数据的字节是在向存储器中写入所述数据之前以及在从所述存储器中读取所述数据之后执行的。
17. 如权利要求15所述的制品,其特征在于,交换字节包括在机器码中插入一个或多个机器指令。
18. 如权利要求17所述的制品,其特征在于,所述一个或多个机器指令包括 BSWAP指令。
19. 一种编译器,包括 将一端序类型分配给数据的前端单元;以及基于所述数据的端序类型和目标系统的端序类型确定何时执行一端序翻转操 作的中间语言单元。
20. 如权利要求19所述的编译器,其特征在于,所述前端单元从代码内所述 数据的声明中确定所述数据的端序类型。
21. 如权利要求19所述的编译器,其特征在于,所述前端单元基于隐式声明 准则确定所述数据的端序类型。
22. 如权利要^U9皿的编译器,其特征在于,还包括在确定一公共子表达 式的存在时消除端序翻转操作的优化器单元。
23. 如权利要求19所述的编译器,其特征在于,还包括将端序翻转操作移至 一指令流的较早部分的优化器单元。
24. 如权利要求19所述的编译器,其特征在于,还包括插入一个或多个机器 指令允许所述端序翻转操作的代码生成器。
25. —种计算机系统,包括 存储器;以及实现一编译器的处理器,所述编译器具有将一端序类型分配给数据的前端单 元,以及基于所述数据的端序类型和目标系统的端序类型确定何时执行一端序翻转 操作的中间语言单元。
26. 如权利要求25所述的计算机系统,其特征在于,所述前端单元从代码内所述数据的声明中确定所述数据的端序类型。
27. 如权利要求25所述的计算机系统,其特征在于,所述前端单元基于隐式 声明准则确定所述数据的端序类型。
28. 如权利要求25所述的计算机系统,其特征在于,所述编译器还包括插入 一个或多个机器指令以允许所述端序翻转操作的代码生成器。
全文摘要
一种编译代码的方法包括将一端序类型分配给数据。基于该数据和目标系统的端序类型执行一端序翻转操作。描述并要求保护了其他实施例。
文档编号G06F9/45GK101160564SQ200580042563
公开日2008年4月9日 申请日期2005年12月9日 优先权日2004年12月13日
发明者M·阿迪莱塔, R·科什里斯, 休·威尔金森 申请人:英特尔公司;休·威尔金森
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1