CN102103481A - 字节序转换工具 - Google Patents
字节序转换工具 Download PDFInfo
- Publication number
- CN102103481A CN102103481A CN2010105980578A CN201010598057A CN102103481A CN 102103481 A CN102103481 A CN 102103481A CN 2010105980578 A CN2010105980578 A CN 2010105980578A CN 201010598057 A CN201010598057 A CN 201010598057A CN 102103481 A CN102103481 A CN 102103481A
- Authority
- CN
- China
- Prior art keywords
- variable
- byte
- pointer
- syllable sequence
- void
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/447—Target code generation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开了字节序转换工具。在本发明的一个实施例中,代码(例如编译器、工具)可以生成信息,因此包括第一字节序格式(例如大字节序)的指针值的第一代码部分能够被适当地初始化,并且在具有第二字节序格式(例如小字节序)的平台上被执行。而且,本发明的各种实施例可以识别代码(例如源代码)的有问题区域,其中特定字节顺序通过void指针而被抛弃。
Description
技术领域
本发明涉及字节序转换。
背景技术
字节序是数据存储和检索的属性。大字节序(endian)数据或变量可以以与小字节序数据或变量相反的字节顺序被存储在存储器中。小字节序数据可以以最低有效字节在最低的存储器字节地址中的方式被存储,而大字节序数据可以以最高有效字节在最低的存储器字节地址中的方式被存储。具有相同值的大和小字节序变量在CPU寄存器中可以是相同的,但是在存储器中可能具有不同顺序。
在没有识别一些数据以如何的不同顺序被存储在存储器中的情况下,使用一种字节序约定编写的源代码不可以在使用另一种字节序约定的平台上被执行。下面的C代码提供一个例子:
{
int i = 0x12345678;
char c = *((char*)&i);
}
如果该代码被编译并且在大字节序架构上运行,则“c”将是0x12,但是如果该代码被编译并且在小字节序架构上运行,则“c”将是0x78。因此,为了在另一种字节序约定的计算机系统平台上执行以一种字节序约定编写的代码,可能需要字节序转换。 当例如源代码包括union(联合)或者将第一指针(其指向由多个字节构成的数据)转换(cast)为第二指针(其指向由单个字节构成的数据)时,这会是困难的。指针会产生困难,因为一些双字节序编译器不追踪通过指针(例如void指针)的字节顺序,并且不产生对通过这样的指针的潜在字节顺序改变的诊断。因此,指针等会导致无法预料的字节顺序不相容性。
发明内容
根据本发明的第一方面,提供一种方法。所述方法包括:接收分别定义全局变量的第一和第二实例的第一和第二源代码部分,其中每个实例具有第一字节序格式并且这两个实例在编译时间都不能被完全地初始化;生成对字节交换指令的第一和第二引用,其被配置成分别将所述第一和第二实例转换成第二字节序格式;使用处理器来生成影子变量,所述影子变量被配置成在编译时间之后并且基于所述第一实例已经被字节交换来抑制所述第二实例的字节交换;以及将所述影子变量存储在耦合到所述处理器的存储器中。
根据本发明的第二方面,提供一种包括介质的物品。所述介质存储用于使基于处理器的系统能够执行以下操作的指令:接收分别定义全局变量的第一和第二实例的第一和第二代码部分,其中所述全局变量的每个实例具有第一字节序格式并且这两个实例在编译时间都不能被正确地初始化;以及生成第一变量,所述第一变量被配置成在编译时间之后并且基于所述第一实例已经被字节序转换来抑制所述第二实例的字节序转换。
根据本发明的第三方面,提供一种装置。所述装置包括:耦合到存储器的处理器,其执行以下操作:(1)使用所述存储器接收分别定义全局变量的第一和第二实例的第一和第二源代码部分,其中所述全局变量的每个实例具有第一字节序格式并且这两个实例在编译时间都不能被完全地初始化;以及(2)生成第一变量,所述第一变量被配置成在编译时间之后并且基于所述第一实例已经被字节交换来抑制所述第二实例的字节交换。
附图说明
根据所附权利要求、以下对一个或多个示例实施例的详细描述、以及对应的图,本发明的实施例的特征和优点将变得显而易见,其中:
图1是用于本发明实施例中的方法的框图,其包括伪代码;
图2是用于本发明实施例中的方法的框图,其包括伪代码;
图3是本发明实施例中的方法的框图;以及
图4是供本发明实施例使用的系统框图。
具体实施方式
在以下描述中,阐述了许多具体细节。然而,应该理解,可以在没有这些具体细节的情况下实践本发明实施例。公知的电路、结构和技术没有被详细示出以避免模糊对本描述的理解。对“一个实施例”、“实施例”、“示例实施例”、“各种实施例”等等的提及表示,如此描述的(一个或多个)实施例可以包括特定的特征、结构或特性,但不是每个实施例必定包括所述特定的特征、结构或特性。此外,一些实施例可以具有针对其他实施例所描述的一些、所有特征,或者不具有针对其他实施例所描述的特征。而且,如在此所用的“第一”、“第二”、“第三”等等描述了共同的对象,并且表示相同对象的不同实例正在被提及。此类形容词不打算暗示如此描述的对象必须或者在时间上、在空间上、按照等级或者以任何其他方式处于给定的序列。而且,为了清楚,在此讨论的许多示例实施例提出编译器(例如C/C++编译器)以及其对源代码的应用,但是本发明实施例不必受限于此。例如,尽管实施例包括解析代码,例如在编译器中所包括的解析工具,但是其他实施例可以包括在其他形式的代码中所包括的解析代码。
在本发明的一个实施例中,代码(例如编译器、工具)可以生成信息,因此包括第一字节序格式(例如大字节序)的指针值的代码部分能够被适当地初始化并且在具有第二字节序格式(例如小字节序)的平台上被执行。
图1包括源代码110以及可执行代码150的直观表示。代码110可能易受“复制问题”的影响。具体而言,代码110包括代码部分111、112。每个部分包括全局变量“g”的实例。全程变量“g”可以被常规的编译器初始化两次: 一次在代码部分111的 (int* _attribute_((bigendian)) g=&i1) 中,并且再一次在代码部分112的 (int* _attribute_((bigendian)) g=&i2) 中。初始化包括例如通过向程序中的变量/数据结构分配初始值来定义变量的过程。代码部分111、112包括指针 ((int* _attribute_((bigendian)) g=&i1) 和(int*_attribute_((bigendian)) g=&i2)),这两个指针具有大字节序属性但是分别指向不同的地址。每个地址具有大字节序属性。这些地址涉及两个不同的对象 ((int _attribute_((bigendian)) i1 = 1;)和(int _attribute_((bigendian)) i2 = 2;))。编译器(例如双字节序编译器)可能尝试将源代码110从大字节序格式或约定转换成适合于具有小字节序格式的平台的代码(例如可执行代码)。为了这样做,编译器可以对两个部分111和112中的大字节序全局变量“g”执行例如字节交换操作。这可能导致“复制问题”,因为“g”在第一字节序转换期间从大字节序被转换到小字节序,然后“g”在第二转换中从小字节序被转换回到大字节序。因此,由于“g”被转换了两次,所以可能发生复制问题,从而颠倒了所需的从大字节序到小字节序的转换。
关于代码110可能如何导致复制问题的更具体的描述如下。两个源文件111、112定义了全局大字节序变量“g”。常规的编译器可能基于不同的链接时间常量来初始化全局大字节序变量“g”,即使直到在链接时间或在链接时间之后(即在编译时间之后)才知道链接时间常量的地址(例如i1或i2)也是如此。编译器可能不知道“g”的哪个特定值被链接编辑器或系统载入器取得。因此,对于每个部分111、112,编译器生成用于“g”的交换操作,即使“g”是直到在编译时间之后才能完全地初始化(即正确地初始化)的指针变量也是如此。稍后,链接编辑器可能仅取“g”的一个实例,从而导致应用于“g”的单个实例的两个交换操作。
本发明的一个实施例如下解决了复制问题:
{
If (g_shadow == FALSE)
{
Byteswap(g);
g_shadow = TRUE;
} else /* g已经被交换了一次,所以什么都不做 */
}
一般而言,以上伪代码说明,本发明实施例可以使用“影子变量”以确保全局变量“g”被转换(例如被字节交换)一次,并且确保后续对转换“g”的尝试被抑制。在“g”的初始转换时,变量“g_shadow”被从“FALSE”改变成“TRUE”。此后,转换函数(例如字节交换函数)被抑制,因为它以“g_shadow”被设置为“FALSE”为条件。
因此,在本发明的一个实施例中,对于利用非固有的(native)字节顺序的链接时间常量初始化的每个全局变量,编译器可以在应用程序(application)内生成变量(例如不可见的“影子变量”)。可以在特殊的影子段(section)内部分配影子变量,因此影子变量不干扰应用程序变量。例如,对影子变量的引用可以与对原始变量的引用放在一起。一开始,一些或所有影子变量可以利用“FALSE”值来初始化,这意味着对应的实际应用程序变量尚未被交换。稍后,在数据初始化过程期间,在第一次字节交换操作被应用于对应的原始变量时,“TRUE”值可以被放入每个影子变量中。一旦影子变量等于“TRUE”,则用于原始变量的所有相继交换操作可以被抑制。因此,在本发明的一个实施例中,影子变量产生全局变量状态的“影子”以指示该全局变量是已经被字节交换还是尚未被字节交换,并且有助于确保全局变量仅被字节交换一次。
返回到图1,代码150是使用本发明实施例从源代码110产生的经编译代码的直观表示。对于全局变量“g”,代码(例如编译器)可以在代码部分151和152这二者中生成影子变量“g_shadow”,因为这两个部分相关于源代码的包括“g”的部分(即代码部分111、112)。“g_shadow”变量是从“.initdata_shadow”段分配的。“g_shadow”变量的初始值是“FALSE”。使用代码(例如链接器),对“g”的符号引用可以经由示意箭头154、155、157、159被从“g”的弱实例(参见示意块170)转换(例如重定位)到“g”的强实例(参见示意块160)。“弱”指定可以允许程序例如在程序执行期间改变变量的位置。相比之下,“强”指定不会允许程序在程序执行期间改变变量的位置。变量的强定义可以改变由弱变量定义的位置,但反过来并非如此。
出于与以上关于“g”所讨论的相同原因,对“g_shadow”的符号弱引用(块175)还可以经由示意箭头156、158被重定位到“g_shadow”的单个强实例(示意块165)。该重定位可以基于由编译器提供的、与在块150中提供重定位方向的箭头一致的重定位信息。包括对“g”和“g_shadow”的重定位引用的代码版本没有在图1中示出,但是将关于图2被提出。稍后,在后编译数据初始化过程中,第一字节交换操作可以被应用于“g”(其经由与箭头155一致的重定位信息被重定位),并且可以将“TRUE”置于“g_shadow”处(其经由与箭头156一致的重定位信息被重定位)。然后,当该过程遇到对于“g”的第二字节交换操作(其经由与箭头159一致的重定位信息被重定位)时,“g_shadow”已经具有“TRUE”值(其经由与箭头158一致的重定位信息被重定位),并且交换操作因而没有被执行。因此,在实施例中,“g”仅被交换一次并且保持正确值。
图2包括本发明的实施例。方法200包括源代码部分205,其类似于图1的部分110。在块210中,应用程序被编译。当双字节序功能被启用时,编译器可以生成初始化数据。由编译器提供的初始化数据或信息可以包括影子变量、交换g引用、以及与影子变量和交换g引用相关的重定位信息。编译器可以将该初始化数据放入名为“.initdata”和“.initdata_shadow”的特殊的可执行与链接格式(ELF)段中,如在块215中所示。块215类似于图1的部分151。取决于编译器选项,该.initdata段可以被放入可载入段或注释段中。
在块220中,诸如图1的部分152之类的其他目标文件以与块215类似的方式被处理以生成更多的.initdata段。然后,在块225中,链接器可以以由图1中的箭头所指示的方式组合.initdata段并重定位g交换和影子变量(基于由编译器提供的重定位信息)。.initdata段可以来自各种目标文件,并且可以以链接的二进制来放置.initdata段。
在块230中,使用后链接工具对代码进行后处理,所述后链接工具在本发明的一个实施例中可以被包括在编译器中。在其他实施例中,所述后链接工具与编译器是分开的。后链接工具可以读取可执行映像的.initdata段,并且对具有在链接期间未被正确计算的值的数据执行初始化(例如,诸如“g”变量之类的全局变量地址)。因为可能留下未解析的引用,所以该工具可以检查位置是否不具有与之相关联的重定位,例如针对图1所讨论的那些重定位。在那种情况下,在运行时期间仅仅可以检测到正确值,并且这里不可以执行交换,而是作为代替在块245中(参见下文)执行交换。否则,地址所指向的数据可以基于由编译器提供的初始化信息而如在块235中所示的那样被字节交换。注意,在块235中,一些字节交换现在已经发生(例如long swapped(&i1)),并且来自块215的一些条目(例如g条目)已经被去除。由于先前发生的重定位,所以存在单个section_.initdata段。
在块240和245中,可以发生动态运行时初始化。如果从块230中的连编( build)中留下未执行的字节交换(例如这可能对于动态链接的应用程序发生),则它们可以在块245中被执行,在块245中在应用程序进入用户代码之前它们或者通过例如与可执行程序静态链接的运行时初始化例程(例如由编译器提供)或者通过经修改的操作系统(OS)载入器进行。在运行时初始化的情况下,可能需要数据被定位到读-写(R/W)段以被OS载入。由于由编译器提供的初始化信息,所以这些字节交换会是可能的。
在块250中,可以发生验证。例如,当应用程序启动时,可以执行检查以确保没有剩余的未解析的.initdata记录留下。这样做可以避免由于在经初始化的数据内部丢失字节序校正而引起的程序故障。编译器可以生成运行时检查,其确保初始化已经被适当地完成。对于这种运行时检查的例子,编译器可以为每个编译单元创建大字节序“保护”变量。该“保护变量”可以利用已知的链接时间常量值和例程来初始化,所述例程检查该值是否已经被交换。如果没有发生这样的交换,则应用程序可以终止于错误状态。否则,该应用程序可以在块255中继续进行。
因此,本发明的各种实施例涉及针对在编译时间不能被完全地解析的数据初始化的解决方案。例如,一个全局变量(例如来自图1的“g”)可以保持另一全局变量的地址。在这种情况下,直到链接阶段才可能知道要被分配给该全局变量的确切值。在编译时间不能被完全地解析的数据初始化的另一例子涉及动态链接的应用程序,其中仅在运行时的动态链接阶段之后才知道最终值。如果假定实际的初始化值具有反向字节顺序,则它应该在动态链接之后并且在程序执行之前的某一阶段被交换。在编译时间不能被完全地解析的数据初始化的又一个例子涉及常用的允许变量的弱定义的应用程序二进制接口(ABI)。这样的弱定义允许声明变量多于一次并且令链接器或载入器决定对象的哪个实例实际上被取得。
本发明的各种实施例是基于工具的,并且可以使用标准ELF文件格式。这可以允许用户把未经修改的基于ELF的工具(像链接器和操作系统(OS)载入器)用于本发明的实施例。
因此,在本发明的一个实施例中,期望移植(port)大字节序代码以在小字节序平台上运行(或反之亦然)的程序员不需要重写他或她的完全在固有的单个字节序模式下运行的应用程序。作为替代,可以以特定的字节序格式来指定源代码的部分,例如需要大字节序格式以便与网络分组交互的组件。本发明的实施例于是可以提供将允许在稍后的时间对代码部分进行适当初始化的数据。这些代码部分可以包括第一字节序格式(例如大字节序)的指针值,所述指针值必须稍后在具有第二字节序格式(例如小字节序)的平台上执行。本发明的各种实施例提供了对静态初始化对象(包括指针对象)的字节序的自动调整。一些实施例解决了由多个分配的对象所引起的地址模糊性。而且,一些实施例提供了对在例如应用程序启动期间丢失字节序校正的运行时检测。一些实施例使用特殊编译器生成信息来描述非编译时间常数的大字节序指针值。各种实施例使用后处理工具来在链接过程已经完成之后校正字节序。附加的实施例使用特殊应用程序启动代码,其能够在动态链接的应用程序的情况下校正字节序。
图3是本发明实施例中的方法的框图,该方法可以解决例如由解析代码(例如双字节序编译器)所引起的困难。一种这样的困难涉及不追踪通过void指针的字节顺序的编译器。void指针可以包括指向具有未知类型的值的指针。另一困难可以包括以下情形:通过将指针向或从指针进行转换而丢失了字节顺序改变。“转换”可以包括从一种类型到另一类型的程序员规定的数据转换,例如从整数到浮点的转换。由于这些示例困难,所以一些编译器不能产生诊断(例如诊断报告、提示、消息、信息),所述诊断识别通过void指针而发生的潜在字节顺序改变。这些困难会导致运行时问题。为了解决这些问题,本发明的各种实施例帮助识别代码的有问题区域,其中例如特定字节顺序通过void指针而被抛弃。更具体地说,本发明的实施例可以向用户警告通过void指针的潜在有问题的转换,从而有效地将特定void与字节顺序区域相关联,所以用户可以通过代码修改来解决所述转换。
在图3的块305中,程序员可以使用代码(例如工具、编译器)来将代码的区域(例如数据结构)标记为小或大字节序。如在此所解释的那样,一些区域由于它们与网络分组等等一起使用而可以被指定为例如大字节序。编译器还可以识别出存在void指针。在块310中,可以识别字节序格式。在块315中,如果void指针位于已经被标记为大字节序的代码段中,则编译器可以在内部创建“大字节序void”。在块320中,如果void指针位于指定为小字节序的代码部分,则编译器可以创建“小字节序void”。尽管标准void类型可以匹配任何语言类型,但是特定于字节顺序的void(例如“大字节序void”或“小字节序void”)可能仅匹配例如具有相同字节顺序的数据(例如非聚合数据)和在相同缺省字节顺序的上下文中声明的(即定义的)数据(例如聚合数据)。因此,在块325中,确定不匹配的存在。在块330中,如果不存在不匹配,则可以允许匹配。然而,在块335中,当存在不匹配时,编译器可以发布报告该不匹配的诊断(除非诊断被禁用)。例如,如果标准void指针从大字节序值指向小字节序值,则通常不会引起问题,这是因为void指针是指向具有未知类型(并且因此也具有未确定的长度和未确定的解引用特性)的值的指针。然而,与“大字节序void”的如此尝试的匹配可以在诊断中被记录(块340),并且引起程序员的注意,其中他或她可以在块345中解决该问题。
对void类型名称(例如大字节序void)的使用具有隐式地或显式地(参见块305)分配给代码区域的缺省字节顺序的字节顺序属性。typedef可以被用来基于相应缺省字节顺序的typedef来创建大和小字节序void的void名称类型。
本发明的一些实施例涉及不同类型的void指针。具体而言,为了支持源转换成为字节顺序中性的,可以创建void类型的族,对于其而言,数据的大小由附于void名称的数据的比特大小来捕获,例如“void32”或“void64”。 按照类似于关于方法300所解释的方式,这些类型匹配相同比特大小的类型。源代码可以被修改以使用这些名称,并且然后编译器将实施大小约束。
因此,在本发明的一些实施例中,当编译器执行指针转换时,它可以在出现几种情形中的任一种时确定并发布诊断。例如,当显式地或隐式地从不同的字节排序类型转换为void指针(例如经由void指针从大字节序值转换到小字节序值)时,可以产生诊断。“显式”转换可以发生,其中例如程序员显式地编写转换表达式,例如:
{
int beint;
void *p = (void*)&beint; // 从大字节序整数指针转换到void指针
}
“隐式”转换是类似的,但是可能如下不包括转换表达式:
{
void *p = &beint; // 从大字节序整数指针转换到void指针
}
对于显式转换,编译器可以产生更少的诊断,因为转换向编译器指示程序员的动作很可能是有意的。然而,通过void指针转换,字节顺序可能丢失,因此,在本发明的一个实施例中,可以产生诊断而不管该转换的显式性质。
因此可以在几种情形中产生诊断(例如报告)。例如,在以下情形中可以发布报告:当(i)显式地或隐式地从void指针转换到不同的字节排序类型时;当(ii)显式地或隐式地从不同的字节排序类型转换到void指针时;当(iii)隐式地从void指针转换到具有不同字节顺序的另一void指针时;以及当(iv)显式地或隐式地从或向void大小指针进行转换时,其中基本类型具有不同大小(例如经由void指针从32位值转换到64位值)。
实施例可以在许多不同的系统类型中被实施。现在参考图4,示出了根据本发明实施例的系统的框图。多处理器系统500是点到点互连系统,并且包括经由点到点互连550而耦合的第一处理器570和第二处理器580。处理器570和580中的每一个可以是多核处理器,其包括第一和第二处理器核(即处理器核574a和574b以及处理器核584a和584b),不过在处理器中可能存在更多的核。术语“处理器”可以是指处理来自寄存器和/或存储器的电子数据以将该电子数据变换成可以存储在寄存器和/或存储器中的其他电子数据的任何设备或设备的一部分。
第一处理器570进一步包括存储控制器集线器(MCH)572和点到点(P-P)接口576和578。类似地,第二处理器580包括MCH 582和P-P接口586和588。MCH 572和582将处理器耦合到相应的存储器,即存储器532和存储器534,其可以是本地地附于相应处理器的主存储器(例如动态随机存取存储器(DRAM))的部分。第一处理器570和第二处理器580可以分别经由P-P互连552和554被耦合到芯片组590。芯片组590包括P-P接口594和598。
此外,芯片组590包括接口592以通过P-P互连539将芯片组590与高性能图形引擎538耦合。继而,芯片组590可以经由接口596被耦合到第一总线516。各种输入/输出(I/O)设备514连同总线桥518一起可以被耦合到第一总线516,所述总线桥518将第一总线516耦合到第二总线520。各种设备可以被耦合到第二总线520,所述各种设备包括例如键盘/鼠标522、通信设备526、以及数据存储单元528(例如盘驱动器或其他大容量存储设备),在一个实施例中数据存储单元528可以包括代码530。此外,音频I/O 524可以被耦合到第二总线520。
实施例可以以代码来实施并且可以被存储在存储介质上,所述存储介质在其上存储有指令,所述指令能够被用来对系统进行编程以执行所述指令。所述存储介质可以包括但不限于任何类型的盘(包括软盘、光盘、固态驱动器(SSD)、光盘只读存储器(CD-ROM)、可重写光盘(CD-RW)、以及磁光盘),半导体器件(例如只读存储器(ROM)),随机存取存储器(RAM)(例如动态随机存取存储器(DRAM)、静态随机存取存储器(SRAM)、可擦除可编程只读存储器(EPROM)、闪速存储器、电可擦除可编程只读存储器(EEPROM)),磁或光卡,或适合于存储电子指令的任何其他类型的介质。
在此已参考诸如指令、函数、过程、数据结构、应用程序、配置设置、代码等之类的数据描述了本发明的实施例。当数据被机器访问时,该机器可以通过执行任务、定义抽象数据类型、建立低级硬件上下文、和/或执行其他操作来进行响应,如在此更详细描述的那样。数据可以被存储在易失性和/或非易失性的数据存储装置中。为了本公开的目的,术语“代码”或“程序”涵盖了大范围的组件和构造,其包括应用程序、驱动器、过程、例程、方法、模块、以及子程序。因此,术语“代码”或“程序”可以被用来指代在被处理系统执行时执行(一个或多个)期望操作的指令的任何集合。另外,可替换的实施例可以包括使用少于所有所公开操作的过程、使用附加操作的过程、以不同序列使用相同操作的过程、以及其中在此所公开的各个操作被组合、细分或以其他方式改变的过程。在此常常关于字节交换指令讨论了字节序转换,但是各种实施例不一定限于采用任何特定类型的指令来执行或促进字节序转换。
尽管已经相对于有限数目的实施例描述了本发明,但是本领域技术人员将由其认识到许多修改和变化。所附权利要求打算覆盖落入本发明的真实精神和范围内的所有这样的修改和变化。
Claims (20)
1. 一种方法,包括:
接收分别定义全局变量的第一和第二实例的第一和第二源代码部分,其中每个实例具有第一字节序格式并且这两个实例在编译时间都不能被完全地初始化;
生成对字节交换指令的第一和第二引用,其被配置成分别将所述第一和第二实例转换成第二字节序格式;
使用处理器来生成影子变量,所述影子变量被配置成在编译时间之后并且基于所述第一实例已经被字节交换来抑制所述第二实例的字节交换;以及
将所述影子变量存储在耦合到所述处理器的存储器中。
2. 如权利要求1所述的方法,其中,基于所述全局变量是具有所述第一字节序格式的指针,这两个实例在编译时间都不能被完全地初始化。
3. 如权利要求2所述的方法,其中,所述影子变量被配置成指示所述第一实例是否被字节交换。
4. 如权利要求2所述的方法,其中,所述影子变量被配置成基于所述影子变量已经从弱定义的变量被转换成强定义的变量来抑制所述第二实例的字节交换。
5. 如权利要求2所述的方法,包括:生成具有第一和第二字节序格式这二者的经编译代码。
6. 如权利要求2所述的方法,包括:生成保护变量,所述保护变量被配置成确定,在运行时和在所述保护变量的初始化之后,所述保护变量已经被字节转换,其中所述保护变量将利用已知的链接时间常量来被初始化。
7. 如权利要求2所述的方法,其中,所述第一和第二实例被配置成在编译时间之后分别基于每一个都具有所述第一字节序格式的第一和第二链接时间常量来被初始化。
8. 如权利要求1所述的方法,包括:
接收包括void指针的第三源代码部分;
追踪通过所述void指针的字节顺序;以及
确定基于所述void指针所发生的字节顺序不匹配。
9. 如权利要求1所述的方法,包括:
接收包括void指针的第三源代码部分;
追踪通过所述void指针的数据大小;以及
确定基于所述void指针所发生的数据大小不匹配。
10. 一种包括介质的物品,存储用于使基于处理器的系统能够执行以下操作的指令:
接收分别定义全局变量的第一和第二实例的第一和第二代码部分,其中所述全局变量的每个实例具有第一字节序格式并且这两个实例在编译时间都不能被正确地初始化;以及
生成第一变量,所述第一变量被配置成在编译时间之后并且基于所述第一实例已经被字节序转换来抑制所述第二实例的字节序转换。
11. 如权利要求10所述的物品,其中,所述全局变量是指针。
12. 如权利要求11所述的物品,进一步存储用于使所述系统能够基于从编译器生成的信息来重定位所述第一变量的指令,其中所述第一变量被配置成基于所述重定位来抑制所述第二实例的字节序转换。
13. 如权利要求11所述的物品,其中,所述第一实例基于第二全局变量的地址。
14. 如权利要求11所述的物品,其中,所述第一和第二代码部分被配置成被动态地链接。
15. 如权利要求10所述的物品,进一步存储用于使所述系统能够执行以下操作的指令:
接收包括void指针的第三代码部分;
追踪通过所述void指针的字节顺序;以及
确定基于所述void指针所发生的字节顺序不匹配。
16. 一种装置,包括:
耦合到存储器的处理器,其执行以下操作:(1)使用所述存储器接收分别定义全局变量的第一和第二实例的第一和第二源代码部分,其中所述全局变量的每个实例具有第一字节序格式并且这两个实例在编译时间都不能被完全地初始化;以及(2)生成第一变量,所述第一变量被配置成在编译时间之后并且基于所述第一实例已经被字节交换来抑制所述第二实例的字节交换。
17. 如权利要求15所述的装置,其中,所述全局变量是指针。
18. 如权利要求17所述的装置,其中,所述第一变量被配置成基于所述第一变量已经从弱定义的变量被转换成强定义的变量来抑制所述第二实例的字节交换。
19. 如权利要求17所述的装置,其中,所述第一和第二代码部分被配置成被动态地链接。
20. 如权利要求15所述的装置,其中,所述处理器执行以下操作:
接收包括void指针的第三源代码部分;
追踪通过所述void指针的字节顺序;以及
确定基于所述void指针所发生的字节顺序不匹配。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US12/643,216 | 2009-12-21 | ||
US12/643,216 US8578357B2 (en) | 2009-12-21 | 2009-12-21 | Endian conversion tool |
US12/643216 | 2009-12-21 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102103481A true CN102103481A (zh) | 2011-06-22 |
CN102103481B CN102103481B (zh) | 2014-03-26 |
Family
ID=43875213
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201010598057.8A Expired - Fee Related CN102103481B (zh) | 2009-12-21 | 2010-12-21 | 字节序转换工具 |
Country Status (4)
Country | Link |
---|---|
US (1) | US8578357B2 (zh) |
EP (1) | EP2348406B1 (zh) |
JP (1) | JP5254306B2 (zh) |
CN (1) | CN102103481B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113419777A (zh) * | 2021-05-08 | 2021-09-21 | 中国科学院声学研究所 | 一种可编程交换机的指令块转换执行方法及系统 |
Families Citing this family (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8332539B2 (en) * | 2010-04-24 | 2012-12-11 | Sudharshan Srinivasan | Binary data serialization system using machine dependant data alignment |
US20120011490A1 (en) * | 2010-07-09 | 2012-01-12 | Kabushiki Kaisha Toshiba | Development system |
US20130113809A1 (en) * | 2011-11-07 | 2013-05-09 | Nvidia Corporation | Technique for inter-procedural memory address space optimization in gpu computing compiler |
US9898386B2 (en) | 2013-10-15 | 2018-02-20 | Nxp Usa, Inc. | Detecting byte ordering type errors in software code |
US10120682B2 (en) | 2014-02-28 | 2018-11-06 | International Business Machines Corporation | Virtualization in a bi-endian-mode processor architecture |
US9619214B2 (en) | 2014-08-13 | 2017-04-11 | International Business Machines Corporation | Compiler optimizations for vector instructions |
US10169014B2 (en) * | 2014-12-19 | 2019-01-01 | International Business Machines Corporation | Compiler method for generating instructions for vector operations in a multi-endian instruction set |
US9588746B2 (en) | 2014-12-19 | 2017-03-07 | International Business Machines Corporation | Compiler method for generating instructions for vector operations on a multi-endian processor |
US20160217197A1 (en) * | 2015-01-23 | 2016-07-28 | Honeywell International, Inc. | System and method for endian correction of complex data structures in heterogeneous systems |
US9880821B2 (en) | 2015-08-17 | 2018-01-30 | International Business Machines Corporation | Compiler optimizations for vector operations that are reformatting-resistant |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0729093A1 (en) * | 1995-02-24 | 1996-08-28 | International Business Machines Corporation | A mixed-endian computer system |
US20060125663A1 (en) * | 2004-12-13 | 2006-06-15 | Adiletta Matthew J | Method and apparatus for implementing a bi-endian capable compiler |
CN1823322A (zh) * | 2003-07-15 | 2006-08-23 | 可递有限公司 | 用于程序代码转换的共享代码缓存方法及设备 |
CN1838666A (zh) * | 2005-03-24 | 2006-09-27 | 华为技术有限公司 | 一种跨操作系统平台的字节序转换方法 |
US20080028197A1 (en) * | 2006-07-31 | 2008-01-31 | Takatsugu Sawai | Data transfer control device including endian conversion circuit |
Family Cites Families (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH087738B2 (ja) * | 1989-11-17 | 1996-01-29 | 株式会社日立製作所 | エンディアン変換方式 |
JPH0623961B2 (ja) * | 1990-09-19 | 1994-03-30 | 株式会社日立情報システムズ | データ転送方式 |
JPH04362738A (ja) * | 1991-06-10 | 1992-12-15 | Oki Electric Ind Co Ltd | 変数管理方法 |
JPH08202646A (ja) * | 1995-01-25 | 1996-08-09 | Nec Corp | I/oコントローラ |
JPH08267827A (ja) * | 1995-03-28 | 1996-10-15 | Canon Inc | 文字処理方法とその装置及び印刷装置 |
US6154877A (en) * | 1997-07-03 | 2000-11-28 | The University Of Iowa Research Foundation | Method and apparatus for portable checkpointing using data structure metrics and conversion functions |
US6772320B1 (en) * | 2000-11-17 | 2004-08-03 | Intel Corporation | Method and computer program for data conversion in a heterogeneous communications network |
-
2009
- 2009-12-21 US US12/643,216 patent/US8578357B2/en not_active Expired - Fee Related
-
2010
- 2010-12-17 EP EP10252159.8A patent/EP2348406B1/en not_active Not-in-force
- 2010-12-21 JP JP2010284795A patent/JP5254306B2/ja not_active Expired - Fee Related
- 2010-12-21 CN CN201010598057.8A patent/CN102103481B/zh not_active Expired - Fee Related
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0729093A1 (en) * | 1995-02-24 | 1996-08-28 | International Business Machines Corporation | A mixed-endian computer system |
CN1823322A (zh) * | 2003-07-15 | 2006-08-23 | 可递有限公司 | 用于程序代码转换的共享代码缓存方法及设备 |
US20060125663A1 (en) * | 2004-12-13 | 2006-06-15 | Adiletta Matthew J | Method and apparatus for implementing a bi-endian capable compiler |
CN1838666A (zh) * | 2005-03-24 | 2006-09-27 | 华为技术有限公司 | 一种跨操作系统平台的字节序转换方法 |
US20080028197A1 (en) * | 2006-07-31 | 2008-01-31 | Takatsugu Sawai | Data transfer control device including endian conversion circuit |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113419777A (zh) * | 2021-05-08 | 2021-09-21 | 中国科学院声学研究所 | 一种可编程交换机的指令块转换执行方法及系统 |
CN113419777B (zh) * | 2021-05-08 | 2023-07-18 | 中国科学院声学研究所 | 一种可编程交换机的指令块转换执行方法及系统 |
Also Published As
Publication number | Publication date |
---|---|
CN102103481B (zh) | 2014-03-26 |
US20110154303A1 (en) | 2011-06-23 |
JP2011129132A (ja) | 2011-06-30 |
EP2348406A3 (en) | 2013-01-02 |
EP2348406A2 (en) | 2011-07-27 |
JP5254306B2 (ja) | 2013-08-07 |
US8578357B2 (en) | 2013-11-05 |
EP2348406B1 (en) | 2018-02-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102103481B (zh) | 字节序转换工具 | |
US8381194B2 (en) | Methods and apparatuses for selective code coverage | |
US9424009B2 (en) | Handling pointers in program code in a system that supports multiple address spaces | |
CN100375017C (zh) | 逐渐处理程序注解的方法和数据处理系统 | |
US8756590B2 (en) | Binding data parallel device source code | |
CN100462920C (zh) | 为优化的程序生成展开信息 | |
CN103518190A (zh) | 对于动态语言的散列表的硬件支持 | |
US20080005727A1 (en) | Methods, systems, and computer program products for enabling cross language access to an addressable entity | |
JP2000112758A (ja) | 投機的実行中に発生する例外を遅延させるシステム及び方法 | |
CN101546287A (zh) | 代码修改方法和代码修改设备 | |
US5053986A (en) | Circuit for preservation of sign information in operations for comparison of the absolute value of operands | |
CN105224309A (zh) | 一种调取函数的方法和装置 | |
CN102804142B (zh) | 使用双字节序编译器优化代码 | |
CN113835620B (zh) | 一种提高安全芯片应用执行效率的方法及系统 | |
CN102103575B (zh) | 用于端序转换的方法和设备 | |
CN100524203C (zh) | 用于检测和处理未对齐数据访问的设备、系统和方法 | |
US8185885B2 (en) | Providing recovery data for program code | |
US7133993B1 (en) | Inferring size of a processor memory address based on pointer usage | |
KR20190060561A (ko) | 이종 디바이스의 선택적 추상화를 통한 사물 인터넷 어플리케이션의 개발 환경을 통합하는 방법 및 시스템 | |
EP0365186A2 (en) | Apparatus for enhanced tagged data processing in a generalized computer execution unit | |
CN113031956A (zh) | 程序编译方法和装置以及程序运行方法和装置 | |
EP4165500B1 (en) | A method of programming a software module associated with a firmware unit of a device | |
CN117008972B (zh) | 一种指令分析方法、装置、计算设备及存储介质 | |
US11836426B1 (en) | Early detection of sequential access violations for high level synthesis | |
CN103003796A (zh) | 线程级推测中的动态数据同步 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20140326 Termination date: 20211221 |