aboutsummaryrefslogtreecommitdiff
path: root/libgfortran
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2010-10-16 16:06:07 +0000
committerThomas Koenig <tkoenig@gcc.gnu.org>2010-10-16 16:06:07 +0000
commit6eb6875d7ec398935d3ae76f805e33db0c3773dd (patch)
treeef2e1984f68327623f3236a0f91f67926babb5ce /libgfortran
parent08d78391b727da035b0f51e1c52fc2376d340e2e (diff)
downloadgcc-6eb6875d7ec398935d3ae76f805e33db0c3773dd.zip
gcc-6eb6875d7ec398935d3ae76f805e33db0c3773dd.tar.gz
gcc-6eb6875d7ec398935d3ae76f805e33db0c3773dd.tar.bz2
re PR tree-optimization/20165 (Pointer does not really escape with write)
2010-10-16 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/20165 PR fortran/31593 PR fortran/43665 * gfortran.map: Add _gfortran_transfer_array_write, _gfortran_transfer_array_write, _gfortran_transfer_character_write, _gfortran_transfer_character_wide_write, _gfortran_transfer_complex_write, _gfortran_transfer_integer_write, _gfortran_transfer_logical_write and _gfortran_transfer_real_write. * io/transfer.c (transfer_integer_write): Add prototype and function body as call to the original function, without the _write. (transfer_real_write): Likewise. (transfer_logical_write): Likewise. (transfer_character_write): Likewise. (transfer_character_wide_write): Likewise. (transfer_complex_write): Likewise. (transfer_array_write): Likewise. 2010-10-16 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/20165 PR fortran/31593 PR fortran/43665 * trans-io.c (enum iocall): Add IOCALL_X_INTEGER_WRITE, IOCALL_X_LOGICAL_WRITE, IOCALL_X_CHARACTER_WRITE, IOCALL_X_CHARACTER_WIDE_WRIE, IOCALL_X_REAL_WRITE, IOCALL_X_COMPLEX_WRITE and IOCALL_X_ARRAY_WRITE. (gfc_build_io_library_fndecls): Add corresponding function decls. (transfer_expr): If the current transfer is a READ, use the iocall with the original version, otherwise the version with _WRITE. (transfer_array_desc): Likewise. From-SVN: r165559
Diffstat (limited to 'libgfortran')
-rw-r--r--libgfortran/ChangeLog22
-rw-r--r--libgfortran/gfortran.map7
-rw-r--r--libgfortran/io/transfer.c60
3 files changed, 89 insertions, 0 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index c462a2a..adcb386 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,25 @@
+2010-10-16 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ PR fortran/20165
+ PR fortran/31593
+ PR fortran/43665
+ * gfortran.map: Add _gfortran_transfer_array_write,
+ _gfortran_transfer_array_write, _gfortran_transfer_character_write,
+ _gfortran_transfer_character_wide_write,
+ _gfortran_transfer_complex_write,
+ _gfortran_transfer_integer_write,
+ _gfortran_transfer_logical_write and
+ _gfortran_transfer_real_write.
+ * io/transfer.c (transfer_integer_write): Add prototype and
+ function body as call to the original function, without the
+ _write.
+ (transfer_real_write): Likewise.
+ (transfer_logical_write): Likewise.
+ (transfer_character_write): Likewise.
+ (transfer_character_wide_write): Likewise.
+ (transfer_complex_write): Likewise.
+ (transfer_array_write): Likewise.
+
2010-09-22 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR libfortran/45710
diff --git a/libgfortran/gfortran.map b/libgfortran/gfortran.map
index ea6ebfa..c85ebf7 100644
--- a/libgfortran/gfortran.map
+++ b/libgfortran/gfortran.map
@@ -1141,6 +1141,13 @@ GFORTRAN_1.4 {
_gfortran_parity_l8;
_gfortran_parity_l16;
_gfortran_selected_real_kind2008;
+ _gfortran_transfer_array_write;
+ _gfortran_transfer_character_write;
+ _gfortran_transfer_character_wide_write;
+ _gfortran_transfer_complex_write;
+ _gfortran_transfer_integer_write;
+ _gfortran_transfer_logical_write;
+ _gfortran_transfer_real_write;
} GFORTRAN_1.3;
F2C_1.0 {
diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c
index f750a56..41d5a42 100644
--- a/libgfortran/io/transfer.c
+++ b/libgfortran/io/transfer.c
@@ -67,25 +67,48 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
extern void transfer_integer (st_parameter_dt *, void *, int);
export_proto(transfer_integer);
+extern void transfer_integer_write (st_parameter_dt *, void *, int);
+export_proto(transfer_integer_write);
+
extern void transfer_real (st_parameter_dt *, void *, int);
export_proto(transfer_real);
+extern void transfer_real_write (st_parameter_dt *, void *, int);
+export_proto(transfer_real_write);
+
extern void transfer_logical (st_parameter_dt *, void *, int);
export_proto(transfer_logical);
+extern void transfer_logical_write (st_parameter_dt *, void *, int);
+export_proto(transfer_logical_write);
+
extern void transfer_character (st_parameter_dt *, void *, int);
export_proto(transfer_character);
+extern void transfer_character_write (st_parameter_dt *, void *, int);
+export_proto(transfer_character_write);
+
extern void transfer_character_wide (st_parameter_dt *, void *, int, int);
export_proto(transfer_character_wide);
+extern void transfer_character_wide_write (st_parameter_dt *,
+ void *, int, int);
+export_proto(transfer_character_wide_write);
+
extern void transfer_complex (st_parameter_dt *, void *, int);
export_proto(transfer_complex);
+extern void transfer_complex_write (st_parameter_dt *, void *, int);
+export_proto(transfer_complex_write);
+
extern void transfer_array (st_parameter_dt *, gfc_array_char *, int,
gfc_charlen_type);
export_proto(transfer_array);
+extern void transfer_array_write (st_parameter_dt *, gfc_array_char *, int,
+ gfc_charlen_type);
+export_proto(transfer_array_write);
+
static void us_read (st_parameter_dt *, int);
static void us_write (st_parameter_dt *, int);
static void next_record_r_unf (st_parameter_dt *, int);
@@ -1847,6 +1870,11 @@ transfer_integer (st_parameter_dt *dtp, void *p, int kind)
dtp->u.p.transfer (dtp, BT_INTEGER, p, kind, kind, 1);
}
+void
+transfer_integer_write (st_parameter_dt *dtp, void *p, int kind)
+{
+ transfer_integer (dtp, p, kind);
+}
void
transfer_real (st_parameter_dt *dtp, void *p, int kind)
@@ -1858,6 +1886,11 @@ transfer_real (st_parameter_dt *dtp, void *p, int kind)
dtp->u.p.transfer (dtp, BT_REAL, p, kind, size, 1);
}
+void
+transfer_real_write (st_parameter_dt *dtp, void *p, int kind)
+{
+ transfer_real (dtp, p, kind);
+}
void
transfer_logical (st_parameter_dt *dtp, void *p, int kind)
@@ -1867,6 +1900,11 @@ transfer_logical (st_parameter_dt *dtp, void *p, int kind)
dtp->u.p.transfer (dtp, BT_LOGICAL, p, kind, kind, 1);
}
+void
+transfer_logical_write (st_parameter_dt *dtp, void *p, int kind)
+{
+ transfer_logical (dtp, p, kind);
+}
void
transfer_character (st_parameter_dt *dtp, void *p, int len)
@@ -1887,6 +1925,12 @@ transfer_character (st_parameter_dt *dtp, void *p, int len)
}
void
+transfer_character_write (st_parameter_dt *dtp, void *p, int len)
+{
+ transfer_character (dtp, p, len);
+}
+
+void
transfer_character_wide (st_parameter_dt *dtp, void *p, int len, int kind)
{
static char *empty_string[0];
@@ -1904,6 +1948,11 @@ transfer_character_wide (st_parameter_dt *dtp, void *p, int len, int kind)
dtp->u.p.transfer (dtp, BT_CHARACTER, p, kind, len, 1);
}
+void
+transfer_character_wide_write (st_parameter_dt *dtp, void *p, int len, int kind)
+{
+ transfer_character_wide (dtp, p, len, kind);
+}
void
transfer_complex (st_parameter_dt *dtp, void *p, int kind)
@@ -1915,6 +1964,11 @@ transfer_complex (st_parameter_dt *dtp, void *p, int kind)
dtp->u.p.transfer (dtp, BT_COMPLEX, p, kind, size, 1);
}
+void
+transfer_complex_write (st_parameter_dt *dtp, void *p, int kind)
+{
+ transfer_complex (dtp, p, kind);
+}
void
transfer_array (st_parameter_dt *dtp, gfc_array_char *desc, int kind,
@@ -2020,6 +2074,12 @@ transfer_array (st_parameter_dt *dtp, gfc_array_char *desc, int kind,
}
}
+void
+transfer_array_write (st_parameter_dt *dtp, gfc_array_char *desc, int kind,
+ gfc_charlen_type charlen)
+{
+ transfer_array (dtp, desc, kind, charlen);
+}
/* Preposition a sequential unformatted file while reading. */