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

Reply via email to