采用解码时间指令优化连接用于增强应用二进制接口(abi)的代码的制作方法

文档序号:6496731阅读:243来源:国知局
采用解码时间指令优化连接用于增强应用二进制接口(abi)的代码的制作方法【专利摘要】在目标文件中识别代码序列,该代码序列由多个指令组成并且指定了相对基址的偏移量。所述相对基址的偏移量对应于在被配置为存储变量或数据的地址的存储器内的偏移位置。所识别的代码序列被配置为执行存储器引用函数或存储器地址计算函数。确定偏移位置在基址的指定距离内并且确定采用替换代码序列替换所识别代码序列不会改变程序语义。所述目标文件中所识别代码序列采用所述替换代码序列所替换,所述替换代码序列包括空操作(NOP)指令或者具有比所识别代码序列少的指令。基于所述目标文件生成所连接可执行代码,并且发出所连接的可执行代码。【专利说明】采用解码时间指令优化连接用于增强应用二进制接口(ABI)的代码【
技术领域
】[0001]本发明涉及计算机系统,并且尤其涉及采用解码时间指令优化连接用于增强应用二进制接口(ABI)的被编译代码。【
背景技术
】[0002]在计算机软件中,应用二进制接口(ABI)描述应用程序和操作系统之间或应用程序和另一应用之间的低级接口。ABI涉及诸如数据类型、大小以及对齐(alignment)的明细(details);控制如何传递函数变量以及如何搜索返回值的调用规则;系统调用号以及应用应如何使得系统调用操作系统;以及在完整操作系统ABI的情况下涉及目标文件的二进制格式、程序库等等。如果存在必要的共享库以及满足相似的前提,几种ABI(例如,容许在用于Intelx86架构的各种Unix和Linux变化形式上运行的广泛程序的交互式UnixABI)容许来自支持该ABI的一个操作系统的应用程序在不修改的情况下运行在任意其他这种系统上。[0003]通常应用程序的程序开发周期包括写源代码、将源代码编译成目标文件、构建共享库以及将目标文件链接到主可执行程序。在特定硬件平台上执行该应用之前,还要进行额外准备,包括加载主可执行程序以及加载用于应用启动的共享库。[0004]编译器在某时对单一源文件(编译单位)进行工作以便生成目标文件。编译器生成目标代码而不知道该代码/数据的最终地址或位移。具体而言,编译器生成在不知道TOC的最终大小或各种数据段的偏移/地址的情况下将为了变量值访问TOC的目标代码。用于这种信息的占位符被留在该目标代码中并由连接器更新。TOC是变量地址参考表,其例如在AIX环境中被利用来以支持共享库和数据位置独立的方式存取程序变量。被称之为全局偏移量表(GOT)的类似结构在LINUX环境中执行类似功能(例如,对变量的间接和动态可再定位存取)。TOC和GOT之间的差别在于TOC可以包含实际数据,而GOT仅仅包含数据的地址(指针)。在PowerPc64-比特环境中,TOC含有GOT部分加小数据变量。[0005]连接器将目标文件汇集(collect)成可执行程序/共享对象并为代码/数据赋予偏移。连接器在程序开发期间解析内部引用并且外部引用在加载时间被解析。连接器汇集来自目标文件的TOC输入项(entry)、赋予TOC偏移以及生成TOC段。连接器知晓TOC的最终尺寸但是不对编译器生成的TOC存取代码序列执行主编辑(majoredit)。连接器知晓具体内部引用TOC输入项的偏移但是不知晓用于大部分外部引用TOC输入项的最终解析值。该外部引用TOC输入项由加载器/动态连接器解析。[0006]IBM?于2010年7月23日发布的并且通过引用被整体包含在本说明书中的“PowerISA?Version2.06RevisionB”教导了一种示例性精简指令集计算机(RISC)指令集架构(ISA)ο在此将使用所述PowerISA来解释例示实施例,不过,本发明并不限于PowerISA或RISC架构。本领域技术人员将容易理解到本发明能用于各种架构。[0007]1111@的并且通过引用被整体包含在本说明书中的“z/ArchitecturePrinciplesofOperation”SA22-7832-08,第9版(2010年8月)教导了一种示例CISC(复杂指令集计算机)指令集架构。[0008]IBM的并且通过引用被整体包含在本说明书中的“64-bitPowerPCELFApplicationBinaryInterfaceSupplementl.9”(2004)描述了PowerPC?可连接执行格式(ELF)ABI的64-比特补码(supplement)。[0009]power,org的并且通过引用被整体包含在本说明书中的“PowerArchitecture?32-bitApplicationBinaryInterfaceSupplementl.0Linux(g),,(2011年4月19日)以及“PowerArchitecture(R)32-bitApplicationBinaryInterfaceSupplementl.0-Embedded”(2011年4月19曰)描述了32-比特ABI。【
发明内容】[0010]根据示例性实施例,一种计算机程序产品、系统以及方法包括:一种方法包括读取目标文件,该目标文件包括多个代码序列。识别所述目标文件中的代码序列,该代码序列指定相对基址的偏移量。所述相对基址的偏移量对应于在被配置为存储变量的地址或数据的存储器内的偏移位置。所识别的代码序列包括多个指令并且被配置为执行存储器引用函数或存储器地址计算函数。确定所述偏移位置在所述基址的指定距离内。此外,验证采用替换代码序列替换所识别代码序列不会改变程序语义。采用所述替换代码序列替换所述目标文件中所识别代码序列。所述替换代码序列包括空操作(NOP)指令或者具有比所识别代码序列少的指令。响应于所述目标文件生成连接的可执行代码以及发出所连接的可执行代码。[0011]根据另一个示例性实施例,一种计算机程序产品、系统和方法包括读取目标文件,该目标文件包括多个代码序列,所述多个代码序列包括作为用于参考表中的偏移位置的占位符的符号。每个偏移位置被配置用于存储变量的地址或数据。接收与所述代码序列相关联的存取频率信息。所述多个代码序列按照存取频率排序。接收与所述偏移位置相关联的成本信息。对于所述代码序列中的每个符号,从具有最高存取频率的代码序列开始,在可变参考表中的偏移位置被分派给所述符号,并且该符号被所述目标文件中的所述偏移位置所替代。所分派的偏移位置具有先前还没有被分派给另一个符号的偏移位置中的最低成本。发出所连接的可执行代码。[0012]通过本发明的技术可以实现额外的特征和优点。本发明的其它实施例和方面在此被详细描述并被认为是要求保护的发明的一部分。为了更好理解具有这些优点和特征的本发明,请参见本说明书以及附图。【专利附图】【附图说明】[0013]在本说明书的结尾处的权利要求书中特别指出并清楚要求保护关于本发明的主题。根据下面结合附图给出的详细描述,本发明的前述以及其他特征以及优点将更清楚。[0014]图1表示根据本发明一实施例的云计算节点;[0015]图2表示根据本发明一实施例的云计算环境;[0016]图3表示根据本发明一实施例的抽象模型层;[0017]图4表示根据本发明一实施例的内容表(TOC)以及数据元;[0018]图5表示根据本发明一实施例的由编译器执行的用于生成TOC引用的处理的流程图;[0019]图6表示根据本发明一实施例的由编译器执行的用于生成TOC引用的处理的流程图;[0020]图7表示根据本发明一实施例的由连接器执行的用于创建连接目标文件的处理的流程图;[0021]图8表示根据本发明一实施例的由连接器执行的用于执行存储器引用序列修剪优化的参考代码优化处理的流程图;[0022]图9表示根据本发明一实施例的TOC寻址方案的方块示意图;[0023]图10表示根据本发明一实施例的由连接器执行的用于执行基于基频的TOC引用包装的参考代码优化处理的流程图;以及[0024]图11表示根据本发明一实施例的由连接器执行的用于对TOC计算扩展执行GOT加载的参考代码优化处理的流程图。【具体实施方式】[0025]本发明的实施例涉及使得内容表(TOC)溢出对计算系统中的性能和吞吐量的影响最小化。一个实施例包括编译器,该编译器被设计成生成目标代码以便包括被指定的指令序列(例如已经被插入该代码中以便补偿TOC溢出的序列)。该指令序列适于被硬件辨识,以便微处理器能够优化该序列用于内部执行。在定位了所指定指令序列之一时,微处理器采用可以更有效执行的内部指令替换该序列中的指令,或者采用单一内部指令替换该序列中的指令。由微处理器执行的这种处理在此被称之为解码时间指令优化(DTIO)。[0026]DTIO处理是一种硬件处理。此处描述的编译器和连接器准备代码序列用于由硬件进行优化。这些代码序列由编译器和/或连接器以一种可被能进行DTIO的硬件检测的方式编码,诸如彼此相邻的特定指令、在位移范围受到限制时具有适当位移范围的特定指令、在处理器要求破坏性指令形式能够进行DTIO时具有诸如破坏性的适当特性的特定指令、以及在处理器要求指令对齐以便能进行DTIO时可以适当对齐的特定指令,以及具有任何其他能够由能进行DTIO的硬件所需的特性的特定指令。能进行DTIO的硬件在2011年10月03日提交的申请号为13/251,409、标题为“ScalableDecodeTimeInstructionSequenceOptimizationofDependentInstructions”的美国专利申请中有进一步描述。[0027]—些实施例还包括编译器,该编译器被设计成改善在所有处理器上的TOC引用的性能,既有那些能进行DTIO的处理器也有那些不能进行DTIO的的处理器。该连接器基于诸如基频和位移值的特征执行几种TOC参考代码优化。被优化代码执行与原始TOC参考代码相同的函数。TOC和GOT是参考表的实例。TOC和GOT都可以是存储变量的地址的变量地址(variableaddress)参考表。此外,TOC还可以存储数据。除非专门指出,术语TOC和GOT在此都可以被互换地用来指代被存取以便定位程序变量的表。[0028]DTIO处理可以在云计算环境中被执行。首先应当理解,尽管本公开包括关于云计算的详细描述,但其中记载的技术方案的实现却不限于云计算环境.相反,本发明的实施例能够结合现在已知或以后开发的任何其它类型的计算环境而实现。[0029]云计算是一种服务交付模式,用于对共享的可配置计算资源池进行方便、按需的网络访问。可配置计算资源是能够以最小的管理成本或与服务提供者进行最少的交互就能快速部署和释放的资源,例如可以是网络、网络带宽、服务器、处理、内存、存储、应用、虚拟机和服务。这种云模式可以包括至少五个特征、至少三个服务模型和至少四个部署模型。[0030]特征包括:[0031]按需自助式服务:云的消费者在无需与服务提供者进行人为交互的情况下能够单方面自动地按需部署诸如服务器时间和网络存储等的计算能力。[0032]广泛的网络接入:计算能力可以通过标准机制在网络上获取,这种标准机制促进了通过不同种类的瘦客户机平台或厚客户机平台(例如移动电话、膝上型电脑、个人数字助理PDA)对云的使用。[0033]资源池:提供者的计算资源被归入资源池并通过多租户(mult1-tenant)模式服务于多重消费者,其中按需将不同的实体资源和虚拟资源动态地分配和再分配。一般情况下,消费者不能控制或甚至并不知晓所提供的资源的确切位置,但可以在较高抽象程度上指定位置(例如国家、州或数据中心),因此具有位置无关性。[0034]迅速弹性:能够迅速、有弹性地(有时是自动地)部署计算能力,以实现快速扩展,并且能迅速释放来快速缩小。在消费者看来,用于部署的可用计算能力往往显得是无限的,并能在任意时候都能获取任意数量的计算能力。[0035]可测量的服务:云系统通过利用适于服务类型(例如存储、处理、带宽和活跃用户帐号)的某种抽象程度的计量能力,自动地控制和优化资源效用。可以监测、控制和报告资源使用情况,为服务提供者和消费者双方提供透明度。[0036]服务模型如下:[0037]软件即服务(SaaS):向消费者提供的能力是使用提供者在云基础架构上运行的应用。可以通过诸如网络浏览器的瘦客户机接口(例如基于网络的电子邮件)从各种客户机设备访问应用。除了有限的特定于用户的应用配置设置外,消费者既不管理也不控制包括网络、服务器、操作系统、存储、乃至单个应用能力等的底层云基础架构。[0038]平台即服务(PaaS):向消费者提供的能力是在云基础架构上部署消费者创建或获得的应用,这些应用利用提供者支持的程序设计语言和工具创建。消费者既不管理也不控制包括网络、服务器、操作系统或存储的底层云基础架构,但对其部署的应用具有控制权,对应用托管环境配置可能也具有控制权。[0039]基础架构即服务(IaaS):向消费者提供的能力是消费者能够在其中部署并运行包括操作系统和应用的任意软件的处理、存储、网络和其他基础计算资源。消费者既不管理也不控制底层的云基础架构,但是对操作系统、存储和其部署的应用具有控制权,对选择的网络组件(例如主机防火墙)可能具有有限的控制权。[0040]部署模型如下:[0041]私有云:云基础架构单独为某个组织运行。云基础架构可以由该组织或第三方管理并且可以存在于该组织内部或外部。[0042]共同体云:云基础架构被若干组织共享并支持有共同利害关系(例如任务使命、安全要求、政策和合规考虑)的特定共同体。共同体云可以由共同体内的多个组织或第三方管理并且可以存在于该共同体内部或外部。[0043]公共云:云基础架构向公众或大型产业群提供并由出售云服务的组织拥有。[0044]混合云:云基础架构由两个或更多部署模型的云(私有云、共同体云或公共云)组成,这些云依然是独特的实体,但是通过使数据和应用能够移植的标准化技术或私有技术(例如用于云之间的负载平衡的云突发流量分担技术)绑定在一起。[0045]云计算环境是面向服务的,特点集中在无状态性、低耦合性、模块性和语意的互操作性。云计算的核心是包含互连节点网络的基础架构。[0046]现在参考图1,其中显示了云计算节点的一个例子。图1显示的云计算节点10仅仅是适合的云计算节点的一个示例,不应对本发明实施例的功能和使用范围带来任何限制。总之,云计算节点10能够被用来实现和/或执行以上所述的任何功能。[0047]云计算节点10具有计算机系统/服务器12,其可与众多其它通用或专用计算系统环境或配置一起操作。众所周知,适于与计算机系统/服务器12—起操作的计算系统、环境和/或配置的例子包括但不限于:个人计算机系统、服务器计算机系统、瘦客户机、厚客户机、手持或膝上设备、基于微处理器的系统、机顶盒、可编程消费电子产品、网络个人电脑、小型计算机系统、大型计算机系统和包括上述任意系统的分布式云计算技术环境,等坐寸ο[0048]计算机系统/服务器12可以在由计算机系统执行的计算机系统可执行指令(诸如程序模块)的一般语境下描述。通常,程序模块可以包括执行特定的任务或者实现特定的抽象数据类型的例程、程序、目标程序、组件、逻辑、数据结构等。计算机系统/服务器12可以在通过通信网络链接的远程处理设备执行任务的分布式云计算环境中实施。在分布式云计算环境中,程序模块可以位于包括存储设备的本地或远程计算系统存储介质上。[0049]如图1所示,云计算节点10中的计算机系统/服务器12以通用计算设备的形式表现。计算机系统/服务器12的组件可以包括但不限于:一个或者多个处理器或者处理单元16,系统存储器28,连接不同系统组件(包括系统存储器28和处理单元16)的总线18。[0050]总线18表示几类总线结构中的一种或多种,包括存储器总线或者存储器控制器,外围总线,图形加速端口,处理器或者使用多种总线结构中的任意总线结构的局域总线。举例来说,这些体系结构包括但不限于工业标准体系结构(ISA)总线,微通道体系结构(MAC)总线,增强型ISA总线、视频电子标准协会(VESA)局域总线以及外围组件互连(PCI)总线。[0051]计算机系统/服务器12典型地包括多种计算机系统可读介质。这些介质可以是能够被计算机系统/服务器12访问的任意可获得的介质,包括易失性和非易失性介质,可移动的和不可移动的介质。[0052]系统存储器28可以包括易失性存储器形式的计算机系统可读介质,例如随机存取存储器(RAM)30和/或高速缓存存储器32。计算机系统/服务器12可以进一步包括其它可移动/不可移动的、易失性/非易失性计算机系统存储介质。仅作为举例,存储系统34可以用于读写不可移动的、非易失性磁介质(图1未显示,通常称为“硬盘驱动器”)。尽管图1中未示出,可以提供用于对可移动非易失性磁盘(例如“软盘”)读写的磁盘驱动器,以及对可移动非易失性光盘(例如⑶-ROM,DVD-ROM或者其它光介质)读写的光盘驱动器。在这些情况下,每个驱动器可以通过一个或者多个数据介质接口与总线18相连。存储器28可以包括至少一个程序产品,该程序产品具有一组(例如至少一个)程序模块,这些程序模块被配置以执行本发明各实施例的功能。[0053]具有一组(至少一个)程序模块42的程序/实用工具40,可以存储在存储器28中,这样的程序模块42包括但不限于操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。程序模块42通常执行本发明所描述的实施例中的功能和/或方法。[0054]计算机系统/服务器12也可以与一个或多个外部设备14(例如键盘、指向设备、显示器24等)通信,还可与一个或者多个使得用户能与该计算机系统/服务器12交互的设备通信,和/或与使得该计算机系统/服务器12能与一个或多个其它计算设备进行通信的任何设备(例如网卡,调制解调器等等)通信。这种通信可以通过输入/输出(I/O)接口22进行。并且,计算机系统/服务器12还可以通过网络适配器20与一个或者多个网络(例如局域网(LAN),广域网(WAN)和/或公共网络,例如因特网)通信。如图所示,网络适配器20通过总线18与计算机系统/服务器12的其它模块通信。应当明白,尽管图中未示出,其它硬件和/或软件模块可以与计算机系统/服务器12—起操作,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、RAID系统、磁带驱动器以及数据备份存储系统坐寸ο[0055]现在参考图2,其中显示了示例性的云计算环境50。如图所示,云计算环境50包括云计算消费者使用的本地计算设备可以与其相通信的一个或者多个云计算节点10,本地计算设备例如可以是个人数字助理(PDA)或移动电话54A,台式电脑54B、笔记本电脑54C和/或汽车计算机系统54N。云计算节点10之间可以相互通信。可以在包括但不限于如上所述的私有云、共同体云、公共云或混合云或者它们的组合的一个或者多个网络中将云计算节点10进行物理或虚拟分组(图中未显示)。这样,云的消费者无需在本地计算设备上维护资源就能请求云计算环境50提供的基础架构即服务(IaaS)、平台即服务(PaaS)和/或软件即服务(SaaS)。应当理解,图2显示的各类计算设备54A-N仅仅是示意性的,云计算节点10以及云计算环境50可以与任意类型网络上和/或网络可寻址连接的任意类型的计算设备(例如使用网络浏览器)通信。[0056]现在参考图3,其中显示了云计算环境50(图2)提供的一组功能抽象层。首先应当理解,图3所示的组件、层以及功能都仅仅是示意性的,本发明的实施例不限于此。如图3所示,提供下列层和对应功能:[0057]硬件和软件层60包括硬件和软件组件。硬件组件的例子包括:主机,例如IBM?zSeries?系统;基于RISC(精简指令集计算机)体系结构的服务器,例如IBMpSeries?系统;IBMxSeries?系统;IBMBladeCenter?系统;存储设备;网络和网络组件。软件组件的例子包括:网络应用服务器软件,例如IBMWebSphere⑧应用服务器软件;数据库软件,例如IBMDB2?数据库软件。(IBM,zSeries,pSeries,xSeries,BladeCenter,WebSphere以及DB2是国际商业机器公司在全世界各地的注册商标)。[0058]虚拟层62提供一个抽象层,该层可以提供下列虚拟实体的例子:虚拟服务器、虚拟存储、虚拟网络(包括虚拟私有网络)、虚拟应用和操作系统,以及虚拟客户端。[0059]在一个示例中,管理层64可以提供下述功能:资源供应功能:提供用于在云计算环境中执行任务的计算资源和其它资源的动态获取;计量和定价功能:在云计算环境内对资源的使用进行成本跟踪,并为此提供帐单和发票。在一个例子中,该资源可以包括应用软件许可。安全功能:为云的消费者和任务提供身份认证,为数据和其它资源提供保护。用户门户功能:为消费者和系统管理员提供对云计算环境的访问。服务水平管理功能:提供云计算资源的分配和管理,以满足必需的服务水平。服务水平协议(SLA)计划和履行功能:为根据SLA预测的对云计算资源未来需求提供预先安排和供应。[0060]工作负载层66提供云计算环境可能实现的功能的示例。在该层中,可提供的工作负载或功能的示例包括:地图绘制与导航;软件开发及生命周期管理;虚拟教室的教学提供;数据分析处理;交易处理;以及数据集成工作流处理。[0061]在示例性实施例中,工作负载层66中的DTIO增强编译器70生成此处所描述的DTIO序列,不过,需要理解的是,增强编译器70可以实现在任何层中并且可以用于生成要在硬件和软件层60中的各种硬件平台上执行的代码。[0062]在示例性实施例中,工作负载层66中的DTIO增强连接器80生成DTIO序列并优化此处描述TOC引用;不过,需要理解的是,增强连接器80可以实现在任何层中并且可以用于生成要在硬件和软件层60中的各种硬件平台上执行的代码。[0063]在一个实施例中,被优化用来生成DTIO序列的增强编译器70执行在计算机系统/服务器12的在云环境50中执行的处理单兀16上,或者执行在适于开发用于云环境50的应用的系统54A、54B或54C上。在一个实施例中,被优化连接和优化应用中的表引用(tablereference)的增强连接器80运行在云环境50的相同服务器12的处理单元16中或系统54A、54B或54C之一中。在另一个实施例中,增强编译器70以及增强连接器80运行在与云环境50对应的至少一个服务器或计算机系统或者系统54A、54B或54C的不同处理单元16上。[0064]增强编译器70以及增强连接器80—起生成被指向运行在处理单元16上的应用,当该被生成的应用在云环境50或在系统54A、54B、54C以及54N的至少之一中的服务器12中被执行时,该处理单元16实施DT10。所生成的应用存储在存储介质中,该存储介质诸如虚拟存储器62、外部设备14或诸如内部安装的系统闪存的另一种方案。[0065]现在参照图4,一般地显示了根据实施例的T0C402和数据对象404(标记为数据“A”)。通过提供一种用于应用代码的位置独立方式来存取数据,T0C402被利用来存取变量并支持共享库。TOC被用于为共享数据解析外部引用,其中TOC中的每个地址输入项含有变量的地址。TOC容许相同的应用代码指向(referto)不同数据,因为该应用代码和该数据彼此并不固定。图4中所示的T0C402起始于寄存器“R2”中包含的地址,并且具有多个输入项(每个包含有变量的地址),所述多个输入项包括在偏移“D1”处的输入项。所述在偏移“D1”处的输入项中的地址为数据对象404的起始地址。图4中所示的数据对象404具有存储在与数据对象404的起始地址相距偏移“D2”处的数据。[0066]下面的目标代码序列将存储在数据对象404中的偏移“D2”处的数据加载到寄存器“R4”。[0067]IdR3=R2+D1[0068]IdR4=R3+D2[0069]第一加载指令将在偏移“D1”处的数据对象404的地址从T0C402加载到寄存器“R3”,并且第二加载指令加载来自数据对象404的在偏移“D2”处的数据。[0070]如前所述,在其他应用二进制接口(ABI)定义中,与TOC类似的表被称之为GOT。此处针对T0C402的描述也可类似地应用到GOT。[0071]诸如增强编译器70的编译器,以及诸如增强连接器80的连接器,一起工作以便生成经由TOC引用(reference)变量的代码。该编译器生成目标代码并创建在TOC加载指令和符号表输入项(例如全局变量)之间的连接。所述连接器解析符号定义和引用、映射所有的数据(构建T0C),并随后在由编译器生成的TOC加载指令上的位移字段中输入值。[0072]在编译器不知道对象数据404的地址的T0C402中的偏移位置时,由编译器生成将存储在数据对象404中的偏移“D2”处的数据加载到寄存器“R4”中的下述目标代码序列。[0073]IdR3=R2+0[Ref:Symbol“A”][0074]IdR4=R3+D2[0075]Symbol=“A”[0076]Length=24[0077]Alignment=8[0078]etc.[0079]连接器在将应用连接在一起时将偏移插入TOC。上面代码的符号、长度以及对齐方式(alignment)部分告知连接器数据对象并将其约束(tie)到第一加载语句(statement)。该连接器解析符号“A”、映射数据、在Dl处分配TOC输入项以及随后在相关联TOC加载指令中覆写位移字段。[0080]存储器存取指令中的立即(immediate)位移字段的寻址范围受限于计算机架构支持什么。例如,在IBMPowerArchitecture⑧中,该位移限于16比特,这提供可以从基址寄存器开始寻址64千字节(KB)内的数据的能力。其他ABI限于32比特或64比特。这些限制在变量的数量大于TOC所支持的输入项的数量时会产生问题。[0081]用于生成TOC引用的指令集(例如D-form,DS-form)和协定(convention)实际上限制了TOC的尺寸。D-form指令是一种owerPC?处理器上的主存储器存取指令形式之一,并且其通常用于执行加载、存储以及立即数模式(immediatemode)计算,并且限于16比特的地址字段。D-form指令的格式为:0-5的操作码、6-10比特的源/目标寄存器、11_16比特的地址/变址寄存器/操作数以及16-31的数字地址/偏移/立即数模式值。因此地址字段只有16比特,可转换成64KB的地址范围。通过采用寄存器(例如指向TOC的中间寄存器“R2”),连接器使用有正负的16比特位移(+/-32KB)映射TOC。DS-form指令具有与D-form指令相同的地址范围,不过DS-form指令限于32比特对齐存储器。[0082]当TOC用完空间(例如,有多于64000或64K个的变量)时,连接器会出错并给出出错消息。或者连接器可以创建多个TOC并使用“框架(trampoline)”代码来在多个TOC之间切换。因此,如果所请求的变量没有在当前TOC中,加载备用TOC的地址以便存取所请求的变量。例如,下面显示了目标代码,其中参考符号“A”的偏移不适合该指令的位移偏移。[0083]IdR3=R2+0[Ref:Symbol“A”][0084]IdR4=R3+D2[0085]是否由连接器转换为目标代码:[0086]bLI[0087]L2:ldR4=R3+D2[0088]........[0089]L1:addisR3=R2,I[0090]IdR3=R3+D1[0091]bL2[0092]如上所示,分支(branch)指令由连接器添加。在该实例中,在存储器中彼此相邻地放置有两个64KBTOC0第一TOC的基址(base)位于包含在寄存器“R2”中的地址处。而第二TOC的基址位于包含在寄存器“R2”中的地址+64KB处。第二TOC的基址按照如上所示采用“addis”指令计算,该“addis”指令将寄存器“R2”的内容向左移动16个位置,从而到达第二TOC的位置。随后针对第二TOC的基址计算偏移“D1”并且该代码分支回到“L2”以便继续处理。[0093]因此,如上所示,为了适应大量的变量,连接器为目标代码引入附加指令,导致了代码扩展和较慢的执行。如上所示,TOC溢出框架的使用导致了由于附加框架代码而产生的过度代码扩展以及每个引用引入两个附加控制流。这会由于引用失去本地性而导致较差的高速缓存性能,以及由于通过分支到所述框架而引入的非顺序代码而导致较差的指令取出(fetch)性能。[0094]TOC的尺寸大致与可执行或共享库的尺寸成正比。通常会有好几百个源文件和几十万行代码。每个唯一的被引用的外部符号(数据或代码)都具有TOC输入项。如上所述,在32-比特模式中,TOC的容量为16K个输入项,而在64-比特的模式中TOC的容量为8K个输入项。当数据存储在TOC中时(例如通过移除间接层级而缩短路径长度)会消耗附加TOC空间。[0095]解决TOC溢出问题的另一个流行(contemporary)方法是引入具有较大位移的新指令。该方法对支持较大位移值的计算机平台有效,不过利用新指令的代码将不能在较老的计算机系统或者不支持所述较大位移值的其他计算机平台系统(例如IBMRISC架构)上执行。在很多情况下,人们期望应用代码可在尽可能多的环境下执行,而开发者则会在使用那种会限制在较旧的平台上执行该代码的能力的新指令格式方面有所犹豫。[0096]与在指令集中通过直接指定位移确定的TOC尺寸相比,在此描述的实施例减少了在通过TOC溢出而特征化的环境中存取全局数据时必须由处理器(例如微处理器)执行的内部操作的数量。用于优化和组合多个指令使得第二指令被内部操作(内部指令)替代的硬件处理在此被称之为解码时间指令优化(DT10),该内部操作能够在指令序列中独立于第一指令执行。第一指令可以在不需要执行第二指令之前执行第一指令的情况下被执行,或者从内部执行中消除。DTIO是一种容许处理器基于被优化的指令序列生成改进指令序列的技术。根据此处所述的实施例,编译器生成适于在处理器中开发DTIO能力的ABI序列。为了支持有效执行具有较大T0C/G0T的程序,处理器适于对关键序列执行DT10。[0097]DTIO被应用于由编辑器生成的下述代码数据,以便将该代码序列组合成两个更有效运行的指令。下面所示的目标代码将该偏移值的(在连接处理器将由连接器输入的)16个高阶比特添加到TOC的起始地址(地址存储在寄存器“R2”)中,并将结果存储在寄存器“R5”(R2+0xl2340000)。第二指令将存储器内容加载到作为存储在寄存器“R5”中的地址与所述偏移值的16个低阶比特的和(R2+0xl2340000+0x00005678)的地址处。因此,寄存器“R3”包含该数据对象的地址。第二指令依赖于第一指令,因为其直到确定了用于寄存器“R5”的值才能被执行。[0098]addisR5,R2,0x1234[0099]IdR3=R5+0x5678[0100]在示例性实施例中,能够执行DTIO的处理器单元16识别上述代码方案并采用不依赖彼此的随后两个内部指令(或内部操作)替代它。[0101]在另一个代码指令使用存储在寄存器“R5”的情况下计算第一指令结果。由DTIO生成的第二内部指令,即加载指令,在一次计算中执行由上述两个相邻指令的序列先前执行的计算。该内部加载指令(能够处理比PowerISA所支持的偏移值更宽的偏移值的加载指令)将来自上述指令的组合偏移的值添加到存储在寄存器“R2”中的地址中。[0102]addisR5,R2,0x1234[0103]IdR3=R2+0xl2345678[0104]上述代码序列被称为非破坏性操作数序列,因为寄存器“R5”中的中间结果需要保存以备后面的指令读取寄存器“R5”中的值。有利的是,第二指令能够相对于第一指令无序地执行,由此加速了加载指令的完成。[0105]以上所示的第一代码序列可以写成为如下GOT存取序列:[0106]addisR5,R2,Iabeligotih[0107]Idreg,labeligotil(R5)[0108]该代码序列被处理器单元16使用DTIO优化成与下面的序列对应的内部操作(IOP)序列。[0109]addisR5,R2,Iabeligotih[0110]Idreg,IabelOgot(R2)[0111]第一指令是相加移位立即Ι0Ρ,而第二指令是加载Ι0Ρ。在该非破坏性代码序列中,第一指令不能被消除,因为在DTIO序列完成执行后寄存器“R5”是构造(architected)状态的一部分。有利的是,第二指令能够相对于第一指令不按顺序地执行,这加速了加载指令的完成。本领域普通技术人员将理解到,在一个实施例中,Oh可能上下文敏感,并且被用于指称(referto)在与addis指令结合使用时对应于定义addis指令所计算的高阶比特,以及被用于指称在结合现有技术与oris指令结合使用时对应于定义oris指令所计算的高阶比特。本领域普通技术人员将理解到,在另一个实施例中,两个不同的说明符(specifier)iha和Oh将以上下文不敏感的方式被使用,并且Oha将被用于指称在与addis指令结合使用时对应于定义addis指令所计算的高阶比特,以及Oh将被用于指称在结合现有技术与oris指令结合使用时对应于定义oris指令所计算的高阶比特。[0112]下面是第二代码序列,在至少一个实施例中其将被实现DTIO的微处理器16修改。该代码序列可以被称为破坏性操作数序列,因为寄存器“R3”被第二指令覆写。[0113]addisR3,R2,0x1234[0114]IdR3=R3+0x5678[0115]这两个指令被合并成如下单一加载Ι0Ρ。[0116]IdR3=R2+0xl2345678[0117]有利的是,仅有一个IOP必须被执行以替代两个相关操作的序列。[0118]以上所示的第二破坏性操作数代码序列可以被写成如下GOT存取序列:[0119]addisreg,R2,Iabeligotih[0120]Idreg,labeligotil(reg)[0121]该代码序列由实现DTIO的处理器单元16优化成与含有单一加载指令的下面序列对应的单一IOP:[0122]Idreg,IabelOgot(R2)[0123]此处描述的实施例涉及含有适于存取较大TOC(即相对于由指明指令位移所提供的可寻址性的溢出T0C)的程序的指令序列。用于存取TOC的指令序列包括可以通过DTIO处理进一步优化的计算指令的序列。该优化导致用于存取TOC的关键依赖链中的内部操作的数量减少。在使用经受DTIO的TOC寻址的破坏性形式的优化环境中,用于对TOC寻址的内部操作的实际数量得到减少。[0124]使用DTIO优化的优势在于,该代码序列在具有支持DTIO的硬件的处理器和老旧(legacy)处理器(或不支持DTIO的处理器)之间可完全移植(portable)。在一个实施例中,通过DTIO优化的序列对应于基于预先存在的ISA的指令序列。编译器和连接器合作以便在支持DTIO的微处理器中以有助于DTIO优化的方式汇编(assemble)序列。在不支持DTIO的微处理器中,与基于预先存在的ISA的任何其他指令序列一样,将直接并兼容性执行由现有技术指令构成的序列。[0125]图5表示根据本发明实施例的由编译器执行的用于生成TOC引用的处理的流程图。在一个实施例中,该处理由图3所示的增强编译器70来执行。在块502处,生成与用于TOC引用的多个指令对应的内部表征。这些指令是将采用如前所述的DTIO处理优化的指令。[0126]在块504处,编译器中的调度程序成本函数以确保多个指令以有助于DTIO的方式被发出的方式被修改。如在此所使用的,术语“调度程序”指的是编译器的负责生成“指令进度”的部分,即分派指令在程序中出现的顺序的部分。调度程序中的目标之一通常是移动相关的指令使其彼此尽可能远离,以便给予第一指令一些时间以便在第二相关指令消费其结果之前完成。在许多情况下,这会与可能对将被进行DTIO处理的指令有具体要求的实施DTIO的处理器有冲突,所述将被进行DTIO处理的指令诸如彼此在一定范围内的指令,或者彼此相邻的指令。因此,通常的调度程序不会以在能进行DTIO的处理器中支持DTIO的方式对指令进行排序。可以修改编译器中的成本函数的一种途径是当成本函数生成为TOC存取序列的一部分时将用于第一指令(例如addis)的成本函数设置为零。当addis指令与TOC序列相关联时,这可以通过为addis指令分配新的指令寄存器(IR)来实现。随后调度程序将趋向于一个挨一个地调度第一addis指令和第二指令。还可以修改该调度程序以确保具有零成本度量的指令紧接于消费者(consumer)后被调度。确保多个指令以有助于DTIO的方式被发出的另一种途径是修改调度程序,从而紧接于TOC序列的第二指令之后调度TOC序列的第一指令(即,第一指令和第二指令是有顺序的)。这可以通过为与TOC序列相关联的addis分配新的指令寄存器(IR)来实现,并且在第一指令被调度给TOC引用时,第二指令被调度。还有一种确保多个指令以有助于DTIO的方式被发出的途径是修改调度程序以便辨识可以被应用DTIO的成对消失的(pairingsoff)addis指令和相关指令,并且随后使得调度程序一个挨一个地调度它们。[0127]参见图5,在块506处,编译器例如以再定位信息的形式为连接器生成指令,以便指出TOC(或GOT)引用中的需要成为G0T/T0C的部分的任何输入项,以及指出哪个指令需要具有与完整TOC内的被插入该指令中的偏移对应的偏移的至少一部分。根据一个实施例,生成指示多个指令序列的再定位信息。根据另一个实施例,根据现有技术生成分离关系信息,用于指示用于引用的偏移的第一部分以及指示用于引用的偏移的第二部分。[0128]图6表示根据本发明另一个实施例的通过编译器执行的用于生成TOC引用的流程图。图6中所示的实施例可以在编译器具有TOC引用IR小程序(facility)时使用。这使得编译器能够使用将被作为序列发出到该代码中的用于TOC引用的单一内部表征,以及针对指令调度更精确地对该序列的执行进行模型化,并且不需要修改来在IR中提供(allow)“零成本”addis-型指令。根据作为单一IR引用的TOC引用的IR表征,需要知晓指令计数的部分被修改为知晓这样的事实,即所述TOC引用IR小程序将被作为多个ISA指令发出,诸如用于跟踪TOC相关分支的位移、用于对指令格式进行模型化、用于将分支目标对齐到理想的边界等等。[0129]在块602处,生成对应于TOC引用的IR表达以便向处理器发出该IR表达是TOC引用的信号。在块604,编译器中的调度程序和代码生成器被修改为理解对应于TOC引用的IR表达将被扩展为多个指令(例如,用于关于代码偏移以及指令分组的决策),而且对应于被进行DTIO处理的IOP序列的减少的等待时间。因此,为了格式化指令,TOCIR引用序列在被编译器发送到目标文件时被作为多个指令,不过,为了使得IR引用的定时特性模型化,由硬件中的DTIO函数在运行时生成的内部操作序列被用来作出调度决定。[0130]在块606处,通过将TOCIR扩展为多个机器指令而生成代码。在块608处,发出目标文件用于由连接编辑器连接。在图6所示的实施例中,编译器被扩充以便支持用于TOC引用的新IR代码,该新IR代码反映TOC载荷将使用更多二进制的单一加载指令,并且能够以与被进行过DTIO处理的序列对应的精简数量的周期被执行。[0131]在另一个实施例中,编程器生成汇编码,汇编码含有能够被进行DTIO处理的TOC引用,并且该汇编器生成目标文件。编程器可以负责生成与被进行DTIO处理的序列对应的多个汇编指令。可替代地,提供汇编器固有的被扩展的记忆码或宏指令,其将生成含有多个DTIO指令的TOC加载序列。[0132]例如,增强汇编器可接受增强的句法@got32并生成破坏性形式的两个指令序列addis/ld。在该实施例中,单一汇编器操作如下:[0133]Idreg,lableigot32(R2)[0134]生成二进制指令和再定位,等同于:[0135]addisreg,lableigotiha(R2)[0136]Idreg,lableigotil(reg)[0137]这与当前PowerISA相同,并且将在没有DTIO特征的PowerISA处理器上正确执行,但是反映了编程器的意图,该意图为该操作优选地在能够进行DTIO的处理器上执行。[0138]硬件限制会对DTIO处理造成影响。例如,许多硬件系统只能支持破坏性DTIO序列。在其他硬件系统中,对能够经受DTIO处理的位移尺寸有限制(例如,限于21比特或更少的偏移)。这些限制可以发送到编译器和/或编程器,使得它们获知哪个序列将被映射到目标硬件DTIO性能。[0139]在有些实施例中,例如,在对Linux系统进行编译时,当主要模块通过将位移加到TOC基址上而计算该地址(而不是从GOT上加载它)时,编译器被优化以便通过推导TOC内的数据地而生成数据地址。实例代码序列如下:[0140]addisreg,R2,Iabeligotih[0141]Idreg,labeligotil(reg)[0142]根据本发明的一个方面,该代码可以在代码生成期间通过编译器由下面的代码序列替换,或者可以在连接期间通过连接器由下面的代码序列替换。[0143]addisreg,R2,label@toc@ha[0144]addireg,reg,label@toc@l[0145]根据通过在编译器中的代码生成而能够进行基于硬件的DTIO的方面,实现DTIO的微处理器16随后将替换代码序列优化到下面的代码序列。[0146]addireg,reg,Iabelitoc[0147]也可以采用目标为使用addis/addi生成TOC引用的优化。这可以包括根据图6所示的处理分派除了T0C/G0T-加载引用IR指针之外的TOC-计算IR,以及根据图5所示的处理修改用于addis/addi组合的度量。[0148]编译器还可以改善TOC数据引用之后GOT加载的性能。实例代码序列如下:[0149]addisreg,R2,Iabeligotih[0150]Idreg,labeligotil(reg)[0151]Idreg,structure_offset(reg)[0152]该代码序列可以有下面的代码序列替代:[0153]addisreg,R2,(label+structure_offset)itocih[0154]Idreg,reg,(label+structure_offset)itocil[0155]随后DTIO将把该替换代码序列优化为如下单一IOP:[0156]Idreg,reg,(label+structure_offset)itoc//iop[0157]注意,所述structure_offset通常为零。该方法还可以被用于非整数加载,以便加载非整数数据,不过,所述形式不会是破坏性的并且因此需要对非破坏性DTIO的支持。[0158]下面参照图7-11描述连接器的实施例,诸如DTIO增强连接器80。此处描述的连接器优化与用于提供DTIO小程序的处理器和不提供DTIO小程序的处理器的TOC和/或GOT引用有关的、编译器生成的代码的性能。本领域普通技术人员将理解到,当整个程序编译包括生成全部被连接目标代码时,这些优化还可以作为编译的一部分被执行。[0159]图7表示根据本发明实施例的由连接器执行的用于创建被连接目标文件的流程图。在实施例中,该连接器的处理由增强连接器80实施。在块702处,连接器读取目标文件,并定位如下说明符的一个或多个:@toc@l、@toc@h、@got@l以及OgotOh。在其构建了TOC和/或GOT之后,连接器采用TOC和/或GOT中所指定的数据和/或数据引用的实际的高和低地址偏移替代这些说明符。通常,由增强编译器7产生的代码可以就以下一个或多个方面被连接器进一步优化:T0C和/或GOT中的数据格式(layout)以及被进行DTIO处理的代码(即正被DTIO硬件小程序优化的代码)中的寻址范围的使用、如果可行的话使用TOC地址计算替代GOT载荷、以及为了改善不具有DTIO硬件支持的处理器中的执行而消除不必要的addis指令。[0160]在块704处,连接器动态确定TOC的中点。因为TOC使用有正负的位移,所以找至IJTOC的中点给出了在数据结构上的低成本寻址的最佳有效区域(coverage)。由于性能原因,理想的是取中点之上的大约一半的地址以及在中点之下的大约一半的地址。在流行的连接器中,因为在该步骤之前TOC的尺寸是固定的,因此静态地确定中点(例如,在16个输入项处)。在此处描述的实施例中,TOC不是固定尺寸的,其可以基于被连接器连接的目标代码分段中的变量的数量而扩展。因为TOC的尺寸不固定,因此,作为连接处理的一部分,需要基于总的GOT和数据尺寸来确定TOC的中点。尽管针对TOC描述了块704,但是对于GOT而言也可以由连接器来执行相同的处理。[0161]在块706处,执行的引用代码优化,包括但不限于:引用序列修剪、基于基频的TOC和/或GOT包装以及GOT加载到TOC计算的扩展。在此描述这些引用代码优化的每一个的实施例。在块708处,连接器执行连接步骤(例如采用实际值替换在连接时被解释的符号的所有引用、将被连接的多个目标文件组合成单一目标文件、选择性地添加诸如glink的调用存根或PLT存根),并且根据@1和@h的定义生成连接的可执行文件,其中符号值的高和低部分被插入该被连接的可执行文件中。在块710处,为了程序加载和执行发出所连接的目标文件。[0162]在实施例中,诸如增强连接器80的连接器被用于执行存储器引用代码优化处理,诸如存储器引用序列修剪(pruning)。在一个实施例中,存储器引用序列修剪包括识别目标文件中的代码序列,该目标文件包含有多个指令并且指定了始于基址的偏移。始于基址的偏移对应于被配置为存储变量的地址和数据之一存储器中的偏移位置。所识别的代码序列被配置为执行存储器引用函数和存储器地址计算函数之一。为了安全地应用存储器引用序列修剪,偏移位置必须在所述基址的指定距离内,并且采用位移代码序列替代被识别的代码序列不能改变程序语义(即,将不会改变程序的动作)。如果修剪时“安全的”,被识别的代码序列在目标文件中被替换为所述位移代码序列,其中所述位移代码序列包括空操作(NOP)指令或比被识别代码序列少的指令。在此使用的术语“存储器引用函数”指的是计算地址和采用读操作或写操作存取由所计算的地址标识的存储器位置的动作。诸如Id、Iwzstd或stw、以及Ifdstfd的指令为PowerPC指令的实例,这些指令执行存储器引用函数。存储器引用函数的实例为TOC引用函数。如此处所使用的,术语“存储器地址计算函数”指的是计算存储器地址的动作(例如,通过将位移量加到基址上)。存储器地址计算的实例是为了计算元素的地址。例如,考虑到数据项的基址将在寄存器R5中,并且编译器需要推导在R7中的处的结构域(structurefield)的地址。该编译器可以发出下述序列来计算结构域的存储器地址:addisR7,R5,struc_offsetiha;addiR7,R7,struc_offset@l。[0163]图8表示根据实施例由连接器执行的用于执行存储器引用序列修剪的流程图。在一个实施例中,图8所示的处理由增强连接器80来实施。如之前所述,增强编译器70可以生成多指令序列,而不是用于需要较大位移量的存储器引用的单一指令。一个实例为TOC引用存取。根据本发明的另一个方面,采用例如C数组(array)引用中的较大位移量来存取数据引用:[0164]charx[BIG_SIZE],y;[0165]y=x[BIG_0FFSET][0166]当数组基址X被分派到寄存器R5并且值y应该被加载到寄存器R20时,以上序列可以转换成如下序列:[0167]addisR20,R5(arraybase),(LARGE_0FFSET*4)Oha[0168]IdR20,R20,(LARGE_0FFSET*4)@1[0169]在具有支持DTIO硬件的微处理器中,多指令序列通过硬件被如下(在所述依赖链中的)单一IOP操作所替代:[0170]IdR20,R5,(LARGE_0FFSET*4)[0171]该替代不会出现在不具有支持DTIO硬件的处理器中,并且图8中的处理在连接器中提供了被用于识别可以被修剪的多指令序列的处理。[0172]与多指令存储器引用序列相关联的指令在块802处被识别。可以通过寻找与多指令存储器引用序列的格式匹配的相关指令识别多指令TOC引用序列。可替代地,可以通过具有目标代码格式来识别这些序列,该格式可清晰识别这种序列。在块804处,确定所识别的引用是否对应于具有偏移的序列,该偏移能够被加载修剪的序列,并且在块806处,确定是否可以对代码序列执行修剪(修剪是否“安全”)。如果确定所述偏移能够加载被修剪序列以及修剪是安全的,则处理从块808流向块810。在块810处,全部代码序列由被修剪序列替代,并且在块812处,该代码序列中被消除的指令采用NOP替代。将NOP添加到该代码序列的替代方式是在可以获得全部再定位信息时消除不必要的代码空间。如果确定所识别的引用不对应于其偏移能被加载被修剪序列的引用和/或修剪是安全的,则处理从块808流向块814。块814处,全部多指令引用被留在该代码序列中。[0173]例如,在块802处,连接器将识别作为多指令GOT引用的下述指令引用。[0174]addisreg,R5,Iabeliha[0175]Idreg,reg,Iabelil[0176]在该实例中,与正被存取的数据相关联的位移值在存储在R5中的地址的32KB内。图8的块804将确定该代码序列具有能被加载修改的序列的偏移,因为不需要该位移量的高阶比特。因为该位移值在R5中的基址的32KB内并由此可以由缔结比特单独制定,因此不需要高阶比特。[0177]假设在块806处确定修剪是安全的,则处理从块808流向块810和812,其中连接器采用下面的代码序列替换上述代码序列。[0178]NOP[0179]Idreg,R2,labeligotil[0180]由于去除了对寄存器的依赖并且处理器优化了NOP情况,导致只有一个指令,因此替换代码序列比原来的代码序列更有效。[0181]可以识别为用于修剪的候选者的另一个代码序列如下:[0182]addisreg,R5,offsetiha[0183]addireg,reg,offsetil[0184]在上面的代码序列中,如果所述位移值在基址寄存器内的地址的32KB内,则不需要该位移的高级别比特。[0185]如果所述位移值在其正被加载了偏移的基址的32KB内,则连接器采用下述代码序列替换上述代码序列。[0186]NOP[0187]addireg,R5,offsetil[0188]下面是编码序列实例由于为多指令存储器引用序列的一部分可以在图8的块802中被识别并且因为不需要位移的高阶比特而具有能够采用被修剪序列被加载的偏移而在块804处被识别。在下面的代码序列中,连接器将在块806处确定修剪是不安全的。[0189]addisreg,R5,offsetiha[0190]Lir5,0[0191]Idreg,reg,offsetil[0192]这不等同于下面被修剪的代码序列。[0193]NOP[0194]LiR5,O[0195]Idreg,R5,offsetil[0196]修剪上述代码序列是不安全的,因为被修剪的代码序列不等同于原始代码序列。[0197]连接器可以具有一组规则来确定是否可以执行修剪。例如,一条规则是多指令存储器引用中的指令必须彼此相邻。另一个规则可以是在序列的第一指令和该序列的最后一个指令之间执行指令分析,并确保不出现对在第一addis中使用的并被用作随后指令中的新基址寄存器的基址寄存器的写入,其中被修剪的addis的结果被该addis指令的基址替换。可替换地,或此外,编译器能够指示其中能够安全执行修剪的代码序列。[0198]有利的是,结合安全检查的存储器引用识别方为连接器提供了使用在确定它们能适应16比特位移的编译时未被解析的偏移来改善序列的机会。在现有技术中,为了避免引入语义改变优化的问题,仅仅有使用已知为函数内的常数,诸如TOC基址,的寄存器的引用被使用。根据本发明,另一个规则可以是必须出现使用TOC基址寄存器的引用,该TOC基址寄存器被ABI定义成不被应用程序所改变以便除了在此根据本发明所教导的优化机会之外获取增强方法中的额外的现有技术代码改进机会。[0199]可以通过连接器执行的另一种引用代码优化是基于基频TOC引用包装。依赖于处理器,相对于TOC(或GOT)基址的不同距离可以具有不同成本。现在参见图9。总体显示了根据本发明实施例的TOC寻址方案的方块示意图。图9描绘了具有存储器地址的范围的T0C904以及指向T0C904基址的TOC地址寄存器912(例如上述实例中的寄存器“R2”)。如图9所示,TOC地址寄存器912指向T0C904的由连接器所动态计算出的中点。[0200]图9描绘了与没有DTIO硬件支持的微处理器(MP)相关联但是其中由连接器执行引用序列修剪的存取成本906。图9中所示的存取成本906是用于与TOC地址寄存器912中的值相距超过+/-32KB的所有引用的两个指令以及用于与TOC地址寄存器912中的值相距在+/-32KB内的所有引用的一个指令(当如上参照图8所描述的TOC序列修剪优化由连接器执行时)。[0201]图9还显示了与有DTIO硬件支持的微处理器(MP)相关联的存取成本908以及用于指定位移值的21比特。图9中所示的存取成本908是用于与TOC地址寄存器912中的值相距超过+/-1MB的所有引用的两个指令以及用于与TOC地址寄存器912中的值相距在+/-1MB内的所有引用的一个指令。因此,如果位移在21比特的范围内,则将发生由该硬件中的DTIO进行的指令合并,并且在没有DTIO改进序列的情况下具有超过21比特的位移的指令将继续执行。[0202]图9还显示了与有DTIO硬件支持的微处理器(MP)相关联的存取成本910以及用于指定位移值的26比特。图9中所示的存取成本910是用于与TOC地址寄存器912中的值相距超过+/-32MB的所有引用的两个指令以及用于与TOC地址寄存器912中的值相距在+/-32MB内的所有引用的一个指令。因此,如果位移在26比特的范围内,则将发生由该硬件中的DTIO进行的指令合并,并且在没有DTIO改进序列的情况下具有超过26比特的位移的指令将继续执行。[0203]与图9中所示的不同位移值相关的存取成本是一些实例,并且可以依赖于系统环境使用其他存取成本。例如,用于沿着正方向位于所指定范围之外的位移值的存取成本可以小于用于沿着负方向位于所指定范围之外的位移值的存取成本。此外,随着位移值与TOC地址寄存器912中的值相距越远,存取成本可以增加(例如,从I个指令到2个指令到3个指令等等的阶跃函数)。而且图9所示的实例假设使用有正负的位移。还可能依赖于诸如与TOC基址的接近程度的因素采用不同的存取成本使用没有正负的位移。[0204]图10表示根据本发明实施例的由连接器执行的用于执行基于基频TOC(或GOT)引用包装的引用代码优化处理的流程图。在一个实施例中,图10所示的处理由增强连接器80实施。如图10所示,连接器使用与项目(例如地址或数据)相关联的基频信息将使用最频繁的引用置于具有最低成本(例如最靠近TOC地址寄存器912中的值)的区域。在块1002处,连接器读取存取频率信息。所述读取频率信息可以基于简档(profile)信息或其可以是基于例如循环嵌套而合成生成的。另一个替代性实例是读取频率信息由用户指定。在块1004处,选择具有最高基频的项目,并且在块1006处,将该项目置于TOC中具有最廉价可获得成本的位置。在块1008处,确定是否更多需要放置的数据项目(例如,变量)。如果有更多需要放置的数据项目,则处理在块1004处继续进行。如果没有更多要放置的数据项目,则处理在块1010处结束。[0205]本领域技术人员将理解到,结合该实施例的教导,可以使用除了频率之外的成本度量(例如,折中目标尺寸以及基频)。[0206]图11表示根据本发明实施例的通过连接器执行的用于对TOC计算扩展执行GOT加载的引用代码优化处理的流程图。在一个实施例中,图11所示的处理由增强连接器80实施。如图11所示,如果连接器发现了非本地的(例如共享的)变量的引用,但是该变量被证明是在本地模块(例如主模块)中创建的,那么该连接器将优化该代码。[0207]在图11的块1102处,连接器识别与多指令GOT加载序列相关联的指令。可以通过寻找与该多指令TOC引用匹配的相关指令或通过获得清楚识别这种序列的目标代码格式来进行这种识别。在块1104处,连接器确定该引用是否对应于能够被TOC计算所替代的GOT加载引用。这可以通过连接器连接具有对主模块中的本地变量的引用的主模块来确定这一点。在块1106处,连接器通过例如测试TOC引用是否在地址引用表基址的限定范围内来确定这种变换是否“安全”。例如,该范围可以对应于能够被用于执行TOC数据地址计算的多个位移比特之一,或者对应于能够被被用于执行TOC数据地址计算的指令的数量。一种示例性情形为,用于加载GOT的指令序列只能被计算相同长度(或更小长度,在这种情况下序列长度可能由于插入了NOP指令而等于相同长度的位移)的TOC输入项的序列所替代。这种情形十分普遍,因为普遍使用的流行连接器并不能对代码进行所需要的大的修改。如果引用对应于能够被替换为TOC计算的GOT加载引用并且该转换是安全的,那么处理从块1108流向块1110,并且执行扩展。在块1112处,在代码序列中的被消除的指令采用NOP替代。向代码序列添加NOP的替代方式是如果可以获得全部再定位信息则消除不必要的代码空间。[0208]下面是在块1104处会被确定为与能够采用TOC计算替代的GOT加载引用对应的这种类型的代码序列的实例:[0209]addisreg,R2,Iabeligotih[0210]Idreg,labeligotil(reg)[0211]在图11的块1110处,连接器采用下面的代码序列替代上面的代码序列[0212]addisreg,R2,Iabelitocih[0213]addireg,reg,Iabelitocil[0214]如上所示,GOT加载指令被转换成TOC计算指令。此外,在块1112处,如果连接器发现变量在TOC的32KB内,其将执行如上所述的修剪并按如下方式将该addis指令优化成NOP指令[0215]NOP[0216]addireg,r2,Iabelitocil[0217]下面是另一个实例,其中连接器优化其中引用非本地变量的代码,但是该变量被证明是在本地模块(主模块)中创建的。[0218]addisreg,R2,label@got@h[0219]Idreg,labeligotil(reg)[0220]Idreg,struc—offset(reg)[0221]在块110处,连接器釆用下述代码序列替换上述代码序列。[0222]NOP[0223]addisreg,R2,(label+struc—offset)@toc@h[0224]Idreg,reg,(label+struc—offset)@toc@l[0225]此外,在块1112处,如果连接器发现变量在TOC的32KB内,其将执行上述修剪并按如下方式将addis指令优化成NOP指令。[0226]NOP[0227]NOP[0228]Idreg,R2,(label+struc_offsete)itolil[0229]此处描述的实施例既对不具有DTIO能力的遗留的硬件平台提供了性能改进也对能够进行DTIO的硬件平台提供了性能改进。此处描述的新代码既能够在遗留的硬件平台执行也能够在能进行DTIO的硬件平台上执行。新的目标可以点缀一些老目标(混合和匹配目标,不破坏ABI连续性)。例如,具有老TOC存取序列的遗留目标能够与新目标连接起来,同时在没有使用新引用时连续构建框架(trampoline)。[0230]在一个实施例中,老的连接器/老的环境被用于构建具有新库的目标。如果新引用高阶比特引用标记(marker)被忽略而新低阶引用比特标记与遗留引用标记兼容,则可以实现这一点。在该实施例中,遗留引用标记被用于低阶比特,并且使用用于高阶比特的乱真容差(allowance)。如果溢出,与框架结合的新生成代码导致一种或多或少更慢(与流行方案比较)但是正确的执行。新库可以供应到遗留(legacy)环境。[0231]此处描述的处理将调度的高度降低到与遗留代码中的短(单一指令)位移序列相似的高度。[0232]在一个实施例中,PowerPC64可扩展连接格式(ELF)ABI使用术语TOC和GOT。此处定义的TOC是为了与64-比特PowerOpenABI所定义的TOC相似。如此处所使用的,TOC被定义为ELFGOT加小数据。GOT部分包含传统的ELFG0T,并且能够选择性地包含小数据区域(浮动常量等)。基址(TOC)是地址G0T+0x8000并且被TOC专用的指针寄存器“R2”所引用。GOT和小数据区域可以在GOT部分相互混合。与GOT相邻的部分(程序语言表(PLT)以及小数据)还可以经由TOC专用指针存取。[0233]如此处所使用的,句法SYMBOLOtoc表示值(SYMBOL-base(T0C))o这提供了其名称为的变量的地址,作为相对TOC基址的偏移。句法SYMB0L@toc@ha、SYMBOLigotih以及SYMBOLitocil表示TOC偏移的调整过的高部分、高部分以及低部分。[0234]句法SYMBOLOgot表示值(SYMB0L@got_base(TOC))。这提供了包含其名称为SYMBOL的(64-比特)地址变量的.got输入项的地址,作为相对TOC基址的偏移。句法SYMBOLigotiha,SYMBOLigotih以及SYMB0L@got@l表示GOT偏移的调整过的高部分、高部分以及低部分。[0235]此处已经使用具体代码实例阐述了可由增强编译器70、增强连接器80以及DTIO硬件执行的各种优化处理。这些实例并不是为了限制本发明的实施例,并且本领域普通技术人员将会理解到可以使用其它代码序列来执行此处所述的处理。[0236]本领域技术人员将理解到,本发明的方法可以实施为一个系统、方法或计算机产品。因此,本发明的方面可以采取完全硬件实施例、完全软件实施例(包括固件、驻留软件、微-代码等等)、或者组合了可以全部被称之为“电路”、“模块”或“系统”的软件和硬件方面的实施例。而且,本发明的方法可以采用计算机程序产品形式,其被置入一个或多个其中置入有计算机可读程序代码的可读介质中。[0237]可以使用一个或多个计算机可读介质的任何组合。计算机可读介质可以是计算机可读信号介质或计算机可读存储介质。计算机可读存储介质可以是例如但不限于:电子、磁性、光学、红外或半导体系统、装置或设备,或者前述任意适当组合。计算机可读存储介质的更具体实例(非排他性名单)可以包括:具有一条或多条线的电连接、便携式计算机软盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦除只读存储器(EPROM或闪存)、光纤、便携式光盘制度存储器(CD-ROM)、光学存储设备、磁性存储设备、或前述存储器的任何适当的组合。在本文的上下文中,计算机可读存储介质可以是任何实体介质,其可以包含有或存储有由或结合指令执行系统、装置或设备使用的程序。[0238]计算机可读信号介质可以包括具有置于例如基带计算机可读代码中的或作为载波一部分的被传播数据信号。这种被传播信号可以米用各种形式,包括但不限于:电磁、光学或其任何组合。计算机可读信号介质可以是任何计算机可读介质,其不是计算机可读存储介质并且能够通讯、传播或传送用于或与指令执行系统、装置或设备结合使用的程序[0239]置于计算机可读介质上哦程序代码可以使用任何适当的介质传输,包括但不限于:无线、有线、光缆、RF等或其任何适当的组合。[0240]用于执行本发明的方面的操作的计算机程序代码可以一种或多种编程语言的任何组合方式编写,包括但不限于:面向对象的编程语言,诸如Java、Smalltalk、C++等,以及传统程序化编程语言,诸如“C”编程语言或类似编程语言。程序代码可以完全在用户计算机上执行,作为独立于操作系统的软件包部分在用户计算机上执行、部分在用户计算机上部分在远程计算机上执行、或者在远程计算机或服务器上执行。在后一种情形中,远程计算机可以通过任何类型的网络连接到用户计算机上,所述网络包括局域网(LAN)或广域网(WAN)、或者可以(例如通过使用英特网服务提供商的英特网)连接到,外部计算机。[0241]此处参照根据本发明的实施例的方法、装置(系统)和计算机程序产品的流程图图示和/或方块示意图描述的本发明的方面。将理解到,在流程图和/或方块示意图中的每个块和流程图和/或方块示意图中的块的组合可以由计算机程序指令实现。这些计算机程序指令可以提供给通用计算机、专用计算机、或其他可编程数据处理装置的处理器,并以便产生机器使得经由计算机或其他可编程数据处理装置的处理器执行的指令创建用于实施流程图和/或方块图的一个或多个方块中执行的功能/动作。[0242]这些计算机程序指令还可以存储在计算机可读介质中,其使得计算机、其他可编程数据处理装置或其他设备以一种特定方式其作用,以便存储在计算机可读介质中的指令产生一种制品,该制品包括实现流程图和/或方块图的一个或多个方块中执行的功能/动作的指令。[0243]计算机程序指令也可以加载到计算机、其他可编程数据处理装置或其他设备,以便使得一系列操作步骤能在计算机、其他可编程数据处理装置或其他设备上执行的操作步骤能够产生一种计算机实施例的处理,以便指令在计算机、其他可编程数据处理装置或其他设备上执行,用于实现流程图和/或方块图的一个或多个方块中执行的功能/动。[0244]图中的流程图和方块示意图图释了根据本发明各种实施例的系统、方法和计算机程序产品的可能实施方式的架构、功能以及操作。因此,流程图或方块示意图的每个块可以代表模块、分段或部分代码,其包括一个或多个可执行指令,用于实现所指定的逻辑函数。还需要指出的是,在一些可替换实施例中,方块中提到的功能可以不按照图中的顺序出现。例如,连续显示的两个块实际上可以基本同时被执行,或者有时候可以根据所涉及的功能而反向执行。还应该指出的是,方块示意图和/或流程图的每个块以及方块图和/或流程图中的多个块的组合可以由执行专门功能或动作的专用硬件系统、或由专门硬件和计算机指令的组合来实现。[0245]此处所用的术语仅仅是为了描述特定实施例,并不是为了限制本发明。如在此所使用的单数形式“一”、“一个”以及“该”,其也意图包括复数形式,除非上下文中有清楚指明。还需要理解的是,在本说明书中使用的术语“包括”和/或“包含”指明了声称的所述特征、整数、步骤、操作、元件、和/或组件,但是并不排除存在或增加一个或多个其他特征、整数、步骤、操作、元件、和/或组件。[0246]在下面的权利要求书中的所有装置或部分加功能元素的对应结构、材料以及等同物意图包括任何结构、素材或动作,其用于结合其他被要求保护元件来执行被具体要求保护的功能。为了阐述和说明目的已经给出了本发明的描述,但是其不是为了以所披露的形式穷尽或限定本发明。对本领域普通技术人员而言很清楚的是,在不脱离本发明的范围和构思的情况下可以有多种修改和变化形式。选择和描述这些实施例是为了更好地解释本发明的原理以及实践应用,并且使得其他本领域人员能够理解本发明在适应可想到的特定用途时用于具有各种修改方式的各种实施例。[0247]此处描绘的流程图仅仅是一个实例。此处描绘的图或步骤(或操作)在不脱离本发明的精神的情况下可以有多种变化形式。例如,可以以不同的顺序执行这些步骤,或者可以增加、删除或修改步骤。所有这些变化形式都被认为是所要求保护的发明的一部分。[0248]尽管已经描述了本发明的优选实施例,但是本领域技术人员将理解到,现在或将来可以作出落在后面权利要求范围内的各种改进和增强。这些权利要求将被认为保持对第一次描述的本发明的适当的保护。【权利要求】1.一种方法,包括:通过计算机读取目标文件,该目标文件包括多个代码序列;识别所述目标文件中的代码序列,该代码序列指定相对基址的偏移量,所述相对基址的偏移量对应于在被配置为存储变量的地址或数据之一的存储器内的偏移位置,识别的代码序列包括多个指令并且被配置为执行存储器引用函数或存储器地址计算函数;确定所述偏移位置在所述基址的指定距离内;验证采用替换代码序列替换所识别代码序列不会改变程序语义;采用所述替换代码序列替换所述目标文件中所识别代码序列,所述替换代码序列包括空操作(NOP)指令或者具有比所识别代码序列少的指令;响应于所述目标文件生成连接的可执行代码;以及发出所连接的可执行代码。2.根据权利要求1所述的方法,其中所述基址对应于变量地址参考表,并且具有高存取频率的变量的地址存储在与存储具有低存取频率的变量的地址的偏移位置相比与变量地址参考表的基址更近的偏移位置,所述低存取频率小于高存取频率。3.根据权利要求1所述的方法,其中所述多个指令为顺序指令。4.根据权利要求1所述的方法,其中所述验证采用替换代码序列替换所识别代码序列不会改变程序语义包括:核查与在所识别的代码序列中指定的所述相对基址的偏移量对应的偏移位置没被配置为在所识别代码序列中的最后指令之前被写入新值。5.根据权利要求1所述的方法,其中所述基址对应于全局偏移量表(G0T),在所识别代码序列中的所述多个指令之一包括GOT加载引用指令,并且所述替换代码序列还包括内容表(TOC)计算指令。6.一种系统,包括适于执行根据任意前述权利要求所述的方法的所有步骤的装置。7.一种计算机程序,包括在该计算机程序在计算机系统上被执行时用于执行根据任意前述权利要求所述的方法的所有步骤。【文档编号】G06F9/45GK103858101SQ201280048815【公开日】2014年6月11日申请日期:2012年10月1日优先权日:2011年10月3日【发明者】R.J.布莱尼,M.K.格施温德,J.L.麦金尼斯,S.J.芒罗,M.迈斯纳申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1