CN101198930B - 用于支持计算机系统中的数据值一致性的系统和方法 - Google Patents
用于支持计算机系统中的数据值一致性的系统和方法 Download PDFInfo
- Publication number
- CN101198930B CN101198930B CN2005800501216A CN200580050121A CN101198930B CN 101198930 B CN101198930 B CN 101198930B CN 2005800501216 A CN2005800501216 A CN 2005800501216A CN 200580050121 A CN200580050121 A CN 200580050121A CN 101198930 B CN101198930 B CN 101198930B
- Authority
- CN
- China
- Prior art keywords
- register
- parasitic
- value
- code
- instruction
- 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.)
- Expired - Fee Related
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3628—Software debugging of optimised code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3624—Software debugging by performing operations on the source code, e.g. via a compiler
-
- 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
Abstract
本发明涉及一般的数据值问题,尤其是当执行从源代码表示(10)翻译成目标代码表示(30)的程序代码时计算机系统中的驻留问题。本发明的基本思想是在程序代码翻译期间把对目标代码中的目标数据值容器(40)的索引与源代码的原始数据值容器(20)的相应地址信息相关联,并且在执行目标代码时存储与目标代码指令相关的信息连同原始数据值容器的相关地址信息,以便支持原始源代码表示的数据值视图(50)。这样,可以以高效的方式支持在目标系统中执行翻译后的目标代码(30)时跟踪原始源代码(10)的数据值。
Description
技术领域
本发明总体上涉及计算机技术领域,更特别地涉及计算机微体系结构、编译器技术和调试技术,尤其是当翻译程序代码时计算机系统中的数据值一致性的问题。
背景技术
计算机微体系结构的领域本身涉及计算机内部结构的设计以便支持计算模型。编译器技术是一种用来支持把计算机程序代码从一种形式翻译成另一种形式的技术,并且调试技术通常是用来调试的技术,换句话说就是找到计算机程序中的错误的技术。
当把代码从一种格式翻译成另一种格式时,代码位置和数据值的一致性的丧失是一个问题。当把源代码从高级语言向下翻译成目标格式时,或者当把代码从一种“目标”格式翻译成另一种“目标”格式时,都会暴露出所述问题。因此,可以在一个或几个步骤中把所述源代码翻译成目标代码。在后一种情况下,可以把任何中间代码格式视为“源”和/或“目标”格式。在每个翻译步骤中,都将有源格式和目标格式,尽管给定翻译步骤中的源格式可能是前一翻译步骤中的目标格式。
当对用高级语言表示的源代码在翻译成目标代码的过程中进行转换和优化时,无法支持在目标寄存器与源变量之间的直接映射。所述转换过程移动并且删除对变量值进行操作的指令。所述转换过程还可以使用不同的寄存器或存储器位置来保存在翻译后的程序中的不同点处的变量值。所述转换过程甚至可以使用一个寄存器来保存所述值,与此同时,其他变量在该相同的寄存器或存储器位置中保持它们的值。此外,所述转换过程可能已经在一个变量的生命期的一些部分期间去除了所述值保存寄存器;用常数负载来替换该寄存器,或者如上所述,使用还保存来自其他(多个)变量的一个或多个值的寄存器。报告各变量的驻留状态(residency)(也就是在某一程序点所述变量所驻留的寄存器或存储器位置以及它们所具有的值)是一个技术问题。在执行时,不仅报告当前值而且还报告变量在某一程序点的预期值也是一个问题。
特别地,当为了另一种类型的机器或系统而对预定在一种类型的机器或系统上执行的二进制代码进行转换和优化时,在原始二进制代码中被存储在某些寄存器内的值在所得到的代码中将被存储在其他寄存器内。在计算机技术的领域内,在对目标体系结构进行优化和适配之后呈现原始体系结构的状态(比如寄存器内容)特别成问题。
一致性的丧失的一般问题可以分解成以下主要问题:
·如何把目标代码表示中的指令地址映射到源代码表示中的指令地址?
·如何把目标代码表示中的诸如寄存器或存储器变量之类的数据值容器的地址映射到源代码表示中的数据值容器的地址?
·如何把目标代码表示中的数据值容器地址的多个有效实例映射回到源代码表示中的正确数据值地址?
第一个问题阐述了代码位置的问题。后两个问题涉及到数据值问题。
所述数据值问题有时被阐述为报告或者跟踪在某一程序点所预期的原始寄存器(或者在一般高级语言的情况下是变量)的预期值的问题。
确定是否可以在其所赋值的寄存器中访问原始寄存器或变量的问题典型地被称作在参考文献[1]中概述的驻留问题。
参考文献[1]注意到,为了适当地检测变量的驻留状态,使用该变量的生命期就足够了,所谓的生命期也就是从把该变量赋值给一个寄存器直到在另一条指令中最后一次使用该寄存器的代码的范围。但是所述驻留状态可以持续到另一个值被赋值给包含该变量的值的该寄存器。该程序点是该变量的逐出点。在[1]中,检测变量的逐出点是通过对在调试器中优化的代码应用数据流分析而实施的。
相关技术
参考文献[2]涉及一种内置调试支持设备,其在多个通用计算机上实现多处理器仿真环境以便提高调试效率。
参考文献[3]涉及一种用于微处理器的软件调试端口。当与片上踪迹高速缓存相结合地使用时,该软件调试端口提供用于在处理器上重建指令执行流的踪迹信息,并且能够在不停止处理器操作的情况下检查寄存器内容。
参考文献[4]涉及一种调试支持设备,其具有调试异常控制部件,该部件在接收到来自CPU内核的调试异常的生成指令时保留寄存器状态,以及把程序计数器改变到调试异常句柄的地址,并且在接收到恢复指令时把该寄存器返回到所述调试生成之前的状态。
参考文献[5]公开了一种具有紧凑踪迹记录存储装置的调试接口,该紧凑踪迹记录存储装置具有多个踪迹数据存储元件。所述存储元件的格式包括表示踪迹信息的类型的踪迹代码字段以及表示踪迹信息数据的类型的踪迹数据字段。
参考文献[6]涉及一种可编程逻辑器件(PLD),其提供观察及控制隐埋的内部节点的逻辑状态的能力。所述PLD提供用于内部节点的影子存储单元,所述内部节点比如是逻辑元件寄存器、存储单元和I/O寄存器。样本/负载数据路径包括双向数据总线和移位寄存器,其便于对内部节点进行采样以便观察其逻辑状态以及对内部节点进行加载以便控制其逻辑状态。
发明内容
本发明的一个一般目的是实现并且支持一种对所述数据值问题的一般解决方案。
一个特定目的是提供一种当执行从源代码表示翻译成目标代码表示的程序代码时对计算机系统中的所谓的驻留问题的解决方案。
特别地,期望提供一种支持原始源代码与翻译后的目标代码之间的数据值一致性的机制。
本发明的一个特定目的是提供一种用于在计算机系统上执行翻译后的目标代码时支持跟踪原始源代码的数据值的方法。
本发明的另一个特定目的是提供一种用于当在计算机系统上执行相应的翻译后的目标代码时支持原始源代码的数据值容器(比如寄存器或存储器变量)的视图的设备或模块。
一个特定目的是支持原始寄存器与目标寄存器之间的寄存器一致性。
特别地,一个目的是在对于一个不同计算机系统优化及适配了所述程序代码之后维持原始计算机系统的数据值视图,尤其是当针对该目标系统对预定在该原始系统上执行的二进制代码进行转换及优化时。
按照本发明的第一方面,提供了一种用于在计算机系统上执行被称作目标代码的源代码的翻译后的版本时支持跟踪原始源代码的数据值的方法,所述方法包括以下步骤:在程序代码翻译期间,利用所述源代码的原始数据值容器的相应地址信息给目标代码指令中的目标数据值容器的索引加标签;在执行目标代码时,存储与目标代码指令相关的信息连同所述源代码的原始数据值容器的加标签的地址信息作为跟踪信息,并且使用所述源代码的原始数据值容器的地址信息连同跟踪信息来提供原始源代码表示的数据值视图。
按照本发明的第二方面,提供了一种用于支持原始程序代码与被称作目标代码的该原始程序代码的翻译后的版本之间的数据值一致性的计算机系统,所述系统包括:用于执行目标代码的装置,目标代码指令被加上标签以便提供目标代码指令中的目标数据值容器和原始程序代码的原始数据值容器的相应地址信息之间的索引;用于在执行该目标代码时存储与表示所述原始程序代码中的数据值容器的赋值的至少一个目标代码指令相关的信息连同所述原始数据值容器的加标签的地址信息作为跟踪信息,并且使用所述原始程序代码的原始数据值容器的地址信息连同跟踪信息来提供所述原始程序代码的数据值视图的装置。
如所述,本发明涉及一般数据值问题,尤其是当执行从源代码表示翻译成目标代码表示的程序代码时计算机系统中的驻留问题。
本发明的基本思想是在程序代码翻译期间把对目标代码中的目标数据值容器的索引与源代码的原始数据值容器的相应地址信息相关联,并且在执行目标代码时存储与目标代码相关的信息连同原始数据值容器的相关地址信息,以便支持原始源代码表示的数据值视图。这样,可以以非常高效的方式支持在目标系统中执行翻译后的目标代码时跟踪原始源代码的数据值。
数据值容器的例子包括普通的微计算机寄存器以及高级编程语言中的分配了存储器的变量。因此,对于寄存器情况,本发明提供对于源代码的原始寄存器组与目标代码的目标寄存器组之间的寄存器一致性的支持。涉及存储器变量的情况反映了对于更一般的数据值驻留问题的解决方案。
本发明还使得有可能在对于一个不同计算机系统优化及适配了程序代码之后维持原始计算机系统的数据值视图。
在本发明的一个优选实施例中,在代码翻译期间关于数据值一致性对目标代码指令加标签,以便提供目标代码中的目标数据值容器(比如目标寄存器或目标变量)与源代码中的原始数据值容器之间的关联。
优选地,在目标代码执行时与所述相关联的原始数据值容器地址存储在一起的信息包括相应的目标指令地址信息和/或相应的指令操作数值。在后一种情况下,允许跟踪原始数据值容器的值而无需参考任何目标数据值容器。
有利地,上面的跟踪信息被写入到专门设计的额外寄存器文件中,其在下面被称作寄生(ghost)寄存器文件,并且优选地被实施为微计算机体系结构中的硬件寄存器文件。
加了标签的目标指令包括表示原始数据值容器的赋值的一个或多个目标指令,所述原始数据值容器比如是源代码中的寄存器或变量。为了提供完全跟踪支持,可以在所述寄生寄存器文件中把原始源代码的数据值容器地址信息从一个条目(或寄存器)移动到另一个条目。这样,本发明固有地支持其中取决于所取的执行路径可能把不同的原始寄存器(或变量)值赋予目标寄存器(或变量)的情况。这对于其中已经把原始寄存器(或变量)的不同实例翻译成目标寄存器的并行实例的情况也是适用的。
为了连贯地反映目标系统中的原始数据值容器的驻留状态,本发明优选地还包括用于支持寄生寄存器文件操作的顺序连贯性的逻辑。
此外,本发明优选地还提供用于选择性地转换寄生寄存器文件操作的操作流处理。所述操作处理逻辑典型地把分离自处理器的普通操作流的操作转换成针对所述额外寄存器文件的赋值、移动、存储和空操作。所述转换通常受到原始普通操作和所述额外寄存器文件的所谓的读取等待时间窗内的在前转换的操作的控制。
因此,目标代码的指令字中的额外字段、额外的寄存器文件以及某种操作处理逻辑允许在目标代码执行时在目标数据值容器的状态之外还维持原始源代码的数据值容器的状态,并且如果需要的话甚至允许维持两种不同的计算机体系结构的状态。
除了所述寄生寄存器文件或等效的存储器设备之外,本发明还提供单独的“编译时间”和“运行时间”组件、以及这种单独组件的集成系统组合。例子包括可操作用于执行所谓的加标签的编译时间组件、以及可操作用于把相关信息存储在所述寄生寄存器文件内的运行时间组件。
本发明提供以下优点:
当阅读下面对本发明的实施例的描述时,将会认识到本发明所提供的其他优点。
附图说明
通过参考下面结合附图进行的描述,将会最好地理解本发明及其进一步的目的和优点。
图1是说明根据本发明一个优选实施例的用于支持原始源代码与目标代码之间的数据值一致性的机制的示意图;
图2是用于在执行相应的目标代码时跟踪原始源代码的数据值的示例性总体方法的示意流程图,其中包括调试和/或踪迹分析;
图3说明根据本发明一个特定实施例的示例性处理器环境中的寄生寄存器文件;
图4是目标寄存器文件和寄生寄存器文件的示意图,其示出所述寄生寄存器文件的不同使用的例子;
图5是目标寄存器文件和寄生寄存器文件的示意图,其示出当顺序代码中的目标寄存器已经被并行化从而使得顺序目标寄存器具有几个并行实例时使用所述寄生寄存器文件的一个例子;
图6说明用于确保寄生寄存器文件操作的顺序连贯性的寄生寄存器文件管道步骤逻辑的一个例子;
图7说明用于选择性地转换寄生寄存器文件操作的操作流处理逻辑的一个例子;以及
图8说明根据本发明一个优选实施例的寄生寄存器文件中的溢出和重载操作的例子。
具体实施方式
在整个附图中,相同的附图标记将被用于相应的或类似的元件。
过去并没有完全解决所述数据值问题,尤其是,微处理器工业和学术界还没有解决对于跟踪在计算机系统中容易进行优化代码翻译的原始数据值容器值的硬件支持。这种支持将大大缓解在这种系统上的计算机程序调试问题。
首先将在一般情况下作为对数据值驻留状态问题的一般解决方案来描述本发明。随后,将分别在寄存器一致性支持和跟踪高级语言中的存储器变量的情况下举例说明本发明。
图1是说明根据本发明一个优选实施例的用于支持原始源代码与目标代码之间的数据值一致性的机制的示意图。所述程序代码是以原始源代码表示给出的,其被简单地称作源代码10,并且关于一组数据值容器20(比如寄存器或存储器变量)操作。原始源代码的数据值容器被称作原始数据值容器。源代码10被翻译成目标代码表示,其被简单地称作目标代码30。该目标代码30关于另一组数据值容器40操作。目标代码的数据值容器被称作目标数据值容器。所述代码翻译通常包括代码转换、优化以及寄存器分配和静态变量的分配。然而,根据本发明,在程序代码翻译期间的一个附加的任务是把对目标代码指令中的目标数据值容器的索引与源代码的原始数据值容器的相应地址信息相关联。优选地,这是通过利用涉及原始数据值容器的相关信息对目标代码指令加标签来实现的。例如,所述加标签过程可以利用原始容器的地址/名称来标记(或者加标签)指令的目的地容器。在目标代码运行时间期间,当执行加了标签的目标代码30时,指令操作数值被赋予目标数据值容器,并且通常还在不同的目标容器之间被移动。另外,根据本发明,与目标代码指令相关的信息和原始数据值容器的相关联的地址信息一起被存储在一组所谓的“寄生”或“影子”数据值容器50中。这样,可以在目标代码运行时间内维持或者支持原始源代码表示的数据值视图,从而大大方便了调试和/或踪迹分析。
在微计算机体系结构中,用于支持原始源代码的数据值视图的数据值容器50优选地被实施在“寄生”寄存器文件内,尽管也存在替换的实施方式,其中包括使用普通的事务存储器。所述“寄生”数据值容器50还可以是被分配给高级编程语言中的变量的存储器位置。
图2是用于在执行相应的目标代码时跟踪原始源代码的数据值的示例性总体方法的示意流程图,其中包括调试和/或踪迹分析。在代码翻译阶段,优选地关于数据值一致性给目标代码指令加标签,以便提供目标代码中的目标数据值容器(比如目标寄存器或目标变量)与源代码中的原始数据值容器之间的关联(S1)。在执行目标代码时,把诸如目标指令地址信息之类的信息和/或相应的指令操作数值与相关联的原始数据值容器地址存储在一起(S2)。在调试阶段,可以基于所存储的跟踪信息来分析原始源代码。正如稍后将解释的那样,当目标指令地址信息和原始数据值容器地址被作为跟踪信息存储时,调试实用程序可以使用目标指令地址信息来再现在经过优化的目标代码中有效的值。如果指令操作数值本身被存储,则可以在不参考任何目标数据值容器的情况下跟踪原始数据值容器的值。
代码分析器和翻译器(典型地是编译器)通常分析所述代码以便提供原始源代码的数据值容器信息,可以稍后在执行所得到的目标代码的过程中与所选择的运行时间信息一起使用所述数据值容器信息,以便提供原始源代码的数据值容器视图。
因此,本发明提供针对数据值驻留状态问题的解决方案,尤其是针对在由翻译后的经过优化的代码设置时报告变量值(在高级语言翻译的情况下)或原始寄存器值(在二进制翻译的情况下)以及/或者报告它们在踪迹/断点处驻留在哪些目标寄存器中的问题。
寄存器一致性
下面将关于原始代码中的原始寄存器和目标代码中的目标寄存器详细分析数据值问题。
为了说明不同的寄存器一致性问题,下面给出两个基本代码实例。原始体系结构中的寄存器被称作原始寄存器OREG。关于目标体系结构的寄存器被称作目标寄存器treg:s。
实例1:
ld tregB,ADDR0;//目标寄存器tregB从地址ADDR0处的存储器
//中取值
mv tregA,tregB;//把目标寄存器tregB的值移动到tregA中
ld tregB,ADDR1;//tregB取得新值
st tregA,ADDR2;//把tregB的前一个值溢出到地址ADDR2处的
//存储器
ld tregC,ADDR2 //把tregB的前一个值重载到寄存器tregC中
conditional_jump L1;
mv tregC,tregD;//把tregD的值加载到tregC中
L1)
mv tregE,tregC;//在tregE的赋值中使用tregD的值或tregB的前
//一个值
假设tregB初始从ADDR0处的存储器单元取得原始寄存器OREG1的值(也就是第一条原始指令从ADDR0加载OREG1),并且tregD包含OREG2的值,tregE在L1处取得何值?这个问题的答案取决于所述代码是通过哪一条路径执行的以及编译器可以给出关于所述赋值的哪些信息。这意味着对所述问题的一种解决方案,其中既使用动态信息又使用静态信息。
所述优化过程还可以把原始代码中的不同时间点处的原始寄存器中的值分配到目标代码中的相同时间点。这在实例2中说明。
实例2:
LD OREGA,ADDR1;//用存储器地址ADDR1中的值来加载
//OREGA
... //这里的计算链基于OREGA中的值
... //采用OREGB中的结果
ST OREGB,ADDR1 //把新值存储在存储器中
LD OREGA,ADDR2 //用另一个值加载OREGA
... //另一个计算链基于新值
... //采用OREGC中的结果
ST OREGC,ADDR2 //把下一个新值存储在存储器中
这里,OREGA寄存器被用于不同时间的值。在更宽分发机器(比如VLIW(超长指令字)机器)中,这两个计算链可能已被并行化。
//OREGA的两个实例已经被翻译成在treg17和treg19中保存的两
//个并行实例。
ld treg17,addr1;ld treg19,addr2;nop;nop;
//这两个计算链被并行化在各VLIW机器功能单元上。
//存储也被并行化,产生gr21和gr23
st treg21,addr1,st treg23,addr2
这造成一个问题,因为调试器和/或踪迹实用程序需要知道哪个值构成OREGA的哪个实例。
在我们的方法中,目标系统中的动态计算通常是关于哪些原始寄存器(在二进制翻译的情况下)或变量(在高级翻译的情况下)被赋予哪些目标寄存器。该信息优选地被维持在“寄生”寄存器文件中。因此,在任何给定点处,通过搜索所述“寄生”寄存器文件来确定原始寄存器(或变量)的驻留状态。在该处找到的原始寄存器(或变量)是驻留的,没有找到的不是驻留的。
对于翻译系统的关于源代码中的原始寄存器或变量的驻留问题,与[1]相比,我们的方法利用相对简单的硬件实施方式结合用某些赋值下的原始寄存器对编译器中的指令加标签来代替调试器中的数据流计算。
这种方法的一个优点在于,仍然可以报告已逐出的原始寄存器(或变量值),只要它不是被另一个原始寄存器(或变量)值逐出的即可。
在下面假设源指令地址在编译期间被归因于相应的目标指令,并且以适当的方式被提供给踪迹/调试实用程序。
在一个优选实施例中,目标指令原语(比如VLIW或RISC原语)中的目的地寄存器编码具有用于原始寄存器地址的额外字段。如果该字段具有有效的原始寄存器地址,则所述操作的结果也将被写入到支持原始寄存器组的一致性的寄生寄存器中。除非用于踪迹和调试目的,否则该寄生寄存器组将从不被读取。因此,对于寄生寄存器文件容许长的操作等待时间。这意味着所述寄生寄存器文件处在关键路径之外,以及可以把对其的访问进行流水线式安排以满足定时需求,并且寄生寄存器文件可以被放置在芯片上的几乎任何位置处。如果需要支持“目标寄存器中的原始寄存器值”跟踪,则所述寄生寄存器文件通常在寄生寄存器元件之间传送仿真的寄存器标签。当支持“仅仅原始寄存器值”跟踪时,如果没有对移动操作进行原始寄存器加标签,则也是这种情况。在这些情况下,由于所述移动操作是组合的读取和写入,因此通常需要从寄生寄存器文件进行读取。由于GRF等待时间,移动操作意味着对邻近的GRF操作的依赖性。这可以通过利用对长GRF操作等待时间的容限来处理。下面给出关于这方面的更多内容。
编译器知道从原始寄存器组到目标寄存器组的映射,如果一条指令表示源代码中的原始寄存器的赋值,则该编译器利用该原始寄存器的地址/名称来给该指令的目的地寄存器加标签。在上面的例子中,这将意味着:
实例1:
ld tregB(OREG1),ADDR0 //原始寄存器OREG1的值被加载到
//tregB中
mv tregA(OREG1),tregB; //原始寄存器OREG1的值被移动到
//tregA中
ld tregB,ADDR1; //tregB取得新值
st tregA,ADDR2;//OREG1的值被溢出到地址ADDR1处
//的存储器
ld tregC(OREG1),ADDR1//OREG1的值被重载到寄存器tregC中
conditional_jump L1;
mv tregC(OREG2),tregD;//OREG2的值被加载到tregC中
L1)
mv tregE,tregC;//OREG 1或OREG2的值被用在tregE的
//赋值中
所述编译器无法推断出原始寄存器OREG1还是OREG2的值将被赋予tregE,因为这取决于到达L1处的语句的途径。因此,在没有动态信息的情况下,不可能分辨是把OREG1还是OREG2的值赋予tregE。然而,所能够推断出的是OREG1的最近的值是来自ADDR0的值,因为没有其他值被赋予具有标签OREG1的目标寄存器。同样,OREG2的最近的值是tregD的值(其中tregD当然可能已经在早先从存储器取得其值,正如OREG1那样)。
实例(1)意味着,为了仅仅保存原始寄存器的最近的值,在编译/链接时间利用原始目的地寄存器给目标目的地寄存器加标签并且随后在运行时间把所述值写到寄生寄存器就足够了。为了跟踪原始寄存器值在程序中的每一点处驻留在什么位置,对于其中取决于所取的执行路径可能把不同的原始寄存器值赋予目标寄存器的情况,必须在寄生寄存器文件中具有运行时间的支持。正如下面将解释的那样,这优选地是通过在寄生寄存器文件内移动信息的特殊寄生寄存器操作类型来实现的。
实例2:
//OREGA的两个实例已经被翻译成在gr17和gr19中保存的两个并
//行实例。
ld treg17(OREGA),addr1;ld treg19(OREGA),addr2;nop;nop;
因此目标指令字中的额外字段、额外的寄存器文件以及某种操作处理逻辑允许在目标代码执行时维持原始源代码和翻译后的目标代码的数据值容器的状态,并且如果需要的话甚至允许当目标代码被优化以便在不同于原始系统的目标系统上执行时维持两种不同的计算机体系结构的状态。
图3说明根据本发明一个特定实施例的示例性处理器环境中的寄生寄存器文件。在简化视图中,该示例性处理器100具有四级:指令取出110、解码120、执行130和提交140。该处理器系统还具有普通寄存器文件40和寄生寄存器文件50。当在存储器和普通体系结构寄存器文件40上操作的普通指令被提交时,从解码级120中的普通代码流解码寄生寄存器操作并且将其提交给寄生寄存器50。从寄生寄存器文件到存储器的写入数据路径使用普通存储器写入数据路径。优选地,寄生寄存器文件50驻留在与执行管道相距多个管道步骤的地方,以便在可能的情况下处理读取等待时间。所述多个管道步骤的实际数目被选择成易于实施。存储器读取数据路径被省略,其他必要的常见结构也被省略,比如数据读取地址总线、指令地址总线等等。
可以由调试实用程序200读取在寄生寄存器文件(GRF)50中存储的跟踪信息,以便对原始源代码执行调试和/或踪迹分析。该调试实用程序当然还可以从普通寄存器文件40读取信息,以便支持目标代码调试。该调试实用程序读取在存储器中存储的GRF的快照。在实践中,通常是通过执行寄生存储操作把GRF的内容排序到存储器中而取得GRF的快照,就像通过(普通)存储操作把普通寄存器文件存储到存储器那样。寄生存储操作的实际编码可以处在操作码字段中或者处在地址字段中。
在本发明的一个特定实施例中,从编译器/链接器的角度看,一条指令有三种能够把寄存器写入目的地写到寄存器的方式:
1)仅仅写入到目标寄存器。
2)写入到目标寄存器并且还写入到寄生寄存器。
3)仅仅写入到寄生寄存器。
寄生寄存器组例如可以处在三种写入模式下。所述写入模式在对寄存器进行写入的指令当中包括不同的各组寄存器写入目的地。
第一写入模式是其中没有写入寄存器一致性信息的情况。在该模式下,仅仅在指令当中找到寄存器写入目的地情况1。
第二写入模式是标准寄存器一致性支持情况,也就是,仅仅在对原始寄存器赋值的未去除语句中的目的地寄存器被加标签。在该模式下,可以在指令中找到寄存器写入目的地情况1和2。也就是,具有未用原始寄存器加标签的目的地寄存器的指令将被写入到目标寄存器,而具有用原始寄存器加了标签的目的地寄存器的指令将被写入到目标寄存器和寄生寄存器中。
第三写入模式是一种额外寄存器一致性支持情况,也就是,编译器将保存“寄生”赋值语句,其中用原始寄存器标签和写入目的地3标签来给目的地寄存器加标签,即使已经在优化中去除了真实赋值也是如此。在该写入模式下,在指令当中找到所有寄存器写入目的地情况。这意味着除了寄存器写入目的地情况1和2(第二写入模式)之外,在该模式下还在指令当中找到寄存器写入目的地情况3。具有寄存器写入目的地3的指令表示已经在优化期间被编译器去除的指令。
在寄存器一致性的情况下,第三写入模式主要是理论上令人感兴趣,因为寄存器分配不可能把寄生寄存器与目标寄存器的赋值分离,也就是,寄存器分配将也在已去除的指令上进行分配。因此,仅有寄生的赋值在代码中的存在可能会对寄存器使用和溢出带来影响(取决于寄存器文件尺寸)。对于这些问题可能会有补救方法,比如对于一个或几个原始寄存器仅仅使用第三写入模式、把目标寄存器组(如果足够大的话)分成两组(较大的一组用于真实赋值,较小的一组用于寄生赋值)或者仅仅与“仅对原始寄存器值的跟踪”相结合地使用第三写入模式。
在使用时,在处理器控制寄存器中指定写入模式。
调试器/踪迹实用程序将可以访问一组寄生寄存器以及每个寄生寄存器被写入的指令地址。它还将具有寄存器写入目的地标识,从而它可以推断出寄生寄存器被如何写入。这将使得所述实用程序能够再现在优化后的目标代码中有效的原始寄存器值。
寄生寄存器文件通常包含与目标体系结构中的寄存器数目一样多的条目,并且优选地还包括一个溢出区域。如果该溢出区域与所述目标寄存器组一样大,则所有寄生寄存器都可以被容易地溢出。每个条目优选地包括原始寄存器编号以及该寄存器被写入和/或数据值被存储的指令地址。
在一种特定示例性实施方式中,添加附加的可选信息,从而每个条目优选地包括以下字段:
OR | RWD | TMIA | E | V |
·OR-原始寄存器编号
·RWD-寄存器写入目的地(通常是1比特,编码情况2和3)
·TMIA-目标机器指令地址
·E-已逐出的值(通常是1比特)
·V-值
表I
当跟踪目标寄存器中的原始寄存器值时,不需要值字段(V),这是因为可以在相应的目标寄存器中找到该值。
当仅仅跟踪原始寄存器值时,需要值字段(V),这是因为目标寄存器可能被赋予新值,在这种情况下,(多个)旧值将被从目标寄存器中逐出。
RWD字段通常是由用于第二写入目的地(第一个将绝不会存在于寄生寄存器中)的处理器控制寄存器中的模式值产生的。如果处理器处在第三写入模式下,则第三写入目的地被赋予RWD字段,并且目标目的地寄存器被定义为空。目标寄存器非修改操作的编码也可以通过操作码中的1比特或者模式比特字段以及目标目的地寄存器中的1比特来实现。如果仅仅需要寄存器写入目的地2,则可以省略RWD字段。
(保存指令比特的)另一个选项是使用寄存器地址图中的一个寄存器条目作为空标记。对该寄存器条目的写入将不改变其内容。如果被使用的话,则该寄存器条目可以被用来总是产生零。
如果E比特被设置,则该值(V)被一个非原始寄存器值从TMIA处的目标寄存器中逐出。
图4和图5分别说明在“顺序代码”和“并行代码”的情况下对寄生寄存器文件的示例性操作。寄生寄存器文件和目标寄存器文件被描绘成彼此邻近。通常来说并不是这种情况,以免与目标寄存器文件周围的路由和放置发生干扰。附图仅仅提供了逻辑视图。图4和图5对应于上面描述的实例1)和2)。
图4的实例1)被用于示出在启用“跟踪目标寄存器中的源寄存器值”时以及在启用“仅仅跟踪源寄存器的值”时对寄生寄存器文件的不同使用。为了清楚起见,这里V字段在这两种情况下都存在。实例1)作为顺序代码被给出,也就是,它尚未被并行化为例如VLIW指令字。对于寄生寄存器的使用是相同的,而不管它是从RISC指令字还是VLIW指令字写入的。
图4中的实箭头线表示在跟踪源寄存器的值时的操作,而虚箭头线表示在跟踪目标寄存器中的源寄存器值时所添加的操作。例如,在目标指令IA处执行的把ADDR0中的值加载到目标寄存器tregB中的操作“ld tregB(OREG1),ADDR0”意味着把信息[OREG1,2,IA,[ADDR0]]写入到寄生寄存器“ghost tregB”,其中OR是OREG1,RWD等于2,目标机器指令地址是IA,并且值V是从ADDR0处的存储器位置取得的。把tregB的值移动到tregA中的操作“move tregA(OREG1),tregB”被映射到把tregB的值赋予寄生寄存器ghost tregA的寄生操作中,其中OR等于OREG1,RWD等于2,并且该移动操作的指令地址也被写入到ghost tregA中:[OREG1,2,IA,tregB]。
在实例1)中,在可以静态地推断出时,由编译器利用原始寄存器地址给移动操作加标签。另一个替换方案是根本不给移动操作加标签(仅仅给初始赋值或加载操作加标签),而是令寄生移动操作总是把寄生源寄存器值(OR,RWD,TMIA,E,V)拷贝到寄生目的地寄存器。在对寄生寄存器文件操作的描述以及下面的编译器描述中预先假定该替换方案。
处理器控制寄存器中的控制比特(EVICT)定义未加标签的目标寄存器赋值(即寄生寄存器字段中的无效寄存器地址)是否应当使寄生寄存器中的原始寄存器地址(OR)的早先赋值无效。这将允许两种不同的使用。如果目标寄存器中的原始寄存器值应当被跟踪,则EVICT应当总是被设置。因此,只有在仅仅对原始寄存器值感兴趣的情况下,该EVICT控制比特才是有意义的。如果被清除,则即使原始寄存器值不存在于目标寄存器中,它们也被保存,并且它们将仅仅被用原始寄存器加了标签的指令所重写。如果被设置的话,则原始寄存器值可能被未加标签的赋值从寄生寄存器文件中驱逐。这可以在下面的表II中被概括:
处理器控制比特EVICT---->跟踪模式!V | 清除“无重写” | 设置“重写” |
仅仅原始寄存器值 | 当原始寄存器值从目标寄存器中消失时,它们也被保存 | 当原始寄存器值从目标寄存器中消失时,它们不被保存 |
跟踪目标寄存器中的原始寄存器值 | 非法,因为如果寄生寄存器没有被正确更新,则所述跟踪将是错误的 | 允许跟踪目标寄存器中的原始寄存器值 |
表II
如果将要执行快照或事后分析,则禁用追踪,并且通过寄生寄存器转储例程读取寄生寄存器存储器并写入到主存储器。
通过向寄生寄存器转储例程插入陷阱,可以保存原始体系结构寄存器组的快照或检查点以供稍后进行分析。
图5的实例2)被用来示出在顺序代码中的目标寄存器已被并行化时对寄生寄存器文件的使用,从而“顺序”目标寄存器具有几个并行“实例”。
寄生寄存器文件内部结构
所述寄生寄存器文件(包括溢出区域)是一个暂存器,其支持原始源代码的寄存器视图或者在目标体系结构上仿真的原始体系结构。通过两种基本操作类型来操作该暂存器。
寄生寄存器操作类型
一种操作是赋值操作,其是执行管道中的算术或加载指令的副作用。这些算术或加载指令在其原始寄存器目的地字段中明确地指出相应的原始寄存器名称。
另一种操作是移动操作。该移动操作源自执行管道中的移动指令。其不同之处在于,该操作没有明确地指出将写入到寄生寄存器文件中的原始寄存器的名称。移动操作必须把由移动操作源目标寄存器编号索引的寄生寄存器条目的OR字段拷贝到由移动操作目的地目标寄存器编号索引的寄生寄存器条目。
并非目标寄存器文件中的所有移动操作都将引起寄生寄存器文件中的移动操作。例如,在非逐出情况下的未加OR标签的移动操作在其到达寄生寄存器时将是NOP。加了OR标签的移动操作将被转换成寄生寄存器赋值操作。
寄生存储操作被用来把寄生寄存器内容写入到存储器中。当在代码流中的各观察点处取得寄生寄存器内容的快照时使用寄生存储操作。包含寄生存储指令的代码可以是异常或中断例程中的代码或者普通代码,这取决于人们想要如何设置所述观察。随后,使用这些观察快照作为到分析调试软件的输入。
NOP指令是空操作,其不对寄生寄存器文件进行操作。
寄生移动操作必须从寄生寄存器文件进行读取,以便能够将其OR值写入到寄生寄存器文件中。赋值操作仅仅需要写入到寄生寄存器文件。赋值操作支持把OR信息从编译器静态传送到寄生寄存器文件中。移动操作支持OR信息在寄生寄存器文件中的动态的、执行相关的传送。
为了支持移动和赋值操作,一种优选的解决方案是对于每个有效功能处理器单元(即对于该处理器内的每个有效操作产生实体)为寄生寄存器文件提供一个写入端口和一个读取端口。换句话说,每个发布槽一个读取端口和一个写入端口。
寄生寄存器操作顺序连贯性
由于读取操作在完成之前具有一个等待时间,因此我们需要额外的逻辑来支持操作流中的顺序连贯性。在该流中稍后的任何其他操作之前必须写入移动操作读取的结果,不管是读取还是写入该移动操作的目的地条目。如果这种连贯性不受支持,则寄生寄存器文件将不根据由编译器和目标机器的动态执行路径指定的赋值和移动操作来描绘原始体系结构的寄存器状态。关于在执行流水线情况下的数据危险的一般讨论参见参考文献[7]。
因此,对于复杂调试,寄生寄存器文件需要某种逻辑来确保这种连贯性。这在图6的帮助下进行了描述,该图说明用于确保寄生寄存器文件操作的顺序连贯性的寄生寄存器文件管道步骤逻辑的一个例子(描绘一个操作流)。
由于寄生寄存器文件50需要支持与机器中的功能单元的数目一样多的操作流,因此该逻辑将被复制。为了简洁起见,图6省略了RWD和TMIA单元的传输和写入。还省略了到存储器的存储路径(即到执行管道的数据路径)以及存储地址路径。
在该例中,引入了多个管道寄存器(P1、P2、P3、...)。这些寄存器包含RWD标志、TMIA值(在图6中都被省略)、目的地目标寄存器编号(dtreg)、原始寄存器编号(oreg,如果该操作是赋值的话)或者源目标寄存器(streg,如果该操作是移动的话)以及操作指示符(赋值或移动)。
转发和写入控制单元60优选地监视管道寄存器数据,并且如果检测到移动操作,它将把源目标寄存器编号(streg)转发到读取地址端口,以便当该移动操作处在最后一个管道级中时具有来自寄存器文件的数据(OR值)以进行写入。
如果在管道中检测到对移动操作源的一个或多个赋值,则在所述移动之前的最后一个OR赋值将被设置为将在移动写入中写入的数据。在这种情况下,所传送的过期OR值将被忽略。
这优选地是通过把最后一个管道步骤寄存器目的地目标寄存器编号(到寄生文件中的写入索引)与先前的管道步骤寄存器源目标寄存器编号(如果该管道寄存器包含移动操作的话)进行比较而实现的。如果这两个目标寄存器索引相匹配,则将用最后一个管道寄存器的OR值来加载等待从寄生文件传送OR值的寄存器。来自寄生文件的OR传送(过期值)在下一循环中将被忽略,并且将使用被写入到所述移动的源寄存器的新的OR值。
下面通过伪代码来解释这一示例性逻辑。所需要的存储结构(寄存器)被称作端口接口结构中的元件P0,即寄生寄存器文件之前的最后一个管道步骤。请注意,所述代码并不完整,例如省略了忽略标志处理。还省略了存储操作处理。尽管所述存储操作是GRF读取,但是它并不对GRF进行写入,而是写入到存储器。在所述存储之前的所有操作通过移动源地址转发来支持所述连贯性。所述伪代码仅仅作为示例性概略而给出,以便提供对所述逻辑的更好的理解。
P0.radr; //读取地址,其被用于移动地址转发
P0.rdata; //当移动操作将在寄生文件中被完成时,从所述移动的
源
//读取数据、OR值以便写入到该移动的目的地。
P0.we; //写入使能。
P0.rdati;//如果要忽略来自寄生寄存器文件的数据,则读取忽略
//标志。
P0.wadr; //写入地址,即在赋值操作以及移动操作的最后一部分
中
//使用的写入地址。
P0.wdata //写入数据,或者是来自赋值操作的OR值,或者是来
自
//移动操作的OR值。移动操作OR值或者源自对寄生文
//件的读取,或者源自对该移动操作的源的赋值操作的
写
//入数据。
P0.wadr //写入地址、赋值或移动操作目的地。
到所述转发和写入控制单元中的最后一个管道步骤的输入数据是先前管道步骤P1、P2、P3的数据。
{P3-P1}.dtreg; //目的地目标寄存器编号,到寄生寄存器文件中
的
//写入索引
{P3-P1}.streg; //源目标寄存器,到寄生寄存器文件中的读取索
//引。如果操作是移动,则是有效编号。
{P3-P1}.oreg; //原始寄存器编号,OR数据值。如果操作是赋值,
//则是有效编号。
{P3-P1}.op; //操作,即空操作、移动或赋值
//如果管道中有移动操作,则它触发读取地址的转发。
IF(P4.op==’move’)
THEN
P0.radr:=streg;
P0.rdati:=FALSE;//接受将被传送的数据
ENDIF
IF(P1.op==’assignment’)
//如果将执行的操作是赋值。
THEN
//..利用目的地目标寄存器加载写入地址。
P0.wadr:=P1.dtreg;
//..以及将要写入的显式OR值
P0.wdata:=P1.oreg;
P0.we:=TRUE;
ELSE
IF(P1.op==’move’)
//如果将执行的操作是移动。
THEN
//..利用目的地目标寄存器加载写入地址。
P0.wadr:=P1.dtreg;
//..以及从寄生寄存器文件加载的OR值
P0.wdata:=P0.rdata;
P0.we:=TRUE;
ELSE
IF(P1.op==’nop’)
//如果操作是空操作,则禁用写入。
THEN
P0.we:=FALSE;
END
//如果移动前面更新该移动操作的源的操作。
IF(P2.op==’move’AND P2.streg==P1.dtreg)
THEN
IF(P1.op==’assignment’)
//..并且在前操作是赋值..
THEN
//..用在前操作的OR值加载数据寄存器
P0.rdata:=P1.oreg;
//..以及忽略过期值。
P0.rdati:=TRUE;
ELSE
IF(P1.op==’move’)
//..否则,如果在前操作是移动
THEN
//..再利用在前的移动的所取出的OR值..
P0.rdata:=P0.rdata;
//..以及忽略该移动的来自寄生文件的值。
P0.rdati:=TRUE;
ENDIF //如果操作是NOP,则什么也不做。
ENDIF
利用更多的管道步骤可以处理更长的读取等待时间。随着在前操作的数目的增大,对于移动操作的源内容的在前更新的转发和控制的处理将或多或少更为复杂。
上面的例子被简化,因为它仅仅描绘了一个操作流。对于移动源修改操作,必须检查来自其他操作流的在前操作。通过寄存器存储器的等待时间也被选择得低,从而不必检查多个移动操作。在所述转发窗口中存在多个移动操作将增大可能的多个修改值所需的存储装置的数目。
寄生寄存器文件50在关键路径之外,因为朝向寄生寄存器文件的操作的完成可以以任何适当数目的循环来跟踪操作产生活动。这便于把寄生寄存器文件及其小的支持逻辑组放置在芯片上的任何地方。如果存在位置和路线定时问题,则仅仅在操作传输路径中添加一定数目的管道步骤。
寄生寄存器操作流处理
图7说明用于选择性地转换寄生寄存器文件操作的操作流处理逻辑的一个例子。可以从寄生寄存器文件50向后移动对在前操作的分析,以便确保足够的分析时间。该操作流处理逻辑70过滤从各功能单元(FU)到寄生寄存器文件空操作的不相关的指令代码。如果移动之前是源修改操作,则该操作流处理逻辑70还可以作废所转发的移动操作读取地址,并且用赋值操作来替换该移动操作。新的赋值操作从在前的源修改操作取得其目的地寄存器值。
所述操作流处理还将把一些移动操作转换成空操作和赋值操作(参见上面对寄生寄存器操作类型的描述)。它还可以把一些加载和存储(溢出和重载)转换成移动操作(与下面对寄存器分配的描述相比)。
对所述操作流的处理70可以被放置在任何地方,并且寄生寄存器文件50也是如此。寄生寄存器文件50和操作处理70不需要是邻近的。
调试器/踪迹实用程序分析
该实用程序从存储器读取寄生寄存器数据。所取得的每个快照通常将包含以下数据:
·目标机器指令地址(当快照发生时)。
·寄生寄存器文件内容。
该实用程序现在将使用所述快照目标机器指令地址将其自身索引到目标机器代码中。这里它将找到多个目标机器(例如VLIW)原语,其中的每一个都具有原始代码的指令地址的属性。
这些原始代码指令地址使得所述实用程序能够将其自身映射回到原始代码中。
编译器
在该方案中,编译器的任务是对把原始寄存器值赋予目标寄存器的指令的目的地寄存器加标签。这首先是在编译器的翻译阶段中进行的,其中,每条源语句被翻译成一条或几条目标语句。如果该源语句对原始寄存器赋值,则至少其中一条所述目标语句将把该值赋予一个虚拟或象征寄存器,其在此处表示原始寄存器。
但是编译器的任务通常不停止在翻译阶段。编译器必须在整个优化和寄存器分配阶段维持虚拟寄存器上的标签,直到它最终把信息传递到链接器和目标格式。
下面假设已经向编译器给出了“标准”或“额外”一致性(关于上面的写入模式2和3)以作为一个选项。如果给出“无”一致性,则执行普通的编译。
翻译阶段
翻译阶段是所述编译器中的阶段,在该阶段中,源指令被翻译成一个包括一条或多条目标指令的序列。这通常是通过从表示源程序或对象的中间形式翻译成表示目标程序或对象的中间形式而实现的。一般来说,所述翻译是朝向尺寸无限的象征或虚拟寄存器组进行的。换句话说,所述翻译阶段不用麻烦把目标寄存器赋予目标指令。此后,直到寄存器分配阶段,当我们说到目标寄存器时将指的是虚拟目标寄存器。
然而,应当理解,“翻译”这一表达还包括从源代码到目标代码的总体代码翻译或转换,其中包括优化和寄存器分配。
在该方案中,所述编译器在翻译阶段中的任务是对于每个翻译后的指令利用表示原始目的地寄存器的编号或名称来给目标目的地寄存器加标签。该标签通常被保存为表示所述目标程序的中间形式中的一个属性。更具体来说,它被保存在表示所述翻译后的指令的数据结构中。
编译器选择给目标指令序列中的表示把原始寄存器值加载到目标目的地寄存器中的源指令的目标指令加标签。
这意味着并不是将利用所述原始目的地寄存器给所有的目标加载指令加标签。例如,当然将不对地址计算指令、临时计算指令、索引或指针检查或者其他运行时间检查指令加标签,因为它们不表示加载或原始寄存器。这开启了不使位于被赋予非原始寄存器值的目标寄存器中的原始寄存器值无效或者使其无效的选项(参见上面)。
优化阶段
优化阶段是这样的阶段,其中可选地对通常由中间形式表示的目标程序进行分析、转换和调整,以便适合于特定目标系统。稍后解释的寄存器分配和指令调度器也可以被认为是优化阶段。
一般来说,编译器在优化阶段中的任务是在整个转换过程中把(翻译阶段设置的)原始寄存器标签保持在加载原始寄存器值的指令的目标目的地寄存器上。
可能出现不同的情况:
·加了标签的指令将被去除-如果为编译器给出了“额外”一致性这一选项,则该指令不被去除,而是具有“仅仅写入到寄生寄存器”的属性。如果给出了“标准”一致性的选项,则去除该指令。
·加了标签的指令将被替换-目的地寄存器上的标签被移动到替换旧指令的该指令中的目的地寄存器中。
·加了标签的指令将被提升或下降-具有未改变的的目的地寄存器上的标签的目标指令被提升或下降。
寄存器分配
寄存器分配指的是其中所述代码内的无限的虚拟或象征寄存器组的实例被赋予来自目标体系结构的物理寄存器名称的情况。由于机器中的物理寄存器的数目有限,因此寄存器分配器有时会插入及去除指令,其负责寄存器值出入存储器以及在寄存器之间的加载、存储和移动。由于在某一程序点处可以获得的空闲物理寄存器有限而把寄存器值存储及加载到存储器的做法被称作“寄存器溢出”。因此,虚拟寄存器的一个实例不必被映射到物理寄存器的一个实例。
正如其他阶段一样,寄存器分配器的任务就是在整个寄存器分配阶段把原始寄存器标签保持在目标目的地寄存器上,而不管目标寄存器在寄存器分配的不同阶段中的不同中间表示如何。
对于“仅仅源寄存器值”的跟踪模式来说,它仅必须在赋值过程中参与维持标签。这将导致寄生寄存器文件在运行时间被赋予寄生寄存器中的值。
对于“跟踪目标寄存器值中的原始寄存器值”的跟踪模式来说,寄生寄存器文件中的移动操作将负责跟踪各寄存器之间的值。然而,为了能够跟踪已被溢出到存储器并且随后被重载的原始寄存器值,如果可以静态地推断出的话,则寄存器分配器的溢出代码发生器必须用原始寄存器名称或编号给所插入的加载指令的目的地寄存器加标签。如果不能的话,则所述溢出代码必须包括从所溢出的寄存器到寄生寄存器文件的溢出区域的寄生寄存器移动,并且所述重载代码必须包括从寄生寄存器文件溢出区域到寄生寄存器文件的对应于目标寄存器组的区域中的移动。
可以按照以下方式编码动态情况:
由编译器标记溢出存储,从而使它到达寄生寄存器文件。该寄生寄存器文件的处理逻辑把该溢出存储转换成一个移动,该移动把寄生寄存器数据转移到溢出区域。
由编译器标记重载加载指令,从而使得寄生寄存器文件的处理逻辑将其转换成从溢出区域到寄生寄存器文件的对应于目标寄存器组的区域的移动(到达寄生寄存器文件的通常的加载被转换成赋值)。该重载加载的OR值被编译器赋予所溢出的目标寄存器编号,其随后被用作寄生寄存器移动操作中的源寄存器操作数。
这在下面的表III中表示并且还在图8中说明。
目标指令 | 寄生寄存器文件中的相应操作 |
st.spill treg,ADDR_spillpos. | mv treg+size,treg |
ld.reload treg[OR==spilledtreg],ADDR_spillpos. | mv treg,[OR]+size |
表III
图8说明用于“动态”情况的寄生寄存器文件50中的溢出和重载操作的例子。
由于所述跟踪模式是处理器状态,因此支持两种跟踪模式的编译器必须在可能情况下给重载代码加标签,或者引入到寄生寄存器文件的溢出区域或来自该溢出区域的移动。
指令调度器
指令调度器是这样一个阶段,在该阶段中,指令被放置在代码流中,从而机器的微体系结构被高效地利用,并且等待时间和硬件资源约束不会被代码破坏,当然也保留了程序的语义。
这可以导致指令被移动到顺序代码流中,并且对于VLIW系统来说,该阶段还意味着把指令并行化成VLIW字。
在该方案中,指令调度器保持指令上的原始寄存器标签。
链接器
链接器是这样一个阶段,在该阶段中,可重定位的地址被解析成物理地址。这里通常不涉及寄存器,但是如果有链接时间优化,则适用于编译器中的优化的相同规则也适用于所述链接时间优化。
如前所述,寄生寄存器的操作(赋值、空操作、移动)可以替换地被指向普通的事务存储器。于是反向分析被留给卸载踪迹数据之后的分析阶段(在SW中实施)或者被留给调试器。在此丢失对数据的压缩。于是用寄生寄存器文件的支持逻辑交换更大的数据集(操作事务)以及对寄生寄存器镜像的离线多通重建。所述踪迹必须大到足以容纳定义所有目标寄存器的动作,当存在寄生寄存器文件时所述定义将总是可以被直接访问。
在一般的高级别情况下跟踪分配了存储器的变量中的值
当跟踪变量的值时,如上所述的对寄生寄存器字的编码是不同的。取代保存原始寄存器编号的OR字段,所述OR字段现在表示某一上下文中的变量。所述编码是由翻译系统(编译器/链接器)进行的,从而在程序地址范围内的每个活变量具有唯一的编码号。该变量编码字段在下文中被称作变量编码(VE)。
所述编码必须作为来自翻译系统的输出被提供给调试器/踪迹系统。所述TMIA字段是解析所述变量编码的关键,因为该TMIA总是被包括在一个地址范围内,其对于与该TMIA相关联的VE总是具有唯一的变量身份。
编译器利用变量编码号给从变量加载寄存器的每个目标指令加标签。如在寄存器一致性情况中那样,这导致寄生寄存器文件或等效模块中的赋值。当在目标寄存器之间移动变量值时,如在寄存器一致性情况中那样,这导致寄生寄存器文件中的移动操作。
应当注意,在变量值跟踪情况中不需要寄生寄存器文件的溢出区域,因为保存变量值的寄存器总是被溢出到变量存储器位置。随后,编译器当然必须对把所述变量重载到目标寄存器文件中的指令加标签。
这种方法示出存在于寄存器中的变量的驻留状态和当前值。
上面描述的实施例仅仅是作为例子给出的,应当理解,本发明不限于此。保留在此公开并要求保护的基本原理的更多的修改、改变和改进都在本发明的范围内。
参考文献
[1]“Evicted Variables and the Interaction of Global RegisterAllocation and Symbolic Debugging”,Ali-Reza Adl Tabatabai,ThomasGross,Proceeding of the 20th ACM symposium on Principles ofProgramming Languages.
[2]JP 8221296
[3]美国专利6,185,732
[4]JP 2000181746
[5]美国专利6,094,729
[6]美国专利6,243,304
[7]“Computer Architecture,A Quantitative Approach”,John L.Hennessy,David A.Patterson,Morgan Kaufmann Publishers,chapter 3.4‘Data Hazards’.
Claims (21)
1.一种用于在计算机系统上执行被称作目标代码的源代码的翻译后的版本时支持跟踪原始源代码的数据值的方法,所述方法包括以下步骤:
-在程序代码翻译期间,利用所述源代码的原始数据值容器的相应地址信息给目标代码指令中的目标数据值容器的索引加标签;
-在执行目标代码时,存储与目标代码指令相关的信息连同所述源代码的原始数据值容器的加标签的地址信息作为跟踪信息,并且使用所述源代码的原始数据值容器的地址信息连同跟踪信息来提供原始源代码表示的数据值视图。
2.权利要求1所述的方法,其中,所述与目标代码指令相关的信息包括以下各项的至少其中之一:
-相应的目标指令地址信息;以及
-相应的指令操作数值,其允许在不参考目标数据值容器的情况下跟踪原始数据值容器的值。
3.权利要求1所述的方法,其中,所述存储步骤包括以下步骤:把所述与目标代码指令相关的信息连同所述原始源代码的相关数据值容器地址信息一起写入到寄生寄存器文件中。
4.权利要求3所述的方法,还包括以下步骤:把所述原始源代码的数据值容器地址信息从所述寄生寄存器文件中的第一寄生寄存器移动到第二寄生寄存器。
5.权利要求3所述的方法,其中,在目标代码指令中表示的目标数据值容器的地址信息对所述寄生寄存器文件进行索引。
6.权利要求3所述的方法,还包括以下步骤:基于多个管道寄存器来支持寄生寄存器文件操作的顺序连贯性,所述多个管道寄存器用于处理读取等待时间以便连贯地反映原始数据值容器在目标系统中的驻留状态。
7.权利要求3所述的方法,其中,对所述寄生寄存器文件的操作包括赋值、移动、存储和空操作,并且所述方法还包括用于选择性地转换寄生寄存器文件操作的操作流处理。
8.权利要求1所述的方法,其中,所述目标代码指令包括至少一个表示所述源代码中的原始数据值容器的赋值的目标代码指令。
9.权利要求1所述的方法,其中,所述原始源代码适合于原始计算机系统,所述目标代码适合于与该原始计算机系统不同的目标计算机系统。
10.权利要求1所述的方法,其中,所述跟踪信息存储在对应于一般的高级编程语言中分配了存储器的变量的数据值容器中。
11.一种用于支持原始程序代码与被称作目标代码的该原始程序代码的翻译后的版本之间的数据值一致性的计算机系统,所述系统包括:
-用于执行目标代码的装置,目标代码指令被加上标签以便提供目标代码指令中的目标数据值容器和原始程序代码的原始数据值容器的相应地址信息之间的索引;
-用于在执行该目标代码时存储与表示所述原始程序代码中的数据值容器的赋值的至少一个目标代码指令相关的信息连同所述原始数据值容器的加标签的地址信息作为跟踪信息,并且使用所述原始程序代码的原始数据值容器的地址信息连同跟踪信息来提供所述原始程序代码的数据值视图的装置。
12.权利要求11所述的系统,还包括:用于在程序代码翻译期间把对目标代码指令中的目标数据值容器的索引与所述原始程序代码的原始数据值容器的相应地址信息相关联的装置。
13.权利要求12所述的系统,其中,所述与至少一个目标代码指令相关的信息包括以下各项的至少其中之一:
-相应的目标代码指令地址信息;以及
-相应的指令操作数值,其允许在不参考目标数据值容器的情况下跟踪原始数据值容器的值。
14.权利要求12所述的系统,其中,所述用于存储的装置包括:用于把与所述至少一个目标代码指令相关的所述信息连同所述原始数据值容器的相关地址信息一起写入到寄生寄存器文件中的装置。
15.权利要求14所述的系统,还包括:用于把所述原始程序代码的数据值容器地址信息从所述寄生寄存器文件中的第一寄生寄存器条目移动到第二寄生寄存器条目的装置。
16.权利要求14所述的系统,其中,在目标代码指令中表示的目标数据值容器的地址信息对所述寄生寄存器文件进行索引。
17.权利要求14所述的系统,还包括:用于基于多个管道寄存器来支持寄生寄存器文件操作的顺序连贯性的装置,所述多个管道寄存器用于处理读取等待时间。
18.权利要求14所述的系统,其中,对所述寄生寄存器文件的操作包括赋值、移动、存储和空操作,并且所述系统还包括用于选择性地转换寄生寄存器文件操作的操作流处理逻辑。
19.权利要求11所述的系统,还包括:用于基于所存储的信息对原始程序代码执行调试和/或踪迹分析的装置。
20.权利要求11所述的系统,其中,所述原始程序代码适合于原始计算机系统,所述目标代码适合于与该原始计算机系统不同的目标计算机系统。
21.权利要求11所述的系统,其中,所述跟踪信息存储在对应于一般的高级编程语言中被分配给变量的存储器位置的数据值容器中。
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
PCT/SE2005/000534 WO2006110069A1 (en) | 2005-04-13 | 2005-04-13 | Data value coherence in computer systems |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101198930A CN101198930A (zh) | 2008-06-11 |
CN101198930B true CN101198930B (zh) | 2011-07-27 |
Family
ID=37087276
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2005800501216A Expired - Fee Related CN101198930B (zh) | 2005-04-13 | 2005-04-13 | 用于支持计算机系统中的数据值一致性的系统和方法 |
Country Status (6)
Country | Link |
---|---|
US (1) | US8095915B2 (zh) |
EP (1) | EP1869551A1 (zh) |
JP (1) | JP2008536236A (zh) |
CN (1) | CN101198930B (zh) |
CA (1) | CA2604573A1 (zh) |
WO (1) | WO2006110069A1 (zh) |
Families Citing this family (20)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9009692B2 (en) * | 2009-12-26 | 2015-04-14 | Oracle America, Inc. | Minimizing register spills by using register moves |
JP5303531B2 (ja) * | 2010-09-28 | 2013-10-02 | 株式会社日立製作所 | 組込システムの保守支援装置 |
CN104360949B (zh) * | 2014-11-29 | 2017-05-17 | 中国航空工业集团公司第六三一研究所 | 一种符合do‑178b/c a级软件目标码覆盖分析方法 |
US9733911B2 (en) * | 2015-11-11 | 2017-08-15 | National Instruments Corporation | Value transfer between program variables using dynamic memory resource mapping |
CN105843605B (zh) * | 2016-03-17 | 2019-03-08 | 中国银行股份有限公司 | 一种数据映射方法及装置 |
US10572265B2 (en) | 2017-04-18 | 2020-02-25 | International Business Machines Corporation | Selecting register restoration or register reloading |
US10963261B2 (en) | 2017-04-18 | 2021-03-30 | International Business Machines Corporation | Sharing snapshots across save requests |
US11010192B2 (en) | 2017-04-18 | 2021-05-18 | International Business Machines Corporation | Register restoration using recovery buffers |
US10545766B2 (en) | 2017-04-18 | 2020-01-28 | International Business Machines Corporation | Register restoration using transactional memory register snapshots |
US10838733B2 (en) | 2017-04-18 | 2020-11-17 | International Business Machines Corporation | Register context restoration based on rename register recovery |
US10564977B2 (en) | 2017-04-18 | 2020-02-18 | International Business Machines Corporation | Selective register allocation |
US10782979B2 (en) | 2017-04-18 | 2020-09-22 | International Business Machines Corporation | Restoring saved architected registers and suppressing verification of registers to be restored |
US10552164B2 (en) | 2017-04-18 | 2020-02-04 | International Business Machines Corporation | Sharing snapshots between restoration and recovery |
US10540184B2 (en) | 2017-04-18 | 2020-01-21 | International Business Machines Corporation | Coalescing store instructions for restoration |
US10489382B2 (en) | 2017-04-18 | 2019-11-26 | International Business Machines Corporation | Register restoration invalidation based on a context switch |
US10649785B2 (en) | 2017-04-18 | 2020-05-12 | International Business Machines Corporation | Tracking changes to memory via check and recovery |
US10740108B2 (en) | 2017-04-18 | 2020-08-11 | International Business Machines Corporation | Management of store queue based on restoration operation |
US10545740B2 (en) * | 2017-10-25 | 2020-01-28 | Saudi Arabian Oil Company | Distributed agent to collect input and output data along with source code for scientific kernels of single-process and distributed systems |
JP6890557B2 (ja) * | 2018-01-17 | 2021-06-18 | 株式会社日立製作所 | 分析モデル作成システム、プログラミング装置および分析モデル作成方法 |
CN110737501A (zh) * | 2018-07-18 | 2020-01-31 | 中标软件有限公司 | Docker容器中检查点和恢复点的功能实现方法及系统 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5713010A (en) * | 1995-02-10 | 1998-01-27 | Hewlett-Packard Company | Source line tracking in optimized code |
CN1228558A (zh) * | 1998-02-16 | 1999-09-15 | 日本电气株式会社 | 程序变换方法和程序变换系统 |
US6094729A (en) * | 1997-04-08 | 2000-07-25 | Advanced Micro Devices, Inc. | Debug interface including a compact trace record storage |
US6243304B1 (en) * | 1996-03-11 | 2001-06-05 | Altera Corporation | Sample and load scheme for observability internal nodes in a PLD |
US6658651B2 (en) * | 1998-03-02 | 2003-12-02 | Metrowerks Corporation | Method and apparatus for analyzing software in a language-independent manner |
Family Cites Families (36)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH0282634A (ja) * | 1988-09-20 | 1990-03-23 | Mitsubishi Electric Corp | テープキャリア |
US5768575A (en) * | 1989-02-24 | 1998-06-16 | Advanced Micro Devices, Inc. | Semi-Autonomous RISC pipelines for overlapped execution of RISC-like instructions within the multiple superscalar execution units of a processor having distributed pipeline control for sepculative and out-of-order execution of complex instructions |
US5781753A (en) * | 1989-02-24 | 1998-07-14 | Advanced Micro Devices, Inc. | Semi-autonomous RISC pipelines for overlapped execution of RISC-like instructions within the multiple superscalar execution units of a processor having distributed pipeline control for speculative and out-of-order execution of complex instructions |
JP3062266B2 (ja) * | 1991-03-20 | 2000-07-10 | 富士通株式会社 | 支援装置 |
GB2272085A (en) * | 1992-10-30 | 1994-05-04 | Tao Systems Ltd | Data processing system and operating system. |
JP2728002B2 (ja) | 1995-02-15 | 1998-03-18 | 日本電気株式会社 | 組み込みソフトウェアデバッグ支援装置 |
US5581729A (en) * | 1995-03-31 | 1996-12-03 | Sun Microsystems, Inc. | Parallelized coherent read and writeback transaction processing system for use in a packet switched cache coherent multiprocessor system |
US5832297A (en) * | 1995-04-12 | 1998-11-03 | Advanced Micro Devices, Inc. | Superscalar microprocessor load/store unit employing a unified buffer and separate pointers for load and store operations |
US5881288A (en) * | 1995-09-29 | 1999-03-09 | Matsushita Electric Industrial Co., Ltd. | Debugging information generation system |
JPH0997182A (ja) * | 1995-09-29 | 1997-04-08 | Matsushita Electric Ind Co Ltd | プログラム変換装置およびデバッグ装置 |
US6185732B1 (en) * | 1997-04-08 | 2001-02-06 | Advanced Micro Devices, Inc. | Software debug port for a microprocessor |
JPH10289110A (ja) * | 1997-04-14 | 1998-10-27 | Matsushita Electric Ind Co Ltd | プログラム変換装置とデバッグ装置 |
US5999734A (en) * | 1997-10-21 | 1999-12-07 | Ftl Systems, Inc. | Compiler-oriented apparatus for parallel compilation, simulation and execution of computer programs and hardware models |
US6397242B1 (en) * | 1998-05-15 | 2002-05-28 | Vmware, Inc. | Virtualization system including a virtual machine monitor for a computer with a segmented architecture |
US6704925B1 (en) * | 1998-09-10 | 2004-03-09 | Vmware, Inc. | Dynamic binary translator with a system and method for updating and maintaining coherency of a translation cache |
US7516453B1 (en) * | 1998-10-26 | 2009-04-07 | Vmware, Inc. | Binary translator with precise exception synchronization mechanism |
JP2000181746A (ja) | 1998-12-18 | 2000-06-30 | Toshiba Corp | デバッグサポート付プロセッサ、及びデバッグ機能実行制御方法 |
JP2000227861A (ja) * | 1999-02-05 | 2000-08-15 | Nec Ic Microcomput Syst Ltd | デバッグ方法及びデバッグ装置 |
JP2000322285A (ja) * | 1999-05-14 | 2000-11-24 | Nec Corp | プリコンパイルされる言語で記述されたプログラムのデバッグ方法及びそのシステム並びに情報記録媒体 |
US6598128B1 (en) * | 1999-10-01 | 2003-07-22 | Hitachi, Ltd. | Microprocessor having improved memory management unit and cache memory |
US6412043B1 (en) * | 1999-10-01 | 2002-06-25 | Hitachi, Ltd. | Microprocessor having improved memory management unit and cache memory |
KR100362193B1 (ko) * | 1999-11-26 | 2002-11-23 | 주식회사 하이닉스반도체 | 디디알 동기식 메모리 장치의 데이터 출력 장치 |
US20030018694A1 (en) * | 2000-09-01 | 2003-01-23 | Shuang Chen | System, method, uses, products, program products, and business methods for distributed internet and distributed network services over multi-tiered networks |
JP2002108649A (ja) * | 2000-09-29 | 2002-04-12 | Toshiba Corp | トレース解析を支援するためのプログラムを記録した記録媒体及びプログラム製品 |
US20020156977A1 (en) * | 2001-04-23 | 2002-10-24 | Derrick John E. | Virtual caching of regenerable data |
US6754782B2 (en) * | 2001-06-21 | 2004-06-22 | International Business Machines Corporation | Decentralized global coherency management in a multi-node computer system |
US7418536B2 (en) * | 2001-07-30 | 2008-08-26 | Cisco Technology, Inc. | Processor having systolic array pipeline for processing data packets |
US7051191B2 (en) * | 2001-12-26 | 2006-05-23 | Intel Corporation | Resource management using multiply pendent registers |
AU2003286131A1 (en) * | 2002-08-07 | 2004-03-19 | Pact Xpp Technologies Ag | Method and device for processing data |
US7121639B2 (en) * | 2002-12-02 | 2006-10-17 | Silverbrook Research Pty Ltd | Data rate equalisation to account for relatively different printhead widths |
DE10335888B4 (de) * | 2003-08-06 | 2008-03-13 | Man Roland Druckmaschinen Ag | Verfahren und Vorrichtung zum Regeln des Gesamt-Schnittregisterfehlers einer Rollenrotationsdruckmaschine |
US7472184B2 (en) * | 2003-09-19 | 2008-12-30 | International Business Machines Corporation | Framework for restricting resources consumed by ghost agents |
US7584329B2 (en) * | 2005-02-10 | 2009-09-01 | International Business Machines Corporation | Data processing system and method for efficient communication utilizing an Ig coherency state |
US7293158B2 (en) * | 2005-03-02 | 2007-11-06 | International Business Machines Corporation | Systems and methods for implementing counters in a network processor with cost effective memory |
US8301868B2 (en) * | 2005-09-23 | 2012-10-30 | Intel Corporation | System to profile and optimize user software in a managed run-time environment |
JP4572169B2 (ja) * | 2006-01-26 | 2010-10-27 | エヌイーシーコンピュータテクノ株式会社 | マルチプロセッサシステム及びその動作方法 |
-
2005
- 2005-04-13 EP EP05736464A patent/EP1869551A1/en not_active Withdrawn
- 2005-04-13 US US11/911,265 patent/US8095915B2/en not_active Expired - Fee Related
- 2005-04-13 JP JP2008506398A patent/JP2008536236A/ja active Pending
- 2005-04-13 WO PCT/SE2005/000534 patent/WO2006110069A1/en active Application Filing
- 2005-04-13 CA CA002604573A patent/CA2604573A1/en not_active Abandoned
- 2005-04-13 CN CN2005800501216A patent/CN101198930B/zh not_active Expired - Fee Related
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5713010A (en) * | 1995-02-10 | 1998-01-27 | Hewlett-Packard Company | Source line tracking in optimized code |
US6243304B1 (en) * | 1996-03-11 | 2001-06-05 | Altera Corporation | Sample and load scheme for observability internal nodes in a PLD |
US6094729A (en) * | 1997-04-08 | 2000-07-25 | Advanced Micro Devices, Inc. | Debug interface including a compact trace record storage |
CN1228558A (zh) * | 1998-02-16 | 1999-09-15 | 日本电气株式会社 | 程序变换方法和程序变换系统 |
US6658651B2 (en) * | 1998-03-02 | 2003-12-02 | Metrowerks Corporation | Method and apparatus for analyzing software in a language-independent manner |
Also Published As
Publication number | Publication date |
---|---|
JP2008536236A (ja) | 2008-09-04 |
CA2604573A1 (en) | 2006-10-19 |
EP1869551A1 (en) | 2007-12-26 |
CN101198930A (zh) | 2008-06-11 |
US20080178157A1 (en) | 2008-07-24 |
US8095915B2 (en) | 2012-01-10 |
WO2006110069A1 (en) | 2006-10-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101198930B (zh) | 用于支持计算机系统中的数据值一致性的系统和方法 | |
Papadopoulos | Implementation of a general purpose dataflow multiprocessor | |
TWI483182B (zh) | 一種用於減少一電腦程式中所包括的組合語言指令之數目的方法與系統 | |
CN103534686B (zh) | 异构核心的自动内核迁移 | |
KR101702651B1 (ko) | 하드웨어 포인터를 이용한 simd 코어 내 분기 해법 | |
CN103383640B (zh) | 提高向量分解循环的性能 | |
CN101231585A (zh) | 用于并行线程计算的虚拟结构和指令集 | |
CN105074657B (zh) | 并行管道中的发散分支的硬件和软件解决方案 | |
JP2000112758A (ja) | 投機的実行中に発生する例外を遅延させるシステム及び方法 | |
KR100368166B1 (ko) | 컴퓨터 처리 시스템에서 스택 레퍼런스를 변경하는 방법 | |
US10216499B2 (en) | Method, program, and system for code optimization | |
US8539458B2 (en) | Transforming addressing alignment during code generation | |
US20170269931A1 (en) | Method and Computing System for Handling Instruction Execution Using Affine Register File on Graphic Processing Unit | |
US20050273776A1 (en) | Assembler supporting pseudo registers to resolve return address ambiguity | |
US8091079B2 (en) | Implementing shadow versioning to improve data dependence analysis for instruction scheduling | |
Gschwind et al. | On Achieving Precise Exceptions Semantics in Dynamic Optimization | |
CN102360306A (zh) | 高级语言代码中循环数据流图提取优化信息处理方法 | |
CN104239001A (zh) | 至少一个处理流水线中的操作数生成 | |
Postiff | Compiler and Microarchitecture Mechanisms for Exploiting Registers to Improve Memory Performance | |
Spertus | Dataflow computation for the J-Machine | |
TW490635B (en) | Method and device executing orders with symbolic reference | |
Tu | Toward a Hardware Implementation of the Contour Model | |
Yeh | Compile time instruction scheduling for enhancing pipeline processing performance | |
AR et al. | A Translator from CRL2 representation of PowerPC Assembly to ALF | |
Kim | Compiler techniques for speculative execution |
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 | ||
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: 20110727 Termination date: 20170413 |