一種面向RISC-V匯編指令級的關鍵路徑自動檢測方法
一種面向risc-v匯編指令級的關鍵路徑自動檢測方法
技術領域:
:1.本發明涉及匯編程序關鍵路徑的自動檢測和匯編程序測試
技術領域:
:,具體涉及大量測試集在匯編程序中所經過的關鍵分支路徑問題,特別涉及一種面向risc-v匯編指令級的關鍵路徑自動檢測方法。
背景技術:
::2.在涉及匯編程序關鍵路徑檢測方法的技術,目前有基于輔助表的匯編程序控制流路徑檢測方法,此類方法是將由c語言編寫的路徑探針程序插入到待檢測的匯編程序各分支里面,為了保證原寄存器的值不被路徑探針調用的寄存器覆蓋,需要將所有整數寄存器的值提前壓棧,保存寄存器的現場,調用結束之后再將原寄存器的值取棧。待檢測結束,通過查閱輔助表得到控制流路徑的行號。3.該方法主要存在以下問題:4.(1)基于輔助表的匯編程序控制流路徑檢測方法由于需要將所有整數寄存器進行壓棧和取棧,產生的訪存時間減低了程序的性能,除此之外,輔助表的構造不具有通用性,每需要檢測不同程序的控制流路徑都要重新構建輔助表。5.(2)主流的路徑控制流分析工具idapro和intelpin,代碼體積龐大,實現復雜,產生的中間數據難以整理,并且不適用于risc-v匯編程序關鍵路徑分析。6.(3)risc-v指令集架構相比于x86和arm的軟件生態還不夠成熟,將其他路徑分析工具移植到risc-v架構具有一定的難度,且不易維護,亟需一些適用于risc-v指令集架構的關鍵路徑自動檢測方法分析出測試數據通過率最高的關鍵路徑,以用于對risc-v匯編程序的優化等工作。技術實現要素:7.為了至少能夠解決上述問題中的部分問題,本發明提供一種面向risc-v匯編指令級的關鍵路徑自動檢測方法。8.本發明提供的一種面向risc-v匯編指令級的關鍵路徑自動檢測方法,包括:9.步驟1:對待檢測匯編程序中的所有分支進行編碼;10.步驟2:遍歷待檢測匯編程序所涉及的所有浮點寄存器,從而判斷待檢測匯編程序中是否有至少兩個全局無依賴的浮點寄存器,若是,則執行步驟3,若否,則執行步驟4;11.步驟3:基于兩個全局無依賴的浮點寄存器和分支編碼,設計全局無依賴式插樁探針;12.步驟4:調用非全局無依賴的其他浮點寄存器作為輔助寄存器,基于輔助寄存器和分支編碼,設計輔助寄存器式插樁探針;13.步驟5:識別分支標識以定位到各個分支的首行位置,將全局無依賴式插樁探針和/或輔助寄存器式插樁探針自動插樁至各個分支的首行位置;14.步驟6:使用測試集對插樁后的待檢測匯編程序進行測試,將測試集生成的編碼結果輸出到結果文件,對結果文件中相同的編碼結果進行統計,對數量最多的編碼結果進行解碼以得到關鍵路徑;所述測試集是指由若干個用于檢測關鍵路徑的測試樣本組成的集合。15.進一步地,步驟1具體包括:16.按照分支順序,分別對每個分支進行二進制編碼、十進制編碼和十六進制編碼;其中,針對第i個分支,其二進制編碼由首位為1末尾為i-1個0組成;其十進制編碼即為二進制編碼對應的十進制數,其十六進制編碼即為二進制編碼對應的十六進制數;i=1,2,3…,n。17.進一步地,步驟3具體包括:18.利用其中一個全局無依賴的浮點寄存器存儲插樁探針所在分支的分支編碼,利用另一個全局無依賴的浮點寄存器存儲編碼和;所述編碼和是通過對測試樣本經過的所有分支的編碼進行累加運算后得到的。19.進一步地,步驟4具體包括:20.利用一個全局無依賴的浮點寄存器存儲插樁探針所在分支的分支編碼,利用輔助寄存器存儲編碼和;所述編碼和是通過對測試樣本經過的所有分支的進行累加運算后得到的;21.其中,針對任意一個探針,在調用輔助寄存器之前,先將輔助寄存器的原值進行壓棧;然后再將編碼和進行壓棧;在完成調用之后,將輔助寄存器的原值從棧中取出。22.進一步地,步驟5中,識別分支標識具體包括:遍歷risc-v匯編代碼行的字符,若識別到的字符不是助記符,則認為該字符分支標識。23.進一步地,步驟6中,對數量最多的編碼結果進行解碼以得到關鍵路徑具體包括:24.對數量最多的十六進制編碼結果解碼為二進制字符串,統計所述二進制字符串中“1”所在的順序號i,所有順序號i對應的分支所組成的路徑即為關鍵路徑。25.本發明的有益效果:26.1、根據risc-v匯編程序浮點寄存器的覆蓋情況設計不同的插樁探針,在進行匯編程序關鍵路徑檢測時可以進行不同選擇,并且插樁探針的設計簡潔方便,可以最大程度的減少訪存時間。27.2、采用自動檢測的方式即可以檢測出輸入在risc-v匯編程序中所通過的關鍵路徑,解決了人工對某個輸入的逐行分析易出錯的問題,一定程度上使相關工作更加準確高效,尤其對于含有大量分支跳轉的復雜匯編程序,其效果更加顯著。28.3、適用于新興的risc-v指令集架構的匯編程序,對完善risc-v軟件生態具有促進作用,此方法雖然只適用于risc-v指令集架構,但是基于該實現思想進行擴展可以適用于其他指令集架構的匯編程序。附圖說明29.圖1為本發明實施例提供的一種面向risc-v匯編指令級的關鍵路徑自動檢測方法的流程示意圖之一;30.圖2為本發明實施例提供的自動插樁的示意圖;31.圖3為本發明實施例提供的gdip的設計代碼;32.圖4為本發明實施例提供的arip的設計代碼;33.圖5為本發明實施例提供的關鍵路徑的示意圖。具體實施方式34.為使本發明的目的、技術方案和優點更加清楚,下面將結合本發明實施例中的附圖,對本發明實施例中的技術方案進行清楚地描述,顯然,所描述的實施例是本發明一部分實施例,而不是全部的實施例?;诒景l明中的實施例,本領域普通技術人員在沒有做出創造性勞動前提下所獲得的所有其他實施例,都屬于本發明保護的范圍。35.實施例136.如圖1所示,本發明實施例提供一種面向risc-v匯編指令級的關鍵路徑自動檢測方法,包括以下步驟:37.s101:對待檢測匯編程序中的所有分支進行編碼;38.s102:遍歷待檢測匯編程序所涉及的所有浮點寄存器,從而判斷待檢測匯編程序中是否有至少兩個全局無依賴的浮點寄存器,若是,則執行步驟s103,若否,則執行步驟s104;39.s103:基于兩個全局無依賴的浮點寄存器和分支編碼,設計全局無依賴式插樁探針(globaldependency-freeinstrumentationprobe,gdip);40.s104:調用非全局無依賴的其他浮點寄存器作為輔助寄存器,基于輔助寄存器和分支編碼,設計輔助寄存器式插樁探針(auxiliaryregisteredinstrumentationprobe,arip);41.s105:識別分支標識以定位到各個分支的首行位置,將全局無依賴式插樁探針和/或輔助寄存器式插樁探針自動插樁至各個分支的首行位置;42.具體地,遍歷risc-v匯編代碼行的字符,若識別到的字符不是助記符,則認為該字符分支標識;自動插樁流程圖如圖2所示。43.s106:使用測試集對插樁后的待檢測匯編程序進行測試,將測試集生成的編碼結果輸出到結果文件,對結果文件中相同的編碼結果進行統計,對數量最多的編碼結果進行解碼以得到關鍵路徑;所述測試集是指由若干個用于檢測關鍵路徑的測試樣本組成的集合。44.本發明實施例提供的面向risc-v匯編指令級的關鍵路徑自動檢測方法,根據待檢測risc-v匯編程序浮點寄存器的覆蓋情況設計不同的插樁探針,在進行匯編程序關鍵路徑檢測時可以進行不同選擇,可以最大程度的減少訪存時間;并且,本發明方法采用自動檢測方式即可以檢測出輸入在risc-v匯編程序中所通過的關鍵路徑,解決了人工對某個輸入的逐行分析易出錯的問題,一定程度上使相關工作更加準確高效,尤其對于含有大量分支跳轉的復雜匯編程序,其效果更加顯著;進一步地,本發明方法適用于新興的risc-v指令集架構的匯編程序,對完善risc-v軟件生態具有促進作用,并且基于本發明實現思想進行擴展可以適用于其他指令集架構的匯編程序。45.實施例246.在上述實施例1的基礎上,本發明實施例中具體給出了一種對分支進行編碼的實現方式,以及兩種插樁探針的設計方式。47.(1)分支編碼48.按照分支順序,分別對每個分支進行二進制編碼、十進制編碼和十六進制編碼;其中,針對第i個分支,其二進制編碼由首位為1末尾為i-1個0組成;其十進制編碼即為二進制編碼對應的十進制數,其十六進制編碼即為二進制編碼對應的十六進制數;i=1,2,3…,n。其中,各個類型編碼起到的作用不同,分支的十進制編碼用于表示各分支的順序,二進制編碼是為了解碼時只產生唯一結果,十六進制編碼是為了方便后續加載進寄存器進而計算插樁探針的編碼和以及最大程度的保證在risc-v浮點寄存器不溢出的情況下盡可能多的進行編碼。49.本發明實施例中,采用構建分支編碼表(branchingcodetable,bct)的形式來記錄各分支編碼,如表1所示。50.表1分支編碼表[0051][0052]具體地,采用上述二進制編碼方式的好處在于方便計算測試樣本所經過所有分支的編碼結果。這是因為,根據表1可以發現,在構造各分支二進制編碼的時候是有規律的,比如第一個分支二進制編碼為1,第二個分支二進制編碼為10,第三個分支二進制編碼為100,假設某一個測試樣本通過的分支是第一個分支和第二個分支,那么得到的編碼和為11(1+10),如果經過的是第一個分支和第三個分支,那么得到的編碼和為101(1+100),在此可以發現規律,對于11和101,不難發現從右向左數“1”所在的順序就是經過的分支,對于101,“1”在第1位和第3位,那么說明該測試集經過的是第1和第2分支。[0053]進一步地,設計十六進制編碼的好處在于方便寄存器存儲編碼結果。這是因為,寄存器的存儲是不分二進制和十進制的,如果某程序的分支數特別多的時候,那對應的二進制編碼太長,此時寄存器是無法存儲的,所以如表1所示將二進制編碼轉化為了十六進制編碼,則此時的編碼結果最終得到的是十六進制編碼和。[0054](2)全局無依賴式插樁探針的設計方式[0055]具體地,全局無依賴式插樁探針的設計,需要滿足在待檢測的risc-v匯編程序中有至少兩個浮點寄存器從未被使用(例如,以risc-v架構為例,假設risc-v架構中總共有32個寄存器,但是在待檢測的risc-v匯編程序中使用了其中的30個,那么剩余兩個就是全局無依賴寄存器),這是因為:以從未被使用的浮點寄存器設計插樁探針,不會影響待檢測匯編程序的寄存器的依賴關系,進而才能保證測試樣本在插樁前后所經過的路徑相同。[0056]gdip的設計構思具體包括:利用其中一個全局無依賴的浮點寄存器存儲插樁探針所在分支的分支編碼,利用另一個全局無依賴的浮點寄存器存儲編碼和;所述編碼和是通過對測試樣本經過的所有分支的十六進制編碼進行累加運算后得到的。[0057]gdip結構簡單,不產生額外的訪存時間,gdip核心代碼,如圖3所示,ft1和ft2寄存器為全局無依賴寄存器,其中第15行lis0,0x$,“$”字符代表表1中的十六進制編碼,待檢測匯編程序的分支數與gdip-n相對應,第4、9、15行整數寄存器的選擇不能改變下文寄存器的依賴關系。[0058](3)輔助寄存器式插樁探針的設計方式[0059]當待檢測risc-v匯編程序中從未被使用的浮點寄存器個數小于兩個時,則需要選擇輔助寄存器式插樁探針。此類型探針需要調用其他寄存器完成十六進制的加載和計算編碼和,為保證調用的輔助寄存器的值不被修改,需要在調用之前將輔助寄存器的原值進行壓棧,例如圖4第10、11行,同樣的將探針計算得到的編碼和也進行壓棧,例如圖4第16行,待插樁探針完成對輔助寄存器調用之后,將輔助寄存器的原值從棧中取出,以恢復寄存器的依賴,例如圖4第17、18行。當遇到下一個探針時,需要將上一個探針的值從棧中取出,例如圖4第22行,在此基礎上完成上述探針的同樣功能,如圖4所示。[0060](4)結果分析與解碼(resultanalysisanddecoding,rad)[0061]結果分析與解碼完成的功能是將關鍵路徑里的插樁探針流得到的十六進制編碼和解碼為由0和1組成的二進制字符串,例如使用500,000個測試樣本檢測risc-v匯編程序的關鍵路徑,假設關鍵路徑為l,則測試樣本經過l的數量是最多的,且l涉及的探針十六進制編碼和是相同的,根據表1可知解碼后的二進制字符串1的位置都是獨立的,即為1的位置順序就是通過的分支順序。[0062]在上文的第(1)中提及了二進制編碼和十六進制編碼的好處;其中,在使用十六進制編碼和時,對于十六進制編碼和是無法直觀的看出“1”所在的位置的,所以需要將十六進制編碼和轉化為二進制(解碼),此時就會得到一串由“0”“1”組合的二進制字符串,比如100101000101000101,這么長的組合,為了避免出錯的同時,提高檢測效率,可以采用自動統計方式去統計1所在的位置(“1”所在字符串中的順序就是經過的分支),本發明實施例中,給出了一種能夠實現自動統計的代碼1。[0063]結果分析與解碼的核心實現如代碼1所示。[0064][0065][0066]實施例3[0067]在上述各實施例的基礎上,以risc-v的cotd函數的匯編程序作為待檢測匯編程序,本發明實施例中,針對risc-v的cotd函數的匯編程序關鍵路徑自動檢測方法,包括以下步驟:[0068]s301:根據risc-v的cotd函數的匯編實現,對其匯編程序的所有分支進行編碼;[0069]具體地,如表2所示,插樁前cotd函數的部分匯編代碼如匯編代碼段1所示。[0070]表2risc-vcotd函數的分支編碼表[0071][0072]匯編代碼段1:[0073][0074][0075]s302:檢索cotd函數的匯編代碼涉及的浮點寄存器是否包括了risc-v指令集架構設計的所有浮點寄存器;經初步檢索,cotd函數有兩個以上全局無依賴浮點寄存器,即有兩個以上的浮點寄存器未被使用;因此選擇全局無依賴式插樁探針,該類型插樁探針里的浮點寄存器即為全局無依賴寄存器。[0076]s303:識別分支標識以定位到各個分支的首行位置,將全局無依賴式插樁探針自動插樁至各個分支的首行位置;[0077]具體到cotd函數而言,讀取cotd函數每行匯編程序第一個連續字符串,若識別到的字符串非risc-v指令集架構的匯編助記符,說明該字符串為分支名稱,例如匯編代碼段2中的“_rv_cotd:”和“.l3”等,即在此字符串下將gdip-1至gdip-n順序插入到各分支的首行,插樁后程序如匯編代碼段2所示。[0078]需要說明的是,若待檢測匯編程序不滿足有兩個以上全局無依賴寄存器的條件,則應用輔助寄存器式插樁探針,插樁后程序如匯編代碼段3所示。[0079]匯編代碼段2:[0080][0081][0082]匯編代碼段3:[0083][0084][0085][0086]s204:采用現有方法隨機生成500000個符合浮點數均勻分布規律的測試樣本,以這500000個測試樣本對插樁后的cotd函數進行測試,測試樣本通過某條路徑的個數最多即為關鍵路徑,依次為次要路徑,以及其他路徑。經測試cotd函數插樁探針的不同編碼和、數量、占比等參數如表3所示,根據表1顯示解碼得到的二進制字符串內“1”所在的位置順序,可知結果為100000100000000000001的數量占比最高,結合表2的分支編碼表,可得關鍵路徑,如圖5所示。[0087]具體地,因為測試用的測試集數量是龐大且不一樣的,不同的測試集所經過的分支有可能一樣,有可能不一樣,那么經過的插樁探針同樣是一樣或者不一樣,這個不需要人工判斷,只需要獲取每一個測試樣本經過的分支對應的插樁探針對應的編碼和輸出的文件,再對其解碼判斷即可。[0088]本實施例中,測試集經過程序的分支時,會對分支內的插樁探針對應的十六進制編碼進行累加運算,最后在結束分支得到的編碼和進而輸出。500000個測試樣本組成的測試集的編碼結果即為500000個編碼和;通過對這500000個編碼和進行統計分析,結果如表3所示。[0089]表3risc-vcotd函數的結果參數[0090]插樁探針編碼和數量占比解碼后的結果“1”所在順序0x413000410000000048051296.10%1000001000000000000011、7、210x4130001b00000000148062.96%1101100000000000000011、2、4、5、210x413000070000000021280.43%1110000000000000000011、2、3、21[0091]本發明支持自動檢測某個輸入在risc-v匯編程序里所經過的路徑。risc-v是一種新興的指令集架構,目前對于自動分析測試樣本所經過的risc-v匯編路徑方面亟需完善。如果利用手工逐行查看寄存器內容去判斷某個輸入所經過的路徑,不僅繁瑣而且易出錯,當測試集數量龐大以及risc-v匯編程序的分支跳轉復雜的時候手動分析每個測試樣本所經過的路徑更是難以完成。本發明利用自動插樁的方式判斷龐大測試集里的測試樣本所經過的路徑,具有準確性和高效性,除此之外,該發明不僅可以得到關鍵路徑,當對結果進行分析時,也可以得到次要路徑以及其他路徑。[0092]最后應說明的是:以上實施例僅用以說明本發明的技術方案,而非對其限制;盡管參照前述實施例對本發明進行了詳細的說明,本領域的普通技術人員應當理解:其依然可以對前述各實施例所記載的技術方案進行修改,或者對其中部分技術特征進行等同替換;而這些修改或者替換,并不使相應技術方案的本質脫離本發明各實施例技術方案的精神和范圍。當前第1頁12當前第1頁12
