| Commit message (Collapse) | Author | Age | Files | Lines | |
|---|---|---|---|---|---|
| * | backend: general simplification pass skeleton | 2025-12-20 | 4 | -2/+155 | |
| | | |||||
| * | c: support CRLF newlines | 2025-12-20 | 1 | -3/+11 | |
| | | |||||
| * | c: fix a silly C edge case with function redeclaration storage class | 2025-12-20 | 1 | -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 preds | 2025-12-20 | 1 | -2/+6 | |
| | | |||||
| * | lexer: fix remnant use of TKEOF for character | 2025-12-20 | 1 | -9/+7 | |
| | | |||||
| * | quit after emitting too many errors | 2025-12-20 | 1 | -0/+5 | |
| | | |||||
| * | optimize lexer a bit more | 2025-12-20 | 4 | -68/+100 | |
| | | |||||
| * | lexer: convert pp-idents to keywords only after preprocessing | 2025-12-20 | 2 | -71/+75 | |
| | | |||||
| * | ir/regalloc: struct alloc -> union alloc | 2025-12-20 | 1 | -16/+15 | |
| | | |||||
| * | c: factor out to tldecl(), improve error recovery, | 2025-12-20 | 1 | -73/+97 | |
| | | |||||
| * | emit: fix errata in flagslivep() | 2025-12-20 | 1 | -1/+1 | |
| | | | | | This little typo inhibited a small optimization. Oops | ||||
| * | test/run.sh: shellcheck | 2025-12-20 | 1 | -11/+10 | |
| | | |||||
| * | x86-64: peephole optimization for 3-address shift -> lea | 2025-12-20 | 2 | -1/+15 | |
| | | |||||
| * | c.h init zero bitset portability | 2025-12-19 | 1 | -1/+1 | |
| | | |||||
| * | driver: -w, update help | 2025-12-19 | 3 | -2/+9 | |
| | | |||||
| * | c: support 0-length arrays as syntax for flexible array members | 2025-12-19 | 1 | -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 | 2025-12-19 | 5 | -31/+30 | |
| | | |||||
| * | c: fix incr/decr codegen for floats | 2025-12-19 | 1 | -2/+2 | |
| | | |||||
| * | isel: fix wrong instr cls being used in some cases | 2025-12-19 | 1 | -2/+2 | |
| | | | | | Specifically comparisons where operation cls != result cls | ||||
| * | c: hack to support __FUNCTION__ GNU extension | 2025-12-19 | 1 | -4/+10 | |
| | | |||||
| * | cpp: GNU extension for named variadic arguments | 2025-12-18 | 2 | -4/+11 | |
| | | |||||
| * | cpp: better error recovery for #define syntax error | 2025-12-18 | 1 | -6/+7 | |
| | | |||||
| * | x86-64 abi: fix wrong class being used in float vararg | 2025-12-18 | 1 | -1/+1 | |
| | | |||||
| * | ir: move cls2load to interface | 2025-12-18 | 3 | -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 | 2025-12-18 | 1 | -2/+2 | |
| | | |||||
| * | regalloc+emit: get rid of xsave/xrestore hack | 2025-12-18 | 4 | -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 | 2025-12-18 | 1 | -29/+34 | |
| | | |||||
| * | x86_64: for vararg calls, write to EAX in isel | 2025-12-18 | 3 | -22/+30 | |
| | | | | | Also, in regalloc ensure fixed intervals are sorted | ||||
| * | c: fix uninitiliazed field in decltypes | 2025-12-17 | 1 | -0/+1 | |
| | | |||||
| * | nicer defaults and facilities for cross-compilation | 2025-12-17 | 7 | -32/+195 | |
| | | |||||
| * | emit: don't put the exit block always at the end of the function | 2025-12-17 | 1 | -1/+6 | |
| | | |||||
| * | x86-64/emit: implement single-exit-point ret with jump threading | 2025-12-16 | 3 | -26/+40 | |
| | | |||||
| * | bitset: better implementation of bsiter() and stuff | 2025-12-16 | 3 | -11/+17 | |
| | | | | | Also changed the type to size_t for portability | ||||
| * | mem2reg: fix obvious inefficiency | 2025-12-16 | 1 | -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 | 2025-12-15 | 2 | -14/+24 | |
| | | |||||
| * | create distinct interned string type | 2025-12-15 | 16 | -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 | 2025-12-15 | 6 | -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 | 2025-12-15 | 1 | -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 | 2025-12-15 | 1 | -7/+8 | |
| | | | | | | This uncovered a edgecase with loops and lifetime construction in regalloc! | ||||
| * | lexer: use a hashmap to lookup keywords | 2025-12-15 | 3 | -28/+29 | |
| | | |||||
| * | c: error when defining function with incomplete parameter type | 2025-12-15 | 1 | -0/+4 | |
| | | |||||
| * | c: support forward-declared enums | 2025-12-15 | 4 | -48/+50 | |
| | | | | | This is a common non-standard GNU extension. | ||||
| * | test/c-testsuite.sh | 2025-12-15 | 3 | -6/+5 | |
| | | |||||
| * | c: emit data for __func__ lazily | 2025-12-15 | 1 | -15/+16 | |
| | | |||||
| * | c: fix another memory-leak-when-errors case | 2025-12-14 | 1 | -1/+2 | |
| | | |||||
| * | c: as a hack, warn for zero-length array instead of error | 2025-12-14 | 1 | -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 | 2025-12-14 | 1 | -5/+6 | |
| | | |||||
| * | x86_64/emit: handle pseudo subtraction used for cmp | 2025-12-14 | 1 | -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 | 2025-12-14 | 1 | -3/+5 | |
| | | | | | signed/unsigned char pointer | ||||
| * | c: fix memory leak if initializer data if error | 2025-12-14 | 1 | -1/+1 | |
| | | |||||