diff options
author | Tobias Burnus <burnus@net-b.de> | 2014-07-12 21:00:47 +0200 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2014-07-12 21:00:47 +0200 |
commit | 7f4aaf912bdab4fe3ccad012add9a1d00a26dab1 (patch) | |
tree | 9038e580c528fda84a1b16297c39c9848284db75 /gcc/fortran/intrinsic.c | |
parent | 0eb5f1586fa04fd82180135917b2c80511473c6b (diff) | |
download | gcc-7f4aaf912bdab4fe3ccad012add9a1d00a26dab1.zip gcc-7f4aaf912bdab4fe3ccad012add9a1d00a26dab1.tar.gz gcc-7f4aaf912bdab4fe3ccad012add9a1d00a26dab1.tar.bz2 |
check.c (gfc_check_atomic): Update for STAT=.
gcc/fortran/
2014-07-12 Tobias Burnus <burnus@net-b.de>
* check.c (gfc_check_atomic): Update for STAT=.
(gfc_check_atomic_def, gfc_check_atomic_ref): Update call.
(gfc_check_atomic_op, gfc_check_atomic_cas,
gfc_check_atomic_fetch_op): New.
* gfortran.h (gfc_isym_id): GFC_ISYM_ATOMIC_CAS,
* GFC_ISYM_ATOMIC_ADD,
GFC_ISYM_ATOMIC_AND, GFC_ISYM_ATOMIC_OR, GFC_ISYM_ATOMIC_XOR,
GFC_ISYM_ATOMIC_FETCH_ADD, GFC_ISYM_ATOMIC_FETCH_AND,
GFC_ISYM_ATOMIC_FETCH_OR and GFC_ISYM_ATOMIC_FETCH_XOR.
* intrinsic.c (add_subroutines): Handle them.
* intrinsic.texi: Add documentation for them.
(ATOMIC_REF, ATOMIC_DEFINE): Add STAT=.
(ISO_FORTRAN_ENV): Add STAT_FAILED_IMAGE.
* intrinsic.h (gfc_check_atomic_op, gfc_check_atomic_cas,
gfc_check_atomic_fetch_op): New
prototypes.
* libgfortran.h (libgfortran_stat_codes): Add
* GFC_STAT_FAILED_IMAGE.
* iso-fortran-env.def: Add it.
* trans-intrinsic.c (conv_intrinsic_atomic_op): Renamed from
conv_intrinsic_atomic_ref; handle more atomics.
(conv_intrinsic_atomic_def): Handle STAT=.
(conv_intrinsic_atomic_cas): New.
(gfc_conv_intrinsic_subroutine): Handle new atomics.
gcc/testsuite/
2014-07-12 Tobias Burnus <burnus@net-b.de>
* gfortran.dg/coarray_atomic_1.f90: Update dg-error.
* gfortran.dg/coarray_atomic_2.f90: New.
* gfortran.dg/coarray_atomic_3.f90: New.
* gfortran.dg/coarray_atomic_4.f90: New.
* gfortran.dg/coarray/atomic_2.f90: New.
From-SVN: r212483
Diffstat (limited to 'gcc/fortran/intrinsic.c')
-rw-r--r-- | gcc/fortran/intrinsic.c | 79 |
1 files changed, 75 insertions, 4 deletions
diff --git a/gcc/fortran/intrinsic.c b/gcc/fortran/intrinsic.c index bf784b5..d681d70 100644 --- a/gcc/fortran/intrinsic.c +++ b/gcc/fortran/intrinsic.c @@ -3038,17 +3038,88 @@ add_subroutines (void) make_noreturn(); - add_sym_2s ("atomic_define", GFC_ISYM_ATOMIC_DEF, CLASS_ATOMIC, + add_sym_3s ("atomic_define", GFC_ISYM_ATOMIC_DEF, CLASS_ATOMIC, BT_UNKNOWN, 0, GFC_STD_F2008, gfc_check_atomic_def, NULL, gfc_resolve_atomic_def, "atom", BT_INTEGER, di, REQUIRED, INTENT_OUT, - "value", BT_INTEGER, di, REQUIRED, INTENT_IN); + "value", BT_INTEGER, di, REQUIRED, INTENT_IN, + stat, BT_INTEGER, di, OPTIONAL, INTENT_OUT); - add_sym_2s ("atomic_ref", GFC_ISYM_ATOMIC_REF, CLASS_ATOMIC, + add_sym_3s ("atomic_ref", GFC_ISYM_ATOMIC_REF, CLASS_ATOMIC, BT_UNKNOWN, 0, GFC_STD_F2008, gfc_check_atomic_ref, NULL, gfc_resolve_atomic_ref, "value", BT_INTEGER, di, REQUIRED, INTENT_OUT, - "atom", BT_INTEGER, di, REQUIRED, INTENT_IN); + "atom", BT_INTEGER, di, REQUIRED, INTENT_IN, + stat, BT_INTEGER, di, OPTIONAL, INTENT_OUT); + + add_sym_5s ("atomic_cas", GFC_ISYM_ATOMIC_CAS, CLASS_ATOMIC, + BT_UNKNOWN, 0, GFC_STD_F2008_TS, + gfc_check_atomic_cas, NULL, NULL, + "atom", BT_INTEGER, di, REQUIRED, INTENT_INOUT, + "old", BT_INTEGER, di, REQUIRED, INTENT_OUT, + "compare", BT_INTEGER, di, REQUIRED, INTENT_IN, + "new", BT_INTEGER, di, REQUIRED, INTENT_IN, + stat, BT_INTEGER, di, OPTIONAL, INTENT_OUT); + + add_sym_3s ("atomic_add", GFC_ISYM_ATOMIC_ADD, CLASS_ATOMIC, + BT_UNKNOWN, 0, GFC_STD_F2008_TS, + gfc_check_atomic_op, NULL, NULL, + "atom", BT_INTEGER, di, REQUIRED, INTENT_OUT, + "value", BT_INTEGER, di, REQUIRED, INTENT_IN, + stat, BT_INTEGER, di, OPTIONAL, INTENT_OUT); + + add_sym_3s ("atomic_and", GFC_ISYM_ATOMIC_AND, CLASS_ATOMIC, + BT_UNKNOWN, 0, GFC_STD_F2008_TS, + gfc_check_atomic_op, NULL, NULL, + "atom", BT_INTEGER, di, REQUIRED, INTENT_OUT, + "value", BT_INTEGER, di, REQUIRED, INTENT_IN, + stat, BT_INTEGER, di, OPTIONAL, INTENT_OUT); + + add_sym_3s ("atomic_or", GFC_ISYM_ATOMIC_OR, CLASS_ATOMIC, + BT_UNKNOWN, 0, GFC_STD_F2008_TS, + gfc_check_atomic_op, NULL, NULL, + "atom", BT_INTEGER, di, REQUIRED, INTENT_OUT, + "value", BT_INTEGER, di, REQUIRED, INTENT_IN, + stat, BT_INTEGER, di, OPTIONAL, INTENT_OUT); + + add_sym_3s ("atomic_xor", GFC_ISYM_ATOMIC_XOR, CLASS_ATOMIC, + BT_UNKNOWN, 0, GFC_STD_F2008_TS, + gfc_check_atomic_op, NULL, NULL, + "atom", BT_INTEGER, di, REQUIRED, INTENT_OUT, + "value", BT_INTEGER, di, REQUIRED, INTENT_IN, + stat, BT_INTEGER, di, OPTIONAL, INTENT_OUT); + + add_sym_4s ("atomic_fetch_add", GFC_ISYM_ATOMIC_FETCH_ADD, CLASS_ATOMIC, + BT_UNKNOWN, 0, GFC_STD_F2008_TS, + gfc_check_atomic_fetch_op, NULL, NULL, + "atom", BT_INTEGER, di, REQUIRED, INTENT_OUT, + "value", BT_INTEGER, di, REQUIRED, INTENT_IN, + "old", BT_INTEGER, di, REQUIRED, INTENT_OUT, + stat, BT_INTEGER, di, OPTIONAL, INTENT_OUT); + + add_sym_4s ("atomic_fetch_and", GFC_ISYM_ATOMIC_FETCH_AND, CLASS_ATOMIC, + BT_UNKNOWN, 0, GFC_STD_F2008_TS, + gfc_check_atomic_fetch_op, NULL, NULL, + "atom", BT_INTEGER, di, REQUIRED, INTENT_OUT, + "value", BT_INTEGER, di, REQUIRED, INTENT_IN, + "old", BT_INTEGER, di, REQUIRED, INTENT_OUT, + stat, BT_INTEGER, di, OPTIONAL, INTENT_OUT); + + add_sym_4s ("atomic_fetch_or", GFC_ISYM_ATOMIC_FETCH_OR, CLASS_ATOMIC, + BT_UNKNOWN, 0, GFC_STD_F2008_TS, + gfc_check_atomic_fetch_op, NULL, NULL, + "atom", BT_INTEGER, di, REQUIRED, INTENT_OUT, + "value", BT_INTEGER, di, REQUIRED, INTENT_IN, + "old", BT_INTEGER, di, REQUIRED, INTENT_OUT, + stat, BT_INTEGER, di, OPTIONAL, INTENT_OUT); + + add_sym_4s ("atomic_fetch_xor", GFC_ISYM_ATOMIC_FETCH_XOR, CLASS_ATOMIC, + BT_UNKNOWN, 0, GFC_STD_F2008_TS, + gfc_check_atomic_fetch_op, NULL, NULL, + "atom", BT_INTEGER, di, REQUIRED, INTENT_OUT, + "value", BT_INTEGER, di, REQUIRED, INTENT_IN, + "old", BT_INTEGER, di, REQUIRED, INTENT_OUT, + stat, BT_INTEGER, di, OPTIONAL, INTENT_OUT); add_sym_0s ("backtrace", GFC_ISYM_BACKTRACE, GFC_STD_GNU, NULL); |