| Commit message (Collapse) | Author | Age | Files | Lines | |
|---|---|---|---|---|---|
| * | x86-64: redzone optimization for leaf functions | 2026-03-27 | 1 | -2/+2 | |
| | | | | | Don't use frame pointer or explicitly modify stack pointer for these | ||||
| * | cpp: support directives within macro argument list | 2026-03-24 | 1 | -0/+11 | |
| | | | | | Undefined behavior by the standard but a GNU extension. | ||||
| * | 4f2fb9ba5f fix | 2026-03-23 | 1 | -1/+2 | |
| | | |||||
| * | <iso646.h>, test for libc headers | 2026-03-23 | 1 | -0/+48 | |
| | | |||||
| * | tests: don't rely on unportable %p output | 2026-03-23 | 2 | -7/+11 | |
| | | |||||
| * | aarch64: rem/urem, bswap*, arg bugfix | 2026-03-22 | 1 | -1/+1 | |
| | | |||||
| * | mem2reg: fix rare edge case with weird control flow | 2026-03-22 | 1 | -0/+24 | |
| | | | | | | | | | | mem2reg was assuming alloca's appeared before all their uses. When this didn't happen it broke the logic re. sealed blocks. Normally this doesn't happen in most natural code. Even with gotos, RPO would assure this in most cases, the exception I found is a goto that jumps into a loop past a variable declaration that is earlier in the loop. Then even RPO would keep the alloca itself past the first uses, breaking things. | ||||
| * | test/lua -> change Makefile to PLAT=posix | 2026-03-21 | 2 | -2/+2 | |
| | | |||||
| * | c: fix qualifiers for array declarators | 2026-03-19 | 1 | -0/+6 | |
| | | | | | | | `const int x[]` was being treated as `const int x[const]`, which is wrong, and matters when `x` is a function parameter that really decays to a pointer (`int const *const x`) | ||||
| * | Shell script changes for portability | 2026-03-19 | 2 | -9/+9 | |
| | | |||||
| * | test: add test for __func__ | 2026-03-19 | 1 | -0/+2 | |
| | | |||||
| * | c: fix edge cases with zero sized bitfields and static initializers | 2026-03-18 | 1 | -1/+19 | |
| | | |||||
| * | test/.gitignore | 2026-03-17 | 1 | -0/+1 | |
| | | |||||
| * | c-testsuite.sh | 2026-03-14 | 1 | -2/+4 | |
| | | |||||
| * | c: static eval refactoring | 2026-03-14 | 1 | -0/+14 | |
| | | | | | | Explicit node for static symbol (addresses). Should not break with edge cases like the previous ad-hoc approach. And some other bugfixes | ||||
| * | x86_64/isel: fix edge case with branch on float add result | 2026-03-11 | 1 | -0/+5 | |
| | | | | | | | | | In `if (x + 1)` the implicit `!= 0` can be omitted for integers, because the x86 `add` instruction sets the zero flag accordingly. But for floats it doesn't, so applying that optimization there was wrong. Luckily it was caught by a nullptr dereference later in `emit::Xjcc()` for the (missing) unordered branch target, instead of miscompiling. | ||||
| * | c: relax constexpr constraints, fix alignof | 2026-03-09 | 1 | -0/+13 | |
| | | | | | | | | | | | | | - Allow short-circuiting of constant logical expressions where the unevaluated operand is not a constant expression (`1 || 0/0`) - Allow constant integer expressions that evaluate to zero to be used as null pointer constants (GNU extension). + According to the standard, `int *x = 5*0;` should be rejected. But compilers evaluate `5*0 -> 0` and allow it as if a null pointer literal. | ||||
| * | ir: fix inlining getting stuck on complex recursive call sequences | 2026-03-08 | 1 | -0/+13 | |
| | | | | | | By maintaining a proper stack of inline expansions and refusing to expand callers already present in the stack. | ||||
| * | x86_64/isel: cleanup and fix edge cases | 2026-03-08 | 1 | -0/+19 | |
| | | |||||
| * | c: do not try to eval conditional expression's not taken branch | 2026-03-05 | 1 | -0/+2 | |
| | | |||||
| * | add bswap16/32/64 | 2026-03-02 | 1 | -0/+6 | |
| | | | | | | - frontend: __builtin_bswapX intrinsics - backend: ObswapX instructions | ||||
| * | cpp: fix token spacing edge case when empty macros are involved | 2026-03-01 | 1 | -2/+3 | |
| | | |||||
| * | cpp: fix token spacing (#2) (hopefully) | 2026-03-01 | 1 | -0/+24 | |
| | | |||||
| * | cpp: allow comments between function-like macro name and arguments | 2026-02-26 | 1 | -1/+2 | |
| | | |||||
| * | add metalang99 testsuite (preprocessor stress testing) | 2026-02-23 | 119 | -2/+16971 | |
| | | |||||
| * | cpp: add __COUNTER__ macro | 2026-02-23 | 1 | -0/+10 | |
| | | |||||
| * | add sqlite submodule and test runner | 2026-02-22 | 1 | -0/+12 | |
| | | |||||
| * | c: fix using string literal as conditional expression conditional | 2026-02-22 | 1 | -0/+0 | |
| | | |||||
| * | test: fix c-testsuite.sh to build search index if not present | 2026-02-22 | 1 | -0/+1 | |
| | | |||||
| * | preprocessor: fix an edge case with erroneously recursive macro expansion | 2026-02-22 | 1 | -0/+12 | |
| | | |||||
| * | ir: basic inlining pass implementation | 2026-02-18 | 1 | -0/+22 | |
| | | |||||
| * | cpp: add __VA_OPT__ and comma ## __VA_ARGS__ pasting | 2026-02-06 | 1 | -2/+2 | |
| | | |||||
| * | cpp: fix pasting ident+keyword | 2026-01-09 | 1 | -0/+16 | |
| | | |||||
| * | cpp: fix multiline comment in skipped preprocessor directive | 2026-01-09 | 2 | -2/+3 | |
| | | |||||
| * | rega: fix infinite loop when compiling infinite loop | 2025-12-20 | 1 | -0/+5 | |
| | | |||||
| * | test/run.sh: shellcheck | 2025-12-20 | 1 | -11/+10 | |
| | | |||||
| * | cpp: GNU extension for named variadic arguments | 2025-12-18 | 1 | -0/+4 | |
| | | |||||
| * | test/c-testsuite.sh | 2025-12-15 | 3 | -6/+5 | |
| | | |||||
| * | kill fred | 2025-12-13 | 2 | -2/+1 | |
| | | |||||
| * | add c-testsuite | 2025-12-13 | 912 | -0/+9205 | |
| | | |||||
| * | c: handle more static eval edgecases for int -> ptr | 2025-12-13 | 1 | -0/+9 | |
| | | | | | | sqlite3 was falling back to `((void*)&((char*)0)[X])` for INT_TO_PTR, which this handles now. | ||||
| * | Add -O optimization flag | 2025-12-13 | 1 | -0/+1 | |
| | | |||||
| * | fix position independent loads of function symbols. | 2025-12-13 | 3 | -10/+30 | |
| | | | | | | | | | 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 | 2025-12-13 | 1 | -0/+12 | |
| | | |||||
| * | c: accept C99 `[static N]` style array decls, changes to fn quals | 2025-12-11 | 1 | -0/+5 | |
| | | | | | | | 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 | 2025-12-11 | 1 | -0/+22 | |
| | | |||||
| * | update lua/.gitignore | 2025-12-10 | 1 | -0/+2 | |
| | | |||||
| * | c: fix compound assignment type conversions when types don't match | 2025-12-10 | 2 | -0/+0 | |
| | | |||||
| * | Add lua 5.4.0 test suite | 2025-12-07 | 120 | -1/+59828 | |
| | | |||||
| * | test/12-flt: add some weird float cmp edgecases | 2025-12-07 | 1 | -2/+9 | |
| | | |||||