summaryrefslogtreecommitdiff
path: root/PATCHES.md
blob: f8b20aa2e46cf704314f4abecbc13b1a05a589ea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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) побеждал.