Skip to content

Commit 2531a15

Browse files
committed
[OpenACC] Implement 'device_type' clause parsing
'device_type' takes either an asterisk or a list of impementation specific identifiers. This patch implements the parsing for it. Additionally, 'dtype' is an alias for 'device_type', though we're implementing it as its own clause kind to improve future diagnostics, as this will allow us to differentiate the spellings.
1 parent 42b28c6 commit 2531a15

File tree

4 files changed

+173
-0
lines changed

4 files changed

+173
-0
lines changed

clang/include/clang/Basic/OpenACCKinds.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,12 @@ enum class OpenACCClauseKind {
232232
DeviceNum,
233233
/// 'default_async' clause, allowed on 'set' construct.
234234
DefaultAsync,
235+
/// 'device_type' clause, allowed on Constructs, 'data', 'init', 'shutdown',
236+
/// 'set', update', 'loop', 'routine', and Combined constructs.
237+
DeviceType,
238+
/// 'dtype' clause, an alias for 'device_type', stored separately for
239+
/// diagnostic purposes.
240+
DType,
235241

236242
/// Represents an invalid clause, for the purposes of parsing.
237243
Invalid,
@@ -348,6 +354,12 @@ inline const StreamingDiagnostic &operator<<(const StreamingDiagnostic &Out,
348354
case OpenACCClauseKind::DefaultAsync:
349355
return Out << "default_async";
350356

357+
case OpenACCClauseKind::DeviceType:
358+
return Out << "device_type";
359+
360+
case OpenACCClauseKind::DType:
361+
return Out << "dtype";
362+
351363
case OpenACCClauseKind::Invalid:
352364
return Out << "<invalid>";
353365
}

clang/include/clang/Parse/Parser.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3587,6 +3587,9 @@ class Parser : public CodeCompletionHandler {
35873587
/// Parses the clause kind of 'int-expr', which can be any integral
35883588
/// expression.
35893589
ExprResult ParseOpenACCIntExpr();
3590+
/// Parses the 'device-type-list', which is a list of identifiers.
3591+
bool ParseOpenACCDeviceTypeList();
3592+
35903593
private:
35913594
//===--------------------------------------------------------------------===//
35923595
// C++ 14: Templates [temp]

clang/lib/Parse/ParseOpenACC.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,9 @@ OpenACCClauseKind getOpenACCClauseKind(Token Tok) {
104104
.Case("device", OpenACCClauseKind::Device)
105105
.Case("device_num", OpenACCClauseKind::DeviceNum)
106106
.Case("device_resident", OpenACCClauseKind::DeviceResident)
107+
.Case("device_type", OpenACCClauseKind::DeviceType)
107108
.Case("deviceptr", OpenACCClauseKind::DevicePtr)
109+
.Case("dtype", OpenACCClauseKind::DType)
108110
.Case("finalize", OpenACCClauseKind::Finalize)
109111
.Case("firstprivate", OpenACCClauseKind::FirstPrivate)
110112
.Case("host", OpenACCClauseKind::Host)
@@ -488,6 +490,8 @@ ClauseParensKind getClauseParensKind(OpenACCDirectiveKind DirKind,
488490
case OpenACCClauseKind::NumWorkers:
489491
case OpenACCClauseKind::DeviceNum:
490492
case OpenACCClauseKind::DefaultAsync:
493+
case OpenACCClauseKind::DeviceType:
494+
case OpenACCClauseKind::DType:
491495
return ClauseParensKind::Required;
492496

493497
case OpenACCClauseKind::Auto:
@@ -580,6 +584,38 @@ bool Parser::ParseOpenACCClauseVarList(OpenACCClauseKind Kind) {
580584
}
581585
return false;
582586
}
587+
588+
/// OpenACC 3.3 Section 2.4:
589+
/// The argument to the device_type clause is a comma-separated list of one or
590+
/// more device architecture name identifiers, or an asterisk.
591+
///
592+
/// The syntax of the device_type clause is
593+
/// device_type( * )
594+
/// device_type( device-type-list )
595+
///
596+
/// The device_type clause may be abbreviated to dtype.
597+
bool Parser::ParseOpenACCDeviceTypeList() {
598+
599+
if (expectIdentifierOrKeyword(*this)) {
600+
SkipUntil(tok::r_paren, tok::annot_pragma_openacc_end,
601+
Parser::StopBeforeMatch);
602+
return false;
603+
}
604+
ConsumeToken();
605+
606+
while (!getCurToken().isOneOf(tok::r_paren, tok::annot_pragma_openacc_end)) {
607+
ExpectAndConsume(tok::comma);
608+
609+
if (expectIdentifierOrKeyword(*this)) {
610+
SkipUntil(tok::r_paren, tok::annot_pragma_openacc_end,
611+
Parser::StopBeforeMatch);
612+
return false;
613+
}
614+
ConsumeToken();
615+
}
616+
return false;
617+
}
618+
583619
// The OpenACC Clause List is a comma or space-delimited list of clauses (see
584620
// the comment on ParseOpenACCClauseList). The concept of a 'clause' doesn't
585621
// really have its owner grammar and each individual one has its own definition.
@@ -709,6 +745,16 @@ bool Parser::ParseOpenACCClauseParams(OpenACCDirectiveKind DirKind,
709745
return true;
710746
break;
711747
}
748+
case OpenACCClauseKind::DType:
749+
case OpenACCClauseKind::DeviceType:
750+
if (getCurToken().is(tok::star)) {
751+
// FIXME: We want to mark that this is an 'everything else' type of
752+
// device_type in Sema.
753+
ConsumeToken();
754+
} else if (ParseOpenACCDeviceTypeList()) {
755+
return true;
756+
}
757+
break;
712758
default:
713759
llvm_unreachable("Not a required parens type?");
714760
}

clang/test/ParserOpenACC/parse-clauses.c

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -907,6 +907,118 @@ void IntExprParsing() {
907907
// expected-error@+2{{invalid tag 'length' on 'worker' clause}}
908908
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
909909
#pragma acc loop worker(length:returns_int())
910+
}
911+
912+
void device_type() {
913+
// expected-error@+2{{expected '('}}
914+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
915+
#pragma acc parallel device_type
916+
// expected-error@+2{{expected '('}}
917+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
918+
#pragma acc parallel dtype
919+
920+
// expected-error@+4{{expected identifier}}
921+
// expected-error@+3{{expected ')'}}
922+
// expected-note@+2{{to match this '('}}
923+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
924+
#pragma acc parallel device_type(
925+
// expected-error@+4{{expected identifier}}
926+
// expected-error@+3{{expected ')'}}
927+
// expected-note@+2{{to match this '('}}
928+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
929+
#pragma acc parallel dtype(
930+
931+
// expected-error@+2{{expected identifier}}
932+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
933+
#pragma acc parallel device_type()
934+
// expected-error@+2{{expected identifier}}
935+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
936+
#pragma acc parallel dtype()
937+
938+
// expected-error@+3{{expected ')'}}
939+
// expected-note@+2{{to match this '('}}
940+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
941+
#pragma acc parallel device_type(*
942+
// expected-error@+3{{expected ')'}}
943+
// expected-note@+2{{to match this '('}}
944+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
945+
#pragma acc parallel dtype(*
946+
947+
// expected-error@+3{{expected ')'}}
948+
// expected-note@+2{{to match this '('}}
949+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
950+
#pragma acc parallel device_type(ident
951+
// expected-error@+3{{expected ')'}}
952+
// expected-note@+2{{to match this '('}}
953+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
954+
#pragma acc parallel dtype(ident
955+
956+
// expected-error@+4{{expected ','}}
957+
// expected-error@+3{{expected ')'}}
958+
// expected-note@+2{{to match this '('}}
959+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
960+
#pragma acc parallel device_type(ident ident2
961+
// expected-error@+4{{expected ','}}
962+
// expected-error@+3{{expected ')'}}
963+
// expected-note@+2{{to match this '('}}
964+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
965+
#pragma acc parallel dtype(ident ident2
966+
967+
// expected-error@+3{{expected ')'}}
968+
// expected-note@+2{{to match this '('}}
969+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
970+
#pragma acc parallel device_type(ident, ident2
971+
// expected-error@+3{{expected ')'}}
972+
// expected-note@+2{{to match this '('}}
973+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
974+
#pragma acc parallel dtype(ident, ident2
975+
976+
// expected-error@+2{{expected identifier}}
977+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
978+
#pragma acc parallel device_type(ident, ident2,)
979+
// expected-error@+2{{expected identifier}}
980+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
981+
#pragma acc parallel dtype(ident, ident2,)
982+
983+
// expected-error@+3{{expected ')'}}
984+
// expected-note@+2{{to match this '('}}
985+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
986+
#pragma acc parallel device_type(*,)
987+
// expected-error@+3{{expected ')'}}
988+
// expected-note@+2{{to match this '('}}
989+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
990+
#pragma acc parallel dtype(*,)
991+
992+
// expected-error@+3{{expected ')'}}
993+
// expected-note@+2{{to match this '('}}
994+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
995+
#pragma acc parallel device_type(*,ident)
996+
// expected-error@+3{{expected ')'}}
997+
// expected-note@+2{{to match this '('}}
998+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
999+
#pragma acc parallel dtype(*,ident)
1000+
1001+
// expected-error@+2{{expected identifier}}
1002+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
1003+
#pragma acc parallel device_type(ident, *)
1004+
// expected-error@+2{{expected identifier}}
1005+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
1006+
#pragma acc parallel dtype(ident, *)
1007+
1008+
// expected-error@+2{{expected identifier}}
1009+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
1010+
#pragma acc parallel device_type("foo", 54)
1011+
// expected-error@+2{{expected identifier}}
1012+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
1013+
#pragma acc parallel dtype(31, "bar")
1014+
1015+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
1016+
#pragma acc parallel device_type(ident, auto, int, float)
1017+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
1018+
#pragma acc parallel dtype(ident, auto, int, float)
1019+
1020+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
1021+
#pragma acc parallel device_type(ident, auto, int, float) dtype(ident, auto, int, float)
9101022
}
9111023

9121024
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}

0 commit comments

Comments
 (0)