CN1981266A - 为优化的程序生成展开信息 - Google Patents
为优化的程序生成展开信息 Download PDFInfo
- Publication number
- CN1981266A CN1981266A CNA2005800229255A CN200580022925A CN1981266A CN 1981266 A CN1981266 A CN 1981266A CN A2005800229255 A CNA2005800229255 A CN A2005800229255A CN 200580022925 A CN200580022925 A CN 200580022925A CN 1981266 A CN1981266 A CN 1981266A
- Authority
- CN
- China
- Prior art keywords
- program
- binary mode
- fundamental block
- new
- expression
- 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/52—Binary to binary
-
- 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/443—Optimisation
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
分析第一二进制形式的程序以及与该第一二进制形式的程序相关联的展开信息,至少部分地基于该分析的结果对该第一二进制形式的程序执行优化以产生第二二进制形式的程序,并至少部分地基于该分析的结果和所执行的优化为该第二二进制形式的程序生成新的展开信息。
Description
背景
最初以人类可读或高级源语言编写的程序一般通过编译和链接的过程变换成机器语言的可执行程序。称为二进制码的所得的程序版本可由基于处理器的系统来执行。程序通常出于方便、可重复使用性、设计复杂度管理和其它原因被划分成称为过程的子程序。过程可用其它名称来指代,例如,诸如C或C++等语言中的函数。在高级语言形式中,被划分成过程的程序一般被编译并链接成程序的二进制形式,该形式的程序也带有大致对应于高级语言形式的程序中的各个过程。在编译和链接之后,在系统上执行的程序通常使用程序栈来帮助调用过程以及返回到主程序流或调用过程,这在本领域中是公知的。一般而言,由于过程调用可以是嵌套的,且主程序可被认为是主过程,因此在以下描述中,不失一般性地使用术语“作出调用的过程”和“被调用的过程”。过程调用必须在程序栈上储存与调用上下文有关的一组值,包括诸如指令指针等由作出调用的过程使用的寄存器的值,以及可通过被调用的过程的执行而被盖写的其它寄存器。诸如作出调用的过程的局部变量和不会由被调用的过程修改的参数等其它数据值也可被储存在栈上。栈上与特定过程的特定调用有关的所有数据被称为其栈帧或其激活记录。
在用于执行系统上的程序的典型的运行时系统中,过程在被调用时分配其在程序栈上的栈帧作为其第一组动作之一,并用可在过程执行时修改的数据来填充该栈帧。在退出之前,它释放所分配的栈帧,并在执行返回之前更新程序栈指针。由此,程序栈在正常的程序执行过程中由过程调用和返回处理的机制来管理。然而,有时候程序控制可转移到过程之外到另一过程中,而不对过程返回机制进行正常处理。
这可能在过程执行导致程序控制转移到不同级别的程序栈处的另一过程而不执行介入返回的长跳转型指令的一种情况下发生。在另一种情况下,这可能在过程内发生了导致控制转移到另一级程序栈处的异常处理器的异常而不通过一系列返回调用来管理栈时发生。在又一种情况下,这可能在使用调试器来调试程序并且控制由该程序外部的调试器从过程内的一点转移到沿着调用链向上通往当前语句的点时发生。在支持多线程处理的语言和运行时系统中,线程终止可能导致同一类型的现象。
当发生从过程内的这一控制转移时,为使程序执行能够在控制所转移到的新点处正确地继续执行,在如同它在控制转移到过程之外的点处发生那样模拟正常的返回进程的意义上,程序栈必须被解开或展开。为正确地展开程序栈,某些运行时系统提供了包括在程序的可执行映像中的特定支持。这采用了允许运行时系统在除正常返回之外的点处从过程退出之后正确地恢复上下文的展开信息或展开表的形式。
展开信息可以与其中可能发生退出的过程的每一语句相关联。在某些情况下,展开信息可以与过程的语句或区域块相关联,在该块中,展开信息对所有语句都相同。在其它情况下,展开信息可以对不同的个别语句不同,或者对不同的语句块不同。
展开信息的有用性可通过后链接程序优化而被严重地损害或削除。后链接程序优化是一组技术,它旨在通过更改二进制后链接形式的程序的代码而不更改诸如其输入输出行为等其它行为的各种技术,例如在执行时间方面改进程序性能。在由程序优化使用的公知技术中,有过程拆分、循环解开以及将指令移出循环。这些技术导致与原始程序在若干方面不同的新的二进制形式的程序,这些方面包括更改或删除现有过程、添加新过程、语句的重复以及从原始形式的程序中删除语句。与原始程序的过程和语句相关联的展开信息一般受到限制,在优化程序的程序栈的展开中毫无用处。
附图简述
图1是一个实施例中处理的高级流程图。
图2是一个实施例中的展开信息的数据布局。
详细描述
在一个实施例中,处理如图1所示地发生。简要概述而言,以下主要阶段形成了处理:首先,具有相关联展开信息130的后链接优化二进制形式的程序125被输入到分析阶段105和110。分析程序由两个主要组成部分组成,即从输入程序中读取展开信息105以及使用该信息来构造程序的详细表示以及将附加注释与程序的语句和块的表示相关联(修饰)110。在这一阶段之后,发生实际程序的优化115,其中使用经修饰的表示并在必要时更新该表示以确保可在优化之后重新生成与优化形式的程序相一致的新的展开信息。在120中使用优化的程序、经修饰的表示以及原始程序的展开信息来生成与优化的二进制形式的程序135相一致且与其一起储存的新的展开信息140。
接着,详细考虑该实施例中这些处理阶段的每一个。展开信息通过包括编译器和链接器的编译系统与二进制程序相关联,并且可包含诸如图2中描述的信息。一般由该图表示的一个实施例是储存用于Intel Itanium处理器家族的展开信息的一组约定。该组约定在Intel Itanium Software Conventions and RuntimeArchitecture Guide(Intel Itanium软件约定和运行时架构指南)中有详细描述。在该实施例中,如在其它实施例中一样,展开信息需要至少详细描述,如果程序栈需要在程序执行的特定点处展开,则如何恢复过程所使用的相关寄存器组。作为一个示例,用于Itanium处理器家族的展开信息由两个部分构成。第一部分是具有诸如图中202-206处所示的一组记录,每一记录对应于过程212中的指令指针208的特定位置。在某些实施例中,指令指针的值的范围可对应于该同一组记录。指令指针和展开信息的位置之间的关系在一个实施例中可以基于应用于该指令指针以产生对展开信息的记录数组的索引的映射函数。
为展开的目的,每一过程可被划分成展开区域,同一组展开信息贯穿每一区域都是有效的。表中的每一展开记录表示过程内该展开记录对其有效的区域的起始和终止点202和204。在该实施例中,这些终止点被记录为指针或地址。该实施例中的展开区域包含指向用于为指定区域展开过程的实际数据的信息指针,该指定区域包括展开描述符区210、个性例程214以及语言专用数据区(LSDA)215。当然,后两个一般是编译器且是语言相关的,且因此即使在同一平台上也会在各个编译器之间有所不同。
展开描述符段210在该实施例中进而主要用于指定在展开的情况下如何对待处理器寄存器。每一寄存器一般需要在过程执行的特定点处保存。描述符可描述要保存什么寄存器;应当在过程中的什么指令处保存它;以及它应该保存在存储器中的什么位置。为展开的目的,过程可被划分成至少两个区域:前序区域以及一个或多个主体区域。前序区域是其中建立要由过程使用的寄存器、可保存现有寄存器状态以及分配过程的栈帧的区域。主体区域在前序区域之后,且一般不分配栈帧或执行寄存器保存和恢复。用于前序区域的展开信息一般比用于主体区域的展开信息更详细,因为保存或未保存的一组寄存器可能在各语句之间有所不同。
如图2所示,展开描述符包含指示要在展开描述符区中为其提供描述符的区域的区域首部216。它之后可以跟随前序描述符218以及一个或多个主体描述符220。也可使用其它描述符222。
该实施例中用于展开过程的数据的下一部分包括对异常处理的支持。异常是某些编程语言中可用的公知错误处理机制。在本实施例中,使用C++语言作为一个示例,但是在包括Java、Ada和本领域中已知的其它语言的其它编程语言中实现了异常和其它类似的机制。
预期本领域的技术人员足够熟悉C++语言的一般上下文。特别参考异常,C++编程语言定义了可由程序员用于构造旨在供异常处理使用的代码的语言关键字try、catch和throw的语义。try块是通常后跟一个或多个catch块的语句块。每一catch块具有与其相关联的类型或指示“捕捉所有”情况的构造“…”。try块中包括的可能有的被调用的语句和过程(如果有)可包含throw语句。C++中的throw语句需要某种特定类型的自变量。
try、catch和throw的语义一般如下。在运行时,如果在执行期间遇到throw语句,则开始对匹配catch的搜索阶段。该搜索首先在当前上下文,即当前的执行过程中完成,然后沿过程的调用链向上。如果存在具有与执行的throw的自变量相同类型或是“catch all”的catch子句,则发生匹配。该搜索阶段在到达匹配的catch或到达main()过程时结束。如果没有匹配,则生成运行时错误。如果找到匹配的catch,则开始清除阶段。在清除阶段,首先毁去throw点处可见的任何局部变量。在毁去了所有可见的局部变量之后,展开当前过程,这要求展开程序栈。对调用链中的每一过程重复同一进程(毁去局部变量并展开过程),直到到达具有匹配的catch的过程。然后,控制传递到匹配的catch子句。执行匹配catch中的语句,并且控制然后传递到所有catch子句之后的语句。
由此,当发生异常时,必须展开栈,因此必须使用先前讨论的类型的展开信息。另外,也可由编译器和连接器储存支持异常处理的其它类型的展开信息以允许进行正确的异常处理作为展开的一部分。如图2所示,在本实施例中,该信息由个性例程214和LSDA(语言专用数据区)215构成。关于用于Itanium处理器运行时系统的展开信息的这些编译器专用区的更详细描述可以在与为该处理器发行的特定编译器有关的文档中找到。在一个实例中,用于Intel Itanium处理器的公众可获得的GNU gcc编译器3.1版实现了用于C++异常处理的展开区的编译器专用部分。在以下讨论中,提供了足以描述该实施例的编译器专用区的概述,所描述的特征可能被包括在用于Itanium的被设计成支持C++异常处理的编译器中。
在该实施例中,个性例程214是用于处理异常的C++运行时库中的一个特殊过程。该个性例程依赖于编译器的编程语言,因为由运行时系统所采取的特定动作依赖于语言中的异常处理构造的语义。LSDA 215由指向用于匹配各种catch子句的代码、catch子句主体代码以及用于该过程的清除动作的表构成。实现catch子句匹配、catch子句主体和清除动作这些代码片段被称为着陆区(landing pad)。这些表的布局是由C++编译器来确定的。个性例程不仅仅对于C++语言是专用的,对于用于生成二进制形式的程序的C++编译器也是专用的,因为编译器需要理解LSDA中的表的布局。
图2示出了用于所描述的实施例的LSDA的格式。Start(开始)224、Base(基)226和Call Site Size(调用点大小)228是头字段。Start是与可以相对于其来指定着陆区的地址的起始地址。Base是到类型表(以下描述)的终点的偏移。Call SiteSize是以字节表示的表的大小。
头字段后跟调用点表。一般而言,编译器将throw语句翻译成对C++运行时系统的过程调用。每一这样的调用是由调用点表230中的调用点来处理的。每一调用点与指向着陆区的可任选指针和232处指向动作表的指针相关联。动作表234包括用于储存在动作记录236中的catch子句的类型信息;该信息用于在运行时找出对throw的匹配。
在以上描述中,再次参考图1中的流程图,对一个实施例已描述了与包括异常处理的展开有关的后链接信息130。对该实施例描述的结构并不是表示用于展开的语言不相关或语言和编译器专用信息的唯一方式。可使用其它结构,诸如本领域中已知的列表、表、散列数据数组以及其它方式。数据的字段和排列可以在其它实施例中有所不同。在某些实施例中,可省略某些数据,例如用于调用点表的基地址可采取与过程起始地址相同。
接着,更详细地考虑图1中在105-115处描述的处理的分析和优化阶段。这些阶段处理来自输入程序的展开信息,在优化程序时变换该信息,并且重新生成用于输出已优化程序的信息。
读取展开信息:在一个实施例中,在图1的105处通过后链接优化器的预优化阶段读取并解释如图2所示的展开信息。优化器读取包括展开和展开信息部分的输入的二进制形式的程序中的所有展开和展开信息部分。它为程序的指令和过程生成内部表示。优化器确定用于生成来自个性例程的传入程序的编译器。优化器然后走查展开表。对表示如图2的202-206处所示的过程的每一展开表条目,该实施例跟随指向210、214和215处的展开信息部分的指针,并开始解释如216-222处所描述的那些展开信息记录。如果对特定过程存在LSDA,则优化器使用对用于生成该LSDA的编译器专用的格式来解释LSDA。如上所述,这些记录按照过程中的展开区域来分组。对于每一区域,生成包括指令槽中的区域的长度以及用于过程寄存器的一系列更小的展开数据结构的展开状态数据结构。用于寄存器的展开数据结构指定应当从哪里恢复寄存器(例如,从激活记录或从另一寄存器)以及该指定何时变为有效(例如,在相对于展开区域的哪一指令槽序号处)
修饰程序表示:接着,在图1的110处为各种程序组件-例如,为指令、为基本块(具有直线控制流的顺序指令组)以及为过程-生成内部表示。在以上述方式解释了展开信息之后,该实施例为给定过程中的各个展开区域生成一展开状态记录序列。它然后将这些展开状态记录附加到对应于该过程的表示上。优化器然后使用来自LSDA的经解码的调用点表来为每一过程生成经解码的类型表和经解码的动作表。它将这些表附加到该过程的表示上。接着,本实施例中的优化器走查每一过程的表示,访问基本块和指令,同时参考展开状态记录。如果用于展开状态记录中的寄存器的when字段指向对应于给定指令的槽,则优化器将对编码该事实的特殊展开属性附加到该指令。优化器参考经解码的调用点表,以检查在访问的基本块或指令处是否存在着陆区,且如果存在,则优化器在其内部表示中添加调用点和当前访问的基本块或指令之间的关系。在该进程之后,在110处,该表示的过程中的某些指令现在已用展开属性修饰。优化器还确保展开区域在基本块的边界处开始和终止,并将每一基本块标记为“前序”或“主体”。
在该阶段之后,本实施例中的优化器可基于程序的表示为程序中的任何指令生成展开规则。该规则对包括从过程的起始处开始的所有展开状态记录通过指令的效果的展开状态记录进行编码。指令的展开规则表明如何在该指令处展开封闭的过程。
执行优化:优化器接着可在115处对过程和指令执行各种优化,同时考虑以下展开相关因素:
i.从不删除带有展开属性的指令;如果需要复制该指令,则还复制展开属性。
ii.从不删除带有与着陆区基本块有关的调用点的基本块。
iii.如果要复制代用调用点的基本块,则在优化器的表示中还复制它和着陆区之间的关系。
iv.不允许指令跨不同区域类型(例如,前序和主体)基本块的移动。
v.当过程被拆分或划分成不邻接的代码段时,新的片段(称为子过程继承展开状态记录,以及对应于用于原始过程(称为父过程)中的拆分点处的指令的展开规则的经解码的类型表和经解码的动作表。
重新生成展开信息:在优化期间,展开区域中的指令可能移动,因此展开状态中的各个寄存器的when字段可能不准确。此外,展开区域可能收缩或扩展,因此记录在展开状态中的其长度需要改变。调用点和着陆区可能到处移动,因此原始的调用点表可能不再准确,尽管由于优化器不删除类型信息而使类型表继续有效。优化器为所有过程的所有展开区域处理展开状态记录,从而对when字段和展开区域长度字段进行调整。用于经优化形式的程序的调用点表是通过遍历过程中带有调用点的所有基本块并查找任何相关的着陆区来创建的。然后可以生成用于优化的过程的新的调用点表。拆分的过程的子过程片段以特殊的方式来处理-它从其父过程继承的展开状态记录的副本被标记为具有零长度。具有零长度的前序暗示展开信息中的各寄存器的when字段指向该过程的开始。基于父过程的类型和动作表为子过程片段创建经解码的类型和动作表的副本。
为拆分的过程的子过程片段生成调用点表若在LSDA中的调用点表中的着陆区字段被描述为从基值(图2中的226,在LSDA头中编码)的偏移时会造成问题,因为一般而言,该偏移被假定为是正的。对于预优化过程,起始地址值预该过程的起始地址重合。然而,在优化之后,对于通过优化在过程拆分的子过程片段中带有调用点的给定基本块,着陆区可能保留在父过程中。由此,取决于拆分过程的相对位置,对于着陆区的基本偏移可能是负的。对这一问题的一种解决方案是将负偏移表示为无符号数。当个性例程读取该负偏移时,它将其解释为大的正数。使用该大正数完成的任何地址算法由于本领域中已知的绕回效果而都产生正确的最终地址。
然后,在图1的120处,优化器使用用于各过程的经修改的展开状态记录,将展开表和展开信息记录140写入输出程序135中。
各实施例可作为计算机程序产品来提供,计算机程序产品可包括其上储存有数据的机器可读介质,当这些数据由机器访问时会使机器执行根据所要求保护的主体的过程。机器可读介质可包括但不限于,软盘、光盘、DVD-ROM盘、DVD-RAM盘、DVD-RW盘、DVD+RW盘、CD-R盘、CD-RW盘、CD-ROM盘以及磁光盘、ROM、RAM、EPRON、EEROM、磁或光卡、闪存、或适用于储存电子指令的其它类型的媒体/机器可读介质。此外,各实施例也可作为计算机程序产品来下载,其中该程序可经由通信链路(例如,调制解调器或网络链接)通过载波信号或其它传播介质中包含的数据信号从远程计算机传输到作出请求的计算机。
许多方法是以其最基本的形式来描述的,但是可在不脱离所要求保护的主体的基本范围的前提下向任何方法添加步骤或从中删除步骤,并且可向任何所描述的消息添加信息或从中减去信息。本领域的技术人员可以清楚,可作出许多进一步的修改和改编。特定实施例并不是为了限制本发明而提供的,而是为了说明本发明。所要求保护的主体的范围不是由以上提供的具体示例来确定的,而是仅由所附权利要求书来确定。
Claims (25)
1.一种方法,包括:
分析第一二进制形式的程序和与所述第一二进制形式的程序相关联的展开信息;
至少部分地基于所述分析的结果,对所述第一二进制形式的程序执行优化以产生第二二进制形式的程序;以及
至少部分地基于所述分析的结果且至少部分地基于所执行的优化,为所述第二二进制形式的程序生成经更新的展开信息。
2.如权利要求1所述的方法,其特征在于,所述展开信息还包括与所述程序的每一过程的每一展开区域相关联的、与展开所述程序有关的语言不相关信息。
3.如权利要求2所述的方法,其特征在于,分析所述第一二进制形式的程序以及与所述第一二进制形式的程序相关联的展开信息还包括:
生成所述程序的表示,包括指令、基本块和过程的表示;
标识每一所表示的基本块的基本块类型,并用所述基本块类型来标记所述表示;
为所述程序的每一过程的每一展开区域生成展开状态数据和展开属性;
将所述展开状态数据和属性与所述程序的指令的表示相关联;以及
将所述展开状态数据和属性与所述程序的过程的表示相关联。
4.如权利要求3所述的方法,其特征在于,至少部分地基于所述分析的结果对所述第一二进制形式的程序执行优化以生成所述第二二进制形式的程序还包括:
保护与所述展开属性相关联的指令在优化期间不被删除;
如果与所述展开属性相关联的第一指令在优化期间要被复制以创建第二指令,则至少部分地基于与所述第一指令的表示相关联的展开属性创建所述第二指令的表示以及与所述第二指令的表示相关联的展开属性;
防止任何指令在优化期间从一种基本块类型的基本块移至一不同基本块类型的基本块;以及
如果所述第一二进制形式的程序中的过程在优化期间要被拆分成两个新过程,则至少部分地基于用于第一二进制形式的程序中的过程的表示的展开状态数据和属性,并至少部分地基于用于作出所述拆分的指令的展开规则,生成每一新过程的表示、用于所述每一新过程的表示的展开状态数据和属性。
5.如权利要求4所述的方法,其特征在于,至少部分地基于所述分析的结果并至少部分地基于所执行的优化为所述第二二进制形式的程序生成新的展开信息还包括:
为每一过程的每一展开区域调整展开状态数据,以使所述数据与所述第二二进制形式的程序中的区域的新长度和位置相一致;以及
将所调整的展开状态数据与所述第二二进制形式的程序相关联。
6.如权利要求5所述的方法,其特征在于,如果所述第一二进制形式的程序中的过程在优化期间要被拆分成两个新过程,则所述过程被拆分成父过程和至少一个子过程,并且其中,至少部分地基于所述分析的结果并至少部分地基于所执行的优化为所述第二二进制形式的程序生成新展开信息还包括标记用于通过所述拆分而创建的每一子过程的表示的展开状态数据,以指示所述子过程具有零长度前序,并将所述展开状态数据变为活动之处的程序位置设为所述子过程的开始。
7.如权利要求1所述的方法,其特征在于,所述展开信息还包括与处理源代码形式的程序的源语言中定义的异常有关的语言相关异常处理信息,所述第一二进制形式的程序至少部分地通过对所述源代码形式的程序执行所述源语言的编译器来导出。
8.如权利要求7所述的方法,其特征在于,分析所述第一二进制形式的程序和与所述第一二进制形式的程序相关联的展开信息还包括:
标识被执行来导出所述第一二进制形式的程序的编译器;
为所述程序的指令、基本块和过程生成表示;
如果用于所述程序的过程的展开信息中包括异常处理信息,则至少部分地基于所述编译器的标识为所述过程解释所述异常处理信息;
至少部分地基于所述异常处理信息为每一过程的表示生成异常调用点表、异常类型表以及异常处理动作表;以及
在包含生成异常的代码的基本块的表示与包含对所述异常的处理器的基本块的表示之间的关系中添加关联。
9.如权利要求8所述的方法,其特征在于,至少部分地基于所述分析的结果对所述第一二进制形式的程序执行优化以产生所述第二二进制形式的程序还包括:
保护包含生成异常的代码的基本块不被删除;
保护包含处理异常的代码的基本块不被删除;
如果包含生成异常的代码的第一基本块在优化期间要被复制以创建第二基本块,则创建所述第二基本块的表示以及所述第二基本块的表示中对应于所述第一基本块的表示中的每一现有关联的关联;
如果所述第一二进制形式的程序中的过程在优化期间要被拆分成两个新过程,则至少部分地基于用于所述第一二进制形式的程序中的过程的所述异常调用点表、所述异常类型表和所述异常处理动作表,为每一新过程创建异常调用点表、异常类型表和异常处理动作表。
10.如权利要求9所述的方法,其特征在于,至少部分地基于所述分析的结果并至少部分地基于所执行的优化为所述第二二进制形式的程序生成新的展开信息还包括:
至少部分地基于以下的一个或多个为所述第二二进制程序中的每一过程生成新的异常调用点表、新的异常类型表和新的异常处理动作表:
通过分析所述第一二进制形式的程序而分别生成的所述异常调用点表、异常类型表和异常处理动作表,
分别为通过优化期间的过程拆分而生成的新过程生成的新的异常调用点表、新的异常类型表和新的异常处理动作表,以及
在包含生成异常的代码的每一基本块与包含用于所述异常的处理器的基本块之间的表示中的关联。
11.如权利要求10所述的方法,其特征在于,还包括将用于在优化期间创建的新过程中的异常调用点的处理器的地址的负偏移表示为所述异常调用点表中的无符号数。
12.一种系统,包括:
通信上耦合到存储设备的处理器;
储存在所述存储设备上并可由所述处理器执行的分析模块,所述分析模块分析第一二进制形式的程序以及与所述第一二进制形式的程序相关联的展开信息;
储存在所述存储设备上并可由所述处理器执行的优化模块,所述优化模块至少部分地基于所述分析的结果对所述第一二进制形式的程序执行优化以产生第二二进制形式的程序;以及
储存在所述存储设备上并可由所述处理器执行的生成模块,所述生成模块至少部分地基于所述分析的结果并至少部分地基于所执行的优化,为所述第二二进制形式的程序生成新的展开信息。
13.如权利要求12所述的系统,其特征在于,所述展开信息还包括与所述程序的每一过程的每一展开区域相关联的、于展开所述程序有关的语言不相关信息。
14.如权利要求12所述的系统,其特征在于,所述展开信息还包括与处理源代码形式的程序的源语言中定义的异常有关的语言相关异常处理信息,所述第一二进制形式的程序是至少部分地通过对所述源代码形式的程序执行所述源语言的编译器来导出的。
15.一种其上储存有数据的机器可访问介质,所述数据在由机器访问时使所述机器执行一种方法,所述方法包括:
分析第一二进制形式的程序和与所述第一二进制形式的程序相关联的展开信息;
至少部分地基于所述分析的结果,对所述第一二进制形式的程序执行优化以产生第二二进制形式的程序;以及
至少部分地基于所述分析的结果且至少部分地基于所执行的优化,为所述第二二进制形式的程序生成新的展开信息。
16.如权利要求15所述的机器可访问介质,其特征在于,所述展开信息还包括与所述程序的每一过程的每一展开区域相关联的、与展开所述程序有关的语言不相关信息。
17.如权利要求16所述的机器可访问介质,其特征在于,分析所述第一二进制形式的程序以及与所述第一二进制形式的程序相关联的展开信息还包括:
生成所述程序的表示,包括指令、基本块和过程的表示;
标识每一所基本块的基本块类型,并用所述基本块类型来标记所述每一基本块的表示;
为所述程序的每一过程的每一展开区域生成指定应如何恢复至少包括程序相关寄存器的值在内的程序状态来进行展开的展开状态数据和展开属性;
将所述展开状态数据和属性与所述程序的指令相关联;以及
将所述展开状态数据和属性与所述程序的过程相关联。
18.如权利要求17所述的机器可访问介质,其特征在于,至少部分地基于所述分析的结果对所述第一二进制形式的程序执行优化以生成所述第二二进制形式的程序还包括:
保护与所述展开属性相关联的指令在优化期间不被删除;
如果与所述展开属性相关联的第一指令在优化期间要被复制以创建第二指令,则至少部分地基于与所述第一指令相关联的展开属性创建与所述第二指令相关联的展开属性;
防止任何指令在优化期间从一种基本块类型的基本块移至一不同基本块类型的基本块;以及
如果所述第一二进制形式的程序中的过程在优化期间要被拆分成两个新过程,则至少部分地基于用于所述第一二进制形式的程序中的过程的展开状态数据和属性,并至少部分地基于用于作出所述拆分的指令的展开规则,为每一新过程生成展开状态数据和属性。
19.如权利要求18所述的机器可访问介质,其特征在于,至少部分地基于所述分析的结果并至少部分地基于所执行的优化为所述第二二进制形式的程序生成新的展开信息还包括:
为每一过程的每一展开区域调整展开状态数据,以使所述数据与所述第二二进制形式的程序中的区域的新长度和位置相一致;以及
将所调整的展开状态数据与所述第二二进制形式的程序相关联。
20.如权利要求19所述的机器可访问介质,其特征在于,如果所述第一二进制形式的程序中的过程在优化期间要被拆分成两个新过程,则所述过程被拆分成父过程和至少一个子过程,并且其中,至少部分地基于所述分析的结果并至少部分地基于所执行的优化为所述第二二进制形式的程序生成新展开信息还包括标记用于通过所述拆分而创建的每一子过程的展开状态数据以指示所述子过程具有零长度前序,并将所述展开状态数据变为活动之处的程序位置设为所述子过程的开始。
21.如权利要求15所述的机器可访问介质,其特征在于,所述展开信息还包括与处理源代码形式的程序的源语言中定义的异常有关的语言相关异常处理信息,所述第一二进制形式的程序至少部分地通过对所述源代码形式的程序执行所述源语言的编译器来导出。
22.如权利要求21所述的机器可访问介质,其特征在于,分析所述第一二进制形式的程序和与所述第一二进制形式的程序相关联的展开信息还包括:
标识被执行来导出所述第一二进制形式的程序的编译器;
为所述程序的指令、基本块和过程生成表示;
如果在所述程序的过程的展开信息中包括异常处理信息,则至少部分地基于所述编译器的标识为所述过程解释所述异常处理信息;
至少部分地基于所述异常处理信息为每一过程生成异常调用点表、异常类型表以及异常处理动作表;以及
在包含生成异常的代码的基本块与包含对所述异常的处理器的基本块之间的表示中添加关联。
23.如权利要求22所述的机器可访问介质,其特征在于,至少部分地基于所述分析的结果对所述第一二进制形式的程序执行优化以产生所述第二二进制形式的程序还包括:
保护包含生成异常的代码的基本块不被删除;
保护包含处理异常的代码的基本块不被删除;
如果包含生成异常的代码的第一基本块在优化期间要被复制以创建第二基本块,则创建在所述第二基本块的表示中对应于所述第一基本块的表示中的每一现有关联的关联;
如果所述第一二进制形式的程序中的过程在优化期间要被拆分成两个新过程,则至少部分地基于用于所述第一二进制形式的程序中的过程的所述异常调用点表、所述异常类型表和所述异常处理动作表,为每一新过程生成异常调用点表、异常类型表和异常处理动作表。
24.如权利要求23所述的机器可访问介质,其特征在于,至少部分地基于所述分析的结果并至少部分地基于所执行的优化为所述第二二进制形式的程序生成新的展开信息还包括:
至少部分地基于以下的一个或多个为所述第二二进制程序中的每一过程生成新的异常调用点表、新的异常类型表和新的异常处理动作表:
通过分析所述第一二进制形式的程序而分别生成的所述异常调用点表、异常类型表和异常处理动作表,
分别为通过优化期间的过程拆分而生成的新过程生成的新的异常调用点表、新的异常类型表和新的异常处理动作表,以及
在包含生成异常的代码的每一基本块与包含用于所述异常的处理器的基本块之间的表示中的关联。
25.如权利要求24所述的机器可访问介质,其特征在于,还包括将用于在优化期间创建的新过程中的异常调用点的处理器的地址的负偏移表示为所述异常调用点表中的无符号数。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US10/888,663 US7480902B2 (en) | 2004-07-08 | 2004-07-08 | Unwind information for optimized programs |
US10/888,663 | 2004-07-08 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN1981266A true CN1981266A (zh) | 2007-06-13 |
CN100462920C CN100462920C (zh) | 2009-02-18 |
Family
ID=35266865
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNB2005800229255A Expired - Fee Related CN100462920C (zh) | 2004-07-08 | 2005-07-08 | 为优化的程序生成展开信息 |
Country Status (5)
Country | Link |
---|---|
US (2) | US7480902B2 (zh) |
EP (1) | EP1782193A1 (zh) |
JP (1) | JP4833206B2 (zh) |
CN (1) | CN100462920C (zh) |
WO (1) | WO2006014587A1 (zh) |
Families Citing this family (21)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7480902B2 (en) * | 2004-07-08 | 2009-01-20 | Intel Corporation | Unwind information for optimized programs |
US7926048B2 (en) * | 2006-07-26 | 2011-04-12 | Intel Corporation | Efficient call sequence restoration method |
US8370821B2 (en) * | 2007-08-21 | 2013-02-05 | International Business Machines Corporation | Method for enabling profile-based call site tailor-ing using profile gathering of cloned functions |
US8627302B2 (en) * | 2007-11-27 | 2014-01-07 | Oracle America, Inc. | Sampling based runtime optimizer for efficient debugging of applications |
US20100122073A1 (en) * | 2008-11-10 | 2010-05-13 | Ravi Narayanaswamy | Handling exceptions in software transactional memory systems |
US8627291B2 (en) * | 2012-04-02 | 2014-01-07 | International Business Machines Corporation | Identification of localizable function calls |
US9280322B2 (en) * | 2012-09-27 | 2016-03-08 | Intel Corporation | Generating source code |
US9880842B2 (en) | 2013-03-15 | 2018-01-30 | Intel Corporation | Using control flow data structures to direct and track instruction execution |
US9372695B2 (en) | 2013-06-28 | 2016-06-21 | Globalfoundries Inc. | Optimization of instruction groups across group boundaries |
US9348596B2 (en) | 2013-06-28 | 2016-05-24 | International Business Machines Corporation | Forming instruction groups based on decode time instruction optimization |
US9830206B2 (en) * | 2013-12-18 | 2017-11-28 | Cray Inc. | Cross-thread exception handling |
US9348595B1 (en) | 2014-12-22 | 2016-05-24 | Centipede Semi Ltd. | Run-time code parallelization with continuous monitoring of repetitive instruction sequences |
US9208066B1 (en) * | 2015-03-04 | 2015-12-08 | Centipede Semi Ltd. | Run-time code parallelization with approximate monitoring of instruction sequences |
US10296346B2 (en) | 2015-03-31 | 2019-05-21 | Centipede Semi Ltd. | Parallelized execution of instruction sequences based on pre-monitoring |
US10296350B2 (en) | 2015-03-31 | 2019-05-21 | Centipede Semi Ltd. | Parallelized execution of instruction sequences |
US9715390B2 (en) | 2015-04-19 | 2017-07-25 | Centipede Semi Ltd. | Run-time parallelization of code execution based on an approximate register-access specification |
US11003764B2 (en) * | 2018-02-06 | 2021-05-11 | Jayant Shukla | System and method for exploiting attack detection by validating application stack at runtime |
US11205004B2 (en) * | 2019-06-17 | 2021-12-21 | Baidu Usa Llc | Vulnerability driven hybrid test system for application programs |
US11442739B2 (en) | 2019-09-16 | 2022-09-13 | International Business Machines Carporation | Exception handling |
US11275676B2 (en) * | 2020-04-15 | 2022-03-15 | Baidu Usa Llc | Constraint guided hybrid fuzzing test system for application programs |
CN112527267A (zh) * | 2020-12-15 | 2021-03-19 | 湖南戈人自动化科技有限公司 | 一种编辑器展开折叠效果实现方法 |
Family Cites Families (16)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6014515A (en) * | 1997-05-29 | 2000-01-11 | Hewlett-Packard Company | Enhanced stack unwind facility |
US6293712B1 (en) * | 1997-09-30 | 2001-09-25 | Institute For The Development Of Emerging Architectures, Llc | Method and apparatus for constructing a stack unwind data structure |
US6247172B1 (en) * | 1998-07-02 | 2001-06-12 | Hewlett-Packard Company | Method for a translation system that aggressively optimizes and preserves full synchronous exception state |
US6289446B1 (en) * | 1998-09-29 | 2001-09-11 | Axis Ab | Exception handling utilizing call instruction with context information |
US6662354B1 (en) * | 1999-01-29 | 2003-12-09 | Unisys Corporation | Determining destinations of a dynamic branch |
US6412109B1 (en) * | 1999-01-29 | 2002-06-25 | Sun Microsystems, Inc. | Method for optimizing java bytecodes in the presence of try-catch blocks |
JP4709394B2 (ja) * | 1999-04-27 | 2011-06-22 | インターナショナル・ビジネス・マシーンズ・コーポレーション | プログラムコード変換において使用する例外処理の方法および装置 |
US6934939B2 (en) * | 2001-02-28 | 2005-08-23 | International Business Machines Corporation | Method for unwinding a program call stack |
US7426719B2 (en) * | 2001-11-29 | 2008-09-16 | Microsoft Corporation | Method and system for rewriting unwind data in the presence of exceptions |
US6993750B2 (en) * | 2001-12-13 | 2006-01-31 | Hewlett-Packard Development Company, L.P. | Dynamic registration of dynamically generated code and corresponding unwind information |
US7131115B2 (en) * | 2002-03-25 | 2006-10-31 | Hewlett-Packard Development Company, L.P. | Unwinding instrumented program code |
US7146607B2 (en) * | 2002-09-17 | 2006-12-05 | International Business Machines Corporation | Method and system for transparent dynamic optimization in a multiprocessing environment |
US20040128658A1 (en) * | 2002-12-27 | 2004-07-01 | Guei-Yuan Lueh | Exception handling with stack trace cache |
WO2005029241A2 (en) * | 2003-09-15 | 2005-03-31 | Plum Thomas S | Automated safe secure techniques for eliminating |
US7480902B2 (en) * | 2004-07-08 | 2009-01-20 | Intel Corporation | Unwind information for optimized programs |
US8176475B2 (en) * | 2006-10-31 | 2012-05-08 | Oracle America, Inc. | Method and apparatus for identifying instructions associated with execution events in a data space profiler |
-
2004
- 2004-07-08 US US10/888,663 patent/US7480902B2/en not_active Expired - Fee Related
-
2005
- 2005-07-08 CN CNB2005800229255A patent/CN100462920C/zh not_active Expired - Fee Related
- 2005-07-08 JP JP2007520530A patent/JP4833206B2/ja not_active Expired - Fee Related
- 2005-07-08 EP EP05769289A patent/EP1782193A1/en not_active Withdrawn
- 2005-07-08 WO PCT/US2005/024252 patent/WO2006014587A1/en active Application Filing
-
2009
- 2009-01-16 US US12/355,613 patent/US8181170B2/en not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
US20090133008A1 (en) | 2009-05-21 |
JP4833206B2 (ja) | 2011-12-07 |
CN100462920C (zh) | 2009-02-18 |
US20060010431A1 (en) | 2006-01-12 |
US8181170B2 (en) | 2012-05-15 |
US7480902B2 (en) | 2009-01-20 |
WO2006014587A1 (en) | 2006-02-09 |
JP2008505423A (ja) | 2008-02-21 |
EP1782193A1 (en) | 2007-05-09 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN100462920C (zh) | 为优化的程序生成展开信息 | |
CN111770113B (zh) | 一种执行智能合约的方法、区块链节点和节点设备 | |
US6795963B1 (en) | Method and system for optimizing systems with enhanced debugging information | |
CN100465895C (zh) | 编译器、编译方法 | |
US8799878B2 (en) | Multi level virtual function tables | |
US6961931B2 (en) | Dependency specification using target patterns | |
US8615735B2 (en) | System and method for blurring instructions and data via binary obfuscation | |
US11579856B2 (en) | Multi-chip compatible compiling method and device | |
JP4181326B2 (ja) | コード最適化のための方法、装置及びプログラム | |
US20080104096A1 (en) | Software development system | |
JPH08512152A (ja) | インクリメンタル生成システム | |
US20040210883A1 (en) | Method and apparatus for building executable computer programs using compiled program libraries | |
CN110673852B (zh) | 一种基于编译器前端实现控制流平坦的方法、系统及设备 | |
JP2018510445A (ja) | プログラム性能を向上させる領域特化システムおよび方法 | |
US20230113783A1 (en) | Cross-platform code conversion method and device | |
CN112882718A (zh) | 编译处理方法、装置、设备及存储介质 | |
CN115756451A (zh) | 一种多项目代码文件重用的方法、装置、设备、存储介质 | |
US20120143589A1 (en) | Multi-modal compiling apparatus and method for generating a hybrid codefile | |
CN100454244C (zh) | 在标记中用于定义和使用子类说明的系统和方法 | |
CN107562430B (zh) | 一种针对移动π演算语言的文件处理功能的编译方法 | |
GB2420638A (en) | Method of substituting code fragments in Internal Representation | |
Mennie et al. | Giving meaning to macros | |
US6976247B1 (en) | Generating an executable file | |
US20120330878A1 (en) | Conventions for inferring data models | |
JP2007226788A (ja) | 仮想マシン環境におけるメソッド呼び出し方法、および前記方法を行う仮想マシンが搭載されたシステム |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
C17 | Cessation of patent right | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20090218 Termination date: 20130708 |