| ========================= |
| Clang 7.0.0 Release Notes |
| ========================= |
| |
| .. contents:: |
| :local: |
| :depth: 2 |
| |
| Written by the `LLVM Team <https://llvm.org/>`_ |
| |
| Introduction |
| ============ |
| |
| This document contains the release notes for the Clang C/C++/Objective-C |
| frontend, part of the LLVM Compiler Infrastructure, release 7.0.0. Here we |
| describe the status of Clang in some detail, including major |
| improvements from the previous release and new feature work. For the |
| general LLVM release notes, see `the LLVM |
| documentation <https://llvm.org/docs/ReleaseNotes.html>`_. All LLVM |
| releases may be downloaded from the `LLVM releases web |
| site <https://llvm.org/releases/>`_. |
| |
| For more information about Clang or LLVM, including information about the |
| latest release, please see the `Clang Web Site <https://clang.llvm.org>`_ or the |
| `LLVM Web Site <https://llvm.org>`_. |
| |
| What's New in Clang 7.0.0? |
| ========================== |
| |
| Some of the major new features and improvements to Clang are listed |
| here. Generic improvements to Clang as a whole or to its underlying |
| infrastructure are described first, followed by language-specific |
| sections with improvements to Clang's support for those languages. |
| |
| Major New Features |
| ------------------ |
| |
| - A new Implicit Conversion Sanitizer (``-fsanitize=implicit-conversion``) group |
| was added. Please refer to the :ref:`release-notes-ubsan` section of the |
| release notes for the details. |
| |
| - Preliminary/experimental support for DWARF v5 debugging information. If you |
| compile with ``-gdwarf-5 -O0`` you should get fully conforming DWARF v5 |
| information, including the new .debug_names accelerator table. Type units |
| and split DWARF are known not to conform, and higher optimization levels |
| will likely get a mix of v4 and v5 formats. |
| |
| Improvements to Clang's diagnostics |
| ----------------------------------- |
| |
| - ``-Wc++98-compat-extra-semi`` is a new flag, which was previously inseparable |
| from ``-Wc++98-compat-pedantic``. The latter still controls the new flag. |
| |
| - ``-Wextra-semi`` now also controls ``-Wc++98-compat-extra-semi``. |
| Please do note that if you pass ``-Wno-c++98-compat-pedantic``, it implies |
| ``-Wno-c++98-compat-extra-semi``, so if you want that diagnostic, you need |
| to explicitly re-enable it (e.g. by appending ``-Wextra-semi``). |
| |
| - ``-Wself-assign`` and ``-Wself-assign-field`` were extended to diagnose |
| self-assignment operations using overloaded operators (i.e. classes). |
| If you are doing such an assignment intentionally, e.g. in a unit test for |
| a data structure, the first warning can be disabled by passing |
| ``-Wno-self-assign-overloaded``, also the warning can be suppressed by adding |
| ``*&`` to the right-hand side or casting it to the appropriate reference type. |
| |
| Non-comprehensive list of changes in this release |
| ------------------------------------------------- |
| |
| - Clang binary and libraries have been renamed from 7.0 to 7. |
| For example, the ``clang`` binary will be called ``clang-7`` |
| instead of ``clang-7.0``. |
| |
| - The optimization flag to merge constants (``-fmerge-all-constants``) is no |
| longer applied by default. |
| |
| - Clang implements a collection of recent fixes to the C++ standard's definition |
| of "standard-layout". In particular, a class is only considered to be |
| standard-layout if all base classes and the first data member (or bit-field) |
| can be laid out at offset zero. |
| |
| - Clang's handling of the GCC ``packed`` class attribute in C++ has been fixed |
| to apply only to non-static data members and not to base classes. This fixes |
| an ABI difference between Clang and GCC, but creates an ABI difference between |
| Clang 7 and earlier versions. The old behavior can be restored by setting |
| ``-fclang-abi-compat`` to ``6`` or lower. |
| |
| - Clang implements the proposed resolution of LWG issue 2358, along with the |
| `corresponding change to the Itanium C++ ABI |
| <https://github.com/itanium-cxx-abi/cxx-abi/pull/51>`_, which make classes |
| containing only unnamed non-zero-length bit-fields be considered non-empty. |
| This is an ABI break compared to prior Clang releases, but makes Clang |
| generate code that is ABI-compatible with other compilers. The old |
| behavior can be restored by setting ``-fclang-abi-compat`` to ``6`` or |
| lower. |
| |
| - An existing tool named ``diagtool`` has been added to the release. As the |
| name suggests, it helps with dealing with diagnostics in ``clang``, such as |
| finding out the warning hierarchy, and which of them are enabled by default |
| or for a particular compiler invocation. |
| |
| - By default, Clang emits an address-significance table into |
| every ELF object file when using the integrated assembler. |
| Address-significance tables allow linkers to implement `safe ICF |
| <https://research.google.com/pubs/archive/36912.pdf>`_ without the false |
| positives that can result from other implementation techniques such as |
| relocation scanning. The ``-faddrsig`` and ``-fno-addrsig`` flags can be |
| used to control whether to emit the address-significance table. |
| |
| - The integrated assembler is enabled by default on OpenBSD / FreeBSD |
| for MIPS 64-bit targets. |
| |
| - On MIPS FreeBSD, default CPUs have been changed to ``mips2`` |
| for 32-bit targets and ``mips3`` for 64-bit targets. |
| |
| |
| New Compiler Flags |
| ------------------ |
| |
| - ``-fstrict-float-cast-overflow`` and ``-fno-strict-float-cast-overflow``. |
| |
| When converting a floating-point value to int and the value is not |
| representable in the destination integer type, |
| the code has undefined behavior according to the language standard. By |
| default, Clang will not guarantee any particular result in that case. With the |
| 'no-strict' option, Clang attempts to match the overflowing behavior of the |
| target's native float-to-int conversion instructions. |
| |
| - ``-fforce-emit-vtables`` and ``-fno-force-emit-vtables``. |
| |
| In order to improve devirtualization, forces emission of vtables even in |
| modules where it isn't necessary. It causes more inline virtual functions |
| to be emitted. |
| |
| - Added the ``-mcrc`` and ``-mno-crc`` flags to enable/disable using |
| of MIPS Cyclic Redundancy Check instructions. |
| |
| - Added the ``-mvirt`` and ``-mno-virt`` flags to enable/disable using |
| of MIPS Virtualization instructions. |
| |
| - Added the ``-mginv`` and ``-mno-ginv`` flags to enable/disable using |
| of MIPS Global INValidate instructions. |
| |
| |
| Modified Compiler Flags |
| ----------------------- |
| |
| - Before Clang 7, we prepended the `#` character to the ``--autocomplete`` |
| argument to enable cc1 flags. For example, when the ``-cc1`` or ``-Xclang`` flag |
| is in the :program:`clang` invocation, the shell executed |
| ``clang --autocomplete=#-<flag to be completed>``. Clang 7 now requires the |
| whole invocation including all flags to be passed to the ``--autocomplete`` like |
| this: ``clang --autocomplete=-cc1,-xc++,-fsyn``. |
| |
| |
| Attribute Changes in Clang |
| -------------------------- |
| |
| - Clang now supports function multiversioning with attribute 'target' on ELF |
| based x86/x86-64 environments by using indirect functions. This implementation |
| has a few minor limitations over the GCC implementation for the sake of AST |
| sanity, however it is otherwise compatible with existing code using this |
| feature for GCC. Consult the `documentation for the target attribute |
| <AttributeReference.html#target-gnu-target>`_ for more information. |
| |
| Windows Support |
| --------------- |
| |
| - clang-cl's support for precompiled headers has been much improved: |
| |
| - When using a pch file, clang-cl now no longer redundantly emits inline |
| methods that are already stored in the obj that was built together with |
| the pch file (matching cl.exe). This speeds up builds using pch files |
| by around 30%. |
| |
| - The ``/Ycfoo.h`` and ``/Yufoo.h`` flags can now be used without ``/FIfoo.h`` when |
| foo.h is instead included by an explicit ``#include`` directive. This means |
| Visual Studio's default stdafx.h setup now uses precompiled headers with |
| clang-cl. |
| |
| - The alternative entry point names |
| (``wmain``/``WinMain``/``wWinMain``/``DllMain``) now are properly mangled |
| as plain C names in C++ contexts when targeting MinGW, without having to |
| explicit specify ``extern "C"``. (This was already the case for MSVC |
| targets.) |
| |
| |
| Objective-C Language Changes in Clang |
| ------------------------------------- |
| |
| Clang now supports the GNUstep Objective-C ABI v2 on ELF platforms. This is |
| enabled with the ``-fobjc-runtime=gnustep-2.0`` flag. The new ABI is incompatible |
| with the older GNUstep ABIs, which were incremental changes on the old GCC ABI. |
| The new ABI provides richer reflection metadata and allows the linker to remove |
| duplicate selector and protocol definitions, giving smaller binaries. Windows |
| support for the new ABI is underway, but was not completed in time for the LLVM |
| 7.0.0 release. |
| |
| OpenCL C/C++ Language Changes in Clang |
| -------------------------------------- |
| |
| Miscellaneous changes in OpenCL C: |
| |
| - Added ``cles_khr_int64`` extension. |
| |
| - Added bug fixes and simplifications to Clang blocks in OpenCL mode. |
| |
| - Added compiler flag ``-cl-uniform-work-group-size`` to allow extra compile time optimisation. |
| |
| - Propagate ``denorms-are-zero`` attribute to IR if ``-cl-denorms-are-zero`` is passed to the compiler. |
| |
| - Separated ``read_only`` and ``write_only`` pipe IR types. |
| |
| - Fixed address space for the ``__func__`` predefined macro. |
| |
| - Improved diagnostics of kernel argument types. |
| |
| |
| Started OpenCL C++ support: |
| |
| - Added ``-std/-cl-std=c++``. |
| |
| - Added support for keywords. |
| |
| OpenMP Support in Clang |
| ---------------------------------- |
| |
| - Clang gained basic support for OpenMP 4.5 offloading for NVPTX target. |
| |
| To compile your program for NVPTX target use the following options: |
| ``-fopenmp -fopenmp-targets=nvptx64-nvidia-cuda`` for 64 bit platforms or |
| ``-fopenmp -fopenmp-targets=nvptx-nvidia-cuda`` for 32 bit platform. |
| |
| - Passing options to the OpenMP device offloading toolchain can be done using |
| the ``-Xopenmp-target=<triple> -opt=val`` flag. In this way the ``-opt=val`` |
| option will be forwarded to the respective OpenMP device offloading toolchain |
| described by the triple. For example passing the compute capability to |
| the OpenMP NVPTX offloading toolchain can be done as follows: |
| ``-Xopenmp-target=nvptx64-nvidia-cuda -march=sm_60``. For the case when only one |
| target offload toolchain is specified under the ``-fopenmp-targets=<triples>`` |
| option, then the triple can be skipped: ``-Xopenmp-target -march=sm_60``. |
| |
| - Other bugfixes. |
| |
| CUDA Support in Clang |
| --------------------- |
| |
| - Clang will now try to locate the CUDA installation next to :program:`ptxas` |
| in the `PATH` environment variable. This behavior can be turned off by passing |
| the new flag ``--cuda-path-ignore-env``. |
| |
| - Clang now supports generating object files with relocatable device code. This |
| feature needs to be enabled with ``-fcuda-rdc`` and may result in performance |
| penalties compared to whole program compilation. Please note that NVIDIA's |
| :program:`nvcc` must be used for linking. |
| |
| Internal API Changes |
| -------------------- |
| |
| These are major API changes that have happened since the 6.0.0 release of |
| Clang. If upgrading an external codebase that uses Clang as a library, |
| this section should help get you past the largest hurdles of upgrading. |
| |
| - The methods ``getLocStart``, ``getStartLoc`` and ``getLocEnd`` in the AST |
| classes are deprecated. New APIs ``getBeginLoc`` and ``getEndLoc`` should |
| be used instead. While the old methods remain in this release, they will |
| not be present in the next release of Clang. |
| |
| clang-format |
| ------------ |
| |
| - Clang-format will now support detecting and formatting code snippets in raw |
| string literals. This is configured through the ``RawStringFormats`` style |
| option. |
| |
| Static Analyzer |
| --------------- |
| |
| - The new `MmapWriteExec` checker had been introduced to detect attempts to map pages both writable and executable. |
| |
| .. _release-notes-ubsan: |
| |
| Undefined Behavior Sanitizer (UBSan) |
| ------------------------------------ |
| |
| * A new Implicit Conversion Sanitizer (``-fsanitize=implicit-conversion``) group |
| was added. |
| |
| Currently, only one type of issues is caught - implicit integer truncation |
| (``-fsanitize=implicit-integer-truncation``), also known as integer demotion. |
| While there is a ``-Wconversion`` diagnostic group that catches this kind of |
| issues, it is both noisy, and does not catch **all** the cases. |
| |
| .. code-block:: c++ |
| |
| unsigned char store = 0; |
| |
| bool consume(unsigned int val); |
| |
| void test(unsigned long val) { |
| if (consume(val)) // the value may have been silently truncated. |
| store = store + 768; // before addition, 'store' was promoted to int. |
| (void)consume((unsigned int)val); // OK, the truncation is explicit. |
| } |
| |
| Just like other ``-fsanitize=integer`` checks, these issues are **not** |
| undefined behaviour. But they are not *always* intentional, and are somewhat |
| hard to track down. This group is **not** enabled by ``-fsanitize=undefined``, |
| but the ``-fsanitize=implicit-integer-truncation`` check |
| is enabled by ``-fsanitize=integer``. |
| |
| |
| libc++ Changes |
| ============== |
| Users that wish to link together translation units built with different |
| versions of libc++'s headers into the same final linked image should define the |
| `_LIBCPP_HIDE_FROM_ABI_PER_TU` macro to `1` when building those translation |
| units. In a future release, not defining `_LIBCPP_HIDE_FROM_ABI_PER_TU` to `1` |
| and linking translation units built with different versions of libc++'s headers |
| together may lead to ODR violations and ABI issues. |
| |
| |
| Additional Information |
| ====================== |
| |
| A wide variety of additional information is available on the `Clang web |
| page <https://clang.llvm.org/>`_. The web page contains versions of the |
| API documentation which are 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 "``clang/docs/``" directory in the Clang |
| tree. |
| |
| If you have any questions or comments about Clang, please feel free to |
| contact us via the `mailing |
| list <https://lists.llvm.org/mailman/listinfo/cfe-dev>`_. |