Items marked with * are high priority. Build system ------------ Determination of the target triple should be moved from the Makefile to a configure script. 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 the "target" tool. This should be done from a configure script, rather from the Makefile. Define LLVM_TARGET_NAME from the Makefile rather than being specified in llvm-target.h. Maybe LLVM_TARGET_INTRINSIC_PREFIX could go too. An annoyance is that the target tool returns "x86" while what is needed is "X86". Optimizations ------------- Consider using separate caches for types and globals. Correctness ----------- GCC now has per-function optimization levels. Add support for this. Unify the code that determines which LLVM linkage type to use. Need to do a bunch of experimenting to work out how the mapping should really be done. * Stop hooking directly into target specific ABI code (which requires patching gcc). Instead, either try to get ABI info from the gcc hooks (which may mean translating RTL) or reuse the clang code. Testing ------- Move the old FrontendXYZ tests from LLVM to dragonegg. Code quality ------------ Consider not extending GEP indices to "pointer type" since GEP indices can have any integer type now (except for struct GEP's - there the type must be i32). Note that GEP indices are implicitly sign extended, so unsigned indices still need to be explicitly zero extended to pointer size (is this always done now?). Clarify and extend the distinction between gimple registers and "the rest", the rest being mostly references. BIT_FIELD_REF is used to extract (and presumably insert) vector elements. Consider turning this directly into the corresponding vector operations. Work in terms of units rather than octets (i8). For example, if the target has a 16 bit byte, then use i16 for byte addressing. Convert GCC floating point register constants without "going through memory" (see TreeToLLVM::EmitRealRegisterConstant). Reduce the use of macros. Features -------- * Move debug info generation over to the latest LLVM system, since we are now the only user of the old debug info system. Output proper debug info rather than throwing most of it away. Provide column numbers in location info. Many x86 specific builtins are not supported, even though it would be easy to add support for some of them, for example the 256 bit versions of builtins we do support. Improve this. The GCC builtin lowering outputs helpful warnings (for example, 20081109_0.c:3:35: warning: attempt to free a non-heap object ‘bar’, see maybe_emit_free_warning), but we don't. Improve this somehow. Make LTO transparent. One part of this working out how to write bitcode when using -c, which runs into trouble because gcc insists on running the assembler on compiler output. Another part is looking into the possibility of encoding bitcode in ELF sections like gcc does for gimple when doing LTO. Add support for address spaces. Add support for non-temporal stores. Add type based alias analysis tags in more cases. Extend LLVM's tbaa representation so it can represent a DAG and generate tags for struct types too.