With the recent release of Red Hat Enterprise Linux 7, we have some great new features to pass along. In this post we walk through GCC 4.8 and see what is new for developers.
The GNU Compiler Collection, or “gcc” as we like to call it, is a core component of Red Hat Enterprise Linux 7 and provides compilers and runtime libraries for several statically compiled languages, including C, C++ & Fortran. At one level or another, every component of Red Hat Enterprise Linux depends on GCC; thus changes & improvements tend to be of great interest to our customers and partners.
It has been roughly 3.5 years since the release of Red Hat Enterprise Linux 6. During that time Red Hat and the gcc upstream community have been busy developing new optimizations as well as support for new releases of the ISO C++ and ISO C languages, etc.
This is just a high level overview of the major changes in the optimizer and processor support designed to improve the runtime performance of your code:
- Whole Program Optimization (aka Link Time Optimization) -- The compiler now has the ability to optimize across compilation unit boundaries via the LTO optimizer framework.
- In effect, LTO provides all suitably compiled objects to the IPA (Inter-Procedural Analysis) framework as a single unit
- Reduces or may eliminate the "abstraction penalty" commonly associated with good programming practices
- Works with archives, shared libraries, relocatable objects, etc
- Makes conservative assumptions at call sites where no LTO information exists, thus LTO and non-LTO objects can be seamlessly mixed.
- In effect, LTO provides all suitably compiled objects to the IPA (Inter-Procedural Analysis) framework as a single unit
- Inter-Procedural Analysis -- IPA optimizes entire compilation units at a time and provides most of the framework for:
- Full inlining, partial inlining, recursive inlining, virtual method inlining
- Full and partial function specialization and multi-versioning
- Auto-detection and propagation of function attributes such as pure, const, noreturn, noexcept, nothrow, etc.
- Pointer and memory escape analysis, global modification analysis
- Static profile estimation and function layout/placement algorithms
- GCC now has a support for a state of the art register allocation path, including register reloading via IRA/LRA
- Replaces 20+ year old technology
- Generates vastly superior code on common architectures
- New hardware support (Intel Core 2, I3, I5, I7, AMD Bobcat, Bulldozer, Jaguar, Steamroller, etc.)
- Transactional Memory Support (software emulated with hardware fastpath for Haswell processors)
In addition to adding new optimizers and hardware support, GCC in Red Hat Enterprise Linux 7 also brings major language improvements:
- C++11 was ratified in late 2011. GCC provides a feature complete C++ language implementation, including:
- Move semantics
- C++11 Memory Model
- Lambdas
- Constexpr
- Extended Friends
- User Defined Literals
- Alias Declarations
- Delegating Constructors
- thread local
- alignas
- inheriting constructors
- ref-qualifiers
- Runtime is not fully C++11 compliant yet due to ABI changes required to implement the C++ 11 runtime (pair, string, list require ABI changes)
- Improved compile-time scalability for template heavy code
- Ongoing major improvements to C++ diagnostics
- Exploitation of C++11 move semantics as well as nothrow, noexcept, const, pure, noreturn attributes in C++ runtime libraries. This sometimes allows code to run faster just by recompiling it in C++11 mode
- Profile mode for C++ runtime which allows the C++ runtime to make suggestions about proper use of container classes based on runtime feedback
- Support for data race detectors in C++ runtime (annotation of internally used objects)
- Python pretty-printers for standard components to improve debugging of standard objects from the C++ runtime.
These are just the highlights, there is so much more going on under the hood as the Red Hat and upstream teams continue to drive GCC development forward. Watch for future posts highlighting upcoming features such as OpenMP 4, Threading Building Blocks (TBB), Cilk+, ABI verification and testing, benchmarking and more.