mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-16 10:20:30 +00:00
Vendor import of llvm release_31 r156863 (the actual 3.1 release):
http://llvm.org/svn/llvm-project/llvm/branches/release_31@156863
This commit is contained in:
parent
887c359eb0
commit
0378662f5b
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/vendor/llvm/dist/; revision=235860 svn path=/vendor/llvm/llvm-release_31-r156863/; revision=235861; tag=vendor/llvm/llvm-release_31-r156863
@ -268,11 +268,21 @@ set(LLVMCONFIGLIBRARYDEPENDENCIESINC
|
||||
"${LLVM_BINARY_DIR}/tools/llvm-config/LibraryDependencies.inc")
|
||||
set(LLVMBUILDCMAKEFRAG
|
||||
"${LLVM_BINARY_DIR}/LLVMBuild.cmake")
|
||||
|
||||
# Create the list of optional components that are enabled
|
||||
if (LLVM_USE_INTEL_JITEVENTS)
|
||||
set(LLVMOPTIONALCOMPONENTS IntelJITEvents)
|
||||
endif (LLVM_USE_INTEL_JITEVENTS)
|
||||
if (LLVM_USE_OPROFILE)
|
||||
set(LLVMOPTIONALCOMPONENTS ${LLVMOPTIONALCOMPONENTS} OProfileJIT)
|
||||
endif (LLVM_USE_OPROFILE)
|
||||
|
||||
message(STATUS "Constructing LLVMBuild project information")
|
||||
execute_process(
|
||||
COMMAND ${PYTHON_EXECUTABLE} ${LLVMBUILDTOOL}
|
||||
--native-target "${LLVM_NATIVE_ARCH}"
|
||||
--enable-targets "${LLVM_TARGETS_TO_BUILD}"
|
||||
--enable-optional-components "${LLVMOPTIONALCOMPONENTS}"
|
||||
--write-library-table ${LLVMCONFIGLIBRARYDEPENDENCIESINC}
|
||||
--write-cmake-fragment ${LLVMBUILDCMAKEFRAG}
|
||||
ERROR_VARIABLE LLVMBUILDOUTPUT
|
||||
|
@ -351,3 +351,10 @@ INTEL_JITEVENTS_LIBDIR := @INTEL_JITEVENTS_LIBDIR@
|
||||
|
||||
# Flags to control building support for OProfile JIT API
|
||||
USE_OPROFILE := @USE_OPROFILE@
|
||||
|
||||
ifeq ($(USE_INTEL_JITEVENTS), 1)
|
||||
OPTIONAL_COMPONENTS += IntelJITEvents
|
||||
endif
|
||||
ifeq ($(USE_OPROFILE), 1)
|
||||
OPTIONAL_COMPONENTS += OProfileJIT
|
||||
endif
|
||||
|
@ -100,6 +100,7 @@ $(LLVMBuildMakeFrag): $(PROJ_SRC_ROOT)/Makefile.rules \
|
||||
$(Verb) $(LLVMBuildTool) \
|
||||
--native-target "$(TARGET_NATIVE_ARCH)" \
|
||||
--enable-targets "$(TARGETS_TO_BUILD)" \
|
||||
--enable-optional-components "$(OPTIONAL_COMPONENTS)" \
|
||||
--write-library-table $(LLVMConfigLibraryDependenciesInc) \
|
||||
--write-make-fragment $(LLVMBuildMakeFrag)
|
||||
|
||||
|
@ -272,6 +272,11 @@ required_libraries = Archive BitReader Core Support TransformUtils
|
||||
components. For example, the <i>X86</i> target might define a library
|
||||
group for all of the <i>X86</i> components. That library group might
|
||||
then be included in the <i>all-targets</i> library group.</p></li>
|
||||
|
||||
<li><i>installed</i> <b>[optional]</b> <b>[boolean]</b>
|
||||
<p>Whether this library is installed. Libraries that are not installed
|
||||
are only reported by <tt>llvm-config</tt> when it is run as part of a
|
||||
development directory.</p></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
|
@ -29,12 +29,6 @@
|
||||
<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 3.1
|
||||
release.<br>
|
||||
You may prefer the
|
||||
<a href="http://llvm.org/releases/3.0/docs/ReleaseNotes.html">LLVM 3.0
|
||||
Release Notes</a>.</h1>
|
||||
|
||||
<!-- *********************************************************************** -->
|
||||
<h2>
|
||||
<a name="intro">Introduction</a>
|
||||
@ -74,9 +68,9 @@ Release Notes</a>.</h1>
|
||||
|
||||
<p>The LLVM 3.1 distribution currently consists of code from the core LLVM
|
||||
repository (which roughly includes the LLVM optimizers, code generators and
|
||||
supporting tools), and the Clang 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>
|
||||
supporting tools), and the Clang 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>
|
||||
|
||||
<!--=========================================================================-->
|
||||
<h3>
|
||||
@ -94,16 +88,22 @@ Release Notes</a>.</h1>
|
||||
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 3.1 time-frame, the Clang team has made many improvements:</p>
|
||||
<p>In the LLVM 3.1 time-frame, the Clang team has made many improvements.
|
||||
Highlights include:</p>
|
||||
<ul>
|
||||
<li>C++11 support is greatly expanded including lambdas, initializer lists, constexpr, user-defined literals, and atomics.</li>
|
||||
<li>...</li>
|
||||
<li>Greatly expanded <a href="http://clang.llvm.org/cxx_status.html">C++11
|
||||
support</a> including lambdas, initializer lists, constexpr, user-defined
|
||||
literals, and atomics.</li>
|
||||
<li>A new <a href="http://clang.llvm.org/docs/Tooling.html">tooling</a>
|
||||
library to ease building of clang-based standalone tools.</li>
|
||||
<li>Extended support for
|
||||
<a href="http://clang.llvm.org/docs/ObjectiveCLiterals.html">literals in
|
||||
Objective C</a>.</li>
|
||||
</ul>
|
||||
|
||||
<p>For more details about the changes to Clang since the 2.9 release, see the
|
||||
<a href="http://clang.llvm.org/docs/ReleaseNotes.html">Clang release notes</a>
|
||||
</p>
|
||||
|
||||
<p>For more details about the changes to Clang since the 3.0 release, see the
|
||||
<a href="http://clang.llvm.org/docs/ReleaseNotes.html">Clang release
|
||||
notes.</a></p>
|
||||
|
||||
<p>If Clang rejects your code but another compiler accepts it, please take a
|
||||
look at the <a href="http://clang.llvm.org/compatibility.html">language
|
||||
@ -118,6 +118,7 @@ Release Notes</a>.</h1>
|
||||
</h3>
|
||||
|
||||
<div>
|
||||
|
||||
<p><a href="http://dragonegg.llvm.org/">DragonEgg</a> is a
|
||||
<a href="http://gcc.gnu.org/wiki/plugins">gcc plugin</a> that replaces GCC's
|
||||
optimizers and code generators with LLVM's. It works with gcc-4.5 and gcc-4.6
|
||||
@ -128,8 +129,7 @@ Release Notes</a>.</h1>
|
||||
|
||||
<p>The 3.1 release has the following notable changes:</p>
|
||||
|
||||
<ul>
|
||||
|
||||
<ul>
|
||||
<li>Partial support for gcc-4.7. Ada support is poor, but other languages work
|
||||
fairly well.</li>
|
||||
|
||||
@ -144,7 +144,6 @@ Release Notes</a>.</h1>
|
||||
aliasing and type ranges to the LLVM optimizers.</li>
|
||||
|
||||
<li>A regression test-suite was added.</li>
|
||||
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
@ -165,7 +164,9 @@ Release Notes</a>.</h1>
|
||||
implementations of this and other low-level routines (some are 3x faster than
|
||||
the equivalent libgcc routines).</p>
|
||||
|
||||
<p>....</p>
|
||||
<p>As of 3.1, compiler-rt includes the helper functions for atomic operations,
|
||||
allowing atomic operations on arbitrary-sized quantities to work. These
|
||||
functions follow the specification defined by gcc and are used by clang.</p>
|
||||
|
||||
</div>
|
||||
|
||||
@ -176,12 +177,11 @@ Release Notes</a>.</h1>
|
||||
|
||||
<div>
|
||||
|
||||
<p>LLDB is a ground-up implementation of a command line debugger, as well as a
|
||||
debugger API that can be used from other applications. LLDB makes use of the
|
||||
Clang parser to provide high-fidelity expression parsing (particularly for
|
||||
C++) and uses the LLVM JIT for target support.</p>
|
||||
|
||||
<p>...</p>
|
||||
<p><a href="http://lldb.llvm.org">LLDB</a> is a ground-up implementation of a
|
||||
command line debugger, as well as a debugger API that can be used from other
|
||||
applications. LLDB makes use of the Clang parser to provide high-fidelity
|
||||
expression parsing (particularly for C++) and uses the LLVM JIT for target
|
||||
support.</p>
|
||||
|
||||
</div>
|
||||
|
||||
@ -196,7 +196,16 @@ Release Notes</a>.</h1>
|
||||
licensed</a> under the MIT and UIUC license, allowing it to be used more
|
||||
permissively.</p>
|
||||
|
||||
<p>...</p>
|
||||
<p>Within the LLVM 3.1 time-frame there were the following highlights:</p>
|
||||
|
||||
<ul>
|
||||
<li>The <code><atomic></code> header is now passing all tests, when
|
||||
compiling with clang and linking against the support code from
|
||||
compiler-rt.</li>
|
||||
<li>FreeBSD now includes libc++ as part of the base system.</li>
|
||||
<li>libc++ has been ported to Solaris and, in combination with libcxxrt and
|
||||
clang, is working with a large body of existing code.</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
|
||||
@ -207,16 +216,12 @@ Release Notes</a>.</h1>
|
||||
|
||||
<div>
|
||||
|
||||
<p>The <a href="http://vmkit.llvm.org/">VMKit project</a> is an
|
||||
implementation of a Java Virtual Machine (Java VM or JVM) that uses LLVM for
|
||||
static and just-in-time compilation.
|
||||
<p>The <a href="http://vmkit.llvm.org/">VMKit project</a> is an implementation
|
||||
of a Java Virtual Machine (Java VM or JVM) that uses LLVM for static and
|
||||
just-in-time compilation.</p>
|
||||
|
||||
<p>In the LLVM 3.1 time-frame, VMKit has had significant improvements on both
|
||||
runtime and startup performance:</p>
|
||||
|
||||
<ul>
|
||||
<li>...</li>
|
||||
</ul>
|
||||
<p>In the LLVM 3.1 time-frame, VMKit has had significant improvements on both
|
||||
runtime and startup performance.</p>
|
||||
|
||||
</div>
|
||||
|
||||
@ -228,25 +233,23 @@ Release Notes</a>.</h1>
|
||||
|
||||
<div>
|
||||
|
||||
<p><a href="http://polly.llvm.org/">Polly</a> is an <em>experimental</em>
|
||||
<p><a href="http://polly.llvm.org/">Polly</a> is an <em>experimental</em>
|
||||
optimizer for data locality and parallelism. It currently provides high-level
|
||||
loop optimizations and automatic parallelisation (using the OpenMP run time).
|
||||
Work in the area of automatic SIMD and accelerator code generation was
|
||||
started.
|
||||
started.</p>
|
||||
|
||||
<p>Within the LLVM 3.1 time-frame there were the following highlights:</p>
|
||||
<p>Within the LLVM 3.1 time-frame there were the following highlights:</p>
|
||||
|
||||
<ul>
|
||||
<ul>
|
||||
<li>Polly became an official LLVM project</li>
|
||||
<li>Polly can be loaded directly into clang (Enabled by '-O3 -mllvm -polly'
|
||||
)</li>
|
||||
<li>An automatic scheduling optimizer (derived from <a
|
||||
href="http://pluto-compiler.sourceforge.net/">Pluto</a>) was integrated. It
|
||||
performs loop transformations to optimize for data-locality and parallelism.
|
||||
The transformations include, but are not limited to interchange, fusion,
|
||||
fission, skewing and tiling.
|
||||
</li>
|
||||
</ul>
|
||||
<li>Polly can be loaded directly into clang (enabled by '-O3 -mllvm -polly')</li>
|
||||
<li>An automatic scheduling optimizer (derived
|
||||
from <a href="http://pluto-compiler.sourceforge.net/">Pluto</a>) was
|
||||
integrated. It performs loop transformations to optimize for data-locality
|
||||
and parallelism. The transformations include, but are not limited to
|
||||
interchange, fusion, fission, skewing and tiling.</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
|
||||
@ -264,21 +267,143 @@ Release Notes</a>.</h1>
|
||||
a lot of other language and tools projects. This section lists some of the
|
||||
projects that have already been updated to work with LLVM 3.1.</p>
|
||||
|
||||
<h3>Crack</h3>
|
||||
|
||||
<div>
|
||||
|
||||
<p><a href="http://code.google.com/p/crack-language/">Crack</a> aims to provide
|
||||
the ease of development of a scripting language with the performance of a
|
||||
compiled language. The language derives concepts from C++, Java and Python,
|
||||
incorporating object-oriented programming, operator overloading and strong
|
||||
typing.</p>
|
||||
|
||||
</div>
|
||||
|
||||
<h3>FAUST</h3>
|
||||
|
||||
<div>
|
||||
|
||||
<p><a href="http://faust.grame.fr/">FAUST</a> is a compiled language for
|
||||
real-time audio signal processing. The name FAUST stands for Functional
|
||||
AUdio STream. Its programming model combines two approaches: functional
|
||||
programming and block diagram composition. In addition with the C, C++, Java,
|
||||
JavaScript output formats, the Faust compiler can generate LLVM bitcode, and
|
||||
works with LLVM 2.7-3.1.</p>
|
||||
|
||||
</div>
|
||||
|
||||
<h3>Glasgow Haskell Compiler (GHC)</h3>
|
||||
|
||||
<div>
|
||||
|
||||
<p><a href="http://www.haskell.org/ghc/">GHC</a> is an open source compiler and
|
||||
programming suite for Haskell, a 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>GHC 7.0 and onwards include an LLVM code generator, supporting LLVM 2.8 and
|
||||
later.</p>
|
||||
|
||||
</div>
|
||||
|
||||
<h3>Julia</h3>
|
||||
|
||||
<div>
|
||||
|
||||
<p><a href="https://github.com/JuliaLang/julia">Julia</a> is a high-level,
|
||||
high-performance dynamic language for technical computing. It provides a
|
||||
sophisticated compiler, distributed parallel execution, numerical accuracy,
|
||||
and an extensive mathematical function library. The compiler uses type
|
||||
inference to generate fast code without any type declarations, and uses
|
||||
LLVM's optimization passes and JIT compiler. The
|
||||
<a href="http://julialang.org/"> Julia Language</a> is designed
|
||||
around multiple dispatch, giving programs a large degree of flexibility. It
|
||||
is ready for use on many kinds of problems.</p>
|
||||
|
||||
</div>
|
||||
|
||||
<h3>LLVM D Compiler</h3>
|
||||
|
||||
<div>
|
||||
|
||||
<p><a href="https://github.com/ldc-developers/ldc">LLVM D Compiler</a> (LDC) is
|
||||
a compiler for the D programming Language. It is based on the DMD frontend
|
||||
and uses LLVM as backend.</p>
|
||||
|
||||
</div>
|
||||
|
||||
<h3>Open Shading Language</h3>
|
||||
|
||||
<div>
|
||||
|
||||
<p><a href="https://github.com/imageworks/OpenShadingLanguage/">Open Shading
|
||||
Language (OSL)</a> is a small but rich language for programmable shading in
|
||||
advanced global illumination renderers and other applications, ideal for
|
||||
describing materials, lights, displacement, and pattern generation. It uses
|
||||
LLVM to JIT complex shader networks to x86 code at runtime.</p>
|
||||
|
||||
<p>OSL was developed by Sony Pictures Imageworks for use in its in-house
|
||||
renderer used for feature film animation and visual effects, and is
|
||||
distributed as open source software with the "New BSD" license.</p>
|
||||
|
||||
</div>
|
||||
|
||||
<h3>Portable OpenCL (pocl)</h3>
|
||||
|
||||
<div>
|
||||
|
||||
<p>In addition to producing an easily portable open source OpenCL
|
||||
implementation, another major goal of <a href="http://pocl.sourceforge.net/">
|
||||
pocl</a> is improving performance portability of OpenCL programs with
|
||||
compiler optimizations, reducing the need for target-dependent manual
|
||||
optimizations. An important part of pocl is a set of LLVM passes used to
|
||||
statically parallelize multiple work-items with the kernel compiler, even in
|
||||
the presence of work-group barriers. This enables static parallelization of
|
||||
the fine-grained static concurrency in the work groups in multiple ways
|
||||
(SIMD, VLIW, superscalar,...).</p>
|
||||
|
||||
</div>
|
||||
|
||||
<h3>Pure</h3>
|
||||
|
||||
<p>Pure (http://pure-lang.googlecode.com/) 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. The
|
||||
interpreter uses LLVM as a backend to JIT-compile Pure programs to fast native
|
||||
code. 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 interface
|
||||
to C and other programming languages (including the ability to load LLVM bitcode
|
||||
modules, and inline C, C++, Fortran and Faust code in Pure programs if the
|
||||
corresponding LLVM-enabled compilers are installed).</p>
|
||||
<div>
|
||||
|
||||
<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. The interpreter uses LLVM as a backend to JIT-compile Pure
|
||||
programs to fast native code. 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 interface to C and other programming
|
||||
languages (including the ability to load LLVM bitcode modules, and inline C,
|
||||
C++, Fortran and Faust code in Pure programs if the corresponding
|
||||
LLVM-enabled compilers are installed).</p>
|
||||
|
||||
<p>Pure version 0.54 has been tested and is known to work with LLVM 3.1 (and
|
||||
continues to work with older LLVM releases >= 2.5).</p>
|
||||
continues to work with older LLVM releases >= 2.5).</p>
|
||||
|
||||
</div>
|
||||
|
||||
<h3>TTA-based Co-design Environment (TCE)</h3>
|
||||
|
||||
<div>
|
||||
|
||||
<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/Verilog and parallel program binaries.
|
||||
Processor customization points include the register files, function units,
|
||||
supported operations, and the interconnection network.</p>
|
||||
|
||||
<p>TCE uses 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>
|
||||
|
||||
@ -329,7 +454,6 @@ continues to work with older LLVM releases >= 2.5).</p>
|
||||
A full featured assembler and direct-to-object support for ARM.</li>
|
||||
<li><a href="#blockplacement">Basic Block Placement</a>
|
||||
Probability driven basic block placement.</li>
|
||||
<li>....</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
@ -345,18 +469,22 @@ continues to work with older LLVM releases >= 2.5).</p>
|
||||
<p>LLVM IR has several new features for better support of new targets and that
|
||||
expose new optimization opportunities:</p>
|
||||
|
||||
<ul>
|
||||
<li>IR support for half float</li>
|
||||
<li>IR support for vectors of pointers, including vector GEPs.</li>
|
||||
<li>Module flags have been introduced. They convey information about the
|
||||
module as a whole to LLVM subsystems.</li>
|
||||
<li>Loads can now have range metadata attached to them to describe the
|
||||
possible values being loaded.</li>
|
||||
<li>Inline cost heuristics have been completely overhauled and now closely
|
||||
model constant propagation through call sites, disregard trivially dead
|
||||
code costs, and can model C++ STL iterator patterns.</li>
|
||||
<li>....</li>
|
||||
</ul>
|
||||
<ul>
|
||||
<li>A new type representing 16 bit <i>half</i> floating point values has
|
||||
been added.</li>
|
||||
<li>IR now supports vectors of pointers, including vector GEPs.</li>
|
||||
<li>Module flags have been introduced. They convey information about the
|
||||
module as a whole to LLVM subsystems. This is currently used to encode
|
||||
Objective C ABI information.</li>
|
||||
<li>Loads can now have range metadata attached to them to describe the
|
||||
possible values being loaded.</li>
|
||||
<li>The <tt>llvm.ctlz</tt> and <tt>llvm.cttz</tt> intrinsics now have an
|
||||
additional argument which indicates whether the behavior of the intrinsic
|
||||
is undefined on a zero input. This can be used to generate more efficient
|
||||
code on platforms that only have instructions which don't return the type
|
||||
size when counting bits in 0.</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
|
||||
<!--=========================================================================-->
|
||||
@ -379,7 +507,9 @@ continues to work with older LLVM releases >= 2.5).</p>
|
||||
post-vectorization cleanup passes. For more information, see the EuroLLVM
|
||||
2012 slides: <a href="http://llvm.org/devmtg/2012-04-12/Slides/Hal_Finkel.pdf">
|
||||
Autovectorization with LLVM</a>.</li>
|
||||
<li>....</li>
|
||||
<li>Inline cost heuristics have been completely overhauled and now closely
|
||||
model constant propagation through call sites, disregard trivially dead
|
||||
code costs, and can model C++ STL iterator patterns.</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
@ -399,7 +529,9 @@ continues to work with older LLVM releases >= 2.5).</p>
|
||||
to the LLVM MC Project Blog Post</a>.</p>
|
||||
|
||||
<ul>
|
||||
<li>....</li>
|
||||
<li>The integrated assembler can optionally emit debug information when
|
||||
assembling a </tt>.s</tt> file. It can be enabled by passing the
|
||||
<tt>-g</tt> option to <tt>llvm-mc</tt>.</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
@ -436,6 +568,9 @@ continues to work with older LLVM releases >= 2.5).</p>
|
||||
representation of large clobber lists on call instructions. The register
|
||||
mask operand references a bit mask of preserved registers. Everything else
|
||||
is clobbered.</li>
|
||||
<li>The DWARF debug info writer gained support for emitting data for the
|
||||
<a href="SourceLevelDebugging.html#acceltable">name accelerator tables
|
||||
DWARF extension</a>. It is used by LLDB to speed up name lookup.</li>
|
||||
</ul>
|
||||
|
||||
<p> We added new TableGen infrastructure to support bundling for
|
||||
@ -469,13 +604,14 @@ static heuristics as well as source code annotations such as
|
||||
<p>New features and major changes in the X86 target include:</p>
|
||||
|
||||
<ul>
|
||||
<li>Bug fixes and improved support for AVX1</li>
|
||||
<li>Support for AVX2 (still incomplete at this point)</li>
|
||||
<li>Greatly improved support for AVX2.</li>
|
||||
<li>Lots of bug fixes and improvements for AVX1.</li>
|
||||
<li>Support for the FMA4 and XOP instruction set extensions.</li>
|
||||
<li>Call instructions use the new register mask operands for faster compile
|
||||
times and better support for different calling conventions. The old WINCALL
|
||||
instructions are no longer needed.</li>
|
||||
<li>DW2 Exception Handling is enabled on Cygwin and MinGW.</li>
|
||||
<li>Support for implicit TLS model used with MS VC runtime</li>
|
||||
<li>Support for implicit TLS model used with MSVC runtime.</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
@ -520,15 +656,38 @@ syntax, there are still significant gaps in that support.</p>
|
||||
</h3>
|
||||
|
||||
<div>
|
||||
|
||||
<p>This release has seen major new work on just about every aspect of the MIPS
|
||||
backend. Some of the major new features include:</p>
|
||||
New features and major changes in the MIPS target include:</p>
|
||||
|
||||
<ul>
|
||||
<li>....</li>
|
||||
<li>MIPS32 little-endian direct object code emission is functional.</li>
|
||||
<li>MIPS64 little-endian code generation is largely functional for N64 ABI in assembly printing mode with the exception of handling of long double (f128) type.</li>
|
||||
<li>Support for new instructions has been added, which includes swap-bytes
|
||||
instructions (WSBH and DSBH), floating point multiply-add/subtract and
|
||||
negative multiply-add/subtract instructions, and floating
|
||||
point load/store instructions with reg+reg addressing (LWXC1, etc.)</li>
|
||||
<li>Various fixes to improve performance have been implemented.</li>
|
||||
<li>Post-RA scheduling is now enabled at -O3.</li>
|
||||
<li>Support for soft-float code generation has been added.</li>
|
||||
<li>clang driver's support for MIPS 64-bits targets.</li>
|
||||
<li>Support for MIPS floating point ABI option in clang driver.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<!--=========================================================================-->
|
||||
<h3>
|
||||
<a name="PTX">PTX Target Improvements</a>
|
||||
</h3>
|
||||
|
||||
<div>
|
||||
|
||||
<p>An outstanding conditional inversion bug was fixed in this release.</p>
|
||||
|
||||
<p><b>NOTE</b>: LLVM 3.1 marks the last release of the PTX back-end, in its
|
||||
current form. The back-end is currently being replaced by the NVPTX
|
||||
back-end, currently in SVN ToT.</p>
|
||||
|
||||
</div>
|
||||
|
||||
<!--=========================================================================-->
|
||||
<h3>
|
||||
<a name="OtherTS">Other Target Specific Improvements</a>
|
||||
@ -536,12 +695,8 @@ syntax, there are still significant gaps in that support.</p>
|
||||
|
||||
<div>
|
||||
|
||||
<p>Support for Qualcomm's Hexagon VLIW processor has been added.</p>
|
||||
|
||||
<ul>
|
||||
<li>....</li>
|
||||
|
||||
|
||||
<li>Support for Qualcomm's Hexagon VLIW processor has been added.</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
@ -558,6 +713,12 @@ syntax, there are still significant gaps in that support.</p>
|
||||
from the previous release.</p>
|
||||
|
||||
<ul>
|
||||
<li>LLVM's build system now requires a python 2 interpreter to be present at
|
||||
build time. A perl interpreter is no longer required.</li>
|
||||
<li>The C backend has been removed. It had numerous problems, to the point of
|
||||
not being able to compile any nontrivial program.</li>
|
||||
<li>The Alpha, Blackfin and SystemZ targets have been removed due to lack of
|
||||
maintenance.</li>
|
||||
<li>LLVM 3.1 removes support for reading LLVM 2.9 bitcode files. Going
|
||||
forward, we aim for all future versions of LLVM to read bitcode files and
|
||||
<tt>.ll</tt> files produced by LLVM 3.0 and later.</li>
|
||||
@ -567,7 +728,6 @@ syntax, there are still significant gaps in that support.</p>
|
||||
<li>LLVM 3.0 and earlier automatically added the returns_twice fo functions
|
||||
like setjmp based on the name. This functionality was removed in 3.1.
|
||||
This affects Clang users, if -ffreestanding is used.</li>
|
||||
<li>....</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
@ -614,9 +774,9 @@ syntax, there are still significant gaps in that support.</p>
|
||||
<li><code>llvm::getTrapFunctionName()</code></li>
|
||||
<li><code>llvm::EnableSegmentedStacks</code></li>
|
||||
</ul></li>
|
||||
<li>The MDBuilder class has been added to simplify the creation of
|
||||
metadata.</li>
|
||||
<li>....</li>
|
||||
|
||||
<li>The <code>MDBuilder</code> class has been added to simplify the creation
|
||||
of metadata.</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
@ -633,16 +793,37 @@ syntax, there are still significant gaps in that support.</p>
|
||||
|
||||
|
||||
<ul>
|
||||
<li>llvm-stress is a command line tool for generating random .ll files to fuzz
|
||||
different LLVM components. </li>
|
||||
<li>llvm-ld has been removed. Use llvm-link or Clang instead.</li>
|
||||
<li>....</li>
|
||||
<li><tt>llvm-stress</tt> is a command line tool for generating random
|
||||
<tt>.ll</tt> files to fuzz different LLVM components. </li>
|
||||
<li>The <tt>llvm-ld</tt> tool has been removed. The clang driver provides a
|
||||
more reliable solution for turning a set of bitcode files into a binary.
|
||||
To merge bitcode files <tt>llvm-link</tt> can be used instead.</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<!--=========================================================================-->
|
||||
<h3>
|
||||
<a name="python">Python Bindings</a>
|
||||
</h3>
|
||||
|
||||
<div>
|
||||
|
||||
<p>Officially supported Python bindings have been added! Feature support is far
|
||||
from complete. The current bindings support interfaces to:</p>
|
||||
<ul>
|
||||
<li>....</li>
|
||||
<li>Object File Interface</li>
|
||||
<li>Disassembler</li>
|
||||
</ul>
|
||||
|
||||
<p>Using the Object File Interface, it is possible to inspect binary object files.
|
||||
Think of it as a Python version of readelf or llvm-objdump.</p>
|
||||
|
||||
<p>Support for additional features is currently being developed by community
|
||||
contributors. If you are interested in shaping the direction of the Python
|
||||
bindings, please express your intent on IRC or the developers list.</p>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@ -667,18 +848,13 @@ syntax, there are still significant gaps in that support.</p>
|
||||
<p>Known problem areas include:</p>
|
||||
|
||||
<ul>
|
||||
<li>The Alpha, Blackfin, CellSPU, MSP430, PTX, SystemZ and
|
||||
XCore backends are experimental, and the Alpha, Blackfin and SystemZ
|
||||
targets have already been removed from mainline.</li>
|
||||
<li>The CellSPU, MSP430, PTX and XCore backends are experimental.</li>
|
||||
|
||||
<li>The integrated assembler, disassembler, and JIT is not supported by
|
||||
several targets. If an integrated assembler is not supported, then a
|
||||
system assembler is required. For more details, see the <a
|
||||
href="CodeGenerator.html#targetfeatures">Target Features Matrix</a>.
|
||||
</li>
|
||||
|
||||
<li>The C backend has numerous problems and is not being actively maintained.
|
||||
Depending on it for anything serious is not advised.</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
@ -714,7 +890,7 @@ syntax, there are still significant gaps in that support.</p>
|
||||
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: 2012-05-13 12:04:01 +0200 (Sun, 13 May 2012) $
|
||||
Last modified: $Date: 2012-05-15 23:58:06 +0200 (Tue, 15 May 2012) $
|
||||
</address>
|
||||
|
||||
</body>
|
||||
|
@ -18,6 +18,6 @@
|
||||
[common]
|
||||
|
||||
[component_0]
|
||||
type = Library
|
||||
type = OptionalLibrary
|
||||
name = IntelJITEvents
|
||||
parent = ExecutionEngine
|
||||
|
@ -18,6 +18,6 @@
|
||||
[common]
|
||||
|
||||
[component_0]
|
||||
type = Library
|
||||
type = OptionalLibrary
|
||||
name = OProfileJIT
|
||||
parent = ExecutionEngine
|
||||
|
@ -54,7 +54,8 @@ using namespace llvm;
|
||||
static void VisitComponent(StringRef Name,
|
||||
const StringMap<AvailableComponent*> &ComponentMap,
|
||||
std::set<AvailableComponent*> &VisitedComponents,
|
||||
std::vector<StringRef> &RequiredLibs) {
|
||||
std::vector<StringRef> &RequiredLibs,
|
||||
bool IncludeNonInstalled) {
|
||||
// Lookup the component.
|
||||
AvailableComponent *AC = ComponentMap.lookup(Name);
|
||||
assert(AC && "Invalid component name!");
|
||||
@ -65,10 +66,14 @@ static void VisitComponent(StringRef Name,
|
||||
return;
|
||||
}
|
||||
|
||||
// Only include non-installed components if requested.
|
||||
if (!AC->IsInstalled && !IncludeNonInstalled)
|
||||
return;
|
||||
|
||||
// Otherwise, visit all the dependencies.
|
||||
for (unsigned i = 0; AC->RequiredLibraries[i]; ++i) {
|
||||
VisitComponent(AC->RequiredLibraries[i], ComponentMap, VisitedComponents,
|
||||
RequiredLibs);
|
||||
RequiredLibs, IncludeNonInstalled);
|
||||
}
|
||||
|
||||
// Add to the required library list.
|
||||
@ -83,8 +88,11 @@ static void VisitComponent(StringRef Name,
|
||||
/// \param Components - The names of the components to find libraries for.
|
||||
/// \param RequiredLibs [out] - On return, the ordered list of libraries that
|
||||
/// are required to link the given components.
|
||||
/// \param IncludeNonInstalled - Whether non-installed components should be
|
||||
/// reported.
|
||||
void ComputeLibsForComponents(const std::vector<StringRef> &Components,
|
||||
std::vector<StringRef> &RequiredLibs) {
|
||||
std::vector<StringRef> &RequiredLibs,
|
||||
bool IncludeNonInstalled) {
|
||||
std::set<AvailableComponent*> VisitedComponents;
|
||||
|
||||
// Build a map of component names to information.
|
||||
@ -107,7 +115,7 @@ void ComputeLibsForComponents(const std::vector<StringRef> &Components,
|
||||
}
|
||||
|
||||
VisitComponent(ComponentLower, ComponentMap, VisitedComponents,
|
||||
RequiredLibs);
|
||||
RequiredLibs, IncludeNonInstalled);
|
||||
}
|
||||
|
||||
// The list is now ordered with leafs first, we want the libraries to printed
|
||||
@ -278,6 +286,10 @@ int main(int argc, char **argv) {
|
||||
PrintLibFiles = true;
|
||||
} else if (Arg == "--components") {
|
||||
for (unsigned j = 0; j != array_lengthof(AvailableComponents); ++j) {
|
||||
// Only include non-installed components when in a development tree.
|
||||
if (!AvailableComponents[j].IsInstalled && !IsInDevelopmentTree)
|
||||
continue;
|
||||
|
||||
OS << ' ';
|
||||
OS << AvailableComponents[j].Name;
|
||||
}
|
||||
@ -310,7 +322,8 @@ int main(int argc, char **argv) {
|
||||
|
||||
// Construct the list of all the required libraries.
|
||||
std::vector<StringRef> RequiredLibs;
|
||||
ComputeLibsForComponents(Components, RequiredLibs);
|
||||
ComputeLibsForComponents(Components, RequiredLibs,
|
||||
/*IncludeNonInstalled=*/IsInDevelopmentTree);
|
||||
|
||||
for (unsigned i = 0, e = RequiredLibs.size(); i != e; ++i) {
|
||||
StringRef Lib = RequiredLibs[i];
|
||||
|
@ -68,6 +68,21 @@ def get_component_references(self):
|
||||
def get_llvmbuild_fragment(self):
|
||||
abstract
|
||||
|
||||
def get_parent_target_group(self):
|
||||
"""get_parent_target_group() -> ComponentInfo or None
|
||||
|
||||
Return the nearest parent target group (if any), or None if the
|
||||
component is not part of any target group.
|
||||
"""
|
||||
|
||||
# If this is a target group, return it.
|
||||
if self.type_name == 'TargetGroup':
|
||||
return self
|
||||
|
||||
# Otherwise recurse on the parent, if any.
|
||||
if self.parent_instance:
|
||||
return self.parent_instance.get_parent_target_group()
|
||||
|
||||
class GroupComponentInfo(ComponentInfo):
|
||||
"""
|
||||
Group components have no semantics as far as the build system are concerned,
|
||||
@ -95,16 +110,22 @@ class LibraryComponentInfo(ComponentInfo):
|
||||
type_name = 'Library'
|
||||
|
||||
@staticmethod
|
||||
def parse(subpath, items):
|
||||
def parse_items(items):
|
||||
kwargs = ComponentInfo.parse_items(items)
|
||||
kwargs['library_name'] = items.get_optional_string('library_name')
|
||||
kwargs['required_libraries'] = items.get_list('required_libraries')
|
||||
kwargs['add_to_library_groups'] = items.get_list(
|
||||
'add_to_library_groups')
|
||||
kwargs['installed'] = items.get_optional_bool('installed', True)
|
||||
return kwargs
|
||||
|
||||
@staticmethod
|
||||
def parse(subpath, items):
|
||||
kwargs = LibraryComponentInfo.parse_items(items)
|
||||
return LibraryComponentInfo(subpath, **kwargs)
|
||||
|
||||
def __init__(self, subpath, name, dependencies, parent, library_name,
|
||||
required_libraries, add_to_library_groups):
|
||||
required_libraries, add_to_library_groups, installed):
|
||||
ComponentInfo.__init__(self, subpath, name, dependencies, parent)
|
||||
|
||||
# If given, the name to use for the library instead of deriving it from
|
||||
@ -119,6 +140,9 @@ def __init__(self, subpath, name, dependencies, parent, library_name,
|
||||
# considered part of.
|
||||
self.add_to_library_groups = list(add_to_library_groups)
|
||||
|
||||
# Whether or not this library is installed.
|
||||
self.installed = installed
|
||||
|
||||
def get_component_references(self):
|
||||
for r in ComponentInfo.get_component_references(self):
|
||||
yield r
|
||||
@ -140,6 +164,8 @@ def get_llvmbuild_fragment(self):
|
||||
if self.add_to_library_groups:
|
||||
print >>result, 'add_to_library_groups = %s' % ' '.join(
|
||||
self.add_to_library_groups)
|
||||
if not self.installed:
|
||||
print >>result, 'installed = 0'
|
||||
return result.getvalue()
|
||||
|
||||
def get_library_name(self):
|
||||
@ -165,6 +191,20 @@ def get_prefixed_library_name(self):
|
||||
def get_llvmconfig_component_name(self):
|
||||
return self.get_library_name().lower()
|
||||
|
||||
class OptionalLibraryComponentInfo(LibraryComponentInfo):
|
||||
type_name = "OptionalLibrary"
|
||||
|
||||
@staticmethod
|
||||
def parse(subpath, items):
|
||||
kwargs = LibraryComponentInfo.parse_items(items)
|
||||
return OptionalLibraryComponentInfo(subpath, **kwargs)
|
||||
|
||||
def __init__(self, subpath, name, dependencies, parent, library_name,
|
||||
required_libraries, add_to_library_groups, installed):
|
||||
LibraryComponentInfo.__init__(self, subpath, name, dependencies, parent,
|
||||
library_name, required_libraries,
|
||||
add_to_library_groups, installed)
|
||||
|
||||
class LibraryGroupComponentInfo(ComponentInfo):
|
||||
type_name = 'LibraryGroup'
|
||||
|
||||
@ -375,7 +415,7 @@ def get_bool(self, key):
|
||||
for t in (GroupComponentInfo,
|
||||
LibraryComponentInfo, LibraryGroupComponentInfo,
|
||||
ToolComponentInfo, BuildToolComponentInfo,
|
||||
TargetGroupComponentInfo))
|
||||
TargetGroupComponentInfo, OptionalLibraryComponentInfo))
|
||||
def load_from_path(path, subpath):
|
||||
# Load the LLVMBuild.txt file as an .ini format file.
|
||||
parser = ConfigParser.RawConfigParser()
|
||||
|
@ -312,15 +312,26 @@ def write_components(self, output_path):
|
||||
|
||||
f.close()
|
||||
|
||||
def write_library_table(self, output_path):
|
||||
def write_library_table(self, output_path, enabled_optional_components):
|
||||
# Write out the mapping from component names to required libraries.
|
||||
#
|
||||
# We do this in topological order so that we know we can append the
|
||||
# dependencies for added library groups.
|
||||
entries = {}
|
||||
for c in self.ordered_component_infos:
|
||||
# Skip optional components which are not enabled.
|
||||
if c.type_name == 'OptionalLibrary' \
|
||||
and c.name not in enabled_optional_components:
|
||||
continue
|
||||
|
||||
# Skip target groups which are not enabled.
|
||||
tg = c.get_parent_target_group()
|
||||
if tg and not tg.enabled:
|
||||
continue
|
||||
|
||||
# Only certain components are in the table.
|
||||
if c.type_name not in ('Library', 'LibraryGroup', 'TargetGroup'):
|
||||
if c.type_name not in ('Library', 'OptionalLibrary', \
|
||||
'LibraryGroup', 'TargetGroup'):
|
||||
continue
|
||||
|
||||
# Compute the llvm-config "component name". For historical reasons,
|
||||
@ -328,10 +339,12 @@ def write_library_table(self, output_path):
|
||||
llvmconfig_component_name = c.get_llvmconfig_component_name()
|
||||
|
||||
# Get the library name, or None for LibraryGroups.
|
||||
if c.type_name == 'Library':
|
||||
if c.type_name == 'Library' or c.type_name == 'OptionalLibrary':
|
||||
library_name = c.get_prefixed_library_name()
|
||||
is_installed = c.installed
|
||||
else:
|
||||
library_name = None
|
||||
is_installed = True
|
||||
|
||||
# Get the component names of all the required libraries.
|
||||
required_llvmconfig_component_names = [
|
||||
@ -344,7 +357,8 @@ def write_library_table(self, output_path):
|
||||
|
||||
# Add the entry.
|
||||
entries[c.name] = (llvmconfig_component_name, library_name,
|
||||
required_llvmconfig_component_names)
|
||||
required_llvmconfig_component_names,
|
||||
is_installed)
|
||||
|
||||
# Convert to a list of entries and sort by name.
|
||||
entries = entries.values()
|
||||
@ -352,16 +366,16 @@ def write_library_table(self, output_path):
|
||||
# Create an 'all' pseudo component. We keep the dependency list small by
|
||||
# only listing entries that have no other dependents.
|
||||
root_entries = set(e[0] for e in entries)
|
||||
for _,_,deps in entries:
|
||||
for _,_,deps,_ in entries:
|
||||
root_entries -= set(deps)
|
||||
entries.append(('all', None, root_entries))
|
||||
entries.append(('all', None, root_entries, True))
|
||||
|
||||
entries.sort()
|
||||
|
||||
# Compute the maximum number of required libraries, plus one so there is
|
||||
# always a sentinel.
|
||||
max_required_libraries = max(len(deps)
|
||||
for _,_,deps in entries) + 1
|
||||
for _,_,deps,_ in entries) + 1
|
||||
|
||||
# Write out the library table.
|
||||
make_install_dir(os.path.dirname(output_path))
|
||||
@ -382,18 +396,21 @@ def write_library_table(self, output_path):
|
||||
print >>f, ' /// The name of the library for this component (or NULL).'
|
||||
print >>f, ' const char *Library;'
|
||||
print >>f, ''
|
||||
print >>f, ' /// Whether the component is installed.'
|
||||
print >>f, ' bool IsInstalled;'
|
||||
print >>f, ''
|
||||
print >>f, '\
|
||||
/// The list of libraries required when linking this component.'
|
||||
print >>f, ' const char *RequiredLibraries[%d];' % (
|
||||
max_required_libraries)
|
||||
print >>f, '} AvailableComponents[%d] = {' % len(entries)
|
||||
for name,library_name,required_names in entries:
|
||||
for name,library_name,required_names,is_installed in entries:
|
||||
if library_name is None:
|
||||
library_name_as_cstr = '0'
|
||||
else:
|
||||
library_name_as_cstr = '"lib%s.a"' % library_name
|
||||
print >>f, ' { "%s", %s, { %s } },' % (
|
||||
name, library_name_as_cstr,
|
||||
print >>f, ' { "%s", %s, %d, { %s } },' % (
|
||||
name, library_name_as_cstr, is_installed,
|
||||
', '.join('"%s"' % dep
|
||||
for dep in required_names))
|
||||
print >>f, '};'
|
||||
@ -778,6 +795,11 @@ def main():
|
||||
help=("Enable the given space or semi-colon separated "
|
||||
"list of targets, or all targets if not present"),
|
||||
action="store", default=None)
|
||||
group.add_option("", "--enable-optional-components",
|
||||
dest="optional_components", metavar="NAMES",
|
||||
help=("Enable the given space or semi-colon separated "
|
||||
"list of optional components"),
|
||||
action="store", default=None)
|
||||
parser.add_option_group(group)
|
||||
|
||||
(opts, args) = parser.parse_args()
|
||||
@ -819,7 +841,8 @@ def main():
|
||||
|
||||
# Write out the required library table, if requested.
|
||||
if opts.write_library_table:
|
||||
project_info.write_library_table(opts.write_library_table)
|
||||
project_info.write_library_table(opts.write_library_table,
|
||||
opts.optional_components)
|
||||
|
||||
# Write out the make fragment, if requested.
|
||||
if opts.write_make_fragment:
|
||||
|
@ -20,9 +20,11 @@ type = Library
|
||||
name = gtest
|
||||
parent = Libraries
|
||||
required_libraries = Support
|
||||
installed = 0
|
||||
|
||||
[component_1]
|
||||
type = Library
|
||||
name = gtest_main
|
||||
parent = Libraries
|
||||
required_libraries = gtest
|
||||
installed = 0
|
||||
|
Loading…
Reference in New Issue
Block a user