GCC 9 Release Series — Changes, New Features, and Fixes
GCC 9 Release Series
Changes, New Features, and Fixes
This page is a "brief" summary of some of the huge number of improvements in GCC 9. You may also want to check out our Porting to GCC 9 page and the full GCC documentation.
Caveats
-
On Arm targets (
arm*-*-*), a bug in the implementation of the procedure call standard (AAPCS) in the GCC 6, 7 and 8 releases has been fixed: a structure containing a bit-field based on a 64-bit integral type and where no other element in a structure required 64-bit alignment could be passed incorrectly to functions. This is an ABI change. If the option-Wpsabiis enabled (on by default) the compiler will emit a diagnostic note for code that might be affected. Support for a number of older systems and recently unmaintained or untested target ports of GCC has been declared obsolete in GCC 9. Unless there is activity to revive them, the next release of GCC will have their sources permanently removed.
The following ports for individual systems on particular architectures have been obsoleted:
- Solaris 10 (
*-*-solaris2.10). Details can be found in the announcement.
- Cell Broadband Engine SPU (
spu*-*-*). Details can be found in the announcement.
- Solaris 10 (
-
A change to the C++
std::rotatealgorithm in GCC 9.1.0 can cause ABI incompatibilities with object files compiled with other versions of GCC. If thestd::rotatealgorithm is called with an empty range then it might cause a divide-by-zero error (as aSIGFPEsignal) and crash. The change has been reverted for GCC 9.2.0 and future releases. For more details see Bug 90920. The problem can be avoided by recompiling any objects that might callstd::rotatewith an empty range, so that the GCC 9.1.0 definition ofstd::rotateis not used. -
The automatic template instantiation at link time
(
-frepo) has been deprecated and will be removed in a future release. -
The
--with-default-libstdcxx-abi=gcc4-compatibleconfigure option is broken in the 9.1 and 9.2 releases, producing a shared library with missing symbols (see Bug 90361). As a workaround, configure without that option and build GCC as normal, then edit the installed<bits/c++config.h>headers to define the_GLIBCXX_USE_CXX11_ABImacro to0.
General Improvements
The following GCC command-line options have been introduced or improved.
-
All command-line options that take a byte-size argument accept
64-bit integers as well as standard SI and IEC suffixes such as
kbandKiB,MBandMiB, orGBandGiBdenoting the corresponding multiples of bytes. See Invoking GCC for more. -
A new option
-flive-patching=[inline-only-static|inline-clone]generates code suitable for live patching. At the same time it provides multiple-level control over IPA optimizations. See the user guide for more details. -
A new option,
--completion, has been added to provide more fine option completion in a shell. It is intended to be used by Bash-completion. -
GCC's diagnostics now print source code with a left margin showing line numbers, configurable with -fno-diagnostics-show-line-numbers.
GCC's diagnostics can also now label regions of the source code to show pertinent information, such as the types within an expression.
$ g++ t.cc t.cc: In function 'int test(const shape&, const shape&)': t.cc:15:4: error: no match for 'operator+' (operand types are 'boxed_value<double>' and 'boxed_value<double>') 14 | return (width(s1) * height(s1) | ~~~~~~~~~~~~~~~~~~~~~~ | | | boxed_value<[...]> 15 | + width(s2) * height(s2)); | ^ ~~~~~~~~~~~~~~~~~~~~~~ | | | boxed_value<[...]>
These labels can be disabled via -fno-diagnostics-show-labels.
- A new option -fdiagnostics-format=json has been introduced for emitting diagnostics in a machine-readable format.
-
The alignment-related options
-falign-functions,-falign-labels,-falign-loops, and-falign-jumpsreceived support for a secondary alignment (e.g.-falign-loops=n:m:n2:m2). -
New pair of profiling options (
-fprofile-filter-filesand-fprofile-exclude-files) has been added. The options help to filter which source files are instrumented. - AddressSanitizer generates more compact redzones for automatic variables. That helps to reduce memory footprint of a sanitized binary.
-
Numerous improvements have been made to the output of -fopt-info.
Messages are now prefixed with
optimized,missed, ornote, rather than the old behavior of all being prefixed withnote.The output from
-fopt-infocan now contain information on inlining decisions:$ g++ -c inline.cc -O2 -fopt-info-inline-all inline.cc:24:11: note: Considering inline candidate void foreach(T, T, void (*)(E)) [with T = char**; E = char*]/2. inline.cc:24:11: optimized: Inlining void foreach(T, T, void (*)(E)) [with T = char**; E = char*]/2 into int main(int, char**)/1. inline.cc:19:12: missed: not inlinable: void inline_me(char*)/0 -> int std::puts(const char*)/3, function body not available inline.cc:13:8: optimized: Inlined void inline_me(char*)/4 into int main(int, char**)/1 which now has time 127.363637 and size 11, net change of +0. Unit growth for small function inlining: 16->16 (0%) Inlined 2 calls, eliminated 1 functions
The output from the vectorizer has been rationalized so that failed attempts to vectorize a loop are displayed in the form
[LOOP-LOCATION]: couldn't vectorize this loop [PROBLEM-LOCATION]: because of [REASON]rather than an exhaustive log of all decisions made by the vectorizer. For example:
$ gcc -c v.c -O3 -fopt-info-all-vec v.c:7:3: missed: couldn't vectorize loop v.c:10:7: missed: statement clobbers memory: __asm__ __volatile__("" : : : "memory"); v.c:3:6: note: vectorized 0 loops in function. v.c:10:7: missed: statement clobbers memory: __asm__ __volatile__("" : : : "memory");The old behavior can be obtained via a new
-internalssuboption of-fopt-info. -
A new option,
-fsave-optimization-record
has been added, which writes a
SRCFILE.opt-record.json.gzfile describing the optimization decisions made by GCC. This is similar to the output of-fopt-info, but with additional metadata such as the inlining chain, and profile information (if available). - Inter-procedural propagation of stack alignment can now be controlled by
-fipa-stack-alignment. - Propagation of addressability, readonly, and writeonly flags on
static variables can now be controlled by
-fipa-reference-addressable.
The following built-in functions have been introduced.
-
__builtin_expect_with_probabilityto provide branch prediction probability hints to the optimizer. -
__builtin_has_attributedetermines whether a function, type, or variable has been declared with some attribute. -
__builtin_speculation_safe_valuecan be used to help mitigate against unsafe speculative execution.
The following attributes have been introduced.
-
The
copyfunction attribute has been added. The attribute can also be applied to type definitions and to variable declarations.
A large number of improvements to code generation have been made, including but not limited to the following.
- Switch expansion has been improved by using a different strategy (jump table, bit test, decision tree) for a subset of switch cases.
-
A linear function expression defined as a switch statement
can be transformed by
-ftree-switch-conversion. For example:
can be transformed intoint foo (int how) { switch (how) { case 2: how = 205; break; case 3: how = 305; break; case 4: how = 405; break; case 5: how = 505; break; case 6: how = 605; break; } return how; }100 * how + 5(for values defined in the switch statement). - Inter-procedural optimization improvements:
- Inliner defaults were tuned to better suit modern C++ codebases,
especially when built with link time-optimizations.
New parameters
max-inline-insns-small,max-inline-insns-size,uninlined-function-insns,uninlined-function-time,uninlined-thunk-insns, anduninlined-thunk-timewere added. - Hot/cold partitioning is now more precise and aggressive.
- Improved scalability for very large translation units (especially when link-time optimizing large programs).
- Inliner defaults were tuned to better suit modern C++ codebases,
especially when built with link time-optimizations.
New parameters
- Profile driven optimization improvements:
-fprofile-usenow enables-fversion-loops-for-strides,-floop-interchange,-floop-unroll-and-jam,-ftree-loop-distribution.- Streaming of counter histograms was removed, which reduces the size of profile files. Histograms are computed on the fly with link-time optimization.
- The parameter
hot-bb-count-ws-permillewas reduced from 999 to 990 to account for more precise histograms.
- Link-time optimization improvements:
- Types are now simplified prior to streaming resulting in significant reductions of LTO object file sizes and link-time memory use as well as improvements of link-time parallelism.
- The default number of partitions (
--param lto-partitions) was increased from 32 to 128 enabling effective use of CPUs with more than 32 hyperthreads.--param lto-max-streaming-parallelismcan now be used to control the number of streaming processes. - Warnings on C++ One Decl Rule violations (
-Wodr) are now more informative and produce fewer redundant results.
The following improvements to the gcov command-line utility
have been made.
-
The gcov tool received a new option
--use-hotness-colors(-q) that can provide perf-like coloring of hot functions. - The gcov tool has changed its intermediate format to a new JSON format.
New Languages and Language specific improvements
OpenACC support in C, C++, and Fortran continues to be maintained and improved. Most of the OpenACC 2.5 specification is implemented. See the implementation status section on the OpenACC wiki page for further information.C family
- Version 5.0 of the OpenMP specification is now partially supported in the C and C++ compilers. For details which features of OpenMP 5.0 are and which are not supported in the GCC 9 release see this mail.
- New extensions:
__builtin_convertvectorbuilt-in for vector conversions has been added.
- New warnings:
-Waddress-of-packed-member, enabled by default, warns about an unaligned pointer value from the address of a packed member of a struct or union.
- Enhancements to existing warnings:
-
-Warray-boundsdetects more instances of out-of-bounds indices. -
-Wattribute-aliasalso detects attribute mismatches between alias declarations and their targets, in addition to mismatches between their types. -
-Wformat-overflowand-Wformat-truncationhave been extended to all formatted input/output functions (where applicable) and enhanced to detect a subset of instances of reading past the end of unterminated constant character arrays in%sdirectives. -
-Wmissing-attributesdetects instances of missing function attributes on declarations of aliases and weak references. -
-Wstringop-truncationalso detects a subset of instances of reading past the end of unterminated constant character arrays,
-
-
If a macro is used with the wrong argument count, the C and C++ front
ends now show the definition of that macro via a
note. - The spelling corrector now considers transposed letters, and the threshold for similarity has been tightened, to avoid nonsensical suggestions.
C
- There is now experimental support for
-std=c2x, to select support for the upcoming C2X revision of the ISO C standard. This standard is in the early stages of development and the only feature supported in GCC 9 is_Static_assertwith a single argument (support for_Static_assertwith two arguments was added in C11 and GCC 4.6). There are also new options-std=gnu2x, for C2X with GNU extensions, and-Wc11-c2x-compat, to warn for uses of features added in C2X (such warnings are also enabled by use of-Wpedanticif not using-std=c2xor-std=gnu2x). - New warnings:
-Wabsolute-valuewarns for calls to standard functions that compute the absolute value of an argument when a more appropriate standard function is available. For example, callingabs(3.14)triggers the warning because the appropriate function to call to compute the absolute value of a double argument isfabs. The option also triggers warnings when the argument in a call to such a function has an unsigned type. This warning can be suppressed with an explicit type cast and it is also enabled by-Wextra.
C++
- New warnings:
-Wdeprecated-copy, implied by-Wextra, warns about the C++11 deprecation of implicitly declared copy constructor and assignment operator if one of them is user-provided.-Wdeprecated-copy-dtoralso warns if the destructor is user-provided, as specified in C++11.-Winit-list-lifetime, on by default, warns about uses ofstd::initializer_listthat are likely to result in a dangling pointer, such as returning or assigning from a temporary list.-Wredundant-move, implied by-Wextra, warns about redundant calls tostd::move.-Wpessimizing-move, implied by-Wall, warns when a call tostd::moveprevents copy elision.-Wclass-conversion, on by default, warns when a conversion function will never be called due to the type it converts to.
-
The C++ front end has experimental support for some of the upcoming C++2a
draft features with the
-std=c++2aor-std=gnu++2aflags, including range-based for statements with initializer, default constructible and assignable stateless lambdas, lambdas in unevaluated contexts, language support for empty data members, allowing pack expansion in lambda init-capture, likely and unlikely attributes, class types in non-type template parameters, allowing virtual function calls in constant expressions, explicit(bool),std::is_constant_evaluated, nested inline namespaces, etc. For a full list of new features, see the C++ status page. -
The C++ front end now preserves source locations for literals,
id-expression, andmem-initializerfor longer. For example it is now able to pin-point the pertinent locations for bad initializations such as these$ g++ -c bad-inits.cc bad-inits.cc:10:14: error: cannot convert 'json' to 'int' in initialization 10 | { 3, json::object }, | ~~~~~~^~~~~~ | | | json bad-inits.cc:14:31: error: initializer-string for array of chars is too long [-fpermissive] 14 | char buffers[3][5] = { "red", "green", "blue" }; | ^~~~~~~ bad-inits.cc: In constructor 'X::X()': bad-inits.cc:17:13: error: invalid conversion from 'int' to 'void*' [-fpermissive] 17 | X() : one(42), two(42), three(42) | ^~ | | | int
rather than emitting the error at the final closing parenthesis or brace. -
Error-reporting of overload resolution has been special-cased to make
the case of a single failed candidate easier to read. For example:
$ g++ param-type-mismatch.cc param-type-mismatch.cc: In function 'int test(int, const char*, float)': param-type-mismatch.cc:8:32: error: cannot convert 'const char*' to 'const char**' 8 | return foo::member_1 (first, second, third); | ^~~~~~ | | | const char* param-type-mismatch.cc:3:46: note: initializing argument 2 of 'static int foo::member_1(int, const char**, float)' 3 | static int member_1 (int one, const char **two, float three); | ~~~~~~~~~~~~~^~~
highlights both the problematic argument, and the parameter that it can't be converted to. - Diagnostics involving binary operators now use color to distinguish the two operands, and label them separately (as per the example of source labelling above).
-
Diagnostics involving function calls now highlight the pertinent parameter
of the declaration in more places.
$ g++ bad-conversion.cc bad-conversion.cc: In function 'void caller()': bad-conversion.cc:9:14: error: cannot convert 'bool' to 'void*' 9 | callee (0, false, 2); | ^~~~~ | | | bool bad-conversion.cc:3:19: note: initializing argument 2 of 'void callee(int, void*, int)' 3 | void callee (int, void *, int) | ^~~~~~
-
The C++ front end's implementation of
-Wformat
now shows precise locations within string literals, and underlines
the pertinent arguments at bogus call sites (the C front end has been
doing this since GCC 7). For example:
$ g++ -c bad-printf.cc -Wall bad-printf.cc: In function 'void print_field(const char*, float, long int, long int)': bad-printf.cc:6:17: warning: field width specifier '*' expects argument of type 'int', but argument 3 has type 'long int' [-Wformat=] 6 | printf ("%s: %*ld ", fieldname, column - width, value); | ~^~~ ~~~~~~~~~~~~~~ | | | | int long int bad-printf.cc:6:19: warning: format '%ld' expects argument of type 'long int', but argument 4 has type 'double' [-Wformat=] 6 | printf ("%s: %*ld ", fieldname, column - width, value); | ~~~^ ~~~~~ | | | | long int double | %*f
-
The C++ front end has gained new fix-it hints for forgetting the
return *this;needed by various C++ operators:$ g++ -c operator.cc operator.cc: In member function 'boxed_ptr& boxed_ptr::operator=(const boxed_ptr&)': operator.cc:7:3: warning: no return statement in function returning non-void [-Wreturn-type] 6 | m_ptr = other.m_ptr; +++ |+ return *this; 7 | } | ^
for when the compiler needs atypename:$ g++ -c template.cc template.cc:3:3: error: need 'typename' before 'Traits::type' because 'Traits' is a dependent scope 3 | Traits::type type; | ^~~~~~ | typename
when trying to use an accessor member as if it were a data member:$ g++ -c fncall.cc fncall.cc: In function 'void hangman(const mystring&)': fncall.cc:12:11: error: invalid use of member function 'int mystring::get_length() const' (did you forget the '()' ?) 12 | if (str.get_length > 0) | ~~~~^~~~~~~~~~ | ()
for C++11's scoped enums:$ g++ -c enums.cc enums.cc: In function 'void json::test(const json::value&)': enums.cc:12:26: error: 'STRING' was not declared in this scope; did you mean 'json::kind::STRING'? 12 | if (v.get_kind () == STRING) | ^~~~~~ | json::kind::STRING enums.cc:3:44: note: 'json::kind::STRING' declared here 3 | enum class kind { OBJECT, ARRAY, NUMBER, STRING, TRUE, FALSE, NULL_ }; | ^~~~~~
and a tweak to integrate the suggestions about misspelled members with that for accessors:$ g++ -c accessor-fixit.cc accessor-fixit.cc: In function 'int test(t*)': accessor-fixit.cc:17:15: error: 'class t' has no member named 'ratio'; did you mean 'int t::m_ratio'? (accessible via 'int t::get_ratio() const') 17 | return ptr->ratio; | ^~~~~ | get_ratio()
In addition, various diagnostics in the C++ front-end have been streamlined by consolidating the suggestion into the initial error, rather than emitting a follow-up note:$ g++ typo.cc typo.cc:5:13: error: 'BUFSIZE' was not declared in this scope; did you mean 'BUF_SIZE'? 5 | uint8_t buf[BUFSIZE]; | ^~~~~~~ | BUF_SIZE
Runtime Library (libstdc++)
- Improved support for C++17, including:
- The C++17 implementation is no longer experimental.
-
Parallel algorithms and
<execution>(requires Thread Building Blocks 2018 or newer). -
<memory_resource>. -
Using the types and functions in
<filesystem>does not require linking with-lstdc++fsnow.
- Improved experimental support for C++2a,
including:
- Type traits
std::remove_cvref,std::unwrap_reference,std::unwrap_decay_ref,std::is_nothrow_convertible, andstd::type_identity. - Headers
<bit>and<version>. - Uniform container erasure (
std::erase_if). containsmember of maps and sets.- String prefix and suffix checking (
starts_with,ends_with). - Functions
std::midpointandstd::lerpfor interpolation. std::bind_front.std::visit<R>.std::assume_aligned.- Uses-allocator construction utilities.
std::pmr::polymorphic_allocator<std::byte>.- Library support for
char8_ttype. - Destroying
delete. std::is_constant_evaluated()function.
- Type traits
- Support for opening file streams with wide character paths on Windows
- Incomplete support for the C++17 Filesystem library and the Filesystem TS on Windows.
- Incomplete, experimental support for the Networking TS.
D
- Support for the D programming language has been added to GCC, implementing version 2.076 of the language and run-time library.
Fortran
- Asynchronous I/O is now fully supported. The program needs to be linked against the pthreads library to use it, otherwise the I/O is done synchronously. For systems which do not support POSIX condition variables, such as AIX, all I/O is still done synchronously.
- The
BACKargument forMINLOCandMAXLOChas been implemented. - The
FINDLOCintrinsic function has been implemented. - The
IS_CONTIGUOUSintrinsic function has been implemented. -
Direct access to the real and imaginary parts of a complex
variable via
c%reandc%imhas been implemented. -
Type parameter inquiry via
str%lenanda%kindhas been implemented. -
C descriptors and the
ISO_Fortran_binding.hsource file have been implemented. - The
MAXandMINintrinsics are no longer guaranteed to return any particular value in case one of the arguments is aNaN. Note that this conforms to the Fortran standard and to what other Fortran compilers do. If there is a need to handle that case in some specific way, one needs to explicitly check forNaN's before callingMAXorMIN, e.g. by using theIEEE_IS_NANfunction from the intrinsic moduleIEEE_ARITHMETIC. -
A new command-line option
-fdec-include, set also by the-fdecoption, has been added to increase compatibility with legacy code. With this option, anINCLUDEdirective is also parsed as a statement, which allows the directive to be spread across multiple source lines with line continuations. -
A new
BUILTINdirective, has been added. The purpose of the directive is to provide an API between the GCC compiler and the GNU C Library which would define vector implementations of math routines.
Go
- GCC 9 provides a complete implementation of the Go 1.12.2 user packages.
libgccjit
- The libgccjit API gained a new entry point: gcc_jit_context_add_driver_option.
New Targets and Target Specific Improvements
AArch64 & Arm
-
Support has been added for the following processors
(GCC identifiers in parentheses):
- Arm Cortex-A76 (
cortex-a76). - Arm Cortex-A55/Cortex-A76 DynamIQ big.LITTLE (
cortex-a76.cortex-a55). - Arm Neoverse N1 (
neoverse-n1).
-mcpuor-mtuneoptions, for example:-mcpu=cortex-a76or-mtune=cortex-a76.cortex-a55or as arguments to the equivalent target attributes and pragmas. - Arm Cortex-A76 (
-
The Armv8.3-A complex number instructions are now supported via intrinsics when the option
-march=armv8.3-aor equivalent is specified. For the half-precision floating-point variants of these instructions use the architecture extension flag+fp16, e.g.-march=armv8.3-a+fp16.The intrinsics are defined by the ACLE specification.
-
The Armv8.5-A architecture is now supported through the
-march=armv8.5-aoption. - The Armv8.5-A architecture also adds some security features that are
optional to all older architecture versions. These are now supported
and only affect the assembler.
- Speculation Barrier instruction through the
-march=armv8-a+sboption. - Execution and Data Prediction Restriction instructions through
the
-march=armv8-a+predresoption. - Speculative Store Bypass Safe instruction through the
-march=armv8-a+ssbsoption. This does not require a compiler option for Arm and thus-march=armv8-a+ssbsis an AArch64-specific option.
- Speculation Barrier instruction through the
AArch64 specific
-
Support has been added for the Arm Neoverse E1 processor
(
-mcpu=neoverse-e1). -
The AArch64 port now has support for stack clash protection using the
-fstack-clash-protectionoption. The probing interval/guard size can be set by using--param stack-clash-protection-guard-size=12|16. The value of this parameter must be in bytes represented as a power of two. The two supported values for this parameter are 12 (for a 4KiB size, 2^12) and 16 (for a 64KiB size, 2^16). The default value is 16 (64Kb) and can be changed at configure time using the flag--with-stack-clash-protection-guard-size=12|16. -
The option
-msign-return-address=has been deprecated. This has been replaced by the new-mbranch-protection=option. This new option can now be used to enable the return address signing as well as the new Branch Target Identification feature of Armv8.5-A architecture. For more information on the arguments accepted by this option, please refer to AArch64-Options. - The following optional extensions to Armv8.5-A architecture are
now supported and only affect the assembler.
- Random Number Generation instructions through the
-march=armv8.5-a+rngoption. - Memory Tagging Extension through the
-march=armv8.5-a+memtagoption.
- Random Number Generation instructions through the
Arm specific
-
Support for the deprecated Armv2 and Armv3 architectures and their
variants has been removed. Their corresponding
-marchvalues and the-mcpuoptions that used these architectures have been removed. - Support for the Armv5 and Armv5E architectures (which have no known implementations) has been removed. Note that Armv5T, Armv5TE and Armv5TEJ architectures remain supported.
-
Corrected FPU configurations for Cortex-R7 and Cortex-R8 when using their
respective
-mcpuoptions.
AMD GCN
-
A new back end targeting AMD GCN GPUs has been contributed to GCC. The
implementation is currently limited to compiling single-threaded,
stand-alone programs. Future versions will add support for offloading
multi-threaded kernels via OpenMP and OpenACC. The following devices are
supported (GCC identifiers in parentheses):
- Fiji (
fiji). - Vega 10 (
gfx900).
- Fiji (
ARC
- LRA is now on by default for the ARC target. This can be
controlled by
-mlra. - Add support for frame code-density and branch-and-index instructions.
C-SKY
- A new back end targeting C-SKY V2 processors has been contributed to GCC.
IA-32/x86-64
- Support of Intel MPX (Memory Protection Extensions) has been removed.
- New ISA extension support for Intel PTWRITE was added to GCC. PTWRITE
intrinsics are available via the
-mptwritecompiler switch. - GCC now supports the Intel CPU named Cascade Lake with AVX512 extensions
through
-march=cascadelake. The switch enables the following ISA extensions: AVX512F, AVX512VL, AVX512CD, AVX512BW, AVX512DQ, AVX512VNNI.
MIPS
-
The Loongson
loongson-mmiandloongson-extextensions have been split fromloongson3a:loongson-mmicontains the Loongson MMI (MultiMedia extensions Instructions).loongson-extcontains the Loongson EXT (EXTensions instructions).
-
The Loongson EXT2 (EXTensions R2 instructions) are now supported.
loongson-ext2contains the Loongson EXT2 instructions.
-m[no-]loongson-mmi,-m[no-]loongson-ext, and-m[no-]loongson-ext2enable or disable those extensions. -
Support has been added for the following processors
(GCC identifiers in parentheses):
- Loongson 3A1000 (
gs464) which enablesloongson-mmi,loongson-extby default. - Loongson 3A2000/3A3000 (
gs464e) which enablesloongson-mmi,loongson-ext,loongson-ext2by default. - Loongson 2K1000 (
gs264e) which enablesloongson-ext,loongson-ext2,msaby default.
-mcpuand-mtuneoptions (as in-mcpu=gs464or-mtune=gs464e) or as arguments to the equivalent target attributes and pragmas. - Loongson 3A1000 (
OpenRISC
- A new back end targeting OpenRISC processors has been contributed to GCC.
S/390, System z, IBM z Systems
- Support for the arch13 architecture has been added. When using
the
-march=arch13option, the compiler will generate code making use of the new instructions introduced with the vector enhancement facility 2 and the miscellaneous instruction extension facility 2. The-mtune=arch13option enables arch13 specific instruction scheduling without making use of new instructions. - Builtins for the new vector instructions have been added and can
be enabled using the
-mzvectoroption. - Support for ESA architecture machines g5 and g6 is deprecated since GCC 6.1.0 and has been removed now.
- When compiling with
-march=z14or higher GCC emits alignments hints on the vector load/store instructions (8 or 16 byte). - Functions now have a default alignment of 16 bytes. This helps with branch prediction effects.
-mfentryis now supported. As well as the mcount mechanism the__fentry__is called before the function prologue. However, since just a single instruction is required to call__fentry__the call sequence imposes a smaller overhead than mcount (4 instructions). The produced code is compatible only with newer glibc versions, which provide the__fentry__symbol and do not clobber r0 when resolving lazily bound functions.-mfentryis only supported when generating 64-bit code and does not work with nested C functions.- The
-mnop-mcountoption can be used to emit NOP instructions instead of an mcount or fentry call stub. - With the
-mrecord-mcountoption a__mcount_locsection is generated containing pointers to each profiling call stub. This is useful for automatically patching in and out calls.
Operating Systems
Solaris
-
g++now unconditionally enables large file support when compiling 32-bit code. - Support for the AddressSanitizer and UndefinedBehaviorSanitizer has been merged from LLVM. For the moment, this only works for 32-bit code on both SPARC and x86.
- An initial port of the D runtime library has been completed on Solaris 11/x86. It requires the use of GNU as. Solaris 11/SPARC support is still work-in-progress.
Windows
- A C++ Microsoft ABI bitfield layout
bug, PR87137
has been fixed. A non-field declaration could cause the current
bitfield allocation unit to be completed, incorrectly placing a
following bitfield into a new allocation unit. The Microsoft ABI is
selected for:
- Mingw targets
- PowerPC, IA-32 or x86-64 targets
when the
-mms-bitfieldsoption is specified, or__attribute__((ms_struct))is used - SuperH targets when the
-mhitachioption is specified, or__attribute__((renesas))is used
Improvements for plugin authors
-
GCC's diagnostic subsystem now has a way to logically group together
related diagnostics,
auto_diagnostic_group. Such diagnostics will be nested by the output of -fdiagnostics-format=json. - GCC now has a set of user experience guidelines for GCC, with information and advice on implementing new diagnostics.
Other significant improvements
- GCC's internal "selftest" suite now runs for C++ as well as C (in debug builds of the compiler).
This is the list of problem reports (PRs) from GCC's bug tracking system that are known to be fixed in the 9.1 release. This list might not be complete (that is, it is possible that some PRs that have been fixed are not listed here).
GCC 9.2
This is the list of problem reports (PRs) from GCC's bug tracking system that are known to be fixed in the 9.2 release. This list might not be complete (that is, it is possible that some PRs that have been fixed are not listed here).
GCC 9.3
This is the list of problem reports (PRs) from GCC's bug tracking system that are known to be fixed in the 9.3 release. This list might not be complete (that is, it is possible that some PRs that have been fixed are not listed here).
GCC 9.4
This is the list of problem reports (PRs) from GCC's bug tracking system that are known to be fixed in the 9.4 release. This list might not be complete (that is, it is possible that some PRs that have been fixed are not listed here).
Target Specific Changes
AArch64
-
The option
-moutline-atomicshas been added to aid deployment of the Large System Extensions (LSE) on GNU/Linux systems built with a baseline architecture targeting Armv8-A. When the option is specified code is emitted to detect the presence of LSE instructions at run time and use them for standard atomic operations. For more information please refer to the documentation. - GCC now supports the Fujitsu A64FX. The associated
-mcpuand-mtuneoptions are-mcpu=a64fxand-mtune=a64fxrespectively. In particular,-mcpu=a64fxgenerates code for Armv8.2-A with SVE and tunes the code for the A64FX. This includes tuning the SVE code, although by default the code is still length-agnostic and so works for all SVE implementations. Adding-msve-vector-bits=512makes the code specific to 512-bit SVE.
GCC 9.5
This is the list of problem reports (PRs) from GCC's bug tracking system that are known to be fixed in the 9.5 release. This list might not be complete (that is, it is possible that some PRs that have been fixed are not listed here).