aboutsummaryrefslogtreecommitdiffhomepage
path: root/c/c.c
Commit message (Collapse)AuthorAgeFilesLines
* c: hack to support __FUNCTION__ GNU extensionlemon2025-12-191-4/+10
|
* c: fix uninitiliazed field in decltypeslemon2025-12-171-0/+1
|
* c: improve some type error diagnosticslemon2025-12-151-13/+22
|
* create distinct interned string typelemon2025-12-151-50/+51
| | | | | | | | | | | | | | 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.
* lexer: use a hashmap to lookup keywordslemon2025-12-151-1/+1
|
* c: error when defining function with incomplete parameter typelemon2025-12-151-0/+4
|
* c: support forward-declared enumslemon2025-12-151-34/+32
| | | | This is a common non-standard GNU extension.
* 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: fix memory leak if initializer data if errorlemon2025-12-141-1/+1
|
* only put dats can in .text now when emitting itlemon2025-12-141-2/+2
|
* various relocation related optimizationlemon2025-12-141-3/+3
| | | | | | | | | | 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.
* c: handle more static eval edgecases for int -> ptrlemon2025-12-131-1/+1
| | | | | 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 necessarylemon2025-12-131-7/+11
|
* fix position independent loads of function symbols.lemon2025-12-131-3/+3
| | | | | | | | 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.
* c: switch stmt diagnosticslemon2025-12-121-8/+49
| | | | For duplicate cases, case value overflow
* rename arraylength macro -> countoflemon2025-12-111-23/+23
|
* c: accept C99 `[static N]` style array decls, changes to fn qualslemon2025-12-111-24/+45
| | | | | | 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 stufflemon2025-12-111-11/+18
|
* c: use a look-up table for isdecltok()lemon2025-12-111-14/+18
|
* c: optimize environment decl lookuplemon2025-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 diagnosticslemon2025-12-111-17/+24
|
* c: support for noreturn, and decl parsing cleanuplemon2025-12-111-107/+113
|
* c: expr2reloc() change sig to return addendlemon2025-12-111-15/+12
|
* c: fix static relocation for &sym[offset]lemon2025-12-101-7/+6
|
* c: fix compound assignment type conversions when types don't matchlemon2025-12-101-2/+3
|
* c: fix some static initialzierslemon2025-12-081-1/+3
|
* c: fix more declaration parsing bugslemon2025-12-081-7/+17
|
* c: allow redeclaration with K&R and non K&R prototypeslemon2025-12-031-2/+10
|
* c: make tentative definitions worklemon2025-12-021-17/+34
|
* c: narrowing ints of different signedness...lemon2025-12-011-1/+1
|
* c: edgecase for redeclaration of implicit sized arraylemon2025-12-011-1/+1
|
* c: fix some decl bugs and diagnosticslemon2025-11-301-18/+34
|
* c/type: make implicit const T* -> T* conversion warning, not errorlemon2025-11-261-1/+8
|
* c: more static initializer fixeslemon2025-11-261-7/+7
|
* c: fix elided-braces initializers for nested unionslemon2025-11-261-5/+16
| | | | | | | | For example in ```c struct {int a; union { int b,c; }; int d; } X = {1,2,3}; ``` Fields `a`,`b`,`d` must get initialized to 1,2,3. Not `c`
* c: fix condexprvaluelemon2025-11-241-54/+42
| | | | | The original implementation was broken when presented with nested short-circuiting logical operators.
* c: remove unused functionlemon2025-11-241-8/+0
|
* c: create dummy unreachable block after traplemon2025-11-241-5/+1
| | | | | | Reverts 9abe27f6712. This simplies expr codegen, otherwise would manually have to check `fn->curblk != NULL` repeatedly. Later passes will easily delete those unreachable blocks
* ir: implement cvtu64f. and other bug fixeslemon2025-11-231-1/+4
| | | | | compiler is bootstrapping?! however, stage1 and stage2+ executables aren't bit-identical.. small differences in the codegen.. need to look into that
* c: check actual reachability for non-void func may not return valuelemon2025-11-231-2/+6
|
* c: implement compound initializer in static contextlemon2025-11-231-2/+18
|
* c: fix runtime implicit-length array initializerlemon2025-11-231-2/+3
|
* implement float varargs, and some other fixeslemon2025-11-231-0/+3
|
* c: fix precedence of conditional expression rhslemon2025-11-221-2/+2
|
* c: make the warning for '()' function declarations less strictlemon2025-11-221-1/+1
|
* c: fix static eval for address of some array refslemon2025-11-221-1/+3
|
* c: add decl.sym; avoid calling mkhiddensym repeatedlylemon2025-11-221-22/+16
|
* c: move warning for extension keyword til after preprocessorlemon2025-11-221-2/+9
|