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