使用GCC C/C+分析实现问题+;PowerPC的十字架
我正在尝试实现gcc评测 我将嵌入式环境eCos与PowerPC一起使用。我用C语言编程 当我使用使用GCC C/C+分析实现问题+;PowerPC的十字架,c,gcc,profiling,powerpc,ecos,C,Gcc,Profiling,Powerpc,Ecos,我正在尝试实现gcc评测 我将嵌入式环境eCos与PowerPC一起使用。我用C语言编程 当我使用-pg开关编译和链接时,我发现符号\u mcount未定义 我意识到我需要实现这个功能,因为它是特定于目标的 \u mcount功能的要求是什么 它必须保存和恢复所有寄存器,对吗?是否有任何特殊寄存器必须与标准32一起保存和恢复 我看到过一些指令,说明必须在禁用中断的情况下调用\u mcount,或者\u mcount在记录调用树数据之前是否禁用中断 我的PowerPC是8245。这是603e系列处
-pg
开关编译和链接时,我发现符号\u mcount
未定义
我意识到我需要实现这个功能,因为它是特定于目标的
\u mcount
功能的要求是什么
它必须保存和恢复所有寄存器,对吗?是否有任何特殊寄存器必须与标准32一起保存和恢复
我看到过一些指令,说明必须在禁用中断的情况下调用\u mcount
,或者\u mcount
在记录调用树数据之前是否禁用中断
我的PowerPC是8245。这是603e系列处理器
我使用GCC4.6.1作为PowerPCEABI的交叉编译器构建
下面是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
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附加r0,r12,-32088
100b50:48 05 19 25 bl 152474
100b54:94 21 ff 88 stwu r1,-120(r1)
100b58:7c 08 02 a6 mflr r0
100b5c:90 01 00 7c stw R0124(r1)
100b60:93 e1 00 74 stw R31116(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
\u mcount
时,r0
包含输入的函数地址,4(r1)
包含调用者的程序计数器。这对信息被存储并用于创建调用图
我通过阅读gcc源代码gcc/libffi/src/powerpc/asm.h找到了这些信息
我仍然不确定
\u mcount
将返回什么。似乎它必须恢复LR,因此\u mcount
不能使用blr
,它必须从(4)r1
恢复LR,并使用跳转指令而不是blr
返回到bl\u mcount
之后的指令。这有意义吗?这不是一个完整的解决方案,但下面的汇编代码将为PowerPC创建一个虚拟计数
代码可用于解析\u mcount
外部,但不记录调用图数据。
此代码由gcc文件\gcc\testsuite\gcc.target\powerpc\ppc-abi-2.c
,函数my\u mcount()
PowerPC的
\u mcount
实现现在已检入eCos RTOS存储库:
听起来像是。gprof不是一个工具,它可以查看由\u mcount和配置文件计时器存储的结果吗_mcount是程序执行时调用的函数。gprof是检索和显示此信息的工具。我是否正确地说明了功能的分离?是的,gprof需要一个函数,当输入函数B时,它会增加一个计数器,说明哪个函数a称为B。这可能是你必须做的,但有更好的方法(比gprof更好)为程序员寻找优化的机会。我有一个保存递增值的函数。我似乎要做的是编写桥接函数mcount,它在两个位置接收调用者和被调用者数据,将这些值映射到存储函数所需的形式,并返回到已恢复寄存器(特别是LR)的mcount调用者。关于其他插装方法,我正在使用嵌入式操作系统,gprof是唯一受支持的方法。抱歉。gprof有助于给你成堆的数字,让你挠头。当我在嵌入式软件上工作时,我只是用一个电路内模拟器拍摄了Stackshot。这不是为胆小鬼准备的,但从来没有失败过。
.text
.globl _mcount
_mcount:
# Move LR to CTR and return via CTR
mflr r0
mtctr r0
lwz r0,4(r1)
mtlr r0
bctr