* [wwwdocs] Porting-to-14: Mention new pragma GCC Target behavior
@ 2024-04-25 12:34 Martin Jambor
2024-04-25 12:41 ` Jakub Jelinek
0 siblings, 1 reply; 7+ messages in thread
From: Martin Jambor @ 2024-04-25 12:34 UTC (permalink / raw)
To: GCC Patches; +Cc: Michal Jires, Gerald Pfeifer
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>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [wwwdocs] Porting-to-14: Mention new pragma GCC Target behavior
2024-04-25 12:34 [wwwdocs] Porting-to-14: Mention new pragma GCC Target behavior Martin Jambor
@ 2024-04-25 12:41 ` Jakub Jelinek
2024-04-30 21:12 ` Martin Jambor
0 siblings, 1 reply; 7+ messages in thread
From: Jakub Jelinek @ 2024-04-25 12:41 UTC (permalink / raw)
To: Martin Jambor; +Cc: GCC Patches, Michal Jires, Gerald Pfeifer
On Thu, Apr 25, 2024 at 02:34:22PM +0200, Martin Jambor wrote:
> 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.
The change was more subtle.
We used to define/undefine the ISA macros in C in GCC 13 and older as well,
but only when using integrated preprocessor during compilation,
so it didn't work that way with -save-temps or separate -E and -S/-c
steps.
While in C++ it behaved as if the define/undefines aren't done at all
(they were done, but after preprocessing/lexing everything, so didn't
affect anything).
In GCC 14, it behaves in C++ the same as in C in older versions, and
additionally they are defined/undefined also when using separate
preprocessing, in both C and C++.
Jakub
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [wwwdocs] Porting-to-14: Mention new pragma GCC Target behavior
2024-04-25 12:41 ` Jakub Jelinek
@ 2024-04-30 21:12 ` Martin Jambor
2024-04-30 21:30 ` Jakub Jelinek
2024-05-01 14:05 ` Gerald Pfeifer
0 siblings, 2 replies; 7+ messages in thread
From: Martin Jambor @ 2024-04-30 21:12 UTC (permalink / raw)
To: Jakub Jelinek; +Cc: GCC Patches, Michal Jires, Gerald Pfeifer
Hi,
On Thu, Apr 25 2024, Jakub Jelinek wrote:
> On Thu, Apr 25, 2024 at 02:34:22PM +0200, Martin Jambor wrote:
>> 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.
>
> The change was more subtle.
> We used to define/undefine the ISA macros in C in GCC 13 and older as well,
> but only when using integrated preprocessor during compilation,
> so it didn't work that way with -save-temps or separate -E and -S/-c
> steps.
> While in C++ it behaved as if the define/undefines aren't done at all
> (they were done, but after preprocessing/lexing everything, so didn't
> affect anything).
> In GCC 14, it behaves in C++ the same as in C in older versions, and
> additionally they are defined/undefined also when using separate
> preprocessing, in both C and C++.
>
I see, thanks for the correction.
Would the following then perhaps describe the situation accurately?
Note that I have moved the whole thing to C++ section because it seems
porting issues in C because of this are quite unlikely.
Michal, I assume that the file where this issue happened was written in
C++, right?
Martin
diff --git a/htdocs/gcc-14/porting_to.html b/htdocs/gcc-14/porting_to.html
index c825a68e..1e67b0b3 100644
--- a/htdocs/gcc-14/porting_to.html
+++ b/htdocs/gcc-14/porting_to.html
@@ -514,6 +514,51 @@ be included explicitly when compiling with GCC 14:
</li>
</ul>
+<h3 id="gcc-targte-pragma">Pragma GCC Target now affects preprocessor symbols</h4>
+
+<p>
+The behavior of pragma GCC Target and specifically how it affects ISA
+macros has changed in GCC 14. In GCC 13 and older, the <code>GCC
+target</code> pragma defined and undefined corresponding ISA macros in
+C when using integrated preprocessor during compilation but not when
+preprocessor was invoked as a separate step or when using -save-temps.
+In C++ the ISA macro definitions were performed in a way which did not
+have any actual effect.
+
+In GCC 14 C++ behaves like C with integrated preprocessing in earlier
+versions. Moreover, in both languages ISA macros are defined and
+undefined as expected when preprocessing separately from compilation.
+
+<p>
+This can lead to different behavior, especially in C++. For example,
+functions the C++ snippet below will be (silently) compiled for an
+incorrect instruction set by GCC 14.
+
+<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="fortran">Fortran language issues</h2> -->
</body>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [wwwdocs] Porting-to-14: Mention new pragma GCC Target behavior
2024-04-30 21:12 ` Martin Jambor
@ 2024-04-30 21:30 ` Jakub Jelinek
2024-05-01 14:05 ` Gerald Pfeifer
1 sibling, 0 replies; 7+ messages in thread
From: Jakub Jelinek @ 2024-04-30 21:30 UTC (permalink / raw)
To: Martin Jambor; +Cc: GCC Patches, Michal Jires, Gerald Pfeifer
On Tue, Apr 30, 2024 at 11:12:30PM +0200, Martin Jambor wrote:
> Would the following then perhaps describe the situation accurately?
> Note that I have moved the whole thing to C++ section because it seems
> porting issues in C because of this are quite unlikely.
>
> Michal, I assume that the file where this issue happened was written in
> C++, right?
>
> Martin
>
>
>
> diff --git a/htdocs/gcc-14/porting_to.html b/htdocs/gcc-14/porting_to.html
> index c825a68e..1e67b0b3 100644
> --- a/htdocs/gcc-14/porting_to.html
> +++ b/htdocs/gcc-14/porting_to.html
> @@ -514,6 +514,51 @@ be included explicitly when compiling with GCC 14:
> </li>
> </ul>
>
> +<h3 id="gcc-targte-pragma">Pragma GCC Target now affects preprocessor symbols</h4>
I'd use lowercase Target here
> +
> +<p>
> +The behavior of pragma GCC Target and specifically how it affects ISA
And here as well, perhaps even <code>#pragma GCC target</code>.
Otherwise LGTM.
> +macros has changed in GCC 14. In GCC 13 and older, the <code>GCC
> +target</code> pragma defined and undefined corresponding ISA macros in
> +C when using integrated preprocessor during compilation but not when
> +preprocessor was invoked as a separate step or when using -save-temps.
> +In C++ the ISA macro definitions were performed in a way which did not
> +have any actual effect.
> +
> +In GCC 14 C++ behaves like C with integrated preprocessing in earlier
> +versions. Moreover, in both languages ISA macros are defined and
> +undefined as expected when preprocessing separately from compilation.
> +
> +<p>
> +This can lead to different behavior, especially in C++. For example,
> +functions the C++ snippet below will be (silently) compiled for an
> +incorrect instruction set by GCC 14.
> +
> +<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="fortran">Fortran language issues</h2> -->
>
> </body>
Jakub
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [wwwdocs] Porting-to-14: Mention new pragma GCC Target behavior
2024-04-30 21:12 ` Martin Jambor
2024-04-30 21:30 ` Jakub Jelinek
@ 2024-05-01 14:05 ` Gerald Pfeifer
2024-05-02 21:39 ` Martin Jambor
1 sibling, 1 reply; 7+ messages in thread
From: Gerald Pfeifer @ 2024-05-01 14:05 UTC (permalink / raw)
To: Martin Jambor; +Cc: Jakub Jelinek, GCC Patches, Michal Jires
On Tue, 30 Apr 2024, Martin Jambor wrote:
> +<h3 id="gcc-targte-pragma">Pragma GCC Target now affects preprocessor symbols</h4>
Note the id: should be "gcc-target-pragma", though I even suggest to
simplify and say "target-pragma".
> +The behavior of pragma GCC Target and specifically how it affects ISA
Seconding Jakub's
"And here as well, perhaps even <code>#pragma GCC target</code>."
> +macros has changed in GCC 14. In GCC 13 and older, the <code>GCC
> +target</code> pragma defined and undefined corresponding ISA macros in
> +C when using integrated preprocessor during compilation but not when
"...the integrated preprocessor..."
> +preprocessor was invoked as a separate step or when using -save-temps.
"...the preprocessor..."
and <code>-save-temps</code>, or better "the <code>-save-temps</code>
option".
> +This can lead to different behavior, especially in C++. For example,
> +functions the C++ snippet below will be (silently) compiled for an
> +incorrect instruction set by GCC 14.
"functions" above looks like it's extraneous and should be skipped?
> + /* With GCC 14, __AVX2__ here will always be defined and pop_options
> + never called. */
> + #if ! __AVX2__
> + #pragma GCC pop_options
> + #endif
Maybe a bit subtle, I would not say a #pragma is called; how about invoked
or activated?
> +<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.
"The fix in this case is to remember" (or "...remembering...")
Gerald
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [wwwdocs] Porting-to-14: Mention new pragma GCC Target behavior
2024-05-01 14:05 ` Gerald Pfeifer
@ 2024-05-02 21:39 ` Martin Jambor
2024-05-03 23:37 ` Gerald Pfeifer
0 siblings, 1 reply; 7+ messages in thread
From: Martin Jambor @ 2024-05-02 21:39 UTC (permalink / raw)
To: Gerald Pfeifer; +Cc: Jakub Jelinek, GCC Patches, Michal Jires
Hi,
On Wed, May 01 2024, Gerald Pfeifer wrote:
> On Tue, 30 Apr 2024, Martin Jambor wrote:
>> +<h3 id="gcc-targte-pragma">Pragma GCC Target now affects preprocessor symbols</h4>
>
> Note the id: should be "gcc-target-pragma", though I even suggest to
> simplify and say "target-pragma".
>
>> +The behavior of pragma GCC Target and specifically how it affects ISA
>
> Seconding Jakub's
>
> "And here as well, perhaps even <code>#pragma GCC target</code>."
>
>> +macros has changed in GCC 14. In GCC 13 and older, the <code>GCC
>> +target</code> pragma defined and undefined corresponding ISA macros in
>> +C when using integrated preprocessor during compilation but not when
>
> "...the integrated preprocessor..."
>
>> +preprocessor was invoked as a separate step or when using -save-temps.
>
> "...the preprocessor..."
>
> and <code>-save-temps</code>, or better "the <code>-save-temps</code>
> option".
>
>> +This can lead to different behavior, especially in C++. For example,
>> +functions the C++ snippet below will be (silently) compiled for an
>> +incorrect instruction set by GCC 14.
>
> "functions" above looks like it's extraneous and should be skipped?
>
>> + /* With GCC 14, __AVX2__ here will always be defined and pop_options
>> + never called. */
>> + #if ! __AVX2__
>> + #pragma GCC pop_options
>> + #endif
>
> Maybe a bit subtle, I would not say a #pragma is called; how about invoked
> or activated?
>
>> +<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.
>
> "The fix in this case is to remember" (or "...remembering...")
>
Thanks for your suggestions, this is what I am going to commit in a
moment.
Martin
diff --git a/htdocs/gcc-14/porting_to.html b/htdocs/gcc-14/porting_to.html
index c825a68e..a20d82c2 100644
--- a/htdocs/gcc-14/porting_to.html
+++ b/htdocs/gcc-14/porting_to.html
@@ -514,6 +514,48 @@ be included explicitly when compiling with GCC 14:
</li>
</ul>
+<h3 id="target-pragma">Pragma GCC target now affects preprocessor symbols</h4>
+
+<p>
+The behavior of pragma GCC target and specifically how it affects ISA
+macros has changed in GCC 14. In GCC 13 and older, the <code>GCC
+target</code> pragma defined and undefined corresponding ISA macros in
+C when using the integrated preprocessor during compilation but not
+when the preprocessor was invoked as a separate step or when using
+the <code>-save-temps</code> option. In C++ the ISA macro definitions
+were performed in a way which did not have any actual effect.
+
+In GCC 14 C++ behaves like C with integrated preprocessing in earlier
+versions. Moreover, in both languages ISA macros are defined and
+undefined as expected when preprocessing separately from compilation.
+
+<p>
+This can lead to different behavior, especially in C++. For example,
+a part of the C++ snippet below will be (silently) compiled for an
+incorrect instruction set by GCC 14.
+
+<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 invoked. */
+ #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 is to remember whether <code>pop_options</code>
+needs to be performed in a new user-defined macro.
+
<!-- <h2 id="fortran">Fortran language issues</h2> -->
</body>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [wwwdocs] Porting-to-14: Mention new pragma GCC Target behavior
2024-05-02 21:39 ` Martin Jambor
@ 2024-05-03 23:37 ` Gerald Pfeifer
0 siblings, 0 replies; 7+ messages in thread
From: Gerald Pfeifer @ 2024-05-03 23:37 UTC (permalink / raw)
To: Martin Jambor; +Cc: Jakub Jelinek, GCC Patches, Michal Jires
On Thu, 2 May 2024, Martin Jambor wrote:
> Thanks for your suggestions, this is what I am going to commit in a
> moment.
Thanks!
> diff --git a/htdocs/gcc-14/porting_to.html b/htdocs/gcc-14/porting_to.html
>
> +<h3 id="target-pragma">Pragma GCC target now affects preprocessor symbols</h4>
A small detail I missed: <h3> closed by </h4> :-) I'll fix this in a
second.
> +<p>
> +The behavior of pragma GCC target and specifically how it affects ISA
> +macros has changed in GCC 14. In GCC 13 and older, the <code>GCC
> +target</code> pragma defined and undefined corresponding ISA macros in
> +C when using the integrated preprocessor during compilation but not
> +when the preprocessor was invoked as a separate step or when using
> +the <code>-save-temps</code> option. In C++ the ISA macro definitions
> +were performed in a way which did not have any actual effect.
> +
> +In GCC 14 C++ behaves like C with integrated preprocessing in earlier
> +versions. Moreover, in both languages ISA macros are defined and
> +undefined as expected when preprocessing separately from compilation.
I assume this should be two paragraphs? I'll make this change and some
other tweaks.
Gerald
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2024-05-03 23:37 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-04-25 12:34 [wwwdocs] Porting-to-14: Mention new pragma GCC Target behavior Martin Jambor
2024-04-25 12:41 ` Jakub Jelinek
2024-04-30 21:12 ` Martin Jambor
2024-04-30 21:30 ` Jakub Jelinek
2024-05-01 14:05 ` Gerald Pfeifer
2024-05-02 21:39 ` Martin Jambor
2024-05-03 23:37 ` Gerald Pfeifer
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).