mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +00:00
1c954715ed
git-svn-id: https://llvm.org/svn/llvm-project/llvm/branches/release_35@223459 91177308-0d34-0410-b5e6-96231b3b80d8
399 lines
18 KiB
ReStructuredText
399 lines
18 KiB
ReStructuredText
======================
|
||
LLVM 3.5 Release Notes
|
||
======================
|
||
|
||
.. contents::
|
||
:local:
|
||
|
||
|
||
Introduction
|
||
============
|
||
|
||
This document contains the release notes for the LLVM Compiler Infrastructure,
|
||
release 3.5. Here we describe the status of LLVM, including major improvements
|
||
from the previous release, improvements in various subprojects of LLVM, and
|
||
some of the current users of the code. All LLVM releases may be downloaded
|
||
from the `LLVM releases web site <http://llvm.org/releases/>`_.
|
||
|
||
For more information about LLVM, including information about the latest
|
||
release, please check out the `main LLVM web site <http://llvm.org/>`_. If you
|
||
have questions or comments, the `LLVM Developer's Mailing List
|
||
<http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev>`_ is a good place to send
|
||
them.
|
||
|
||
Non-comprehensive list of changes in this release
|
||
=================================================
|
||
|
||
Changes to the MIPS Target
|
||
--------------------------
|
||
|
||
* A large number of bugs have been fixed for big-endian Mips targets using the
|
||
N32 and N64 ABI's. Please note that some of these bugs will still affect
|
||
LLVM-IR generated by LLVM 3.5 since correct code generation depends on
|
||
appropriate usage of the ``inreg``, ``signext``, and ``zeroext`` attributes
|
||
on all function arguments and returns.
|
||
|
||
* The registers used to return a structure containing a single 128-bit floating
|
||
point member on the N32/N64 ABI's have been changed from those specified by
|
||
the ABI documentation to match those used by GCC. The documentation specifies
|
||
that ``$f0`` and ``$f2`` should be used but GCC has used ``$f0`` and ``$f1``
|
||
for many years.
|
||
|
||
* Returning a zero-byte struct no longer causes incorrect code generation when
|
||
using the O32 ABI.
|
||
|
||
* Passing structures of less than 32-bits using the O32 ABI on a big-endian
|
||
target has been fixed.
|
||
|
||
* The exception personality has been changed for 64-bit Mips targets to
|
||
eliminate warnings about relocations in a read-only section.
|
||
|
||
* Incorrect usage of odd-numbered single-precision floating point registers
|
||
has been fixed when the fastcc calling convention is used with 64-bit FPU's
|
||
and -mno-odd-spreg.
|
||
|
||
* For inline assembly, the 'z' print-modifier print modifier can now be used on
|
||
non-immediate values.
|
||
|
||
* Attempting to disassemble l[wd]c[23], s[wd]c[23], cache, and pref no longer
|
||
triggers an assertion.
|
||
|
||
Non-comprehensive list of changes in 3.5
|
||
========================================
|
||
|
||
* All backends have been changed to use the MC asm printer and support for the
|
||
non MC one has been removed.
|
||
|
||
* Clang can now successfully self-host itself on Linux/Sparc64 and on
|
||
FreeBSD/Sparc64.
|
||
|
||
* LLVM now assumes the assembler supports ``.loc`` for generating debug line
|
||
numbers. The old support for printing the debug line info directly was only
|
||
used by ``llc`` and has been removed.
|
||
|
||
* All inline assembly is parsed by the integrated assembler when it is enabled.
|
||
Previously this was only the case for object-file output. It is now the case
|
||
for assembly output as well. The integrated assembler can be disabled with
|
||
the ``-no-integrated-as`` option.
|
||
|
||
* llvm-ar now handles IR files like regular object files. In particular, a
|
||
regular symbol table is created for symbols defined in IR files, including
|
||
those in file scope inline assembly.
|
||
|
||
* LLVM now always uses cfi directives for producing most stack
|
||
unwinding information.
|
||
|
||
* The prefix for loop vectorizer hint metadata has been changed from
|
||
``llvm.vectorizer`` to ``llvm.loop.vectorize``. In addition,
|
||
``llvm.vectorizer.unroll`` metadata has been renamed
|
||
``llvm.loop.interleave.count``.
|
||
|
||
* Some backends previously implemented Atomic NAND(x,y) as ``x & ~y``. Now
|
||
all backends implement it as ``~(x & y)``, matching the semantics of GCC 4.4
|
||
and later.
|
||
|
||
.. NOTE
|
||
For small 1-3 sentence descriptions, just add an entry at the end of
|
||
this list. If your description won't fit comfortably in one bullet
|
||
point (e.g. maybe you would like to give an example of the
|
||
functionality, or simply have a lot to talk about), see the `NOTE` below
|
||
for adding a new subsection.
|
||
|
||
* ... next change ...
|
||
|
||
.. NOTE
|
||
If you would like to document a larger change, then you can add a
|
||
subsection about it right here. You can copy the following boilerplate
|
||
and un-indent it (the indentation causes it to be inside this comment).
|
||
|
||
Special New Feature
|
||
-------------------
|
||
|
||
Makes programs 10x faster by doing Special New Thing.
|
||
|
||
Changes to the ARM Backend
|
||
--------------------------
|
||
|
||
Since release 3.3, a lot of new features have been included in the ARM
|
||
back-end but weren't production ready (ie. well tested) on release 3.4.
|
||
Just after the 3.4 release, we started heavily testing two major parts
|
||
of the back-end: the integrated assembler (IAS) and the ARM exception
|
||
handling (EHABI), and now they are enabled by default on LLVM/Clang.
|
||
|
||
The IAS received a lot of GNU extensions and directives, as well as some
|
||
specific pre-UAL instructions. Not all remaining directives will be
|
||
implemented, as we made judgement calls on the need versus the complexity,
|
||
and have chosen simplicity and future compatibility where hard decisions
|
||
had to be made. The major difference is, as stated above, the IAS validates
|
||
all inline ASM, not just for object emission, and that cause trouble with
|
||
some uses of inline ASM as pre-processor magic.
|
||
|
||
So, while the IAS is good enough to compile large projects (including most
|
||
of the Linux kernel), there are a few things that we can't (and probably
|
||
won't) do. For those cases, please use ``-fno-integrated-as`` in Clang.
|
||
|
||
Exception handling is another big change. After extensive testing and
|
||
changes to cooperate with Dwarf unwinding, EHABI is enabled by default.
|
||
The options ``-arm-enable-ehabi`` and ``-arm-enable-ehabi-descriptors``,
|
||
which were used to enable EHABI in the previous releases, are removed now.
|
||
|
||
This means all ARM code will emit EH unwind tables, or CFI unwinding (for
|
||
debug/profiling), or both. To avoid run-time inconsistencies, C code will
|
||
also emit EH tables (in case they interoperate with C++ code), as is the
|
||
case for other architectures (ex. x86_64).
|
||
|
||
Changes to the MIPS Target
|
||
--------------------------
|
||
|
||
There has been a large amount of improvements to the MIPS target which can be
|
||
broken down into subtarget, ABI, and Integrated Assembler changes.
|
||
|
||
Subtargets
|
||
^^^^^^^^^^
|
||
|
||
Added support for Release 6 of the MIPS32 and MIPS64 architecture (MIPS32r6
|
||
and MIPS64r6). Release 6 makes a number of significant changes to the MIPS32
|
||
and MIPS64 architectures. For example, FPU registers are always 64-bits wide,
|
||
FPU NaN values conform to IEEE 754 (2008), and the unaligned memory instructions
|
||
(such as lwl and lwr) have been replaced with a requirement for ordinary memory
|
||
operations to support unaligned operations. Full details of MIPS32 and MIPS64
|
||
Release 6 can be found on the `MIPS64 Architecture page at Imagination
|
||
Technologies <http://www.imgtec.com/mips/architectures/mips64.asp>`_.
|
||
|
||
This release also adds experimental support for MIPS-IV, cnMIPS, and Cavium
|
||
Octeon CPU's.
|
||
|
||
Support for the MIPS SIMD Architecture (MSA) has been improved to support MSA
|
||
on MIPS64.
|
||
|
||
Support for IEEE 754 (2008) NaN values has been added.
|
||
|
||
ABI and ABI extensions
|
||
^^^^^^^^^^^^^^^^^^^^^^
|
||
|
||
There has also been considerable ABI work since the 3.4 release. This release
|
||
adds support for the N32 ABI, the O32-FPXX ABI Extension, the O32-FP64 ABI
|
||
Extension, and the O32-FP64A ABI Extension.
|
||
|
||
The N32 ABI is an existing ABI that has now been implemented in LLVM. It is a
|
||
64-bit ABI that is similar to N64 but retains 32-bit pointers. N64 remains the
|
||
default 64-bit ABI in LLVM. This differs from GCC where N32 is the default
|
||
64-bit ABI.
|
||
|
||
The O32-FPXX ABI Extension is 100% compatible with the O32-ABI and the O32-FP64
|
||
ABI Extension and may be linked with either but may not be linked with both of
|
||
these simultaneously. It extends the O32 ABI to allow the same code to execute
|
||
without modification on processors with 32-bit FPU registers as well as 64-bit
|
||
FPU registers. The O32-FPXX ABI Extension is enabled by default for the O32 ABI
|
||
on mips*-img-linux-gnu and mips*-mti-linux-gnu triples and is selected with
|
||
-mfpxx. It is expected that future releases of LLVM will enable the FPXX
|
||
Extension for O32 on all triples.
|
||
|
||
The O32-FP64 ABI Extension is an extension to the O32 ABI to fully exploit FPU's
|
||
with 64-bit registers and is enabled with -mfp64. This replaces an undocumented
|
||
and unsupported O32 extension which was previously enabled with -mfp64. It is
|
||
100% compatible with the O32-FPXX ABI Extension.
|
||
|
||
The O32-FP64A ABI Extension is a restricted form of the O32-FP64 ABI Extension
|
||
which allows interlinking with unmodified binaries that use the base O32 ABI.
|
||
|
||
Integrated Assembler
|
||
^^^^^^^^^^^^^^^^^^^^
|
||
|
||
The MIPS Integrated Assembler has undergone a substantial overhaul including a
|
||
rewrite of the assembly parser. It's not ready for general use in this release
|
||
but adventurous users may wish to enable it using ``-fintegrated-as``.
|
||
|
||
In this release, the integrated assembler supports the majority of MIPS-I,
|
||
MIPS-II, MIPS-III, MIPS-IV, MIPS-V, MIPS32, MIPS32r2, MIPS32r6, MIPS64,
|
||
MIPS64r2, and MIPS64r6 as well as some of the Application Specific Extensions
|
||
such as MSA. It also supports several of the MIPS specific assembler directives
|
||
such as ``.set``, ``.module``, ``.cpload``, etc.
|
||
|
||
Changes to the AArch64 Target
|
||
-----------------------------
|
||
|
||
The AArch64 target in LLVM 3.5 is based on substantially different code to the
|
||
one in LLVM 3.4, having been created as the result of merging code released by
|
||
Apple for targetting iOS with the previously existing backend.
|
||
|
||
We hope the result is a general improvement in the project. Particularly notable
|
||
changes are:
|
||
|
||
* We should produce faster code, having combined optimisations and ideas from
|
||
both sources in the final backend.
|
||
* We have a FastISel for AArch64, which should compile time for debug builds (at
|
||
-O0).
|
||
* We can now target iOS platforms (using the triple ``arm64-apple-ios7.0``).
|
||
|
||
Background
|
||
^^^^^^^^^^
|
||
|
||
During the 3.5 release cycle, Apple released the source used to generate 64-bit
|
||
ARM programs on iOS platforms. This took the form of a separate backend that had
|
||
been developed in parallel to, and largely isolation from, the existing
|
||
code.
|
||
|
||
We decided that maintaining the two backends indefinitely was not an option,
|
||
since their features almost entirely overlapped. However, the implementation
|
||
details in both were different enough that any merge had to firmly start with
|
||
one backend as the core and cherry-pick the best features and optimisations from
|
||
the other.
|
||
|
||
After discussion, we decided to start with the Apple backend (called ARM64 at
|
||
the time) since it was older, more thoroughly tested in production use, and had
|
||
fewer idiosyncracies in the implementation details.
|
||
|
||
Many people from across the community worked throughout April and May to ensure
|
||
that this merge destination had all the features we wanted, from both
|
||
sources. In many cases we could simply copy code across; others needed heavy
|
||
modification for the new host; in the most worthwhile, we looked at both
|
||
implementations and combined the best features of each in an entirely new way.
|
||
|
||
We had also decided that the name of the combined backend should be AArch64,
|
||
following ARM's official documentation. So, at the end of May the old
|
||
AArch64 directory was removed, and ARM64 renamed into its place.
|
||
|
||
Changes to the PowerPC Target
|
||
-----------------------------
|
||
|
||
The PowerPC 64-bit Little Endian subtarget (powerpc64le-unknown-linux-gnu) is
|
||
now fully supported. This includes support for the Altivec instruction set.
|
||
|
||
The Power Architecture 64-Bit ELFv2 ABI Specification is now supported, and
|
||
is the default ABI for Little Endian. The ELFv1 ABI remains the default ABI
|
||
for Big Endian. Currently, it is not possible to override these defaults.
|
||
That capability will be available (albeit not recommended) in a future release.
|
||
|
||
Links to the ELFv2 ABI specification and to the Power ISA Version 2.07
|
||
specification may be found `here <https://www-03.ibm.com/technologyconnect/tgcm/TGCMServlet.wss?alias=OpenPOWER&linkid=1n0000>`_ (free registration required).
|
||
Efforts are underway to move this to a location that doesn't require
|
||
registration, but the planned site isn't ready yet.
|
||
|
||
Experimental support for the VSX instruction set introduced with ISA 2.06
|
||
is now available using the ``-mvsx`` switch. Work remains on this, so it
|
||
is not recommended for production use. VSX is disabled for Little Endian
|
||
regardless of this switch setting.
|
||
|
||
Load/store cost estimates have been improved.
|
||
|
||
Constant hoisting has been enabled.
|
||
|
||
Global named register support has been enabled.
|
||
|
||
Initial support for PIC code has been added for the 32-bit ELF subtarget.
|
||
Further support will be available in a future release.
|
||
|
||
|
||
Changes to CMake build system
|
||
-----------------------------
|
||
|
||
* Building and installing LLVM, Clang and lld sphinx documentation can now be
|
||
done in CMake builds. If ``LLVM_ENABLE_SPHINX`` is enabled the
|
||
"``docs-<project>-html``" and "``docs-<project>-man``" targets (e.g.
|
||
``docs-llvm-html``) become available which can be invoked directly (e.g.
|
||
``make docs-llvm-html``) to build only the relevant sphinx documentation. If
|
||
``LLVM_BUILD_DOCS`` is enabled then the sphinx documentation will also be
|
||
built as part of the normal build. Enabling this variable also means that if
|
||
the ``install`` target is invoked then the built documentation will be
|
||
installed. See :ref:`LLVM-specific variables`.
|
||
|
||
* Both the Autoconf/Makefile and CMake build systems now generate
|
||
``LLVMConfig.cmake`` (and other files) to export installed libraries. This
|
||
means that projects using CMake to build against LLVM libraries can now build
|
||
against an installed LLVM built by the Autoconf/Makefile system. See
|
||
:ref:`Embedding LLVM in your project` for details.
|
||
|
||
* Use of ``llvm_map_components_to_libraries()`` by external projects is
|
||
deprecated and the new ``llvm_map_components_to_libnames()`` should be used
|
||
instead.
|
||
|
||
External Open Source Projects Using LLVM 3.5
|
||
============================================
|
||
|
||
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 3.5.
|
||
|
||
LDC - the LLVM-based D compiler
|
||
-------------------------------
|
||
|
||
`D <http://dlang.org>`_ is a language with C-like syntax and static typing. It
|
||
pragmatically combines efficiency, control, and modeling power, with safety and
|
||
programmer productivity. D supports powerful concepts like Compile-Time Function
|
||
Execution (CTFE) and Template Meta-Programming, provides an innovative approach
|
||
to concurrency and offers many classical paradigms.
|
||
|
||
`LDC <http://wiki.dlang.org/LDC>`_ uses the frontend from the reference compiler
|
||
combined with LLVM as backend to produce efficient native code. LDC targets
|
||
x86/x86_64 systems like Linux, OS X, FreeBSD and Windows and also Linux/PPC64.
|
||
Ports to other architectures like ARM, AArch64 and MIPS64 are underway.
|
||
|
||
Portable Computing Language (pocl)
|
||
----------------------------------
|
||
|
||
In addition to producing an easily portable open source OpenCL
|
||
implementation, another major goal of `pocl <http://portablecl.org/>`_
|
||
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.
|
||
|
||
TTA-based Co-design Environment (TCE)
|
||
-------------------------------------
|
||
|
||
`TCE <http://tce.cs.tut.fi/>`_ is a toolset for designing new
|
||
exposed datapath processors 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.
|
||
|
||
TCE uses Clang and LLVM for C/C++/OpenCL 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 processors and
|
||
loads them in to the compiler backend as runtime libraries to avoid
|
||
per-target recompilation of larger parts of the compiler chain.
|
||
|
||
ISPC
|
||
----
|
||
|
||
`ISPC <http://ispc.github.io/>`_ is a C-based language based on the SPMD
|
||
(single program, multiple data) programming model that generates efficient
|
||
SIMD code for modern processors without the need for complex analysis and
|
||
autovectorization. The language exploits the concept of “varying” data types,
|
||
which ensure vector-friendly data layout, explicit vectorization and compact
|
||
representation of the program. The project uses the LLVM infrastructure for
|
||
optimization and code generation.
|
||
|
||
Likely
|
||
------
|
||
|
||
`Likely <http://www.liblikely.org>`_ is an embeddable just-in-time Lisp for
|
||
image recognition and heterogenous architectures. Algorithms are just-in-time
|
||
compiled using LLVM’s MCJIT infrastructure to execute on single or
|
||
multi-threaded CPUs and potentially OpenCL SPIR or CUDA enabled GPUs. Likely
|
||
exploits the observation that while image processing and statistical learning
|
||
kernels must be written generically to handle any matrix datatype, at runtime
|
||
they tend to be executed repeatedly on the same type. Likely also seeks to
|
||
explore new optimizations for statistical learning algorithms by moving them
|
||
from an offline model generation step to a compile-time simplification of a
|
||
function (the learning algorithm) with constant arguments (the training set).
|
||
|
||
|
||
Additional Information
|
||
======================
|
||
|
||
A wide variety of additional information is available on the `LLVM web page
|
||
<http://llvm.org/>`_, in particular in the `documentation
|
||
<http://llvm.org/docs/>`_ 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 ``llvm/docs/`` directory in the LLVM tree.
|
||
|
||
If you have any questions or comments about LLVM, please feel free to contact
|
||
us via the `mailing lists <http://llvm.org/docs/#maillist>`_.
|
||
|