融合来自不同编译器阶段的调试信息的制作方法

文档序号:6442186阅读:207来源:国知局

专利名称::融合来自不同编译器阶段的调试信息的制作方法
技术领域
:本发明涉及计算机技术,尤其涉及计算机调试技术。相关串请的交叉引用不适用。
背景技术
:I.背景和相关技术计算机系统和相关技术影响社会的许多方面。的确,计算机系统处理信息的能力已转变了人们生活和工作的方式。计算机系统现在通常执行在计算机系统出现以前手动执行的许多任务(例如,文字处理、日程安排和会计等)。最近,计算机系统彼此耦合并耦合到其他电子设备以形成计算机系统和其他电子设备可以在其上传输电子数据的有线和无线计算机网络。因此,许多计算任务的执行跨多个不同的计算机系统和/或多个不同的计算环境分布。为了开发用于执行计算任务的软件应用程序,开发者通常编写表达软件应用程序的所需功能的源代码(例如,使用C++、VisualBasic等)。然后可将源代码编译为可执行代码(或者另选地在执行时解释)。在源代码编译过程中,编译器将源代码指令转换为在计算机系统上可直接执行的机器指令(例如,x86指令)。在计算机系统上运行可执行代码以实现所需功能。许多编译器还输出调试信息,其有助于开发者定位和修正源程序中导致偏离所需功能的缺陷。在一些实施例中,使用单阶段编译器将源代码编译为可执行代码。例如,C++编译器可直接将C++源代码编译为可在个人计算机的处理器上运行的可执行代码。在其他实施例中,使用多阶段编译器将源代码编译为可执行代码。多阶段编译器可包括多个不同的编译阶段。每一编译器阶段可执行某个翻译、转换等以朝着将接收到的源代码编译为机器指令(例如,定向至特定的处理器)的方向前进。在更具体的环境中,开发DataParallelC++(数据并行C++,“DPC++”)源代码来与中央处理单元(“CPU”)一起并行地使用图形处理单元(“GPU”)以实现所需功能。即,某些源代码是以CPU为目标来编写的,其他源代码是以GPU为目标来编写的。对于以GPU为目标的源代码,使用多阶段编译器来将DataParallelC++(“DPC++)源代码编译为高级着色语言(“HLSL”)字节码(其可在GPU上执行)。第一编译阶段将DPC++源代码翻译为HLSL源代码。第二编译阶段然后将HLSL源代码转换为用于在GPU上执行的HLSL字节码。使用多阶段编译器允许DPC++开发者开发GPU的代码而并不必具备HLSL知识。在使用多阶段编译器时,每一编译阶段通常输出在采用输入格式的指令和符号与采用输出格式的指令和符号之间映射的调试信息。例如,第一编译阶段可输出在源代码指令和符号与中间代码(例如,第二源代码、中间语言代码等)指令和符号之间映射的调试信息。第二编译阶段可输出在中间代码指令和符合与可执行代码指令和符号之间映射的调试信息。返回之前的示例,第一编译阶段可输出在DPC++源代码指令和符号与HLSL源代码指令和符号之间映射的调试信息。第二编译阶段可输出在HLSL源代码指令和符号与HLSL字节码指令和符号之间映射的调试信息。由此,为了调试使用多阶段编译器来编译的应用程序,开发者必须使用来自每一编译阶段的一组调试信息来将源代码指令或符号映射至可执行代码指令或符号。处理多组调试信息是资源密集的,并且资源使用随编译阶段数量的增加而增加。
发明内容本发明涉及用于融合来自不同编译器阶段的调试信息的各方法、系统和计算机程序产品。第一编译阶段访问第一代码。第一代码包括采用第一格式的第一指令和第一符号。将第一代码翻译为第二代码。翻译第一代码包括将第一指令和第一符号转换为对应的采用第二格式的第二指令和第二符号。第二格式与第一格式不同。翻译第一代码还包括生成第一调试信息。第一调试信息将第一指令中的每一指令映射至第二指令中对应的指令,并将第一符号中的每一符号映射至第二符号中对应的符号。第二编译阶段访问第二代码。将第二代码翻译为第三代码。翻译第二代码包括将第二指令和第二符号转换为对应的采用第三格式的第三指令和第三符号。第三格式不同于第一格式和第二格式。翻译第二代码还包括生成第二调试信息。第二调试信息将第二指令中的每一指令映射至第三指令中对应的指令,并将第二符号中的每一符号映射至第三符号中对应的符号。将第一调试信息和第二调试信息融合为合并的第三调试信息。合并的第三调试信息将第一指令直接地映射至第三指令,并将第一符号直接地映射至第三符号。对于第一指令和第一符号中的每一个,从第一调试信息内标识对应于第一指令或第一符号的第二指令或第二符号。从第二调试信息内标识对应于所标识的第二指令或第二符号的第三指令或第三符号。将第一指令或第一符号直接地映射至所标识的对应的第三指令或第三符号。将第一指令或第一符号至所标识的对应的第三指令或第三符号的映射存储在合并的第三调试信息中。提供本
发明内容以便以简化的形式介绍将在以下的详细描述中进一步描述的一些概念。本
发明内容并非旨在标识所要求保护的主题的关键特征或必要特征,也不旨在用于帮助确定所要求保护的主题的范围。本发明的附加特征和优点将在以下描述中叙述,且其一部分根据本描述将是显而易见的,或可通过对本发明的实践来获知。本发明的特征和优点可通过在所附权利要求书中特别指出的工具和组合来实现和获得。本发明的这些和其他特征将通过以下描述和所附权利要求书变得更加显而易见,或可通过对下文中所述的本发明的实践来领会。为了描述可获得本发明的上述和其他优点和特征的方式,将通过参考附图中示出的本发明的具体实施例来呈现以上简要描述的本发明的更具体描述。可以理解,这些附图仅描述本发明的典型实施例,从而不被认为是对其范围的限制,本发明将通过使用附图用附加特征和细节来描述和说明,在附图中图I示出了便于融合来自不同编译器阶段的调试信息的示例计算机体系结构。图2示出了便于融合来自不同编译器阶段的调试信息的另一示例计算机体系结构。图3示出了用于融合来自不同编译器阶段的调试信息的示例方法的流程图。具体实施例方式本发明涉及用于融合来自不同编译器阶段的调试信息的各方法、系统和计算机程序产品。第一编译阶段访问第一代码。第一代码包括采用第一格式的第一指令和第一符号。将第一代码翻译为第二代码。翻译第一代码包括将第一指令和第一符号转换为对应的采用第二格式的第二指令和第二符号。第二格式与第一格式不同。翻译第一代码还包括生成第一调试信息。第一调试信息将第一指令中的每一指令映射至第二指令中对应的指令,并将第一符号中的每一符号映射至第二符号中对应的符号。第二编译阶段访问第二代码。将第二代码翻译为第三代码。翻译第二代码包括将第二指令和第二符号转换为对应的采用第三格式的第三指令和第三符号。第三格式不同于第一格式和第二格式。翻译第二代码还包括生成第二调试信息。第二调试信息将第二指令中的每一指令映射至第三指令中对应的指令,并将第二符号中的每一符号映射至第三符号中对应的符号。将第一调试信息和第二调试信息融合为合并的第三调试信息。合并的第三调试信息将第一指令直接地映射至第三指令,并将第一符号直接地映射至第三符号。对于第一指令和第一符号中的每一个,从第一调试信息内标识对应于第一指令或第一符号的第二指令或第二符号。从第二调试信息内标识对应于所标识的第二指令或第二符号的第三指令或第三符号。将第一指令或第一符号直接地映射至所标识的对应的第三指令或第三符号。将第一指令或第一符号至所标识的对应的第三指令或第三符号的映射存储在合并的第三调试信息中。本发明的各实施例可包括或利用专用或通用计算机,该专用或通用计算机包括诸如例如一个或多个处理器和系统存储器等计算机硬件,如以下更详细讨论的。本发明范围内的各实施例还包括用于携带或存储计算机可执行指令和/或数据结构的物理介质和其他计算机可读介质。这些计算机可读介质可以是通用或专用计算机系统能够访问的任何可用介质。存储计算机可执行指令的计算机可读介质是计算机存储介质(设备)。携带计算机可执行指令的计算机可读介质是传输介质。由此,作为示例而非限制,本发明的各实施例可包括至少两种完全不同类型的计算机可读介质计算机存储介质(设备)和传输介质。计算机存储介质(设备)包括RAM、ROM、EEPROM、CD-ROM、DVD或其他光盘存储、磁盘存储或其他磁存储设备、闪存驱动器、拇指型驱动器或可用于存储计算机可执行指令或数据结构形式的所需程序代码装置的且可由通用或专用计算机访问的任何其他介质。“网络”被定义为允许在计算机系统和/或模块和/或其他电子设备之间传输电子数据的一个或多个数据链路。当信息通过网络或另一个通信连接(硬连线、无线、或者硬连线或无线的组合)传输或提供给计算机时,该计算机将该连接适当地视为传输介质。传输介质可包括可用于携带计算机可执行指令或数据结构形式的所需程序代码装置且可由通用或专用计算机访问的网络和/或数据链路。上述的组合也应被包括在计算机可读介质的范围内。此外,在到达各种计算机系统组件之后,计算机可执行指令或数据结构形式的程序代码装置可从传输介质自动传输到计算机存储介质(设备)(或反之亦然)。例如,通过网络或数据链接接收到的计算机可执行指令或数据结构可被缓存在网络接口模块(例如,“NIC”)内的RAM中,然后最终被传输到计算机系统RAM和/或计算机系统处的较不易失性的计算机存储介质(设备)。因而,应当理解,计算机存储介质(设备)可被包括在还利用(甚至主要利用)传输介质的计算机系统组件中。计算机可执行指令例如包括,当在处理器处执行时使通用计算机、专用计算机、或专用处理设备执行某一功能或某组功能的指令和数据。计算机可执行指令可以是例如二进制代码、诸如汇编语言之类的中间格式指令、或甚至源代码。尽管用结构特征和/或方法动作专用的语言描述了本主题,但可以理解,所附权利要求书中定义的主题不必限于上述特征或动作。相反,上述特征和动作是作为实现权利要求的示例形式而公开的。本领域的技术人员将理解,本发明可以在具有许多类型的计算机系统配置的网络计算环境中实践,这些计算机系统配置包括个人计算机、台式计算机、膝上型计算机、消息处理器、手持式设备、多处理器系统、基于微处理器的或可编程消费电子设备、网络PC、小型计算机、大型计算机、移动电话、PDA、寻呼机、路由器、交换机等等。本发明也可在其中通过网络链接(或者通过硬连线数据链路、无线数据链路,或者通过硬连线和无线数据链路的组合)的本地和远程计算机系统两者都执行任务的分布式系统环境中实施。在分布式系统环境中,程序模块可以位于本地和远程存储器存储设备二者中。在一些实施例中,开发源代码来与中央处理单元(“CPU”)一起并行地使用图形处理单元(“GPU”)以实现需要的功能。即,某些源代码是以CPU为目标来编写的,而其他源代码是以GPU为目标来编写的。对于以GPU为目标的源代码,可使用多阶段编译器来将源代码编译为在GPU上可执行的代码。一般地,本发明的各实施例在代码生成过程中将来自多个不同编译阶段的调试信息融合为单个的调试信息集。该单个调试信息集直接在输入至第一编译阶段的指令和符号(例如,源代码)与从最后的编译阶段输出的指令和符号(例如,机器码)之间映射。首先参考图2,图2示出了便于融合来自不同编译器阶段的调试信息的示例计算机体系结构200。计算机体系结构200包括多阶段编译器201和调试信息映射器206。多阶段编译器201包括多个编译器阶段,包括编译器阶段202、203、204等。省略号205表示多阶段编译器201可包括一个或多个附加的编译器阶段。所描绘的组件中的每一个可通过诸如例如局域网(“LAN”)、广域网(“WAN”)和甚至因特网等网络(或作为网络的一部分)彼此连接。因此,所描绘的组件中的每一个以及任何其他连接的计算机系统及其组件都可以创建消息相关数据并通过网络交换与消息相关数据(例如,网际协议(“IP”)数据报和利用IP数据报的其他更高层协议,诸如传输控制协议(“TCP”)、超文本传输协议(“HTTP”)、简单邮件传输协议(“SMTP”)等)。可提供(基本上任何编程语言的)源代码211作为多阶段编译器201的输入。编译器阶段202可接收源代码211。编译器阶段202可执行以下各项中的一个或多个对源代码211进行翻译、转换、编译等,以生成中间代码212。作为翻译、转换、编译等的一部分,编译阶段202还可生成调试信息221。调试信息221在源代码211中的指令和符号与中间代码212中的指令和符号之间映射。编译器阶段203可接收中间代码212。编译器阶段203可执行以下各项中的一个或多个对中间代码212进行翻译、转换、编译等,以生成中间代码212。作为翻译、转换、编译等的一部分,编译阶段203还可生成调试信息222。调试信息222在中间代码213中的指令和符号与中间代码214中的指令和符号之间映射。编译器阶段204可接收中间代码213。编译器阶段204可执行以下各项中的一个或多个对中间代码213进行翻译、转换、编译等,以生成进一步的代码(例如,可执行代码214或传递至下一编译器阶段的进一步的中间代码)。作为翻译、转换、编译等的一部分,编译阶段204还可生成调试信息223。调试信息223在中间代码213中的指令和符号与进一步的代码中的指令和符号之间映射。当进一步的代码是可执行代码214时,调试信息223在中间代码213中的指令和符号与可执行代码214中的指令和符号之间映射。在多阶段编译器201中包括附加的编译器阶段时,这些附加的编译器阶段还可生成诸如例如调试信息224之类的调试信息。调试信息映射器206可接收在多阶段编译器201的各编译阶段生成的调试信息。例如,调试信息映射器206可接收调试信息221、222、223、224(在存在时)等。调试信息映射器206可将221、222、223、224(在存在时)等融合为合并的调试信息226。合并的调试信息226直接地在源代码211指令和可执行代码214指令之间映射,并直接地在源代码211符号和可执行代码214符号之间映射。由此,在使用合并的调试信息226时,可更高效地对源代码211进行调试。现在转向图1,图I示出了便于融合来自不同编译器阶段的调试信息的示例计算机体系结构100。如所描绘的,计算机体系结构100包括多阶段编译器101和调试信息映射器106。多阶段编译器101还包括编译器阶段102和编译器阶段103。一般而言,多阶段编译器101可接收输入源代码并将该输入源代码编译为可执行代码。在编译期间,编译器阶段102和103中的每一个可生成调试信息。图3示出了用于融合来自不同编译器阶段的调试信息的示例方法300的流程图。方法300将参考计算机体系结构100的组件和数据来描述。在第一编译阶段,方法300包括访问第一代码的动作,第一代码包括采用第一格式的第一指令和第一符号(动作301)。例如,编译器阶段102可访问源代码111。源代码111可包括采用第一格式(例如,DataParallelC++(“DPC++”))的第一指令和第一符号。方法300包括将第一代码翻译为第二代码的动作(动作302)。例如,编译器阶段102可将源代码111翻译为中间代码112。动作302包括将第一指令和第一符号转换为对应的采用第二格式的第二指令和第二符号的动作,第二格式不同于第一格式(动作303)。例如,编译器阶段102可将源代码111中的指令和符号转换为中间代码112中对应的指令和符号。中间代码112(例如,高级着色语言(“HLSL”)源代码)的格式可不同于源代码111(例如,DPC++)的格式。动作302包括生成第一调试信息的动作,第一调试信息将第一指令中的每一指令映射至第二指令中的对应指令,并将第一符号中的每一符号映射至第二符号中的对应符号(动作304)。例如,编译器阶段102可生成调试信息121。调试信息121将源代码111中的每一指令映射至中间代码112中的对应指令。例如,指令映射131将源代码111的第7行映射至中间代码112的第12行。调试信息121还将源代码111中的每一符号映射至中间代码112中的对应符号。例如,符号映射132将源代码111的符号X映射至中间代码112的符号“var_5”。在第二编译阶段,方法300包括访问第二代码的动作(动作305)。例如,编译器阶段103可访问中间代码112(例如,HLSL源代码)。方法300包括将第二代码翻译为第三代码的动作(动作306)。例如,编译器阶段103可将中间代码112翻译为可执行代码113。动作306包括将第二指令和第二符号转换为对应的采用第三格式的第三指令和第三符号的动作,第三格式不同于第一格式和第二格式(动作307)。例如,编译器阶段103可将中间代码112中的指令和符号转换为可执行代码113中对应的指令和符号。可执行代码113(例如,HLSL字节码)的格式可不同于源代码111(例如,DPC++)和中间代码112(例如,HLSL源代码)的格式。动作306包括生成第二调试信息的动作,第二调试信息将第二指令中的每一指令映射至第三指令中的对应指令,并将第二符号中的每一符号映射至第三符号中的对应符号(动作308)。例如,编译器阶段103可生成合并的调试信息123。合并的调试信息123将中间代码112中的每一指令映射至可执行代码113中的对应指令。例如,指令映射133将中间代码112的第12行映射至可执行代码117的指令id7。合并的调试信息123还将中间代码112中的每一符号映射至可执行代码113中对应的符号。例如,符号映射134将中间代码112的符号var_5映射至可执行代码113的寄存器@r3。方法300包括将第一调试信息和第二调试信息融合为第三调试信息的动作,第三调试信息将第一指令直接地映射至第三指令并将第一符号直接地映射至第三符号(动作309)。例如,调试映射器106可将调试信息121和调试信息122融合为合并的调试信息123。合并的调试信息123直接地在源代码111中的指令与可执行代码113中的指令之间映射。合并的调试信息123还直接地在源代码111中的符号与可执行代码113中的符号之间映射。对于第一指令和第一符号中的每一个,动作309包括从第一调试信息内标识对应于第一指令或第一符号的第二指令或第二符号的动作(动作310)。例如,调试映射器106可标识中间代码112的第12行对应于源代码111的第7行。类似地,调试映射器106可标识中间代码112的符号var_5对应于源代码111的符号X。对于第一指令和第一符号中的每一个,动作309包括从第二调试信息内标识对应于所标识的第二指令或第二符号的第三指令或第三符号的动作(动作311)。例如,调试映射器106可标识可执行代码113的指令id7对应于中间代码112的第12行。类似地,调试映射器106可标识可执行代码133的寄存器@r3对应于中间代码112的符号var_5。对于第一指令和第一符号中的每一个,动作309包括将第一指令或第一符号直接地映射至所标识的对应的第三指令和第三符号的动作(动作312)。例如,调试映射器106可制定指令映射136以在源代码111的第7行与可执行代码113的指令id7之间直接地映射。类似地,调试映射器可制定符号映射137以在源代码111的符号X与可执行代码113的寄存器@r3之间直接地映射。对于第一指令和第一符号中的每一个,动作309包括将第一指令或第一符号至所标识的对应的第三指令和第三符号的映射存储在第三调试信息中的动作(动作313)。例如,调试映射器106可将指令映射136和符号映射137存储在合并的调试信息123中。然后可在调试模块(未示出)处使用合并的调试信息123以辅助调试源代码111。本发明的一些实施例更具体地涉及将DPC++代码编译为HLSL字节码以供在图形处理单元(“GPU”)处执行。第一编译阶段生成对应于每一DPC++foralI调用点的展平HLSL源级计算着色器。第二编译阶段调用HLSL编译器以生成对应于所生成的HLSL源级计算着色器的HLSL字节码。之后将forall调用点处的每一内核调用的生成的字节码存储在编译器生成的PE(portableexecutable,可移植的可执行体)可执行体的文本片段内。在每一编译阶段,生成一组符号映射。符号映射表不作为该编译阶段的一部分来执行的翻译。第一编译阶段定义了DPC++源符号和生成的HLSL源代码符号之间的映射。第二编译阶段定义了HLSL源代码符号与最终HLSL字节码中对应位置(字节码地址、寄存器)之间的映射。为了促进调试效率并减少存储器占用量,出于以下原因可将符号调试信息融合为提供DPC++源符号与最终HLSL字节码之间的直接映射的单个记录集。单个映射集使得编译器能够将中间HLSL至字节码符号的映射信息从HLSL字节码团块(其存储在PE可执行体中)剥离,由此降低了可执行体的存储器占用量。此外,通过启用源符号和位置与HLSL字节码地址和寄存器之间的直接映射(而非从DPC++源至HLSL源之后HLSL源至字节码映射或者反之亦然的两级映射),单个符号调试信息记录集既简化也加快了GPU调试器中的DPC++符号解析。例如,第一编译器阶段可用于将示例DPC++代码voidint—add—kernel(...){c=a+b;//第11行}翻译为该示例,即HLSL源代码voidhlsl_int_add_kernel(...){var_2=varl+var_0;Il第24行}随后,第二编译器阶段将该示例即HLSL源代码编译为示例HLSL字节码…ir2=irl+irO//指令索引5在编译器后端中生成HLSL源代码时,可将从代码元组和符号至HLSL源位置和符号名的映射存储在诸如例如程序数据库(TOB)记录之类的一些内部数据结构中。例如,第一编译器阶段可生成将DPC++源代码指令和符号映射至HLSL源代码指令和符号的第一内部数据结构。DPC++“第11行,,->HLSL“第24行”DPC++符号“a”->HLSL符号“var_0”DPC++符号“b”->HLSL符号“var_I”DPC++符号“c”->HLSL符号“var_2”随后,第二编译器阶段可生成将HLSL源代码指令和符号映射至HLSL字节码的第二内部数据结构。HLSL“第24行”->字节码“指令id5”HLSL符号“var_0”->字节码寄存器“@r0”HLSL符号“var_l”_>字节码寄存器“@rl”HLSL符号“var_2”_>字节码寄存器“@r2”可实现读取器组件来读取第二内部数据结构并将HLSL源位置和符号解析为字节地址&寄存器。接下来,使用第一内部数据结构来生成DPC++源位置和符号与HLSL字节地址和寄存器名的直接映射。该直接映射可存储在诸如例如以PDB记录形式的第三内部数据结构中。DPC++“第11行>字节码“指令id5”DPC++符号“a”_>字节码寄存器“@r0”DPC++符号“b”_>字节码寄存器“@rl”DPC++符号“c”_>字节码寄存器“@r2”本发明可具体化为其它具体形式而不背离其精神或本质特征。所描述的实施例在所有方面都应被认为仅是说明性而非限制性的。从而,本发明的范围由所附权利要求书而非前述描述指示。落入权利要求书的等效方案的含义和范围内的所有改变应被权利要求书的范围所涵盖。权利要求1.生成的调试信息进行组合的方法,所述计算机系统还包括用于将源代码编译为可执行代码的多阶段编译器(101),所述多阶段编译器具有包括至少第一编译阶段(102)和第二编译阶段(103)的多个编译阶段,所述多个编译阶段中的每一编译阶段被配置成在代码格式之间转换并朝着从源代码(111)生成可执行代码(113)的方向前进,所述方法包括将第一调试信息(121)和第二调试信息(122)融合为合并的第三调试信息(123)的动作,所述第一调试信息(121)生成于将采用第一格式的第一代码(111)翻译为采用不同的第二格式的第二代码(112)的第一编译阶段(102),所述第一调试信息将所述第一代码中的每一指令映射(131)至所述第二代码中对应的指令并将所述第一代码中的每一符号映射(132)至所述第二代码中对应的符号,所述第二调试信息(122)生成于将所述第二代码(112)翻译为采用不同的第三格式的第三代码(113)的第二编译阶段(103),所述第二调试信息(122)将所述第二代码中的每一指令映射(113)至所述第三代码中对应的指令并将所述第二代码中的每一符号映射(134)至所述第三代码中对应的符号,所述合并的第三调试信息(123)将所述第一指令直接映射至所述第三指令并将所述第一符号直接映射至所述第三符号,融合所述第一调试信息和所述第二调试信息包括对于所述第一代码中的每一指令和符号使用所述第一调试信息来标识所述第二代码中与所述第一代码中的指令或符号对应的指令或符号的动作;使用所述第二调试信息来标识所述第三代码中与所述第二代码中所标识的指令或符号对应的指令或符号的动作;将所述第一代码中的指令或符号直接地映射(136,137)至所述第三代码中所标识的对应的指令或符号的动作;以及将所述第一代码中的指令或符号至所述第三代码中的指令或符号的直接映射(136,137)存储在所述合并的第三调试信息中的动作。2.如权利要求I所述的方法,其特征在于,所述将所述第一调试信息和第二调试信息融合为合并的第三调试信息的动作包括将在DataParallelC++(DPC++)源代码中的指令位置和符号与高级着色语言(HLSL)源代码中的指令位置和符号之间进行映射的第一调试信息与在HLSL源代码中的指令位置和符号与在HLSL字节码中的地址和寄存器名之间进行映射的第二调试信息融合为在所述DPC++源代码中的位置和符号与所述HLSL字节码中的地址和寄存器名之间进行映射的合并的第三调试信息的动作。3.如权利要求I所述的方法,其特征在于,所述第一编译阶段被配置为将DataParallelC++(DPC++)源代码翻译为高级着色语言(HLSL)源代码。4.如权利要求I所述的方法,其特征在于,所述第二编译阶段被配置为将高级着色语言(HLSL)源代码翻译为HLSL字节码。5.如权利要求I所述的方法,其特征在于,所述第一、第二和合并的第三调试信息被存储为程序数据库(TOB)记录。6.如权利要求I所述的方法,其特征在于,还包括使用合并的第三调试信息以辅助调试所述第一代码的动作。7.一种用于在计算机系统处使用的计算机程序产品,所述计算机系统包括用于将源代码编译为可执行代码的多阶段编译器(101),所述多阶段编译器具有包括至少第一编译阶段(102)和第二编译阶段(103)的多个编译阶段,所述多个编译阶段中的每一编译阶段被配置为在代码格式之间转换并朝着从源代码(111)生成可执行代码(113)的方向前进,所述计算机程序产品用于实现一种用于对生成于不同编译阶段的调试信息进行组合的方法,所述计算机程序产品包括其上存储有计算机可执行指令的一个或多个计算机存储设备,所述计算机可执行指令在处理器处执行时使所述计算机系统执行包括以下步骤的方法将第一调试信息(121)和第二调试信息(122)融合为合并的第三调试信息(123),所述第一调试信息(121)生成于将采用第一格式的第一代码(111)翻译为采用不同的第二格式的第二代码(112)的第一编译阶段(102),所述第一调试信息将所述第一代码中的每一指令映射(131)至所述第二代码中对应的指令并将所述第一代码中的每一符号映射(132)至所述第二代码中对应的符号,所述第二调试信息(122)生成于将所述第二代码(112)翻译为采用不同的第三格式的第三代码(113)的第二编译阶段(103),所述第二调试信息(122)将所述第二代码中的每一指令映射(133)至所述第三代码中对应的指令并将所述第二代码中的每一符号映射(134)至所述第三代码中对应的符号,所述合并的第三调试信息(123)将所述第一指令直接映射至所述第三指令并将所述第一符号直接映射至所述第三符号,融合所述第一调试信息和所述第二调试信息包括对于所述第一代码中的每一指令和符号使用所述第一调试信息来标识所述第二代码中与所述第一代码中的指令或符号对应的指令或符号;使用所述第二调试信息来标识所述第三代码中与所述第二代码中所标识的指令或符号对应的指令或符号;将所述第一代码中的指令或符号直接地映射(136,137)至所述第三代码中所标识的对应的指令或符号;以及将所述第一代码中的指令或符号至所述第三代码中的指令或符号的直接映射(136,137)存储在所述合并的第三调试信息中。8.—种在包括一个或多个处理器和系统存储器的计算机系统处用于对生成于不同编译阶段的调试信息进行组合的方法,所述计算机系统还包括用于将源代码(111)编译为可执行代码(113)的多阶段编译器(101),所述多阶段编译器(101)具有多个编译阶段(102,103),所述多个编译阶段中的每一编译阶段被配置为在代码格式之间转换并朝着从源代码生成可执行代码的方向前进,所述方法包括在第一编译阶段(102)访问第一代码(111)的动作,所述第一代码包括采用第一格式的第一指令和第一符号;将所述第一代码(111)翻译为第二代码(112)的动作,包括将所述第一指令和第一符号转换为对应的采用第二格式的第二指令和第二符号的动作,所述第二格式不同于所述第一格式;以及生成第一调试信息(121)的动作,所述第一调试信息将所述第一指令中的每一指令映射至所述第二指令中对应的指令并将所述第一符号中的每一符号映射至所述第二符号中对应的符号;在第二编译阶段(103)访问所述第二代码(112)的动作;将所述第二代码(112)翻译为第三代码(113)的动作,包括将所述第二指令和第二符号转换为对应的采用第三格式的第三指令和第三符号的动作,所述第三格式不同于所述第一格式和第二格式;以及生成第二调试信息(122)的动作,所述第二调试信息将所述第二指令中的每一指令映射至所述第三指令中对应的指令并将所述第二符号中的每一符号映射至所述第三符号中对应的符号;将所述第一调试信息(121)和所述第二调试信息(122)融合为合并的第三调试信息(123)的动作,所述合并的第三调试信息将所述第一指令直接地映射至所述第三指令并将所述第一符号直接地映射至所述第三符号,对于所述第一指令和第一符号中的每一个包括从所述第一调试信息内标识与所述第一指令或第一符号对应的第二指令或第二符号的动作;从所述第二调试信息内标识与所标识的第二指令或第二符号对应的第三指令或第三符号的动作;以及将所述第一指令或第一符号直接地映射(136,137)至所标识的对应的第三指令或第三符号的动作;将所述第一指令或第一符号至所标识的对应的第三指令或第三符号的映射(136,137)存储在所述合并的第三调试信息中的动作。9.如权利要求8所述的方法,其特征在于,所述将所述第二指令和第二符号转换为对应的采用第三格式的第三指令和第三符号的动作包括将所述第二指令和第二符号转换为在图形处理单元(“GPU”)上可执行的代码的动作。10.如权利要求8所述的方法,其特征在于,所述将所述第一调试信息和第二调试信息融合为所述合并的第三调试信息的动作包括将在DataParallelC++(DPC++)源代码中的指令位置和符号与高级着色语言(HLSL)源代码中的指令位置和符号之间进行映射的第一调试信息与在HLSL源代码中的指令位置和符号与在HLSL字节码中的地址和寄存器名之间进行映射的第二调试信息融合为在所述DPC++源代码中的位置和符号与所述HLSL字节码中的地址和寄存器名之间进行映射的第三调试信息的动作。全文摘要本发明公开了融合来自不同编译器阶段的调试信息。本发明涉及用于融合来自不同编译器阶段的调试信息的各方法、系统和计算机程序产品。本发明的各实施例在代码生成过程中将来自多个不同编译阶段的调试信息融合为单个调试信息集。该单个调试信息集直接在输入至第一编译阶段的指令和符号(例如,源代码)与从最后的编译阶段输出的指令和符号(例如,机器码)之间映射。文档编号G06F9/45GK102637136SQ20111042863公开日2012年8月15日申请日期2011年12月19日优先权日2010年12月17日发明者A·K·阿加瓦尔,P·梅比,T·P·多舍尔申请人:微软公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1