| Build system |
| ------------ |
| |
| The location of the gcc source and objects should be passed as options to a |
| configure script rather than being hardwired into the Makefile. |
| |
| Determination of the target triple should be moved from the Makefile to a |
| configure script. |
| |
| The plugin revision is created from the subversion revision. What if people |
| are using git etc? Maybe it should be calculated in a configure script, but |
| since that might not get run often perhaps the Makefile is the best place. |
| |
| Target subdirectories should have their own Makefiles, instead of assuming |
| that there's only one source file and that it's called llvm-target.cpp. |
| |
| Currently the target directory (eg: i386) is calculated from the target triple |
| (eg: x86_64-unknown-linux-gnu) using gcc's config.gcc script. This should be |
| done from a configure script, rather from the Makefile using the get_arch_dir |
| wrapper. |
| |
| The Makefile needs to know the LLVM target name (eg: x86) in order to pass it |
| to llvm-config so as to get the libraries to link with for target codegen. |
| This should be calculated in a configure script (presumably by a small program |
| that uses the LLVM triple facilities to calculate it). If we know this, then |
| we might as well rename target directories like i386/ to x86/ instead, and |
| eliminate use of gcc's config.gcc script. This also means that LLVM_TARGET_NAME |
| could be defined from the Makefile rather than being specified in llvm-target.h. |
| Maybe LLVM_TARGET_INTRINSIC_PREFIX could go too. |
| |
| Teach the build system that the plugin needs to be rebuilt if any of the bits of |
| LLVM/gcc it depends on changes. |
| |
| |
| Optimizations |
| ------------- |
| |
| After outputting global variables, maybe they can be deleted or marked somehow |
| (eg: TREE_ASM_WRITTEN) so that GCC does not output them (such output gets sent |
| to /dev/null, but it would be more efficient to teach GCC to not produce any in |
| the first place). Investigate. |
| |
| Consider having DECL_LLVM and friends store values for trees local to a |
| function in a separate map that can be cleared once the function has been |
| emitted. Determining which trees are local (LABEL_DECL, VAR_DECL but not |
| static etc) should be pretty quick, so the cost of routing to the right map |
| should be insignificant, while having a much smaller map for globals could |
| be a win. |
| |
| Consider using separate caches for types and globals. |
| |
| Thanks to gimple being in SSA form, many local variables are not used. |
| However they are still in the local_decls list, so we output them all, |
| pointlessly, wasting time and memory. Consider emitting local variables |
| on demand instead. |
| |
| |
| Correctness |
| ----------- |
| |
| If an ssa name refers to a global (can this happen), the SSANames map might |
| need to be updated if the target is altered by changeLLVMConstant. |
| |
| An ssa name can be a complex number, causing the plugin to crash. Maybe should |
| consider complex numbers to be scalars rather than aggregates. Would this get |
| in the way of sroa? |
| |
| If the initializer for a static variable contains the address of a label then |
| we crash. |
| |
| |
| Features |
| -------- |
| |
| Output proper debug info rather than throwing most of it away. |
| |
| Add support for exception handling. |