OpenWatcom 1.7 出てたヨ。
Win32 版 C/C++ に関する限り、RC2 からの変更はまったくないと思われます。(インストーラの exe がバイナリ完全一致)。
変更点は例によって訳してみた(なんかだいぶ適当にやってしまった気が…)。個人的には以下のバグ修正がけっこう驚いた。
- cdecl 呼び出し規約の互換性に問題があった。
- Win32 の stat がバグってた(当方の言語処理能力の不具合により原文の説明がうまく訳せなかったので、適当に意訳して説明を補填してしまった)
ちなみに cdecl の不具合。たとえば
double __cdecl test(void) { return 1; }
これをコンパイル&逆アセ(wcl386 -c -s test.c && wdis test.obj -a)すると、以前の OpenWatcom ではこんな感じ(OpenWatcom 1.3)。
.387 .386p .model flat PUBLIC _test DGROUP GROUP CONST,CONST2,_DATA _TEXT SEGMENT BYTE PUBLIC USE32 'CODE' ASSUME CS:_TEXT, DS:DGROUP, SS:DGROUP _test: mov eax,offset FLAT:L$1 xor edx,edx mov dword ptr FLAT:L$1,edx mov dword ptr FLAT:L$2,3ff00000H ret _TEXT ENDS CONST SEGMENT DWORD PUBLIC USE32 'DATA' L$1: DB 0, 0, 0, 0 L$2: DB 0, 0, 0, 0 CONST ENDS CONST2 SEGMENT DWORD PUBLIC USE32 'DATA' CONST2 ENDS _DATA SEGMENT DWORD PUBLIC USE32 'DATA' _DATA ENDS END
で、1.7 だとこんな感じ。
.387 .386p PUBLIC _test EXTRN __8087:BYTE EXTRN __init_387_emulator:BYTE DGROUP GROUP CONST,CONST2,_DATA _TEXT SEGMENT BYTE PUBLIC USE32 'CODE' ASSUME CS:_TEXT, DS:DGROUP, SS:DGROUP _test: fld1 ret _TEXT ENDS CONST SEGMENT DWORD PUBLIC USE32 'DATA' CONST ENDS CONST2 SEGMENT DWORD PUBLIC USE32 'DATA' CONST2 ENDS _DATA SEGMENT DWORD PUBLIC USE32 'DATA' _DATA ENDS END
ついでに mingw の gcc 3.3.3 (gcc -S -fomit-frame-pointer test.c)
.file "test.c" .text .globl _test .def _test; .scl 2; .type 32; .endef _test: fld1 ret
ついでなんで Borland C++ 5.5.1 でもやってみたヨ(bcc32 -S test.c デバッグ情報とコメントは長いので削除した)
.386p model flat _TEXT segment dword public use32 'CODE' _TEXT ends _DATA segment dword public use32 'DATA' _DATA ends _BSS segment dword public use32 'BSS' _BSS ends DGROUP group _BSS,_DATA _TEXT segment dword public use32 'CODE' _test proc near push ebp mov ebp,esp @1: fld qword ptr [@2] @4: @3: pop ebp ret align 4 @2: db 0,0,0,0,0,0,240,63 _test endp _TEXT ends public _test end
fld1 してくれないあたりがボーランドだな、とか微妙にオチがついたような気分になってしまったり。