我試圖獲得實施的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 r0
和stw r0,4(r1)
存儲在堆棧中。 - 2)剛剛輸入的函數地址存儲在
r0
中,其中兩條指令lis r12,35
和addi r0,r12,-32088
。
因此,當_mcount
被稱爲r0
包含輸入函數的地址,4(r1)
包含調用的程序計數器。這一對信息被存儲並用於創建調用圖。
通過閱讀gcc源代碼gcc/libffi/src/powerpc/asm.h可以找到這些信息。
我仍然不確定_mcount
預計會返回。看來它必須恢復LR,因此_mcount
不能使用blr
,它必須從(4)r1
恢復LR,並使用跳轉指令而不是blr
返回到bl _mcount
之後的指令。這有意義嗎?
聽起來你[*實施gprof *](http://stackoverflow.com/a/1779343/23771)。 –
是不是gprof看起來_mcount和配置文件計時器存儲結果的工具? _mcount是程序執行時調用的函數。 gprof是檢索並顯示這些信息的工具。我是否正確說明了功能的分離? – KeithSmith
是的,* gprof *需要一個函數,當輸入一個函數B時,遞增一個計數器,說明哪個函數A叫做B.這可能是你必須要做的,但是有更好的方法(比* gprof * )讓程序員找到優化的機會。 –