ライブラリの仕様(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.h feraiseexcept() は例外を発生させません。

  • stdio.hprintf() やファイル関係の関数、 tmpnam() など。

  • stdlib.hgetenv(), setenv() など。

    system() は未サポート。

  • time.hclock(), 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.hfegetround() で現行の丸めモードを取得してください。

  • long double

    math.h, complex.h ヘッダの *l 関数など。

    例: long double sinl(long double x)

    nexttoward(), nexttowardf(), nexttowardl()

  • C11

    • uchar.h

    • time.h

      struct timespec, timespec_get()

    • stdio.h

      fopen() 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.alibgcc_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.h feraiseexcept() は例外を発生させません。

  • stdio.hprintf() やファイル関係の関数、 tmpnam() など。

  • stdlib.hgetenv(), setenv() など。

    system() は未サポート。

  • time.hclock(), 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 ヘッダの XXXl 関数など。

    例: long double sinl(long double x)

    nexttoward(), nexttowardf(), nexttowardl()

  • C99

    • math.h

      fma(), fmaf(), fmal()

  • C11

    • uchar.h

    • time.h

      struct timespec, timespec_get()

    • stdio.h

      fopen() 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.alibgcc_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.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" のみサポート

XXX_l (locale) 関数は、対応する ``XXX 関数と同じ挙動となります。

OS の機能を使用するような関数は、ターゲットのサポートに依存。

以下は VLINK 有効時にサポートされる仕様。

  • signal.h はダミー関数です。

    signal(), raise()

  • stdio.hprintf() やファイル関係の関数、 tmpnam() など。

  • stdlib.hgetenv(), setenv() など。 system() は未サポート。

  • time.hclock(), 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.h

    fma(), fmaf(), fmal()

  • C11

    uchar.h

    time.h

    struct timespec, timespec_get()

    stdio.h

    fopen() 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 エンコーディングしたものとなります 。