【问题标题】:Profiling Implementation Issue with GCC C/C++ cross for PowerPCPowerPC 的 GCC C/C++ 交叉分析实现问题
【发布时间】:2012-11-04 13:48:51
【问题描述】:

我正在尝试实现 gcc 分析。

我正在使用带有 PowerPC 的嵌入式环境 eCos。我用 C 编程。

当我使用-pg 开关编译和链接时,我发现符号_mcount 是未定义的。

我意识到我需要实现这个功能,因为它是特定于目标的。

_mcount功能有什么要求?

我是否正确,它必须保存和恢复所有寄存器?是否有任何特殊寄存器必须与标准 32 一起保存和恢复?

我看到评论说_mcount 必须在禁用中断的情况下调用,还是_mcount 在记录调用树数据之前禁用中断?

我的 PowerPC 是 8245。这是 603e 系列处理器。

我正在使用作为 powerpc-eabi 的交叉编译器构建的 GCC 4.6.1。

这是一个由 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之后的指令。这有意义吗?

【问题讨论】:

  • 听起来你是implementing gprof
  • gprof 不是查看_mcount 和profile timer 存储的结果的工具吗? _mcount 是程序执行时调用的函数。 gprof 用于检索和显示此信息。我是否正确地说明了功能分离?
  • 是的,gprof 需要一个函数,当输入函数 B 时,会增加一个计数器,说明哪个函数 A 调用了 B。这可能是你必须做的,但是程序员有更好的方法(比gprof)来寻找优化的机会。
  • 我有保存递增值的函数。我似乎要做的是编写桥接函数 mcount,它在两个位置接收调用者和被调用者数据,将这些值映射到存储函数所需的形式,并返回到已恢复寄存器的 mcount 调用者,尤其是LR。关于其他检测方法,我正在使用嵌入式操作系统,仅支持 gprof 方法。
  • 那么对不起。 gprof 非常适合给你一堆数字,让你摸不着头脑。当我从事嵌入式软件工作时,我只是使用在线仿真器拍摄堆栈照片。这不是娘娘腔,但它从未失败过。

标签: c gcc profiling powerpc ecos


【解决方案1】:

这不是一个完整的解决方案,但下面的汇编代码将为 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

【讨论】:

    【解决方案2】:

    现在有一个用于 PowerPC 的 _mcount 实现已签入 eCos RTOS 存储库:

    http://ecos.sourceware.org/cgi-bin/cvsweb.cgi/ecos/packages/hal/powerpc/arch/current/src/mcount.S?cvsroot=ecos

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-26
      • 2014-10-24
      • 2022-01-18
      • 1970-01-01
      • 2011-11-10
      • 2015-06-05
      相关资源
      最近更新 更多