Skip to content

Commit 8c674f0

Browse files
authored
[OpenMP][Flang] Change the OmpDefaultMapperName suffix (#168399)
This PR fixes a Fortran syntax violation in the OpenMP default mapper naming convention. The suffix .omp.default.mapper contains dots which are invalid in Fortran identifiers, causing failures when mappers are written to and read from module files. The fix changes the suffix to _omp_default_mapper which uses underscores instead of dots, complying with Fortran syntax rules. Key changes: - Changed OmpDefaultMapperName constant from .omp.default.mapper to _omp_default_mapper - Added GetUltimate() calls in mapper symbol resolution to properly handle symbols across module boundaries - Added new test case verifying default mappers work correctly when defined in a module and used in consuming programs This fixes #168336.
1 parent fb2b138 commit 8c674f0

File tree

10 files changed

+51
-15
lines changed

10 files changed

+51
-15
lines changed

flang/lib/Lower/OpenMP/ClauseProcessor.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1278,7 +1278,8 @@ void ClauseProcessor::processMapObjects(
12781278
std::string mapperIdName =
12791279
typeSpec->name().ToString() + llvm::omp::OmpDefaultMapperName;
12801280
if (auto *sym = converter.getCurrentScope().FindSymbol(mapperIdName)) {
1281-
mapperIdName = converter.mangleName(mapperIdName, sym->owner());
1281+
mapperIdName =
1282+
converter.mangleName(mapperIdName, sym->GetUltimate().owner());
12821283
} else {
12831284
mapperIdName = converter.mangleName(mapperIdName, *typeSpec->GetScope());
12841285
}

flang/lib/Lower/OpenMP/OpenMP.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2612,8 +2612,8 @@ genTargetOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
26122612
typeSpec->name().ToString() + llvm::omp::OmpDefaultMapperName;
26132613
if (auto *mapperSym =
26142614
converter.getCurrentScope().FindSymbol(mapperIdName))
2615-
mapperIdName =
2616-
converter.mangleName(mapperIdName, mapperSym->owner());
2615+
mapperIdName = converter.mangleName(
2616+
mapperIdName, mapperSym->GetUltimate().owner());
26172617
else
26182618
mapperIdName =
26192619
converter.mangleName(mapperIdName, *typeSpec->GetScope());

flang/test/Lower/OpenMP/declare-mapper.f90

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 %t/omp-declare-mapper-6.f90 -o - | FileCheck %t/omp-declare-mapper-6.f90
1010
! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 -module-dir %t %t/omp-declare-mapper-7.mod.f90 -o - >/dev/null
1111
! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 -J %t %t/omp-declare-mapper-7.use.f90 -o - | FileCheck %t/omp-declare-mapper-7.use.f90
12+
! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 -module-dir %t %t/omp-declare-mapper-8.mod.f90 -o - >/dev/null
13+
! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 -J %t %t/omp-declare-mapper-8.use.f90 -o - | FileCheck %t/omp-declare-mapper-8.use.f90
1214

1315
!--- omp-declare-mapper-1.f90
1416
subroutine declare_mapper_1
@@ -26,7 +28,7 @@ subroutine declare_mapper_1
2628
end type
2729
type(my_type2) :: t
2830
real :: x, y(nvals)
29-
!CHECK:omp.declare_mapper @[[MY_TYPE_MAPPER:_QQFdeclare_mapper_1my_type\.omp\.default\.mapper]] : [[MY_TYPE:!fir\.type<_QFdeclare_mapper_1Tmy_type\{num_vals:i32,values:!fir\.box<!fir\.heap<!fir\.array<\?xi32>>>\}>]] {
31+
!CHECK:omp.declare_mapper @[[MY_TYPE_MAPPER:_QQFdeclare_mapper_1my_type_omp_default_mapper]] : [[MY_TYPE:!fir\.type<_QFdeclare_mapper_1Tmy_type\{num_vals:i32,values:!fir\.box<!fir\.heap<!fir\.array<\?xi32>>>\}>]] {
3032
!CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<[[MY_TYPE]]>):
3133
!CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0]] {uniq_name = "_QFdeclare_mapper_1Evar"} : (!fir.ref<[[MY_TYPE]]>) -> (!fir.ref<[[MY_TYPE]]>, !fir.ref<[[MY_TYPE]]>)
3234
!CHECK: %[[VAL_2:.*]] = hlfir.designate %[[VAL_1]]#0{"values"} {fortran_attrs = #fir.var_attrs<allocatable>} : (!fir.ref<[[MY_TYPE]]>) -> !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>
@@ -153,7 +155,7 @@ subroutine declare_mapper_4
153155
integer :: num
154156
end type
155157

156-
!CHECK: omp.declare_mapper @[[MY_TYPE_MAPPER:_QQFdeclare_mapper_4my_type.omp.default.mapper]] : [[MY_TYPE:!fir\.type<_QFdeclare_mapper_4Tmy_type\{num:i32\}>]]
158+
!CHECK: omp.declare_mapper @[[MY_TYPE_MAPPER:_QQFdeclare_mapper_4my_type_omp_default_mapper]] : [[MY_TYPE:!fir\.type<_QFdeclare_mapper_4Tmy_type\{num:i32\}>]]
157159
!$omp declare mapper (my_type :: var) map (var%num)
158160

159161
type(my_type) :: a
@@ -185,9 +187,9 @@ program declare_mapper_5
185187
end type
186188

187189
!CHECK: omp.declare_mapper @[[INNER_MAPPER_NAMED:_QQFFuse_innermy_mapper]] : [[MY_TYPE:!fir\.type<_QFTmytype\{x:i32,y:i32\}>]]
188-
!CHECK: omp.declare_mapper @[[INNER_MAPPER_DEFAULT:_QQFFuse_innermytype.omp.default.mapper]] : [[MY_TYPE]]
190+
!CHECK: omp.declare_mapper @[[INNER_MAPPER_DEFAULT:_QQFFuse_innermytype_omp_default_mapper]] : [[MY_TYPE]]
189191
!CHECK: omp.declare_mapper @[[OUTER_MAPPER_NAMED:_QQFmy_mapper]] : [[MY_TYPE]]
190-
!CHECK: omp.declare_mapper @[[OUTER_MAPPER_DEFAULT:_QQFmytype.omp.default.mapper]] : [[MY_TYPE]]
192+
!CHECK: omp.declare_mapper @[[OUTER_MAPPER_DEFAULT:_QQFmytype_omp_default_mapper]] : [[MY_TYPE]]
191193
!$omp declare mapper(mytype :: var) map(tofrom: var%x)
192194
!$omp declare mapper(my_mapper : mytype :: var) map(tofrom: var%y)
193195

@@ -325,3 +327,36 @@ program use_module_mapper
325327
a%x = 42
326328
!$omp end target
327329
end program use_module_mapper
330+
331+
!--- omp-declare-mapper-8.mod.f90
332+
! Module with a default DECLARE MAPPER to be compiled separately.
333+
module default_mapper_mod
334+
implicit none
335+
type :: dtype
336+
integer :: x
337+
end type dtype
338+
!$omp declare mapper(dtype :: v) map(tofrom: v%x)
339+
end module default_mapper_mod
340+
341+
!--- omp-declare-mapper-8.use.f90
342+
! Consumer program that USEs the module and relies on the default mapper.
343+
! CHECK: omp.declare_mapper @{{.*dtype_omp_default_mapper}} : !fir.type<_QMdefault_mapper_modTdtype{x:i32}>
344+
! CHECK: %{{.*}} = omp.map.info {{.*}} map_clauses(tofrom) {{.*}} mapper(@{{.*dtype_omp_default_mapper}}) {{.*}} {name = "a"}
345+
! CHECK: %{{.*}} = omp.map.info {{.*}} map_clauses(tofrom) {{.*}} mapper(@{{.*dtype_omp_default_mapper}}) {{.*}} {name = "a"}
346+
! CHECK: %{{.*}} = omp.map.info {{.*}} map_clauses(implicit, tofrom) {{.*}} mapper(@{{.*dtype_omp_default_mapper}}) {{.*}} {name = "a"}
347+
program use_module_default_mapper
348+
use default_mapper_mod
349+
implicit none
350+
type(dtype) :: a
351+
!$omp target map(a)
352+
a%x = 7
353+
!$omp end target
354+
355+
!$omp target map(mapper(default) : a)
356+
a%x = 8
357+
!$omp end target
358+
359+
!$omp target
360+
a%x = 8
361+
!$omp end target
362+
end program use_module_default_mapper

flang/test/Lower/OpenMP/derived-type-map.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
!RUN: %flang_fc1 -emit-hlfir -fopenmp %s -o - | FileCheck %s
22

3-
!CHECK: omp.declare_mapper @[[MAPPER1:_QQFmaptype_derived_implicit_allocatablescalar_and_array.omp.default.mapper]] : !fir.type<_QFmaptype_derived_implicit_allocatableTscalar_and_array{real:f32,array:!fir.array<10xi32>,int:i32}> {
3+
!CHECK: omp.declare_mapper @[[MAPPER1:_QQFmaptype_derived_implicit_allocatablescalar_and_array_omp_default_mapper]] : !fir.type<_QFmaptype_derived_implicit_allocatableTscalar_and_array{real:f32,array:!fir.array<10xi32>,int:i32}> {
44

55
!CHECK: %[[ALLOCA:.*]] = fir.alloca !fir.type<_QFmaptype_derived_implicitTscalar_and_array{real:f32,array:!fir.array<10xi32>,int:i32}> {bindc_name = "scalar_arr", uniq_name = "_QFmaptype_derived_implicitEscalar_arr"}
66
!CHECK: %[[DECLARE:.*]]:2 = hlfir.declare %[[ALLOCA]] {uniq_name = "_QFmaptype_derived_implicitEscalar_arr"} : (!fir.ref<!fir.type<_QFmaptype_derived_implicitTscalar_and_array{real:f32,array:!fir.array<10xi32>,int:i32}>>) -> (!fir.ref<!fir.type<_QFmaptype_derived_implicitTscalar_and_array{real:f32,array:!fir.array<10xi32>,int:i32}>>, !fir.ref<!fir.type<_QFmaptype_derived_implicitTscalar_and_array{real:f32,array:!fir.array<10xi32>,int:i32}>>)

flang/test/Lower/OpenMP/map-mapper.f90

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ program p
88
!$omp declare mapper(xx : t1 :: nn) map(to: nn, nn%x)
99
!$omp declare mapper(t1 :: nn) map(from: nn)
1010

11-
!CHECK-LABEL: omp.declare_mapper @_QQFt1.omp.default.mapper : !fir.type<_QFTt1{x:!fir.array<256xi32>}>
11+
!CHECK-LABEL: omp.declare_mapper @_QQFt1_omp_default_mapper : !fir.type<_QFTt1{x:!fir.array<256xi32>}>
1212
!CHECK-LABEL: omp.declare_mapper @_QQFxx : !fir.type<_QFTt1{x:!fir.array<256xi32>}>
1313

1414
type(t1) :: a, b
@@ -20,7 +20,7 @@ program p
2020
end do
2121
!$omp end target
2222

23-
!CHECK: %[[MAP_B:.*]] = omp.map.info var_ptr(%{{.*}} : {{.*}}, {{.*}}) map_clauses(tofrom) capture(ByRef) mapper(@_QQFt1.omp.default.mapper) -> {{.*}} {name = "b"}
23+
!CHECK: %[[MAP_B:.*]] = omp.map.info var_ptr(%{{.*}} : {{.*}}, {{.*}}) map_clauses(tofrom) capture(ByRef) mapper(@_QQFt1_omp_default_mapper) -> {{.*}} {name = "b"}
2424
!CHECK: omp.target map_entries(%[[MAP_B]] -> %{{.*}}, %{{.*}} -> %{{.*}} : {{.*}}, {{.*}}) {
2525
!$omp target map(mapper(default) : b)
2626
do i = 1, n

flang/test/Lower/OpenMP/target.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -529,7 +529,7 @@ subroutine omp_target_device_ptr
529529
use iso_c_binding, only : c_ptr, c_loc
530530
type(c_ptr) :: a
531531
integer, target :: b
532-
!CHECK: %[[MAP:.*]] = omp.map.info var_ptr({{.*}}) map_clauses(tofrom) capture(ByRef) mapper(@[[CPTR_DEFAULT:_QQM__fortran_builtinsc_ptr\.omp\.default\.mapper]]) -> {{.*}} {name = "a"}
532+
!CHECK: %[[MAP:.*]] = omp.map.info var_ptr({{.*}}) map_clauses(tofrom) capture(ByRef) mapper(@[[CPTR_DEFAULT:_QQM__fortran_builtinsc_ptr_omp_default_mapper]]) -> {{.*}} {name = "a"}
533533
!CHECK: omp.target_data map_entries(%[[MAP]]{{.*}}) use_device_ptr({{.*}} -> %[[VAL_1:.*]] : !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>>)
534534
!$omp target data map(tofrom: a) use_device_ptr(a)
535535
!CHECK: {{.*}} = fir.coordinate_of %[[VAL_1:.*]], __address : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_c_ptr{__address:i64}>>) -> !fir.ref<i64>

flang/test/Parser/OpenMP/declare-mapper-unparse.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ program main
2929

3030
!PARSE-TREE: OpenMPDeclareMapperConstruct
3131
!PARSE-TREE: OmpMapperSpecifier
32-
!PARSE-TREE: string = 'ty.omp.default.mapper'
32+
!PARSE-TREE: string = 'ty_omp_default_mapper'
3333
!PARSE-TREE: TypeSpec -> DerivedTypeSpec
3434
!PARSE-TREE: Name = 'ty'
3535
!PARSE-TREE: Name = 'mapped'

flang/test/Parser/OpenMP/openmp6-directive-spellings.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ subroutine f01
5757
!PARSE-TREE: DeclarationConstruct -> SpecificationConstruct -> OpenMPDeclarativeConstruct -> OpenMPDeclareMapperConstruct -> OmpDirectiveSpecification
5858
!PARSE-TREE: | OmpDirectiveName -> llvm::omp::Directive = declare mapper
5959
!PARSE-TREE: | OmpArgumentList -> OmpArgument -> OmpMapperSpecifier
60-
!PARSE-TREE: | | string = 't.omp.default.mapper'
60+
!PARSE-TREE: | | string = 't_omp_default_mapper'
6161
!PARSE-TREE: | | TypeSpec -> DerivedTypeSpec
6262
!PARSE-TREE: | | | Name = 't'
6363
!PARSE-TREE: | | Name = 'v'

flang/test/Semantics/OpenMP/declare-mapper-symbols.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ program main
1313
!! Note, symbols come out in their respective scope, but not in declaration order.
1414
!CHECK: mymapper: MapperDetails
1515
!CHECK: ty: DerivedType components: x
16-
!CHECK: ty.omp.default.mapper: MapperDetails
16+
!CHECK: ty_omp_default_mapper: MapperDetails
1717
!CHECK: DerivedType scope: ty
1818
!CHECK: OtherConstruct scope:
1919
!CHECK: mapped (OmpMapToFrom) {{.*}} ObjectEntity type: TYPE(ty)

llvm/include/llvm/Frontend/OpenMP/OMPConstants.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ enum class OMPDynGroupprivateFallbackType : uint64_t {
201201
};
202202

203203
// Default OpenMP mapper name suffix.
204-
inline constexpr const char *OmpDefaultMapperName = ".omp.default.mapper";
204+
inline constexpr const char *OmpDefaultMapperName = "_omp_default_mapper";
205205

206206
/// Values for bit flags used to specify the mapping type for
207207
/// offloading.

0 commit comments

Comments
 (0)