llvm-6502/docs/ReleaseNotes.html
Chris Lattner e0518449c7 add a note
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@115297 91177308-0d34-0410-b5e6-96231b3b80d8
2010-10-01 06:34:49 +00:00

1035 lines
36 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="stylesheet" href="llvm.css" type="text/css">
<title>LLVM 2.8 Release Notes</title>
</head>
<body>
<div class="doc_title">LLVM 2.8 Release Notes</div>
<img align=right src="http://llvm.org/img/DragonSmall.png"
width="136" height="136" alt="LLVM Dragon Logo">
<ol>
<li><a href="#intro">Introduction</a></li>
<li><a href="#subproj">Sub-project Status Update</a></li>
<li><a href="#externalproj">External Projects Using LLVM 2.8</a></li>
<li><a href="#whatsnew">What's New in LLVM 2.8?</a></li>
<li><a href="GettingStarted.html">Installation Instructions</a></li>
<li><a href="#knownproblems">Known Problems</a></li>
<li><a href="#additionalinfo">Additional Information</a></li>
</ol>
<div class="doc_author">
<p>Written by the <a href="http://llvm.org">LLVM Team</a></p>
</div>
<!--
<h1 style="color:red">These are in-progress notes for the upcoming LLVM 2.8
release.<br>
You may prefer the
<a href="http://llvm.org/releases/2.7/docs/ReleaseNotes.html">LLVM 2.7
Release Notes</a>.</h1>
-->
<!-- *********************************************************************** -->
<div class="doc_section">
<a name="intro">Introduction</a>
</div>
<!-- *********************************************************************** -->
<div class="doc_text">
<p>This document contains the release notes for the LLVM Compiler
Infrastructure, release 2.8. Here we describe the status of LLVM, including
major improvements from the previous release and significant known problems.
All LLVM releases may be downloaded from the <a
href="http://llvm.org/releases/">LLVM releases web site</a>.</p>
<p>For more information about LLVM, including information about the latest
release, please check out the <a href="http://llvm.org/">main LLVM
web site</a>. If you have questions or comments, the <a
href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev">LLVM Developer's
Mailing List</a> is a good place to send them.</p>
<p>Note that if you are reading this file from a Subversion checkout or the
main LLVM web page, this document applies to the <i>next</i> release, not the
current one. To see the release notes for a specific release, please see the
<a href="http://llvm.org/releases/">releases page</a>.</p>
</div>
<!--
Almost dead code.
include/llvm/Analysis/LiveValues.h => Dan
lib/Transforms/IPO/MergeFunctions.cpp => consider for 2.8.
llvm/Analysis/PointerTracking.h => Edwin wants this, consider for 2.8.
GEPSplitterPass
-->
<!-- Features that need text if they're finished for 2.9:
combiner-aa?
strong phi elim
loop dependence analysis
TBAA
CorrelatedValuePropagation
-->
<!-- Announcement, lldb, libc++ -->
<!-- to write:
MachineCSE tuned and on by default.
llvm.dbg.value: variable debug info for optimized code
MC Assembler backend is now real, does relaxation and is bitwise identical
with darwin assembler in huge majority of all cases.
new GHC calling convention
New half float intrinsics LangRef.html#int_fp16
Rewrote tblgen's type inference for backends to be more consistent and
diagnose more target bugs. This also allows limited support for writing
patterns for instructions that return multiple results, e.g. a virtual
register and a flag result. Stuff that used 'parallel' before should use
this.
New ARM/Thumb disassembler support in MC.
New SSEDomainFix pass:
On Nehalem and newer CPUs there is a 2 cycle latency penalty on using a
register in a different domain than where it was defined. Some instructions
have equvivalents for different domains, like por/orps/orpd. The
SSEDomainFix pass tries to minimize the number of domain crossings by
changing between equvivalent opcodes where possible.
Support for the Intel AES instructions in the assembler.
memcpy, memmove, and memset now take address space qualified pointers + volatile.
per-instruction debug info metadata is much faster and uses less space (new DebugLoc class).
-ffunction-sections and -fdata-sections are supported on ELF targets.
Now iterate function passes when a cgsccpassmanager detects a devirtualization
-momit-leaf-frame-pointer now supported.
New -regalloc=fast, =local got removed
New -regalloc=default option that chooses a register allocator based on the -O optimization level.
New "trap values" concept: http://llvm.org/docs/LangRef.html#trapvalues
Improved trip count analysis for <= and >= loops, and uses sign overflow info.
REMOVED: SCCVN pass.
X86 backend attempts to promote 16-bit integer operations to 32-bits to avoid
0x66 prefixes, which are slow on some microarchitectures and bloat the code
on others.
X87 fp stackifier is global!
LTO debug info support?
NEON: Better performance for QQQQ (4-consecutive Q register) instructions. New reg sequence abstraction?
New support for X86 "thiscall" calling convention (x86_thiscallcc in IR).
ARM: Better scheduling (list-hybrid, hybrid?)
New SubRegIndex tblgen class for targets -> jakob
ARM: Tail call support.
AVX support in the MC assembler. Full compiler support not done yet.
Atomics now get legalized when not natively supported (jim g)
ARM: General performance work and tuning.
-->
<!-- *********************************************************************** -->
<div class="doc_section">
<a name="subproj">Sub-project Status Update</a>
</div>
<!-- *********************************************************************** -->
<div class="doc_text">
<p>
The LLVM 2.8 distribution currently consists of code from the core LLVM
repository (which roughly includes the LLVM optimizers, code generators
and supporting tools), the Clang repository and the llvm-gcc repository. In
addition to this code, the LLVM Project includes other sub-projects that are in
development. Here we include updates on these subprojects.
</p>
</div>
<!--=========================================================================-->
<div class="doc_subsection">
<a name="clang">Clang: C/C++/Objective-C Frontend Toolkit</a>
</div>
<div class="doc_text">
<p><a href="http://clang.llvm.org/">Clang</a> is an LLVM front end for the C,
C++, and Objective-C languages. Clang aims to provide a better user experience
through expressive diagnostics, a high level of conformance to language
standards, fast compilation, and low memory use. Like LLVM, Clang provides a
modular, library-based architecture that makes it suitable for creating or
integrating with other development tools. Clang is considered a
production-quality compiler for C, Objective-C, C++ and Objective-C++ on x86
(32- and 64-bit), and for darwin-arm targets.</p>
<p>In the LLVM 2.8 time-frame, the Clang team has made many improvements:</p>
<ul>
<li>Surely these guys have done something</li>
<li>X86-64 abi improvements? Did they make it in?</li>
</ul>
</div>
<!--=========================================================================-->
<div class="doc_subsection">
<a name="clangsa">Clang Static Analyzer</a>
</div>
<div class="doc_text">
<p>The <a href="http://clang-analyzer.llvm.org/">Clang Static Analyzer</a>
project is an effort to use static source code analysis techniques to
automatically find bugs in C and Objective-C programs (and hopefully <a
href="http://clang-analyzer.llvm.org/dev_cxx.html">C++ in the
future</a>!). The tool is very good at finding bugs that occur on specific
paths through code, such as on error conditions.</p>
<p>The LLVM 2.8 release fixes a number of bugs and slightly improves precision
over 2.7, but there are no major new features in the release.
</p>
</div>
<!--=========================================================================-->
<div class="doc_subsection">
<a name="vmkit">VMKit: JVM/CLI Virtual Machine Implementation</a>
</div>
<div class="doc_text">
<p>
The <a href="http://vmkit.llvm.org/">VMKit project</a> is an implementation of
a JVM and a CLI Virtual Machine (Microsoft .NET is an
implementation of the CLI) using LLVM for static and just-in-time
compilation.</p>
<p>With the release of LLVM 2.8, ...</p>
</div>
<!--=========================================================================-->
<div class="doc_subsection">
<a name="compiler-rt">compiler-rt: Compiler Runtime Library</a>
</div>
<div class="doc_text">
<p>
The new LLVM <a href="http://compiler-rt.llvm.org/">compiler-rt project</a>
is a simple library that provides an implementation of the low-level
target-specific hooks required by code generation and other runtime components.
For example, when compiling for a 32-bit target, converting a double to a 64-bit
unsigned integer is compiled into a runtime call to the "__fixunsdfdi"
function. The compiler-rt library provides highly optimized implementations of
this and other low-level routines (some are 3x faster than the equivalent
libgcc routines).</p>
<p>
All of the code in the compiler-rt project is available under the standard LLVM
License, a "BSD-style" license. New in LLVM 2.8:
Soft float support
</p>
</div>
<!--=========================================================================-->
<div class="doc_subsection">
<a name="dragonegg">DragonEgg: llvm-gcc ported to gcc-4.5</a>
</div>
<div class="doc_text">
<p>
<a href="http://dragonegg.llvm.org/">DragonEgg</a> is a port of llvm-gcc to
gcc-4.5. Unlike llvm-gcc, dragonegg in theory does not require any gcc-4.5
modifications whatsoever (currently one small patch is needed) thanks to the
new <a href="http://gcc.gnu.org/wiki/plugins">gcc plugin architecture</a>.
DragonEgg is a gcc plugin that makes gcc-4.5 use the LLVM optimizers and code
generators instead of gcc's, just like with llvm-gcc.
</p>
<p>
DragonEgg is still a work in progress, but it is able to compile a lot of code,
for example all of gcc, LLVM and clang. Currently Ada, C, C++ and Fortran work
well, while all other languages either don't work at all or only work poorly.
For the moment only the x86-32 and x86-64 targets are supported, and only on
linux and darwin (darwin may need additional gcc patches).
</p>
<p>
The 2.8 release has the following notable changes:
<ul>
<li>The plugin loads faster due to exporting fewer symbols.</li>
<li>Additional vector operations such as addps256 are now supported.</li>
<li>Ada global variables with no initial value are no longer zero initialized,
resulting in better optimization.</li>
<li>The '-fplugin-arg-dragonegg-enable-gcc-optzns' flag now runs all gcc
optimizers, rather than just a handful.</li>
<li>Fortran programs using common variables now link correctly.</li>
<li>GNU OMP constructs no longer crash the compiler.</li>
</ul>
</p>
</div>
<!--=========================================================================-->
<div class="doc_subsection">
<a name="lldb">LLDB: Low Level Debugger</a>
</div>
<div class="doc_text">
<p>
<a href="http://lldb.llvm.org/">LLDB</a> is</p>
<p>
</p>
<p>
2.8 status here.
</p>
</div>
<!--=========================================================================-->
<div class="doc_subsection">
<a name="libc++">libc++: C++ Standard Library</a>
</div>
<div class="doc_text">
<p>
<a href="http://libc++.llvm.org/">libc++</a> is</p>
<p>
</p>
<p>
2.8 status here.
</p>
</div>
<!-- *********************************************************************** -->
<div class="doc_section">
<a name="externalproj">External Open Source Projects Using LLVM 2.8</a>
</div>
<!-- *********************************************************************** -->
<div class="doc_text">
<p>An exciting aspect of LLVM is that it is used as an enabling technology for
a lot of other language and tools projects. This section lists some of the
projects that have already been updated to work with LLVM 2.8.</p>
</div>
<!--=========================================================================-->
<div class="doc_subsection">
<a name="tce">TTA-based Codesign Environment (TCE)</a>
</div>
<div class="doc_text">
<p>
<a href="http://tce.cs.tut.fi/">TCE</a> is a toolset for designing
application-specific processors (ASP) based on the Transport triggered
architecture (TTA). The toolset provides a complete co-design flow from C/C++
programs down to synthesizable VHDL and parallel program binaries. Processor
customization points include the register files, function units, supported
operations, and the interconnection network.</p>
<p>TCE uses llvm-gcc/Clang and LLVM for C/C++ language support, target
independent optimizations and also for parts of code generation. It generates
new LLVM-based code generators "on the fly" for the designed TTA processors and
loads them in to the compiler backend as runtime libraries to avoid per-target
recompilation of larger parts of the compiler chain.</p>
</div>
<!--=========================================================================-->
<div class="doc_subsection">
<a name="Horizon">Horizon Bytecode Compiler</a>
</div>
<div class="doc_text">
<p>
<a href="http://www.quokforge.org/projects/horizon">Horizon</a> is a bytecode
language and compiler written on top of LLVM, intended for producing
single-address-space managed code operating systems that
run faster than the equivalent multiple-address-space C systems.
More in-depth blurb is available on <a
href="http://www.quokforge.org/projects/horizon/wiki/Wiki">the wiki</a>.</p>
</div>
<!--=========================================================================-->
<div class="doc_subsection">
<a name="clamav">Clam AntiVirus</a>
</div>
<div class="doc_text">
<p>
<a href=http://www.clamav.net>Clam AntiVirus</a> is an open source (GPL)
anti-virus toolkit for UNIX, designed especially for e-mail scanning on mail
gateways. Since version 0.96 it has <a
href="http://vrt-sourcefire.blogspot.com/2010/09/introduction-to-clamavs-low-level.html">bytecode
signatures</a> that allow writing detections for complex malware. It
uses LLVM's JIT to speed up the execution of bytecode on
X86,X86-64,PPC32/64, falling back to its own interpreter otherwise.
The git version was updated to work with LLVM 2.8
</p>
<p>The <a
href="http://git.clamav.net/gitweb?p=clamav-bytecode-compiler.git;a=blob_plain;f=docs/user/clambc-user.pdf">
ClamAV bytecode compiler</a> uses Clang and LLVM to compile a C-like
language, insert runtime checks, and generate ClamAV bytecode.</p>
</div>
<!--=========================================================================-->
<div class="doc_subsection">
<a name="pure">Pure</a>
</div>
<div class="doc_text">
<p>
<a href="http://pure-lang.googlecode.com/">Pure</a>
is an algebraic/functional
programming language based on term rewriting. Programs are collections
of equations which are used to evaluate expressions in a symbolic
fashion. Pure offers dynamic typing, eager and lazy evaluation, lexical
closures, a hygienic macro system (also based on term rewriting),
built-in list and matrix support (including list and matrix
comprehensions) and an easy-to-use C interface. The interpreter uses
LLVM as a backend to JIT-compile Pure programs to fast native code.</p>
<p>Pure versions 0.44 and later have been tested and are known to work with
LLVM 2.8 (and continue to work with older LLVM releases >= 2.5).</p>
</div>
<!--=========================================================================-->
<div class="doc_subsection">
<a name="GHC">Glasgow Haskell Compiler (GHC)</a>
</div>
<div class="doc_text">
<p>
<a href="http://www.haskell.org/ghc/">GHC</a> is an open source,
state-of-the-art programming suite for
Haskell, a standard lazy functional programming language. It includes
an optimizing static compiler generating good code for a variety of
platforms, together with an interactive system for convenient, quick
development.</p>
<p>In addition to the existing C and native code generators, GHC 7.0 now
supports an <a
href="http://hackage.haskell.org/trac/ghc/wiki/Commentary/Compiler/Backends/LLVM">LLVM
code generator</a>. GHC supports LLVM 2.7 and later.</p>
</div>
<!--=========================================================================-->
<div class="doc_subsection">
<a name="Clay">Clay Programming Language</a>
</div>
<div class="doc_text">
<p>
<a href="http://tachyon.in/clay/">Clay</a> is a new systems programming
language that is specifically designed for generic programming. It makes
generic programming very concise thanks to whole program type propagation. It
uses LLVM as its backend.</p>
</div>
<!--=========================================================================-->
<div class="doc_subsection">
<a name="llvm-py">llvm-py Python Bindings for LLVM</a>
</div>
<div class="doc_text">
<p>
<a href="http://www.mdevan.org/llvm-py/">llvm-py</a> has been updated to work
with LLVM 2.8. llvm-py provides Python bindings for LLVM, allowing you to write a
compiler backend or a VM in Python.</p>
</div>
<!-- *********************************************************************** -->
<div class="doc_section">
<a name="whatsnew">What's New in LLVM 2.8?</a>
</div>
<!-- *********************************************************************** -->
<div class="doc_text">
<p>This release includes a huge number of bug fixes, performance tweaks and
minor improvements. Some of the major improvements and new features are listed
in this section.
</p>
</div>
<!--=========================================================================-->
<div class="doc_subsection">
<a name="orgchanges">LLVM Community Changes</a>
</div>
<div class="doc_text">
<p>In addition to changes to the code, between LLVM 2.7 and 2.8, a number of
organization changes have happened:
</p>
<ul>
<li>libc++ and lldb are new</li>
<li>Debugging optimized code support.</li>
</ul>
</div>
<!--=========================================================================-->
<div class="doc_subsection">
<a name="majorfeatures">Major New Features</a>
</div>
<div class="doc_text">
<p>LLVM 2.8 includes several major new capabilities:</p>
<ul>
<li>atomic lowering pass.</li>
<li>RegionInfo pass: opt -regions analyze" or "opt -view-regions".
<!-- Tobias Grosser --></li>
<li>ARMGlobalMerge: <!-- Anton --> </li>
<li>llvm-diff</li>
</ul>
</div>
<!--=========================================================================-->
<div class="doc_subsection">
<a name="coreimprovements">LLVM IR and Core Improvements</a>
</div>
<div class="doc_text">
<p>LLVM IR has several new features for better support of new targets and that
expose new optimization opportunities:</p>
<ul>
<li>LLVM 2.8 changes the internal order of operands in <a
href="http://llvm.org/doxygen/classllvm_1_1InvokeInst.html"><tt>InvokeInst</tt></a>
and <a href="http://llvm.org/doxygen/classllvm_1_1CallInst.html"><tt>CallInst</tt></a>.
To be portable across releases, resort to <tt>CallSite</tt> and the
high-level accessors, such as <tt>getCalledValue</tt> and <tt>setUnwindDest</tt>.
</li>
<li>
You can no longer pass use_iterators directly to cast<> (and similar), because
these routines tend to perform costly dereference operations more than once. You
have to dereference the iterators yourself and pass them in.
</li>
<li>
llvm.memcpy.*, llvm.memset.*, llvm.memmove.* (and possibly other?) intrinsics
take an extra parameter now (i1 isVolatile), totaling 5 parameters.
If you were creating these intrinsic calls and prototypes yourself (as opposed
to using Intrinsic::getDeclaration), you can use UpgradeIntrinsicFunction/UpgradeIntrinsicCall
to be portable accross releases.
Note that you cannot use Intrinsic::getDeclaration() in a backwards compatible
way (needs 2/3 types now, in 2.7 it needed just 1).
</li>
<li>
SetCurrentDebugLocation takes a DebugLoc now instead of a MDNode.
Change your code to use
SetCurrentDebugLocation(DebugLoc::getFromDILocation(...)).
</li>
<li>
VISIBILITY_HIDDEN is gone.
</li>
<li>
The <tt>RegisterPass</tt> and <tt>RegisterAnalysisGroup</tt> templates are
considered deprecated, but continue to function in LLVM 2.8. Clients are
strongly advised to use the upcoming <tt>INITIALIZE_PASS()</tt> and
<tt>INITIALIZE_AG_PASS()</tt> macros instead.
<li>
SMDiagnostic takes different parameters now. //FIXME: how to upgrade?
</li>
<li>
The constructor for the Triple class no longer tries to understand odd triple
specifications. Frontends should ensure that they only pass valid triples to
LLVM. The Triple::normalize utility method has been added to help front-ends
deal with funky triples.
<li>
Some APIs got renamed:
<ul>
<li>llvm_report_error -&gt; report_fatal_error</li>
<li>llvm_install_error_handler -&gt; install_fatal_error_handler</li>
<li>llvm::DwarfExceptionHandling -&gt; llvm::JITExceptionHandling</li>
</ul>
</li>
</ul>
</div>
<!--=========================================================================-->
<div class="doc_subsection">
<a name="optimizer">Optimizer Improvements</a>
</div>
<div class="doc_text">
<p>In addition to a large array of minor performance tweaks and bug fixes, this
release includes a few major enhancements and additions to the optimizers:</p>
<ul>
<li></li>
</ul>
</div>
<!--=========================================================================-->
<div class="doc_subsection">
<a name="executionengine">Interpreter and JIT Improvements</a>
</div>
<div class="doc_text">
<ul>
<li></li>
</ul>
</div>
<!--=========================================================================-->
<div class="doc_subsection">
<a name="mc">MC Level Improvements</a>
</div>
<div class="doc_text">
<p>
FIXME: Rewrite.
The LLVM Machine Code (aka MC) sub-project of LLVM was created to solve a number
of problems in the realm of assembly, disassembly, object file format handling,
and a number of other related areas that CPU instruction-set level tools work
in. It is a sub-project of LLVM which provides it with a number of advantages
over other compilers that do not have tightly integrated assembly-level tools.
For a gentle introduction, please see the <a
href="http://blog.llvm.org/2010/04/intro-to-llvm-mc-project.html">Intro to the
LLVM MC Project Blog Post</a>.
</p>
<p>2.8 status here. Basic correctness, some obscure missing instructions on
mainline, on by default in clang.
Entire compiler backend converted to use mcstreamer.
</p>
</div>
<!--=========================================================================-->
<div class="doc_subsection">
<a name="codegen">Target Independent Code Generator Improvements</a>
</div>
<div class="doc_text">
<p>We have put a significant amount of work into the code generator
infrastructure, which allows us to implement more aggressive algorithms and make
it run faster:</p>
<ul>
<li>MachO writer works.</li>
</ul>
</div>
<!--=========================================================================-->
<div class="doc_subsection">
<a name="x86">X86-32 and X86-64 Target Improvements</a>
</div>
<div class="doc_text">
<p>New features of the X86 target include:
</p>
<ul>
<li>The X86 backend now supports holding X87 floating point stack values
in registers across basic blocks, dramatically improving performance of code
that uses long double, and when targetting CPUs that don't support SSE.</li>
</ul>
</div>
<!--=========================================================================-->
<div class="doc_subsection">
<a name="ARM">ARM Target Improvements</a>
</div>
<div class="doc_text">
<p>New features of the ARM target include:
</p>
<ul>
<li>
All of the NEON load and store intrinsics (llvm.arm.neon.vld* and
llvm.arm.neon.vst*) take an extra parameter to specify the alignment in bytes
of the memory being accessed.
</li>
<li>
The llvm.arm.neon.vaba intrinsic (vector absolute difference and
accumulate) has been removed. This operation is now represented using
the llvm.arm.neon.vabd intrinsic (vector absolute difference) followed by a
vector add.
</li>
<li>
The llvm.arm.neon.vabdl and llvm.arm.neon.vabal intrinsics (lengthening
vector absolute difference with and without accumlation) have been removed.
They are represented using the llvm.arm.neon.vabd intrinsic (vector absolute
difference) followed by a vector zero-extend operation, and for vabal,
a vector add.
</li>
<li>
The llvm.arm.neon.vmovn intrinsic has been removed. Calls of this intrinsic
are now replaced by vector truncate operations.
</li>
<li>
The llvm.arm.neon.vmovls and llvm.arm.neon.vmovlu intrinsics have been
removed. They are now represented as vector sign-extend (vmovls) and
zero-extend (vmovlu) operations.
</li>
<li>
The llvm.arm.neon.vaddl*, llvm.arm.neon.vaddw*, llvm.arm.neon.vsubl*, and
llvm.arm.neon.vsubw* intrinsics (lengthening vector add and subtract) have
been removed. They are replaced by vector add and vector subtract operations
where one (vaddw, vsubw) or both (vaddl, vsubl) of the operands are either
sign-extended or zero-extended.
</li>
<li>
The llvm.arm.neon.vmulls, llvm.arm.neon.vmullu, llvm.arm.neon.vmlal*, and
llvm.arm.neon.vmlsl* intrinsics (lengthening vector multiply with and without
accumulation and subtraction) have been removed. These operations are now
represented as vector multiplications where the operands are either
sign-extended or zero-extended, followed by a vector add for vmlal or a
vector subtract for vmlsl. Note that the polynomial vector multiply
intrinsic, llvm.arm.neon.vmullp, remains unchanged.
</li>
</ul>
</div>
<!--=========================================================================-->
<div class="doc_subsection">
<a name="newapis">New Useful APIs</a>
</div>
<div class="doc_text">
<p>This release includes a number of new APIs that are used internally, which
may also be useful for external clients.
</p>
<ul>
<li></li>
</ul>
</div>
<!--=========================================================================-->
<div class="doc_subsection">
<a name="otherimprovements">Other Improvements and New Features</a>
</div>
<div class="doc_text">
<p>Other miscellaneous features include:</p>
<ul>
<li></li>
</ul>
</div>
<!--=========================================================================-->
<div class="doc_subsection">
<a name="changes">Major Changes and Removed Features</a>
</div>
<div class="doc_text">
<p>If you're already an LLVM user or developer with out-of-tree changes based
on LLVM 2.7, this section lists some "gotchas" that you may run into upgrading
from the previous release.</p>
<ul>
<li>.ll file doesn't produce #uses comments anymore, to get them, run a .bc file
through "llvm-dis --show-annotations".</li>
<li>MSIL Backend removed.</li>
<li>ABCD and SSI passes removed.</li>
<li>'Union' LLVM IR feature removed.</li>
</ul>
<p>In addition, many APIs have changed in this release. Some of the major LLVM
API changes are:</p>
<ul>
</ul>
</div>
<!-- *********************************************************************** -->
<div class="doc_section">
<a name="knownproblems">Known Problems</a>
</div>
<!-- *********************************************************************** -->
<div class="doc_text">
<p>This section contains significant known problems with the LLVM system,
listed by component. If you run into a problem, please check the <a
href="http://llvm.org/bugs/">LLVM bug database</a> and submit a bug if
there isn't already one.</p>
</div>
<!-- ======================================================================= -->
<div class="doc_subsection">
<a name="experimental">Experimental features included with this release</a>
</div>
<div class="doc_text">
<p>The following components of this LLVM release are either untested, known to
be broken or unreliable, or are in early development. These components should
not be relied on, and bugs should not be filed against them, but they may be
useful to some people. In particular, if you would like to work on one of these
components, please contact us on the <a
href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev">LLVMdev list</a>.</p>
<ul>
<li>The Alpha, SPU, MIPS, PIC16, Blackfin, MSP430, SystemZ and MicroBlaze
backends are experimental.</li>
<li><tt>llc</tt> "<tt>-filetype=asm</tt>" (the default) is the only
supported value for this option. XXX Update me</li>
</ul>
</div>
<!-- ======================================================================= -->
<div class="doc_subsection">
<a name="x86-be">Known problems with the X86 back-end</a>
</div>
<div class="doc_text">
<ul>
<li>The X86 backend does not yet support
all <a href="http://llvm.org/PR879">inline assembly that uses the X86
floating point stack</a>. It supports the 'f' and 't' constraints, but not
'u'.</li>
<li>Win64 code generation wasn't widely tested. Everything should work, but we
expect small issues to happen. Also, llvm-gcc cannot build the mingw64
runtime currently due to lack of support for the 'u' inline assembly
constraint and for X87 floating point inline assembly.</li>
<li>The X86-64 backend does not yet support the LLVM IR instruction
<tt>va_arg</tt>. Currently, front-ends support variadic
argument constructs on X86-64 by lowering them manually.</li>
</ul>
</div>
<!-- ======================================================================= -->
<div class="doc_subsection">
<a name="ppc-be">Known problems with the PowerPC back-end</a>
</div>
<div class="doc_text">
<ul>
<li>The Linux PPC32/ABI support needs testing for the interpreter and static
compilation, and lacks support for debug information.</li>
</ul>
</div>
<!-- ======================================================================= -->
<div class="doc_subsection">
<a name="arm-be">Known problems with the ARM back-end</a>
</div>
<div class="doc_text">
<ul>
<li>Thumb mode works only on ARMv6 or higher processors. On sub-ARMv6
processors, thumb programs can crash or produce wrong
results (<a href="http://llvm.org/PR1388">PR1388</a>).</li>
<li>Compilation for ARM Linux OABI (old ABI) is supported but not fully tested.
</li>
</ul>
</div>
<!-- ======================================================================= -->
<div class="doc_subsection">
<a name="sparc-be">Known problems with the SPARC back-end</a>
</div>
<div class="doc_text">
<ul>
<li>The SPARC backend only supports the 32-bit SPARC ABI (-m32); it does not
support the 64-bit SPARC ABI (-m64).</li>
</ul>
</div>
<!-- ======================================================================= -->
<div class="doc_subsection">
<a name="mips-be">Known problems with the MIPS back-end</a>
</div>
<div class="doc_text">
<ul>
<li>64-bit MIPS targets are not supported yet.</li>
</ul>
</div>
<!-- ======================================================================= -->
<div class="doc_subsection">
<a name="alpha-be">Known problems with the Alpha back-end</a>
</div>
<div class="doc_text">
<ul>
<li>On 21164s, some rare FP arithmetic sequences which may trap do not have the
appropriate nops inserted to ensure restartability.</li>
</ul>
</div>
<!-- ======================================================================= -->
<div class="doc_subsection">
<a name="c-be">Known problems with the C back-end</a>
</div>
<div class="doc_text">
<p>The C backend has numerous problems and is not being actively maintained.
Depending on it for anything serious is not advised.</p>
<ul>
<li><a href="http://llvm.org/PR802">The C backend has only basic support for
inline assembly code</a>.</li>
<li><a href="http://llvm.org/PR1658">The C backend violates the ABI of common
C++ programs</a>, preventing intermixing between C++ compiled by the CBE and
C++ code compiled with <tt>llc</tt> or native compilers.</li>
<li>The C backend does not support all exception handling constructs.</li>
<li>The C backend does not support arbitrary precision integers.</li>
</ul>
</div>
<!-- ======================================================================= -->
<div class="doc_subsection">
<a name="llvm-gcc">Known problems with the llvm-gcc front-end</a>
</div>
<div class="doc_text">
<p>llvm-gcc is generally very stable for the C family of languages. The only
major language feature of GCC not supported by llvm-gcc is the
<tt>__builtin_apply</tt> family of builtins. However, some extensions
are only supported on some targets. For example, trampolines are only
supported on some targets (these are used when you take the address of a
nested function).</p>
<p>Fortran support generally works, but there are still several unresolved bugs
in <a href="http://llvm.org/bugs/">Bugzilla</a>. Please see the
tools/gfortran component for details. Note that llvm-gcc is missing major
Fortran performance work in the frontend and library that went into GCC after
4.2. If you are interested in Fortran, we recommend that you consider using
<a href="#dragonegg">dragonegg</a> instead.</p>
<p>The llvm-gcc 4.2 Ada compiler has basic functionality. However, this is not a
mature technology, and problems should be expected. For example:</p>
<ul>
<li>The Ada front-end currently only builds on X86-32. This is mainly due
to lack of trampoline support (pointers to nested functions) on other platforms.
However, it <a href="http://llvm.org/PR2006">also fails to build on X86-64</a>
which does support trampolines.</li>
<li>The Ada front-end <a href="http://llvm.org/PR2007">fails to bootstrap</a>.
This is due to lack of LLVM support for <tt>setjmp</tt>/<tt>longjmp</tt> style
exception handling, which is used internally by the compiler.
Workaround: configure with <tt>--disable-bootstrap</tt>.</li>
<li>The c380004, <a href="http://llvm.org/PR2010">c393010</a>
and <a href="http://llvm.org/PR2421">cxg2021</a> ACATS tests fail
(c380004 also fails with gcc-4.2 mainline).
If the compiler is built with checks disabled then <a href="http://llvm.org/PR2010">c393010</a>
causes the compiler to go into an infinite loop, using up all system memory.</li>
<li>Some GCC specific Ada tests continue to crash the compiler.</li>
<li>The <tt>-E</tt> binder option (exception backtraces)
<a href="http://llvm.org/PR1982">does not work</a> and will result in programs
crashing if an exception is raised. Workaround: do not use <tt>-E</tt>.</li>
<li>Only discrete types <a href="http://llvm.org/PR1981">are allowed to start
or finish at a non-byte offset</a> in a record. Workaround: do not pack records
or use representation clauses that result in a field of a non-discrete type
starting or finishing in the middle of a byte.</li>
<li>The <tt>lli</tt> interpreter <a href="http://llvm.org/PR2009">considers
'main' as generated by the Ada binder to be invalid</a>.
Workaround: hand edit the file to use pointers for <tt>argv</tt> and
<tt>envp</tt> rather than integers.</li>
<li>The <tt>-fstack-check</tt> option <a href="http://llvm.org/PR2008">is
ignored</a>.</li>
</ul>
</div>
<!-- *********************************************************************** -->
<div class="doc_section">
<a name="additionalinfo">Additional Information</a>
</div>
<!-- *********************************************************************** -->
<div class="doc_text">
<p>A wide variety of additional information is available on the <a
href="http://llvm.org">LLVM web page</a>, in particular in the <a
href="http://llvm.org/docs/">documentation</a> section. The web page also
contains versions of the API documentation which is up-to-date with the
Subversion version of the source code.
You can access versions of these documents specific to this release by going
into the "<tt>llvm/doc/</tt>" directory in the LLVM tree.</p>
<p>If you have any questions or comments about LLVM, please feel free to contact
us via the <a href="http://llvm.org/docs/#maillist"> mailing
lists</a>.</p>
</div>
<!-- *********************************************************************** -->
<hr>
<address>
<a href="http://jigsaw.w3.org/css-validator/check/referer"><img
src="http://jigsaw.w3.org/css-validator/images/vcss-blue" alt="Valid CSS"></a>
<a href="http://validator.w3.org/check/referer"><img
src="http://www.w3.org/Icons/valid-html401-blue" alt="Valid HTML 4.01"></a>
<a href="http://llvm.org/">LLVM Compiler Infrastructure</a><br>
Last modified: $Date$
</address>
</body>
</html>