On 16/02/2026 18:49, Tobias Burnus wrote:
Paul-Antoine Arras wrote:
Please find attached a slightly amended version of the patch with
OMP_CLAUSE_MAP_SIZE_NEEDS_ADJUSTMENT defined as a flag rather than a
special value.
I misread one part of the patch – but it turned out be helpful,
nonetheless, because the testcase I created fails (see attachment).
With current mainline (w/o offloading configured), the testcase passes
(compiles and runs with host fallback).
However, with the 1/2 patch applied, it segfaults:
libgomp/testsuite/libgomp.fortran/map-subarray-13.f90:41:38:
41 | !$omp map(to: chunk%left_rcv_buffer)
| ^
internal compiler error: Segmentation fault
0x26213cd internal_error(char const*, ...)
../../../repos/gcc/gcc/diagnostic-global-context.cc:787
0x123d12f crash_signal
../../../repos/gcc/gcc/toplev.cc:325
0xec3ebe omp_build_struct_sibling_lists
../../../repos/gcc/gcc/gimplify.cc:13421
0xed14b7 gimplify_adjust_omp_clauses
../../../repos/gcc/gcc/gimplify.cc:15660
0xef11be gimplify_omp_target_update
../../../repos/gcc/gcc/gimplify.cc:19054
The testcase is a modified version of your testcase, *with some additional
layers of allocatables added*.
Initially I crafted this patch for the "simple" case with only one
intermediate descriptor, leaving the more complex cases for later -- and
kind of forgot about it.
To support additional layers in the FE would probably mean saving in a
vector all allocatables found while walking the chain of references.
Then loop through the vector and call gfc_map_array_descriptor for each
element. Hopefully that will just work with no changes in the ME.
If so, I'll come up with a revised version of the patch. Otherwise, if
it entails much more work, what about putting sorry() there and leaving
a note in the PR?
The fail is because struct_node == NULL:
13402 if (c != NULL && OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP
13403 && OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_STRUCT
13404 && OMP_CLAUSE_MAP_KIND (OMP_CLAUSE_CHAIN (c)) ==
GOMP_MAP_TO_PSET
13405 && OMP_CLAUSE_MAP_KIND (grp->grp_end) ==
GOMP_MAP_ATTACH_DETACH
13406 && OMP_CLAUSE_MAP_SIZE_NEEDS_ADJUSTMENT (grp->grp_end))
13407 {
...
13420 tree *struct_node = struct_map_to_clause->get (base);
13421 omp_siblist_move_node_after (c, cp, &OMP_CLAUSE_CHAIN
(*struct_node));
(gdb) p struct_node
$11 = (tree *) 0x0
(gdb) p debug(c)
<omp_clause 0x7ffff727a2d0 constant map
op-0: <nop_expr 0x7ffff728a7a0>
op-1: <integer_cst 0x7ffff7402df8 0>
op-2:>
$7 = void
(gdb) p c == *cp
$9 = true
(gdb) p debug(base)
<indirect_ref 0x7ffff7366a40
type <array_type 0x7ffff722f0a8
type <record_type 0x7ffff7223690 tile_type2 BLK
...
arg:0 <nop_expr 0x7ffff728a7a0
arg:0 <component_ref 0x7ffff7289b70 type <pointer_type
0x7ffff7424738>
arg:0 <component_ref 0x7ffff7341210 type <record_type
0x7ffff722f000 array01_tile_type2>
arg:0 <var_decl 0x7ffff72324c0 chunk> arg:1 <field_decl
0x7ffff7230140 tiles>
* * *
Testcase attached (modified version of your testcase).
Tobias
--
PA