-fomit-frame-pointerは常にフレームポインタを省略しますか?PCとFPの両方をセットアップする必要がある状況はありますか?動的なスタックの増加により、fpがセットアップされますか?特にMIPS32を求めています。ありがとう!
3 に答える
フレーム ポインターは、例外のアンワインドの場合を除いて、正しい実行に実際には必要ありません。通常、動的なスタックの増加には何らかのフレーム ポインターが必要ですが、特定のレジスターに関連付けられているのではなく、通常のデータ フロー分析によって割り当てられます。
基本的に-fomit-frame-pointer
、FP を固定レジスタ割り当てから疑似レジスタに降格し、初期化をデッド ストアの削除対象にします。したがって、最初の質問に対する答えはノーです。常に省略されているわけではありません。
いいえ、通常、フレーム ポインタは必要ありません。コンパイラは、スタック ポインターに関連するローカル変数にアクセスでき、特別なフレーム ポインターは必要ありません。
-g
それにもかかわらず、標準のフレーム ポインター セットアップ シーケンスは、デバッガーがフレーム ポインター情報を使用して呼び出しスタックを再構築できるため、クラッシュしたプログラムをデバッグするときに ( でコンパイルされていない場合でも) 役立ちます。フレーム ポインタがない場合、1 つのスタック フレームの開始位置と次の終了位置を把握するための情報がありません。
そのため、使用-fomit-frame-pointer
すると、パフォーマンスと引き換えに、クラッシュした場合のデバッグがはるかに困難になります。コードのパフォーマンスに重要な部分が小規模なループであり、関数をまったく呼び出さない場合、フレーム ポインターを省略してもメリットはほとんどありません。
mips の人ではありませんが、どのシステムにも当てはまります。スタックを任意の時点で整列する必要がある場合は、元のポインタを格納するためにフレームを使用する必要があります (スタック アドレスと整列が不明な場合があるため)。