我试图获得实施的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 * )让程序员找到优化的机会。 –