-
Notifications
You must be signed in to change notification settings - Fork 13.6k
[Flang][OMP]Add support for DECLARE MAPPER parsing and semantics #115160
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
8bc59ff
66b0170
3d810ef
98aca98
a5c72cc
085454a
3e563fd
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3872,6 +3872,19 @@ struct OpenMPDeclareTargetConstruct { | |
std::tuple<Verbatim, OmpDeclareTargetSpecifier> t; | ||
}; | ||
|
||
struct OmpDeclareMapperSpecifier { | ||
TUPLE_CLASS_BOILERPLATE(OmpDeclareMapperSpecifier); | ||
std::tuple<std::optional<Name>, TypeSpec, Name> t; | ||
TIFitis marked this conversation as resolved.
Show resolved
Hide resolved
|
||
}; | ||
|
||
struct OpenMPDeclareMapperConstruct { | ||
TUPLE_CLASS_BOILERPLATE(OpenMPDeclareMapperConstruct); | ||
CharBlock source; | ||
std::tuple<Verbatim, OmpDeclareMapperSpecifier, | ||
std::list<std::list<OmpMapClause>>> | ||
TIFitis marked this conversation as resolved.
Show resolved
Hide resolved
|
||
t; | ||
}; | ||
|
||
// 2.16 declare-reduction -> DECLARE REDUCTION (reduction-identifier : type-list | ||
// : combiner) [initializer-clause] | ||
struct OmpReductionCombiner { | ||
|
@@ -3924,7 +3937,8 @@ struct OpenMPDeclarativeConstruct { | |
CharBlock source; | ||
std::variant<OpenMPDeclarativeAllocate, OpenMPDeclareReductionConstruct, | ||
OpenMPDeclareSimdConstruct, OpenMPDeclareTargetConstruct, | ||
OpenMPThreadprivate, OpenMPRequiresConstruct> | ||
OpenMPThreadprivate, OpenMPRequiresConstruct, | ||
OpenMPDeclareMapperConstruct> | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Nit:put in alphabetical order There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done! |
||
u; | ||
}; | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -836,6 +836,16 @@ TYPE_PARSER( | |
TYPE_PARSER(sourced(construct<OpenMPDeclareTargetConstruct>( | ||
verbatim("DECLARE TARGET"_tok), Parser<OmpDeclareTargetSpecifier>{}))) | ||
|
||
// declare-mapper-specifier | ||
TYPE_PARSER(construct<OmpDeclareMapperSpecifier>( | ||
maybe(name / ":" / !":"_tok), typeSpec / "::", name)) | ||
|
||
// ?.? (not 4.5) Declare Mapper Construct | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can you quote the relevant section in the 5.2 standard? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done! |
||
TYPE_PARSER(sourced( | ||
construct<OpenMPDeclareMapperConstruct>(verbatim("DECLARE MAPPER"_tok), | ||
"(" >> Parser<OmpDeclareMapperSpecifier>{} / ")", | ||
many("MAP" >> parenthesized(many(Parser<OmpMapClause>{})))))) | ||
TIFitis marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
TYPE_PARSER(construct<OmpReductionCombiner>(Parser<AssignmentStmt>{}) || | ||
construct<OmpReductionCombiner>( | ||
construct<OmpReductionCombiner::FunctionCombiner>( | ||
|
@@ -944,6 +954,8 @@ TYPE_PARSER(startOmpLine >> | |
withMessage("expected OpenMP construct"_err_en_US, | ||
sourced(construct<OpenMPDeclarativeConstruct>( | ||
Parser<OpenMPDeclareReductionConstruct>{}) || | ||
construct<OpenMPDeclarativeConstruct>( | ||
Parser<OpenMPDeclareMapperConstruct>{}) || | ||
construct<OpenMPDeclarativeConstruct>( | ||
Parser<OpenMPDeclareSimdConstruct>{}) || | ||
construct<OpenMPDeclarativeConstruct>( | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -1058,6 +1058,7 @@ class DeclarationVisitor : public ArraySpecVisitor, | |
const parser::Name *ResolveDesignator(const parser::Designator &); | ||
int GetVectorElementKind( | ||
TypeCategory category, const std::optional<parser::KindSelector> &kind); | ||
std::optional<DerivedTypeSpec> ResolveDerivedType(const parser::Name &); | ||
TIFitis marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
protected: | ||
bool BeginDecl(); | ||
|
@@ -1205,7 +1206,6 @@ class DeclarationVisitor : public ArraySpecVisitor, | |
Symbol &DeclareProcEntity( | ||
const parser::Name &, Attrs, const Symbol *interface); | ||
void SetType(const parser::Name &, const DeclTypeSpec &); | ||
std::optional<DerivedTypeSpec> ResolveDerivedType(const parser::Name &); | ||
std::optional<DerivedTypeSpec> ResolveExtendsType( | ||
const parser::Name &, const parser::Name *); | ||
Symbol *MakeTypeSymbol(const SourceName &, Details &&); | ||
|
@@ -1468,6 +1468,10 @@ class OmpVisitor : public virtual DeclarationVisitor { | |
AddOmpSourceRange(x.source); | ||
return true; | ||
} | ||
|
||
bool Pre(const parser::OpenMPDeclareMapperConstruct &); | ||
void Post(const parser::OpenMPDeclareMapperConstruct &) { PopScope(); }; | ||
|
||
void Post(const parser::OmpBeginLoopDirective &) { | ||
messageHandler().set_currStmtSource(std::nullopt); | ||
} | ||
|
@@ -1605,6 +1609,26 @@ void OmpVisitor::Post(const parser::OpenMPBlockConstruct &x) { | |
} | ||
} | ||
|
||
bool OmpVisitor::Pre(const parser::OpenMPDeclareMapperConstruct &x) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please add a few comments saying what this function is doing and why everything is done in Pre? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done! There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't see a debug-dump-symbols test ( |
||
AddOmpSourceRange(x.source); | ||
BeginDeclTypeSpec(); | ||
PushScope(Scope::Kind::OtherConstruct, nullptr); | ||
TIFitis marked this conversation as resolved.
Show resolved
Hide resolved
|
||
const auto &spec{std::get<parser::OmpDeclareMapperSpecifier>(x.t)}; | ||
if (const auto &mapperName{ | ||
TIFitis marked this conversation as resolved.
Show resolved
Hide resolved
|
||
std::get<std::optional<Fortran::parser::Name>>(spec.t)}) { | ||
TIFitis marked this conversation as resolved.
Show resolved
Hide resolved
|
||
Symbol *mapperSym{&MakeSymbol(*mapperName, Attrs{})}; | ||
mapperName->symbol = mapperSym; | ||
} | ||
Walk(std::get<Fortran::parser::TypeSpec>(spec.t)); | ||
const auto &varName{std::get<Fortran::parser::ObjectName>(spec.t)}; | ||
DeclareObjectEntity(varName); | ||
|
||
Walk(std::get<std::list<std::list<Fortran::parser::OmpMapClause>>>(x.t)); | ||
|
||
EndDeclTypeSpec(); | ||
return false; | ||
} | ||
|
||
// Walk the parse tree and resolve names to symbols. | ||
class ResolveNamesVisitor : public virtual ScopeHandler, | ||
public ModuleVisitor, | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
! This test checks lowering of OpenMP declare mapper Directive. | ||
|
||
! RUN: split-file %s %t | ||
! RUN: not %flang_fc1 -emit-fir -fopenmp %t/omp-declare-mapper-1.f90 2>&1 | FileCheck %t/omp-declare-mapper-1.f90 | ||
! RUN not %flang_fc1 -emit-fir -fopenmp %t/omp-declare-mapper-2.f90 2>&1 | FileCheck %t/omp-declare-mapper-2.f90 | ||
|
||
!--- omp-declare-mapper-1.f90 | ||
subroutine declare_mapper_1 | ||
integer,parameter :: nvals = 250 | ||
type my_type | ||
integer :: num_vals | ||
integer, allocatable :: values(:) | ||
end type | ||
|
||
type my_type2 | ||
type (my_type) :: my_type_var | ||
type (my_type) :: temp | ||
real,dimension(nvals) :: unmapped | ||
real,dimension(nvals) :: arr | ||
end type | ||
type (my_type2) :: t | ||
real :: x, y(nvals) | ||
!$omp declare mapper (my_type :: var) map (var, var%values (1:var%num_vals)) | ||
!CHECK: not yet implemented: OpenMPDeclareMapperConstruct | ||
end subroutine declare_mapper_1 | ||
|
||
|
||
!--- omp-declare-mapper-2.f90 | ||
subroutine declare_mapper_2 | ||
integer,parameter :: nvals = 250 | ||
type my_type | ||
integer :: num_vals | ||
integer, allocatable :: values(:) | ||
end type | ||
|
||
type my_type2 | ||
type (my_type) :: my_type_var | ||
type (my_type) :: temp | ||
real,dimension(nvals) :: unmapped | ||
real,dimension(nvals) :: arr | ||
end type | ||
type (my_type2) :: t | ||
real :: x, y(nvals) | ||
!$omp declare mapper (my_mapper : my_type2 :: v) map (v%arr, x, y(:)) & | ||
!$omp& map (alloc : v%temp) | ||
!CHECK: not yet implemented: OpenMPDeclareMapperConstruct | ||
end subroutine declare_mapper_2 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
! RUN: %flang_fc1 -fdebug-unparse-no-sema -fopenmp %s | FileCheck --ignore-case %s | ||
kiranchandramohan marked this conversation as resolved.
Show resolved
Hide resolved
|
||
! RUN: %flang_fc1 -fdebug-dump-parse-tree-no-sema -fopenmp %s | FileCheck --check-prefix="PARSE-TREE" %s | ||
program main | ||
!CHECK-LABEL: program main | ||
implicit none | ||
|
||
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: OmpDeclareMapperSpecifier | ||
!PARSE-TREE: Name = 'mymapper' | ||
!PARSE-TREE: TypeSpec -> DerivedTypeSpec | ||
!PARSE-TREE: Name = 'ty' | ||
!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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ultra nit: some of the declarations in this file have a comment giving the OpenMP 5.2 section number and what the parsing looks like (e.g. see DECLARE REDUCTION below). It would be nice to see one here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Now fixed.