aboutsummaryrefslogtreecommitdiffhomepage
Commit message (Collapse)AuthorAgeFilesLines
* ir/regalloc: struct alloc -> union alloc lemon2025-12-201-16/+15
|
* c: factor out to tldecl(), improve error recovery, lemon2025-12-201-73/+97
|
* emit: fix errata in flagslivep() lemon2025-12-201-1/+1
| | | | This little typo inhibited a small optimization. Oops
* test/run.sh: shellcheck lemon2025-12-201-11/+10
|
* x86-64: peephole optimization for 3-address shift -> lea lemon2025-12-202-1/+15
|
* c.h init zero bitset portability lemon2025-12-191-1/+1
|
* driver: -w, update help lemon2025-12-193-2/+9
|
* c: support 0-length arrays as syntax for flexible array members lemon2025-12-191-19/+29
| | | | | Keeping the expr around in the decllist paves the way for VLA support later on
* ir: move some filluses() to ir.c, rename optmem.c -> mem2reg.c lemon2025-12-195-31/+30
|
* c: fix incr/decr codegen for floats lemon2025-12-191-2/+2
|
* isel: fix wrong instr cls being used in some cases lemon2025-12-191-2/+2
| | | | Specifically comparisons where operation cls != result cls
* c: hack to support __FUNCTION__ GNU extension lemon2025-12-191-4/+10
|
* cpp: GNU extension for named variadic arguments lemon2025-12-182-4/+11
|
* cpp: better error recovery for #define syntax error lemon2025-12-181-6/+7
|
* x86-64 abi: fix wrong class being used in float vararg lemon2025-12-181-1/+1
|
* ir: move cls2load to interface lemon2025-12-183-7/+7
| | | | | There's plenty of code duplication like this around I'm looking to reduce.
* x86-64/emit: remove some superfluous rex.W prefixes lemon2025-12-181-2/+2
|
* regalloc+emit: get rid of xsave/xrestore hack lemon2025-12-184-58/+64
| | | | | | | Was used for situation where we needed to spill more than 1 temporary and have to use a register that is already used. Instead of push/pop, we can just allocate and set aside specific stack slots for this purpose. Also, reworked linearscan() interval sets to separate FPR/GPR intervals.
* rega: implement stack<->stack swap for parallel moves lemon2025-12-181-29/+34
|
* x86_64: for vararg calls, write to EAX in isel lemon2025-12-183-22/+30
| | | | Also, in regalloc ensure fixed intervals are sorted
* c: fix uninitiliazed field in decltypes lemon2025-12-171-0/+1
|
* nicer defaults and facilities for cross-compilation lemon2025-12-177-32/+195
|
* emit: don't put the exit block always at the end of the function lemon2025-12-171-1/+6
|
* x86-64/emit: implement single-exit-point ret with jump threading lemon2025-12-163-26/+40
|
* bitset: better implementation of bsiter() and stuff lemon2025-12-163-11/+17
| | | | Also changed the type to size_t for portability
* mem2reg: fix obvious inefficiency lemon2025-12-161-16/+10
| | | | | | | deltrivialphis() was iterating over every variably instead of just looking at the variable being examined. And I'd been wondering why mem2reg was such a bottleneck for a testcase like sqlite3 amalgamation.. it's easy to miss the forest for the trees.
* c: improve some type error diagnostics lemon2025-12-152-14/+24
|
* create distinct interned string type lemon2025-12-1516-129/+131
| | | | | | | | | | | | | | Interned strings are used pervasively, so it's a good idea to add a layer of type safety to differentiate them from general cstrs and avoid potential bugs from comparing non-interned and interned strings. Not that that's happened so far that I can remember, but it could. I'm 90% sure it's legal to alias `struct {char c;}` pointers with `char` pointers. This specific typedef gives type safety but with a simple one-way `internstr -> const char *` typecast (with `&istr->c`). Converting the other way around is more intentional: a straight up cast `(internstr)cstr` which sticks out as unchecked and probably wrong, or calling the intern(cstr) function, which is the right way.
* move intern() to mem.c lemon2025-12-156-49/+52
| | | | | Being in lex.c was vestigial, since it was being used all over the frontend and backend.
* 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
|