Skip to content

Commit 8bc59ff

Browse files
[Flang][OMP]Add support for DECLARE MAPPER parsing and semantics
Will hit a TODO in the lowering, which there are tests added to check for this happening.
1 parent 2904f80 commit 8bc59ff

File tree

9 files changed

+168
-2
lines changed

9 files changed

+168
-2
lines changed

flang/include/flang/Parser/dump-parse-tree.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -504,6 +504,7 @@ class ParseTreeDumper {
504504
NODE(parser, OmpDeclareTargetSpecifier)
505505
NODE(parser, OmpDeclareTargetWithClause)
506506
NODE(parser, OmpDeclareTargetWithList)
507+
NODE(parser, OmpDeclareMapperSpecifier)
507508
NODE(parser, OmpDefaultClause)
508509
NODE_ENUM(OmpDefaultClause, Type)
509510
NODE(parser, OmpDefaultmapClause)
@@ -612,6 +613,7 @@ class ParseTreeDumper {
612613
NODE(parser, OpenMPDeclareReductionConstruct)
613614
NODE(parser, OpenMPDeclareSimdConstruct)
614615
NODE(parser, OpenMPDeclareTargetConstruct)
616+
NODE(parser, OpenMPDeclareMapperConstruct)
615617
NODE(parser, OmpMemoryOrderClause)
616618
NODE(parser, OmpAtomicClause)
617619
NODE(parser, OmpAtomicClauseList)

flang/include/flang/Parser/parse-tree.h

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3872,6 +3872,19 @@ struct OpenMPDeclareTargetConstruct {
38723872
std::tuple<Verbatim, OmpDeclareTargetSpecifier> t;
38733873
};
38743874

3875+
struct OmpDeclareMapperSpecifier {
3876+
TUPLE_CLASS_BOILERPLATE(OmpDeclareMapperSpecifier);
3877+
std::tuple<std::optional<Name>, TypeSpec, Name> t;
3878+
};
3879+
3880+
struct OpenMPDeclareMapperConstruct {
3881+
TUPLE_CLASS_BOILERPLATE(OpenMPDeclareMapperConstruct);
3882+
CharBlock source;
3883+
std::tuple<Verbatim, OmpDeclareMapperSpecifier,
3884+
std::list<std::list<OmpMapClause>>>
3885+
t;
3886+
};
3887+
38753888
// 2.16 declare-reduction -> DECLARE REDUCTION (reduction-identifier : type-list
38763889
// : combiner) [initializer-clause]
38773890
struct OmpReductionCombiner {
@@ -3924,7 +3937,8 @@ struct OpenMPDeclarativeConstruct {
39243937
CharBlock source;
39253938
std::variant<OpenMPDeclarativeAllocate, OpenMPDeclareReductionConstruct,
39263939
OpenMPDeclareSimdConstruct, OpenMPDeclareTargetConstruct,
3927-
OpenMPThreadprivate, OpenMPRequiresConstruct>
3940+
OpenMPThreadprivate, OpenMPRequiresConstruct,
3941+
OpenMPDeclareMapperConstruct>
39283942
u;
39293943
};
39303944

flang/lib/Lower/OpenMP/OpenMP.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2597,6 +2597,13 @@ genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
25972597
TODO(converter.getCurrentLocation(), "OpenMPDeclareSimdConstruct");
25982598
}
25992599

2600+
static void
2601+
genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
2602+
semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,
2603+
const parser::OpenMPDeclareMapperConstruct &declareMapperConstruct) {
2604+
TODO(converter.getCurrentLocation(), "OpenMPDeclareMapperConstruct");
2605+
}
2606+
26002607
static void
26012608
genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
26022609
semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,

flang/lib/Parser/openmp-parsers.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -836,6 +836,16 @@ TYPE_PARSER(
836836
TYPE_PARSER(sourced(construct<OpenMPDeclareTargetConstruct>(
837837
verbatim("DECLARE TARGET"_tok), Parser<OmpDeclareTargetSpecifier>{})))
838838

839+
// declare-mapper-specifier
840+
TYPE_PARSER(construct<OmpDeclareMapperSpecifier>(
841+
maybe(name / ":" / !":"_tok), typeSpec / "::", name))
842+
843+
// ?.? (not 4.5) Declare Mapper Construct
844+
TYPE_PARSER(sourced(
845+
construct<OpenMPDeclareMapperConstruct>(verbatim("DECLARE MAPPER"_tok),
846+
"(" >> Parser<OmpDeclareMapperSpecifier>{} / ")",
847+
many("MAP" >> parenthesized(many(Parser<OmpMapClause>{}))))))
848+
839849
TYPE_PARSER(construct<OmpReductionCombiner>(Parser<AssignmentStmt>{}) ||
840850
construct<OmpReductionCombiner>(
841851
construct<OmpReductionCombiner::FunctionCombiner>(
@@ -944,6 +954,8 @@ TYPE_PARSER(startOmpLine >>
944954
withMessage("expected OpenMP construct"_err_en_US,
945955
sourced(construct<OpenMPDeclarativeConstruct>(
946956
Parser<OpenMPDeclareReductionConstruct>{}) ||
957+
construct<OpenMPDeclarativeConstruct>(
958+
Parser<OpenMPDeclareMapperConstruct>{}) ||
947959
construct<OpenMPDeclarativeConstruct>(
948960
Parser<OpenMPDeclareSimdConstruct>{}) ||
949961
construct<OpenMPDeclarativeConstruct>(

flang/lib/Parser/unparse.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2665,6 +2665,29 @@ class UnparseVisitor {
26652665
EndOpenMP();
26662666
return false;
26672667
},
2668+
[&](const OpenMPDeclareMapperConstruct &z) {
2669+
Word("DECLARE MAPPER (");
2670+
const auto &spec{std::get<OmpDeclareMapperSpecifier>(z.t)};
2671+
if (auto mapname{std::get<std::optional<Name>>(spec.t)}) {
2672+
Walk(mapname);
2673+
Put(":");
2674+
}
2675+
Walk(std::get<TypeSpec>(spec.t));
2676+
Put("::");
2677+
Walk(std::get<Name>(spec.t));
2678+
Put(")");
2679+
2680+
const auto &list{
2681+
std::get<std::list<std::list<Fortran::parser::OmpMapClause>>>(
2682+
z.t)};
2683+
for (const auto &m : list) {
2684+
Put(" MAP(");
2685+
Walk(m);
2686+
Put(")");
2687+
}
2688+
Put("\n");
2689+
return false;
2690+
},
26682691
[&](const OpenMPDeclareReductionConstruct &) {
26692692
Word("DECLARE REDUCTION ");
26702693
return true;

flang/lib/Semantics/resolve-directives.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,9 @@ class OmpAttributeVisitor : DirectiveAttributeVisitor<llvm::omp::Directive> {
431431
bool Pre(const parser::OpenMPDeclareTargetConstruct &);
432432
void Post(const parser::OpenMPDeclareTargetConstruct &) { PopContext(); }
433433

434+
bool Pre(const parser::OpenMPDeclareMapperConstruct &);
435+
void Post(const parser::OpenMPDeclareMapperConstruct &) { PopContext(); }
436+
434437
bool Pre(const parser::OpenMPThreadprivate &);
435438
void Post(const parser::OpenMPThreadprivate &) { PopContext(); }
436439

@@ -1944,6 +1947,12 @@ bool OmpAttributeVisitor::Pre(const parser::OpenMPDeclareTargetConstruct &x) {
19441947
return true;
19451948
}
19461949

1950+
bool OmpAttributeVisitor::Pre(const parser::OpenMPDeclareMapperConstruct &x) {
1951+
PushContext(x.source, llvm::omp::Directive::OMPD_declare_mapper);
1952+
1953+
return true;
1954+
}
1955+
19471956
bool OmpAttributeVisitor::Pre(const parser::OpenMPThreadprivate &x) {
19481957
PushContext(x.source, llvm::omp::Directive::OMPD_threadprivate);
19491958
const auto &list{std::get<parser::OmpObjectList>(x.t)};

flang/lib/Semantics/resolve-names.cpp

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1058,6 +1058,7 @@ class DeclarationVisitor : public ArraySpecVisitor,
10581058
const parser::Name *ResolveDesignator(const parser::Designator &);
10591059
int GetVectorElementKind(
10601060
TypeCategory category, const std::optional<parser::KindSelector> &kind);
1061+
std::optional<DerivedTypeSpec> ResolveDerivedType(const parser::Name &);
10611062

10621063
protected:
10631064
bool BeginDecl();
@@ -1205,7 +1206,6 @@ class DeclarationVisitor : public ArraySpecVisitor,
12051206
Symbol &DeclareProcEntity(
12061207
const parser::Name &, Attrs, const Symbol *interface);
12071208
void SetType(const parser::Name &, const DeclTypeSpec &);
1208-
std::optional<DerivedTypeSpec> ResolveDerivedType(const parser::Name &);
12091209
std::optional<DerivedTypeSpec> ResolveExtendsType(
12101210
const parser::Name &, const parser::Name *);
12111211
Symbol *MakeTypeSymbol(const SourceName &, Details &&);
@@ -1468,6 +1468,10 @@ class OmpVisitor : public virtual DeclarationVisitor {
14681468
AddOmpSourceRange(x.source);
14691469
return true;
14701470
}
1471+
1472+
bool Pre(const parser::OpenMPDeclareMapperConstruct &);
1473+
void Post(const parser::OpenMPDeclareMapperConstruct &) { PopScope(); };
1474+
14711475
void Post(const parser::OmpBeginLoopDirective &) {
14721476
messageHandler().set_currStmtSource(std::nullopt);
14731477
}
@@ -1605,6 +1609,26 @@ void OmpVisitor::Post(const parser::OpenMPBlockConstruct &x) {
16051609
}
16061610
}
16071611

1612+
bool OmpVisitor::Pre(const parser::OpenMPDeclareMapperConstruct &x) {
1613+
AddOmpSourceRange(x.source);
1614+
BeginDeclTypeSpec();
1615+
PushScope(Scope::Kind::OtherConstruct, nullptr);
1616+
const auto &spec{std::get<parser::OmpDeclareMapperSpecifier>(x.t)};
1617+
if (const auto &mapperName{
1618+
std::get<std::optional<Fortran::parser::Name>>(spec.t)}) {
1619+
Symbol *mapperSym{&MakeSymbol(*mapperName, Attrs{})};
1620+
mapperName->symbol = mapperSym;
1621+
}
1622+
Walk(std::get<Fortran::parser::TypeSpec>(spec.t));
1623+
const auto &varName{std::get<Fortran::parser::ObjectName>(spec.t)};
1624+
DeclareObjectEntity(varName);
1625+
1626+
Walk(std::get<std::list<std::list<Fortran::parser::OmpMapClause>>>(x.t));
1627+
1628+
EndDeclTypeSpec();
1629+
return false;
1630+
}
1631+
16081632
// Walk the parse tree and resolve names to symbols.
16091633
class ResolveNamesVisitor : public virtual ScopeHandler,
16101634
public ModuleVisitor,
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
! This test checks lowering of OpenMP declare mapper Directive.
2+
3+
! RUN: split-file %s %t
4+
! RUN: not %flang_fc1 -emit-fir -fopenmp %t/omp-declare-mapper-1.f90 2>&1 | FileCheck %t/omp-declare-mapper-1.f90
5+
! RUN not %flang_fc1 -emit-fir -fopenmp %t/omp-declare-mapper-2.f90 2>&1 | FileCheck %t/omp-declare-mapper-2.f90
6+
7+
!--- omp-declare-mapper-1.f90
8+
subroutine declare_mapper_1
9+
integer,parameter :: nvals = 250
10+
type my_type
11+
integer :: num_vals
12+
integer, allocatable :: values(:)
13+
end type
14+
15+
type my_type2
16+
type (my_type) :: my_type_var
17+
type (my_type) :: temp
18+
real,dimension(nvals) :: unmapped
19+
real,dimension(nvals) :: arr
20+
end type
21+
type (my_type2) :: t
22+
real :: x, y(nvals)
23+
!$omp declare mapper (my_type :: var) map (var, var%values (1:var%num_vals))
24+
!CHECK: not yet implemented: OpenMPDeclareMapperConstruct
25+
end subroutine declare_mapper_1
26+
27+
28+
!--- omp-declare-mapper-2.f90
29+
subroutine declare_mapper_2
30+
integer,parameter :: nvals = 250
31+
type my_type
32+
integer :: num_vals
33+
integer, allocatable :: values(:)
34+
end type
35+
36+
type my_type2
37+
type (my_type) :: my_type_var
38+
type (my_type) :: temp
39+
real,dimension(nvals) :: unmapped
40+
real,dimension(nvals) :: arr
41+
end type
42+
type (my_type2) :: t
43+
real :: x, y(nvals)
44+
!$omp declare mapper (my_mapper : my_type2 :: v) map (v%arr, x, y(:)) &
45+
!$omp& map (alloc : v%temp)
46+
!CHECK: not yet implemented: OpenMPDeclareMapperConstruct
47+
end subroutine declare_mapper_2
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
! RUN: %flang_fc1 -fdebug-unparse-no-sema -fopenmp %s | FileCheck --ignore-case %s
2+
! RUN: %flang_fc1 -fdebug-dump-parse-tree-no-sema -fopenmp %s | FileCheck --check-prefix="PARSE-TREE" %s
3+
program main
4+
!CHECK-LABEL: program main
5+
implicit none
6+
7+
type ty
8+
integer :: x
9+
end type ty
10+
11+
12+
!CHECK: !$OMP DECLARE MAPPER (mymapper:ty::mapped) MAP(mapped,mapped%x)
13+
!$omp declare mapper(mymapper : ty :: mapped) map(mapped, mapped%x)
14+
15+
!PARSE-TREE: OpenMPDeclareMapperConstruct
16+
!PARSE-TREE: OmpDeclareMapperSpecifier
17+
!PARSE-TREE: Name = 'mymapper'
18+
!PARSE-TREE: TypeSpec -> DerivedTypeSpec
19+
!PARSE-TREE: Name = 'ty'
20+
!PARSE-TREE: Name = 'mapped'
21+
!PARSE-TREE: OmpMapClause
22+
!PARSE-TREE: OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'mapped'
23+
!PARSE-TREE: OmpObject -> Designator -> DataRef -> StructureComponent
24+
!PARSE-TREE: DataRef -> Name = 'mapped'
25+
!PARSE-TREE: Name = 'x'
26+
27+
end program main
28+
!CHECK-LABEL: end program main

0 commit comments

Comments
 (0)