annotate libgfortran/runtime/ISO_Fortran_binding.c @ 155:da32f4b04d38

fix __code name conflict
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 17:51:46 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 /* Functions to convert descriptors between CFI and gfortran
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 and the CFI function declarations whose prototypes appear
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 in ISO_Fortran_binding.h.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 Copyright (C) 2018-2020 Free Software Foundation, Inc.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 Contributed by Daniel Celis Garza <celisdanieljr@gmail.com>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 and Paul Thomas <pault@gcc.gnu.org>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 This file is part of the GNU Fortran runtime library (libgfortran).
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 Libgfortran is free software; you can redistribute it and/or
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 modify it under the terms of the GNU General Public
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 License as published by the Free Software Foundation; either
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 version 3 of the License, or (at your option) any later version.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 Libgfortran is distributed in the hope that it will be useful,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 GNU General Public License for more details.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 Under Section 7 of GPL version 3, you are granted additional
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21 permissions described in the GCC Runtime Library Exception, version
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 3.1, as published by the Free Software Foundation.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 You should have received a copy of the GNU General Public License and
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 a copy of the GCC Runtime Library Exception along with this program;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 <http://www.gnu.org/licenses/>. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 #include "libgfortran.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30 #include <ISO_Fortran_binding.h>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 #include <string.h>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 extern void cfi_desc_to_gfc_desc (gfc_array_void *, CFI_cdesc_t **);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 export_proto(cfi_desc_to_gfc_desc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 cfi_desc_to_gfc_desc (gfc_array_void *d, CFI_cdesc_t **s_ptr)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 int n;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 index_type kind;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 CFI_cdesc_t *s = *s_ptr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 if (!s)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 return;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 GFC_DESCRIPTOR_DATA (d) = s->base_addr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 GFC_DESCRIPTOR_TYPE (d) = (signed char)(s->type & CFI_type_mask);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48 kind = (index_type)((s->type - (s->type & CFI_type_mask)) >> CFI_type_kind_shift);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 /* Correct the unfortunate difference in order with types. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 if (GFC_DESCRIPTOR_TYPE (d) == BT_CHARACTER)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 GFC_DESCRIPTOR_TYPE (d) = BT_DERIVED;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 else if (GFC_DESCRIPTOR_TYPE (d) == BT_DERIVED)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 GFC_DESCRIPTOR_TYPE (d) = BT_CHARACTER;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 if (!s->rank || s->dim[0].sm == (CFI_index_t)s->elem_len)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 GFC_DESCRIPTOR_SIZE (d) = s->elem_len;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 else if (GFC_DESCRIPTOR_TYPE (d) != BT_DERIVED)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 GFC_DESCRIPTOR_SIZE (d) = kind;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61 GFC_DESCRIPTOR_SIZE (d) = s->elem_len;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 d->dtype.version = s->version;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64 GFC_DESCRIPTOR_RANK (d) = (signed char)s->rank;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 d->dtype.attribute = (signed short)s->attribute;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 if (s->rank)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70 if ((size_t)s->dim[0].sm % s->elem_len)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71 d->span = (index_type)s->dim[0].sm;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73 d->span = (index_type)s->elem_len;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 d->offset = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77 for (n = 0; n < GFC_DESCRIPTOR_RANK (d); n++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79 GFC_DESCRIPTOR_LBOUND(d, n) = (index_type)s->dim[n].lower_bound;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80 GFC_DESCRIPTOR_UBOUND(d, n) = (index_type)(s->dim[n].extent
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 + s->dim[n].lower_bound - 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82 GFC_DESCRIPTOR_STRIDE(d, n) = (index_type)(s->dim[n].sm / s->elem_len);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83 d->offset -= GFC_DESCRIPTOR_STRIDE(d, n) * GFC_DESCRIPTOR_LBOUND(d, n);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87 extern void gfc_desc_to_cfi_desc (CFI_cdesc_t **, const gfc_array_void *);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88 export_proto(gfc_desc_to_cfi_desc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90 void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
91 gfc_desc_to_cfi_desc (CFI_cdesc_t **d_ptr, const gfc_array_void *s)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
92 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
93 int n;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
94 CFI_cdesc_t *d;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
95
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
96 /* Play it safe with allocation of the flexible array member 'dim'
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
97 by setting the length to CFI_MAX_RANK. This should not be necessary
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
98 but valgrind complains accesses after the allocated block. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
99 if (*d_ptr == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
100 d = malloc (sizeof (CFI_cdesc_t)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
101 + (CFI_type_t)(CFI_MAX_RANK * sizeof (CFI_dim_t)));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
102 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
103 d = *d_ptr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
104
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
105 d->base_addr = GFC_DESCRIPTOR_DATA (s);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
106 d->elem_len = GFC_DESCRIPTOR_SIZE (s);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
107 d->version = s->dtype.version;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
108 d->rank = (CFI_rank_t)GFC_DESCRIPTOR_RANK (s);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
109 d->attribute = (CFI_attribute_t)s->dtype.attribute;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
110
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
111 if (GFC_DESCRIPTOR_TYPE (s) == BT_CHARACTER)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
112 d->type = CFI_type_Character;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
113 else if (GFC_DESCRIPTOR_TYPE (s) == BT_DERIVED)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
114 d->type = CFI_type_struct;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
115 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
116 d->type = (CFI_type_t)GFC_DESCRIPTOR_TYPE (s);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
117
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
118 if (GFC_DESCRIPTOR_TYPE (s) != BT_DERIVED)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
119 d->type = (CFI_type_t)(d->type
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
120 + ((CFI_type_t)d->elem_len << CFI_type_kind_shift));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
121
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
122 if (d->base_addr)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
123 /* Full pointer or allocatable arrays retain their lower_bounds. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
124 for (n = 0; n < GFC_DESCRIPTOR_RANK (s); n++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
125 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
126 if (d->attribute != CFI_attribute_other)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
127 d->dim[n].lower_bound = (CFI_index_t)GFC_DESCRIPTOR_LBOUND(s, n);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
128 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
129 d->dim[n].lower_bound = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
130
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
131 /* Assumed size arrays have gfc ubound == 0 and CFI extent = -1. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
132 if (n == GFC_DESCRIPTOR_RANK (s) - 1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
133 && GFC_DESCRIPTOR_LBOUND(s, n) == 1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
134 && GFC_DESCRIPTOR_UBOUND(s, n) == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
135 d->dim[n].extent = -1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
136 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
137 d->dim[n].extent = (CFI_index_t)GFC_DESCRIPTOR_UBOUND(s, n)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
138 - (CFI_index_t)GFC_DESCRIPTOR_LBOUND(s, n) + 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
139 d->dim[n].sm = (CFI_index_t)(GFC_DESCRIPTOR_STRIDE(s, n) * s->span);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
140 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
141
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
142 if (*d_ptr == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
143 *d_ptr = d;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
144 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
146 void *CFI_address (const CFI_cdesc_t *dv, const CFI_index_t subscripts[])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
147 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
148 int i;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
149 char *base_addr = (char *)dv->base_addr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
150
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
151 if (unlikely (compile_options.bounds_check))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
152 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
153 /* C Descriptor must not be NULL. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
154 if (dv == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
155 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
156 fprintf (stderr, "CFI_address: C Descriptor is NULL.\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
157 return NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
158 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
159
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
160 /* Base address of C Descriptor must not be NULL. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
161 if (dv->base_addr == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
162 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
163 fprintf (stderr, "CFI_address: base address of C Descriptor "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
164 "must not be NULL.\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
165 return NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
166 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
167 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
168
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
169 /* Return base address if C descriptor is a scalar. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
170 if (dv->rank == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
171 return dv->base_addr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
172
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
173 /* Calculate the appropriate base address if dv is not a scalar. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
174 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
175 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
176 /* Base address is the C address of the element of the object
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
177 specified by subscripts. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
178 for (i = 0; i < dv->rank; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
179 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
180 CFI_index_t idx = subscripts[i] - dv->dim[i].lower_bound;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
181 if (unlikely (compile_options.bounds_check)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
182 && ((dv->dim[i].extent != -1 && idx >= dv->dim[i].extent)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
183 || idx < 0))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
184 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
185 fprintf (stderr, "CFI_address: subscripts[%d] is out of "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
186 "bounds. For dimension = %d, subscripts = %d, "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
187 "lower_bound = %d, upper bound = %d, extend = %d\n",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
188 i, i, (int)subscripts[i], (int)dv->dim[i].lower_bound,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
189 (int)(dv->dim[i].extent - dv->dim[i].lower_bound),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
190 (int)dv->dim[i].extent);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
191 return NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
192 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
193
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
194 base_addr = base_addr + (CFI_index_t)(idx * dv->dim[i].sm);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
195 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
196 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
197
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
198 return (void *)base_addr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
199 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
200
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
201
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
202 int
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
203 CFI_allocate (CFI_cdesc_t *dv, const CFI_index_t lower_bounds[],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
204 const CFI_index_t upper_bounds[], size_t elem_len)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
205 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
206 if (unlikely (compile_options.bounds_check))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
207 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
208 /* C Descriptor must not be NULL. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
209 if (dv == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
210 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
211 fprintf (stderr, "CFI_allocate: C Descriptor is NULL.\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
212 return CFI_INVALID_DESCRIPTOR;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
213 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
214
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
215 /* The C Descriptor must be for an allocatable or pointer object. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
216 if (dv->attribute == CFI_attribute_other)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
217 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
218 fprintf (stderr, "CFI_allocate: The object of the C descriptor "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
219 "must be a pointer or allocatable variable.\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
220 return CFI_INVALID_ATTRIBUTE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
221 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
222
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
223 /* Base address of C Descriptor must be NULL. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
224 if (dv->base_addr != NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
225 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
226 fprintf (stderr, "CFI_allocate: Base address of C descriptor "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
227 "must be NULL.\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
228 return CFI_ERROR_BASE_ADDR_NOT_NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
229 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
230 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
231
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
232 /* If the type is a character, the descriptor's element length is replaced
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
233 by the elem_len argument. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
234 if (dv->type == CFI_type_char || dv->type == CFI_type_ucs4_char ||
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
235 dv->type == CFI_type_signed_char)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
236 dv->elem_len = elem_len;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
237
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
238 /* Dimension information and calculating the array length. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
239 size_t arr_len = 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
240
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
241 /* If rank is greater than 0, lower_bounds and upper_bounds are used. They're
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
242 ignored otherwise. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
243 if (dv->rank > 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
244 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
245 if (unlikely (compile_options.bounds_check)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
246 && (lower_bounds == NULL || upper_bounds == NULL))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
247 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
248 fprintf (stderr, "CFI_allocate: If 0 < rank (= %d) upper_bounds[] "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
249 "and lower_bounds[], must not be NULL.\n", dv->rank);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
250 return CFI_INVALID_EXTENT;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
251 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
252
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
253 for (int i = 0; i < dv->rank; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
254 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
255 dv->dim[i].lower_bound = lower_bounds[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
256 dv->dim[i].extent = upper_bounds[i] - dv->dim[i].lower_bound + 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
257 if (i == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
258 dv->dim[i].sm = dv->elem_len;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
259 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
260 dv->dim[i].sm = dv->elem_len * dv->dim[i - 1].extent;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
261 arr_len *= dv->dim[i].extent;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
262 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
263 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
264
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
265 dv->base_addr = calloc (arr_len, dv->elem_len);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
266 if (dv->base_addr == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
267 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
268 fprintf (stderr, "CFI_allocate: Failure in memory allocation.\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
269 return CFI_ERROR_MEM_ALLOCATION;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
270 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
271
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
272 return CFI_SUCCESS;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
273 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
274
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
275
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
276 int
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
277 CFI_deallocate (CFI_cdesc_t *dv)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
278 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
279 if (unlikely (compile_options.bounds_check))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
280 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
281 /* C Descriptor must not be NULL */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
282 if (dv == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
283 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
284 fprintf (stderr, "CFI_deallocate: C Descriptor is NULL.\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
285 return CFI_INVALID_DESCRIPTOR;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
286 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
287
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
288 /* Base address must not be NULL. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
289 if (dv->base_addr == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
290 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
291 fprintf (stderr, "CFI_deallocate: Base address is already NULL.\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
292 return CFI_ERROR_BASE_ADDR_NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
293 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
294
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
295 /* C Descriptor must be for an allocatable or pointer variable. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
296 if (dv->attribute == CFI_attribute_other)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
297 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
298 fprintf (stderr, "CFI_deallocate: C Descriptor must describe a "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
299 "pointer or allocatable object.\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
300 return CFI_INVALID_ATTRIBUTE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
301 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
302 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
303
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
304 /* Free and nullify memory. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
305 free (dv->base_addr);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
306 dv->base_addr = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
307
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
308 return CFI_SUCCESS;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
309 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
310
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
311
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
312 int CFI_establish (CFI_cdesc_t *dv, void *base_addr, CFI_attribute_t attribute,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
313 CFI_type_t type, size_t elem_len, CFI_rank_t rank,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
314 const CFI_index_t extents[])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
315 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
316 if (unlikely (compile_options.bounds_check))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
317 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
318 /* C descriptor must not be NULL. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
319 if (dv == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
320 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
321 fprintf (stderr, "CFI_establish: C descriptor is NULL.\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
322 return CFI_INVALID_DESCRIPTOR;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
323 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
324
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
325 /* Rank must be between 0 and CFI_MAX_RANK. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
326 if (rank < 0 || rank > CFI_MAX_RANK)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
327 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
328 fprintf (stderr, "CFI_establish: Rank must be between 0 and %d, "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
329 "0 < rank (0 !< %d).\n", CFI_MAX_RANK, (int)rank);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
330 return CFI_INVALID_RANK;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
331 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
332
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
333 /* If base address is not NULL, the established C Descriptor is for a
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
334 nonallocatable entity. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
335 if (attribute == CFI_attribute_allocatable && base_addr != NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
336 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
337 fprintf (stderr, "CFI_establish: If base address is not NULL "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
338 "(base_addr != NULL), the established C descriptor is "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
339 "for a nonallocatable entity (attribute != %d).\n",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
340 CFI_attribute_allocatable);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
341 return CFI_INVALID_ATTRIBUTE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
342 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
343 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
344
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
345 dv->base_addr = base_addr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
346
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
347 if (type == CFI_type_char || type == CFI_type_ucs4_char ||
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
348 type == CFI_type_signed_char || type == CFI_type_struct ||
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
349 type == CFI_type_other)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
350 dv->elem_len = elem_len;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
351 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
352 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
353 /* base_type describes the intrinsic type with kind parameter. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
354 size_t base_type = type & CFI_type_mask;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
355 /* base_type_size is the size in bytes of the variable as given by its
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
356 * kind parameter. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
357 size_t base_type_size = (type - base_type) >> CFI_type_kind_shift;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
358 /* Kind types 10 have a size of 64 bytes. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
359 if (base_type_size == 10)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
360 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
361 base_type_size = 64;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
362 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
363 /* Complex numbers are twice the size of their real counterparts. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
364 if (base_type == CFI_type_Complex)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
365 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
366 base_type_size *= 2;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
367 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
368 dv->elem_len = base_type_size;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
369 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
370
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
371 dv->version = CFI_VERSION;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
372 dv->rank = rank;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
373 dv->attribute = attribute;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
374 dv->type = type;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
375
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
376 /* Extents must not be NULL if rank is greater than zero and base_addr is not
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
377 NULL */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
378 if (rank > 0 && base_addr != NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
379 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
380 if (unlikely (compile_options.bounds_check) && extents == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
381 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
382 fprintf (stderr, "CFI_establish: Extents must not be NULL "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
383 "(extents != NULL) if rank (= %d) > 0 and base address "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
384 "is not NULL (base_addr != NULL).\n", (int)rank);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
385 return CFI_INVALID_EXTENT;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
386 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
387
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
388 for (int i = 0; i < rank; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
389 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
390 dv->dim[i].lower_bound = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
391 dv->dim[i].extent = extents[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
392 if (i == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
393 dv->dim[i].sm = dv->elem_len;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
394 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
395 dv->dim[i].sm = (CFI_index_t)(dv->elem_len * extents[i - 1]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
396 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
397 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
398
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
399 return CFI_SUCCESS;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
400 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
401
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
402
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
403 int CFI_is_contiguous (const CFI_cdesc_t *dv)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
404 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
405 if (unlikely (compile_options.bounds_check))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
406 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
407 /* C descriptor must not be NULL. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
408 if (dv == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
409 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
410 fprintf (stderr, "CFI_is_contiguous: C descriptor is NULL.\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
411 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
412 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
413
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
414 /* Base address must not be NULL. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
415 if (dv->base_addr == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
416 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
417 fprintf (stderr, "CFI_is_contiguous: Base address of C Descriptor "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
418 "is already NULL.\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
419 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
420 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
421
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
422 /* Must be an array. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
423 if (dv->rank == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
424 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
425 fprintf (stderr, "CFI_is_contiguous: C Descriptor must describe an "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
426 "array (0 < dv->rank = %d).\n", dv->rank);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
427 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
428 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
429 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
430
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
431 /* Assumed size arrays are always contiguous. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
432 if (dv->rank > 0 && dv->dim[dv->rank - 1].extent == -1)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
433 return 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
434
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
435 /* If an array is not contiguous the memory stride is different to the element
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
436 * length. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
437 for (int i = 0; i < dv->rank; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
438 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
439 if (i == 0 && dv->dim[i].sm == (CFI_index_t)dv->elem_len)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
440 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
441 else if (i > 0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
442 && dv->dim[i].sm == (CFI_index_t)(dv->dim[i - 1].sm
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
443 * dv->dim[i - 1].extent))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
444 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
445
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
446 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
447 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
448
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
449 /* Array sections are guaranteed to be contiguous by the previous test. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
450 return 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
451 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
452
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
453
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
454 int CFI_section (CFI_cdesc_t *result, const CFI_cdesc_t *source,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
455 const CFI_index_t lower_bounds[],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
456 const CFI_index_t upper_bounds[], const CFI_index_t strides[])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
457 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
458 /* Dimension information. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
459 CFI_index_t lower[CFI_MAX_RANK];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
460 CFI_index_t upper[CFI_MAX_RANK];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
461 CFI_index_t stride[CFI_MAX_RANK];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
462 int zero_count = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
463 bool assumed_size;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
464
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
465 if (unlikely (compile_options.bounds_check))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
466 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
467 /* C Descriptors must not be NULL. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
468 if (source == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
469 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
470 fprintf (stderr, "CFI_section: Source must not be NULL.\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
471 return CFI_INVALID_DESCRIPTOR;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
472 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
473
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
474 if (result == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
475 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
476 fprintf (stderr, "CFI_section: Result must not be NULL.\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
477 return CFI_INVALID_DESCRIPTOR;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
478 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
479
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
480 /* Base address of source must not be NULL. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
481 if (source->base_addr == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
482 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
483 fprintf (stderr, "CFI_section: Base address of source must "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
484 "not be NULL.\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
485 return CFI_ERROR_BASE_ADDR_NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
486 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
487
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
488 /* Result must not be an allocatable array. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
489 if (result->attribute == CFI_attribute_allocatable)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
490 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
491 fprintf (stderr, "CFI_section: Result must not describe an "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
492 "allocatable array.\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
493 return CFI_INVALID_ATTRIBUTE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
494 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
495
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
496 /* Source must be some form of array (nonallocatable nonpointer array,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
497 allocated allocatable array or an associated pointer array). */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
498 if (source->rank <= 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
499 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
500 fprintf (stderr, "CFI_section: Source must describe an array "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
501 "(0 < source->rank, 0 !< %d).\n", source->rank);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
502 return CFI_INVALID_RANK;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
503 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
504
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
505 /* Element lengths of source and result must be equal. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
506 if (result->elem_len != source->elem_len)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
507 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
508 fprintf (stderr, "CFI_section: The element lengths of "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
509 "source (source->elem_len = %d) and result "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
510 "(result->elem_len = %d) must be equal.\n",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
511 (int)source->elem_len, (int)result->elem_len);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
512 return CFI_INVALID_ELEM_LEN;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
513 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
514
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
515 /* Types must be equal. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
516 if (result->type != source->type)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
517 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
518 fprintf (stderr, "CFI_section: Types of source "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
519 "(source->type = %d) and result (result->type = %d) "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
520 "must be equal.\n", source->type, result->type);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
521 return CFI_INVALID_TYPE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
522 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
523 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
524
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
525 /* Stride of zero in the i'th dimension means rank reduction in that
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
526 dimension. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
527 for (int i = 0; i < source->rank; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
528 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
529 if (strides[i] == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
530 zero_count++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
531 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
532
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
533 /* Rank of result must be equal the the rank of source minus the number of
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
534 * zeros in strides. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
535 if (unlikely (compile_options.bounds_check)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
536 && result->rank != source->rank - zero_count)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
537 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
538 fprintf (stderr, "CFI_section: Rank of result must be equal to the "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
539 "rank of source minus the number of zeros in strides "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
540 "(result->rank = source->rank - zero_count, %d != %d "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
541 "- %d).\n", result->rank, source->rank, zero_count);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
542 return CFI_INVALID_RANK;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
543 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
544
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
545 /* Lower bounds. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
546 if (lower_bounds == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
547 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
548 for (int i = 0; i < source->rank; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
549 lower[i] = source->dim[i].lower_bound;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
550 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
551 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
552 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
553 for (int i = 0; i < source->rank; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
554 lower[i] = lower_bounds[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
555 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
556
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
557 /* Upper bounds. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
558 if (upper_bounds == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
559 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
560 if (unlikely (compile_options.bounds_check)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
561 && source->dim[source->rank - 1].extent == -1)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
562 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
563 fprintf (stderr, "CFI_section: Source must not be an assumed size "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
564 "array if upper_bounds is NULL.\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
565 return CFI_INVALID_EXTENT;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
566 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
567
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
568 for (int i = 0; i < source->rank; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
569 upper[i] = source->dim[i].lower_bound + source->dim[i].extent - 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
570 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
571 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
572 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
573 for (int i = 0; i < source->rank; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
574 upper[i] = upper_bounds[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
575 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
576
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
577 /* Stride */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
578 if (strides == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
579 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
580 for (int i = 0; i < source->rank; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
581 stride[i] = 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
582 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
583 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
584 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
585 for (int i = 0; i < source->rank; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
586 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
587 stride[i] = strides[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
588 /* If stride[i] == 0 then lower[i] and upper[i] must be equal. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
589 if (unlikely (compile_options.bounds_check)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
590 && stride[i] == 0 && lower[i] != upper[i])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
591 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
592 fprintf (stderr, "CFI_section: If strides[%d] = 0, then the "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
593 "lower bounds, lower_bounds[%d] = %d, and "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
594 "upper_bounds[%d] = %d, must be equal.\n",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
595 i, i, (int)lower_bounds[i], i, (int)upper_bounds[i]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
596 return CFI_ERROR_OUT_OF_BOUNDS;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
597 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
598 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
599 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
600
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
601 /* Check that section upper and lower bounds are within the array bounds. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
602 for (int i = 0; i < source->rank; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
603 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
604 assumed_size = (i == source->rank - 1)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
605 && (source->dim[i].extent == -1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
606 if (unlikely (compile_options.bounds_check)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
607 && lower_bounds != NULL
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
608 && (lower[i] < source->dim[i].lower_bound ||
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
609 (!assumed_size && lower[i] > source->dim[i].lower_bound
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
610 + source->dim[i].extent - 1)))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
611 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
612 fprintf (stderr, "CFI_section: Lower bounds must be within the "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
613 "bounds of the fortran array (source->dim[%d].lower_bound "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
614 "<= lower_bounds[%d] <= source->dim[%d].lower_bound "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
615 "+ source->dim[%d].extent - 1, %d <= %d <= %d).\n",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
616 i, i, i, i, (int)source->dim[i].lower_bound, (int)lower[i],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
617 (int)(source->dim[i].lower_bound
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
618 + source->dim[i].extent - 1));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
619 return CFI_ERROR_OUT_OF_BOUNDS;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
620 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
621
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
622 if (unlikely (compile_options.bounds_check)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
623 && upper_bounds != NULL
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
624 && (upper[i] < source->dim[i].lower_bound
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
625 || (!assumed_size
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
626 && upper[i] > source->dim[i].lower_bound
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
627 + source->dim[i].extent - 1)))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
628 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
629 fprintf (stderr, "CFI_section: Upper bounds must be within the "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
630 "bounds of the fortran array (source->dim[%d].lower_bound "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
631 "<= upper_bounds[%d] <= source->dim[%d].lower_bound + "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
632 "source->dim[%d].extent - 1, %d !<= %d !<= %d).\n",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
633 i, i, i, i, (int)source->dim[i].lower_bound, (int)upper[i],
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
634 (int)(source->dim[i].lower_bound
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
635 + source->dim[i].extent - 1));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
636 return CFI_ERROR_OUT_OF_BOUNDS;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
637 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
638
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
639 if (unlikely (compile_options.bounds_check)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
640 && upper[i] < lower[i] && stride[i] >= 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
641 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
642 fprintf (stderr, "CFI_section: If the upper bound is smaller than "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
643 "the lower bound for a given dimension (upper[%d] < "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
644 "lower[%d], %d < %d), then he stride for said dimension"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
645 "t must be negative (stride[%d] < 0, %d < 0).\n",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
646 i, i, (int)upper[i], (int)lower[i], i, (int)stride[i]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
647 return CFI_INVALID_STRIDE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
648 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
649 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
650
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
651 /* Set the appropriate dimension information that gives us access to the
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
652 * data. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
653 int aux = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
654 for (int i = 0; i < source->rank; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
655 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
656 if (stride[i] == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
657 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
658 aux++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
659 /* Adjust 'lower' for the base address offset. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
660 lower[i] = lower[i] - source->dim[i].lower_bound;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
661 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
662 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
663 int idx = i - aux;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
664 result->dim[idx].lower_bound = lower[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
665 result->dim[idx].extent = 1 + (upper[i] - lower[i])/stride[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
666 result->dim[idx].sm = stride[i] * source->dim[i].sm;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
667 /* Adjust 'lower' for the base address offset. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
668 lower[idx] = lower[idx] - source->dim[i].lower_bound;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
669 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
670
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
671 /* Set the base address. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
672 result->base_addr = CFI_address (source, lower);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
673
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
674 return CFI_SUCCESS;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
675 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
676
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
677
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
678 int CFI_select_part (CFI_cdesc_t *result, const CFI_cdesc_t *source,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
679 size_t displacement, size_t elem_len)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
680 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
681 if (unlikely (compile_options.bounds_check))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
682 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
683 /* C Descriptors must not be NULL. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
684 if (source == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
685 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
686 fprintf (stderr, "CFI_select_part: Source must not be NULL.\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
687 return CFI_INVALID_DESCRIPTOR;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
688 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
689
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
690 if (result == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
691 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
692 fprintf (stderr, "CFI_select_part: Result must not be NULL.\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
693 return CFI_INVALID_DESCRIPTOR;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
694 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
695
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
696 /* Attribute of result will be CFI_attribute_other or
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
697 CFI_attribute_pointer. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
698 if (result->attribute == CFI_attribute_allocatable)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
699 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
700 fprintf (stderr, "CFI_select_part: Result must not describe an "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
701 "allocatable object (result->attribute != %d).\n",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
702 CFI_attribute_allocatable);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
703 return CFI_INVALID_ATTRIBUTE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
704 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
705
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
706 /* Base address of source must not be NULL. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
707 if (source->base_addr == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
708 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
709 fprintf (stderr, "CFI_select_part: Base address of source must "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
710 "not be NULL.\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
711 return CFI_ERROR_BASE_ADDR_NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
712 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
713
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
714 /* Source and result must have the same rank. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
715 if (source->rank != result->rank)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
716 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
717 fprintf (stderr, "CFI_select_part: Source and result must have "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
718 "the same rank (source->rank = %d, result->rank = %d).\n",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
719 (int)source->rank, (int)result->rank);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
720 return CFI_INVALID_RANK;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
721 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
722
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
723 /* Nonallocatable nonpointer must not be an assumed size array. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
724 if (source->rank > 0 && source->dim[source->rank - 1].extent == -1)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
725 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
726 fprintf (stderr, "CFI_select_part: Source must not describe an "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
727 "assumed size array (source->dim[%d].extent != -1).\n",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
728 source->rank - 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
729 return CFI_INVALID_DESCRIPTOR;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
730 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
731 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
732
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
733 /* Element length. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
734 if (result->type == CFI_type_char || result->type == CFI_type_ucs4_char ||
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
735 result->type == CFI_type_signed_char)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
736 result->elem_len = elem_len;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
737
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
738 if (unlikely (compile_options.bounds_check))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
739 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
740 /* Ensure displacement is within the bounds of the element length
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
741 of source.*/
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
742 if (displacement > source->elem_len - 1)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
743 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
744 fprintf (stderr, "CFI_select_part: Displacement must be within the "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
745 "bounds of source (0 <= displacement <= source->elem_len "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
746 "- 1, 0 <= %d <= %d).\n", (int)displacement,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
747 (int)(source->elem_len - 1));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
748 return CFI_ERROR_OUT_OF_BOUNDS;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
749 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
750
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
751 /* Ensure displacement and element length of result are less than or
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
752 equal to the element length of source. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
753 if (displacement + result->elem_len > source->elem_len)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
754 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
755 fprintf (stderr, "CFI_select_part: Displacement plus the element "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
756 "length of result must be less than or equal to the "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
757 "element length of source (displacement + result->elem_len "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
758 "<= source->elem_len, %d + %d = %d <= %d).\n",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
759 (int)displacement, (int)result->elem_len,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
760 (int)(displacement + result->elem_len),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
761 (int)source->elem_len);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
762 return CFI_ERROR_OUT_OF_BOUNDS;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
763 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
764 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
765
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
766 if (result->rank > 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
767 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
768 for (int i = 0; i < result->rank; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
769 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
770 result->dim[i].lower_bound = source->dim[i].lower_bound;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
771 result->dim[i].extent = source->dim[i].extent;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
772 result->dim[i].sm = source->dim[i].sm;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
773 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
774 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
775
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
776 result->base_addr = (char *) source->base_addr + displacement;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
777 return CFI_SUCCESS;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
778 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
779
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
780
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
781 int CFI_setpointer (CFI_cdesc_t *result, CFI_cdesc_t *source,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
782 const CFI_index_t lower_bounds[])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
783 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
784 /* Result must not be NULL and must be a Fortran pointer. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
785 if (unlikely (compile_options.bounds_check))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
786 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
787 if (result == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
788 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
789 fprintf (stderr, "CFI_setpointer: Result is NULL.\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
790 return CFI_INVALID_DESCRIPTOR;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
791 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
792
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
793 if (result->attribute != CFI_attribute_pointer)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
794 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
795 fprintf (stderr, "CFI_setpointer: Result shall be the address of a "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
796 "C descriptor for a Fortran pointer.\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
797 return CFI_INVALID_ATTRIBUTE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
798 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
799 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
800
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
801 /* If source is NULL, the result is a C Descriptor that describes a
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
802 * disassociated pointer. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
803 if (source == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
804 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
805 result->base_addr = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
806 result->version = CFI_VERSION;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
807 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
808 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
809 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
810 /* Check that element lengths, ranks and types of source and result are
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
811 * the same. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
812 if (unlikely (compile_options.bounds_check))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
813 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
814 if (result->elem_len != source->elem_len)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
815 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
816 fprintf (stderr, "CFI_setpointer: Element lengths of result "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
817 "(result->elem_len = %d) and source (source->elem_len "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
818 "= %d) must be the same.\n", (int)result->elem_len,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
819 (int)source->elem_len);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
820 return CFI_INVALID_ELEM_LEN;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
821 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
822
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
823 if (result->rank != source->rank)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
824 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
825 fprintf (stderr, "CFI_setpointer: Ranks of result (result->rank "
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
826 "= %d) and source (source->rank = %d) must be the same."
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
827 "\n", result->rank, source->rank);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
828 return CFI_INVALID_RANK;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
829 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
830
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
831 if (result->type != source->type)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
832 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
833 fprintf (stderr, "CFI_setpointer: Types of result (result->type"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
834 "= %d) and source (source->type = %d) must be the same."
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
835 "\n", result->type, source->type);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
836 return CFI_INVALID_TYPE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
837 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
838 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
839
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
840 /* If the source is a disassociated pointer, the result must also describe
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
841 * a disassociated pointer. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
842 if (source->base_addr == NULL &&
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
843 source->attribute == CFI_attribute_pointer)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
844 result->base_addr = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
845 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
846 result->base_addr = source->base_addr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
847
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
848 /* Assign components to result. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
849 result->version = source->version;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
850
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
851 /* Dimension information. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
852 for (int i = 0; i < source->rank; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
853 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
854 if (lower_bounds != NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
855 result->dim[i].lower_bound = lower_bounds[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
856 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
857 result->dim[i].lower_bound = source->dim[i].lower_bound;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
858
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
859 result->dim[i].extent = source->dim[i].extent;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
860 result->dim[i].sm = source->dim[i].sm;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
861 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
862 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
863
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
864 return CFI_SUCCESS;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
865 }