From f852e36071da0b78431cbf3de808e5cca804449a Mon Sep 17 00:00:00 2001 From: Akash Banerjee Date: Mon, 12 May 2025 18:41:20 +0100 Subject: [PATCH 1/3] Fix semantic check for default declare mappers. --- flang/lib/Semantics/resolve-names.cpp | 21 ++++++++++++------- .../OpenMP/declare-mapper-symbols.f90 | 18 ++++++++-------- .../Semantics/OpenMP/declare-mapper03.f90 | 6 +----- 3 files changed, 23 insertions(+), 22 deletions(-) diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp index bdafc03ad2c05..42297f069499b 100644 --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -38,6 +38,7 @@ #include "flang/Semantics/type.h" #include "flang/Support/Fortran.h" #include "flang/Support/default-kinds.h" +#include "llvm/ADT/SmallVector.h" #include "llvm/Support/raw_ostream.h" #include #include @@ -1766,14 +1767,6 @@ void OmpVisitor::ProcessMapperSpecifier(const parser::OmpMapperSpecifier &spec, // just following the natural flow, the map clauses gets processed before // the type has been fully processed. BeginDeclTypeSpec(); - if (auto &mapperName{std::get>(spec.t)}) { - mapperName->symbol = - &MakeSymbol(*mapperName, MiscDetails{MiscDetails::Kind::ConstructName}); - } else { - const parser::CharBlock defaultName{"default", 7}; - MakeSymbol( - defaultName, Attrs{}, MiscDetails{MiscDetails::Kind::ConstructName}); - } PushScope(Scope::Kind::OtherConstruct, nullptr); Walk(std::get(spec.t)); @@ -1783,6 +1776,18 @@ void OmpVisitor::ProcessMapperSpecifier(const parser::OmpMapperSpecifier &spec, Walk(clauses); EndDeclTypeSpec(); PopScope(); + + if (auto &mapperName{std::get>(spec.t)}) { + mapperName->symbol = + &MakeSymbol(*mapperName, MiscDetails{MiscDetails::Kind::ConstructName}); + } else { + const auto &type = std::get(spec.t); + static llvm::SmallVector defaultNames; + defaultNames.emplace_back( + type.declTypeSpec->derivedTypeSpec().name().ToString() + ".default"); + MakeSymbol(defaultNames.back(), Attrs{}, + MiscDetails{MiscDetails::Kind::ConstructName}); + } } void OmpVisitor::ProcessReductionSpecifier( diff --git a/flang/test/Semantics/OpenMP/declare-mapper-symbols.f90 b/flang/test/Semantics/OpenMP/declare-mapper-symbols.f90 index b4e03bd1632e5..0dda5b4456987 100644 --- a/flang/test/Semantics/OpenMP/declare-mapper-symbols.f90 +++ b/flang/test/Semantics/OpenMP/declare-mapper-symbols.f90 @@ -2,23 +2,23 @@ program main !CHECK-LABEL: MainProgram scope: main - implicit none + implicit none - type ty - integer :: x - end type ty - !$omp declare mapper(mymapper : ty :: mapped) map(mapped, mapped%x) - !$omp declare mapper(ty :: maptwo) map(maptwo, maptwo%x) + type ty + integer :: x + end type ty + !$omp declare mapper(mymapper : ty :: mapped) map(mapped, mapped%x) + !$omp declare mapper(ty :: maptwo) map(maptwo, maptwo%x) !! Note, symbols come out in their respective scope, but not in declaration order. -!CHECK: default: Misc ConstructName !CHECK: mymapper: Misc ConstructName !CHECK: ty: DerivedType components: x +!CHECK: ty.default: Misc ConstructName !CHECK: DerivedType scope: ty !CHECK: OtherConstruct scope: !CHECK: mapped (OmpMapToFrom) {{.*}} ObjectEntity type: TYPE(ty) -!CHECK: OtherConstruct scope: +!CHECK: OtherConstruct scope: !CHECK: maptwo (OmpMapToFrom) {{.*}} ObjectEntity type: TYPE(ty) - + end program main diff --git a/flang/test/Semantics/OpenMP/declare-mapper03.f90 b/flang/test/Semantics/OpenMP/declare-mapper03.f90 index b70b8a67f33e0..84fc3efafb3ad 100644 --- a/flang/test/Semantics/OpenMP/declare-mapper03.f90 +++ b/flang/test/Semantics/OpenMP/declare-mapper03.f90 @@ -5,12 +5,8 @@ integer :: y end type t1 -type :: t2 - real :: y, z -end type t2 - !error: 'default' is already declared in this scoping unit !$omp declare mapper(t1::x) map(x, x%y) -!$omp declare mapper(t2::w) map(w, w%y, w%z) +!$omp declare mapper(t1::x) map(x) end From c2d8c55407494b3d702f927c9a68032ecc56b629 Mon Sep 17 00:00:00 2001 From: Akash Banerjee Date: Wed, 14 May 2025 20:38:01 +0100 Subject: [PATCH 2/3] Change mapper name field from parser::Name to std::string. --- flang/include/flang/Parser/parse-tree.h | 2 +- flang/lib/Lower/OpenMP/ClauseProcessor.cpp | 6 +- flang/lib/Lower/OpenMP/OpenMP.cpp | 22 ++--- flang/lib/Parser/openmp-parsers.cpp | 22 ++++- flang/lib/Parser/unparse.cpp | 11 ++- flang/lib/Semantics/resolve-names.cpp | 16 +--- flang/test/Lower/OpenMP/declare-mapper.f90 | 95 ++++++++++++++++++- flang/test/Lower/OpenMP/map-mapper.f90 | 4 +- .../Parser/OpenMP/declare-mapper-unparse.f90 | 15 +-- .../Parser/OpenMP/metadirective-dirspec.f90 | 2 +- .../OpenMP/declare-mapper-symbols.f90 | 2 +- 11 files changed, 149 insertions(+), 48 deletions(-) diff --git a/flang/include/flang/Parser/parse-tree.h b/flang/include/flang/Parser/parse-tree.h index 254236b510544..c99006f0c1c22 100644 --- a/flang/include/flang/Parser/parse-tree.h +++ b/flang/include/flang/Parser/parse-tree.h @@ -3540,7 +3540,7 @@ WRAPPER_CLASS(OmpLocatorList, std::list); struct OmpMapperSpecifier { // Absent mapper-identifier is equivalent to DEFAULT. TUPLE_CLASS_BOILERPLATE(OmpMapperSpecifier); - std::tuple, TypeSpec, Name> t; + std::tuple t; }; // Ref: [4.5:222:1-5], [5.0:305:20-27], [5.1:337:11-19], [5.2:139:18-23], diff --git a/flang/lib/Lower/OpenMP/ClauseProcessor.cpp b/flang/lib/Lower/OpenMP/ClauseProcessor.cpp index 02454543d0a60..8dcc8be9be5bf 100644 --- a/flang/lib/Lower/OpenMP/ClauseProcessor.cpp +++ b/flang/lib/Lower/OpenMP/ClauseProcessor.cpp @@ -1114,9 +1114,9 @@ void ClauseProcessor::processMapObjects( typeSpec = &object.sym()->GetType()->derivedTypeSpec(); if (typeSpec) { - mapperIdName = typeSpec->name().ToString() + ".default"; - mapperIdName = - converter.mangleName(mapperIdName, *typeSpec->GetScope()); + mapperIdName = typeSpec->name().ToString() + ".omp.default.mapper"; + if (auto *sym = converter.getCurrentScope().FindSymbol(mapperIdName)) + mapperIdName = converter.mangleName(mapperIdName, sym->owner()); } } }; diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp index 61bbc709872fd..cfcba0159db8d 100644 --- a/flang/lib/Lower/OpenMP/OpenMP.cpp +++ b/flang/lib/Lower/OpenMP/OpenMP.cpp @@ -2422,8 +2422,10 @@ genTargetOp(lower::AbstractConverter &converter, lower::SymMap &symTable, mlir::FlatSymbolRefAttr mapperId; if (sym.GetType()->category() == semantics::DeclTypeSpec::TypeDerived) { auto &typeSpec = sym.GetType()->derivedTypeSpec(); - std::string mapperIdName = typeSpec.name().ToString() + ".default"; - mapperIdName = converter.mangleName(mapperIdName, *typeSpec.GetScope()); + std::string mapperIdName = + typeSpec.name().ToString() + ".omp.default.mapper"; + if (auto *sym = converter.getCurrentScope().FindSymbol(mapperIdName)) + mapperIdName = converter.mangleName(mapperIdName, sym->owner()); if (converter.getModuleOp().lookupSymbol(mapperIdName)) mapperId = mlir::FlatSymbolRefAttr::get(&converter.getMLIRContext(), mapperIdName); @@ -4005,24 +4007,16 @@ genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable, lower::StatementContext stmtCtx; const auto &spec = std::get(declareMapperConstruct.t); - const auto &mapperName{std::get>(spec.t)}; + const auto &mapperName{std::get(spec.t)}; const auto &varType{std::get(spec.t)}; const auto &varName{std::get(spec.t)}; assert(varType.declTypeSpec->category() == semantics::DeclTypeSpec::Category::TypeDerived && "Expected derived type"); - std::string mapperNameStr; - if (mapperName.has_value()) { - mapperNameStr = mapperName->ToString(); - mapperNameStr = - converter.mangleName(mapperNameStr, mapperName->symbol->owner()); - } else { - mapperNameStr = - varType.declTypeSpec->derivedTypeSpec().name().ToString() + ".default"; - mapperNameStr = converter.mangleName( - mapperNameStr, *varType.declTypeSpec->derivedTypeSpec().GetScope()); - } + std::string mapperNameStr = mapperName; + if (auto *sym = converter.getCurrentScope().FindSymbol(mapperNameStr)) + mapperNameStr = converter.mangleName(mapperNameStr, sym->owner()); // Save current insertion point before moving to the module scope to create // the DeclareMapperOp diff --git a/flang/lib/Parser/openmp-parsers.cpp b/flang/lib/Parser/openmp-parsers.cpp index 52d3a5844c969..a1ed584020677 100644 --- a/flang/lib/Parser/openmp-parsers.cpp +++ b/flang/lib/Parser/openmp-parsers.cpp @@ -1389,8 +1389,28 @@ TYPE_PARSER( TYPE_PARSER(sourced(construct( verbatim("DECLARE TARGET"_tok), Parser{}))) +static OmpMapperSpecifier ConstructOmpMapperSpecifier( + std::optional &&mapperName, TypeSpec &&typeSpec, Name &&varName) { + // If a name is present, parse: name ":" typeSpec "::" name + // This matches the syntax: : :: + if (mapperName.has_value() && mapperName->ToString() != "default") { + return OmpMapperSpecifier{ + mapperName->ToString(), std::move(typeSpec), std::move(varName)}; + } + // If the name is missing, use the DerivedTypeSpec name to construct the + // default mapper name. + // This matches the syntax: :: + if (auto *derived = std::get_if(&typeSpec.u)) { + return OmpMapperSpecifier{ + std::get(derived->t).ToString() + ".omp.default.mapper", + std::move(typeSpec), std::move(varName)}; + } + return OmpMapperSpecifier{std::string("omp.default.mapper"), + std::move(typeSpec), std::move(varName)}; +} + // mapper-specifier -TYPE_PARSER(construct( +TYPE_PARSER(applyFunction(ConstructOmpMapperSpecifier, maybe(name / ":" / !":"_tok), typeSpec / "::", name)) // OpenMP 5.2: 5.8.8 Declare Mapper Construct diff --git a/flang/lib/Parser/unparse.cpp b/flang/lib/Parser/unparse.cpp index a626888b7dfe5..1d68e8d8850fa 100644 --- a/flang/lib/Parser/unparse.cpp +++ b/flang/lib/Parser/unparse.cpp @@ -2093,7 +2093,11 @@ class UnparseVisitor { Walk(x.v, ","); } void Unparse(const OmpMapperSpecifier &x) { - Walk(std::get>(x.t), ":"); + const auto &mapperName = std::get(x.t); + if (mapperName.find("omp.default.mapper") == std::string::npos) { + Walk(mapperName); + Put(":"); + } Walk(std::get(x.t)); Put("::"); Walk(std::get(x.t)); @@ -2796,8 +2800,9 @@ class UnparseVisitor { BeginOpenMP(); Word("!$OMP DECLARE MAPPER ("); const auto &spec{std::get(z.t)}; - if (auto mapname{std::get>(spec.t)}) { - Walk(mapname); + const auto &mapperName = std::get(spec.t); + if (mapperName.find("omp.default.mapper") == std::string::npos) { + Walk(mapperName); Put(":"); } Walk(std::get(spec.t)); diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp index 42297f069499b..322562b06b87f 100644 --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -1767,7 +1767,9 @@ void OmpVisitor::ProcessMapperSpecifier(const parser::OmpMapperSpecifier &spec, // just following the natural flow, the map clauses gets processed before // the type has been fully processed. BeginDeclTypeSpec(); - + auto &mapperName{std::get(spec.t)}; + MakeSymbol(parser::CharBlock(mapperName), Attrs{}, + MiscDetails{MiscDetails::Kind::ConstructName}); PushScope(Scope::Kind::OtherConstruct, nullptr); Walk(std::get(spec.t)); auto &varName{std::get(spec.t)}; @@ -1776,18 +1778,6 @@ void OmpVisitor::ProcessMapperSpecifier(const parser::OmpMapperSpecifier &spec, Walk(clauses); EndDeclTypeSpec(); PopScope(); - - if (auto &mapperName{std::get>(spec.t)}) { - mapperName->symbol = - &MakeSymbol(*mapperName, MiscDetails{MiscDetails::Kind::ConstructName}); - } else { - const auto &type = std::get(spec.t); - static llvm::SmallVector defaultNames; - defaultNames.emplace_back( - type.declTypeSpec->derivedTypeSpec().name().ToString() + ".default"); - MakeSymbol(defaultNames.back(), Attrs{}, - MiscDetails{MiscDetails::Kind::ConstructName}); - } } void OmpVisitor::ProcessReductionSpecifier( diff --git a/flang/test/Lower/OpenMP/declare-mapper.f90 b/flang/test/Lower/OpenMP/declare-mapper.f90 index 867b850317e66..8a98c68a8d582 100644 --- a/flang/test/Lower/OpenMP/declare-mapper.f90 +++ b/flang/test/Lower/OpenMP/declare-mapper.f90 @@ -5,6 +5,7 @@ ! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 %t/omp-declare-mapper-2.f90 -o - | FileCheck %t/omp-declare-mapper-2.f90 ! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 %t/omp-declare-mapper-3.f90 -o - | FileCheck %t/omp-declare-mapper-3.f90 ! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 %t/omp-declare-mapper-4.f90 -o - | FileCheck %t/omp-declare-mapper-4.f90 +! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 %t/omp-declare-mapper-5.f90 -o - | FileCheck %t/omp-declare-mapper-5.f90 !--- omp-declare-mapper-1.f90 subroutine declare_mapper_1 @@ -22,7 +23,7 @@ subroutine declare_mapper_1 end type type(my_type2) :: t real :: x, y(nvals) - !CHECK:omp.declare_mapper @[[MY_TYPE_MAPPER:_QQFdeclare_mapper_1my_type\.default]] : [[MY_TYPE:!fir\.type<_QFdeclare_mapper_1Tmy_type\{num_vals:i32,values:!fir\.box>>\}>]] { + !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>>\}>]] { !CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<[[MY_TYPE]]>): !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]]>) !CHECK: %[[VAL_2:.*]] = hlfir.designate %[[VAL_1]]#0{"values"} {fortran_attrs = #fir.var_attrs} : (!fir.ref<[[MY_TYPE]]>) -> !fir.ref>>> @@ -149,7 +150,7 @@ subroutine declare_mapper_4 integer :: num end type - !CHECK: omp.declare_mapper @[[MY_TYPE_MAPPER:_QQFdeclare_mapper_4my_type.default]] : [[MY_TYPE:!fir\.type<_QFdeclare_mapper_4Tmy_type\{num:i32\}>]] + !CHECK: omp.declare_mapper @[[MY_TYPE_MAPPER:_QQFdeclare_mapper_4my_type.omp.default.mapper]] : [[MY_TYPE:!fir\.type<_QFdeclare_mapper_4Tmy_type\{num:i32\}>]] !$omp declare mapper (my_type :: var) map (var%num) type(my_type) :: a @@ -171,3 +172,93 @@ subroutine declare_mapper_4 a%num = 40 !$omp end target end subroutine declare_mapper_4 + +!--- omp-declare-mapper-5.f90 +program declare_mapper_5 + implicit none + + type :: mytype + integer :: x, y + end type + + !CHECK: omp.declare_mapper @[[INNER_MAPPER_NAMED:_QQFFuse_innermy_mapper]] : [[MY_TYPE:!fir\.type<_QFTmytype\{x:i32,y:i32\}>]] + !CHECK: omp.declare_mapper @[[INNER_MAPPER_DEFAULT:_QQFFuse_innermytype.omp.default.mapper]] : [[MY_TYPE]] + !CHECK: omp.declare_mapper @[[OUTER_MAPPER_NAMED:_QQFmy_mapper]] : [[MY_TYPE]] + !CHECK: omp.declare_mapper @[[OUTER_MAPPER_DEFAULT:_QQFmytype.omp.default.mapper]] : [[MY_TYPE]] + !$omp declare mapper(mytype :: var) map(tofrom: var%x) + !$omp declare mapper(my_mapper : mytype :: var) map(tofrom: var%y) + + type(mytype) :: a + + !CHECK: %{{.*}} = omp.map.info var_ptr(%{{.*}}#1 : !fir.ref<[[MY_TYPE]]>, [[MY_TYPE]]) map_clauses(implicit, tofrom) capture(ByRef) mapper(@[[OUTER_MAPPER_DEFAULT]]) -> !fir.ref<[[MY_TYPE]]> {name = "a"} + !$omp target + a%x = 10 + !$omp end target + + !CHECK: %{{.*}} = omp.map.info var_ptr(%{{.*}}#1 : !fir.ref<[[MY_TYPE]]>, [[MY_TYPE]]) map_clauses(tofrom) capture(ByRef) mapper(@[[OUTER_MAPPER_DEFAULT]]) -> !fir.ref<[[MY_TYPE]]> {name = "a"} + !$omp target map(a) + a%x = 10 + !$omp end target + + !CHECK: %{{.*}} = omp.map.info var_ptr(%{{.*}}#1 : !fir.ref<[[MY_TYPE]]>, [[MY_TYPE]]) map_clauses(tofrom) capture(ByRef) mapper(@[[OUTER_MAPPER_DEFAULT]]) -> !fir.ref<[[MY_TYPE]]> {name = "a"} + !$omp target map(mapper(default) : a) + a%x = 10 + !$omp end target + + !CHECK: %{{.*}} = omp.map.info var_ptr(%{{.*}}#1 : !fir.ref<[[MY_TYPE]]>, [[MY_TYPE]]) map_clauses(tofrom) capture(ByRef) mapper(@[[OUTER_MAPPER_NAMED]]) -> !fir.ref<[[MY_TYPE]]> {name = "a"} + !$omp target map(mapper(my_mapper) : a) + a%y = 10 + !$omp end target + +contains + subroutine use_outer() + type(mytype) :: a + + !CHECK: %{{.*}} = omp.map.info var_ptr(%{{.*}}#1 : !fir.ref<[[MY_TYPE]]>, [[MY_TYPE]]) map_clauses(implicit, tofrom) capture(ByRef) mapper(@[[OUTER_MAPPER_DEFAULT]]) -> !fir.ref<[[MY_TYPE]]> {name = "a"} + !$omp target + a%x = 10 + !$omp end target + + !CHECK: %{{.*}} = omp.map.info var_ptr(%{{.*}}#1 : !fir.ref<[[MY_TYPE]]>, [[MY_TYPE]]) map_clauses(tofrom) capture(ByRef) mapper(@[[OUTER_MAPPER_DEFAULT]]) -> !fir.ref<[[MY_TYPE]]> {name = "a"} + !$omp target map(a) + a%x = 10 + !$omp end target + + !CHECK: %{{.*}} = omp.map.info var_ptr(%{{.*}}#1 : !fir.ref<[[MY_TYPE]]>, [[MY_TYPE]]) map_clauses(tofrom) capture(ByRef) mapper(@[[OUTER_MAPPER_DEFAULT]]) -> !fir.ref<[[MY_TYPE]]> {name = "a"} + !$omp target map(mapper(default) : a) + a%x = 10 + !$omp end target + + !CHECK: %{{.*}} = omp.map.info var_ptr(%{{.*}}#1 : !fir.ref<[[MY_TYPE]]>, [[MY_TYPE]]) map_clauses(tofrom) capture(ByRef) mapper(@[[OUTER_MAPPER_NAMED]]) -> !fir.ref<[[MY_TYPE]]> {name = "a"} + !$omp target map(mapper(my_mapper) : a) + a%y = 10 + !$omp end target + end subroutine + + subroutine use_inner() + !$omp declare mapper(mytype :: var) map(tofrom: var%x) + !$omp declare mapper(my_mapper : mytype :: var) map(tofrom: var%y) + + type(mytype) :: a + + !CHECK: %{{.*}} = omp.map.info var_ptr(%{{.*}}#1 : !fir.ref<[[MY_TYPE]]>, [[MY_TYPE]]) map_clauses(implicit, tofrom) capture(ByRef) mapper(@[[INNER_MAPPER_DEFAULT]]) -> !fir.ref<[[MY_TYPE]]> {name = "a"} + !$omp target + a%x = 10 + !$omp end target + + !CHECK: %{{.*}} = omp.map.info var_ptr(%{{.*}}#1 : !fir.ref<[[MY_TYPE]]>, [[MY_TYPE]]) map_clauses(tofrom) capture(ByRef) mapper(@[[INNER_MAPPER_DEFAULT]]) -> !fir.ref<[[MY_TYPE]]> {name = "a"} + !$omp target map(a) + a%x = 10 + !$omp end target + + !CHECK: %{{.*}} = omp.map.info var_ptr(%{{.*}}#1 : !fir.ref<[[MY_TYPE]]>, [[MY_TYPE]]) map_clauses(tofrom) capture(ByRef) mapper(@[[INNER_MAPPER_DEFAULT]]) -> !fir.ref<[[MY_TYPE]]> {name = "a"} + !$omp target map(mapper(default) : a) + a%x = 10 + !$omp end target + + !CHECK: %{{.*}} = omp.map.info var_ptr(%{{.*}}#1 : !fir.ref<[[MY_TYPE]]>, [[MY_TYPE]]) map_clauses(tofrom) capture(ByRef) mapper(@[[INNER_MAPPER_NAMED]]) -> !fir.ref<[[MY_TYPE]]> {name = "a"} + !$omp target map(mapper(my_mapper) : a) + a%y = 10 + !$omp end target + end subroutine +end program declare_mapper_5 diff --git a/flang/test/Lower/OpenMP/map-mapper.f90 b/flang/test/Lower/OpenMP/map-mapper.f90 index a511110cb5d18..91564bfc7bc46 100644 --- a/flang/test/Lower/OpenMP/map-mapper.f90 +++ b/flang/test/Lower/OpenMP/map-mapper.f90 @@ -8,7 +8,7 @@ program p !$omp declare mapper(xx : t1 :: nn) map(to: nn, nn%x) !$omp declare mapper(t1 :: nn) map(from: nn) - !CHECK-LABEL: omp.declare_mapper @_QQFt1.default : !fir.type<_QFTt1{x:!fir.array<256xi32>}> + !CHECK-LABEL: omp.declare_mapper @_QQFt1.omp.default.mapper : !fir.type<_QFTt1{x:!fir.array<256xi32>}> !CHECK-LABEL: omp.declare_mapper @_QQFxx : !fir.type<_QFTt1{x:!fir.array<256xi32>}> type(t1) :: a, b @@ -20,7 +20,7 @@ program p end do !$omp end target - !CHECK: %[[MAP_B:.*]] = omp.map.info var_ptr(%{{.*}} : {{.*}}, {{.*}}) map_clauses(tofrom) capture(ByRef) mapper(@_QQFt1.default) -> {{.*}} {name = "b"} + !CHECK: %[[MAP_B:.*]] = omp.map.info var_ptr(%{{.*}} : {{.*}}, {{.*}}) map_clauses(tofrom) capture(ByRef) mapper(@_QQFt1.omp.default.mapper) -> {{.*}} {name = "b"} !CHECK: omp.target map_entries(%[[MAP_B]] -> %{{.*}}, %{{.*}} -> %{{.*}} : {{.*}}, {{.*}}) { !$omp target map(mapper(default) : b) do i = 1, n diff --git a/flang/test/Parser/OpenMP/declare-mapper-unparse.f90 b/flang/test/Parser/OpenMP/declare-mapper-unparse.f90 index 407bfd29153fa..30d75d02736f3 100644 --- a/flang/test/Parser/OpenMP/declare-mapper-unparse.f90 +++ b/flang/test/Parser/OpenMP/declare-mapper-unparse.f90 @@ -7,36 +7,37 @@ program main type ty integer :: x end type ty - + !CHECK: !$OMP DECLARE MAPPER (mymapper:ty::mapped) MAP(mapped,mapped%x) !$omp declare mapper(mymapper : ty :: mapped) map(mapped, mapped%x) !PARSE-TREE: OpenMPDeclareMapperConstruct !PARSE-TREE: OmpMapperSpecifier -!PARSE-TREE: Name = 'mymapper' +!PARSE-TREE: string = 'mymapper' !PARSE-TREE: TypeSpec -> DerivedTypeSpec !PARSE-TREE: Name = 'ty' -!PARSE-TREE: Name = 'mapped' +!PARSE-TREE: Name = 'mapped' !PARSE-TREE: OmpMapClause !PARSE-TREE: OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'mapped' !PARSE-TREE: OmpObject -> Designator -> DataRef -> StructureComponent !PARSE-TREE: DataRef -> Name = 'mapped' -!PARSE-TREE: Name = 'x' +!PARSE-TREE: Name = 'x' !CHECK: !$OMP DECLARE MAPPER (ty::mapped) MAP(mapped,mapped%x) !$omp declare mapper(ty :: mapped) map(mapped, mapped%x) - + !PARSE-TREE: OpenMPDeclareMapperConstruct !PARSE-TREE: OmpMapperSpecifier +!PARSE-TREE: string = 'ty.omp.default.mapper' !PARSE-TREE: TypeSpec -> DerivedTypeSpec !PARSE-TREE: Name = 'ty' -!PARSE-TREE: Name = 'mapped' +!PARSE-TREE: Name = 'mapped' !PARSE-TREE: OmpMapClause !PARSE-TREE: OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'mapped' !PARSE-TREE: OmpObject -> Designator -> DataRef -> StructureComponent !PARSE-TREE: DataRef -> Name = 'mapped' !PARSE-TREE: Name = 'x' - + end program main !CHECK-LABEL: end program main diff --git a/flang/test/Parser/OpenMP/metadirective-dirspec.f90 b/flang/test/Parser/OpenMP/metadirective-dirspec.f90 index b6c9c58948fec..baa8b2e08c539 100644 --- a/flang/test/Parser/OpenMP/metadirective-dirspec.f90 +++ b/flang/test/Parser/OpenMP/metadirective-dirspec.f90 @@ -78,7 +78,7 @@ subroutine f02 !PARSE-TREE: | | OmpDirectiveSpecification !PARSE-TREE: | | | OmpDirectiveName -> llvm::omp::Directive = declare mapper !PARSE-TREE: | | | OmpArgumentList -> OmpArgument -> OmpMapperSpecifier -!PARSE-TREE: | | | | Name = 'mymapper' +!PARSE-TREE: | | | | string = 'mymapper' !PARSE-TREE: | | | | TypeSpec -> IntrinsicTypeSpec -> IntegerTypeSpec -> !PARSE-TREE: | | | | Name = 'v' !PARSE-TREE: | | | OmpClauseList -> OmpClause -> Map -> OmpMapClause diff --git a/flang/test/Semantics/OpenMP/declare-mapper-symbols.f90 b/flang/test/Semantics/OpenMP/declare-mapper-symbols.f90 index 0dda5b4456987..06f41ab8ce76f 100644 --- a/flang/test/Semantics/OpenMP/declare-mapper-symbols.f90 +++ b/flang/test/Semantics/OpenMP/declare-mapper-symbols.f90 @@ -13,7 +13,7 @@ program main !! Note, symbols come out in their respective scope, but not in declaration order. !CHECK: mymapper: Misc ConstructName !CHECK: ty: DerivedType components: x -!CHECK: ty.default: Misc ConstructName +!CHECK: ty.omp.default.mapper: Misc ConstructName !CHECK: DerivedType scope: ty !CHECK: OtherConstruct scope: !CHECK: mapped (OmpMapToFrom) {{.*}} ObjectEntity type: TYPE(ty) From 22772627df5eff1309bf254df2c3826b3d0380cc Mon Sep 17 00:00:00 2001 From: Akash Banerjee Date: Tue, 27 May 2025 18:32:14 +0100 Subject: [PATCH 3/3] Addressed reviewer comments. --- flang/lib/Parser/openmp-parsers.cpp | 2 +- flang/lib/Parser/unparse.cpp | 4 ++-- flang/lib/Semantics/resolve-names.cpp | 1 - 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/flang/lib/Parser/openmp-parsers.cpp b/flang/lib/Parser/openmp-parsers.cpp index a1ed584020677..c08cd1ab80559 100644 --- a/flang/lib/Parser/openmp-parsers.cpp +++ b/flang/lib/Parser/openmp-parsers.cpp @@ -1400,7 +1400,7 @@ static OmpMapperSpecifier ConstructOmpMapperSpecifier( // If the name is missing, use the DerivedTypeSpec name to construct the // default mapper name. // This matches the syntax: :: - if (auto *derived = std::get_if(&typeSpec.u)) { + if (DerivedTypeSpec * derived{std::get_if(&typeSpec.u)}) { return OmpMapperSpecifier{ std::get(derived->t).ToString() + ".omp.default.mapper", std::move(typeSpec), std::move(varName)}; diff --git a/flang/lib/Parser/unparse.cpp b/flang/lib/Parser/unparse.cpp index 1d68e8d8850fa..0784a6703bbde 100644 --- a/flang/lib/Parser/unparse.cpp +++ b/flang/lib/Parser/unparse.cpp @@ -2093,7 +2093,7 @@ class UnparseVisitor { Walk(x.v, ","); } void Unparse(const OmpMapperSpecifier &x) { - const auto &mapperName = std::get(x.t); + const auto &mapperName{std::get(x.t)}; if (mapperName.find("omp.default.mapper") == std::string::npos) { Walk(mapperName); Put(":"); @@ -2800,7 +2800,7 @@ class UnparseVisitor { BeginOpenMP(); Word("!$OMP DECLARE MAPPER ("); const auto &spec{std::get(z.t)}; - const auto &mapperName = std::get(spec.t); + const auto &mapperName{std::get(spec.t)}; if (mapperName.find("omp.default.mapper") == std::string::npos) { Walk(mapperName); Put(":"); diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp index 322562b06b87f..57a307f01b24b 100644 --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -38,7 +38,6 @@ #include "flang/Semantics/type.h" #include "flang/Support/Fortran.h" #include "flang/Support/default-kinds.h" -#include "llvm/ADT/SmallVector.h" #include "llvm/Support/raw_ostream.h" #include #include