Skip to content

Commit 7700ea1

Browse files
committed
[OpenACC] Implement the 'rest' of the simple 'var-list' clauses
A large number of clauses are simple, required parens with a var-list. This patch adds them all, as adding them is quite trivial.
1 parent ad100b3 commit 7700ea1

File tree

3 files changed

+194
-5
lines changed

3 files changed

+194
-5
lines changed

clang/include/clang/Basic/OpenACCKinds.h

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,37 @@ enum class OpenACCClauseKind {
103103
Copy,
104104
/// 'use_device' clause, allowed on 'host_data' construct.
105105
UseDevice,
106+
/// 'attach' clause, allowed on Compute and Combined constructs, plus 'data'
107+
/// and 'enter data'.
108+
Attach,
109+
/// 'delete' clause, allowed on the 'exit data' construct.
110+
Delete,
111+
/// 'detach' clause, allowed on the 'exit data' construct.
112+
Detach,
113+
/// 'device' clause, allowed on the 'update' construct.
114+
Device,
115+
/// 'deviceptr' clause, allowed on Compute and Combined Constructs, plus
116+
/// 'data' and 'declare'.
117+
DevicePtr,
118+
/// 'device_resident' clause, allowed on the 'declare' construct.
119+
DeviceResident,
120+
/// 'firstprivate' clause, allowed on 'parallel', 'serial', 'parallel loop',
121+
/// and 'serial loop' constructs.
122+
FirstPrivate,
123+
/// 'host' clause, allowed on 'update' construct.
124+
Host,
125+
/// 'link' clause, allowed on 'declare' construct.
126+
Link,
127+
/// 'no_create' clause, allowed on allowed on Compute and Combined constructs,
128+
/// plus 'data'.
129+
NoCreate,
130+
/// 'present' clause, allowed on Compute and Combined constructs, plus 'data'
131+
/// and 'declare'.
132+
Present,
133+
/// 'private' clause, allowed on 'parallel', 'serial', 'loop', 'parallel
134+
/// loop', and 'serial loop' constructs.
135+
Private,
136+
106137
/// Represents an invalid clause, for the purposes of parsing.
107138
Invalid,
108139
};

clang/lib/Parse/ParseOpenACC.cpp

