| ======================== |
| LLVM 7.0.0 Release Notes |
| ======================== |
| |
| .. contents:: |
| :local: |
| |
| |
| Introduction |
| ============ |
| |
| This document contains the release notes for the LLVM Compiler Infrastructure, |
| release 7.0.0. 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 <https://llvm.org/releases/>`_. |
| |
| For more information about LLVM, including information about the latest |
| release, please check out the `main LLVM web site <https://llvm.org/>`_. If you |
| have questions or comments, the `LLVM Developer's Mailing List |
| <https://lists.llvm.org/mailman/listinfo/llvm-dev>`_ is a good place to send |
| them. |
| |
| Non-comprehensive list of changes in this release |
| ================================================= |
| |
| * The Windows installer no longer includes a Visual Studio integration. |
| Instead, a new |
| `LLVM Compiler Toolchain Visual Studio extension <https://marketplace.visualstudio.com/items?itemName=LLVMExtensions.llvm-toolchain>`_ |
| is available on the Visual Studio Marketplace. The new integration |
| supports Visual Studio 2017. |
| |
| * The LoopInstSimplify pass (``-loop-instsimplify``) has been removed. |
| |
| * Symbols starting with ``?`` are no longer mangled by LLVM when using the |
| Windows ``x`` or ``w`` IR mangling schemes. |
| |
| * A new tool named :doc:`llvm-exegesis <CommandGuide/llvm-exegesis>` has been |
| added. :program:`llvm-exegesis` automatically measures instruction scheduling |
| properties (latency/uops) and provides a principled way to edit scheduling |
| models. |
| |
| * A new tool named :doc:`llvm-mca <CommandGuide/llvm-mca>` has been added. |
| :program:`llvm-mca` is a static performance analysis tool that uses |
| information available in LLVM to statically predict the performance of |
| machine code for a specific CPU. |
| |
| * Optimization of floating-point casts is improved. This may cause surprising |
| results for code that is relying on the undefined behavior of overflowing |
| casts. The optimization can be disabled by specifying a function attribute: |
| ``"strict-float-cast-overflow"="false"``. This attribute may be created by the |
| clang option ``-fno-strict-float-cast-overflow``. |
| Code sanitizers can be used to detect affected patterns. The clang option for |
| detecting this problem alone is ``-fsanitize=float-cast-overflow``: |
| |
| .. code-block:: c |
| |
| int main() { |
| float x = 4294967296.0f; |
| x = (float)((int)x); |
| printf("junk in the ftrunc: %f\n", x); |
| return 0; |
| } |
| |
| .. code-block:: bash |
| |
| clang -O1 ftrunc.c -fsanitize=float-cast-overflow ; ./a.out |
| ftrunc.c:5:15: runtime error: 4.29497e+09 is outside the range of representable values of type 'int' |
| junk in the ftrunc: 0.000000 |
| |
| * ``LLVM_ON_WIN32`` is no longer set by ``llvm/Config/config.h`` and |
| ``llvm/Config/llvm-config.h``. If you used this macro, use the compiler-set |
| ``_WIN32`` instead which is set exactly when ``LLVM_ON_WIN32`` used to be set. |
| |
| * The ``DEBUG`` macro has been renamed to ``LLVM_DEBUG``, the interface remains |
| the same. If you used this macro you need to migrate to the new one. |
| You should also clang-format your code to make it easier to integrate future |
| changes locally. This can be done with the following bash commands: |
| |
| .. code-block:: bash |
| |
| git grep -l 'DEBUG' | xargs perl -pi -e 's/\bDEBUG\s?\(/LLVM_DEBUG(/g' |
| git diff -U0 master | ../clang/tools/clang-format/clang-format-diff.py -i -p1 -style LLVM |
| |
| * Early support for UBsan, X-Ray instrumentation and libFuzzer (x86 and x86_64) |
| for OpenBSD. Support for MSan (x86_64), X-Ray instrumentation and libFuzzer |
| (x86 and x86_64) for FreeBSD. |
| |
| * ``SmallVector<T, 0>`` shrank from ``sizeof(void*) * 4 + sizeof(T)`` to |
| ``sizeof(void*) + sizeof(unsigned) * 2``, smaller than ``std::vector<T>`` on |
| 64-bit platforms. The maximum capacity is now restricted to ``UINT32_MAX``. |
| Since SmallVector doesn't have the exception-safety pessimizations some |
| implementations saddle ``std::vector`` with and is better at using ``realloc``, |
| it's now a better choice even on the heap (although when ``TinyPtrVector`` works, |
| that's even smaller). |
| |
| * Preliminary/experimental support for DWARF v5 debugging information, |
| including the new ``.debug_names`` accelerator table. DWARF emitted at ``-O0`` |
| should be fully DWARF v5 compliant. Type units and split DWARF are known |
| not to be compliant, and higher optimization levels will still emit some |
| information in v4 format. |
| |
| * Added support for the ``.rva`` assembler directive for COFF targets. |
| |
| * The :program:`llvm-rc` tool (Windows Resource Compiler) has been improved |
| a bit. There are still known missing features, but it is generally usable |
| in many cases. (The tool still doesn't preprocess input files automatically, |
| but it can now handle leftover C declarations in preprocessor output, if |
| given output from a preprocessor run externally.) |
| |
| * CodeView debug info can now be emitted for MinGW configurations, if requested. |
| |
| * The :program:`opt` tool now supports the ``-load-pass-plugin`` option for |
| loading pass plugins for the new PassManager. |
| |
| * Support for profiling JITed code with perf. |
| |
| |
| Changes to the LLVM IR |
| ---------------------- |
| |
| * The signatures for the builtins ``@llvm.memcpy``, ``@llvm.memmove``, and |
| ``@llvm.memset`` have changed. Alignment is no longer an argument, and are |
| instead conveyed as parameter attributes. |
| |
| * ``invariant.group.barrier`` has been renamed to ``launder.invariant.group``. |
| |
| * ``invariant.group`` metadata can now refer only to empty metadata nodes. |
| |
| Changes to the AArch64 Target |
| ----------------------------- |
| |
| * The ``.inst`` assembler directive is now usable on both COFF and Mach-O |
| targets, in addition to ELF. |
| |
| * Support for most remaining COFF relocations has been added. |
| |
| * Support for TLS on Windows has been added. |
| |
| * Assembler and disassembler support for the ARM Scalable Vector Extension has |
| been added. |
| |
| Changes to the ARM Target |
| ------------------------- |
| |
| * The ``.inst`` assembler directive is now usable on both COFF and Mach-O |
| targets, in addition to ELF. For Thumb, it can now also automatically |
| deduce the instruction size, without having to specify it with |
| e.g. ``.inst.w`` as before. |
| |
| Changes to the Hexagon Target |
| ----------------------------- |
| |
| * Hexagon now supports auto-vectorization for HVX. It is disabled by default |
| and can be turned on with ``-fvectorize``. For auto-vectorization to take |
| effect, code generation for HVX needs to be enabled with ``-mhvx``. |
| The complete set of options should include ``-fvectorize``, ``-mhvx``, |
| and ``-mhvx-length={64b|128b}``. |
| |
| * The support for Hexagon ISA V4 is deprecated and will be removed in the |
| next release. |
| |
| Changes to the MIPS Target |
| -------------------------- |
| |
| During this release the MIPS target has: |
| |
| * Added support for Virtualization, Global INValidate ASE, |
| and CRC ASE instructions. |
| |
| * Introduced definitions of ``[d]rem``, ``[d]remu``, |
| and microMIPSR6 ``ll/sc`` instructions. |
| |
| * Shrink-wrapping is now supported and enabled by default (except for ``-O0``). |
| |
| * Extended size reduction pass by the LWP and SWP instructions. |
| |
| * Gained initial support of GlobalISel instruction selection framework. |
| |
| * Updated the P5600 scheduler model not to use instruction itineraries. |
| |
| * Added disassembly support for comparison and fused (negative) multiply |
| ``add/sub`` instructions. |
| |
| * Improved the selection of multiple instructions. |
| |
| * Load/store ``lb``, ``sb``, ``ld``, ``sd``, ``lld``, ... instructions |
| now support 32/64-bit offsets. |
| |
| * Added support for ``y``, ``M``, and ``L`` inline assembler operand codes. |
| |
| * Extended list of relocations supported by the ``.reloc`` directive |
| |
| * Fixed using a wrong register class for creating an emergency |
| spill slot for mips3 / n64 ABI. |
| |
| * MIPS relocation types were generated for microMIPS code. |
| |
| * Corrected definitions of multiple instructions (``lwp``, ``swp``, ``ctc2``, |
| ``cfc2``, ``sync``, ``synci``, ``cvt.d.w``, ...). |
| |
| * Fixed atomic operations at ``-O0`` level. |
| |
| * Fixed local dynamic TLS with Sym64 |
| |
| Changes to the PowerPC Target |
| ----------------------------- |
| |
| During this release the PowerPC target has: |
| |
| * Replaced the list scheduler for post register allocation with the machine scheduler. |
| |
| * Added support for ``coldcc`` calling convention. |
| |
| * Added support for ``symbol@high`` and ``symbol@higha`` symbol modifiers. |
| |
| * Added support for quad-precision floating point type (``__float128``) under the llvm option ``-enable-ppc-quad-precision``. |
| |
| * Added dump function to ``LatencyPriorityQueue``. |
| |
| * Completed the Power9 scheduler model. |
| |
| * Optimized TLS code generation. |
| |
| * Improved MachineLICM for hoisting constant stores. |
| |
| * Improved code generation to reduce register use by using more register + immediate instructions. |
| |
| * Improved code generation to better exploit rotate-and-mask instructions. |
| |
| * Fixed the bug in dynamic loader for JIT which crashed NNVM. |
| |
| * Numerous bug fixes and code cleanups. |
| |
| Changes to the SystemZ Target |
| ----------------------------- |
| |
| During this release the SystemZ target has: |
| |
| * Added support for vector registers in inline asm statements. |
| |
| * Added support for stackmaps, patchpoints, and the anyregcc |
| calling convention. |
| |
| * Changed the default function alignment to 16 bytes. |
| |
| * Improved codegen for condition code handling. |
| |
| * Improved instruction scheduling and microarchitecture tuning for z13/z14. |
| |
| * Fixed support for generating GCOV coverage data. |
| |
| * Fixed some codegen bugs. |
| |
| Changes to the X86 Target |
| ------------------------- |
| |
| * The calling convention for the ``f80`` data type on MinGW targets has been |
| fixed. Normally, the calling convention for this type is handled within clang, |
| but if an intrinsic is used, which LLVM expands into a libcall, the |
| proper calling convention needs to be supported in LLVM as well. (Note, |
| on Windows, this data type is only used for long doubles in MinGW |
| environments - in MSVC environments, long doubles are the same size as |
| normal doubles.) |
| |
| Changes to the OCaml bindings |
| ----------------------------- |
| |
| * Removed ``add_bb_vectorize``. |
| |
| |
| Changes to the C API |
| -------------------- |
| |
| * Removed ``LLVMAddBBVectorizePass``. The implementation was removed and the C |
| interface was made a deprecated no-op in LLVM 5. Use |
| ``LLVMAddSLPVectorizePass`` instead to get the supported SLP vectorizer. |
| |
| * Expanded the OrcJIT APIs so they can register event listeners like debuggers |
| and profilers. |
| |
| Changes to the DAG infrastructure |
| --------------------------------- |
| * ``ADDC``/``ADDE``/``SUBC``/``SUBE`` are now deprecated and will default to expand. Backends |
| that wish to continue to use these opcodes should explicitely request to do so |
| using ``setOperationAction`` in their ``TargetLowering``. New backends |
| should use ``UADDO``/``ADDCARRY``/``USUBO``/``SUBCARRY`` instead of the deprecated opcodes. |
| |
| * The ``SETCCE`` opcode has now been removed in favor of ``SETCCCARRY``. |
| |
| * TableGen now supports multi-alternative pattern fragments via the ``PatFrags`` |
| class. ``PatFrag`` is now derived from ``PatFrags``, which may require minor |
| changes to backends that directly access ``PatFrag`` members. |
| |
| |
| External Open Source Projects Using LLVM 7 |
| ========================================== |
| |
| Zig Programming Language |
| ------------------------ |
| |
| `Zig <https://ziglang.org>`_ is an open-source programming language designed |
| for robustness, optimality, and clarity. Zig is an alternative to C, providing |
| high level features such as generics, compile time function execution, partial |
| evaluation, and LLVM-based coroutines, while exposing low level LLVM IR |
| features such as aliases and intrinsics. Zig uses Clang to provide automatic |
| import of .h symbols - even inline functions and macros. Zig uses LLD combined |
| with lazily building compiler-rt to provide out-of-the-box cross-compiling for |
| all supported targets. |
| |
| |
| Additional Information |
| ====================== |
| |
| A wide variety of additional information is available on the `LLVM web page |
| <https://llvm.org/>`_, in particular in the `documentation |
| <https://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 <https://llvm.org/docs/#mailing-lists>`_. |