2012-11-15 40 views
0

我試圖獲得實施的gcc分析。用於PowerPC的GCC C/C++交叉分析實現問題

我正在使用PowerPC嵌入式環境eCos。我用C編程。

當我使用-pg開關進行編譯和鏈接時,我發現符號_mcount未定義。

我知道我需要實現這個功能,因爲它是特定於目標的。

_mcount函數有什麼要求?

我是否正確,它必須保存和恢復所有寄存器?是否有任何特殊的寄存器必須與標準32一起保存和恢復?

我看到了一些調用,指出_mcount必須在禁用中斷的情況下調用,或者_mcount在記錄調用樹數據之前禁用中斷嗎?

我的PowerPC是8245.這是603e系列處理器。

我使用GCC 4.6.1作爲交叉編譯器構建爲powerpc-eabi。

下面是一個由gcc生成的_mcount調用示例。被分析的函數的第一指令是示出的第一行:

100b40:  7c 08 02 a6  mflr r0 
100b44:  3d 80 00 23  lis  r12,35 
100b48:  90 01 00 04  stw  r0,4(r1) 
100b4c:  38 0c 82 a8  addi r0,r12,-32088 
100b50:  48 05 19 25  bl  152474 <_mcount> 
100b54:  94 21 ff 88  stwu r1,-120(r1) 
100b58:  7c 08 02 a6  mflr r0 
100b5c:  90 01 00 7c  stw  r0,124(r1) 
100b60:  93 e1 00 74  stw  r31,116(r1) 
100b64:  7c 3f 0b 78  mr  r31,r1 

由編譯器開關-pg創建的代碼執行以下內容。

  • 1)調用者的地址以兩條指令mflr r0stw r0,4(r1)存儲在堆棧中。
  • 2)剛剛輸入的函數地址存儲在r0中,其中兩條指令lis r12,35addi r0,r12,-32088

因此,當_mcount被稱爲r0包含輸入函數的地址,4(r1)包含調用的程序計數器。這一對信息被存儲並用於創建調用圖。

通過閱讀gcc源代碼gcc/libffi/src/powerpc/asm.h可以找到這些信息。

我仍然不確定_mcount預計會返回。看來它必須恢復LR,因此_mcount不能使用blr,它必須從(4)r1恢復LR,並使用跳轉指令而不是blr返回到bl _mcount之後的指令。這有意義嗎?

+0

聽起來你[*實施gprof *](http://stackoverflow.com/a/1779343/23771)。 –

+1

是不是gprof看起來_mcount和配置文件計時器存儲結果的工具? _mcount是程序執行時調用的函數。 gprof是檢索並顯示這些信息的工具。我是否正確說明了功能的分離? – KeithSmith

+0

是的,* gprof *需要一個函數,當輸入一個函數B時,遞增一個計數器,說明哪個函數A叫做B.這可能是你必須要做的,但是有更好的方法(比* gprof * )讓程序員找到優化的機會。 –

回答

0

這不是一個完整的解決方案,但下面的彙編代碼將爲PowerPC創建一個虛擬_mcount。

該代碼可用於解析外部的_mcount,但不記錄調用圖數據。 此代碼是由GCC文件\gcc\testsuite\gcc.target\powerpc\ppc-abi-2.c建議,功能my_mcount()

.text     
    .globl _mcount 
_mcount: 
    # Move LR to CTR and return via CTR 
    mflr r0 
    mtctr r0 
    lwz r0,4(r1) 
    mtlr r0 
    bctr