| Commit message (Collapse) | Author | Age | Files | Lines |
| | |
|
| |
|
|
|
|
|
|
| |
Instead of spilling current interval when running out of registers,
spill the longest-lived active interval with a lower spill cost than
current. Spill costs are estimated based on multiplicative loop depth.
Also cleanup regalloc.c somewhat.
Update todo.txt too.
|
| | |
|
| |
|
|
|
| |
Explicit node for static symbol (addresses). Should not break with edge
cases like the previous ad-hoc approach. And some other bugfixes
|
| |
|
|
| |
Would hit the limit on very large functions (thanks csmith).
|
| |
|
|
|
| |
The extra work of using a hashtable to intern them is probably
unnecessary.
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
| |
Also change xcon to have a flagset for symbols (whether it's a function,
locally defined; later: thread local, etc).
|
| |
|
|
|
| |
Is much simpler than the growable buffers, seems to be just as efficient
if not a little faster when benchmarked.
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
|
| |
It was all over the place for temporary data structures used by
individual passes. Now there is an arena specifically for that, which is
nicer.
|
| | |
|
| | |
|
| |
|
|
|
| |
There's plenty of code duplication like this around I'm looking to
reduce.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
|
| |
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.
|
| | |
|
| |
|
|
|
|
|
|
|
| |
It was broken for example `struct { i32 a; f64 b; }` (would try to
load/store b from byte offset 4, not 8). Introduce r2off, realize in
x86-64 it's always 8; even `struct {i32 a; f32 b;}` gets passed in one
(integer) register. But not so in (future) ABIs like RISC-V, I believe
there `{i32, f32}` would get passed in 1 integer and 1 float register
(r2off = 4).
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
| |
when necesary
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|