0

gccプロファイリングを実装しようとしています。

PowerPCで組み込み環境のeCosを使用しています。私はCでプログラミングしています。

スイッチを使用してコンパイルおよびリンクすると、シンボルが未定義-pgであることがわかります。_mcount

この関数はターゲット固有であるため、実装する必要があることに気付きました。

_mcount機能の要件は何ですか?

すべてのレジスタを保存して復元する必要があるというのは正しいですか?標準の32と一緒に保存および復元する必要のある特殊レジスターはありますか?

_mcount割り込みを無効にして呼び出す必要があるというコメントを見たことがありますか、それとも_mcountコールツリーデータを記録する前に割り込みを無効にしますか?

私のPowerPCは8245です。これは603eファミリのプロセッサです。

powerpc-eabiとしてクロスコンパイラとして構築されたGCC4.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)呼び出し元のアドレスは、2つの命令mflr r0と。でスタックに格納されますstw r0,4(r1)
  • 2)入力したばかりの関数のアドレスはr0、2つの命令lis r12,35とで格納されaddi r0,r12,-32088ます。

したがって、_mcountが呼び出されるとr0、入力された関数アドレスが4(r1)含まれ、呼び出し元のプログラムカウンターが含まれます。この情報のペアが保存され、コールグラフの作成に使用されます。

この情報は、gccソースgcc / libffi / src / powerpc/asm.hを読んで見つけました。

_mcountが返ってくるのかまだわかりません。LRを復元する必要があるようです。そのため、_mcountを使用できませんblr。LRを復元し、の後に命令に戻る(4)r1のではなく、ジャンプ命令を使用する必要があります。これは意味がありますか?blrbl _mcount

4

2 に答える 2

1

PowerPCの実装が_mcounteCos RTOS リポジトリにチェックインされました。

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

于 2014-03-22T17:15:24.623 に答える
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
于 2012-11-20T19:40:39.353 に答える