gcc 4.4の新機能

4.3でAda2005にほぼ対応してしまったgcc。追いかけるものがなくなった今、果たしてこれから先どこへ向かうのか?
gccのAdaフロントエンドに加えられる変更は、AdaCoreのDevelopment Logがほぼ全てですので、何が加えられているのか見てみましょう。*1

New attribute ‘Old to capture old values
Eiffelですかいパート1。

Support for imported generic subprograms
つまりgeneric type T is private; function EnumWindows (Proc : access function (Wnd : HWND; Data : access T) return BOOL; Data : access T) return BOOL;のようなAPIの使い方ができると。さりげなく素晴らしい。

New Precondition/Postcondition pragmas
Eiffelですかいパート2。

New attribute Enum_Val for enumeration types
'Posと'Valは、列挙型にどんな内部表現を取らせようが、ソースコード上の宣言順に0, 1, 2...だったわけですが、'Enum_Posと'Enum_Valは内部表現の値で使えますよ、と。

New attribute Invalid_Value
無効値を明示的に使える属性らしい。適当に今レジスタに入ってるゴミでもpushしとけばいいよみたいな用途でしょうか……と思ったら、s-scaval.adsの値が使われます。何に使うんだと思ったら、s-scaval.adsにあるのは変数ですね。「無効値」を書き換え可能?pragma Initialize_Scalars絡みか……よくわからんです。

Block stream IO for strings
従来、String'Writeはループして1文字毎にI/Oするコードをインラインで吐きやがるダメダメ実装だったため、使わないのが鉄則でした。これで安心して使えるように。

Allocation of constants with discriminated types
Adaの言語仕様としては、コンパイル時定数をnewするときは静的に確保して使いまわしてOKな最適化が認められています。例えばP : access constant string := new String'("abcdef");なんかは4.3でも静的になってmallocの類は一切呼ばれません。で、それが適用される範囲が広がったっぽい。

Wider access to GCC builtins from Ada
Cフロントエンドが提供する__builtin_xxxxを使えるように。これでインポートした数学関数なんかはバリバリインライン化されて畳み込まれます。Ada側の数学関数は現在インラインアセンブラでの実装ですが、どうせならこれ使ってa-numaux.adbも書き直せばいいのに。

この辺ぐらいまでgccのtrunkに入ってます。こっから下はまだでした。

More efficient handling of nested subprograms
トランポリン無しで関数内関数が使えるようになるらしいです。恐らくaccess procedure/access functionがポインタふたつの組になって、ebpも持ち運ばれると予想。pragma Conventionまたはpragma Favor_Top_Levelを指定したやつは従来通りコードアドレスのみでトランポリンを使うようです。

Improved concatenation efficiency
おおおおお!これでnew String'(A & B)としたとき、"&"の呼び出し→AとBの結合結果がセカンダリスタックに置かれる→メモリ確保→確保したメモリにコピー、と、文字列全体が2 回コピーされていたのが、1回で済むようになるのでしょうか。……こーやって書いてみると、改めてダメすぎるなAdaフロントエンド。

Support for pragma Thread_Local_Storage
あれ、__thread使えるのってSolaris, GNU/Linux, VxWorks 6だけでしたっけ。Ada標準ライブラリのa-tasatt.adbは中見ると重そうで使いたくないのですよね。

*1:pragma Unmodifiedぐらいまでgcc 4.3に入ってます