ツールチェーン更新履歴 (ARM)¶
s006¶
ソフトウェアアップデート
Clang 6.0.0 -> 12.0.1
GCC 6.4.0 -> 10.3.0
GMP 6.1.2 -> 6.2.1
MPFR 4.0.1 -> 4.1.0
MPC 1.1.0 -> 1.2.1
libiconv 1.15 -> 1.16
libelf 0.8.13
binutils 2.28.1 -> 2.36.1
GDB 8.1 -> 10.2
termcap 1.3.1
GNU make 4.2.1
GCC 10 と Clang 12 の変更点
-fno-common がデフォルトになりました。
https://gcc.gnu.org/gcc-10/porting_to.html
これまでと同じ動作にしたい場合は -fcommon を指定してください。
Clang 12 のデフォルトの C 言語標準規格は C17 ですが、C17 は C11 の マイナーアップデートであるため、GCC 10 デフォルトの C11 とは 互換性があります。 C++ はどちらも C++14 です。 C も C++ もデフォルトで GNU 拡張が有効です。
(-std=gnu11 or -std=gnu++14)
GCC 10 で増えた以下のヘッダは Clang では未サポートとなります。
arm_bf16.h
arm_cde.h
arm_cmse.h
arm_fp16.h
arm_mve.h
arm_mve_types.h
新規サポートターゲット
Cortex-M3 (ARMv7-M)
Cortex-R4(F)/R52(F) (ARMv7-R / VFPv3)
libc: NetBSD 7.0 -> NetBSD 9.1.
NetBSD の libc は枯れているので、既存の部分はほとんど変わっていません。 7.0 では C11 対応が甘かったため、KMC が独自に実装したり、バグやコンパイル エラーを修正していたものの大半が 9.1 では修正されていたので、リベース。
新規サポート関数
math.h
fma, fmaf, fmal
非標準関数(サポート外)
stdio.h
open_memstream
open_wmemstream
stdlib.h
reallocarr
reallocarray
strtonum
string.h
strchrnul
strnstr
wcsnlen
perror/strerror(_r) に不正なエラー番号が渡された場合に不正メモリアクセス が発生するのを修正。
asctime/strftime に不正な struct tm が渡された場合に不正メモリアクセス が発生するのを修正。また asctime_r に不正な struct tm が渡された場合、 通常の 26 文字以上のバッファが使用される可能性がある(最大 68 バイト) ので、struct tm の内容をチェックするか、十分に大きなバッファを渡して ください。
errno.h と perror/strerror(_r) の不整合を修正。
FAST_SPEED マクロを廃止。
libstdc++ の ostringstream に浮動小数点数を渡して文字列に変換しようと すると std::setlocale(LC_NUMERIC, 0) が NULL を返し、NULL 参照が発生して 例外が発生する不具合を修正。同様の問題を防ぐため setlocale() は常に "C" を返すように修正(一切 current locale を変更しません)。
osemu.h を非公開に変更。(source/ 以下に移動。)
kwin32.h を公開ヘッダに変更。(sys/_vlink_syscalls.h)
libc_tiny
SSP 有効時に gets のエイリアス __gets が存在しないためリンクエラーになる 不具合を修正。
(v)snprintf(buf, n, ...) の buf に NULL、または n に 0 が渡された場合に 不正メモリアクセスが発生するのを修正。
scanf 系関数の [(^)文字列] 書式を使用するとスタックオーバーフローが発生する 不具合を修正。
libcompiler_rt
*vfp 関数が hard/softfp のライブラリ中に存在しない不具合を修正。 (s004、s005 でリグレッション。)
この関数はライブラリ仕様には存在しますが、おそらく実際には使用されないので 影響は無いと思われます。
非互換性
セットアップツールから以下の define を削除。
__USE_VFP, __MSL_NO_IO_SUPPORT__, __$GCC_CPU$__
s005¶
armcc に似た stdio 等の排他制御スタブを実装しました。
libgcc の一部にも使用されます。
詳細は sourcemutex_stub.c を参照してください。
SOLID の DLL をサポート。
位置独立な libXXX_s.a ライブラリ、specs ファイル、リンカスクリプトを追加。
s は shared の意味で、Linux などでは libgcc_s.so のような拡張子になりますが
SOLID の DLL では static link なので .a です。
SOLID IDE のためのファイルを追加。(platform/)
libc
__aeabi_memset を __aebi_memset と typo していたバグを修正。
localtime(_r) の tm_mday と tm_yday のバグを修正。
C11 の aligned_alloc を追加。
GNU sed を追加し、makefile を簡略化。
misc
man/library_overview_ja.xls を xlsx 形式に変更。
bin/gnu_demangle(64).dll を削除。
ctime/gmtime/localtime/mktime/utime のエラーハンドリングを修正。
random_device の runtime_error を修正(生成するのは疑似乱数なので仕様的には変わらず未サポートとなります。)
Clang の内部的な変更。(IDE 内部でのみ使用。)
ベアメタル環境対応のための新規ターゲットサポート
Cortex-M4/M4F (ARMv7-M / FPv4-SP-D16-M)
Cortex-M7/M7F (ARMv7-EM / FPv5-DP-D16-M)
Cortex-R5/R7/R8 (ARMv7-R)
省メモリ環境向けのコンパクトな libc、libc_tiny をサポート。
制限
C89 までサポート。
ASCII のみ。
wchar 未サポート。
locale は "C" のみ。
VLINK(stdio.h)はあくまでもデバッグ用でマルチスレッド未サポート。
malloc は簡素な K&R malloc で、メモリが断片化するほどの頻繁 な使用は想定していません。
C++ を使えるような環境に向けたものではないので、非推奨。
libc と libgcc 以外のライブラリとの互換性は保たれています。(上記サポート仕様外の関数はダミー実装で正常動作しません。)
使用方法
コンパイル時に -D_USE_LIBC_TINY を指定。
リンク時に
-specs=%GCCDIR%\lib\%GCC_DEFAULT%\tiny.specs
を指定。明示的に指定する場合のライブラリ名は libc_tiny.a と libgcc_tiny.a (-lc_tiny -lgcc_tiny)
s002¶
ソフトウェアアップデート
GCC 4.9.4 -> 6.4.0
GMP 6.1.2
MPFR 3.1.5 -> 4.0.1
MPC 1.0.3 -> 1.1.0
libiconv 1.14 -> 1.15
libelf 0.8.13
binutils 2.27 -> 2.28.1
GDB 7.12.1 -> 8.1
termcap 1.3.1
GNU make 4.2.1
Clang 4.0.0 -> 6.0.0
C は gnu11、 C++ は gnu++14 規格がデフォルトになりました。(GCC 4.x までは gnu89、gnu++98 がデフォルト。)
列挙型が 32 bit 固定になりました。(-fno-short-enums)
float-abi=hard をサポートしました。
fstat() に fd として stdin/stdout/stderr を渡した時にメモリアクセス違反が発生する不具合を修正しました。
(fwrite() など、fstat() を内部で使用する stdio.h のファイル関連関数にも影響があります。)
time.h
欠けていた標準関数を実装しました。
未サポートの関数をヘッダからコメントアウトしました。
time_t の開始年を DOS Time (1980) から UNIX Time (1970) に変更しました。
stat, fstat, lstat, utime のタイムスタンプ(秒の値)が正しくない不具合を修正しました。(MS-DOS 形式の秒の値は 2 で割った値でした。)
stdout が常にバッファリングされてしまい 'n' が来ても fflush() されない不具合を修正しました。
stdio が常にリンクされコードサイズが肥大してしまう不具合を修正しました。
dlmalloc の malloc_stats() は fprintf() を使用するため廃止されました。
abort() 内部の fprintf() を write() に置き換えました。
write() 内部の printf() を削除しました。
stdio を使用する ssp ライブラリを libc から分離しました。
不要な関数、データの削除
VLINK 有効時
ファイルの最大 open 数(_FD_MAX) を 100 から 20 に削減しました。
_LF_flg を廃止しました。ロングファイルネームサポートは常に有効です。
(変数自体は残っているので既存の crt との互換性は保たれています。)
その他(内部実装)
arm_neon.h を Clang で使用するとエラーになる問題を修正しました。
整数型のみサポートする
*iprintf/*iscanf
関数を追加しました(newlib 拡張)詳細は stdio.h を参照してください。
ただし、これは C99 までの仕様をフルサポートするため、スタック消費量がほとんど変わらず、内部で malloc() も使用するため、省メモリ環境においては SOLID が提供する同名の機能制限版関数の使用を推奨します。(SOLID とは別に、newlib との互換性のために追加された関数。)
s001¶
最初のリリース。
ツールチェーン更新履歴 (AArch64)¶
基本的には ARM 版と同じなので、差分のみを記載します。
詳細は readme を参照してください。
s006¶
s005¶
ARM s005 とバージョン番号とソースツリーを統一。
そのため AArch64 の s004 はスキップされ存在しません。
libc
memmove のアセンブラコードが large code model 未対応だったのを修正。
libc_tiny
AArch64 は libc_tiny(省メモリ環境向けのコンパクトな libc)をサポートしません。
s003¶
large code model をサポート。
Clang の内部的な修正。(生成コードに変化はありません。)