aboutsummaryrefslogtreecommitdiffhomepage
Commit message (Collapse)AuthorAgeFilesLines
* regalloc: fix lifetime construction for nested loops lemon2025-12-151-17/+34
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Previously, given something like ``` 1 a = ... 2 loop { // outer 3 b = do something with a 4 loop { // inner 5 ... 6 if (b < 0) 7 break 'inner; 8 if (b == 0) 9 return; 10 ... 11 } 12 } ``` Regalloc thought outer goes from 2..6, because 6 is the last place where flow jumps directly back to 2. So `a` would have the lifetime [1,7). However if neither the break nor return are taken, the inner loop repeats and then control could flow back to 7 -> 3. But now the physical location for `a` might have been clobbered between 8..10, which is wrong. This fixes that by making sure the outer loop is considered to span 2..10. The way I went about it might not be the best way of doing it. I'm not 100% certain that it's fully correct and will always find the correct loopend, either. It's surprising it took this long to hit this edge case.
* lex: loop with goto instead of tail recursion lemon2025-12-151-7/+8
| | | | | This uncovered a edgecase with loops and lifetime construction in regalloc!
* lexer: use a hashmap to lookup keywords lemon2025-12-153-28/+29
|
* c: error when defining function with incomplete parameter type lemon2025-12-151-0/+4
|
* c: support forward-declared enums lemon2025-12-154-48/+50
| | | | This is a common non-standard GNU extension.
* test/c-testsuite.sh lemon2025-12-153-6/+5
|
* c: emit data for __func__ lazily lemon2025-12-151-15/+16
|
* c: fix another memory-leak-when-errors case lemon2025-12-141-1/+2
|
* c: as a hack, warn for zero-length array instead of error lemon2025-12-141-1/+1
| | | | | Treated as unsized array T[]. This shows up in some linux headers as a non-standard way to have flexible array members.
* c/builtin: fix vacopy lemon2025-12-141-5/+6
|
* x86_64/emit: handle pseudo subtraction used for cmp lemon2025-12-141-0/+2
| | | | Isel had this forever, but the matching code for it in emit wasn't there
* c: allow implicit type conversions between plain char pointer and lemon2025-12-141-3/+5
| | | | signed/unsigned char pointer
* c: fix memory leak if initializer data if error lemon2025-12-141-1/+1
|
* eval: long double placeholder lemon2025-12-141-1/+2
|
* cpp: support #line directives lemon2025-12-143-28/+137
|
* cpp: correctly handle extra tokens after directives lemon2025-12-141-16/+21
|
* only put dats can in .text now when emitting it lemon2025-12-143-5/+5
|
* various relocation related optimization lemon2025-12-146-56/+78
| | | | | | | | | | With 59ca5a8db, querying if a symbol is defined is cheap. If we're compiling code that calls foo() and we defined foo() in this compilation unit, we already know its offset within the .text section, so use it instead of emitting a relocation for the linker to handle. Also, put small literal data in the .text section instead of .rodata. This seems to improve performance (cache locality?), and as a bonus, it will be good for aarch64's instr encoding with smallish PC-relative offsets.
* elf: use a hashmap for looking up symbols lemon2025-12-142-32/+52
| | | | | Gets rid of linear-time findsym(), though needs some extra indirection to emit sorted symbols.
* kill fred lemon2025-12-132-2/+1
|
* add c-testsuite lemon2025-12-13912-0/+9205
|
* c: handle more static eval edgecases for int -> ptr lemon2025-12-133-5/+29
| | | | | sqlite3 was falling back to `((void*)&((char*)0)[X])` for INT_TO_PTR, which this handles now.
* c: case/default labels only create new blocks when necessary lemon2025-12-131-7/+11
|
* regalloc: fixbug with phi move of stack <- stack lemon2025-12-132-6/+5
|
* Add -O optimization flag lemon2025-12-134-2/+15
|
* fix position independent loads of function symbols. lemon2025-12-139-26/+48
| | | | | | | | For `extern int x[1];`, can use PCREL32 for &x. But for `extern int x(int)`, must use GOTREL, when not being called directly (that's PLT). Therefore the type of an external symbol (actually just whether it denotes a function) matters when deciding what kind of relocation to emit, so keep that information.
* test/14 lemon2025-12-131-0/+12
|
* x86-64/emit errata lemon2025-12-121-7/+4
|
* x86_64: fix erroneous encoding of index reg in no-pie situations lemon2025-12-121-11/+1
|
* s/amd64/x86_64/ lemon2025-12-1210-20/+20
|
* emit: turn ADD -imm into SUB imm lemon2025-12-121-1/+5
|
* isel: fix bug where sub turned into add, but inplace didn't reflect lemon2025-12-121-2/+2
|
* c: switch stmt diagnostics lemon2025-12-121-8/+49
| | | | For duplicate cases, case value overflow
* amd64/emit: change instr desc table a little lemon2025-12-121-157/+158
|
* lex: use pmap for macro lookup lemon2025-12-124-134/+100
| | | | To reduce hashmap code repetition. Also add pmap_del for this purpose
* rename arraylength macro -> countof lemon2025-12-1115-106/+106
|
* default to C11 lemon2025-12-111-1/+1
|
* c: accept C99 `[static N]` style array decls, changes to fn quals lemon2025-12-115-61/+56
| | | | | | Function parameters qualifiers don't matter outside of function definition. `int (const int)` should be compatible with `int(int)` etc. So no need to store them in the typedata.
* _Alignof and stuff lemon2025-12-115-13/+53
|
* c: use a look-up table for isdecltok() lemon2025-12-111-14/+18
|
* -trigraphs option lemon2025-12-112-3/+5
|
* c: optimize environment decl lookup lemon2025-12-111-6/+26
| | | | | Use a hashmap for the toplevel, optimizing for the common use case where the file-scope has many more declarations than local scopes do
* c: disallow mismatched nested extern decl, & more diagnostics lemon2025-12-111-17/+24
|
* c: support for noreturn, and decl parsing cleanup lemon2025-12-115-110/+119
|
* driver: add -Werror lemon2025-12-113-1/+6
|
* fatal() make noreturn lemon2025-12-111-2/+8
|
* make fatal() _Noreturn lemon2025-12-112-2/+2
|
* lex/expr(): cleanup lemon2025-12-111-29/+29
|
* c: expr2reloc() change sig to return addend lemon2025-12-111-15/+12
|
* ir: bump MAXINSTR lemon2025-12-101-1/+1
|