On 05/12/2023 10:33, Jakub Jelinek wrote:
Hi!

On Tue, Dec 05, 2023 at 10:46:02AM +0100, Florian Weimer wrote:
Presumably the fixes will look like this?

diff --git a/libgfortran/io/list_read.c b/libgfortran/io/list_read.c
index db3330060ce..4fcc77dbf83 100644
--- a/libgfortran/io/list_read.c
+++ b/libgfortran/io/list_read.c
@@ -2987,13 +2987,13 @@ nml_read_obj (st_parameter_dt *dtp, namelist_info *nl, 
index_type offset,
            /* If this object has a User Defined procedure, call it.  */
            if (nl->dtio_sub != NULL)
              {
-               int unit = dtp->u.p.current_unit->unit_number;
+               GFC_INTEGER_4 unit = dtp->u.p.current_unit->unit_number;
                char iotype[] = "NAMELIST";
                gfc_charlen_type iotype_len = 8;
                char tmp_iomsg[IOMSG_LEN] = "";
                char *child_iomsg;
                gfc_charlen_type child_iomsg_len;
-               int noiostat;
+               GFC_INTEGER_4 noiostat;
                int *child_iostat = NULL;
                gfc_full_array_i4 vlist;
                formatted_dtio dtio_ptr = (formatted_dtio)nl->dtio_sub;

That seems insufficient.

The following patch makes libgfortran build on i686-linux after hacking up
--- kinds.h.xx  2023-12-05 00:23:00.133365064 +0100
+++ kinds.h     2023-12-05 11:19:24.409679808 +0100
@@ -10,8 +10,8 @@ typedef GFC_INTEGER_2 GFC_LOGICAL_2;
  #define HAVE_GFC_LOGICAL_2
  #define HAVE_GFC_INTEGER_2
-typedef int32_t GFC_INTEGER_4;
-typedef uint32_t GFC_UINTEGER_4;
+typedef long GFC_INTEGER_4;
+typedef unsigned long GFC_UINTEGER_4;

That doesn't look right for a 64-bit processor. Presumably 4 means 4 bytes, but long will generally be 8 on such targets.

R.

  typedef GFC_INTEGER_4 GFC_LOGICAL_4;
  #define HAVE_GFC_LOGICAL_4
  #define HAVE_GFC_INTEGER_4
in the build dir to emulate what newlib aarch64 is doing:

2023-12-05  Florian Weimer  <fwei...@redhat.com>
            Jakub Jelinek  <ja...@redhat.com>

        * io/list_read.c (list_formatted_read_scalar) <case BT_CLASS>:
        Change types of unit and noiostat to GFC_INTEGER_4 from int, change
        type of child_iostat from to GFC_INTEGER_4 * from int *, formatting
        fixes.
        (nml_read_obj): Likewise.
        * io/write.c (list_formatted_write_scalar) <case BT_CLASS>: Likewise.
        (nml_write_obj): Likewise.
        * io/transfer.c (unformatted_read, unformatted_write): Likewise.

--- libgfortran/io/list_read.c.jj       2023-05-09 00:07:26.161168737 +0200
+++ libgfortran/io/list_read.c  2023-12-05 11:25:31.837426653 +0100
@@ -2189,14 +2189,14 @@ list_formatted_read_scalar (st_parameter
        break;
      case BT_CLASS:
        {
-         int unit = dtp->u.p.current_unit->unit_number;
+         GFC_INTEGER_4 unit = dtp->u.p.current_unit->unit_number;
          char iotype[] = "LISTDIRECTED";
            gfc_charlen_type iotype_len = 12;
          char tmp_iomsg[IOMSG_LEN] = "";
          char *child_iomsg;
          gfc_charlen_type child_iomsg_len;
-         int noiostat;
-         int *child_iostat = NULL;
+         GFC_INTEGER_4 noiostat;
+         GFC_INTEGER_4 *child_iostat = NULL;
          gfc_full_array_i4 vlist;
GFC_DESCRIPTOR_DATA(&vlist) = NULL;
@@ -2204,8 +2204,8 @@ list_formatted_read_scalar (st_parameter
/* Set iostat, intent(out). */
          noiostat = 0;
-         child_iostat = (dtp->common.flags & IOPARM_HAS_IOSTAT) ?
-                         dtp->common.iostat : &noiostat;
+         child_iostat = ((dtp->common.flags & IOPARM_HAS_IOSTAT)
+                         ? dtp->common.iostat : &noiostat);
/* Set iomsge, intent(inout). */
          if (dtp->common.flags & IOPARM_HAS_IOMSG)
@@ -2987,14 +2987,14 @@ nml_read_obj (st_parameter_dt *dtp, name
            /* If this object has a User Defined procedure, call it.  */
            if (nl->dtio_sub != NULL)
              {
-               int unit = dtp->u.p.current_unit->unit_number;
+               GFC_INTEGER_4 unit = dtp->u.p.current_unit->unit_number;
                char iotype[] = "NAMELIST";
                gfc_charlen_type iotype_len = 8;
                char tmp_iomsg[IOMSG_LEN] = "";
                char *child_iomsg;
                gfc_charlen_type child_iomsg_len;
-               int noiostat;
-               int *child_iostat = NULL;
+               GFC_INTEGER_4 noiostat;
+               GFC_INTEGER_4 *child_iostat = NULL;
                gfc_full_array_i4 vlist;
                formatted_dtio dtio_ptr = (formatted_dtio)nl->dtio_sub;
@@ -3006,8 +3006,8 @@ nml_read_obj (st_parameter_dt *dtp, name /* Set iostat, intent(out). */
                noiostat = 0;
-               child_iostat = (dtp->common.flags & IOPARM_HAS_IOSTAT) ?
-                               dtp->common.iostat : &noiostat;
+               child_iostat = ((dtp->common.flags & IOPARM_HAS_IOSTAT)
+                               ? dtp->common.iostat : &noiostat);
/* Set iomsg, intent(inout). */
                if (dtp->common.flags & IOPARM_HAS_IOMSG)
--- libgfortran/io/write.c.jj   2023-09-28 21:49:38.632795791 +0200
+++ libgfortran/io/write.c      2023-12-05 11:26:27.763627070 +0100
@@ -1952,14 +1952,14 @@ list_formatted_write_scalar (st_paramete
        break;
      case BT_CLASS:
        {
-         int unit = dtp->u.p.current_unit->unit_number;
+         GFC_INTEGER_4 unit = dtp->u.p.current_unit->unit_number;
          char iotype[] = "LISTDIRECTED";
          gfc_charlen_type iotype_len = 12;
          char tmp_iomsg[IOMSG_LEN] = "";
          char *child_iomsg;
          gfc_charlen_type child_iomsg_len;
-         int noiostat;
-         int *child_iostat = NULL;
+         GFC_INTEGER_4 noiostat;
+         GFC_INTEGER_4 *child_iostat = NULL;
          gfc_full_array_i4 vlist;
GFC_DESCRIPTOR_DATA(&vlist) = NULL;
@@ -1967,8 +1967,8 @@ list_formatted_write_scalar (st_paramete
/* Set iostat, intent(out). */
          noiostat = 0;
-         child_iostat = (dtp->common.flags & IOPARM_HAS_IOSTAT) ?
-                         dtp->common.iostat : &noiostat;
+         child_iostat = ((dtp->common.flags & IOPARM_HAS_IOSTAT)
+                         ? dtp->common.iostat : &noiostat);
/* Set iomsge, intent(inout). */
          if (dtp->common.flags & IOPARM_HAS_IOMSG)
@@ -2277,14 +2277,14 @@ nml_write_obj (st_parameter_dt *dtp, nam
              /* First ext_name => get length of all possible components  */
              if (obj->dtio_sub != NULL)
                {
-                 int unit = dtp->u.p.current_unit->unit_number;
+                 GFC_INTEGER_4 unit = dtp->u.p.current_unit->unit_number;
                  char iotype[] = "NAMELIST";
                  gfc_charlen_type iotype_len = 8;
                  char tmp_iomsg[IOMSG_LEN] = "";
                  char *child_iomsg;
                  gfc_charlen_type child_iomsg_len;
-                 int noiostat;
-                 int *child_iostat = NULL;
+                 GFC_INTEGER_4 noiostat;
+                 GFC_INTEGER_4 *child_iostat = NULL;
                  gfc_full_array_i4 vlist;
                  formatted_dtio dtio_ptr = (formatted_dtio)obj->dtio_sub;
@@ -2292,8 +2292,8 @@ nml_write_obj (st_parameter_dt *dtp, nam /* Set iostat, intent(out). */
                  noiostat = 0;
-                 child_iostat = (dtp->common.flags & IOPARM_HAS_IOSTAT) ?
-                                 dtp->common.iostat : &noiostat;
+                 child_iostat = ((dtp->common.flags & IOPARM_HAS_IOSTAT)
+                                 ? dtp->common.iostat : &noiostat);
/* Set iomsg, intent(inout). */
                  if (dtp->common.flags & IOPARM_HAS_IOMSG)
--- libgfortran/io/transfer.c.jj        2023-05-09 00:07:26.162168723 +0200
+++ libgfortran/io/transfer.c   2023-12-05 11:25:15.756656561 +0100
@@ -1092,17 +1092,17 @@ unformatted_read (st_parameter_dt *dtp,
if (type == BT_CLASS)
      {
-         int unit = dtp->u.p.current_unit->unit_number;
+         GFC_INTEGER_4 unit = dtp->u.p.current_unit->unit_number;
          char tmp_iomsg[IOMSG_LEN] = "";
          char *child_iomsg;
          gfc_charlen_type child_iomsg_len;
-         int noiostat;
-         int *child_iostat = NULL;
+         GFC_INTEGER_4 noiostat;
+         GFC_INTEGER_4 *child_iostat = NULL;
/* Set iostat, intent(out). */
          noiostat = 0;
-         child_iostat = (dtp->common.flags & IOPARM_HAS_IOSTAT) ?
-                         dtp->common.iostat : &noiostat;
+         child_iostat = ((dtp->common.flags & IOPARM_HAS_IOSTAT)
+                         ? dtp->common.iostat : &noiostat);
/* Set iomsg, intent(inout). */
          if (dtp->common.flags & IOPARM_HAS_IOMSG)
@@ -1119,7 +1119,7 @@ unformatted_read (st_parameter_dt *dtp,
          /* Call the user defined unformatted READ procedure.  */
          dtp->u.p.current_unit->child_dtio++;
          dtp->u.p.ufdtio_ptr (dest, &unit, child_iostat, child_iomsg,
-                             child_iomsg_len);
+                              child_iomsg_len);
          dtp->u.p.current_unit->child_dtio--;
          return;
      }
@@ -1222,17 +1222,17 @@ unformatted_write (st_parameter_dt *dtp,
if (type == BT_CLASS)
      {
-         int unit = dtp->u.p.current_unit->unit_number;
+         GFC_INTEGER_4 unit = dtp->u.p.current_unit->unit_number;
          char tmp_iomsg[IOMSG_LEN] = "";
          char *child_iomsg;
          gfc_charlen_type child_iomsg_len;
-         int noiostat;
-         int *child_iostat = NULL;
+         GFC_INTEGER_4 noiostat;
+         GFC_INTEGER_4 *child_iostat = NULL;
/* Set iostat, intent(out). */
          noiostat = 0;
-         child_iostat = (dtp->common.flags & IOPARM_HAS_IOSTAT) ?
-                         dtp->common.iostat : &noiostat;
+         child_iostat = ((dtp->common.flags & IOPARM_HAS_IOSTAT)
+                         ? dtp->common.iostat : &noiostat);
/* Set iomsg, intent(inout). */
          if (dtp->common.flags & IOPARM_HAS_IOMSG)
@@ -1249,7 +1249,7 @@ unformatted_write (st_parameter_dt *dtp,
          /* Call the user defined unformatted WRITE procedure.  */
          dtp->u.p.current_unit->child_dtio++;
          dtp->u.p.ufdtio_ptr (source, &unit, child_iostat, child_iomsg,
-                             child_iomsg_len);
+                              child_iomsg_len);
          dtp->u.p.current_unit->child_dtio--;
          return;
      }
@@ -1688,13 +1688,13 @@ formatted_transfer_scalar_read (st_param
            return;
          if (require_type (dtp, BT_CLASS, type, f))
            return;
-         int unit = dtp->u.p.current_unit->unit_number;
+         GFC_INTEGER_4 unit = dtp->u.p.current_unit->unit_number;
          char dt[] = "DT";
          char tmp_iomsg[IOMSG_LEN] = "";
          char *child_iomsg;
          gfc_charlen_type child_iomsg_len;
-         int noiostat;
-         int *child_iostat = NULL;
+         GFC_INTEGER_4 noiostat;
+         GFC_INTEGER_4 *child_iostat = NULL;
          char *iotype;
          gfc_charlen_type iotype_len = f->u.udf.string_len;
@@ -1709,8 +1709,8 @@ formatted_transfer_scalar_read (st_param /* Set iostat, intent(out). */
          noiostat = 0;
-         child_iostat = (dtp->common.flags & IOPARM_HAS_IOSTAT) ?
-                         dtp->common.iostat : &noiostat;
+         child_iostat = ((dtp->common.flags & IOPARM_HAS_IOSTAT)
+                         ? dtp->common.iostat : &noiostat);
/* Set iomsg, intent(inout). */
          if (dtp->common.flags & IOPARM_HAS_IOMSG)
@@ -2169,13 +2169,13 @@ formatted_transfer_scalar_write (st_para
        case FMT_DT:
          if (n == 0)
            goto need_data;
-         int unit = dtp->u.p.current_unit->unit_number;
+         GFC_INTEGER_4 unit = dtp->u.p.current_unit->unit_number;
          char dt[] = "DT";
          char tmp_iomsg[IOMSG_LEN] = "";
          char *child_iomsg;
          gfc_charlen_type child_iomsg_len;
-         int noiostat;
-         int *child_iostat = NULL;
+         GFC_INTEGER_4 noiostat;
+         GFC_INTEGER_4 *child_iostat = NULL;
          char *iotype;
          gfc_charlen_type iotype_len = f->u.udf.string_len;
@@ -2190,8 +2190,8 @@ formatted_transfer_scalar_write (st_para /* Set iostat, intent(out). */
          noiostat = 0;
-         child_iostat = (dtp->common.flags & IOPARM_HAS_IOSTAT) ?
-                         dtp->common.iostat : &noiostat;
+         child_iostat = ((dtp->common.flags & IOPARM_HAS_IOSTAT)
+                         ? dtp->common.iostat : &noiostat);
/* Set iomsg, intent(inout). */
          if (dtp->common.flags & IOPARM_HAS_IOMSG)


        Jakub

Reply via email to