Lines changed: 71 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -87,16 +87,29 @@ OpenACCClauseKind getOpenACCClauseKind(Token Tok) {
8787
if (!Tok.is(tok::identifier))
8888
return OpenACCClauseKind::Invalid;
8989

90+
// TODO: ERICH: add new clauses here.
9091
return llvm::StringSwitch<OpenACCClauseKind>(
9192
Tok.getIdentifierInfo()->getName())
93+
.Case("attach",OpenACCClauseKind::Attach)
9294
.Case("auto", OpenACCClauseKind::Auto)
9395
.Case("copy", OpenACCClauseKind::Copy)
9496
.Case("default", OpenACCClauseKind::Default)
97+
.Case("delete", OpenACCClauseKind::Delete)
98+
.Case("detach", OpenACCClauseKind::Detach)
99+
.Case("device", OpenACCClauseKind::Device)
100+
.Case("device_resident", OpenACCClauseKind::DeviceResident)
101+
.Case("deviceptr", OpenACCClauseKind::DevicePtr)
95102
.Case("finalize", OpenACCClauseKind::Finalize)
103+
.Case("firstprivate", OpenACCClauseKind::FirstPrivate)
104+
.Case("host", OpenACCClauseKind::Host)
96105
.Case("if", OpenACCClauseKind::If)
97106
.Case("if_present", OpenACCClauseKind::IfPresent)
98107
.Case("independent", OpenACCClauseKind::Independent)
108+
.Case("link", OpenACCClauseKind::Link)
109+
.Case("no_create", OpenACCClauseKind::NoCreate)
99110
.Case("nohost", OpenACCClauseKind::NoHost)
111+
.Case("present", OpenACCClauseKind::Present)
112+
.Case("private", OpenACCClauseKind::Private)
100113
.Case("self", OpenACCClauseKind::Self)
101114
.Case("seq", OpenACCClauseKind::Seq)
102115
.Case("use_device", OpenACCClauseKind::UseDevice)
@@ -331,14 +344,55 @@ OpenACCDirectiveKind ParseOpenACCDirectiveKind(Parser &P) {
331344
return DirKind;
332345
}
333346

347+
enum ClauseParensKind {
348+
None,
349+
Optional,
350+
Required
351+
};
352+
353+
ClauseParensKind getClauseParensKind(OpenACCClauseKind Kind) {
354+
switch (Kind) {
355+
case OpenACCClauseKind::Self:
356+
return ClauseParensKind::Optional;
357+
358+
case OpenACCClauseKind::Default:
359+
case OpenACCClauseKind::If:
360+
case OpenACCClauseKind::Copy:
361+
case OpenACCClauseKind::UseDevice:
362+
case OpenACCClauseKind::NoCreate:
363+
case OpenACCClauseKind::Present:
364+
case OpenACCClauseKind::DevicePtr:
365+
case OpenACCClauseKind::Attach:
366+
case OpenACCClauseKind::Detach:
367+
case OpenACCClauseKind::Private:
368+
case OpenACCClauseKind::FirstPrivate:
369+
case OpenACCClauseKind::Delete:
370+
case OpenACCClauseKind::DeviceResident:
371+
case OpenACCClauseKind::Device:
372+
case OpenACCClauseKind::Link:
373+
case OpenACCClauseKind::Host:
374+
return ClauseParensKind::Required;
375+
376+
case OpenACCClauseKind::Auto:
377+
case OpenACCClauseKind::Finalize:
378+
case OpenACCClauseKind::IfPresent:
379+
case OpenACCClauseKind::Independent:
380+
case OpenACCClauseKind::Invalid:
381+
case OpenACCClauseKind::NoHost:
382+
case OpenACCClauseKind::Seq:
383+
case OpenACCClauseKind::Worker:
384+
case OpenACCClauseKind::Vector:
385+
return ClauseParensKind::None;
386+
}
387+
llvm_unreachable("Unhandled clause kind");
388+
}
389+
334390
bool ClauseHasOptionalParens(OpenACCClauseKind Kind) {
335-
return Kind == OpenACCClauseKind::Self;
391+
return getClauseParensKind(Kind) == ClauseParensKind::Optional;
336392
}
337393

338394
bool ClauseHasRequiredParens(OpenACCClauseKind Kind) {
339-
return Kind == OpenACCClauseKind::Default || Kind == OpenACCClauseKind::If ||
340-
Kind == OpenACCClauseKind::Copy ||
341-
Kind == OpenACCClauseKind::UseDevice;
395+
return getClauseParensKind(Kind) == ClauseParensKind::Required;
342396
}
343397

344398
ExprResult ParseOpenACCConditionalExpr(Parser &P) {
@@ -463,8 +517,20 @@ bool Parser::ParseOpenACCClauseParams(OpenACCClauseKind Kind) {
463517
return true;
464518
break;
465519
}
466-
case OpenACCClauseKind::UseDevice:
520+
case OpenACCClauseKind::Attach:
467521
case OpenACCClauseKind::Copy:
522+
case OpenACCClauseKind::Delete:
523+
case OpenACCClauseKind::Detach:
524+
case OpenACCClauseKind::Device:
525+
case OpenACCClauseKind::DeviceResident:
526+
case OpenACCClauseKind::DevicePtr:
527+
case OpenACCClauseKind::FirstPrivate:
528+
case OpenACCClauseKind::Host:
529+
case OpenACCClauseKind::Link:
530+
case OpenACCClauseKind::NoCreate:
531+
case OpenACCClauseKind::Present:
532+
case OpenACCClauseKind::Private:
533+
case OpenACCClauseKind::UseDevice:
468534
if (ParseOpenACCClauseVarList(Kind))
469535
return true;
470536
break;

clang/test/ParserOpenACC/parse-clauses.c

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,98 @@ void VarListClauses() {
405405

406406
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
407407
#pragma acc serial use_device(s.array[s.value : 5]), seq
408+
409+
// expected-error@+2{{expected ','}}
410+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
411+
#pragma acc serial no_create(s.array[s.value] s.array[s.value :5] ), seq
412+
413+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
414+
#pragma acc serial no_create(s.array[s.value : 5], s.value), seq
415+
416+
// expected-error@+2{{expected ','}}
417+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
418+
#pragma acc serial present(s.array[s.value] s.array[s.value :5] ), seq
419+
420+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
421+
#pragma acc serial present(s.array[s.value : 5], s.value), seq
422+
423+
// expected-error@+2{{expected ','}}
424+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
425+
#pragma acc serial deviceptr(s.array[s.value] s.array[s.value :5] ), seq
426+
427+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
428+
#pragma acc serial deviceptr(s.array[s.value : 5], s.value), seq
429+
430+
// expected-error@+2{{expected ','}}
431+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
432+
#pragma acc serial attach(s.array[s.value] s.array[s.value :5] ), seq
433+
434+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
435+
#pragma acc serial attach(s.array[s.value : 5], s.value), seq
436+
437+
// expected-error@+2{{expected ','}}
438+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
439+
#pragma acc serial detach(s.array[s.value] s.array[s.value :5] ), seq
440+
441+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
442+
#pragma acc serial detach(s.array[s.value : 5], s.value), seq
443+
444+
// expected-error@+2{{expected ','}}
445+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
446+
#pragma acc serial private(s.array[s.value] s.array[s.value :5] ), seq
447+
448+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
449+
#pragma acc serial private(s.array[s.value : 5], s.value), seq
450+
451+
// expected-error@+2{{expected ','}}
452+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
453+
#pragma acc serial firstprivate(s.array[s.value] s.array[s.value :5] ), seq
454+
455+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
456+
#pragma acc serial firstprivate(s.array[s.value : 5], s.value), seq
457+
458+
// expected-error@+2{{expected ','}}
459+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
460+
#pragma acc serial delete(s.array[s.value] s.array[s.value :5] ), seq
461+
462+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
463+
#pragma acc serial delete(s.array[s.value : 5], s.value), seq
464+
465+
// expected-error@+2{{expected ','}}
466+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
467+
#pragma acc serial use_device(s.array[s.value] s.array[s.value :5] ), seq
468+
469+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
470+
#pragma acc serial use_device(s.array[s.value : 5], s.value), seq
471+
472+
// expected-error@+2{{expected ','}}
473+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
474+
#pragma acc serial device_resident(s.array[s.value] s.array[s.value :5] ), seq
475+
476+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
477+
#pragma acc serial device_resident(s.array[s.value : 5], s.value), seq
478+
479+
// expected-error@+2{{expected ','}}
480+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
481+
#pragma acc serial link(s.array[s.value] s.array[s.value :5] ), seq
482+
483+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
484+
#pragma acc serial link(s.array[s.value : 5], s.value), seq
485+
486+
// expected-error@+2{{expected ','}}
487+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
488+
#pragma acc serial host(s.array[s.value] s.array[s.value :5] ), seq
489+
490+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
491+
#pragma acc serial host(s.array[s.value : 5], s.value), seq
492+
493+
// expected-error@+2{{expected ','}}
494+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
495+
#pragma acc serial device(s.array[s.value] s.array[s.value :5] ), seq
496+
497+
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
498+
#pragma acc serial device(s.array[s.value : 5], s.value), seq
499+
408500
}
409501

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

0 commit comments

Comments
 (0)