| ======================== | |
| 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. | |
| * Libraries have been renamed from 7.0 to 7. This change also impacts | |
| downstream libraries like lldb. | |
| * 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>`_. |