exeGCC for SOLID s005(AArch64)ライブラリ仕様¶
本文章は s007 のリリース時に、遡ってアップデートされました。後から判明した機能制限(未実装)など、s005 リリース当時のドキュメントには記載されていない情報も含まれています。
ライブラリの共通設定¶
全てのライブラリは以下の設定でビルドされています。
char型は signed。(-fsigned-char)large code model(
-mcmodel=large)
C11/C++14 標準関数サポート¶
libc と libm は NetBSD-7.0 ベース
注釈
非標準の関数や BSD 独自の関数は、過去の exeGCC との互換性やライブラリ内部で使用している等の理由により存在していますが、サポート範囲外となります。もし必要な場合は自己責任で使用してください。ヘッダには存在しますが、実体が存在しない関数も多数あります。
KMC による標準関数の実装
abort(),exit(),perror(),setjmp(),longjmp(),strerror(),strerror_r(),signal(),raise()time.hclock(),difftime(),mktime(),time(),asctime(),ctime(),ctime_r(),gmtime(),localtime(),localtime_r(),strftime()time_tは 64 bit です。clock()はダミー実装です。初回の呼び出しは必ず 0 になり、2 回目以降は 10msec 精度カウンタの前回呼び出し時との差分を返します。time_tはうるう秒未考慮です。タイムゾーン未考慮(UTC のみ、常に GMT=UTC)なため、デバッグ時のみご利用ください。
ロケールは
"C"のみサポート*_l(locale) 関数は、対応する_lの無い関数と同じ挙動となります。OS の機能を使用するような関数は、VLINK 有効時のみサポート
signal.hはダミー関数です。signal(),raise()__SOFTFP__時fenv.hferaiseexcept()は例外を発生させません。stdio.hのprintf()やファイル関係の関数、tmpnam()など。stdlib.hのgetenv(),setenv()など。system()は未サポート。time.hのclock(),time(),utime()以下の非標準関数(KMC による実装)
rename(),getcwd(),getwd(),open(),creat(),close(),lseek(),read(),write(),unlink(),tell(),dup(),dup2(),access(),chdir(),rmdir(),findfirst(),findnext(),stat(),fstat(),lstat(),mkdir(),chmod(),mktemp(),sleep(),usleep()stat(),fstat(),lstat(),utime()の制限MS-DOS Data and Time (
FILETIME) を使用しているので、保証されるのは 1980/1/1-2107/12/31 の範囲です。usleep()の制限millisecond 精度です。
未サポートの機能¶
GCC の
float.hの制限でFLT_ROUNDSは常に 1 (nearest) となります。fenv.hのfegetround()で現行の丸めモードを取得してください。SVE 拡張
long doublemath.h,complex.hの*l関数など。例:
long double sinl(long double x)nexttoward(),nexttowardf(),nexttowardl()C99
math.hFP_FAST_FMA,FP_FAST_FMAF,math_errhandling,MATH_ERRNO,MATH_ERREXCEPT
C11
uchar.htime.hstruct timespec,timespec_get()stdio.hfopen()mode"x"Remove
gets()Annex F/G/K/L [Optional]
stdlib.haligned_alloc(s002 readme 未記載。)
C++11
randomrandom_device
マルチスレッド
C11
stdatomic.h,thread.h[Optional]C++
auto_ptrは C++11 以降非推奨のため未サポート扱いC++11
atomic,thread,mutex,future,condition_variableshared_ptrはスレッドアンセーフC++14
shared_mutexweak_ptrの lock() はスレッドアンセーフTLS (Thread Local Storage)
GCC 拡張の
__thread, C11 の_Thread_local, C++11 のthread_localキーワード
PCH (PreCompiled Header)
LTO (Link Time Optimization)
ワイド文字(列)の扱いについて¶
ワイド文字型 wchar_t は 4 バイト(UTF32LE)です。(GCC/Clang の仕様)
C11 の uchar.h は未サポートです。
ワイド文字列リテラル L"..." と C11 の U"..." は同じ意味となり、-fexec-charset オプションによる文字集合指定とは無関係に、必ず UCS4 (Unicode) コードポイントの配列になります。
注釈
つまり、仮に -fexec-charset=cp932 を指定したとしても、JIS X 0208 のコードポイント配列にはならないため、ワイド文字列リテラルをソースコード中に直接記述することはできません。これは GCC の仕様です。Clang はそもそも -finput-charset/-fexec-charset オプション未サポートなので、常に UCS4 文字集合を UTF-8/32 エンコーディングで扱う仕様となります。
ライブラリがサポートするロケールは "C" のみですが、マルチバイト文字列(mbs)とワイド文字列(wcs)を変換する際に必要となる、LC_CTYPE のみ、"C", "utf-8", "cp932" が指定可能です。デフォルトの LC_CTYPE は "C" となります。UTF-8(ASCII の範囲外の文字)を使用する場合は setlocale(LC_CTYPE, "utf-8") 呼び出しが mbs/wcs 系関数を呼び出す前に必要です。
以下がサンプルコードになります。