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.