2012-11-15 41 views
0

我试图获得实施的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 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之后的指令。这有意义吗?

+0

听起来你[*实施gprof *](http://stackoverflow.com/a/1779343/23771)。 –

+1

是不是gprof看起来_mcount和配置文件计时器存储结果的工具? _mcount是程序执行时调用的函数。 gprof是检索并显示这些信息的工具。我是否正确说明了功能的分离? – KeithSmith

+0

是的,* gprof *需要一个函数,当输入一个函数B时,递增一个计数器,说明哪个函数A叫做B.这可能是你必须要做的,但是有更好的方法(比* gprof * )让程序员找到优化的机会。 –

回答

0

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