summaryrefslogtreecommitdiff
path: root/PATCHES.md
diff options
context:
space:
mode:
authorclaude <[email protected]>2026-07-12 01:19:32 +0000
committerclaude <[email protected]>2026-07-12 01:19:32 +0000
commita4dce7f4d920e492d38c32ad3e42efdcfef3b3f1 (patch)
treeb0a0ad513792f5c0ddc524d67f6ab89e2044c642 /PATCHES.md
downloadplan9-kencc-linux-a4dce7f4d920e492d38c32ad3e42efdcfef3b3f1.tar.gz
plan9-kencc-linux-a4dce7f4d920e492d38c32ad3e42efdcfef3b3f1.zip
🌭 plan9-kencc-linux: кросс-тулчейн Plan9 (cc/as/ld) + EFI-болванка
- build_arch.sh / build_al.sh: сборка kencc-компиляторов, ассемблеров, линкеров всех арок (5/6/8/v/q/k) на Linux-хосте через plan9port. - патчи под musl/gcc: sbrk->mmap, round/log2->p9*, Runemask, swcmp const, -fcommon, machcap/omachcap, /sys рантайм-файлы. Подробно в PATCHES.md. - bin/: готовые 8c 6c 5c vc qc kc + 6a 6l (Linux/musl x86_64). - efi/: болваночный bootx64.efi (PE32+) тем же тулчейном (6a+6c+6l+dd), референс — 9legacy nboot/efi; ESP-образ через mkesp.py. Co-Authored-By: Claude Opus 4.8 <[email protected]>
Diffstat (limited to 'PATCHES.md')
-rw-r--r--PATCHES.md58
1 files changed, 58 insertions, 0 deletions
diff --git a/PATCHES.md b/PATCHES.md
new file mode 100644
index 0000000..f8b20aa
--- /dev/null
+++ b/PATCHES.md
@@ -0,0 +1,58 @@
+# Патчи под сборку kencc на Linux-хосте
+
+Все правки автоматически накладываются `scripts/build_arch.sh` и `build_al.sh`
+на свежие копии исходников (оригинальное дерево не трогается). Ниже — что и зачем.
+
+## 1. `round` / `log2` → `p9round` / `p9log2`
+`cc/` определяет свои `round()` и `log2()`, конфликтующие по типу с прототипами
+из musl `math.h`. Переименовываем определения и вызовы во всех файлах (и в
+сгенерённом `y.tab.c`). Файлы: `cc/dcl.c`, `cc/pgen.c`, `cc/sub.c`, `cc/cc.h`,
+`Xc/swt.c`, `Xc/cgen.c`.
+
+## 2. Порядок и единичность `#include "y.tab.h"`
+`y.tab.h` (генерит yacc) использует тип `Node`, объявленный в `cc.h`, и не имеет
+include-guard. Значит: включать строго ПОСЛЕ `cc.h` и ровно один раз (иначе
+конфликт переопределения `YYSTYPE`/`yylval`). В свежем `lex.c` порядок уже
+верный — правка нужна была только при ручной возне.
+
+## 3. Плоская раскладка include
+Исходники ссылаются на соседние каталоги: `#include "../cc/cc.h"`,
+`"../6c/6.out.h"`, `"../8l/elf.h"`, extension-less `"compat"`, `"macbody"`,
+`"lexbody"`. Складываем всё в один каталог сборки и срезаем `../*/` из include.
+Extension-less файлы копируем явно.
+
+## 4. `Runemask`
+Плановская libc-константа `Runemask` (маска 21-битной руны) есть в родной Plan9,
+но НЕ в plan9port. Добавляем `#define Runemask 0x1FFFFF` в `lex.c`.
+
+## 5. Прототип `swcmp` → `const`
+`swcmp` — компаратор для `qsort`. У musl сигнатура `int(const void*, const void*)`,
+а плановский прототип в `gc.h` — `int(void*, void*)`. Приводим прототип к `const`.
+
+## 6. `-fcommon`
+Старый код держит tentative-дефиниции глобалов (напр. `hintabsize` в нескольких
+`.c` через общий `gc.h`). Современный gcc по умолчанию `-fno-common` и ругается на
+multiple definition. Компилируем с `-fcommon` (как раньше).
+
+## 7. `mysbrk`: `sbrk()` → `mmap()` ← ключевой
+Hunk-аллокатор kencc берёт память через `mysbrk` → `sbrk()`. На musl `sbrk()`
+возвращает `-1` (не поддерживается совместно с malloc), из-за чего `gethunk()`
+падал в «out of memory» → `exits`, причём диагностика уходила в неинициализированный
+Bio-буфер и терялась (компилятор молча выходил с кодом 1). Заменяем тело `mysbrk`
+на анонимный `mmap`. Без этого патча компиляторы линкуются, но не компилируют.
+
+## 8. Дубликат `machcap` / `omachcap`
+`cc/omachcap.c` (старый machcap) и `Xc/machcap.c` (новый) оба определяют `machcap`.
+В родной сборке `omachcap.o` дремлет в архиве `cc.a` и не тянется. У нас — линкуем
+плоско, поэтому: если у арки есть свой `machcap.o` (6c/8c/qc) — выкидываем
+`omachcap.o`; если нет (5c/vc/kc) — `omachcap.o` и предоставляет `machcap`.
+
+## 9. Плановские рантайм-файлы вон
+Файлы вроде `Xc/sys.c` тянут `#include "/sys/src/libc/9syscall/sys.h"` — это
+рантайм ОС, не часть компилятора, и в `OFILES` mkfile их нет. Выкидываем любые
+`.c` с include по абсолютному `/sys/...`.
+
+## 10. Авторитетность `cc/` при конфликте имён (kc)
+У `kc` завалялся собственный устаревший `bits.c`, использующий уже вырезанный из
+plan9port форматный тип `Fconv`. Копируем `cc/`-файлы ПОСЛЕ арочных, чтобы общий
+`cc/bits.c` (новый fmt API) побеждал.