Hello, when looking at a package build issue with GCC 14, Michal Jireš noted a different behavior of pragma GCC Target. This snippet tries to describe the gist of the problem. I have left it in the C section even though it is not really C specific, but could not think of a good name for a new section for it. Ideas (and any other suggestions for improvements) welcome, of course.
Otherwise, would this be good to go to the wwwdocs? Thanks, Martin diff --git a/htdocs/gcc-14/porting_to.html b/htdocs/gcc-14/porting_to.html index c825a68e..ae9a3cde 100644 --- a/htdocs/gcc-14/porting_to.html +++ b/htdocs/gcc-14/porting_to.html @@ -490,6 +490,43 @@ in C23. GCC will probably continue to support old-style function definitions even once C23 is used as the default language dialect. +<h4 id="gcc-targte-pragma">Pragma GCC Target now affects preprocessor symbols</h4> + +<p> +The behavior of pragma GCC Target has changed in GCC 14. For example, +GCC 13 and below defines <code>__AVX2__</code> only when the target +is specified on the command line. This has been considered <a href="https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87299">a +bug</a> and since it was fixed in GCC 14, <code>__AVX2__</code> is now also +defined with <code>#pragma GCC target("avx2")</code>. + +<p> +Therefore, if macros expand to something like the snippet below, +functions will be (silently) compiled for an incorrect instruction +set. + +<pre> + #if ! __AVX2__ + #pragma GCC push_options + #pragma GCC target("avx2") + #endif + + /* Code to be compiled for AVX2. */ + + /* With GCC 14, __AVX2__ here will always be defined and pop_options + never called. */ + #if ! __AVX2__ + #pragma GCC pop_options + #endif + + /* With GCC 14, all following functions will be compiled for AVX2 + which was not intended. */ +</pre> + +<p> +The fix in this case would be to remember +whether <code>pop_options</code> needs to be performed in a new +user-defined macro. + <h2 id="cxx">C++ language issues</h2> <h3 id="header-dep-changes">Header dependency changes</h3>