TODO¶
Essential¶
SSA is broken by simplify_loads() & branches rewriting/simplification
add support for bitwise enums (wip)
Documentation¶
document the API
document the limitations of modifying ptrlists during list walking
document the data structures
document flow of data / architecture / code structure
Core¶
if a variable has its address taken but in an unreachable BB then its MOD_ADDRESSABLE may be wrong and it won’t be SSA converted. - let kill_insn() check killing of SYMADDR, - add the sym into a list and - recalculate the addressability before memops’s SSA conversion
bool_ctype should be split into internal 1-bit / external 8-bit
Testsuite¶
there are 60 failing tests. They should be fixed (but most are non-trivial to fix).
Misc¶
GCC’s -Wenum-compare / clangs’s -Wenum-conversion -Wassign-enum
parse __attribute_((fallthrough))
add support for format(printf()) (WIP by Ben Dooks)
make use of UNDEFs (issues warnings, simplification, … ?)
make memory accesses more explicit: add EXPR_ACCESS (wip)
it would be nice to do our own parsing of floating point (wip)
some header files needed for crypto/ need __vector or __fp16
some even need __complex
Optimization¶
a lot of small simplifications are waiting to be upstreamed
the domtree need to be rebuilt (or updated)
critical edges need to be split
the current way of doing CSE uses a lot of time
add SSA based DCE
add SSA based PRE
Add SSA based SCCP
add a pass to inline small functions during simplification.
use better/more systematic use of internal verification framework
tracking of operands size should be improved (WIP)
OP_INLINE is sometimes in the way
would be nice to strictly separate phases that don’t changes the CFG and thus the dominance tree.
IR¶
pseudos are untyped, it’s usually OK but often it complicates things:
PSEUDO_REGs are defined by instructions and their type is normally retrievable via this defining instruction but in some cases they’re not: for example, pseudos defined by ASM output.
PSEUDO_ARGs are considered as defined by OP_ENTRY and are used like this for liveness trackability but their type can’t simply be retrieved via this instruction like PSEUDO_REGs are (with ->def->type).
PSEUDO_VALs are completely typeless.
Maybe a few bits should be used to store some kind of low-level type.
OP_SET should return a bool, always
add IR instructions for va_arg() & friends
add a possibility to import of file in “IR assembly”
dump the symtable
dump the CFG
LLVM¶
fix …
Internal backends¶
it would be nice the upstream the code generator
add a pass to transform 3-addresses code to 2-addresses
add some basic register allocation
add a pass to order the BBs and changes 2-ways CBR into one-way branches
what can be done for x86?
add support to add constraints in the MD rules
Longer term/to investigate¶
attributes are represented as ctypes’s alignment, modifiers & contexts but plenty of attributes doesn’t fit, for example they need arguments. * format(printf, …), * section(”…”) * assume_aligned(alignment[, offsert]) * error(“message”), warning(“message”) * …
should support “-Werror=…” ?
All warning messages should include the option how to disable it. For example:
“warning: Variable length array is used.”
should be something like:
“warning: Variable length array is used. (-Wno-vla)”
ptrlists must not have elements removed while being iterated; this should somehow be enforced.
having ‘struct symbol’ used to represent symbols and types is quite handy but it also creates lots of problems and complications
Possible mixup of symbol for a function designator being not a pointer? This seems to make evaluation of function pointers much more complex than needed.
extend test-inspect to inspect more AST fields.
extend test-inspect to inspect instructions.