專利名稱:一種用于處理應(yīng)用程序的內(nèi)容表訪問溢出的方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及應(yīng)用程序的處理,尤其涉及一種用于處理應(yīng)用程序中的內(nèi)容表(TOC)訪問溢出的方法和系統(tǒng)。
背景技術(shù):
用于AIX和Linux的POWER系統(tǒng)是IBM服務(wù)器系列的主要產(chǎn)品,其中,工具鏈的易用性(tools chain usability)和性能是在POWER系統(tǒng)上進(jìn)行開發(fā)的一個(gè)很重要的基礎(chǔ)。對(duì)于POWER系統(tǒng)來說,在對(duì)應(yīng)用程序進(jìn)行構(gòu)建的過程中,存在一個(gè)被稱為“T0C溢出(overflow) ”的問題,該TOC溢出會(huì)限制全局?jǐn)?shù)據(jù)/代碼的使用,常常為POWER系統(tǒng)開發(fā)人員帶來很大的不便。
發(fā)明內(nèi)容
本發(fā)明希望提供一種新的方案來處理應(yīng)用程序構(gòu)建中出現(xiàn)的TOC溢出問題。依據(jù)本發(fā)明的一個(gè)實(shí)施例,提供了一種用于處理應(yīng)用程序的方法,包括對(duì)應(yīng)用程序的源文件進(jìn)行編譯,以產(chǎn)生與源文件對(duì)應(yīng)的目標(biāo)文件;對(duì)編譯產(chǎn)生的目標(biāo)文件進(jìn)行鏈接,以確定目標(biāo)文件中的TOC訪問是否存在溢出;響應(yīng)于目標(biāo)文件中的TOC訪問存在溢出,對(duì)所述TOC訪問存在溢出的目標(biāo)文件所對(duì)應(yīng)的源文件進(jìn)行再次編譯,以產(chǎn)生沒有TOC溢出的目標(biāo)文件;以及,用再次編譯產(chǎn)生的沒有TOC溢出的目標(biāo)文件替換所述TOC訪問存在溢出的目標(biāo)文件,并對(duì)目標(biāo)文件進(jìn)行再次鏈接。依據(jù)本發(fā)明的另一個(gè)實(shí)施例,提供了一種用于處理應(yīng)用程序的系統(tǒng),包括編譯器,被配置為對(duì)應(yīng)用程序的源文件進(jìn)行編譯,以產(chǎn)生與源文件對(duì)應(yīng)的目標(biāo)文件;鏈接器,被配置為對(duì)編譯產(chǎn)生的目標(biāo)文件進(jìn)行鏈接,其中,所述鏈接器進(jìn)一步被配置為確定所述目標(biāo)文件中的TOC訪問是否存在溢出;所述編譯器進(jìn)一步被配置為響應(yīng)于目標(biāo)文件中的TOC訪問存在溢出,對(duì)TOC訪問存在溢出的目標(biāo)文件所對(duì)應(yīng)的源文件進(jìn)行再次編譯,以產(chǎn)生沒有TOC溢出的目標(biāo)文件;以及,所述鏈接器進(jìn)一步被配置為用再次編譯產(chǎn)生的沒有TOC溢出的目標(biāo)文件替換TOC訪問存在溢出的目標(biāo)文件,并對(duì)目標(biāo)文件進(jìn)行再次鏈接。本發(fā)明通過采用兩輪編譯,僅對(duì)確實(shí)存在TOC溢出的TOC表項(xiàng)才產(chǎn)生兩條指令形式的雙指令TOC訪問。因此,該方案具有很好的易用性,并且降低了性能損失。
通過對(duì)附圖中本發(fā)明示例實(shí)施例方式的更詳細(xì)描述,本發(fā)明的上述、以及其它目的、特征和優(yōu)勢(shì)將變得更加明顯。圖I示出了適于用來實(shí)現(xiàn)本發(fā)明實(shí)施方式的示例性計(jì)算系統(tǒng)100的框圖。圖2示出了一個(gè)TOC訪問的示意圖。圖3示出了一個(gè)TOC溢出的示意圖。圖4示出了依據(jù)本發(fā)明的一個(gè)實(shí)施例的用于處理TOC溢出的方法的流程圖。
圖5示出了依據(jù)本發(fā)明的另一個(gè)實(shí)施例的用于處理TOC溢出的過程的示意圖。圖6不出了一個(gè)溢出符號(hào)列表的不意圖。圖7示出了依據(jù)本發(fā)明的一個(gè)實(shí)施例的用于處理TOC溢出的系統(tǒng)700的方框圖。
具體實(shí)施例方式以下參照按照本發(fā)明實(shí)施例的方法、系統(tǒng)描述本發(fā)明。其中,流程圖和/或框圖的每個(gè)方框以及流程圖和/或框圖中各方框的組合,都可以由計(jì)算機(jī)程序指令實(shí)現(xiàn)。這些計(jì)算機(jī)程序指令可以提供給通用計(jì)算機(jī)、專用計(jì)算機(jī)或其它可編程數(shù)據(jù)處理裝置的處理器,從而生產(chǎn)出一種機(jī)器,使得通過計(jì)算機(jī)或其它可編程數(shù)據(jù)處理裝置執(zhí)行的這些指令,產(chǎn)生實(shí)現(xiàn)流程圖和/或框圖中的方框中規(guī)定的功能/操作的裝置(means)。也可以把這些計(jì)算機(jī)程序指令存儲(chǔ)在能指令計(jì)算機(jī)或其它可編程數(shù)據(jù)處理裝置以特定方式工作的計(jì)算機(jī)可讀介質(zhì)中,這樣,存儲(chǔ)在計(jì)算機(jī)可讀介質(zhì)中的指令產(chǎn)生一個(gè)包括實(shí)現(xiàn)流程圖和/或框圖中的方框中規(guī)定的功能/操作的指令裝置(instruction means) 的制造品。還可以把計(jì)算機(jī)程序指令加載到計(jì)算機(jī)或其它可編程數(shù)據(jù)處理裝置上,使得在計(jì)算機(jī)或其它可編程數(shù)據(jù)處理裝置上執(zhí)行一系列操作步驟,以產(chǎn)生計(jì)算機(jī)實(shí)現(xiàn)的過程,從而在計(jì)算機(jī)或其它可編程裝置上執(zhí)行的指令就提供實(shí)現(xiàn)流程圖和/或框圖中的方框中規(guī)定的功能/操作的過程。圖I示出了適于用來實(shí)現(xiàn)本發(fā)明實(shí)施方式的示例性計(jì)算系統(tǒng)100的框圖。如所示,計(jì)算機(jī)系統(tǒng)100可以包括CPU(中央處理單元)101、RAM(隨機(jī)存取存儲(chǔ)器)102、R0M(只讀存儲(chǔ)器)103、系統(tǒng)總線104、硬盤控制器105、鍵盤控制器106、串行接口控制器107、并行接口控制器108、顯示控制器109、硬盤110、鍵盤111、串行外部設(shè)備112、并行外部設(shè)備113和顯示器114。在這些設(shè)備中,與系統(tǒng)總線104耦合的有CPU10URAM 102,ROM 103、硬盤控制器105、鍵盤控制器106、串行控制器107、并行控制器108和顯示控制器109。硬盤110與硬盤控制器105耦合,鍵盤111與鍵盤控制器106耦合,串行外部設(shè)備112與串行接口控制器107耦合,并行外部設(shè)備113與并行接口控制器108耦合,以及顯示器114與顯示控制器109耦合。應(yīng)當(dāng)理解,圖I所述的結(jié)構(gòu)框圖僅僅為了示例的目的而示出的,而不是對(duì)本發(fā)明范圍的限制。在某些情況下,可以根據(jù)具體情況而增加或者減少某些設(shè)備。在參考附圖具體描述依據(jù)本發(fā)明的實(shí)施例之前,下面先對(duì)本發(fā)明所涉及的一些術(shù)語進(jìn)行如下介紹。IBM POWER的硬件指令I(lǐng)BM POWER硬件支持用偏移指令加載/存儲(chǔ)。例如,“L RT, offet (RA) ”表示從地址“offset+RA”加載到寄存器RT。“offset”是介于_2~ 15和2~ 15之間的一個(gè)立即數(shù)。TOC (內(nèi)容表)AIX 的 ABI (Application Binary Interface 應(yīng)用程序二進(jìn)制接口)和 64 位的Linux限定了 T0C,該內(nèi)容表實(shí)際上是存儲(chǔ)器中分配的一個(gè)部分。所有的全局變量和函數(shù)指針的地址被放入該TOC中,必須通過地址來訪問。TOC 訪問通常,使用一條加載指令來進(jìn)行TOC地址訪問。TOC表存有數(shù)據(jù)和函數(shù)的地址,圖2示出了一個(gè)TOC訪問的示意圖,其中,基址寄存器R2指向TOC表的中心位置。對(duì)數(shù)據(jù)的訪問必須通過TOC表得到數(shù)據(jù)地址,然后根據(jù)地址完成數(shù)據(jù)訪問。例如,當(dāng)使用全局變量A2時(shí),編譯器必須首先通過訪問TOC :“L R3,offset_of_A2 (R2) ”來加載A的地址。R2是TOC的基地址,offset_of_A2 (R2)是TOC中的TOC表項(xiàng)A2的偏移。這里需要注意的是,TOC表項(xiàng)存儲(chǔ)的是A2的地址,而不是A2的值。然后,編譯器使用另一條加載指令來獲得值A(chǔ)2 :“L R4,R3”。需要注意的是,寄存器R3僅在最近一次TOC訪問時(shí)獲得A2的地址。以圖2所示的TOC表為例,如果要訪問數(shù)據(jù)"A2",首先通過符號(hào)"A2"在TOC表中的偏移位置(+800)和基址寄存器R2 (T0C表基地址),計(jì)算出"A2 "在TOC表中的位置,并讀取"A2"的地址,可以通過指令"L0ADR3,800(R2)"完成這步操作。運(yùn)行該指令后在寄存器R3存放"A2"的地址。之后,使用該地址再次訪問存儲(chǔ)器中的數(shù)據(jù)空間,得到所需要的數(shù)據(jù)。
如圖2所示,TOC表除了可以用于A1,A2等數(shù)據(jù)之外,也可以存放f00l,f002等函數(shù)的地址。并且,同樣,如果要調(diào)用函數(shù)fool,則需要通過fool在TOC表中的偏移位置和基址寄存器R2,計(jì)算出fool在TOC表中的位置,并讀取fool的地址,之后,使用該地址訪問存儲(chǔ)器中的代碼空間,從而調(diào)用該函數(shù)。鏈接器的重定位(LinkerRelocation)在編譯時(shí),并不創(chuàng)建T0C,編譯器并不知曉TOC表項(xiàng)的偏移。例如,在上面的例子中,“0ffset_0f_A”是未知的,編譯器必須在指令中產(chǎn)生一個(gè)特別的標(biāo)簽。在鏈接時(shí),鏈接器收集TOC的所有信息,此時(shí)偏移是可以計(jì)算出來的。在上面的例子中,計(jì)算出“0ffSet_0f_A”,將其值(例如10000)填充到指令中。這個(gè)過程被稱為鏈接器的再定位。TOC 溢出TOC溢出發(fā)生在試圖以很大的偏移訪問TOC表項(xiàng)時(shí),此時(shí)由于偏移很大,無法將偏移在一單個(gè)指令中以一個(gè)立即數(shù)的方式編碼。對(duì)于64位的系統(tǒng)來說,地址是8字節(jié)的,意味著一個(gè)TOC表項(xiàng)(全局?jǐn)?shù)據(jù)地址)要占用8個(gè)字節(jié)。如果TOC包含大于8192個(gè)表項(xiàng)(2 6/8 = 8192),則無法使用象“L R3,offset_of_A (R2) ”這樣的一個(gè)單個(gè)的合法指令來加載所有TOC表項(xiàng),因此有些表項(xiàng)的offset_of_A可能會(huì)大于+2~15 (或小于_2~15)。需要注意的是,編譯器在編譯時(shí)并不知道TOC的大小,因此如果編譯器總是產(chǎn)生一個(gè)類似于“L R3,offset_of_A(R2) ”的單個(gè)指令來訪問T0C,則會(huì)導(dǎo)致鏈接器對(duì)于某些指令無法完成再定位,這種現(xiàn)象被稱為TOC溢出。圖3示出了一個(gè)TOC溢出的示意圖。其中,數(shù)據(jù)"A1001"的地址存于偏移為+2 5+1的TOC項(xiàng),它的地址不能用一條LOAD指令取得,所以處于TOC溢出區(qū)域。已經(jīng)存在著一些用來解決TOC溢出的已知方案。例如,一種可能的方案是,編譯器總使用雙指令 TOC 訪問(two instruction TOC access)。在這種情況下,編譯器產(chǎn)生一個(gè)用來訪問大的TOC的雙指令TOC訪問,而不是僅使用一次指令加載來訪問T0C。其可以使用如下所示的兩條指令形式(I) CAU r3, r2, offset_up(2) L r3, offset_lo (r3)這是為32位偏移設(shè)計(jì)的。第一個(gè)指令加上高16位的偏移,第二個(gè)指令加上低16位的偏移,并加載。通過采用這種方式,可以確保不會(huì)發(fā)生TOC溢出。這種方式的缺陷是,由于編譯器無法計(jì)算TOC表項(xiàng)的偏移,因此在這種解決方案中,編譯器必須對(duì)于每一次TOC訪問都產(chǎn)生雙指令TOC訪問。因此在沒有溢出(偏移< 2~15)的情況下,對(duì)于這些TOC的訪問不夠高效。另一種可能的方案是,編譯器產(chǎn)生一條加載指令TOC訪問,即單指令TOC訪問。在存在溢出的情況下,鏈接器對(duì)這些溢出進(jìn)行修補(bǔ)(patch)。具體地,當(dāng)鏈接器計(jì)算出TOC表項(xiàng)偏移,并發(fā)現(xiàn)存在TOC溢出時(shí),鏈接器對(duì)代碼進(jìn)行如下修改
Lr3,offset(r2)
==>
B tx//替換 ”Lr3,offset(r2)"
retumx:Il跳轉(zhuǎn)返回的標(biāo)簽
tx:
CAU r3,r2,offset—up//雙指令 TOC 訪問
L r3,offset_lo(r3)
B retumx在這個(gè)解決方案中鏈接器無法用雙指令TOC訪問形式來替換一次加載TOC訪問的原因是,在鏈接器中修改代碼大小是非常困難的。鏈接器必須使用一條指令("B tx")替換最初的單指令TOC訪問(one load TOC ac_cess),來保證代碼大小不變。然后,在代碼尾部附加一段代碼(分支目標(biāo))。這種方案的缺點(diǎn)是,這種修補(bǔ)需要額外的兩個(gè)跳轉(zhuǎn)("Btx"和"Breturnx"),而這種跳轉(zhuǎn)會(huì)極大地?fù)p害運(yùn)行時(shí)的性能。還有一種可能的方案是,如果TOC大小太大,IPA(Inter Procedure Analysis進(jìn)程間分析)可以聚合(coalesce) TOC表項(xiàng)。IPA是鏈接時(shí)一個(gè)非常繁重的優(yōu)化。IPA具有整個(gè)程序的所有信息,包括TOC信息。其會(huì)將TOC表項(xiàng)接合起來,避免溢出。這種方案的缺陷是,IPA非常耗時(shí),其應(yīng)用在很多種情況下都收到限制,特別是應(yīng)用程序非常大的情況下。而這恰恰是TOC溢出容易發(fā)生的情況。其結(jié)果是,大多數(shù)商業(yè)客戶不愿僅僅為了解決TOC溢出問題對(duì)大應(yīng)用程序使用IPA。下面將參考圖4描述依據(jù)本發(fā)明的一個(gè)實(shí)施例的用于處理TOC溢出的方法的流程圖。在步驟S410,編譯器接收應(yīng)用程序的源文件,對(duì)該源文件進(jìn)行編譯,從而產(chǎn)生與源文件相對(duì)應(yīng)的目標(biāo)文件。這個(gè)編譯的過程可以采用在該領(lǐng)域通用的編譯方式。在步驟S420,鏈接器接收從編譯器產(chǎn)生的目標(biāo)文件,對(duì)該目標(biāo)文件進(jìn)行鏈接,并在鏈接過程中確定該目標(biāo)文件中的TOC訪問是否存在溢出。在步驟S430,如果確定目標(biāo)文件中的TOC訪問存在溢出,則編譯器對(duì)存在TOC溢出的目標(biāo)文件所對(duì)應(yīng)的源文件進(jìn)行再次編譯。例如,在這個(gè)再次編譯的過程中,由于已經(jīng)知道了存在TOC溢出的目標(biāo)文件,從而可以針對(duì)這些目標(biāo)文件所對(duì)應(yīng)的源文件,在編譯的過程中來產(chǎn)生沒有TOC溢出的TOC訪問。由于這個(gè)再次編譯的過程僅對(duì)TOC訪問存在溢出的目標(biāo)文件所對(duì)應(yīng)的源文件進(jìn)行,從而可以在確保在不發(fā)生TOC溢出的情況下,不會(huì)對(duì)性能造成不必要的影響。在步驟S440,用再次編譯產(chǎn)生的沒有TOC溢出的目標(biāo)文件替換TOC訪問存在溢出的目標(biāo)文件,并對(duì)所述目標(biāo)文件進(jìn)行再次鏈接,從而產(chǎn)生該應(yīng)用程序的可執(zhí)行文件。圖5示出了依據(jù)本發(fā)明的一個(gè)實(shí)施例的用于處理TOC溢出的過程的示意圖。首先,編譯器接收應(yīng)用程序的源文件,對(duì)該源文件進(jìn)行編譯,從而產(chǎn)生與源文件相對(duì)應(yīng)的目標(biāo)文件。其中,這個(gè)編譯過程采用通常的編譯方法,產(chǎn)生使用一條加載指令 的TOC地址訪問。例如,在AIX和Linux環(huán)境下,可以通過采用特定的選項(xiàng)、例如“-qpic = smart”來調(diào)用編譯器,從而產(chǎn)生通常的TOC訪問(一次加載形式)。并且,可以在目標(biāo)文件“.comment”部分記錄編譯命令和編譯環(huán)境,這與使用選項(xiàng)"-qsaveopt"類似。該信息可以用于在需要時(shí)調(diào)用第二輪編譯。然后,鏈接器按照通常的程序檢測(cè)目標(biāo)程序中是否有符號(hào)(symbol)存在TOC溢出。如果沒有TOC溢出,則整個(gè)構(gòu)建過程結(jié)束,鏈接器輸出應(yīng)用程序的一個(gè)可執(zhí)行文件。如果出現(xiàn)存在TOC溢出的符號(hào),鏈接器則在一個(gè)溢出符號(hào)列表、例如"/tmp/foo"中記錄溢出信息,該溢出信息可以是溢出符號(hào)/目標(biāo)文件名,即TOC訪問溢出的溢出符號(hào)以及包含所述溢出符號(hào)的目標(biāo)文件的目標(biāo)文件名。該溢出符號(hào)列表將用來為之后的第二輪編譯提供輸入。對(duì)于具有溢出符號(hào)的每個(gè)目標(biāo)文件,鏈接器從目標(biāo)文件“.comment”部分取出編譯命令字符串,該編譯命令是以字符串的形式保存在目標(biāo)文件“.comment ”部分中的。對(duì)于每一個(gè)溢出目標(biāo)文件,使用從目標(biāo)文件讀出的編譯命令,并加上指定溢出符號(hào)列表文件的命令,構(gòu)成最終調(diào)用編譯器進(jìn)行第二輪編譯的命令。當(dāng)設(shè)置了特定選項(xiàng)-qtocsymf (該命令用于指定溢出符號(hào)列表文件)時(shí),編譯器進(jìn)行第二輪編譯步驟。其中,編譯器讀取輸入的TOC溢出符號(hào)列表文件,對(duì)應(yīng)用程序的源文件進(jìn)行編譯。其中,對(duì)于不在溢出符號(hào)列表中的符號(hào),采用通常的TOC訪問(一次加載形式),對(duì)于在溢出符號(hào)列表中的符號(hào),進(jìn)行雙指令TOC訪問(二次指令形式)。需要指出的是,這里雖然以雙指令TOC訪問為例對(duì)本發(fā)明的實(shí)施例進(jìn)行了描述,但本領(lǐng)域技術(shù)人員可以理解的是,本發(fā)明并不限于二條指令的雙指令形式,其也可以是多于兩條指令的多指令形式,只要能夠消除TOC溢出,即落入本發(fā)明的保護(hù)范圍。圖6給出了一個(gè)溢出符號(hào)列表的例子,其中,為了避免符號(hào)重復(fù)出現(xiàn)在不同目標(biāo)文件名下造成的列表文件空間浪費(fèi),文件格式上可以采用如圖6所示的使用字符串表二級(jí)存儲(chǔ)的方法。然后,如圖5所示,進(jìn)行第二輪鏈接。在第二輪編譯時(shí),第一輪編譯產(chǎn)生的TOC訪問存在溢出的目標(biāo)文件由第二輪編譯產(chǎn)生的修改后的目標(biāo)文件替換,而所有非溢出的目標(biāo)文件都來自第一輪編譯。鏈接器對(duì)全部目標(biāo)文件進(jìn)行鏈接,從而產(chǎn)生該應(yīng)用程序的可執(zhí)行文件。在這個(gè)階段,則不會(huì)出現(xiàn)TOC溢出。對(duì)于通用大小的應(yīng)用程序,僅僅很小數(shù)目的TOC符號(hào)會(huì)發(fā)生TOC溢出,甚至從不發(fā)生。因此,對(duì)于大多數(shù)目標(biāo)文件來說,無需進(jìn)行第二輪編譯/鏈接。與通常的構(gòu)建過程相比,如果需要的話(當(dāng)在第一輪鏈接時(shí)發(fā)生TOC溢出時(shí)),會(huì)自動(dòng)調(diào)用第二輪編譯/鏈接,并且僅對(duì)帶有TOC溢出的文件進(jìn)行第二輪編譯。本發(fā)明通過采用兩輪編譯,僅對(duì)確實(shí)存在TOC溢出的TOC表項(xiàng)才產(chǎn)生兩條指令形式的雙指令TOC訪問。因此,可以智能地產(chǎn)生快速TOC訪問,并避免性能上的損失。與已知的解決方案相比,當(dāng)TOC溢出不會(huì)發(fā)生時(shí),可以產(chǎn)生一條加載指令形式的快速TOC訪問,從而避 免每次都產(chǎn)生雙指令的TOC訪問所導(dǎo)致的性能損失,另外,由于在出現(xiàn)TOC溢出時(shí)會(huì)產(chǎn)生兩條指令形式的雙指令TOC訪問,也可以避免采用鏈接器修補(bǔ)所導(dǎo)致的大的性能損失。對(duì)于從源文件到可執(zhí)行文件的整個(gè)構(gòu)建過程來說,本發(fā)明所增加的構(gòu)建時(shí)間是非常少的。對(duì)于通常大小的應(yīng)用程序,TOC溢出僅對(duì)小數(shù)目的TOC符號(hào)才會(huì)出現(xiàn),甚至不會(huì)出現(xiàn)。這意味著對(duì)于大多數(shù)目標(biāo)文件來說,不需要第二輪編譯。通過采用本發(fā)明,用戶可以在增加最少構(gòu)建時(shí)間的情況下獲得最優(yōu)性能。并且,用戶在不知道TOC/應(yīng)用程序大小的情況下,也無需手動(dòng)測(cè)試TOC溢出并重建。依據(jù)本發(fā)明的另一個(gè)實(shí)施例,還提供了一種通過在第一輪鏈接中選擇/識(shí)別TOC溢出符號(hào)來進(jìn)一步改進(jìn)性能的方法。其中,如果由鏈接器檢測(cè)到TOC溢出,將執(zhí)行一個(gè)對(duì)TOC表項(xiàng)重新排序的方法。編譯器通過累積每次訪問的頻率,提供每一個(gè)TOC符號(hào)的頻率信息。該信息可以從靜態(tài)/動(dòng)態(tài)概要分析獲得。這個(gè)信息被存儲(chǔ)在目標(biāo)文件的.comment部分。當(dāng)鏈接器檢測(cè)到TOC太大、會(huì)導(dǎo)致溢出時(shí),其會(huì)按照編譯器提供的頻率信息對(duì)TOC表項(xiàng)重新排序,從而確保冷門、即低出現(xiàn)頻率的符號(hào)遠(yuǎn)離熱門的符號(hào)。這個(gè)優(yōu)化盡可能地確保熱門的TOC符號(hào)不會(huì)溢出,并使得溢出的全部損失最小化。例如,在一個(gè)循環(huán)中,Al訪問在循環(huán)之外,但A2訪問在循環(huán)之內(nèi)Al =…LoopA2 =…編譯器通過靜態(tài)概要分析產(chǎn)生信息Al 10A2 100鏈接器會(huì)對(duì)Al,A2重新排序,確保在TOC中A2比Al更近,A2的訪問不太可能溢出。當(dāng)然,在更熱門的符號(hào)占據(jù)了整個(gè)TOC的情況下仍有可能溢出,但這種情況極少出現(xiàn)。通過本發(fā)明的上述實(shí)施例,可以進(jìn)一步地減少TOC溢出的發(fā)生。本領(lǐng)域技術(shù)人員可以理解的是,上述方案可以單獨(dú)實(shí)現(xiàn)來減少TOC溢出的發(fā)生,也可以與圖4或圖5所示的本發(fā)明的一個(gè)實(shí)施例的方案共同使用來降低TOC溢出對(duì)于性能的影響。圖7示出了依據(jù)本發(fā)明的一個(gè)實(shí)施例的用于處理TOC溢出的系統(tǒng)框圖。該系統(tǒng)700包括編譯器710和鏈接器720。其中,編譯器710被配置為對(duì)應(yīng)用程序的源文件進(jìn)行編譯,以產(chǎn)生與源文件對(duì)應(yīng)的目標(biāo)文件。這可以采用通常的編譯過程來實(shí)現(xiàn),產(chǎn)生通常的單指令TOC訪問。鏈接器720被配置為對(duì)編譯產(chǎn)生的目標(biāo)文件進(jìn)行鏈接,以確定目標(biāo)文件中的TOC訪問是否存在溢出。編譯器710進(jìn)一步被配置為,響應(yīng)于所述目標(biāo)文件中的TOC訪問存在溢出,對(duì)存在TOC溢出的目標(biāo)文件所對(duì)應(yīng)的源文件進(jìn)行再次編譯,從而產(chǎn)生沒有TOC溢出的目標(biāo)文件。鏈接器720用再次編譯產(chǎn)生的沒有TOC溢出的目標(biāo)文件替換TOC訪問存在溢出的目標(biāo)文件,并對(duì)所述目標(biāo)文件進(jìn)行再次鏈接。
依據(jù)本發(fā)明的一個(gè)實(shí)施例,編譯器710進(jìn)一步被配置為對(duì)于TOC訪問存在溢出的目標(biāo)文件所對(duì)應(yīng)的源文件,產(chǎn)生多指令TOC訪問。其中該多指令TOC訪問可以是雙指令TOC訪問。依據(jù)本發(fā)明的一個(gè)實(shí)施例,編譯器710進(jìn)一步被配置為在編譯時(shí)記錄所述編譯的編譯命令。依據(jù)本發(fā)明的一個(gè)實(shí)施例,鏈接器720進(jìn)一步被配置為將所述溢出的溢出信息記錄在溢出符號(hào)列表中,以及,編譯器710進(jìn)一步被配置為根據(jù)所述溢出符號(hào)列表,確定TOC訪問存在溢出的目標(biāo)文件。依據(jù)本發(fā)明的一個(gè)實(shí)施例,其中所述溢出信息包括TOC訪問溢出的溢出符號(hào)以及包含所述溢出符號(hào)的目標(biāo)文件的目標(biāo)文件名。依據(jù)本發(fā)明的一個(gè)實(shí)施例,編譯器710進(jìn)一步被配置為,在編譯時(shí)獲得TOC符號(hào)的頻率信息,并且,鏈接器720進(jìn)一步被配置為,響應(yīng)于確定所述目標(biāo)文件中的TOC訪問存在溢出,按照TOC符號(hào)的頻率信息對(duì)TOC表項(xiàng)重新排序。其中,所述頻率信息是通過累積每次·訪問的頻率、從靜態(tài)/動(dòng)態(tài)概要分析獲得的。當(dāng)鏈接器檢測(cè)到TOC太大、會(huì)導(dǎo)致溢出時(shí),按照編譯器提供的頻率信息對(duì)TOC表項(xiàng)重新排序,從而確保冷門、即低出現(xiàn)頻率的符號(hào)遠(yuǎn)離熱門的符號(hào)。這個(gè)優(yōu)化盡可能地確保熱門的TOC符號(hào)不會(huì)溢出,并使得溢出的全部損失最小化。需要指出的是,雖然這里以POWER系統(tǒng)為例描述了本發(fā)明,本領(lǐng)域普通技術(shù)人員可以了解的是,本發(fā)明并不限于POWER系統(tǒng),任何對(duì)應(yīng)用程序進(jìn)行編譯和鏈接的過程都可以通過利用本發(fā)明來降低TOC溢出所帶來的性能上的影響。本發(fā)明還提供了一種存儲(chǔ)介質(zhì)或信號(hào)載體,其中包括用于執(zhí)行根據(jù)本發(fā)明的方法的指令。附圖中的流程圖和框圖,圖示了按照本發(fā)明實(shí)施例的系統(tǒng)、方法和計(jì)算機(jī)程序產(chǎn)品的可能實(shí)現(xiàn)的體系架構(gòu)、功能和操作。在這點(diǎn)上,流程圖或框圖中的每個(gè)方框可以代表一個(gè)模塊、程序段、或代碼的一部分,所述模塊、程序段、或代碼的一部分包含一個(gè)或多個(gè)用于實(shí)現(xiàn)規(guī)定的邏輯功能的可執(zhí)行指令。也應(yīng)當(dāng)注意,在有些作為替換的實(shí)現(xiàn)中,方框中所標(biāo)注的功能也可以以不同于附圖中所標(biāo)注的順序發(fā)生。例如,兩個(gè)接連地表示的方框?qū)嶋H上可以基本并行地執(zhí)行,它們有時(shí)也可以按相反的順序執(zhí)行,這依所涉及的功能而定。也要注意的是,框圖和/或流程圖中的每個(gè)方框、以及框圖和/或流程圖中的方框的組合,可以用執(zhí)行規(guī)定的功能或操作的專用的基于硬件的系統(tǒng)來實(shí)現(xiàn),或者可以用專用硬件與計(jì)算機(jī)指令的組合來實(shí)現(xiàn)。所屬技術(shù)領(lǐng)域的技術(shù)人員知道,本發(fā)明可以體現(xiàn)為系統(tǒng)、方法或計(jì)算機(jī)程序產(chǎn)品。因此,本發(fā)明可以具體實(shí)現(xiàn)為以下形式,即,可以是完全的硬件、完全的軟件(包括固件、駐留軟件、微代碼等)、或者本文一般稱為“電路”、“模塊”或“系統(tǒng)”的軟件部分與硬件部分的組合。此外,本發(fā)明還可以采取體現(xiàn)在任何有形的表達(dá)介質(zhì)(medium of expression)中的計(jì)算機(jī)程序產(chǎn)品的形式,該介質(zhì)中包含計(jì)算機(jī)可用的程序碼。可以使用一個(gè)或多個(gè)計(jì)算機(jī)可用的或計(jì)算機(jī)可讀的介質(zhì)的任何組合。計(jì)算機(jī)可用的或計(jì)算機(jī)可讀的介質(zhì)例如可以是——但不限于——電的、磁的、光的、電磁的、紅外線的、或半導(dǎo)體的系統(tǒng)、裝置、器件或傳播介質(zhì)。計(jì)算機(jī)可讀介質(zhì)的更具體的例子(非窮舉的列表)包括以下有一個(gè)或多個(gè)導(dǎo)線的電連接、便攜式計(jì)算機(jī)磁盤、硬盤、隨機(jī)存取存儲(chǔ)器(RAM)、只讀存儲(chǔ)器(ROM)、可擦式可編程只讀存儲(chǔ)器(EPR0M或閃存)、光纖、便攜式緊湊磁盤只讀存儲(chǔ)器(CD-ROM)、光存儲(chǔ)器件、諸如支持因特網(wǎng)或內(nèi)部網(wǎng)的傳輸介質(zhì)、或者磁存儲(chǔ)器件。注意計(jì)算機(jī)可用的或計(jì)算機(jī)可讀的介質(zhì)甚至可以是上面印有程序的紙張或者其它合適的介質(zhì),這是因?yàn)?,例如可以通過電掃描這種紙張或其它介質(zhì),以電子方式獲得程序,然后以適當(dāng)?shù)姆绞郊右跃幾g、解釋或處理,并且必要的話在計(jì)算機(jī)存儲(chǔ)器中存儲(chǔ)。在本文件的語境中,計(jì)算機(jī)可用的或計(jì)算機(jī)可讀的介質(zhì)可以是任何含有、存儲(chǔ)、傳達(dá)、傳播、或傳輸供指令執(zhí)行系統(tǒng)、裝置或器件使用的或與指令執(zhí)行系統(tǒng)、裝置或器件相聯(lián)系的程序的介質(zhì)。計(jì)算機(jī)可用的介質(zhì)可包括在基帶中或者作為載波一部分傳播的、由其體現(xiàn)計(jì)算機(jī)可用的程序碼的數(shù)據(jù)信號(hào)。計(jì)算機(jī)可用的程序碼可以用任何適當(dāng)?shù)慕橘|(zhì)傳輸,包括一但不限于一無線、電線、光纜、RF等等。用于執(zhí)行本發(fā)明的操作的計(jì)算機(jī)程序碼,可以以一種或多種程序設(shè)計(jì)語言的任何組合來編寫,所述程序設(shè)計(jì)語言包括面向?qū)ο蟮某绦蛟O(shè)計(jì)語言一諸如Java、Smalltalk、 C++之類,還包括常規(guī)的過程式程序設(shè)計(jì)語言——諸如” C”程序設(shè)計(jì)語言或類似的程序設(shè)計(jì)語言。程序碼可以完全地在用戶的計(jì)算上執(zhí)行、部分地在用戶的計(jì)算機(jī)上執(zhí)行、作為一個(gè)獨(dú)立的軟件包執(zhí)行、部分在用戶的計(jì)算機(jī)上部分在遠(yuǎn)程計(jì)算機(jī)上執(zhí)行、或者完全在遠(yuǎn)程計(jì)算機(jī)或服務(wù)器上執(zhí)行。在后一種情形中,遠(yuǎn)程計(jì)算機(jī)可以通過任何種類的網(wǎng)絡(luò)——包括局域網(wǎng)(LAN)或廣域網(wǎng)(WAN)——連接到用戶的計(jì)算機(jī),或者,可以(例如利用因特網(wǎng)服務(wù)提供商來通過因特網(wǎng))連接到外部計(jì)算機(jī)。以上結(jié)合優(yōu)選法方案對(duì)本發(fā)明進(jìn)行了詳細(xì)的描述,但是可以理解,以上實(shí)施例僅用于說明而非限定本發(fā)明。本領(lǐng)域的技術(shù)人員可以對(duì)本發(fā)明的所示方案進(jìn)行修改而不脫離本發(fā)明的范圍和精神。
權(quán)利要求
1.一種用于處理應(yīng)用程序的方法,包括 對(duì)應(yīng)用程序的源文件進(jìn)行編譯,以產(chǎn)生與源文件對(duì)應(yīng)的目標(biāo)文件; 對(duì)編譯產(chǎn)生的目標(biāo)文件進(jìn)行鏈接,以確定目標(biāo)文件中的TOC訪問是否存在溢出; 響應(yīng)于目標(biāo)文件中的TOC訪問存在溢出,對(duì)所述TOC訪問存在溢出的目標(biāo)文件所對(duì)應(yīng)的源文件進(jìn)行再次編譯,以產(chǎn)生沒有TOC溢出的目標(biāo)文件;以及 用再次編譯產(chǎn)生的沒有TOC溢出的目標(biāo)文件替換所述TOC訪問存在溢出的目標(biāo)文件,并對(duì)目標(biāo)文件進(jìn)行再次鏈接。
2.如權(quán)利要求I所述的方法,其中,對(duì)應(yīng)用程序的源文件進(jìn)行編譯,以產(chǎn)生與源文件對(duì)應(yīng)的目標(biāo)文件進(jìn)一步包括,對(duì)源文件產(chǎn)生單指令TOC訪問,以及, 響應(yīng)于目標(biāo)文件中的TOC訪問存在溢出,對(duì)所述TOC訪問存在溢出的目標(biāo)文件所對(duì)應(yīng)的源文件進(jìn)行再次編譯,以產(chǎn)生沒有TOC溢出的目標(biāo)文件進(jìn)一步包括,對(duì)于TOC訪問存在溢出的目標(biāo)文件所對(duì)應(yīng)的源文件,產(chǎn)生多指令TOC訪問。
3.如權(quán)利要求2所述的方法,其中,所述多指令TOC訪問是采用二條指令形式的雙指令TOC訪問。
4.如權(quán)利要求I所述的方法,其中,對(duì)應(yīng)用程序的源文件進(jìn)行編譯,以產(chǎn)生與源文件對(duì)應(yīng)的目標(biāo)文件進(jìn)一步包括,記錄所述編譯的編譯命令。
5.如權(quán)利要求I所述的方法,其中,對(duì)編譯產(chǎn)生的目標(biāo)文件進(jìn)行鏈接,以確定目標(biāo)文件中的TOC訪問是否存在溢出進(jìn)一步包括,將所述溢出的溢出信息記錄在溢出符號(hào)列表中,以及, 響應(yīng)于所述目標(biāo)文件中的TOC訪問存在溢出,對(duì)所述TOC訪問存在溢出的目標(biāo)文件所對(duì)應(yīng)的源文件進(jìn)行再次編譯,以產(chǎn)生沒有TOC溢出的目標(biāo)文件進(jìn)一步包括,根據(jù)所述溢出符號(hào)列表,確定TOC訪問存在溢出的目標(biāo)文件。
6.如權(quán)利要求5所述的方法,其中,所述溢出信息包括TOC訪問溢出的溢出符號(hào)以及包含所述溢出符號(hào)的目標(biāo)文件的目標(biāo)文件名。
7.如權(quán)利要求I所述的方法,其中,對(duì)應(yīng)用程序的源文件進(jìn)行編譯,以產(chǎn)生與源文件對(duì)應(yīng)的目標(biāo)文件進(jìn)一步包括,獲得TOC符號(hào)的頻率信息, 對(duì)編譯產(chǎn)生的目標(biāo)文件進(jìn)行鏈接,以確定目標(biāo)文件中的TOC訪問是否存在溢出進(jìn)一步包括,響應(yīng)于確定目標(biāo)文件中的TOC訪問存在溢出,按照TOC符號(hào)的頻率信息對(duì)TOC表項(xiàng)重新排序。
8.如權(quán)利要求7所述的方法,其中,所述頻率信息是通過累積每次訪問的頻率、從靜態(tài)/動(dòng)態(tài)概要分析獲得的。
9.一種用于處理應(yīng)用程序的系統(tǒng),包括 編譯器,被配置為對(duì)應(yīng)用程序的源文件進(jìn)行編譯,以產(chǎn)生與源文件對(duì)應(yīng)的目標(biāo)文件; 鏈接器,被配置為對(duì)編譯產(chǎn)生的目標(biāo)文件進(jìn)行鏈接, 其中,所述鏈接器進(jìn)一步被配置為確定所述目標(biāo)文件中的TOC訪問是否存在溢出; 所述編譯器進(jìn)一步被配置為響應(yīng)于目標(biāo)文件中的TOC訪問存在溢出,對(duì)TOC訪問存在溢出的目標(biāo)文件所對(duì)應(yīng)的源文件進(jìn)行再次編譯,以產(chǎn)生沒有TOC溢出的目標(biāo)文件;以及 所述鏈接器進(jìn)一步被配置為用再次編譯產(chǎn)生的沒有TOC溢出的目標(biāo)文件替換TOC訪問存在溢出的目標(biāo)文件,并對(duì)目標(biāo)文件進(jìn)行再次鏈接。
10.如權(quán)利要求9所述的系統(tǒng),其中,所述編譯器進(jìn)一步被配置為,對(duì)于TOC訪問存在溢出的目標(biāo)文件所對(duì)應(yīng)的源文件,產(chǎn)生多指令TOC訪問。
11.如權(quán)利要求10所述的系統(tǒng),其中,所述多指令TOC訪問是采用二條指令形式的雙指令TOC訪問。
12.如權(quán)利要求9所述的系統(tǒng),其中,所述編譯器進(jìn)一步被配置為,記錄所述編譯的編譯命令。
13.如權(quán)利要求9所述的系統(tǒng),其中,所述鏈接器進(jìn)一步被配置為,將所述溢出的溢出信息記錄在溢出符號(hào)列表中,以及, 所述編譯器進(jìn)一步被配置為,根據(jù)所述溢出符號(hào)列表,確定TOC訪問存在溢出的目標(biāo)文件。
14.如權(quán)利要求13所述的系統(tǒng),其中,所述溢出信息包括TOC訪問溢出的溢出符號(hào)以及包含所述溢出符號(hào)的目標(biāo)文件的目標(biāo)文件名。
15.如權(quán)利要求9所述的系統(tǒng),其中,所述編譯器進(jìn)一步被配置為,獲得TOC符號(hào)的頻率信息, 所述鏈接器進(jìn)一步被配置為,響應(yīng)于確定目標(biāo)文件中的TOC訪問存在溢出,按照TOC符號(hào)的頻率信息對(duì)TOC表項(xiàng)重新排序。
16.如權(quán)利要求15所述的系統(tǒng),其中,所述頻率信息是通過累積每次訪問的頻率、從靜態(tài)/動(dòng)態(tài)概要分析獲得的。
全文摘要
本發(fā)明提供了一種用于處理應(yīng)用程序中的內(nèi)容表(TOC)訪問溢出的方法和系統(tǒng)。其中,該方法在對(duì)編譯產(chǎn)生的目標(biāo)文件進(jìn)行鏈接時(shí),確定該目標(biāo)文件中的TOC訪問是否存在溢出。如果在目標(biāo)文件中的TOC訪問存在溢出,則對(duì)該目標(biāo)文件所對(duì)應(yīng)的源文件進(jìn)行再次編譯,以產(chǎn)生沒有TOC溢出的目標(biāo)文件,并對(duì)目標(biāo)文件進(jìn)行再次鏈接,從而產(chǎn)生應(yīng)用程序的可執(zhí)行文件。本發(fā)明通過采用兩輪編譯,僅對(duì)確實(shí)存在TOC溢出的TOC表項(xiàng)才產(chǎn)生兩條指令形式的雙指令TOC訪問。因此,該方案具有很好的易用性,并且降低了性能損失。
文檔編號(hào)G06F11/07GK102902568SQ20111021914
公開日2013年1月30日 申請(qǐng)日期2011年7月27日 優(yōu)先權(quán)日2011年7月27日
發(fā)明者蔣健, 張嗣元, 紀(jì)金松 申請(qǐng)人:國(guó)際商業(yè)機(jī)器公司