Core LLVM status update

Hi everyone,

Here's an update on what we've been up to and how the LLVM 1.0 release is
shaping up. Overall, things are going well, and it looks highly likely
that we'll get the release out by the end of the month!

Here's the hilights of the last few weeks:

1. John checked in support for building LLVM into multiple different
   object directories in the Autoconf style. He also converted the
   regression test suite to use the QMtest tool (by CodeSourcery):

2. A new "Unwind" instruction has now been added to LLVM:
   This instruction, combined with the extant invoke instruction, allows
   the LLVM infrastructure to finally support exception handling and
   setjmp/longjmp. Currently, however, the C backend is the only code
   generator which has implemented the unwind instruction.

   Note, however, that setjmp/longjmp are not currently translated into
   the right calls (but will soon, we hope).

3. The C++ front-end now has full support for C++ exceptions, mapping them
   onto the LLVM unwinding mechanisms and a runtime library. It
   supports all of the C++ exception handling mechanisms (try, catch,
   throw, rethrow, function try block, exception specifications, terminate
   & unexpected handlers, etc), as well as the GCC "cleanup" attribute in
   C. This means that programs using exception handling now compile and
   execute correctly, at least with the C back-end.

4. The LLVM infrastructure has improved support for programs that
   use exception handling. In particular, the inliner can now inline
   functions which throw exceptions (turning the throw into a direct
   branch to the "catch block", as required), as well as inlining
   "invoke" instructions. In addition, we also now have a -prune-eh pass
   which removes EH information from functions which provably cannot throw
   (which is a LOT of them).

5. The 'gccas' utility runs the inliner and EH pruner by default now, so
   small functions should be inlined as you would expect. The inliner
   is currently tuned to not be very aggressive. Currently it only
   inlines functions if the result will be a SMALLER program, which is
   often the case when inlining small C++ methods.

6. The LLVM infrastructure and C/C++ front-ends have been updated to
   support volatile variables. In the LLVM representation, loads and
   stores can now be marked as being volatile (in contrast to C,
   "declarations" are not marked as volatile). This is described here:
   The existing LLVM optimizations have been updated to honor volatile
   loads and stores.

7. Misha compiled a ton of random programs with LLVM and ran them with
   the X86 JIT (finding several bugs). This includes GNU coreutils,
   bison, ed, gawk, gnugo, xboard, nano, gnuchess, screen, grep, sed, etc.
   We, uhh, invested some time "testing" xboard (an X windows chess
   client) to make sure it worked properly. :slight_smile:

8. Brian refactored the Interpreter and the JIT (collectively known as
   "execution engines") out of the LLI tool into their own libraries.
   This allows people to write other tools which need Execution Engines
   without having to hack LLI. The execution engine support figures out
   the appropriate type of EE to create based on the current host (either
   one of the two JITs, or the interpreter if the JITs won't work). He
   also dramatically simplified the interpreter by removing a bunch of
   code which was never used.

9. Misha added some performance improvements to the indirect stub
   generation facilities in the Sparc JIT.

10. John added support for 'envp' to the JIT, so we can now run programs
    like 'env' correctly in the JIT.

11. The C/C++ front-end has been updated to generate array subscripts of
    pointers in a type safe manner. Before, GCC was lowering functions
    like this:
      int test(int *P, int K) { return P[k]; }
    to use explicit pointer arithmetic, which made the LLVM code much less
    useful (and horribly non-typesafe). Proper getelementptr instructions
    are now produced.

11. The LLVM C/C++ front-end now properly supports weak symbols.

12. Benchmark in the test/Programs hierarchy have been reorganized into
    a directory for each suite (Olden, Ptrdist, McCat, etc)

With these changes, the only two major C and C++ features missing from
LLVM are support for setjmp/longjmp (hopefully coming soon), and support
for inline assembly (which will be added sometime after the 1.0 release).

If you have any questions or comments about LLVM, please feel free to get
in contact with us.