ライブラリの仕様(ARM)
exeGCC for SOLID s006 ライブラリ仕様
ライブラリの共通設定
s006 ツールチェーンには様々なターゲット向けのライブラリが付属していますが、全てのライブラリは以下の設定でビルドされています。設定が異なるユーザープログラムとライブラリをリンクした際の動作は保証されません。-mno-unaligned-access 以外のオプションは必須です。
char型は signed。(-fsigned-char)列挙型は 4 または 8 バイト。(
-fno-short-enums)aligned data access。(
-mno-unaligned-access)C は
gnu11、 C++ はgnu++14規格。
C11/C++14 標準関数サポート
libc と libm は NetBSD-9.1 ベース
注釈
非標準の関数や BSD 由来の関数は、過去の exeGCC との互換性のためや、ライブラリ内部で使用している等の理由により存在していますが、サポート範囲外となります。必要な場合は自己責任で使用してください。ヘッダには存在しますが、実体が存在しない関数も多数あります。
KMCによる標準関数の実装
abort(),exit(),perror(),setjmp(),longjmp(),strerror(),strerror_r(),signal(),raise()
time.h
clock(),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" のみサポート
setlocale()は常に "C" を返し、一切 current locale を変更しません。
*_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()で現行の丸めモードを取得してください。long doublemath.h,complex.hヘッダの*l関数など。例:
long double sinl(long double x)nexttoward(),nexttowardf(),nexttowardl()C11
uchar.htime.hstruct timespec,timespec_get()stdio.hfopen()mode"x"Remove
gets()Annex * [Optional]
C++11
randomヘッダrandom_deviceマルチスレッド
C11
stdatomic.h,thread.hヘッダ [Optional]C++11
thread,mutex,future,condition_variableヘッダなど。TLS (Thread Local Storage)
GCC 拡張の
__thread, C11 の_Thread_local, C++11 のthread_localキーワード。PCH (PreCompiled Header)
LTO (Link Time Optimization)
省メモリ環境向けのコンパクトな libc_tiny
exeGCC 汎用版 r004 のコードベース。
使用は非推奨ですが、削除された
__vlink_init_osemu(),__vlink_init_vlink(),__vlink_init(),ecvt(),ecvt_r(),fcvt(),fcvt_r(),gcvt(),gcvt_r()が戻っています。string.hの locale が絡まない関数と VLINK のコードはデフォルトの libc と共通です。
制限
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)
ワイド文字(列)の扱いについて
ワイド文字型 wchar_t は 4 バイト(UTF-32 LE)です。(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 系関数を呼び出す前に必要です。
ワイド文字列からマルチバイト文字列への変換サンプル:
#include <locale.h> /* setlocale */
#include <stdlib.h> /* wcstombs */
/* ... */
wchar_t wcstr[] = L"この文字列は UCS4 文字集合を UTF-32 LE エンコーディングしたものとなります。";
int result;
char utf8buf[256];
/* 確認のため SOLID OS の syslog を使用します。 */
syslog_msk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_INFO));
result = wcstombs(utf8buf, wcstr, 256);
/* デフォルトの "C" = ASCII 範囲外の文字を含むため失敗します。*/
if (result < 0) {
syslog(LOG_INFO, "XFAIL: please setlocale()");
}
/* utf-8 に設定します。*/
syslog(LOG_INFO, "setlocale:%s", setlocale(LC_CTYPE, "utf-8"));
/* UTF-32 LE -> UTF-8 */
result = wcstombs(utf8buf, wcstr, 256);
if (result < 0) {
syslog(LOG_INFO, "FAIL");
} else {
syslog(LOG_INFO, "SUCC: %s", utf8buf);
}
TeraTerm (UTF-8) での出力例:
XFAIL: please setlocale()
setlocale:UTF8
SUCC: この文字列は UCS4 文字集合を UTF-32 LE エンコーディングしたものとなります 。
exeGCC for SOLID s005 ライブラリ仕様
ライブラリの共通設定
s005 ツールチェーンには様々なターゲット向けのライブラリが付属していますが、全てのライブラリは以下の設定でビルドされています。設定が異なるユーザープログラムとライブラリをリンクした際の動作は保証されません。-mno-unaligned-access 以外のオプションは必須です。
char型は signed。(-fsigned-char)列挙型は 4 または 8 バイト。(
-fno-short-enums)aligned data access。(
-mno-unaligned-access)C は
gnu11、 C++ はgnu++14規格。
C11/C++14 標準関数サポート
libc と libm は NetBSD-7.0 ベース
注釈
非標準の関数や BSD 由来の関数は、過去の exeGCC との互換性のためや、ライブラリ内部で使用している等の理由により存在していますが、サポート範囲外となります。もし必要な場合は自己責任で使用してください。ヘッダには存在しますが、実体が存在しない関数も多数あります。
KMCによる標準関数の実装
abort(),exit(),perror(),setjmp(),longjmp(),strerror(),strerror_r(),signal(),raise()
time.h
clock(),difftime(),mktime(),time(),asctime(),ctime(),ctime_r(),gmtime(),localtime(),localtime_r(),strftime()
time_tは 64 bit です。
clock()はダミー実装です。初回の呼び出しは必ず 0 になり、2 回目以降は 10msec 精度カウンタの前回呼び出し時との差分を返します。
time_tはうるう秒未考慮です。
ロケールは "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 精度です。
未サポートの機能
long doublemath.h,complex.hヘッダの XXXl 関数など。例:
long double sinl(long double x)nexttoward(),nexttowardf(),nexttowardl()C99
math.hfma(),fmaf(),fmal()
C11
uchar.htime.hstruct timespec,timespec_get()stdio.hfopen()mode"x"Remove
gets()Annex * [Optional]
C++11
randomヘッダrandom_deviceマルチスレッド
C11
stdatomic.h,thread.hヘッダ [Optional]C++11
thread,mutex,future,condition_variableヘッダ。TLS (Thread Local Storage)
GCC 拡張の
__thread, C11 の_Thread_local, C++11 のthread_localキーワード。
省メモリ環境向けのコンパクトな libc_tiny
exeGCC 汎用版 r004 のコードベース。
使用は非推奨ですが、削除された
__vlink_init_osemu(),__vlink_init_vlink(),__vlink_init(),ecvt(),ecvt_r(),fcvt(),fcvt_r(),gcvt(),gcvt_r()が戻っています。string.hの locale が絡まない関数と VLINK のコードはデフォルトの libc と共通です。
制限
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)
ワイド文字(列)の扱いについて
ワイド文字型 wchar_t は 4 バイト(UTF-32 LE)です。(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 系関数を呼び出す前に必要です。
ワイド文字列からマルチバイト文字列への変換サンプル:
#include <locale.h> /* setlocale */
#include <stdlib.h> /* wcstombs */
/* ... */
wchar_t wcstr[] = L"この文字列は UCS4 文字集合を UTF-32 LE エンコーディングしたものとなります。";
int result;
char utf8buf[256];
/* 確認のため SOLID OS の syslog を使用します。 */
syslog_msk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_INFO));
result = wcstombs(utf8buf, wcstr, 256);
/* デフォルトの "C" = ASCII 範囲外の文字を含むため失敗します。*/
if (result < 0) {
syslog(LOG_INFO, "XFAIL: please setlocale()");
}
/* utf-8 に設定します。*/
syslog(LOG_INFO, "setlocale:%s", setlocale(LC_CTYPE, "utf-8"));
/* UTF-32 LE -> UTF-8 */
result = wcstombs(utf8buf, wcstr, 256);
if (result < 0) {
syslog(LOG_INFO, "FAIL");
} else {
syslog(LOG_INFO, "SUCC: %s", utf8buf);
}
TeraTerm (UTF-8) での出力例:
XFAIL: please setlocale()
setlocale:UTF8
SUCC: この文字列は UCS4 文字集合を UTF-32 LE エンコーディングしたものとなります 。
exeGCC for SOLID s002 ライブラリ仕様
ライブラリの共通設定
s002 ツールチェーンには様々なターゲット向けのライブラリが付属していますが、全てのライブラリは以下の設定でビルドされています。設定が異なるユーザープログラムとライブラリをリンクした際の動作は保証されません。-mno-unaligned-access 以外のオプションは必須です。
char型は signed。(-fsigned-char)列挙型は 4 または 8 バイト。(
-fno-short-enums)aligned data access。(
-mno-unaligned-access)
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はうるう秒未考慮です。
- ロケールは
"C"のみサポート XXX_l (locale) 関数は、対応する ``XXX関数と同じ挙動となります。- OS の機能を使用するような関数は、ターゲットのサポートに依存。
以下は VLINK 有効時にサポートされる仕様。
signal.hはダミー関数です。signal(),raise()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 精度です。
未サポートの機能
long double
math.h,complex.hヘッダの*l関数など。例:
long double sinl(long double x)nexttoward(),nexttowardf(),nexttowardl()C99
math.hfma(),fmaf(),fmal()C11
uchar.htime.hstruct timespec,timespec_get()stdio.hfopen()mode"x"Remove
gets()Annex F/G/K/L [Optional]
C++11
randomヘッダrandom_deviceマルチスレッド
C11
stdatomic.h,thread.hヘッダ [Optional]C++11
thread,mutex,future,condition_variableヘッダ。TLS (Thread Local Storage)
GCC 拡張の
__thread, C11 の_Thread_local, C++11 のthread_localキーワード。
ワイド文字(列)の扱いについて
ワイド文字型 wchar_t は 4 バイト(UTF-32 LE)です。(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 系関数を呼び出す前に必要です。
ワイド文字列からマルチバイト文字列への変換サンプル:
#include <locale.h> /* setlocale */
#include <stdlib.h> /* wcstombs */
/* ... */
wchar_t wcstr[] = L"この文字列は UCS4 文字集合を UTF-32 LE エンコーディングしたものとなります。";
int result;
char utf8buf[256];
/* 確認のため SOLID OS の syslog を使用します。 */
syslog_msk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_INFO));
result = wcstombs(utf8buf, wcstr, 256);
/* デフォルトの "C" = ASCII 範囲外の文字を含むため失敗します。*/
if (result < 0) {
syslog(LOG_INFO, "XFAIL: please setlocale()");
}
/* utf-8 に設定します。*/
syslog(LOG_INFO, "setlocale:%s", setlocale(LC_CTYPE, "utf-8"));
/* UTF-32 LE -> UTF-8 */
result = wcstombs(utf8buf, wcstr, 256);
if (result < 0) {
syslog(LOG_INFO, "FAIL");
} else {
syslog(LOG_INFO, "SUCC: %s", utf8buf);
}
TeraTerm (UTF-8) での出力例:
XFAIL: please setlocale()
setlocale:UTF8
SUCC: この文字列は UCS4 文字集合を UTF-32 LE エンコーディングしたものとなります 。