16
16
17
17
#include " llvm/ADT/STLExtras.h"
18
18
#include " llvm/ADT/bit.h"
19
- #include " llvm/Frontend/OpenACC/ACC.h.inc"
19
+
20
+ using namespace clang ;
20
21
21
22
namespace {
22
23
// Implements a simple 'enum-set' which stores enum values in a single 64 bit
@@ -25,41 +26,34 @@ namespace {
25
26
class AccClauseSet {
26
27
// We're just using a uint64_t as our underlying rep, so if this size ever
27
28
// gets bigger than 64, we probably need a pair of uint64_ts.
28
- static_assert (llvm::acc::Clause_enumSize <= 64 );
29
+ static_assert (static_assert< unsigned >(OpenACCClauseKind::Invalid) < 64 );
29
30
uint64_t Data;
30
31
31
- void setBit (llvm::acc::Clause C) {
32
+ void setBit (OpenACCClauseKind C) {
32
33
Data |= static_cast <uint64_t >(1 ) << static_cast <uint64_t >(C);
33
34
}
34
35
35
36
public:
36
37
constexpr AccClauseSet (
37
- const std::initializer_list<llvm::acc::Clause > &Clauses)
38
+ const std::initializer_list<OpenACCClauseKind > &Clauses)
38
39
: Data(0 ) {
39
- for (llvm::acc::Clause C : Clauses)
40
+ for (OpenACCClauseKind C : Clauses)
40
41
setBit (C);
41
42
}
42
43
43
- constexpr bool isSet (llvm::acc::Clause C) const {
44
+ constexpr bool isSet (OpenACCClauseKind C) const {
44
45
return ((Data >> static_cast <uint64_t >(C)) & 1 ) != 0 ;
45
46
}
46
47
47
- void clearBit (llvm::acc::Clause C) {
48
+ void clearBit (OpenACCClauseKind C) {
48
49
Data &= ~(static_cast <uint64_t >(1 ) << static_cast <uint64_t >(C));
49
50
}
50
51
51
52
constexpr bool isEmpty () const { return Data == 0 ; }
52
53
53
54
unsigned popcount () const { return llvm::popcount<uint64_t >(Data); }
54
55
};
55
- } // namespace
56
-
57
- #define GEN_FLANG_DIRECTIVE_CLAUSE_SETS
58
- #include " llvm/Frontend/OpenACC/ACC.inc"
59
-
60
- using namespace clang ;
61
56
62
- namespace {
63
57
struct LLVMClauseLists {
64
58
AccClauseSet Allowed;
65
59
AccClauseSet AllowedOnce;
@@ -71,136 +65,19 @@ struct LLVMDirectiveClauseRelationships {
71
65
LLVMClauseLists Lists;
72
66
};
73
67
74
- LLVMDirectiveClauseRelationships Relations[] =
75
- #define GEN_FLANG_DIRECTIVE_CLAUSE_MAP
76
- #include " llvm/Frontend/OpenACC/ACC.inc"
77
- ;
78
-
79
- llvm::acc::Directive
80
- getLLVMDirectiveFromClangDirective (OpenACCDirectiveKind DK) {
81
- // FIXME: There isn't any obvious way to do this automatically, but perhaps we
82
- // could figure out one?
83
- switch (DK) {
84
- case OpenACCDirectiveKind::Parallel:
85
- return llvm::acc::Directive::ACCD_parallel;
86
- case OpenACCDirectiveKind::Serial:
87
- return llvm::acc::Directive::ACCD_serial;
88
- case OpenACCDirectiveKind::Kernels:
89
- return llvm::acc::Directive::ACCD_kernels;
90
- case OpenACCDirectiveKind::Data:
91
- return llvm::acc::Directive::ACCD_data;
92
- case OpenACCDirectiveKind::EnterData:
93
- return llvm::acc::Directive::ACCD_enter_data;
94
- case OpenACCDirectiveKind::ExitData:
95
- return llvm::acc::Directive::ACCD_exit_data;
96
- case OpenACCDirectiveKind::HostData:
97
- return llvm::acc::Directive::ACCD_host_data;
98
- case OpenACCDirectiveKind::Loop:
99
- return llvm::acc::Directive::ACCD_loop;
100
- case OpenACCDirectiveKind::Cache:
101
- return llvm::acc::Directive::ACCD_cache;
102
- case OpenACCDirectiveKind::ParallelLoop:
103
- return llvm::acc::Directive::ACCD_parallel_loop;
104
- case OpenACCDirectiveKind::SerialLoop:
105
- return llvm::acc::Directive::ACCD_serial_loop;
106
- case OpenACCDirectiveKind::KernelsLoop:
107
- return llvm::acc::Directive::ACCD_kernels_loop;
108
- case OpenACCDirectiveKind::Atomic:
109
- return llvm::acc::Directive::ACCD_atomic;
110
- case OpenACCDirectiveKind::Declare:
111
- return llvm::acc::Directive::ACCD_declare;
112
- case OpenACCDirectiveKind::Init:
113
- return llvm::acc::Directive::ACCD_init;
114
- case OpenACCDirectiveKind::Shutdown:
115
- return llvm::acc::Directive::ACCD_shutdown;
116
- case OpenACCDirectiveKind::Set:
117
- return llvm::acc::Directive::ACCD_set;
118
- case OpenACCDirectiveKind::Update:
119
- return llvm::acc::Directive::ACCD_update;
120
- case OpenACCDirectiveKind::Wait:
121
- return llvm::acc::Directive::ACCD_wait;
122
- case OpenACCDirectiveKind::Routine:
123
- return llvm::acc::Directive::ACCD_routine;
124
- case OpenACCDirectiveKind::Invalid:
125
- llvm_unreachable (" Shouldn't get here with an invalid directive" );
126
- }
127
-
128
- llvm_unreachable (" unhandled directive kind" );
129
- }
130
-
131
- // FIXME: There isn't any obvious way to do this automatically, but perhaps we
132
- // could figure out one?
133
- std::pair<OpenACCClauseKind, llvm::acc::Clause> ClauseEquivs[]{
134
- {OpenACCClauseKind::Finalize, llvm::acc::Clause::ACCC_finalize},
135
- {OpenACCClauseKind::IfPresent, llvm::acc::Clause::ACCC_if_present},
136
- {OpenACCClauseKind::Seq, llvm::acc::Clause::ACCC_seq},
137
- {OpenACCClauseKind::Independent, llvm::acc::Clause::ACCC_independent},
138
- {OpenACCClauseKind::Auto, llvm::acc::Clause::ACCC_auto},
139
- {OpenACCClauseKind::Worker, llvm::acc::Clause::ACCC_worker},
140
- {OpenACCClauseKind::Vector, llvm::acc::Clause::ACCC_vector},
141
- {OpenACCClauseKind::NoHost, llvm::acc::Clause::ACCC_nohost},
142
- {OpenACCClauseKind::Default, llvm::acc::Clause::ACCC_default},
143
- {OpenACCClauseKind::If, llvm::acc::Clause::ACCC_if},
144
- {OpenACCClauseKind::Self, llvm::acc::Clause::ACCC_self},
145
- {OpenACCClauseKind::Copy, llvm::acc::Clause::ACCC_copy},
146
- {OpenACCClauseKind::PCopy, llvm::acc::Clause::ACCC_copy},
147
- {OpenACCClauseKind::PresentOrCopy, llvm::acc::Clause::ACCC_copy},
148
- {OpenACCClauseKind::UseDevice, llvm::acc::Clause::ACCC_use_device},
149
- {OpenACCClauseKind::Attach, llvm::acc::Clause::ACCC_attach},
150
- {OpenACCClauseKind::Delete, llvm::acc::Clause::ACCC_delete},
151
- {OpenACCClauseKind::Detach, llvm::acc::Clause::ACCC_detach},
152
- {OpenACCClauseKind::Device, llvm::acc::Clause::ACCC_device},
153
- {OpenACCClauseKind::DevicePtr, llvm::acc::Clause::ACCC_deviceptr},
154
- {OpenACCClauseKind::DeviceResident,
155
- llvm::acc::Clause::ACCC_device_resident},
156
- {OpenACCClauseKind::FirstPrivate, llvm::acc::Clause::ACCC_firstprivate},
157
- {OpenACCClauseKind::Host, llvm::acc::Clause::ACCC_host},
158
- {OpenACCClauseKind::Link, llvm::acc::Clause::ACCC_link},
159
- {OpenACCClauseKind::NoCreate, llvm::acc::Clause::ACCC_no_create},
160
- {OpenACCClauseKind::Present, llvm::acc::Clause::ACCC_present},
161
- {OpenACCClauseKind::Private, llvm::acc::Clause::ACCC_private},
162
- {OpenACCClauseKind::CopyOut, llvm::acc::Clause::ACCC_copyout},
163
- {OpenACCClauseKind::PCopyOut, llvm::acc::Clause::ACCC_copyout},
164
- {OpenACCClauseKind::PresentOrCopyOut, llvm::acc::Clause::ACCC_copyout},
165
- {OpenACCClauseKind::CopyIn, llvm::acc::Clause::ACCC_copyin},
166
- {OpenACCClauseKind::PCopyIn, llvm::acc::Clause::ACCC_copyin},
167
- {OpenACCClauseKind::PresentOrCopyIn, llvm::acc::Clause::ACCC_copyin},
168
- {OpenACCClauseKind::Create, llvm::acc::Clause::ACCC_create},
169
- {OpenACCClauseKind::PCreate, llvm::acc::Clause::ACCC_create},
170
- {OpenACCClauseKind::PresentOrCreate, llvm::acc::Clause::ACCC_create},
171
- {OpenACCClauseKind::Reduction, llvm::acc::Clause::ACCC_reduction},
172
- {OpenACCClauseKind::Collapse, llvm::acc::Clause::ACCC_collapse},
173
- {OpenACCClauseKind::Bind, llvm::acc::Clause::ACCC_bind},
174
- {OpenACCClauseKind::VectorLength, llvm::acc::Clause::ACCC_vector_length},
175
- {OpenACCClauseKind::NumGangs, llvm::acc::Clause::ACCC_num_gangs},
176
- {OpenACCClauseKind::NumWorkers, llvm::acc::Clause::ACCC_num_workers},
177
- {OpenACCClauseKind::DeviceNum, llvm::acc::Clause::ACCC_device_num},
178
- {OpenACCClauseKind::DefaultAsync, llvm::acc::Clause::ACCC_default_async},
179
- {OpenACCClauseKind::DeviceType, llvm::acc::Clause::ACCC_device_type},
180
- {OpenACCClauseKind::DType, llvm::acc::Clause::ACCC_device_type},
181
- {OpenACCClauseKind::Async, llvm::acc::Clause::ACCC_async},
182
- {OpenACCClauseKind::Tile, llvm::acc::Clause::ACCC_tile},
183
- {OpenACCClauseKind::Gang, llvm::acc::Clause::ACCC_gang},
184
- {OpenACCClauseKind::Wait, llvm::acc::Clause::ACCC_wait}};
185
-
186
- llvm::acc::Clause getLLVMClauseFromClangClause (OpenACCClauseKind CK) {
187
- assert (CK != OpenACCClauseKind::Invalid);
188
-
189
- auto *Res =
190
- llvm::find_if (ClauseEquivs, [=](auto Ref) { return CK == Ref.first ; });
191
- assert (Res && " Unhandled clause kind" );
192
-
193
- return Res->second ;
194
- }
68
+ } // namespace
195
69
196
- OpenACCClauseKind getClangClauseFromLLVMClause (llvm::acc::Clause CK) {
70
+ // TODO: ERICH: WOULD NEED Own DIRECTIVE_CLAUSE_SETS
71
+ #define GEN_CLANG_DIRECTIVE_CLAUSE_SETS
72
+ #include " llvm/Frontend/OpenACC/ACC.inc"
197
73
198
- auto *Res =
199
- llvm::find_if (ClauseEquivs, [=](auto Ref) { return CK == Ref.second ; });
200
- assert (Res && " Unhandled clause kind" );
74
+ namespace {
201
75
202
- return Res->first ;
203
- }
76
+ // TODO: ERIHC: WOULD NEED ON DIRECTIVE_CLAUSE_MAP
77
+ LLVMDirectiveClauseRelationships Relations[] =
78
+ #define GEN_CLANG_DIRECTIVE_CLAUSE_MAP
79
+ #include " llvm/Frontend/OpenACC/ACC.inc"
80
+ ;
204
81
205
82
const LLVMClauseLists &getListsForDirective (OpenACCDirectiveKind DK) {
206
83
@@ -220,13 +97,13 @@ std::string getListOfClauses(AccClauseSet Set) {
220
97
std::string Output;
221
98
llvm::raw_string_ostream OS{Output};
222
99
223
- for (unsigned I = 0 ; I < llvm::acc::Clause_enumSize; ++I) {
224
- llvm::acc::Clause CurClause = static_cast <llvm::acc::Clause>(I);
100
+ for (unsigned I = 0 ; I < static_cast <unsigned >(OpenACCClauseKind::Invalid);
101
+ ++I) {
102
+ OpenACCClauseKind CurClause = static_cast <OpenACCClauseKind>(I);
225
103
if (!Set.isSet (CurClause))
226
104
continue ;
227
105
228
- OpenACCClauseKind NewCK = getClangClauseFromLLVMClause (CurClause);
229
- OS << ' \' ' << NewCK << ' \' ' ;
106
+ OS << ' \' ' << CurClause << ' \' ' ;
230
107
231
108
Set.clearBit (CurClause);
232
109
@@ -259,7 +136,7 @@ bool SemaOpenACC::DiagnoseRequiredClauses(
259
136
return false ;
260
137
261
138
for (auto *C : Clauses) {
262
- if (Lists.Required .isSet (getLLVMClauseFromClangClause ( C->getClauseKind () )))
139
+ if (Lists.Required .isSet (C->getClauseKind ()))
263
140
return false ;
264
141
}
265
142
@@ -277,9 +154,7 @@ bool SemaOpenACC::DiagnoseAllowedOnceClauses(
277
154
return false ;
278
155
279
156
const LLVMClauseLists &Lists = getListsForDirective (DK);
280
- llvm::acc::Clause LLVMClause = getLLVMClauseFromClangClause (CK);
281
-
282
- if (!Lists.AllowedOnce .isSet (LLVMClause))
157
+ if (!Lists.AllowedOnce .isSet (CK))
283
158
return false ;
284
159
285
160
auto Res = llvm::find_if (Clauses, [=](const OpenACCClause *C) {
@@ -302,17 +177,14 @@ bool SemaOpenACC::DiagnoseExclusiveClauses(
302
177
if (DK == OpenACCDirectiveKind::Invalid || CK == OpenACCClauseKind::Invalid)
303
178
return false ;
304
179
305
- llvm::acc::Clause LLVMClause = getLLVMClauseFromClangClause (CK);
306
180
const LLVMClauseLists &Lists = getListsForDirective (DK);
307
181
308
182
// If this isn't on the list, this is fine.
309
- if (!Lists.AllowedExclusive .isSet (LLVMClause ))
183
+ if (!Lists.AllowedExclusive .isSet (CK ))
310
184
return false ;
311
185
312
186
for (const OpenACCClause *C : Clauses) {
313
- llvm::acc::Clause ExistingLLVMClause =
314
- getLLVMClauseFromClangClause (C->getClauseKind ());
315
- if (Lists.AllowedExclusive .isSet (ExistingLLVMClause)) {
187
+ if (Lists.AllowedExclusive .isSet (C->getClauseKind ())) {
316
188
Diag (ClauseLoc, diag::err_acc_clause_cannot_combine)
317
189
<< CK << C->getClauseKind () << DK;
318
190
Diag (C->getBeginLoc (), diag::note_acc_previous_clause_here);
@@ -331,10 +203,9 @@ bool SemaOpenACC::DiagnoseAllowedClauses(OpenACCDirectiveKind DK,
331
203
if (DK == OpenACCDirectiveKind::Invalid || CK == OpenACCClauseKind::Invalid)
332
204
return false ;
333
205
const LLVMClauseLists &Lists = getListsForDirective (DK);
334
- llvm::acc::Clause Clause = getLLVMClauseFromClangClause (CK);
335
206
336
- if (!Lists.Allowed .isSet (Clause ) && !Lists.AllowedOnce .isSet (Clause ) &&
337
- !Lists.AllowedExclusive .isSet (Clause ) && !Lists.Required .isSet (Clause ))
207
+ if (!Lists.Allowed .isSet (CK ) && !Lists.AllowedOnce .isSet (CK ) &&
208
+ !Lists.AllowedExclusive .isSet (CK ) && !Lists.Required .isSet (CK ))
338
209
return Diag (ClauseLoc, diag::err_acc_clause_appertainment) << DK << CK;
339
210
340
211
return false ;
0 commit comments