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
のではなく、ジャンプ命令を使用する必要があります。これは意味がありますか?blr
bl _mcount