萌えハッカーニュースリーダー

2025/10/27 06:36 Stack walking: space and time trade-offs

出典: https://maskray.me/blog/2025-10-26-stack-walking-space-and-time-trade-offs
hakase
博士

やっほー、ロボ子!今日のITニュース、なかなか興味深いものがあるのじゃ。

roboko
ロボ子

博士、こんにちは。どんなニュースですか?

hakase
博士

今日はね、DWARFというものと、スタック巻き戻しについてなのじゃ。C++の例外処理に必要なものらしいぞ。

roboko
ロボ子

DWARFですか。初めて聞きました。具体的にはどういうものなのでしょう?

hakase
博士

DWARFは、簡単に言うと、プログラムのデバッグ情報を記録するための規格なのじゃ。これがないと、C++の例外処理とかがうまく動かないらしい。

roboko
ロボ子

なるほど。それで、そのDWARFの代替手段があるということですか?

hakase
博士

そう!フレームポインタを有効にするか、SFrameという新しい形式を使うという手もあるみたい。「開発者はフレームポインタを有効にするか、プロファイリング用に設計された新しい形式であるSFrameを採用できる」って書いてあるぞ。

roboko
ロボ子

フレームポインタは聞いたことがあります。でも、SFrameは初めてです。プロファイリング専用なんですね。

hakase
博士

そうみたいじゃな。記事によると、x86-64では、フレームポインタ、DWARF、SFrame、LBR、AppleのCompact Unwinding Formatなど、色々なスタックウォーキングのメカニズムがあるみたいじゃ。

roboko
ロボ子

そんなにたくさん!それぞれに特徴があるんでしょうね。

hakase
博士

その通り!フレームポインタは速いけどレジスタを消費する。DWARFは包括的だけど遅い。SFrameはプロファイリング専用。LBRはSkylake以降で使える。AppleのCompact Unwinding FormatはDWARFをほぼ置き換えられるけど、一部にはDWARFが必要…って感じじゃ。

roboko
ロボ子

なるほど。状況に応じて使い分ける必要があるんですね。

hakase
博士

そういうことじゃ!フレームポインタを有効にするには、`-fno-omit-frame-pointer`というオプションを使うらしいぞ。これで、フレームポインタレジスタが予約されて、関数の最初と最後にpush/pop命令が追加される。

roboko
ロボ子

リーフ関数の場合はどうなるんですか?

hakase
博士

リーフ関数は、他の関数を呼び出さない関数のことじゃな。この場合は、`-momit-leaf-frame-pointer`というオプションを使うと、push/pop操作が省略されて、コードサイズが小さくなるみたい。

roboko
ロボ子

最適化ですね。

hakase
博士

そうじゃ!フレームポインタを省略すると、コンパイラはRSP相対アドレッシングを使うことになる。RSPは追加のSIBバイトを必要とするけど、RBPは必要としない、と。

roboko
ロボ子

SFrameは、OracleがLinuxディストリビューションでの採用を提唱しているんですね。

hakase
博士

そうみたいじゃな。SFrameの実装は、コンパイラではなくアセンブラとリンカによって処理されるらしい。

roboko
ロボ子

へえ、興味深いですね。

hakase
博士

記事によると、Clangでビルドされたバイナリでは、フレームポインタ構成の方がSFrame構成よりも実行可能ファイルサイズが小さいみたいじゃ。GCCだと、フレームポインタバージョンの方が小さいらしい。

roboko
ロボ子

コンパイラによって結果が違うんですね。

hakase
博士

そうみたいじゃな。GCCのフレームポインタコード生成は、デフォルトのomit-frame-pointerパスほど最適化されていない可能性がある、と。

roboko
ロボ子

フレームポインタを有効にすると、スタックオブジェクトへのアクセスが頻繁な場合、バイナリサイズが小さくなることもあるんですね。

hakase
博士

逆説的じゃけど、そういうこともあるみたいじゃな!

roboko
ロボ子

勉強になりました。今日のニュースも奥が深いですね。

hakase
博士

じゃろ?ところでロボ子、SFrameって、なんだかおしゃれなカフェの名前みたいじゃない?

roboko
ロボ子

確かに。今度、SFrameという名前のカフェを探してみましょうか。

hakase
博士

もし見つけたら、メニューはアセンブリ言語で書かれてそうじゃな。

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search