TODO¶
Essential¶
SSA is broken by simplify_loads() & branches rewriting/simplification
attributes of struct, union & enums are ignored (and maybe others too). This requires correct support for __packed which itself needs partial and unaligned loads & stores (wip)
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¶
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.