aboutsummaryrefslogtreecommitdiffhomepage
Commit message (Collapse)AuthorAgeFilesLines
* c: fix a silly C edge case with function redeclaration storage classlemon2025-12-201-14/+21
| | | | | | C (or at least clang and gcc) allows declaring `static int f(...);` and defining it later as `int f(...) {...}`, omitting the 'static' in the latter definition.
* copyopt: optimize same-arg phis with multiple predslemon2025-12-201-2/+6
|
* lexer: fix remnant use of TKEOF for characterlemon2025-12-201-9/+7
|
* quit after emitting too many errorslemon2025-12-201-0/+5
|
* optimize lexer a bit morelemon2025-12-204-68/+100
|
* lexer: convert pp-idents to keywords only after preprocessinglemon2025-12-202-71/+75
|
* ir/regalloc: struct alloc -> union alloclemon2025-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: shellchecklemon2025-12-201-11/+10
|
* x86-64: peephole optimization for 3-address shift -> lealemon2025-12-202-1/+15
|
* c.h init zero bitset portabilitylemon2025-12-191-1/+1
|
* driver: -w, update helplemon2025-12-193-2/+9
|
* c: support 0-length arrays as syntax for flexible array memberslemon2025-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.clemon2025-12-195-31/+30
|
* c: fix incr/decr codegen for floatslemon2025-12-191-2/+2
|
* isel: fix wrong instr cls being used in some caseslemon2025-12-191-2/+2
| | | | Specifically comparisons where operation cls != result cls
* c: hack to support __FUNCTION__ GNU extensionlemon2025-12-191-4/+10
|
* cpp: GNU extension for named variadic argumentslemon2025-12-182-4/+11
|
* cpp: better error recovery for #define syntax errorlemon2025-12-181-6/+7
|
* x86-64 abi: fix wrong class being used in float vararglemon2025-12-181-1/+1
|
* ir: move cls2load to interfacelemon2025-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 prefixeslemon2025-12-181-2/+2
|
* regalloc+emit: get rid of xsave/xrestore hacklemon2025-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 moveslemon2025-12-181-29/+34
|
* x86_64: for vararg calls, write to EAX in isellemon2025-12-183-22/+30
| | | | Also, in regalloc ensure fixed intervals are sorted
* c: fix uninitiliazed field in decltypeslemon2025-12-171-0/+1
|
* nicer defaults and facilities for cross-compilationlemon2025-12-177-32/+195
|
* emit: don't put the exit block always at the end of the functionlemon2025-12-171-1/+6
|
* x86-64/emit: implement single-exit-point ret with jump threadinglemon2025-12-163-26/+40
|
* bitset: better implementation of bsiter() and stufflemon2025-12-163-11/+17
| | | | Also changed the type to size_t for portability
* mem2reg: fix obvious inefficiencylemon2025-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 diagnosticslemon2025-12-152-14/+24
|
* create distinct interned string typelemon2025-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.clemon2025-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 loopslemon2025-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 recursionlemon2025-12-151-7/+8
| | | | | This uncovered a edgecase with loops and lifetime construction in regalloc!
* lexer: use a hashmap to lookup keywordslemon2025-12-153-28/+29
|
* c: error when defining function with incomplete parameter typelemon2025-12-151-0/+4
|
* c: support forward-declared enumslemon2025-12-154-48/+50
| | | | This is a common non-standard GNU extension.
* test/c-testsuite.shlemon2025-12-153-6/+5
|
* c: emit data for __func__ lazilylemon2025-12-151-15/+16
|
* c: fix another memory-leak-when-errors caselemon2025-12-141-1/+2
|
* c: as a hack, warn for zero-length array instead of errorlemon2025-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 vacopylemon2025-12-141-5/+6
|
* x86_64/emit: handle pseudo subtraction used for cmplemon2025-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 andlemon2025-12-141-3/+5
| | | | signed/unsigned char pointer
* c: fix memory leak if initializer data if errorlemon2025-12-141-1/+1
|
* eval: long double placeholderlemon2025-12-141-1/+2
|
* cpp: support #line directiveslemon2025-12-143-28/+137
|