]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Bind(c): Fix bugs in CFI_section
authorSandra Loosemore <sandra@codesourcery.com>
Thu, 12 Aug 2021 01:54:24 +0000 (18:54 -0700)
committerSandra Loosemore <sandra@codesourcery.com>
Thu, 19 Aug 2021 17:46:11 +0000 (10:46 -0700)
CFI_section was incorrectly adjusting the base pointer for the result
array twice in different ways.  It was also overwriting the array
dimension info in the result descriptor before computing the base
address offset from the source descriptor, which caused problems if
the two descriptors are the same.  This patch fixes both problems and
makes the code simpler, too.

A consequence of this patch is that the result array is now 0-based in
all dimensions instead of starting at the numbering to match the first
element of the source array.  The Fortran standard only specifies the
shape of the result array, not its lower bounds, so this is permitted
and probably less confusing for users as well as implementors.

2021-07-17  Sandra Loosemore  <sandra@codesourcery.com>

PR libfortran/101310

libgfortran/
* runtime/ISO_Fortran_binding.c (CFI_section): Fix the base
address computation and simplify the code.

gcc/testsuite/
* gfortran.dg/ISO_Fortran_binding_1.c (section_c): Remove
incorrect assertions.

(cherry picked from commit b4a9bc7856ee1d3ff98b04402334a362540af2cf)

gcc/testsuite/ChangeLog.omp
gcc/testsuite/gfortran.dg/ISO_Fortran_binding_1.c
libgfortran/ChangeLog.omp
libgfortran/runtime/ISO_Fortran_binding.c

index 7310ea537024e8dfadea6c713667ab6291464ab5..8188a8e86a641179367c0b4453d3f9a2e718cbc5 100644 (file)
@@ -1,3 +1,13 @@
+2021-08-11  Sandra Loosemore  <sandra@codesourcery.com>
+
+       Backported from master:
+
+       2021-07-17  Sandra Loosemore  <sandra@codesourcery.com>
+
+       PR libfortran/101310
+       * gfortran.dg/ISO_Fortran_binding_1.c (section_c): Remove
+       incorrect assertions.
+
 2021-08-11  Sandra Loosemore  <sandra@codesourcery.com>
 
        Backported from master:
index 9da5d8588061658c60d39df102a549095a7395fd..bb56ca0e04bc22fffbd102548f24346d0efa345f 100644 (file)
@@ -142,11 +142,12 @@ float section_c(int *std_case, CFI_cdesc_t * source, int *low, int *str)
                          CFI_type_float, 0, 1, NULL);
       if (ind) return -1.0;
       ind = CFI_section((CFI_cdesc_t *)&section, source, lower, NULL, strides);
-      assert (section.dim[0].lower_bound == lower[0]);
       if (ind) return -2.0;
 
       /* Sum over the section  */
-      for (idx[0] = lower[0]; idx[0] < section.dim[0].extent + lower[0]; idx[0]++)
+      for (idx[0] = section.dim[0].lower_bound;
+          idx[0] < section.dim[0].extent + section.dim[0].lower_bound;
+          idx[0]++)
         ans += *(float*)CFI_address ((CFI_cdesc_t*)&section, idx);
       return ans;
     }
@@ -164,11 +165,12 @@ float section_c(int *std_case, CFI_cdesc_t * source, int *low, int *str)
       ind = CFI_section((CFI_cdesc_t *)&section, source,
                        lower, upper, strides);
       assert (section.rank == 1);
-      assert (section.dim[0].lower_bound == lower[0]);
       if (ind) return -2.0;
 
       /* Sum over the section  */
-      for (idx[0] = lower[0]; idx[0] < section.dim[0].extent + lower[0]; idx[0]++)
+      for (idx[0] = section.dim[0].lower_bound;
+          idx[0] < section.dim[0].extent + section.dim[0].lower_bound;
+          idx[0]++)
         ans += *(float*)CFI_address ((CFI_cdesc_t*)&section, idx);
       return ans;
     }
index 8abf0e5281714d9706ed754b0941b9ab034a456e..cf5fae694c995d7362afd3f6498d321e4ab7022c 100644 (file)
@@ -1,3 +1,13 @@
+2021-08-11  Sandra Loosemore  <sandra@codesourcery.com>
+
+       Backported from master:
+
+       2021-07-17  Sandra Loosemore  <sandra@codesourcery.com>
+
+       PR libfortran/101310
+       * runtime/ISO_Fortran_binding.c (CFI_section): Fix the base
+       address computation and simplify the code.
+
 2021-08-11  Sandra Loosemore  <sandra@codesourcery.com>
 
        Backported from master:
index b1e51612e2b2cdb26491fe2b71f69402fc7634fb..2830c4575fea52f073b1b7c129bced16fa41ec03 100644 (file)
@@ -689,29 +689,22 @@ int CFI_section (CFI_cdesc_t *result, const CFI_cdesc_t *source,
        }
     }
 
+  /* Set the base address.  We have to compute this first in the case
+     where source == result, before we overwrite the dimension data.  */
+  result->base_addr = CFI_address (source, lower);
+
   /* Set the appropriate dimension information that gives us access to the
    * data. */
-  int aux = 0;
-  for (int i = 0; i < source->rank; i++)
+  for (int i = 0, o = 0; i < source->rank; i++)
     {
       if (stride[i] == 0)
-       {
-         aux++;
-         /* Adjust 'lower' for the base address offset.  */
-         lower[i] = lower[i] - source->dim[i].lower_bound;
-         continue;
-       }
-      int idx = i - aux;
-      result->dim[idx].lower_bound = lower[i];
-      result->dim[idx].extent = 1 + (upper[i] - lower[i])/stride[i];
-      result->dim[idx].sm = stride[i] * source->dim[i].sm;
-      /* Adjust 'lower' for the base address offset.  */
-      lower[idx] = lower[idx] - source->dim[i].lower_bound;
+       continue;
+      result->dim[o].lower_bound = 0;
+      result->dim[o].extent = 1 + (upper[i] - lower[i])/stride[i];
+      result->dim[o].sm = stride[i] * source->dim[i].sm;
+      o++;
     }
 
-  /* Set the base address. */
-  result->base_addr = CFI_address (source, lower);
-
   return CFI_SUCCESS;
 }