forked from gcc-mirror/gcc
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add out-of-line versions of some <stdatomic.h> functions (PR c/65083).
PR c/65083 notes that some functions in <stdatomic.h> are normal functions, not generic functions, and so need to have out-of-line copies that can be called when macro expansion is suppressed (unlike the generic functions where DR#419 makes it undefined if you suppress a macro expansion). This patch adds such out-of-line definitions in libatomic for those six functions, at a new LIBATOMIC_1.2 symbol version, as trivial wrappers to the <stdatomic.h> macros, along with declarations of those functions in <stdatomic.h>. Tests are added that are based on the corresponding tests for the macros, but with parentheses around the function names to force the out-of-line functions to be used. Bootstrapped with no regressions on x86_64-pc-linux-gnu. gcc: * ginclude/stdatomic.h (atomic_thread_fence, atomic_signal_fence) (atomic_flag_test_and_set, atomic_flag_test_and_set_explicit) (atomic_flag_clear, atomic_flag_clear_explicit): Declare as functions before defining as macros. gcc/testsuite: * gcc.dg/atomic/stdatomic-fence-2.c, gcc.dg/atomic/stdatomic-flag-2.c: New tests. libatomic: * fence.c, flag.c: New files. * Makefile.am (libatomic_la_SOURCES): Add fence.c and flag.c. * Makefile.in: Regenerate. * configure.ac (libtool_VERSION): Change to 3:0:2. * configure: Regenerate. * libatomic.map (LIBATOMIC_1.2): New symbol version. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@230578 138bc75d-0d04-0410-961f-82ee72b054a4
- Loading branch information
jsm28
committed
Nov 18, 2015
1 parent
51f32d1
commit cd404a1
Showing
13 changed files
with
223 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,11 @@ | ||
2015-11-18 Joseph Myers <[email protected]> | ||
|
||
PR c/65083 | ||
* ginclude/stdatomic.h (atomic_thread_fence, atomic_signal_fence) | ||
(atomic_flag_test_and_set, atomic_flag_test_and_set_explicit) | ||
(atomic_flag_clear, atomic_flag_clear_explicit): Declare as | ||
functions before defining as macros. | ||
|
||
2015-11-18 Nathan Sidwell <[email protected]> | ||
|
||
* config/nvptx/nvptx.c (nvptx_process_pars): Fix whitespace. | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,9 @@ | ||
2015-11-18 Joseph Myers <[email protected]> | ||
|
||
PR c/65083 | ||
* gcc.dg/atomic/stdatomic-fence-2.c, | ||
gcc.dg/atomic/stdatomic-flag-2.c: New tests. | ||
|
||
2015-11-18 Eric Botcazou <[email protected]> | ||
|
||
* gnat.dg/loop_optimization19.adb: New test. | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
/* Test atomic_*_fence routines for existence and execution with each | ||
valid memory model. Out-of-line function calls. */ | ||
/* { dg-do run } */ | ||
/* { dg-options "-std=c11 -pedantic-errors" } */ | ||
|
||
#include <stdatomic.h> | ||
|
||
int | ||
main () | ||
{ | ||
(atomic_thread_fence) (memory_order_relaxed); | ||
(atomic_thread_fence) (memory_order_consume); | ||
(atomic_thread_fence) (memory_order_acquire); | ||
(atomic_thread_fence) (memory_order_release); | ||
(atomic_thread_fence) (memory_order_acq_rel); | ||
(atomic_thread_fence) (memory_order_seq_cst); | ||
|
||
(atomic_signal_fence) (memory_order_relaxed); | ||
(atomic_signal_fence) (memory_order_consume); | ||
(atomic_signal_fence) (memory_order_acquire); | ||
(atomic_signal_fence) (memory_order_release); | ||
(atomic_signal_fence) (memory_order_acq_rel); | ||
(atomic_signal_fence) (memory_order_seq_cst); | ||
|
||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
/* Test atomic_flag routines for existence and execution. Out-of-line | ||
function calls. */ | ||
/* The test needs a lockless atomic implementation. */ | ||
/* { dg-do run { xfail hppa*-*-hpux* } } */ | ||
/* { dg-options "-std=c11 -pedantic-errors" } */ | ||
|
||
#include <stdatomic.h> | ||
|
||
extern void abort (void); | ||
atomic_flag a = ATOMIC_FLAG_INIT; | ||
|
||
int | ||
main () | ||
{ | ||
int b; | ||
|
||
if (!atomic_is_lock_free (&a)) | ||
abort (); | ||
|
||
if ((atomic_flag_test_and_set) (&a)) | ||
abort (); | ||
(atomic_flag_clear_explicit) (&a, memory_order_relaxed); | ||
if ((atomic_flag_test_and_set) (&a)) | ||
abort (); | ||
(atomic_flag_clear) (&a); | ||
|
||
b = (atomic_flag_test_and_set_explicit) (&a, memory_order_seq_cst); | ||
if (!(atomic_flag_test_and_set) (&a) || b != 0) | ||
abort (); | ||
|
||
b = (atomic_flag_test_and_set_explicit) (&a, memory_order_acq_rel); | ||
if (!(atomic_flag_test_and_set) (&a) || b != 1) | ||
abort (); | ||
|
||
(atomic_flag_clear_explicit) (&a, memory_order_seq_cst); | ||
if ((atomic_flag_test_and_set) (&a)) | ||
abort (); | ||
|
||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,13 @@ | ||
2015-11-18 Joseph Myers <[email protected]> | ||
|
||
PR c/65083 | ||
* fence.c, flag.c: New files. | ||
* Makefile.am (libatomic_la_SOURCES): Add fence.c and flag.c. | ||
* Makefile.in: Regenerate. | ||
* configure.ac (libtool_VERSION): Change to 3:0:2. | ||
* configure: Regenerate. | ||
* libatomic.map (LIBATOMIC_1.2): New symbol version. | ||
|
||
2015-10-09 David Malcolm <[email protected]> | ||
|
||
* testsuite/lib/libatomic.exp: Load multiline.exp before | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
/* Copyright (C) 2015 Free Software Foundation, Inc. | ||
This file is part of the GNU Atomic Library (libatomic). | ||
Libatomic is free software; you can redistribute it and/or modify it | ||
under the terms of the GNU General Public License as published by | ||
the Free Software Foundation; either version 3 of the License, or | ||
(at your option) any later version. | ||
Libatomic is distributed in the hope that it will be useful, but WITHOUT ANY | ||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | ||
FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
more details. | ||
Under Section 7 of GPL version 3, you are granted additional | ||
permissions described in the GCC Runtime Library Exception, version | ||
3.1, as published by the Free Software Foundation. | ||
You should have received a copy of the GNU General Public License and | ||
a copy of the GCC Runtime Library Exception along with this program; | ||
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | ||
<http://www.gnu.org/licenses/>. */ | ||
|
||
#include "libatomic_i.h" | ||
|
||
#include <stdatomic.h> | ||
|
||
/* Out-of-line versions of <stdatomic.h> fence functions. */ | ||
|
||
/* Fence as specified by ORDER. */ | ||
|
||
void | ||
(atomic_thread_fence) (memory_order order) | ||
{ | ||
atomic_thread_fence (order); | ||
} | ||
|
||
/* Fence as specified by ORDER but only establishing ordering between | ||
a thread and a signal handler executed in that thread. */ | ||
|
||
void | ||
(atomic_signal_fence) (memory_order order) | ||
{ | ||
atomic_signal_fence (order); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
/* Copyright (C) 2015 Free Software Foundation, Inc. | ||
This file is part of the GNU Atomic Library (libatomic). | ||
Libatomic is free software; you can redistribute it and/or modify it | ||
under the terms of the GNU General Public License as published by | ||
the Free Software Foundation; either version 3 of the License, or | ||
(at your option) any later version. | ||
Libatomic is distributed in the hope that it will be useful, but WITHOUT ANY | ||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | ||
FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
more details. | ||
Under Section 7 of GPL version 3, you are granted additional | ||
permissions described in the GCC Runtime Library Exception, version | ||
3.1, as published by the Free Software Foundation. | ||
You should have received a copy of the GNU General Public License and | ||
a copy of the GCC Runtime Library Exception along with this program; | ||
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | ||
<http://www.gnu.org/licenses/>. */ | ||
|
||
#include "libatomic_i.h" | ||
|
||
#include <stdatomic.h> | ||
|
||
/* Out-of-line versions of <stdatomic.h> flag functions. */ | ||
|
||
/* Atomically set *OBJECT to true, returning the previous value. */ | ||
|
||
_Bool | ||
(atomic_flag_test_and_set) (volatile atomic_flag *object) | ||
{ | ||
return atomic_flag_test_and_set (object); | ||
} | ||
|
||
/* Atomically set *OBJECT to true, returning the previous value, with | ||
memory affected according to ORDER. */ | ||
|
||
_Bool | ||
(atomic_flag_test_and_set_explicit) (volatile atomic_flag *object, | ||
memory_order order) | ||
{ | ||
return atomic_flag_test_and_set_explicit (object, order); | ||
} | ||
|
||
/* Atomically set *OBJECT to false. */ | ||
|
||
void | ||
(atomic_flag_clear) (volatile atomic_flag *object) | ||
{ | ||
atomic_flag_clear (object); | ||
} | ||
|
||
/* Atomically set *OBJECT to false, with memory affected according to | ||
ORDER. */ | ||
|
||
void | ||
(atomic_flag_clear_explicit) (volatile atomic_flag *object, | ||
memory_order order) | ||
{ | ||
return atomic_flag_clear_explicit (object, order); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters