Log message:
clang: updated to 10.0.0
What’s New in Clang 10.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
clang used to run the actual compilation in a subprocess (“clang -cc1”). Now \
compilations are done in-process by default. -fno-integrated-cc1 restores the \
former behavior. The -v and -### flags will print “(in-process)” when \
compilations are done in-process.
Concepts support. Clang now supports C++2a Concepts under the -std=c++2a flag.
Improvements to Clang’s diagnostics
-Wtautological-overlap-compare will warn on negative numbers and non-int types.
-Wtautological-compare for self comparisons and -Wtautological-overlap-compare \
will now look through member and array access to determine if two operand \
expressions are the same.
-Wtautological-bitwise-compare is a new warning group. This group has the \
current warning which diagnoses the tautological comparison of a bitwise \
operation and a constant. The group also has the new warning which diagnoses \
when a bitwise-or with a non-negative value is converted to a bool, since that \
bool will always be true.
-Wbitwise-conditional-parentheses will warn on operator precedence issues when \
mixing bitwise-and (&) and bitwise-or (|) operator with the conditional \
operator (?:).
-Wrange-loop-analysis got several improvements. It no longer warns about a copy \
being made when the result is bound to an rvalue reference. It no longer warns \
when an object of a small, trivially copyable type is copied. The warning now \
offers fix-its. Excluding -Wrange-loop-bind-reference it is now part of -Wall. \
To reduce the number of false positives the diagnostic is disabled in macros and \
template instantiations.
-Wmisleading-indentation has been added. This warning is similar to the GCC \
warning of the same name. It warns about statements that are indented as if they \
were part of a if/else/for/while statement but are not semantically part of that \
if/else/for/while.
-Wbitwise-op-parentheses and -Wlogical-op-parentheses are disabled by default.
The new warnings -Wc99-designator and -Wreorder-init-list warn about uses of C99 \
initializers in C++ mode for cases that are valid in C99 but not in C++20.
The new warning -Wsizeof-array-div catches cases like int arr[10]; \
...sizeof(arr) / sizeof(short)... (should be sizeof(arr) / sizeof(int)), and the \
existing warning -Wsizeof-pointer-div catches more cases.
The new warning -Wxor-used-as-pow warns on cases where it looks like the xor \
operator ^ is used to be mean exponentiation, e.g. 2 ^ 16.
The new warning -Wfinal-dtor-non-final-class warns on classes that have a final \
destructor but aren’t themselves marked final.
-Wextra now enables -Wdeprecated-copy. The warning deprecates move and copy \
constructors in classes where an explicit destructor is declared. This is for \
compatibility with GCC 9, and forward looking for a change that’s being \
considered for C++23. You can disable it with -Wno-deprecated-copy.
Non-comprehensive list of changes in this release
In both C and C++ (C17 6.5.6p8, C++ [expr.add]), pointer arithmetic is only \
permitted within arrays. In particular, the behavior of a program is not defined \
if it adds a non-zero offset (or in C, any offset) to a null pointer, or if it \
forms a null pointer by subtracting an integer from a non-null pointer, and the \
LLVM optimizer now uses those guarantees for transformations. This may lead to \
unintended behavior in code that performs these operations. The Undefined \
Behavior Sanitizer -fsanitize=pointer-overflow check has been extended to detect \
these cases, so that code relying on them can be detected and fixed.
The Implicit Conversion Sanitizer (-fsanitize=implicit-conversion) has learned \
to sanitize pre/post increment/decrement of types with bit width smaller than \
int.
For X86 target, -march=skylake-avx512, -march=icelake-client, \
-march=icelake-server, -march=cascadelake, -march=cooperlake will default to not \
using 512-bit zmm registers in vectorized code unless 512-bit intrinsics are \
used in the source code. 512-bit operations are known to cause the CPUs to run \
at a lower frequency which can impact performance. This behavior can be changed \
by passing -mprefer-vector-width=512 on the command line.
Clang now defaults to .init_array on Linux. It used to use .ctors if the found \
GCC installation is older than 4.7.0. Add -fno-use-init-array to get the old \
behavior (.ctors).
The behavior of the flag -flax-vector-conversions has been modified to more \
closely match GCC, as described below. In Clang 10 onwards, command lines \
specifying this flag do not permit implicit vector bitcasts between integer \
vectors and floating-point vectors. Such conversions are still permitted by \
default, however, and the default can be explicitly requested with the \
Clang-specific flag -flax-vector-conversions=all. In a future release of Clang, \
we intend to change the default to -fno-lax-vector-conversions.
Improved support for octeon MIPS-family CPU. Added octeon+ to the list of of \
CPUs accepted by the driver.
For the WebAssembly target, the wasm-opt tool will now be run if it is found in \
the PATH, which can reduce code size.
For the RISC-V target, floating point registers can now be used in inline \
assembly constraints.
New Compiler Flags
The -fgnuc-version= flag now controls the value of __GNUC__ and related macros. \
This flag does not enable or disable any GCC extensions implemented in Clang. \
Setting the version to zero causes Clang to leave __GNUC__ and other \
GNU-namespaced macros, such as __GXX_WEAK__, undefined.
vzeroupper insertion on X86 targets can now be disabled with -mno-vzeroupper. \
You can also force vzeroupper insertion to be used on CPUs that normally \
wouldn’t with -mvzeroupper.
The -fno-concept-satisfaction-caching can be used to disable caching for \
satisfactions of Concepts. The C++2a draft standard does not currently permit \
this caching, but disabling it may incur significant compile-time costs. This \
flag is intended for experimentation purposes and may be removed at any time; \
please let us know if you encounter a situation where you need to specify this \
flag for correct program behavior.
The -ffixed-xX flags now work on RISC-V. These reserve the corresponding \
general-purpose registers.
RISC-V has added -mcmodel=medany and -mcmodel=medlow as aliases for \
-mcmodel=small and -mcmodel=medium respectively. Preprocessor definitions for \
__riscv_cmodel_medlow and __riscv_cmodel_medany have been corrected.
-fmacro-prefix-map=OLD=NEW substitutes directory prefix OLD for NEW in \
predefined preprocessor macros such as __FILE__. This helps with reproducible \
builds that are location independent. The new -ffile-prefix-map option is \
equivalent to specifying both -fdebug-prefix-map and -fmacro-prefix-map.
-fpatchable-function-entry=N[,M] is added to generate M NOPs before the function \
entry and N-M NOPs after the function entry. This is used by AArch64 ftrace in \
the Linux kernel.
-mbranches-within-32B-boundaries is added as an x86 assembler mitigation for \
Intel’s Jump Condition Code Erratum.
Deprecated Compiler Flags
The following options are deprecated and ignored. They will be removed in future \
versions of Clang.
-mmpx used to enable the __MPX__ preprocessor define for the Intel MPX \
instructions. There were no MPX intrinsics.
-mno-mpx used to disable -mmpx and is the default behavior.
-fconcepts-ts previously used to enable experimental concepts support. Use \
-std=c++2a instead to enable Concepts support.
Modified Compiler Flags
RISC-V now sets the architecture (riscv32/riscv64) based on the value provided \
to the -march flag, overriding the target provided by -triple.
-flax-vector-conversions has been split into three different levels of laxness, \
and has been updated to match the GCC semantics:
-flax-vector-conversions=all: This is Clang’s current default, and permits \
implicit vector conversions (performed as bitcasts) between any two vector types \
of the same overall bit-width. Former synonym: -flax-vector-conversions (Clang \
<= 9).
-flax-vector-conversions=integer: This permits implicit vector conversions \
(performed as bitcasts) between any two integer vector types of the same overall \
bit-width. Synonym: -flax-vector-conversions (Clang >= 10).
-flax-vector-conversions=none: Do not perform any implicit bitcasts between \
vector types. Synonym: -fno-lax-vector-conversions.
-debug-info-kind now has an option -debug-info-kind=constructor, which is one \
level below -debug-info-kind=limited. This option causes debug info for classes \
to be emitted only when a constructor is emitted.
RISC-V now chooses a slightly different sysroot path and defaults to using \
compiler-rt if no GCC installation is detected.
RISC-V now supports multilibs in baremetal environments. This support does not \
extend to supporting multilib aliases.
Attribute Changes in Clang
Support was added for function \
__attribute__((target("branch-protection=...")))
|