Tail Call Optimization

BF537/518用の検死情報機能を実装しました。そこで一つ浮上してきた問題があります。GCCのTail Call Optimizationです。
検死情報を表示するspurious_int_handler()は、device_dispatcher()の末尾から呼び出されます。このとき、GCCはTail Call Optimizationを適用して、

  • unlink命令を先に実行し
  • callをjumpで置き換える

という処理を行います。これでrts命令を一つ節約できるのですが、困ったことも起きます。unlinkのネストが想定から変わるのです。検死情報の表示には、例外や割り込みが発生したときに待避されたコンテキストを探し当てなければなりません。その唯一の方法はunlinkが作り上げたFPのチェーンをスタック上でたどることなのですが、Tail Call Optimizationは、このもくろみをぶちこわしてくれます。
対策を検討中。
追記:
fno-optimize-sibling-calls オプションの追加で解決した模様です。