diff options
| author | kx <kx@radix-linux.su> | 2026-10-12 10:22:27 +0300 |
|---|---|---|
| committer | kx <kx@radix-linux.su> | 2026-10-12 10:22:27 +0300 |
| commit | b4112b093b6f58512f7ce9992e0891515831ca57 (patch) | |
| tree | d78b7cd151863fb98ee3c6c9a8fc3121d05b2e51 /doc/mcpu-cpp-ru.md | |
| parent | 4bc055294368e4dd4fda491dfd97772e8e88fc35 (diff) | |
| download | mcpu-cpp-b4112b093b6f58512f7ce9992e0891515831ca57.tar.xz | |
HOST machine-dependent predefined macros
Diffstat (limited to 'doc/mcpu-cpp-ru.md')
| -rw-r--r-- | doc/mcpu-cpp-ru.md | 72 |
1 files changed, 51 insertions, 21 deletions
diff --git a/doc/mcpu-cpp-ru.md b/doc/mcpu-cpp-ru.md index 662ff2c..f3884da 100644 --- a/doc/mcpu-cpp-ru.md +++ b/doc/mcpu-cpp-ru.md @@ -1274,6 +1274,10 @@ frontend/driver, его version contract будет определён отдеÐ проверенные приёмы из `LibMPU`/`LibMPUIO` `acsite.m4`: GCC predefined macros определяют native type sizes, byte/word order и machine-register width, а установленный `<libmpu.h>` является окончательным источником настроек LibMPU. +Эти проверки GCC и LibMPU описывают среду сборки HOST, но не целевой MCPU ABI. +Источником истины для MCPU ABI служат архитектура LibMCPU и её ABI-контракты; +предопределённые макро, зависящие от HOST, не должны определять или изменять +разрядности целевых типов, представление указателей и правила вызовов. В частности, фиксируются и проверяются: @@ -1355,7 +1359,7 @@ GNU/C-specific имя `__FLOAT_WORD_ORDER__` не определяется: ти Параметры LibMPU/MCPU environment публикуются в MCPU namespace: ```text -__MCPU_MACHINE_REGISTER_WIDTH__ +__MCPU_HOST_MACHINE_REGISTER_WIDTH__ __MCPU_REAL_IO_LIMIT__ __MCPU_MATH_FN_LIMIT__ __MCPU_INT_MAX_WIDTH__ @@ -1364,35 +1368,61 @@ __MCPU_COMPLEX_MAX_WIDTH__ ``` `__MCPU_INT_MAX_WIDTH__` равен `NB_I_MAX * 8`, а Real/Complex maximum width -равен configured `MPU_REAL_IO_LIMIT`. `__MCPU_MACHINE_REGISTER_WIDTH__` является -значением `BITS_PER_MACHINE_REGISTER` установленной LibMPU. Пределы Real I/O и +равен configured `MPU_REAL_IO_LIMIT`. `__MCPU_HOST_MACHINE_REGISTER_WIDTH__` является +значением `BITS_PER_MACHINE_REGISTER` установленной LibMPU и описывает HOST, +а не разрядность архитектурного регистра MCPU. Пределы Real I/O и math functions не смешиваются: `MPU_REAL_IO_LIMIT` определяет существование Real/Complex type family и text conversion, а `MPU_MATH_FN_LIMIT` — наличие математических функций соответствующей ширины. -### 8.6. MCPU size/ssize, `ptrdiff` и pointers +### 8.6. HOST machine size/ssize, `ptrdiff` и pointers -Будущий язык не наследует variable-width C names `short`, `int`, `long` и -не использует C-style имя `size_t` как часть собственного ABI. Беззнаковый -LibMPU size type и знаковый byte-count/error type публикуются симметрично в -MCPU namespace. Например для 64-bit configured profile: +Будущий язык не наследует variable-width C names `short`, `int`, `long`, а +HOST-типы C `size_t` и `ssize_t` не определяют целевой MCPU ABI. Следующие +девять предопределённых макро сообщают характеристики HOST-машины, на которой +работает виртуальный процессор MCPU: ```text -#define __MCPU_SIZE_TYPE__ uint64 -#define __MCPU_SIZE_WIDTH__ 64 -#define __MCPU_SIZEOF_SIZE__ 8 -#define __MCPU_SIZE_MAX__ 0xffffffffffffffff +__MCPU_HOST_MACHINE_REGISTER_WIDTH__ +__MCPU_HOST_MACHINE_SIZEOF_SIZE__ +__MCPU_HOST_MACHINE_SIZEOF_SSIZE__ +__MCPU_HOST_MACHINE_SIZE_MAX__ +__MCPU_HOST_MACHINE_SIZE_TYPE__ +__MCPU_HOST_MACHINE_SIZE_WIDTH__ +__MCPU_HOST_MACHINE_SSIZE_MAX__ +__MCPU_HOST_MACHINE_SSIZE_TYPE__ +__MCPU_HOST_MACHINE_SSIZE_WIDTH__ +``` + +Они **не являются источником истины для MCPU ABI**. Это дополнительные сведения +для гостевой программы. Например, разработчик языка высокого уровня может +осознанно выбрать целочисленный тип MCPU, совпадающий по знаковости и +разрядности с HOST `size_t` либо `ssize_t`. Такой выбор принадлежит конкретной +программе и не делает HOST-зависимыми указатели, целочисленную модель, память +или соглашение о вызовах MCPU. + +Если на HOST `size_t` и `ssize_t` имеют ширину 32 бита, размерные подсказки +содержат, в частности: + +```text +#define __MCPU_HOST_MACHINE_SIZE_TYPE__ uint32 +#define __MCPU_HOST_MACHINE_SIZE_WIDTH__ 32 +#define __MCPU_HOST_MACHINE_SIZEOF_SIZE__ 4 +#define __MCPU_HOST_MACHINE_SIZE_MAX__ 0xffffffff -#define __MCPU_SSIZE_TYPE__ int64 -#define __MCPU_SSIZE_WIDTH__ 64 -#define __MCPU_SIZEOF_SSIZE__ 8 -#define __MCPU_SSIZE_MAX__ 0x7fffffffffffffff +#define __MCPU_HOST_MACHINE_SSIZE_TYPE__ int32 +#define __MCPU_HOST_MACHINE_SSIZE_WIDTH__ 32 +#define __MCPU_HOST_MACHINE_SIZEOF_SSIZE__ 4 +#define __MCPU_HOST_MACHINE_SSIZE_MAX__ 0x7fffffff ``` -Это MCPU-specific family, а не попытка приписать GNU CPP несуществующий -стандартный `__SSIZE_*` contract. +На HOST с 64-битными `size_t` и `ssize_t` те же имена обозначают `uint64`/`int64`, +ширину `64`, размер `8` и соответствующие максимумы +`0xffffffffffffffff`/`0x7fffffffffffffff`. Ширина HOST-регистра определяется +независимо и не выводится из `size_t`. -MCPU pointer ABI от host не зависит: PTR64 всегда имеет ширину 64 бита: +MCPU pointer ABI **не зависит от HOST**: PTR64 всегда имеет ширину 64 бита, +включая HOST с 32-битным `size_t`: ```text #define __INTPTR_TYPE__ int64 @@ -1405,8 +1435,8 @@ MCPU pointer ABI от host не зависит: PTR64 всегда имеет ш #define __MCPU_POINTER_WIDTH__ 64 ``` -Разность MCPU pointers является знаковой и также фиксирована независимо от -host: +Разность MCPU pointers является знаковой и также имеет фиксированную +разрядность независимо от HOST: ```text #define __PTRDIFF_TYPE__ int64 |
