blob: 1d7873293161cf4df79317d5b1cd09f0677f9001 [file] [log] [blame]
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.