diff options
Diffstat (limited to 'PATCHES.md')
| -rw-r--r-- | PATCHES.md | 58 |
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) побеждал. |
