Skip to content

Commit a749b32

Browse files
committed
[flang][openacc] Support readonly modifier for declare copyin in module file
Distinguish between copyin and copyin with the readonly modifier. Depends on D157121 Reviewed By: razvanlupusoru Differential Revision: https://reviews.llvm.org/D157125
1 parent 6c45b0f commit a749b32

File tree

4 files changed

+24
-6
lines changed

4 files changed

+24
-6
lines changed

flang/include/flang/Semantics/symbol.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -594,8 +594,8 @@ class Symbol {
594594
// OpenACC data-sharing attribute
595595
AccPrivate, AccFirstPrivate, AccShared,
596596
// OpenACC data-mapping attribute
597-
AccCopy, AccCopyIn, AccCopyOut, AccCreate, AccDelete, AccPresent, AccLink,
598-
AccDeviceResident, AccDevicePtr,
597+
AccCopy, AccCopyIn, AccCopyInReadOnly, AccCopyOut, AccCreate, AccDelete,
598+
AccPresent, AccLink, AccDeviceResident, AccDevicePtr,
599599
// OpenACC declare
600600
AccDeclare,
601601
// OpenACC data-movement attribute

flang/lib/Semantics/mod-file.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -877,7 +877,8 @@ void PutOpenACCDirective(llvm::raw_ostream &os, const Symbol &symbol) {
877877
os << "!$acc declare ";
878878
if (symbol.test(Symbol::Flag::AccCopy)) {
879879
os << "copy";
880-
} else if (symbol.test(Symbol::Flag::AccCopyIn)) {
880+
} else if (symbol.test(Symbol::Flag::AccCopyIn) ||
881+
symbol.test(Symbol::Flag::AccCopyInReadOnly)) {
881882
os << "copyin";
882883
} else if (symbol.test(Symbol::Flag::AccCopyOut)) {
883884
os << "copyout";
@@ -892,7 +893,11 @@ void PutOpenACCDirective(llvm::raw_ostream &os, const Symbol &symbol) {
892893
} else if (symbol.test(Symbol::Flag::AccLink)) {
893894
os << "link";
894895
}
895-
os << "(" << symbol.name() << ")\n";
896+
os << "(";
897+
if (symbol.test(Symbol::Flag::AccCopyInReadOnly)) {
898+
os << "readonly: ";
899+
}
900+
os << symbol.name() << ")\n";
896901
}
897902
}
898903

flang/lib/Semantics/resolve-directives.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,14 @@ class AccAttributeVisitor : DirectiveAttributeVisitor<llvm::acc::Directive> {
167167

168168
bool Pre(const parser::AccClause::Copyin &x) {
169169
const auto &objectList{std::get<parser::AccObjectList>(x.v.t)};
170-
ResolveAccObjectList(objectList, Symbol::Flag::AccCopyIn);
170+
const auto &modifier{
171+
std::get<std::optional<parser::AccDataModifier>>(x.v.t)};
172+
if (modifier &&
173+
(*modifier).v == parser::AccDataModifier::Modifier::ReadOnly) {
174+
ResolveAccObjectList(objectList, Symbol::Flag::AccCopyInReadOnly);
175+
} else {
176+
ResolveAccObjectList(objectList, Symbol::Flag::AccCopyIn);
177+
}
171178
return false;
172179
}
173180

@@ -246,7 +253,8 @@ class AccAttributeVisitor : DirectiveAttributeVisitor<llvm::acc::Directive> {
246253
Symbol::Flag::AccDevice, Symbol::Flag::AccHost, Symbol::Flag::AccSelf};
247254

248255
Symbol::Flags accFlagsRequireMark{Symbol::Flag::AccCreate,
249-
Symbol::Flag::AccCopyIn, Symbol::Flag::AccCopy, Symbol::Flag::AccCopyOut,
256+
Symbol::Flag::AccCopyIn, Symbol::Flag::AccCopyInReadOnly,
257+
Symbol::Flag::AccCopy, Symbol::Flag::AccCopyOut,
250258
Symbol::Flag::AccDevicePtr, Symbol::Flag::AccDeviceResident,
251259
Symbol::Flag::AccLink, Symbol::Flag::AccPresent};
252260

flang/test/Semantics/OpenACC/acc-module.f90

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ module acc_mod
77
real :: data_copyin(10)
88
!$acc declare copyin(data_copyin)
99

10+
real :: data_copyinro(10)
11+
!$acc declare copyin(readonly: data_copyinro)
12+
1013
real :: data_device_resident(20)
1114
!$acc declare device_resident(data_device_resident)
1215

@@ -20,6 +23,8 @@ module acc_mod
2023
! !$acc declare create(data_create)
2124
! real(4)::data_copyin(1_8:10_8)
2225
! !$acc declare copyin(data_copyin)
26+
! real(4)::data_copyinro(1_8:10_8)
27+
! !$acc declare copyin(readonly: data_copyinro)
2328
! real(4)::data_device_resident(1_8:20_8)
2429
! !$acc declare device_resident(data_device_resident)
2530
! integer(4)::data_link(1_8:50_8)

0 commit comments

Comments
 (0)