Index: gcc/libgfortran/generated/eoshift1_16.c |
diff --git a/gcc/libgfortran/generated/eoshift1_16.c b/gcc/libgfortran/generated/eoshift1_16.c |
index b9fe9c311fc51f2524a95907dda8c0b10de08482..a14bd2927153128e7fb1ef86fd365c74c7f89a41 100644 |
--- a/gcc/libgfortran/generated/eoshift1_16.c |
+++ b/gcc/libgfortran/generated/eoshift1_16.c |
@@ -37,7 +37,7 @@ eoshift1 (gfc_array_char * const restrict ret, |
const gfc_array_i16 * const restrict h, |
const char * const restrict pbound, |
const GFC_INTEGER_16 * const restrict pwhich, |
- index_type size, const char * filler, index_type filler_len) |
+ const char * filler, index_type filler_len) |
{ |
/* r.* indicates the return array. */ |
index_type rstride[GFC_MAX_DIMENSIONS]; |
@@ -61,6 +61,8 @@ eoshift1 (gfc_array_char * const restrict ret, |
index_type dim; |
index_type len; |
index_type n; |
+ index_type size; |
+ index_type arraysize; |
int which; |
GFC_INTEGER_16 sh; |
GFC_INTEGER_16 delta; |
@@ -71,6 +73,8 @@ eoshift1 (gfc_array_char * const restrict ret, |
soffset = 0; |
roffset = 0; |
+ size = GFC_DESCRIPTOR_SIZE(array); |
+ |
if (pwhich) |
which = *pwhich - 1; |
else |
@@ -79,51 +83,71 @@ eoshift1 (gfc_array_char * const restrict ret, |
extent[0] = 1; |
count[0] = 0; |
+ arraysize = size0 ((array_t *) array); |
if (ret->data == NULL) |
{ |
int i; |
- ret->data = internal_malloc_size (size * size0 ((array_t *)array)); |
+ ret->data = internal_malloc_size (size * arraysize); |
ret->offset = 0; |
ret->dtype = array->dtype; |
for (i = 0; i < GFC_DESCRIPTOR_RANK (array); i++) |
{ |
- ret->dim[i].lbound = 0; |
- ret->dim[i].ubound = array->dim[i].ubound - array->dim[i].lbound; |
+ index_type ub, str; |
+ |
+ ub = GFC_DESCRIPTOR_EXTENT(array,i) - 1; |
if (i == 0) |
- ret->dim[i].stride = 1; |
+ str = 1; |
else |
- ret->dim[i].stride = (ret->dim[i-1].ubound + 1) * ret->dim[i-1].stride; |
+ str = GFC_DESCRIPTOR_EXTENT(ret,i-1) |
+ * GFC_DESCRIPTOR_STRIDE(ret,i-1); |
+ |
+ GFC_DIMENSION_SET(ret->dim[i], 0, ub, str); |
+ |
} |
+ if (arraysize > 0) |
+ ret->data = internal_malloc_size (size * arraysize); |
+ else |
+ ret->data = internal_malloc_size (1); |
+ |
} |
- else |
+ else if (unlikely (compile_options.bounds_check)) |
{ |
- if (size0 ((array_t *) ret) == 0) |
- return; |
+ bounds_equal_extents ((array_t *) ret, (array_t *) array, |
+ "return value", "EOSHIFT"); |
} |
+ if (unlikely (compile_options.bounds_check)) |
+ { |
+ bounds_reduced_extents ((array_t *) h, (array_t *) array, which, |
+ "SHIFT argument", "EOSHIFT"); |
+ } |
+ |
+ if (arraysize == 0) |
+ return; |
+ |
n = 0; |
for (dim = 0; dim < GFC_DESCRIPTOR_RANK (array); dim++) |
{ |
if (dim == which) |
{ |
- roffset = ret->dim[dim].stride * size; |
+ roffset = GFC_DESCRIPTOR_STRIDE_BYTES(ret,dim); |
if (roffset == 0) |
roffset = size; |
- soffset = array->dim[dim].stride * size; |
+ soffset = GFC_DESCRIPTOR_STRIDE_BYTES(array,dim); |
if (soffset == 0) |
soffset = size; |
- len = array->dim[dim].ubound + 1 - array->dim[dim].lbound; |
+ len = GFC_DESCRIPTOR_EXTENT(array,dim); |
} |
else |
{ |
count[n] = 0; |
- extent[n] = array->dim[dim].ubound + 1 - array->dim[dim].lbound; |
- rstride[n] = ret->dim[dim].stride * size; |
- sstride[n] = array->dim[dim].stride * size; |
+ extent[n] = GFC_DESCRIPTOR_EXTENT(array,dim); |
+ rstride[n] = GFC_DESCRIPTOR_STRIDE_BYTES(ret,dim); |
+ sstride[n] = GFC_DESCRIPTOR_STRIDE_BYTES(array,dim); |
- hstride[n] = h->dim[n].stride; |
+ hstride[n] = GFC_DESCRIPTOR_STRIDE(h,n); |
n++; |
} |
} |
@@ -241,8 +265,7 @@ eoshift1_16 (gfc_array_char * const restrict ret, |
const char * const restrict pbound, |
const GFC_INTEGER_16 * const restrict pwhich) |
{ |
- eoshift1 (ret, array, h, pbound, pwhich, GFC_DESCRIPTOR_SIZE (array), |
- "\0", 1); |
+ eoshift1 (ret, array, h, pbound, pwhich, "\0", 1); |
} |
@@ -262,10 +285,10 @@ eoshift1_16_char (gfc_array_char * const restrict ret, |
const gfc_array_i16 * const restrict h, |
const char * const restrict pbound, |
const GFC_INTEGER_16 * const restrict pwhich, |
- GFC_INTEGER_4 array_length, |
+ GFC_INTEGER_4 array_length __attribute__((unused)), |
GFC_INTEGER_4 bound_length __attribute__((unused))) |
{ |
- eoshift1 (ret, array, h, pbound, pwhich, array_length, " ", 1); |
+ eoshift1 (ret, array, h, pbound, pwhich, " ", 1); |
} |
@@ -285,11 +308,11 @@ eoshift1_16_char4 (gfc_array_char * const restrict ret, |
const gfc_array_i16 * const restrict h, |
const char * const restrict pbound, |
const GFC_INTEGER_16 * const restrict pwhich, |
- GFC_INTEGER_4 array_length, |
+ GFC_INTEGER_4 array_length __attribute__((unused)), |
GFC_INTEGER_4 bound_length __attribute__((unused))) |
{ |
static const gfc_char4_t space = (unsigned char) ' '; |
- eoshift1 (ret, array, h, pbound, pwhich, array_length * sizeof (gfc_char4_t), |
+ eoshift1 (ret, array, h, pbound, pwhich, |
(const char *) &space, sizeof (gfc_char4_t)); |
} |