Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用GCC C/C+分析实现问题+;PowerPC的十字架_C_Gcc_Profiling_Powerpc_Ecos - Fatal编程技术网

使用GCC C/C+分析实现问题+;PowerPC的十字架

使用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系列处

我正在尝试实现gcc评测

我将嵌入式环境eCos与PowerPC一起使用。我用C语言编程

当我使用
-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