1 //===- OpenMPClause.cpp - Classes for OpenMP clauses ----------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file implements the subclesses of Stmt class declared in OpenMPClause.h
10 //
11 //===----------------------------------------------------------------------===//
12
13 #include "clang/AST/OpenMPClause.h"
14 #include "clang/AST/ASTContext.h"
15 #include "clang/AST/Attr.h"
16 #include "clang/AST/Decl.h"
17 #include "clang/AST/DeclOpenMP.h"
18 #include "clang/Basic/LLVM.h"
19 #include "clang/Basic/OpenMPKinds.h"
20 #include "clang/Basic/TargetInfo.h"
21 #include "llvm/ADT/SmallPtrSet.h"
22 #include "llvm/Support/Casting.h"
23 #include "llvm/Support/ErrorHandling.h"
24 #include <algorithm>
25 #include <cassert>
26
27 using namespace clang;
28 using namespace llvm;
29 using namespace omp;
30
children()31 OMPClause::child_range OMPClause::children() {
32 switch (getClauseKind()) {
33 default:
34 break;
35 #define OMP_CLAUSE_CLASS(Enum, Str, Class) \
36 case Enum: \
37 return static_cast<Class *>(this)->children();
38 #include "llvm/Frontend/OpenMP/OMPKinds.def"
39 }
40 llvm_unreachable("unknown OMPClause");
41 }
42
used_children()43 OMPClause::child_range OMPClause::used_children() {
44 switch (getClauseKind()) {
45 #define OMP_CLAUSE_CLASS(Enum, Str, Class) \
46 case Enum: \
47 return static_cast<Class *>(this)->used_children();
48 #include "llvm/Frontend/OpenMP/OMPKinds.def"
49 case OMPC_threadprivate:
50 case OMPC_uniform:
51 case OMPC_device_type:
52 case OMPC_match:
53 case OMPC_unknown:
54 break;
55 default:
56 break;
57 }
58 llvm_unreachable("unknown OMPClause");
59 }
60
get(OMPClause * C)61 OMPClauseWithPreInit *OMPClauseWithPreInit::get(OMPClause *C) {
62 auto *Res = OMPClauseWithPreInit::get(const_cast<const OMPClause *>(C));
63 return Res ? const_cast<OMPClauseWithPreInit *>(Res) : nullptr;
64 }
65
get(const OMPClause * C)66 const OMPClauseWithPreInit *OMPClauseWithPreInit::get(const OMPClause *C) {
67 switch (C->getClauseKind()) {
68 case OMPC_schedule:
69 return static_cast<const OMPScheduleClause *>(C);
70 case OMPC_dist_schedule:
71 return static_cast<const OMPDistScheduleClause *>(C);
72 case OMPC_firstprivate:
73 return static_cast<const OMPFirstprivateClause *>(C);
74 case OMPC_lastprivate:
75 return static_cast<const OMPLastprivateClause *>(C);
76 case OMPC_reduction:
77 return static_cast<const OMPReductionClause *>(C);
78 case OMPC_task_reduction:
79 return static_cast<const OMPTaskReductionClause *>(C);
80 case OMPC_in_reduction:
81 return static_cast<const OMPInReductionClause *>(C);
82 case OMPC_linear:
83 return static_cast<const OMPLinearClause *>(C);
84 case OMPC_if:
85 return static_cast<const OMPIfClause *>(C);
86 case OMPC_num_threads:
87 return static_cast<const OMPNumThreadsClause *>(C);
88 case OMPC_num_teams:
89 return static_cast<const OMPNumTeamsClause *>(C);
90 case OMPC_thread_limit:
91 return static_cast<const OMPThreadLimitClause *>(C);
92 case OMPC_device:
93 return static_cast<const OMPDeviceClause *>(C);
94 case OMPC_grainsize:
95 return static_cast<const OMPGrainsizeClause *>(C);
96 case OMPC_num_tasks:
97 return static_cast<const OMPNumTasksClause *>(C);
98 case OMPC_final:
99 return static_cast<const OMPFinalClause *>(C);
100 case OMPC_priority:
101 return static_cast<const OMPPriorityClause *>(C);
102 case OMPC_default:
103 case OMPC_proc_bind:
104 case OMPC_safelen:
105 case OMPC_simdlen:
106 case OMPC_allocator:
107 case OMPC_allocate:
108 case OMPC_collapse:
109 case OMPC_private:
110 case OMPC_shared:
111 case OMPC_aligned:
112 case OMPC_copyin:
113 case OMPC_copyprivate:
114 case OMPC_ordered:
115 case OMPC_nowait:
116 case OMPC_untied:
117 case OMPC_mergeable:
118 case OMPC_threadprivate:
119 case OMPC_flush:
120 case OMPC_depobj:
121 case OMPC_read:
122 case OMPC_write:
123 case OMPC_update:
124 case OMPC_capture:
125 case OMPC_seq_cst:
126 case OMPC_acq_rel:
127 case OMPC_acquire:
128 case OMPC_release:
129 case OMPC_relaxed:
130 case OMPC_depend:
131 case OMPC_threads:
132 case OMPC_simd:
133 case OMPC_map:
134 case OMPC_nogroup:
135 case OMPC_hint:
136 case OMPC_defaultmap:
137 case OMPC_unknown:
138 case OMPC_uniform:
139 case OMPC_to:
140 case OMPC_from:
141 case OMPC_use_device_ptr:
142 case OMPC_use_device_addr:
143 case OMPC_is_device_ptr:
144 case OMPC_unified_address:
145 case OMPC_unified_shared_memory:
146 case OMPC_reverse_offload:
147 case OMPC_dynamic_allocators:
148 case OMPC_atomic_default_mem_order:
149 case OMPC_device_type:
150 case OMPC_match:
151 case OMPC_nontemporal:
152 case OMPC_order:
153 case OMPC_destroy:
154 case OMPC_detach:
155 case OMPC_inclusive:
156 case OMPC_exclusive:
157 case OMPC_uses_allocators:
158 case OMPC_affinity:
159 break;
160 default:
161 break;
162 }
163
164 return nullptr;
165 }
166
get(OMPClause * C)167 OMPClauseWithPostUpdate *OMPClauseWithPostUpdate::get(OMPClause *C) {
168 auto *Res = OMPClauseWithPostUpdate::get(const_cast<const OMPClause *>(C));
169 return Res ? const_cast<OMPClauseWithPostUpdate *>(Res) : nullptr;
170 }
171
get(const OMPClause * C)172 const OMPClauseWithPostUpdate *OMPClauseWithPostUpdate::get(const OMPClause *C) {
173 switch (C->getClauseKind()) {
174 case OMPC_lastprivate:
175 return static_cast<const OMPLastprivateClause *>(C);
176 case OMPC_reduction:
177 return static_cast<const OMPReductionClause *>(C);
178 case OMPC_task_reduction:
179 return static_cast<const OMPTaskReductionClause *>(C);
180 case OMPC_in_reduction:
181 return static_cast<const OMPInReductionClause *>(C);
182 case OMPC_linear:
183 return static_cast<const OMPLinearClause *>(C);
184 case OMPC_schedule:
185 case OMPC_dist_schedule:
186 case OMPC_firstprivate:
187 case OMPC_default:
188 case OMPC_proc_bind:
189 case OMPC_if:
190 case OMPC_final:
191 case OMPC_num_threads:
192 case OMPC_safelen:
193 case OMPC_simdlen:
194 case OMPC_allocator:
195 case OMPC_allocate:
196 case OMPC_collapse:
197 case OMPC_private:
198 case OMPC_shared:
199 case OMPC_aligned:
200 case OMPC_copyin:
201 case OMPC_copyprivate:
202 case OMPC_ordered:
203 case OMPC_nowait:
204 case OMPC_untied:
205 case OMPC_mergeable:
206 case OMPC_threadprivate:
207 case OMPC_flush:
208 case OMPC_depobj:
209 case OMPC_read:
210 case OMPC_write:
211 case OMPC_update:
212 case OMPC_capture:
213 case OMPC_seq_cst:
214 case OMPC_acq_rel:
215 case OMPC_acquire:
216 case OMPC_release:
217 case OMPC_relaxed:
218 case OMPC_depend:
219 case OMPC_device:
220 case OMPC_threads:
221 case OMPC_simd:
222 case OMPC_map:
223 case OMPC_num_teams:
224 case OMPC_thread_limit:
225 case OMPC_priority:
226 case OMPC_grainsize:
227 case OMPC_nogroup:
228 case OMPC_num_tasks:
229 case OMPC_hint:
230 case OMPC_defaultmap:
231 case OMPC_unknown:
232 case OMPC_uniform:
233 case OMPC_to:
234 case OMPC_from:
235 case OMPC_use_device_ptr:
236 case OMPC_use_device_addr:
237 case OMPC_is_device_ptr:
238 case OMPC_unified_address:
239 case OMPC_unified_shared_memory:
240 case OMPC_reverse_offload:
241 case OMPC_dynamic_allocators:
242 case OMPC_atomic_default_mem_order:
243 case OMPC_device_type:
244 case OMPC_match:
245 case OMPC_nontemporal:
246 case OMPC_order:
247 case OMPC_destroy:
248 case OMPC_detach:
249 case OMPC_inclusive:
250 case OMPC_exclusive:
251 case OMPC_uses_allocators:
252 case OMPC_affinity:
253 break;
254 default:
255 break;
256 }
257
258 return nullptr;
259 }
260
261 /// Gets the address of the original, non-captured, expression used in the
262 /// clause as the preinitializer.
getAddrOfExprAsWritten(Stmt * S)263 static Stmt **getAddrOfExprAsWritten(Stmt *S) {
264 if (!S)
265 return nullptr;
266 if (auto *DS = dyn_cast<DeclStmt>(S)) {
267 assert(DS->isSingleDecl() && "Only single expression must be captured.");
268 if (auto *OED = dyn_cast<OMPCapturedExprDecl>(DS->getSingleDecl()))
269 return OED->getInitAddress();
270 }
271 return nullptr;
272 }
273
used_children()274 OMPClause::child_range OMPIfClause::used_children() {
275 if (Stmt **C = getAddrOfExprAsWritten(getPreInitStmt()))
276 return child_range(C, C + 1);
277 return child_range(&Condition, &Condition + 1);
278 }
279
used_children()280 OMPClause::child_range OMPGrainsizeClause::used_children() {
281 if (Stmt **C = getAddrOfExprAsWritten(getPreInitStmt()))
282 return child_range(C, C + 1);
283 return child_range(&Grainsize, &Grainsize + 1);
284 }
285
used_children()286 OMPClause::child_range OMPNumTasksClause::used_children() {
287 if (Stmt **C = getAddrOfExprAsWritten(getPreInitStmt()))
288 return child_range(C, C + 1);
289 return child_range(&NumTasks, &NumTasks + 1);
290 }
291
used_children()292 OMPClause::child_range OMPFinalClause::used_children() {
293 if (Stmt **C = getAddrOfExprAsWritten(getPreInitStmt()))
294 return child_range(C, C + 1);
295 return child_range(&Condition, &Condition + 1);
296 }
297
used_children()298 OMPClause::child_range OMPPriorityClause::used_children() {
299 if (Stmt **C = getAddrOfExprAsWritten(getPreInitStmt()))
300 return child_range(C, C + 1);
301 return child_range(&Priority, &Priority + 1);
302 }
303
Create(const ASTContext & C,Expr * Num,unsigned NumLoops,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc)304 OMPOrderedClause *OMPOrderedClause::Create(const ASTContext &C, Expr *Num,
305 unsigned NumLoops,
306 SourceLocation StartLoc,
307 SourceLocation LParenLoc,
308 SourceLocation EndLoc) {
309 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(2 * NumLoops));
310 auto *Clause =
311 new (Mem) OMPOrderedClause(Num, NumLoops, StartLoc, LParenLoc, EndLoc);
312 for (unsigned I = 0; I < NumLoops; ++I) {
313 Clause->setLoopNumIterations(I, nullptr);
314 Clause->setLoopCounter(I, nullptr);
315 }
316 return Clause;
317 }
318
CreateEmpty(const ASTContext & C,unsigned NumLoops)319 OMPOrderedClause *OMPOrderedClause::CreateEmpty(const ASTContext &C,
320 unsigned NumLoops) {
321 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(2 * NumLoops));
322 auto *Clause = new (Mem) OMPOrderedClause(NumLoops);
323 for (unsigned I = 0; I < NumLoops; ++I) {
324 Clause->setLoopNumIterations(I, nullptr);
325 Clause->setLoopCounter(I, nullptr);
326 }
327 return Clause;
328 }
329
setLoopNumIterations(unsigned NumLoop,Expr * NumIterations)330 void OMPOrderedClause::setLoopNumIterations(unsigned NumLoop,
331 Expr *NumIterations) {
332 assert(NumLoop < NumberOfLoops && "out of loops number.");
333 getTrailingObjects<Expr *>()[NumLoop] = NumIterations;
334 }
335
getLoopNumIterations() const336 ArrayRef<Expr *> OMPOrderedClause::getLoopNumIterations() const {
337 return llvm::makeArrayRef(getTrailingObjects<Expr *>(), NumberOfLoops);
338 }
339
setLoopCounter(unsigned NumLoop,Expr * Counter)340 void OMPOrderedClause::setLoopCounter(unsigned NumLoop, Expr *Counter) {
341 assert(NumLoop < NumberOfLoops && "out of loops number.");
342 getTrailingObjects<Expr *>()[NumberOfLoops + NumLoop] = Counter;
343 }
344
getLoopCounter(unsigned NumLoop)345 Expr *OMPOrderedClause::getLoopCounter(unsigned NumLoop) {
346 assert(NumLoop < NumberOfLoops && "out of loops number.");
347 return getTrailingObjects<Expr *>()[NumberOfLoops + NumLoop];
348 }
349
getLoopCounter(unsigned NumLoop) const350 const Expr *OMPOrderedClause::getLoopCounter(unsigned NumLoop) const {
351 assert(NumLoop < NumberOfLoops && "out of loops number.");
352 return getTrailingObjects<Expr *>()[NumberOfLoops + NumLoop];
353 }
354
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation EndLoc)355 OMPUpdateClause *OMPUpdateClause::Create(const ASTContext &C,
356 SourceLocation StartLoc,
357 SourceLocation EndLoc) {
358 return new (C) OMPUpdateClause(StartLoc, EndLoc, /*IsExtended=*/false);
359 }
360
361 OMPUpdateClause *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation ArgumentLoc,OpenMPDependClauseKind DK,SourceLocation EndLoc)362 OMPUpdateClause::Create(const ASTContext &C, SourceLocation StartLoc,
363 SourceLocation LParenLoc, SourceLocation ArgumentLoc,
364 OpenMPDependClauseKind DK, SourceLocation EndLoc) {
365 void *Mem =
366 C.Allocate(totalSizeToAlloc<SourceLocation, OpenMPDependClauseKind>(2, 1),
367 alignof(OMPUpdateClause));
368 auto *Clause =
369 new (Mem) OMPUpdateClause(StartLoc, EndLoc, /*IsExtended=*/true);
370 Clause->setLParenLoc(LParenLoc);
371 Clause->setArgumentLoc(ArgumentLoc);
372 Clause->setDependencyKind(DK);
373 return Clause;
374 }
375
CreateEmpty(const ASTContext & C,bool IsExtended)376 OMPUpdateClause *OMPUpdateClause::CreateEmpty(const ASTContext &C,
377 bool IsExtended) {
378 if (!IsExtended)
379 return new (C) OMPUpdateClause(/*IsExtended=*/false);
380 void *Mem =
381 C.Allocate(totalSizeToAlloc<SourceLocation, OpenMPDependClauseKind>(2, 1),
382 alignof(OMPUpdateClause));
383 auto *Clause = new (Mem) OMPUpdateClause(/*IsExtended=*/true);
384 Clause->IsExtended = true;
385 return Clause;
386 }
387
setPrivateCopies(ArrayRef<Expr * > VL)388 void OMPPrivateClause::setPrivateCopies(ArrayRef<Expr *> VL) {
389 assert(VL.size() == varlist_size() &&
390 "Number of private copies is not the same as the preallocated buffer");
391 std::copy(VL.begin(), VL.end(), varlist_end());
392 }
393
394 OMPPrivateClause *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc,ArrayRef<Expr * > VL,ArrayRef<Expr * > PrivateVL)395 OMPPrivateClause::Create(const ASTContext &C, SourceLocation StartLoc,
396 SourceLocation LParenLoc, SourceLocation EndLoc,
397 ArrayRef<Expr *> VL, ArrayRef<Expr *> PrivateVL) {
398 // Allocate space for private variables and initializer expressions.
399 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(2 * VL.size()));
400 OMPPrivateClause *Clause =
401 new (Mem) OMPPrivateClause(StartLoc, LParenLoc, EndLoc, VL.size());
402 Clause->setVarRefs(VL);
403 Clause->setPrivateCopies(PrivateVL);
404 return Clause;
405 }
406
CreateEmpty(const ASTContext & C,unsigned N)407 OMPPrivateClause *OMPPrivateClause::CreateEmpty(const ASTContext &C,
408 unsigned N) {
409 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(2 * N));
410 return new (Mem) OMPPrivateClause(N);
411 }
412
setPrivateCopies(ArrayRef<Expr * > VL)413 void OMPFirstprivateClause::setPrivateCopies(ArrayRef<Expr *> VL) {
414 assert(VL.size() == varlist_size() &&
415 "Number of private copies is not the same as the preallocated buffer");
416 std::copy(VL.begin(), VL.end(), varlist_end());
417 }
418
setInits(ArrayRef<Expr * > VL)419 void OMPFirstprivateClause::setInits(ArrayRef<Expr *> VL) {
420 assert(VL.size() == varlist_size() &&
421 "Number of inits is not the same as the preallocated buffer");
422 std::copy(VL.begin(), VL.end(), getPrivateCopies().end());
423 }
424
425 OMPFirstprivateClause *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc,ArrayRef<Expr * > VL,ArrayRef<Expr * > PrivateVL,ArrayRef<Expr * > InitVL,Stmt * PreInit)426 OMPFirstprivateClause::Create(const ASTContext &C, SourceLocation StartLoc,
427 SourceLocation LParenLoc, SourceLocation EndLoc,
428 ArrayRef<Expr *> VL, ArrayRef<Expr *> PrivateVL,
429 ArrayRef<Expr *> InitVL, Stmt *PreInit) {
430 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(3 * VL.size()));
431 OMPFirstprivateClause *Clause =
432 new (Mem) OMPFirstprivateClause(StartLoc, LParenLoc, EndLoc, VL.size());
433 Clause->setVarRefs(VL);
434 Clause->setPrivateCopies(PrivateVL);
435 Clause->setInits(InitVL);
436 Clause->setPreInitStmt(PreInit);
437 return Clause;
438 }
439
CreateEmpty(const ASTContext & C,unsigned N)440 OMPFirstprivateClause *OMPFirstprivateClause::CreateEmpty(const ASTContext &C,
441 unsigned N) {
442 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(3 * N));
443 return new (Mem) OMPFirstprivateClause(N);
444 }
445
setPrivateCopies(ArrayRef<Expr * > PrivateCopies)446 void OMPLastprivateClause::setPrivateCopies(ArrayRef<Expr *> PrivateCopies) {
447 assert(PrivateCopies.size() == varlist_size() &&
448 "Number of private copies is not the same as the preallocated buffer");
449 std::copy(PrivateCopies.begin(), PrivateCopies.end(), varlist_end());
450 }
451
setSourceExprs(ArrayRef<Expr * > SrcExprs)452 void OMPLastprivateClause::setSourceExprs(ArrayRef<Expr *> SrcExprs) {
453 assert(SrcExprs.size() == varlist_size() && "Number of source expressions is "
454 "not the same as the "
455 "preallocated buffer");
456 std::copy(SrcExprs.begin(), SrcExprs.end(), getPrivateCopies().end());
457 }
458
setDestinationExprs(ArrayRef<Expr * > DstExprs)459 void OMPLastprivateClause::setDestinationExprs(ArrayRef<Expr *> DstExprs) {
460 assert(DstExprs.size() == varlist_size() && "Number of destination "
461 "expressions is not the same as "
462 "the preallocated buffer");
463 std::copy(DstExprs.begin(), DstExprs.end(), getSourceExprs().end());
464 }
465
setAssignmentOps(ArrayRef<Expr * > AssignmentOps)466 void OMPLastprivateClause::setAssignmentOps(ArrayRef<Expr *> AssignmentOps) {
467 assert(AssignmentOps.size() == varlist_size() &&
468 "Number of assignment expressions is not the same as the preallocated "
469 "buffer");
470 std::copy(AssignmentOps.begin(), AssignmentOps.end(),
471 getDestinationExprs().end());
472 }
473
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc,ArrayRef<Expr * > VL,ArrayRef<Expr * > SrcExprs,ArrayRef<Expr * > DstExprs,ArrayRef<Expr * > AssignmentOps,OpenMPLastprivateModifier LPKind,SourceLocation LPKindLoc,SourceLocation ColonLoc,Stmt * PreInit,Expr * PostUpdate)474 OMPLastprivateClause *OMPLastprivateClause::Create(
475 const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
476 SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
477 ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps,
478 OpenMPLastprivateModifier LPKind, SourceLocation LPKindLoc,
479 SourceLocation ColonLoc, Stmt *PreInit, Expr *PostUpdate) {
480 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(5 * VL.size()));
481 OMPLastprivateClause *Clause = new (Mem) OMPLastprivateClause(
482 StartLoc, LParenLoc, EndLoc, LPKind, LPKindLoc, ColonLoc, VL.size());
483 Clause->setVarRefs(VL);
484 Clause->setSourceExprs(SrcExprs);
485 Clause->setDestinationExprs(DstExprs);
486 Clause->setAssignmentOps(AssignmentOps);
487 Clause->setPreInitStmt(PreInit);
488 Clause->setPostUpdateExpr(PostUpdate);
489 return Clause;
490 }
491
CreateEmpty(const ASTContext & C,unsigned N)492 OMPLastprivateClause *OMPLastprivateClause::CreateEmpty(const ASTContext &C,
493 unsigned N) {
494 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(5 * N));
495 return new (Mem) OMPLastprivateClause(N);
496 }
497
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc,ArrayRef<Expr * > VL)498 OMPSharedClause *OMPSharedClause::Create(const ASTContext &C,
499 SourceLocation StartLoc,
500 SourceLocation LParenLoc,
501 SourceLocation EndLoc,
502 ArrayRef<Expr *> VL) {
503 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(VL.size()));
504 OMPSharedClause *Clause =
505 new (Mem) OMPSharedClause(StartLoc, LParenLoc, EndLoc, VL.size());
506 Clause->setVarRefs(VL);
507 return Clause;
508 }
509
CreateEmpty(const ASTContext & C,unsigned N)510 OMPSharedClause *OMPSharedClause::CreateEmpty(const ASTContext &C, unsigned N) {
511 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(N));
512 return new (Mem) OMPSharedClause(N);
513 }
514
setPrivates(ArrayRef<Expr * > PL)515 void OMPLinearClause::setPrivates(ArrayRef<Expr *> PL) {
516 assert(PL.size() == varlist_size() &&
517 "Number of privates is not the same as the preallocated buffer");
518 std::copy(PL.begin(), PL.end(), varlist_end());
519 }
520
setInits(ArrayRef<Expr * > IL)521 void OMPLinearClause::setInits(ArrayRef<Expr *> IL) {
522 assert(IL.size() == varlist_size() &&
523 "Number of inits is not the same as the preallocated buffer");
524 std::copy(IL.begin(), IL.end(), getPrivates().end());
525 }
526
setUpdates(ArrayRef<Expr * > UL)527 void OMPLinearClause::setUpdates(ArrayRef<Expr *> UL) {
528 assert(UL.size() == varlist_size() &&
529 "Number of updates is not the same as the preallocated buffer");
530 std::copy(UL.begin(), UL.end(), getInits().end());
531 }
532
setFinals(ArrayRef<Expr * > FL)533 void OMPLinearClause::setFinals(ArrayRef<Expr *> FL) {
534 assert(FL.size() == varlist_size() &&
535 "Number of final updates is not the same as the preallocated buffer");
536 std::copy(FL.begin(), FL.end(), getUpdates().end());
537 }
538
setUsedExprs(ArrayRef<Expr * > UE)539 void OMPLinearClause::setUsedExprs(ArrayRef<Expr *> UE) {
540 assert(
541 UE.size() == varlist_size() + 1 &&
542 "Number of used expressions is not the same as the preallocated buffer");
543 std::copy(UE.begin(), UE.end(), getFinals().end() + 2);
544 }
545
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation LParenLoc,OpenMPLinearClauseKind Modifier,SourceLocation ModifierLoc,SourceLocation ColonLoc,SourceLocation EndLoc,ArrayRef<Expr * > VL,ArrayRef<Expr * > PL,ArrayRef<Expr * > IL,Expr * Step,Expr * CalcStep,Stmt * PreInit,Expr * PostUpdate)546 OMPLinearClause *OMPLinearClause::Create(
547 const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
548 OpenMPLinearClauseKind Modifier, SourceLocation ModifierLoc,
549 SourceLocation ColonLoc, SourceLocation EndLoc, ArrayRef<Expr *> VL,
550 ArrayRef<Expr *> PL, ArrayRef<Expr *> IL, Expr *Step, Expr *CalcStep,
551 Stmt *PreInit, Expr *PostUpdate) {
552 // Allocate space for 5 lists (Vars, Inits, Updates, Finals), 2 expressions
553 // (Step and CalcStep), list of used expression + step.
554 void *Mem =
555 C.Allocate(totalSizeToAlloc<Expr *>(5 * VL.size() + 2 + VL.size() + 1));
556 OMPLinearClause *Clause = new (Mem) OMPLinearClause(
557 StartLoc, LParenLoc, Modifier, ModifierLoc, ColonLoc, EndLoc, VL.size());
558 Clause->setVarRefs(VL);
559 Clause->setPrivates(PL);
560 Clause->setInits(IL);
561 // Fill update and final expressions with zeroes, they are provided later,
562 // after the directive construction.
563 std::fill(Clause->getInits().end(), Clause->getInits().end() + VL.size(),
564 nullptr);
565 std::fill(Clause->getUpdates().end(), Clause->getUpdates().end() + VL.size(),
566 nullptr);
567 std::fill(Clause->getUsedExprs().begin(), Clause->getUsedExprs().end(),
568 nullptr);
569 Clause->setStep(Step);
570 Clause->setCalcStep(CalcStep);
571 Clause->setPreInitStmt(PreInit);
572 Clause->setPostUpdateExpr(PostUpdate);
573 return Clause;
574 }
575
CreateEmpty(const ASTContext & C,unsigned NumVars)576 OMPLinearClause *OMPLinearClause::CreateEmpty(const ASTContext &C,
577 unsigned NumVars) {
578 // Allocate space for 5 lists (Vars, Inits, Updates, Finals), 2 expressions
579 // (Step and CalcStep), list of used expression + step.
580 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(5 * NumVars + 2 + NumVars +1));
581 return new (Mem) OMPLinearClause(NumVars);
582 }
583
used_children()584 OMPClause::child_range OMPLinearClause::used_children() {
585 // Range includes only non-nullptr elements.
586 return child_range(
587 reinterpret_cast<Stmt **>(getUsedExprs().begin()),
588 reinterpret_cast<Stmt **>(llvm::find(getUsedExprs(), nullptr)));
589 }
590
591 OMPAlignedClause *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation ColonLoc,SourceLocation EndLoc,ArrayRef<Expr * > VL,Expr * A)592 OMPAlignedClause::Create(const ASTContext &C, SourceLocation StartLoc,
593 SourceLocation LParenLoc, SourceLocation ColonLoc,
594 SourceLocation EndLoc, ArrayRef<Expr *> VL, Expr *A) {
595 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(VL.size() + 1));
596 OMPAlignedClause *Clause = new (Mem)
597 OMPAlignedClause(StartLoc, LParenLoc, ColonLoc, EndLoc, VL.size());
598 Clause->setVarRefs(VL);
599 Clause->setAlignment(A);
600 return Clause;
601 }
602
CreateEmpty(const ASTContext & C,unsigned NumVars)603 OMPAlignedClause *OMPAlignedClause::CreateEmpty(const ASTContext &C,
604 unsigned NumVars) {
605 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(NumVars + 1));
606 return new (Mem) OMPAlignedClause(NumVars);
607 }
608
setSourceExprs(ArrayRef<Expr * > SrcExprs)609 void OMPCopyinClause::setSourceExprs(ArrayRef<Expr *> SrcExprs) {
610 assert(SrcExprs.size() == varlist_size() && "Number of source expressions is "
611 "not the same as the "
612 "preallocated buffer");
613 std::copy(SrcExprs.begin(), SrcExprs.end(), varlist_end());
614 }
615
setDestinationExprs(ArrayRef<Expr * > DstExprs)616 void OMPCopyinClause::setDestinationExprs(ArrayRef<Expr *> DstExprs) {
617 assert(DstExprs.size() == varlist_size() && "Number of destination "
618 "expressions is not the same as "
619 "the preallocated buffer");
620 std::copy(DstExprs.begin(), DstExprs.end(), getSourceExprs().end());
621 }
622
setAssignmentOps(ArrayRef<Expr * > AssignmentOps)623 void OMPCopyinClause::setAssignmentOps(ArrayRef<Expr *> AssignmentOps) {
624 assert(AssignmentOps.size() == varlist_size() &&
625 "Number of assignment expressions is not the same as the preallocated "
626 "buffer");
627 std::copy(AssignmentOps.begin(), AssignmentOps.end(),
628 getDestinationExprs().end());
629 }
630
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc,ArrayRef<Expr * > VL,ArrayRef<Expr * > SrcExprs,ArrayRef<Expr * > DstExprs,ArrayRef<Expr * > AssignmentOps)631 OMPCopyinClause *OMPCopyinClause::Create(
632 const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
633 SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
634 ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps) {
635 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(4 * VL.size()));
636 OMPCopyinClause *Clause =
637 new (Mem) OMPCopyinClause(StartLoc, LParenLoc, EndLoc, VL.size());
638 Clause->setVarRefs(VL);
639 Clause->setSourceExprs(SrcExprs);
640 Clause->setDestinationExprs(DstExprs);
641 Clause->setAssignmentOps(AssignmentOps);
642 return Clause;
643 }
644
CreateEmpty(const ASTContext & C,unsigned N)645 OMPCopyinClause *OMPCopyinClause::CreateEmpty(const ASTContext &C, unsigned N) {
646 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(4 * N));
647 return new (Mem) OMPCopyinClause(N);
648 }
649
setSourceExprs(ArrayRef<Expr * > SrcExprs)650 void OMPCopyprivateClause::setSourceExprs(ArrayRef<Expr *> SrcExprs) {
651 assert(SrcExprs.size() == varlist_size() && "Number of source expressions is "
652 "not the same as the "
653 "preallocated buffer");
654 std::copy(SrcExprs.begin(), SrcExprs.end(), varlist_end());
655 }
656
setDestinationExprs(ArrayRef<Expr * > DstExprs)657 void OMPCopyprivateClause::setDestinationExprs(ArrayRef<Expr *> DstExprs) {
658 assert(DstExprs.size() == varlist_size() && "Number of destination "
659 "expressions is not the same as "
660 "the preallocated buffer");
661 std::copy(DstExprs.begin(), DstExprs.end(), getSourceExprs().end());
662 }
663
setAssignmentOps(ArrayRef<Expr * > AssignmentOps)664 void OMPCopyprivateClause::setAssignmentOps(ArrayRef<Expr *> AssignmentOps) {
665 assert(AssignmentOps.size() == varlist_size() &&
666 "Number of assignment expressions is not the same as the preallocated "
667 "buffer");
668 std::copy(AssignmentOps.begin(), AssignmentOps.end(),
669 getDestinationExprs().end());
670 }
671
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc,ArrayRef<Expr * > VL,ArrayRef<Expr * > SrcExprs,ArrayRef<Expr * > DstExprs,ArrayRef<Expr * > AssignmentOps)672 OMPCopyprivateClause *OMPCopyprivateClause::Create(
673 const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
674 SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
675 ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps) {
676 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(4 * VL.size()));
677 OMPCopyprivateClause *Clause =
678 new (Mem) OMPCopyprivateClause(StartLoc, LParenLoc, EndLoc, VL.size());
679 Clause->setVarRefs(VL);
680 Clause->setSourceExprs(SrcExprs);
681 Clause->setDestinationExprs(DstExprs);
682 Clause->setAssignmentOps(AssignmentOps);
683 return Clause;
684 }
685
CreateEmpty(const ASTContext & C,unsigned N)686 OMPCopyprivateClause *OMPCopyprivateClause::CreateEmpty(const ASTContext &C,
687 unsigned N) {
688 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(4 * N));
689 return new (Mem) OMPCopyprivateClause(N);
690 }
691
setPrivates(ArrayRef<Expr * > Privates)692 void OMPReductionClause::setPrivates(ArrayRef<Expr *> Privates) {
693 assert(Privates.size() == varlist_size() &&
694 "Number of private copies is not the same as the preallocated buffer");
695 std::copy(Privates.begin(), Privates.end(), varlist_end());
696 }
697
setLHSExprs(ArrayRef<Expr * > LHSExprs)698 void OMPReductionClause::setLHSExprs(ArrayRef<Expr *> LHSExprs) {
699 assert(
700 LHSExprs.size() == varlist_size() &&
701 "Number of LHS expressions is not the same as the preallocated buffer");
702 std::copy(LHSExprs.begin(), LHSExprs.end(), getPrivates().end());
703 }
704
setRHSExprs(ArrayRef<Expr * > RHSExprs)705 void OMPReductionClause::setRHSExprs(ArrayRef<Expr *> RHSExprs) {
706 assert(
707 RHSExprs.size() == varlist_size() &&
708 "Number of RHS expressions is not the same as the preallocated buffer");
709 std::copy(RHSExprs.begin(), RHSExprs.end(), getLHSExprs().end());
710 }
711
setReductionOps(ArrayRef<Expr * > ReductionOps)712 void OMPReductionClause::setReductionOps(ArrayRef<Expr *> ReductionOps) {
713 assert(ReductionOps.size() == varlist_size() && "Number of reduction "
714 "expressions is not the same "
715 "as the preallocated buffer");
716 std::copy(ReductionOps.begin(), ReductionOps.end(), getRHSExprs().end());
717 }
718
setInscanCopyOps(ArrayRef<Expr * > Ops)719 void OMPReductionClause::setInscanCopyOps(ArrayRef<Expr *> Ops) {
720 assert(Modifier == OMPC_REDUCTION_inscan && "Expected inscan reduction.");
721 assert(Ops.size() == varlist_size() && "Number of copy "
722 "expressions is not the same "
723 "as the preallocated buffer");
724 llvm::copy(Ops, getReductionOps().end());
725 }
726
setInscanCopyArrayTemps(ArrayRef<Expr * > CopyArrayTemps)727 void OMPReductionClause::setInscanCopyArrayTemps(
728 ArrayRef<Expr *> CopyArrayTemps) {
729 assert(Modifier == OMPC_REDUCTION_inscan && "Expected inscan reduction.");
730 assert(CopyArrayTemps.size() == varlist_size() &&
731 "Number of copy temp expressions is not the same as the preallocated "
732 "buffer");
733 llvm::copy(CopyArrayTemps, getInscanCopyOps().end());
734 }
735
setInscanCopyArrayElems(ArrayRef<Expr * > CopyArrayElems)736 void OMPReductionClause::setInscanCopyArrayElems(
737 ArrayRef<Expr *> CopyArrayElems) {
738 assert(Modifier == OMPC_REDUCTION_inscan && "Expected inscan reduction.");
739 assert(CopyArrayElems.size() == varlist_size() &&
740 "Number of copy temp expressions is not the same as the preallocated "
741 "buffer");
742 llvm::copy(CopyArrayElems, getInscanCopyArrayTemps().end());
743 }
744
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation ModifierLoc,SourceLocation EndLoc,SourceLocation ColonLoc,OpenMPReductionClauseModifier Modifier,ArrayRef<Expr * > VL,NestedNameSpecifierLoc QualifierLoc,const DeclarationNameInfo & NameInfo,ArrayRef<Expr * > Privates,ArrayRef<Expr * > LHSExprs,ArrayRef<Expr * > RHSExprs,ArrayRef<Expr * > ReductionOps,ArrayRef<Expr * > CopyOps,ArrayRef<Expr * > CopyArrayTemps,ArrayRef<Expr * > CopyArrayElems,Stmt * PreInit,Expr * PostUpdate)745 OMPReductionClause *OMPReductionClause::Create(
746 const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
747 SourceLocation ModifierLoc, SourceLocation EndLoc, SourceLocation ColonLoc,
748 OpenMPReductionClauseModifier Modifier, ArrayRef<Expr *> VL,
749 NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo,
750 ArrayRef<Expr *> Privates, ArrayRef<Expr *> LHSExprs,
751 ArrayRef<Expr *> RHSExprs, ArrayRef<Expr *> ReductionOps,
752 ArrayRef<Expr *> CopyOps, ArrayRef<Expr *> CopyArrayTemps,
753 ArrayRef<Expr *> CopyArrayElems, Stmt *PreInit, Expr *PostUpdate) {
754 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(
755 (Modifier == OMPC_REDUCTION_inscan ? 8 : 5) * VL.size()));
756 auto *Clause = new (Mem)
757 OMPReductionClause(StartLoc, LParenLoc, ModifierLoc, EndLoc, ColonLoc,
758 Modifier, VL.size(), QualifierLoc, NameInfo);
759 Clause->setVarRefs(VL);
760 Clause->setPrivates(Privates);
761 Clause->setLHSExprs(LHSExprs);
762 Clause->setRHSExprs(RHSExprs);
763 Clause->setReductionOps(ReductionOps);
764 Clause->setPreInitStmt(PreInit);
765 Clause->setPostUpdateExpr(PostUpdate);
766 if (Modifier == OMPC_REDUCTION_inscan) {
767 Clause->setInscanCopyOps(CopyOps);
768 Clause->setInscanCopyArrayTemps(CopyArrayTemps);
769 Clause->setInscanCopyArrayElems(CopyArrayElems);
770 } else {
771 assert(CopyOps.empty() &&
772 "copy operations are expected in inscan reductions only.");
773 assert(CopyArrayTemps.empty() &&
774 "copy array temps are expected in inscan reductions only.");
775 assert(CopyArrayElems.empty() &&
776 "copy array temps are expected in inscan reductions only.");
777 }
778 return Clause;
779 }
780
781 OMPReductionClause *
CreateEmpty(const ASTContext & C,unsigned N,OpenMPReductionClauseModifier Modifier)782 OMPReductionClause::CreateEmpty(const ASTContext &C, unsigned N,
783 OpenMPReductionClauseModifier Modifier) {
784 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(
785 (Modifier == OMPC_REDUCTION_inscan ? 8 : 5) * N));
786 auto *Clause = new (Mem) OMPReductionClause(N);
787 Clause->setModifier(Modifier);
788 return Clause;
789 }
790
setPrivates(ArrayRef<Expr * > Privates)791 void OMPTaskReductionClause::setPrivates(ArrayRef<Expr *> Privates) {
792 assert(Privates.size() == varlist_size() &&
793 "Number of private copies is not the same as the preallocated buffer");
794 std::copy(Privates.begin(), Privates.end(), varlist_end());
795 }
796
setLHSExprs(ArrayRef<Expr * > LHSExprs)797 void OMPTaskReductionClause::setLHSExprs(ArrayRef<Expr *> LHSExprs) {
798 assert(
799 LHSExprs.size() == varlist_size() &&
800 "Number of LHS expressions is not the same as the preallocated buffer");
801 std::copy(LHSExprs.begin(), LHSExprs.end(), getPrivates().end());
802 }
803
setRHSExprs(ArrayRef<Expr * > RHSExprs)804 void OMPTaskReductionClause::setRHSExprs(ArrayRef<Expr *> RHSExprs) {
805 assert(
806 RHSExprs.size() == varlist_size() &&
807 "Number of RHS expressions is not the same as the preallocated buffer");
808 std::copy(RHSExprs.begin(), RHSExprs.end(), getLHSExprs().end());
809 }
810
setReductionOps(ArrayRef<Expr * > ReductionOps)811 void OMPTaskReductionClause::setReductionOps(ArrayRef<Expr *> ReductionOps) {
812 assert(ReductionOps.size() == varlist_size() && "Number of task reduction "
813 "expressions is not the same "
814 "as the preallocated buffer");
815 std::copy(ReductionOps.begin(), ReductionOps.end(), getRHSExprs().end());
816 }
817
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc,SourceLocation ColonLoc,ArrayRef<Expr * > VL,NestedNameSpecifierLoc QualifierLoc,const DeclarationNameInfo & NameInfo,ArrayRef<Expr * > Privates,ArrayRef<Expr * > LHSExprs,ArrayRef<Expr * > RHSExprs,ArrayRef<Expr * > ReductionOps,Stmt * PreInit,Expr * PostUpdate)818 OMPTaskReductionClause *OMPTaskReductionClause::Create(
819 const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
820 SourceLocation EndLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VL,
821 NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo,
822 ArrayRef<Expr *> Privates, ArrayRef<Expr *> LHSExprs,
823 ArrayRef<Expr *> RHSExprs, ArrayRef<Expr *> ReductionOps, Stmt *PreInit,
824 Expr *PostUpdate) {
825 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(5 * VL.size()));
826 OMPTaskReductionClause *Clause = new (Mem) OMPTaskReductionClause(
827 StartLoc, LParenLoc, EndLoc, ColonLoc, VL.size(), QualifierLoc, NameInfo);
828 Clause->setVarRefs(VL);
829 Clause->setPrivates(Privates);
830 Clause->setLHSExprs(LHSExprs);
831 Clause->setRHSExprs(RHSExprs);
832 Clause->setReductionOps(ReductionOps);
833 Clause->setPreInitStmt(PreInit);
834 Clause->setPostUpdateExpr(PostUpdate);
835 return Clause;
836 }
837
CreateEmpty(const ASTContext & C,unsigned N)838 OMPTaskReductionClause *OMPTaskReductionClause::CreateEmpty(const ASTContext &C,
839 unsigned N) {
840 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(5 * N));
841 return new (Mem) OMPTaskReductionClause(N);
842 }
843
setPrivates(ArrayRef<Expr * > Privates)844 void OMPInReductionClause::setPrivates(ArrayRef<Expr *> Privates) {
845 assert(Privates.size() == varlist_size() &&
846 "Number of private copies is not the same as the preallocated buffer");
847 std::copy(Privates.begin(), Privates.end(), varlist_end());
848 }
849
setLHSExprs(ArrayRef<Expr * > LHSExprs)850 void OMPInReductionClause::setLHSExprs(ArrayRef<Expr *> LHSExprs) {
851 assert(
852 LHSExprs.size() == varlist_size() &&
853 "Number of LHS expressions is not the same as the preallocated buffer");
854 std::copy(LHSExprs.begin(), LHSExprs.end(), getPrivates().end());
855 }
856
setRHSExprs(ArrayRef<Expr * > RHSExprs)857 void OMPInReductionClause::setRHSExprs(ArrayRef<Expr *> RHSExprs) {
858 assert(
859 RHSExprs.size() == varlist_size() &&
860 "Number of RHS expressions is not the same as the preallocated buffer");
861 std::copy(RHSExprs.begin(), RHSExprs.end(), getLHSExprs().end());
862 }
863
setReductionOps(ArrayRef<Expr * > ReductionOps)864 void OMPInReductionClause::setReductionOps(ArrayRef<Expr *> ReductionOps) {
865 assert(ReductionOps.size() == varlist_size() && "Number of in reduction "
866 "expressions is not the same "
867 "as the preallocated buffer");
868 std::copy(ReductionOps.begin(), ReductionOps.end(), getRHSExprs().end());
869 }
870
setTaskgroupDescriptors(ArrayRef<Expr * > TaskgroupDescriptors)871 void OMPInReductionClause::setTaskgroupDescriptors(
872 ArrayRef<Expr *> TaskgroupDescriptors) {
873 assert(TaskgroupDescriptors.size() == varlist_size() &&
874 "Number of in reduction descriptors is not the same as the "
875 "preallocated buffer");
876 std::copy(TaskgroupDescriptors.begin(), TaskgroupDescriptors.end(),
877 getReductionOps().end());
878 }
879
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc,SourceLocation ColonLoc,ArrayRef<Expr * > VL,NestedNameSpecifierLoc QualifierLoc,const DeclarationNameInfo & NameInfo,ArrayRef<Expr * > Privates,ArrayRef<Expr * > LHSExprs,ArrayRef<Expr * > RHSExprs,ArrayRef<Expr * > ReductionOps,ArrayRef<Expr * > TaskgroupDescriptors,Stmt * PreInit,Expr * PostUpdate)880 OMPInReductionClause *OMPInReductionClause::Create(
881 const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
882 SourceLocation EndLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VL,
883 NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo,
884 ArrayRef<Expr *> Privates, ArrayRef<Expr *> LHSExprs,
885 ArrayRef<Expr *> RHSExprs, ArrayRef<Expr *> ReductionOps,
886 ArrayRef<Expr *> TaskgroupDescriptors, Stmt *PreInit, Expr *PostUpdate) {
887 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(6 * VL.size()));
888 OMPInReductionClause *Clause = new (Mem) OMPInReductionClause(
889 StartLoc, LParenLoc, EndLoc, ColonLoc, VL.size(), QualifierLoc, NameInfo);
890 Clause->setVarRefs(VL);
891 Clause->setPrivates(Privates);
892 Clause->setLHSExprs(LHSExprs);
893 Clause->setRHSExprs(RHSExprs);
894 Clause->setReductionOps(ReductionOps);
895 Clause->setTaskgroupDescriptors(TaskgroupDescriptors);
896 Clause->setPreInitStmt(PreInit);
897 Clause->setPostUpdateExpr(PostUpdate);
898 return Clause;
899 }
900
CreateEmpty(const ASTContext & C,unsigned N)901 OMPInReductionClause *OMPInReductionClause::CreateEmpty(const ASTContext &C,
902 unsigned N) {
903 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(6 * N));
904 return new (Mem) OMPInReductionClause(N);
905 }
906
907 OMPAllocateClause *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation LParenLoc,Expr * Allocator,SourceLocation ColonLoc,SourceLocation EndLoc,ArrayRef<Expr * > VL)908 OMPAllocateClause::Create(const ASTContext &C, SourceLocation StartLoc,
909 SourceLocation LParenLoc, Expr *Allocator,
910 SourceLocation ColonLoc, SourceLocation EndLoc,
911 ArrayRef<Expr *> VL) {
912 // Allocate space for private variables and initializer expressions.
913 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(VL.size()));
914 auto *Clause = new (Mem) OMPAllocateClause(StartLoc, LParenLoc, Allocator,
915 ColonLoc, EndLoc, VL.size());
916 Clause->setVarRefs(VL);
917 return Clause;
918 }
919
CreateEmpty(const ASTContext & C,unsigned N)920 OMPAllocateClause *OMPAllocateClause::CreateEmpty(const ASTContext &C,
921 unsigned N) {
922 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(N));
923 return new (Mem) OMPAllocateClause(N);
924 }
925
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc,ArrayRef<Expr * > VL)926 OMPFlushClause *OMPFlushClause::Create(const ASTContext &C,
927 SourceLocation StartLoc,
928 SourceLocation LParenLoc,
929 SourceLocation EndLoc,
930 ArrayRef<Expr *> VL) {
931 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(VL.size() + 1));
932 OMPFlushClause *Clause =
933 new (Mem) OMPFlushClause(StartLoc, LParenLoc, EndLoc, VL.size());
934 Clause->setVarRefs(VL);
935 return Clause;
936 }
937
CreateEmpty(const ASTContext & C,unsigned N)938 OMPFlushClause *OMPFlushClause::CreateEmpty(const ASTContext &C, unsigned N) {
939 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(N));
940 return new (Mem) OMPFlushClause(N);
941 }
942
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation RParenLoc,Expr * Depobj)943 OMPDepobjClause *OMPDepobjClause::Create(const ASTContext &C,
944 SourceLocation StartLoc,
945 SourceLocation LParenLoc,
946 SourceLocation RParenLoc,
947 Expr *Depobj) {
948 auto *Clause = new (C) OMPDepobjClause(StartLoc, LParenLoc, RParenLoc);
949 Clause->setDepobj(Depobj);
950 return Clause;
951 }
952
CreateEmpty(const ASTContext & C)953 OMPDepobjClause *OMPDepobjClause::CreateEmpty(const ASTContext &C) {
954 return new (C) OMPDepobjClause();
955 }
956
957 OMPDependClause *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc,Expr * DepModifier,OpenMPDependClauseKind DepKind,SourceLocation DepLoc,SourceLocation ColonLoc,ArrayRef<Expr * > VL,unsigned NumLoops)958 OMPDependClause::Create(const ASTContext &C, SourceLocation StartLoc,
959 SourceLocation LParenLoc, SourceLocation EndLoc,
960 Expr *DepModifier, OpenMPDependClauseKind DepKind,
961 SourceLocation DepLoc, SourceLocation ColonLoc,
962 ArrayRef<Expr *> VL, unsigned NumLoops) {
963 void *Mem = C.Allocate(
964 totalSizeToAlloc<Expr *>(VL.size() + /*depend-modifier*/ 1 + NumLoops),
965 alignof(OMPDependClause));
966 OMPDependClause *Clause = new (Mem)
967 OMPDependClause(StartLoc, LParenLoc, EndLoc, VL.size(), NumLoops);
968 Clause->setVarRefs(VL);
969 Clause->setDependencyKind(DepKind);
970 Clause->setDependencyLoc(DepLoc);
971 Clause->setColonLoc(ColonLoc);
972 Clause->setModifier(DepModifier);
973 for (unsigned I = 0 ; I < NumLoops; ++I)
974 Clause->setLoopData(I, nullptr);
975 return Clause;
976 }
977
CreateEmpty(const ASTContext & C,unsigned N,unsigned NumLoops)978 OMPDependClause *OMPDependClause::CreateEmpty(const ASTContext &C, unsigned N,
979 unsigned NumLoops) {
980 void *Mem =
981 C.Allocate(totalSizeToAlloc<Expr *>(N + /*depend-modifier*/ 1 + NumLoops),
982 alignof(OMPDependClause));
983 return new (Mem) OMPDependClause(N, NumLoops);
984 }
985
setLoopData(unsigned NumLoop,Expr * Cnt)986 void OMPDependClause::setLoopData(unsigned NumLoop, Expr *Cnt) {
987 assert((getDependencyKind() == OMPC_DEPEND_sink ||
988 getDependencyKind() == OMPC_DEPEND_source) &&
989 NumLoop < NumLoops &&
990 "Expected sink or source depend + loop index must be less number of "
991 "loops.");
992 auto *It = std::next(getVarRefs().end(), NumLoop + 1);
993 *It = Cnt;
994 }
995
getLoopData(unsigned NumLoop)996 Expr *OMPDependClause::getLoopData(unsigned NumLoop) {
997 assert((getDependencyKind() == OMPC_DEPEND_sink ||
998 getDependencyKind() == OMPC_DEPEND_source) &&
999 NumLoop < NumLoops &&
1000 "Expected sink or source depend + loop index must be less number of "
1001 "loops.");
1002 auto *It = std::next(getVarRefs().end(), NumLoop + 1);
1003 return *It;
1004 }
1005
getLoopData(unsigned NumLoop) const1006 const Expr *OMPDependClause::getLoopData(unsigned NumLoop) const {
1007 assert((getDependencyKind() == OMPC_DEPEND_sink ||
1008 getDependencyKind() == OMPC_DEPEND_source) &&
1009 NumLoop < NumLoops &&
1010 "Expected sink or source depend + loop index must be less number of "
1011 "loops.");
1012 const auto *It = std::next(getVarRefs().end(), NumLoop + 1);
1013 return *It;
1014 }
1015
setModifier(Expr * DepModifier)1016 void OMPDependClause::setModifier(Expr *DepModifier) {
1017 *getVarRefs().end() = DepModifier;
1018 }
getModifier()1019 Expr *OMPDependClause::getModifier() { return *getVarRefs().end(); }
1020
getComponentsTotalNumber(MappableExprComponentListsRef ComponentLists)1021 unsigned OMPClauseMappableExprCommon::getComponentsTotalNumber(
1022 MappableExprComponentListsRef ComponentLists) {
1023 unsigned TotalNum = 0u;
1024 for (auto &C : ComponentLists)
1025 TotalNum += C.size();
1026 return TotalNum;
1027 }
1028
getUniqueDeclarationsTotalNumber(ArrayRef<const ValueDecl * > Declarations)1029 unsigned OMPClauseMappableExprCommon::getUniqueDeclarationsTotalNumber(
1030 ArrayRef<const ValueDecl *> Declarations) {
1031 unsigned TotalNum = 0u;
1032 llvm::SmallPtrSet<const ValueDecl *, 8> Cache;
1033 for (const ValueDecl *D : Declarations) {
1034 const ValueDecl *VD = D ? cast<ValueDecl>(D->getCanonicalDecl()) : nullptr;
1035 if (Cache.count(VD))
1036 continue;
1037 ++TotalNum;
1038 Cache.insert(VD);
1039 }
1040 return TotalNum;
1041 }
1042
Create(const ASTContext & C,const OMPVarListLocTy & Locs,ArrayRef<Expr * > Vars,ArrayRef<ValueDecl * > Declarations,MappableExprComponentListsRef ComponentLists,ArrayRef<Expr * > UDMapperRefs,ArrayRef<OpenMPMapModifierKind> MapModifiers,ArrayRef<SourceLocation> MapModifiersLoc,NestedNameSpecifierLoc UDMQualifierLoc,DeclarationNameInfo MapperId,OpenMPMapClauseKind Type,bool TypeIsImplicit,SourceLocation TypeLoc)1043 OMPMapClause *OMPMapClause::Create(
1044 const ASTContext &C, const OMPVarListLocTy &Locs, ArrayRef<Expr *> Vars,
1045 ArrayRef<ValueDecl *> Declarations,
1046 MappableExprComponentListsRef ComponentLists, ArrayRef<Expr *> UDMapperRefs,
1047 ArrayRef<OpenMPMapModifierKind> MapModifiers,
1048 ArrayRef<SourceLocation> MapModifiersLoc,
1049 NestedNameSpecifierLoc UDMQualifierLoc, DeclarationNameInfo MapperId,
1050 OpenMPMapClauseKind Type, bool TypeIsImplicit, SourceLocation TypeLoc) {
1051 OMPMappableExprListSizeTy Sizes;
1052 Sizes.NumVars = Vars.size();
1053 Sizes.NumUniqueDeclarations = getUniqueDeclarationsTotalNumber(Declarations);
1054 Sizes.NumComponentLists = ComponentLists.size();
1055 Sizes.NumComponents = getComponentsTotalNumber(ComponentLists);
1056
1057 // We need to allocate:
1058 // 2 x NumVars x Expr* - we have an original list expression and an associated
1059 // user-defined mapper for each clause list entry.
1060 // NumUniqueDeclarations x ValueDecl* - unique base declarations associated
1061 // with each component list.
1062 // (NumUniqueDeclarations + NumComponentLists) x unsigned - we specify the
1063 // number of lists for each unique declaration and the size of each component
1064 // list.
1065 // NumComponents x MappableComponent - the total of all the components in all
1066 // the lists.
1067 void *Mem = C.Allocate(
1068 totalSizeToAlloc<Expr *, ValueDecl *, unsigned,
1069 OMPClauseMappableExprCommon::MappableComponent>(
1070 2 * Sizes.NumVars, Sizes.NumUniqueDeclarations,
1071 Sizes.NumUniqueDeclarations + Sizes.NumComponentLists,
1072 Sizes.NumComponents));
1073 OMPMapClause *Clause = new (Mem)
1074 OMPMapClause(MapModifiers, MapModifiersLoc, UDMQualifierLoc, MapperId,
1075 Type, TypeIsImplicit, TypeLoc, Locs, Sizes);
1076
1077 Clause->setVarRefs(Vars);
1078 Clause->setUDMapperRefs(UDMapperRefs);
1079 Clause->setClauseInfo(Declarations, ComponentLists);
1080 Clause->setMapType(Type);
1081 Clause->setMapLoc(TypeLoc);
1082 return Clause;
1083 }
1084
1085 OMPMapClause *
CreateEmpty(const ASTContext & C,const OMPMappableExprListSizeTy & Sizes)1086 OMPMapClause::CreateEmpty(const ASTContext &C,
1087 const OMPMappableExprListSizeTy &Sizes) {
1088 void *Mem = C.Allocate(
1089 totalSizeToAlloc<Expr *, ValueDecl *, unsigned,
1090 OMPClauseMappableExprCommon::MappableComponent>(
1091 2 * Sizes.NumVars, Sizes.NumUniqueDeclarations,
1092 Sizes.NumUniqueDeclarations + Sizes.NumComponentLists,
1093 Sizes.NumComponents));
1094 return new (Mem) OMPMapClause(Sizes);
1095 }
1096
Create(const ASTContext & C,const OMPVarListLocTy & Locs,ArrayRef<Expr * > Vars,ArrayRef<ValueDecl * > Declarations,MappableExprComponentListsRef ComponentLists,ArrayRef<Expr * > UDMapperRefs,ArrayRef<OpenMPMotionModifierKind> MotionModifiers,ArrayRef<SourceLocation> MotionModifiersLoc,NestedNameSpecifierLoc UDMQualifierLoc,DeclarationNameInfo MapperId)1097 OMPToClause *OMPToClause::Create(
1098 const ASTContext &C, const OMPVarListLocTy &Locs, ArrayRef<Expr *> Vars,
1099 ArrayRef<ValueDecl *> Declarations,
1100 MappableExprComponentListsRef ComponentLists, ArrayRef<Expr *> UDMapperRefs,
1101 ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
1102 ArrayRef<SourceLocation> MotionModifiersLoc,
1103 NestedNameSpecifierLoc UDMQualifierLoc, DeclarationNameInfo MapperId) {
1104 OMPMappableExprListSizeTy Sizes;
1105 Sizes.NumVars = Vars.size();
1106 Sizes.NumUniqueDeclarations = getUniqueDeclarationsTotalNumber(Declarations);
1107 Sizes.NumComponentLists = ComponentLists.size();
1108 Sizes.NumComponents = getComponentsTotalNumber(ComponentLists);
1109
1110 // We need to allocate:
1111 // 2 x NumVars x Expr* - we have an original list expression and an associated
1112 // user-defined mapper for each clause list entry.
1113 // NumUniqueDeclarations x ValueDecl* - unique base declarations associated
1114 // with each component list.
1115 // (NumUniqueDeclarations + NumComponentLists) x unsigned - we specify the
1116 // number of lists for each unique declaration and the size of each component
1117 // list.
1118 // NumComponents x MappableComponent - the total of all the components in all
1119 // the lists.
1120 void *Mem = C.Allocate(
1121 totalSizeToAlloc<Expr *, ValueDecl *, unsigned,
1122 OMPClauseMappableExprCommon::MappableComponent>(
1123 2 * Sizes.NumVars, Sizes.NumUniqueDeclarations,
1124 Sizes.NumUniqueDeclarations + Sizes.NumComponentLists,
1125 Sizes.NumComponents));
1126
1127 auto *Clause = new (Mem) OMPToClause(MotionModifiers, MotionModifiersLoc,
1128 UDMQualifierLoc, MapperId, Locs, Sizes);
1129
1130 Clause->setVarRefs(Vars);
1131 Clause->setUDMapperRefs(UDMapperRefs);
1132 Clause->setClauseInfo(Declarations, ComponentLists);
1133 return Clause;
1134 }
1135
CreateEmpty(const ASTContext & C,const OMPMappableExprListSizeTy & Sizes)1136 OMPToClause *OMPToClause::CreateEmpty(const ASTContext &C,
1137 const OMPMappableExprListSizeTy &Sizes) {
1138 void *Mem = C.Allocate(
1139 totalSizeToAlloc<Expr *, ValueDecl *, unsigned,
1140 OMPClauseMappableExprCommon::MappableComponent>(
1141 2 * Sizes.NumVars, Sizes.NumUniqueDeclarations,
1142 Sizes.NumUniqueDeclarations + Sizes.NumComponentLists,
1143 Sizes.NumComponents));
1144 return new (Mem) OMPToClause(Sizes);
1145 }
1146
Create(const ASTContext & C,const OMPVarListLocTy & Locs,ArrayRef<Expr * > Vars,ArrayRef<ValueDecl * > Declarations,MappableExprComponentListsRef ComponentLists,ArrayRef<Expr * > UDMapperRefs,ArrayRef<OpenMPMotionModifierKind> MotionModifiers,ArrayRef<SourceLocation> MotionModifiersLoc,NestedNameSpecifierLoc UDMQualifierLoc,DeclarationNameInfo MapperId)1147 OMPFromClause *OMPFromClause::Create(
1148 const ASTContext &C, const OMPVarListLocTy &Locs, ArrayRef<Expr *> Vars,
1149 ArrayRef<ValueDecl *> Declarations,
1150 MappableExprComponentListsRef ComponentLists, ArrayRef<Expr *> UDMapperRefs,
1151 ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
1152 ArrayRef<SourceLocation> MotionModifiersLoc,
1153 NestedNameSpecifierLoc UDMQualifierLoc, DeclarationNameInfo MapperId) {
1154 OMPMappableExprListSizeTy Sizes;
1155 Sizes.NumVars = Vars.size();
1156 Sizes.NumUniqueDeclarations = getUniqueDeclarationsTotalNumber(Declarations);
1157 Sizes.NumComponentLists = ComponentLists.size();
1158 Sizes.NumComponents = getComponentsTotalNumber(ComponentLists);
1159
1160 // We need to allocate:
1161 // 2 x NumVars x Expr* - we have an original list expression and an associated
1162 // user-defined mapper for each clause list entry.
1163 // NumUniqueDeclarations x ValueDecl* - unique base declarations associated
1164 // with each component list.
1165 // (NumUniqueDeclarations + NumComponentLists) x unsigned - we specify the
1166 // number of lists for each unique declaration and the size of each component
1167 // list.
1168 // NumComponents x MappableComponent - the total of all the components in all
1169 // the lists.
1170 void *Mem = C.Allocate(
1171 totalSizeToAlloc<Expr *, ValueDecl *, unsigned,
1172 OMPClauseMappableExprCommon::MappableComponent>(
1173 2 * Sizes.NumVars, Sizes.NumUniqueDeclarations,
1174 Sizes.NumUniqueDeclarations + Sizes.NumComponentLists,
1175 Sizes.NumComponents));
1176
1177 auto *Clause =
1178 new (Mem) OMPFromClause(MotionModifiers, MotionModifiersLoc,
1179 UDMQualifierLoc, MapperId, Locs, Sizes);
1180
1181 Clause->setVarRefs(Vars);
1182 Clause->setUDMapperRefs(UDMapperRefs);
1183 Clause->setClauseInfo(Declarations, ComponentLists);
1184 return Clause;
1185 }
1186
1187 OMPFromClause *
CreateEmpty(const ASTContext & C,const OMPMappableExprListSizeTy & Sizes)1188 OMPFromClause::CreateEmpty(const ASTContext &C,
1189 const OMPMappableExprListSizeTy &Sizes) {
1190 void *Mem = C.Allocate(
1191 totalSizeToAlloc<Expr *, ValueDecl *, unsigned,
1192 OMPClauseMappableExprCommon::MappableComponent>(
1193 2 * Sizes.NumVars, Sizes.NumUniqueDeclarations,
1194 Sizes.NumUniqueDeclarations + Sizes.NumComponentLists,
1195 Sizes.NumComponents));
1196 return new (Mem) OMPFromClause(Sizes);
1197 }
1198
setPrivateCopies(ArrayRef<Expr * > VL)1199 void OMPUseDevicePtrClause::setPrivateCopies(ArrayRef<Expr *> VL) {
1200 assert(VL.size() == varlist_size() &&
1201 "Number of private copies is not the same as the preallocated buffer");
1202 std::copy(VL.begin(), VL.end(), varlist_end());
1203 }
1204
setInits(ArrayRef<Expr * > VL)1205 void OMPUseDevicePtrClause::setInits(ArrayRef<Expr *> VL) {
1206 assert(VL.size() == varlist_size() &&
1207 "Number of inits is not the same as the preallocated buffer");
1208 std::copy(VL.begin(), VL.end(), getPrivateCopies().end());
1209 }
1210
Create(const ASTContext & C,const OMPVarListLocTy & Locs,ArrayRef<Expr * > Vars,ArrayRef<Expr * > PrivateVars,ArrayRef<Expr * > Inits,ArrayRef<ValueDecl * > Declarations,MappableExprComponentListsRef ComponentLists)1211 OMPUseDevicePtrClause *OMPUseDevicePtrClause::Create(
1212 const ASTContext &C, const OMPVarListLocTy &Locs, ArrayRef<Expr *> Vars,
1213 ArrayRef<Expr *> PrivateVars, ArrayRef<Expr *> Inits,
1214 ArrayRef<ValueDecl *> Declarations,
1215 MappableExprComponentListsRef ComponentLists) {
1216 OMPMappableExprListSizeTy Sizes;
1217 Sizes.NumVars = Vars.size();
1218 Sizes.NumUniqueDeclarations = getUniqueDeclarationsTotalNumber(Declarations);
1219 Sizes.NumComponentLists = ComponentLists.size();
1220 Sizes.NumComponents = getComponentsTotalNumber(ComponentLists);
1221
1222 // We need to allocate:
1223 // NumVars x Expr* - we have an original list expression for each clause
1224 // list entry.
1225 // NumUniqueDeclarations x ValueDecl* - unique base declarations associated
1226 // with each component list.
1227 // (NumUniqueDeclarations + NumComponentLists) x unsigned - we specify the
1228 // number of lists for each unique declaration and the size of each component
1229 // list.
1230 // NumComponents x MappableComponent - the total of all the components in all
1231 // the lists.
1232 void *Mem = C.Allocate(
1233 totalSizeToAlloc<Expr *, ValueDecl *, unsigned,
1234 OMPClauseMappableExprCommon::MappableComponent>(
1235 3 * Sizes.NumVars, Sizes.NumUniqueDeclarations,
1236 Sizes.NumUniqueDeclarations + Sizes.NumComponentLists,
1237 Sizes.NumComponents));
1238
1239 OMPUseDevicePtrClause *Clause = new (Mem) OMPUseDevicePtrClause(Locs, Sizes);
1240
1241 Clause->setVarRefs(Vars);
1242 Clause->setPrivateCopies(PrivateVars);
1243 Clause->setInits(Inits);
1244 Clause->setClauseInfo(Declarations, ComponentLists);
1245 return Clause;
1246 }
1247
1248 OMPUseDevicePtrClause *
CreateEmpty(const ASTContext & C,const OMPMappableExprListSizeTy & Sizes)1249 OMPUseDevicePtrClause::CreateEmpty(const ASTContext &C,
1250 const OMPMappableExprListSizeTy &Sizes) {
1251 void *Mem = C.Allocate(
1252 totalSizeToAlloc<Expr *, ValueDecl *, unsigned,
1253 OMPClauseMappableExprCommon::MappableComponent>(
1254 3 * Sizes.NumVars, Sizes.NumUniqueDeclarations,
1255 Sizes.NumUniqueDeclarations + Sizes.NumComponentLists,
1256 Sizes.NumComponents));
1257 return new (Mem) OMPUseDevicePtrClause(Sizes);
1258 }
1259
1260 OMPUseDeviceAddrClause *
Create(const ASTContext & C,const OMPVarListLocTy & Locs,ArrayRef<Expr * > Vars,ArrayRef<ValueDecl * > Declarations,MappableExprComponentListsRef ComponentLists)1261 OMPUseDeviceAddrClause::Create(const ASTContext &C, const OMPVarListLocTy &Locs,
1262 ArrayRef<Expr *> Vars,
1263 ArrayRef<ValueDecl *> Declarations,
1264 MappableExprComponentListsRef ComponentLists) {
1265 OMPMappableExprListSizeTy Sizes;
1266 Sizes.NumVars = Vars.size();
1267 Sizes.NumUniqueDeclarations = getUniqueDeclarationsTotalNumber(Declarations);
1268 Sizes.NumComponentLists = ComponentLists.size();
1269 Sizes.NumComponents = getComponentsTotalNumber(ComponentLists);
1270
1271 // We need to allocate:
1272 // 3 x NumVars x Expr* - we have an original list expression for each clause
1273 // list entry and an equal number of private copies and inits.
1274 // NumUniqueDeclarations x ValueDecl* - unique base declarations associated
1275 // with each component list.
1276 // (NumUniqueDeclarations + NumComponentLists) x unsigned - we specify the
1277 // number of lists for each unique declaration and the size of each component
1278 // list.
1279 // NumComponents x MappableComponent - the total of all the components in all
1280 // the lists.
1281 void *Mem = C.Allocate(
1282 totalSizeToAlloc<Expr *, ValueDecl *, unsigned,
1283 OMPClauseMappableExprCommon::MappableComponent>(
1284 Sizes.NumVars, Sizes.NumUniqueDeclarations,
1285 Sizes.NumUniqueDeclarations + Sizes.NumComponentLists,
1286 Sizes.NumComponents));
1287
1288 auto *Clause = new (Mem) OMPUseDeviceAddrClause(Locs, Sizes);
1289
1290 Clause->setVarRefs(Vars);
1291 Clause->setClauseInfo(Declarations, ComponentLists);
1292 return Clause;
1293 }
1294
1295 OMPUseDeviceAddrClause *
CreateEmpty(const ASTContext & C,const OMPMappableExprListSizeTy & Sizes)1296 OMPUseDeviceAddrClause::CreateEmpty(const ASTContext &C,
1297 const OMPMappableExprListSizeTy &Sizes) {
1298 void *Mem = C.Allocate(
1299 totalSizeToAlloc<Expr *, ValueDecl *, unsigned,
1300 OMPClauseMappableExprCommon::MappableComponent>(
1301 Sizes.NumVars, Sizes.NumUniqueDeclarations,
1302 Sizes.NumUniqueDeclarations + Sizes.NumComponentLists,
1303 Sizes.NumComponents));
1304 return new (Mem) OMPUseDeviceAddrClause(Sizes);
1305 }
1306
1307 OMPIsDevicePtrClause *
Create(const ASTContext & C,const OMPVarListLocTy & Locs,ArrayRef<Expr * > Vars,ArrayRef<ValueDecl * > Declarations,MappableExprComponentListsRef ComponentLists)1308 OMPIsDevicePtrClause::Create(const ASTContext &C, const OMPVarListLocTy &Locs,
1309 ArrayRef<Expr *> Vars,
1310 ArrayRef<ValueDecl *> Declarations,
1311 MappableExprComponentListsRef ComponentLists) {
1312 OMPMappableExprListSizeTy Sizes;
1313 Sizes.NumVars = Vars.size();
1314 Sizes.NumUniqueDeclarations = getUniqueDeclarationsTotalNumber(Declarations);
1315 Sizes.NumComponentLists = ComponentLists.size();
1316 Sizes.NumComponents = getComponentsTotalNumber(ComponentLists);
1317
1318 // We need to allocate:
1319 // NumVars x Expr* - we have an original list expression for each clause list
1320 // entry.
1321 // NumUniqueDeclarations x ValueDecl* - unique base declarations associated
1322 // with each component list.
1323 // (NumUniqueDeclarations + NumComponentLists) x unsigned - we specify the
1324 // number of lists for each unique declaration and the size of each component
1325 // list.
1326 // NumComponents x MappableComponent - the total of all the components in all
1327 // the lists.
1328 void *Mem = C.Allocate(
1329 totalSizeToAlloc<Expr *, ValueDecl *, unsigned,
1330 OMPClauseMappableExprCommon::MappableComponent>(
1331 Sizes.NumVars, Sizes.NumUniqueDeclarations,
1332 Sizes.NumUniqueDeclarations + Sizes.NumComponentLists,
1333 Sizes.NumComponents));
1334
1335 OMPIsDevicePtrClause *Clause = new (Mem) OMPIsDevicePtrClause(Locs, Sizes);
1336
1337 Clause->setVarRefs(Vars);
1338 Clause->setClauseInfo(Declarations, ComponentLists);
1339 return Clause;
1340 }
1341
1342 OMPIsDevicePtrClause *
CreateEmpty(const ASTContext & C,const OMPMappableExprListSizeTy & Sizes)1343 OMPIsDevicePtrClause::CreateEmpty(const ASTContext &C,
1344 const OMPMappableExprListSizeTy &Sizes) {
1345 void *Mem = C.Allocate(
1346 totalSizeToAlloc<Expr *, ValueDecl *, unsigned,
1347 OMPClauseMappableExprCommon::MappableComponent>(
1348 Sizes.NumVars, Sizes.NumUniqueDeclarations,
1349 Sizes.NumUniqueDeclarations + Sizes.NumComponentLists,
1350 Sizes.NumComponents));
1351 return new (Mem) OMPIsDevicePtrClause(Sizes);
1352 }
1353
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc,ArrayRef<Expr * > VL)1354 OMPNontemporalClause *OMPNontemporalClause::Create(const ASTContext &C,
1355 SourceLocation StartLoc,
1356 SourceLocation LParenLoc,
1357 SourceLocation EndLoc,
1358 ArrayRef<Expr *> VL) {
1359 // Allocate space for nontemporal variables + private references.
1360 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(2 * VL.size()));
1361 auto *Clause =
1362 new (Mem) OMPNontemporalClause(StartLoc, LParenLoc, EndLoc, VL.size());
1363 Clause->setVarRefs(VL);
1364 return Clause;
1365 }
1366
CreateEmpty(const ASTContext & C,unsigned N)1367 OMPNontemporalClause *OMPNontemporalClause::CreateEmpty(const ASTContext &C,
1368 unsigned N) {
1369 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(2 * N));
1370 return new (Mem) OMPNontemporalClause(N);
1371 }
1372
setPrivateRefs(ArrayRef<Expr * > VL)1373 void OMPNontemporalClause::setPrivateRefs(ArrayRef<Expr *> VL) {
1374 assert(VL.size() == varlist_size() && "Number of private references is not "
1375 "the same as the preallocated buffer");
1376 std::copy(VL.begin(), VL.end(), varlist_end());
1377 }
1378
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc,ArrayRef<Expr * > VL)1379 OMPInclusiveClause *OMPInclusiveClause::Create(const ASTContext &C,
1380 SourceLocation StartLoc,
1381 SourceLocation LParenLoc,
1382 SourceLocation EndLoc,
1383 ArrayRef<Expr *> VL) {
1384 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(VL.size()));
1385 auto *Clause =
1386 new (Mem) OMPInclusiveClause(StartLoc, LParenLoc, EndLoc, VL.size());
1387 Clause->setVarRefs(VL);
1388 return Clause;
1389 }
1390
CreateEmpty(const ASTContext & C,unsigned N)1391 OMPInclusiveClause *OMPInclusiveClause::CreateEmpty(const ASTContext &C,
1392 unsigned N) {
1393 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(N));
1394 return new (Mem) OMPInclusiveClause(N);
1395 }
1396
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc,ArrayRef<Expr * > VL)1397 OMPExclusiveClause *OMPExclusiveClause::Create(const ASTContext &C,
1398 SourceLocation StartLoc,
1399 SourceLocation LParenLoc,
1400 SourceLocation EndLoc,
1401 ArrayRef<Expr *> VL) {
1402 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(VL.size()));
1403 auto *Clause =
1404 new (Mem) OMPExclusiveClause(StartLoc, LParenLoc, EndLoc, VL.size());
1405 Clause->setVarRefs(VL);
1406 return Clause;
1407 }
1408
CreateEmpty(const ASTContext & C,unsigned N)1409 OMPExclusiveClause *OMPExclusiveClause::CreateEmpty(const ASTContext &C,
1410 unsigned N) {
1411 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(N));
1412 return new (Mem) OMPExclusiveClause(N);
1413 }
1414
setAllocatorsData(ArrayRef<OMPUsesAllocatorsClause::Data> Data)1415 void OMPUsesAllocatorsClause::setAllocatorsData(
1416 ArrayRef<OMPUsesAllocatorsClause::Data> Data) {
1417 assert(Data.size() == NumOfAllocators &&
1418 "Size of allocators data is not the same as the preallocated buffer.");
1419 for (unsigned I = 0, E = Data.size(); I < E; ++I) {
1420 const OMPUsesAllocatorsClause::Data &D = Data[I];
1421 getTrailingObjects<Expr *>()[I * static_cast<int>(ExprOffsets::Total) +
1422 static_cast<int>(ExprOffsets::Allocator)] =
1423 D.Allocator;
1424 getTrailingObjects<Expr *>()[I * static_cast<int>(ExprOffsets::Total) +
1425 static_cast<int>(
1426 ExprOffsets::AllocatorTraits)] =
1427 D.AllocatorTraits;
1428 getTrailingObjects<
1429 SourceLocation>()[I * static_cast<int>(ParenLocsOffsets::Total) +
1430 static_cast<int>(ParenLocsOffsets::LParen)] =
1431 D.LParenLoc;
1432 getTrailingObjects<
1433 SourceLocation>()[I * static_cast<int>(ParenLocsOffsets::Total) +
1434 static_cast<int>(ParenLocsOffsets::RParen)] =
1435 D.RParenLoc;
1436 }
1437 }
1438
1439 OMPUsesAllocatorsClause::Data
getAllocatorData(unsigned I) const1440 OMPUsesAllocatorsClause::getAllocatorData(unsigned I) const {
1441 OMPUsesAllocatorsClause::Data Data;
1442 Data.Allocator =
1443 getTrailingObjects<Expr *>()[I * static_cast<int>(ExprOffsets::Total) +
1444 static_cast<int>(ExprOffsets::Allocator)];
1445 Data.AllocatorTraits =
1446 getTrailingObjects<Expr *>()[I * static_cast<int>(ExprOffsets::Total) +
1447 static_cast<int>(
1448 ExprOffsets::AllocatorTraits)];
1449 Data.LParenLoc = getTrailingObjects<
1450 SourceLocation>()[I * static_cast<int>(ParenLocsOffsets::Total) +
1451 static_cast<int>(ParenLocsOffsets::LParen)];
1452 Data.RParenLoc = getTrailingObjects<
1453 SourceLocation>()[I * static_cast<int>(ParenLocsOffsets::Total) +
1454 static_cast<int>(ParenLocsOffsets::RParen)];
1455 return Data;
1456 }
1457
1458 OMPUsesAllocatorsClause *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation EndLoc,ArrayRef<OMPUsesAllocatorsClause::Data> Data)1459 OMPUsesAllocatorsClause::Create(const ASTContext &C, SourceLocation StartLoc,
1460 SourceLocation LParenLoc, SourceLocation EndLoc,
1461 ArrayRef<OMPUsesAllocatorsClause::Data> Data) {
1462 void *Mem = C.Allocate(totalSizeToAlloc<Expr *, SourceLocation>(
1463 static_cast<int>(ExprOffsets::Total) * Data.size(),
1464 static_cast<int>(ParenLocsOffsets::Total) * Data.size()));
1465 auto *Clause = new (Mem)
1466 OMPUsesAllocatorsClause(StartLoc, LParenLoc, EndLoc, Data.size());
1467 Clause->setAllocatorsData(Data);
1468 return Clause;
1469 }
1470
1471 OMPUsesAllocatorsClause *
CreateEmpty(const ASTContext & C,unsigned N)1472 OMPUsesAllocatorsClause::CreateEmpty(const ASTContext &C, unsigned N) {
1473 void *Mem = C.Allocate(totalSizeToAlloc<Expr *, SourceLocation>(
1474 static_cast<int>(ExprOffsets::Total) * N,
1475 static_cast<int>(ParenLocsOffsets::Total) * N));
1476 return new (Mem) OMPUsesAllocatorsClause(N);
1477 }
1478
1479 OMPAffinityClause *
Create(const ASTContext & C,SourceLocation StartLoc,SourceLocation LParenLoc,SourceLocation ColonLoc,SourceLocation EndLoc,Expr * Modifier,ArrayRef<Expr * > Locators)1480 OMPAffinityClause::Create(const ASTContext &C, SourceLocation StartLoc,
1481 SourceLocation LParenLoc, SourceLocation ColonLoc,
1482 SourceLocation EndLoc, Expr *Modifier,
1483 ArrayRef<Expr *> Locators) {
1484 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(Locators.size() + 1));
1485 auto *Clause = new (Mem)
1486 OMPAffinityClause(StartLoc, LParenLoc, ColonLoc, EndLoc, Locators.size());
1487 Clause->setModifier(Modifier);
1488 Clause->setVarRefs(Locators);
1489 return Clause;
1490 }
1491
CreateEmpty(const ASTContext & C,unsigned N)1492 OMPAffinityClause *OMPAffinityClause::CreateEmpty(const ASTContext &C,
1493 unsigned N) {
1494 void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(N + 1));
1495 return new (Mem) OMPAffinityClause(N);
1496 }
1497
1498 //===----------------------------------------------------------------------===//
1499 // OpenMP clauses printing methods
1500 //===----------------------------------------------------------------------===//
1501
VisitOMPIfClause(OMPIfClause * Node)1502 void OMPClausePrinter::VisitOMPIfClause(OMPIfClause *Node) {
1503 OS << "if(";
1504 if (Node->getNameModifier() != OMPD_unknown)
1505 OS << getOpenMPDirectiveName(Node->getNameModifier()) << ": ";
1506 Node->getCondition()->printPretty(OS, nullptr, Policy, 0);
1507 OS << ")";
1508 }
1509
VisitOMPFinalClause(OMPFinalClause * Node)1510 void OMPClausePrinter::VisitOMPFinalClause(OMPFinalClause *Node) {
1511 OS << "final(";
1512 Node->getCondition()->printPretty(OS, nullptr, Policy, 0);
1513 OS << ")";
1514 }
1515
VisitOMPNumThreadsClause(OMPNumThreadsClause * Node)1516 void OMPClausePrinter::VisitOMPNumThreadsClause(OMPNumThreadsClause *Node) {
1517 OS << "num_threads(";
1518 Node->getNumThreads()->printPretty(OS, nullptr, Policy, 0);
1519 OS << ")";
1520 }
1521
VisitOMPSafelenClause(OMPSafelenClause * Node)1522 void OMPClausePrinter::VisitOMPSafelenClause(OMPSafelenClause *Node) {
1523 OS << "safelen(";
1524 Node->getSafelen()->printPretty(OS, nullptr, Policy, 0);
1525 OS << ")";
1526 }
1527
VisitOMPSimdlenClause(OMPSimdlenClause * Node)1528 void OMPClausePrinter::VisitOMPSimdlenClause(OMPSimdlenClause *Node) {
1529 OS << "simdlen(";
1530 Node->getSimdlen()->printPretty(OS, nullptr, Policy, 0);
1531 OS << ")";
1532 }
1533
VisitOMPAllocatorClause(OMPAllocatorClause * Node)1534 void OMPClausePrinter::VisitOMPAllocatorClause(OMPAllocatorClause *Node) {
1535 OS << "allocator(";
1536 Node->getAllocator()->printPretty(OS, nullptr, Policy, 0);
1537 OS << ")";
1538 }
1539
VisitOMPCollapseClause(OMPCollapseClause * Node)1540 void OMPClausePrinter::VisitOMPCollapseClause(OMPCollapseClause *Node) {
1541 OS << "collapse(";
1542 Node->getNumForLoops()->printPretty(OS, nullptr, Policy, 0);
1543 OS << ")";
1544 }
1545
VisitOMPDetachClause(OMPDetachClause * Node)1546 void OMPClausePrinter::VisitOMPDetachClause(OMPDetachClause *Node) {
1547 OS << "detach(";
1548 Node->getEventHandler()->printPretty(OS, nullptr, Policy, 0);
1549 OS << ")";
1550 }
1551
VisitOMPDefaultClause(OMPDefaultClause * Node)1552 void OMPClausePrinter::VisitOMPDefaultClause(OMPDefaultClause *Node) {
1553 OS << "default("
1554 << getOpenMPSimpleClauseTypeName(OMPC_default,
1555 unsigned(Node->getDefaultKind()))
1556 << ")";
1557 }
1558
VisitOMPProcBindClause(OMPProcBindClause * Node)1559 void OMPClausePrinter::VisitOMPProcBindClause(OMPProcBindClause *Node) {
1560 OS << "proc_bind("
1561 << getOpenMPSimpleClauseTypeName(OMPC_proc_bind,
1562 unsigned(Node->getProcBindKind()))
1563 << ")";
1564 }
1565
VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *)1566 void OMPClausePrinter::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {
1567 OS << "unified_address";
1568 }
1569
VisitOMPUnifiedSharedMemoryClause(OMPUnifiedSharedMemoryClause *)1570 void OMPClausePrinter::VisitOMPUnifiedSharedMemoryClause(
1571 OMPUnifiedSharedMemoryClause *) {
1572 OS << "unified_shared_memory";
1573 }
1574
VisitOMPReverseOffloadClause(OMPReverseOffloadClause *)1575 void OMPClausePrinter::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {
1576 OS << "reverse_offload";
1577 }
1578
VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *)1579 void OMPClausePrinter::VisitOMPDynamicAllocatorsClause(
1580 OMPDynamicAllocatorsClause *) {
1581 OS << "dynamic_allocators";
1582 }
1583
VisitOMPAtomicDefaultMemOrderClause(OMPAtomicDefaultMemOrderClause * Node)1584 void OMPClausePrinter::VisitOMPAtomicDefaultMemOrderClause(
1585 OMPAtomicDefaultMemOrderClause *Node) {
1586 OS << "atomic_default_mem_order("
1587 << getOpenMPSimpleClauseTypeName(OMPC_atomic_default_mem_order,
1588 Node->getAtomicDefaultMemOrderKind())
1589 << ")";
1590 }
1591
VisitOMPScheduleClause(OMPScheduleClause * Node)1592 void OMPClausePrinter::VisitOMPScheduleClause(OMPScheduleClause *Node) {
1593 OS << "schedule(";
1594 if (Node->getFirstScheduleModifier() != OMPC_SCHEDULE_MODIFIER_unknown) {
1595 OS << getOpenMPSimpleClauseTypeName(OMPC_schedule,
1596 Node->getFirstScheduleModifier());
1597 if (Node->getSecondScheduleModifier() != OMPC_SCHEDULE_MODIFIER_unknown) {
1598 OS << ", ";
1599 OS << getOpenMPSimpleClauseTypeName(OMPC_schedule,
1600 Node->getSecondScheduleModifier());
1601 }
1602 OS << ": ";
1603 }
1604 OS << getOpenMPSimpleClauseTypeName(OMPC_schedule, Node->getScheduleKind());
1605 if (auto *E = Node->getChunkSize()) {
1606 OS << ", ";
1607 E->printPretty(OS, nullptr, Policy);
1608 }
1609 OS << ")";
1610 }
1611
VisitOMPOrderedClause(OMPOrderedClause * Node)1612 void OMPClausePrinter::VisitOMPOrderedClause(OMPOrderedClause *Node) {
1613 OS << "ordered";
1614 if (auto *Num = Node->getNumForLoops()) {
1615 OS << "(";
1616 Num->printPretty(OS, nullptr, Policy, 0);
1617 OS << ")";
1618 }
1619 }
1620
VisitOMPNowaitClause(OMPNowaitClause *)1621 void OMPClausePrinter::VisitOMPNowaitClause(OMPNowaitClause *) {
1622 OS << "nowait";
1623 }
1624
VisitOMPUntiedClause(OMPUntiedClause *)1625 void OMPClausePrinter::VisitOMPUntiedClause(OMPUntiedClause *) {
1626 OS << "untied";
1627 }
1628
VisitOMPNogroupClause(OMPNogroupClause *)1629 void OMPClausePrinter::VisitOMPNogroupClause(OMPNogroupClause *) {
1630 OS << "nogroup";
1631 }
1632
VisitOMPMergeableClause(OMPMergeableClause *)1633 void OMPClausePrinter::VisitOMPMergeableClause(OMPMergeableClause *) {
1634 OS << "mergeable";
1635 }
1636
VisitOMPReadClause(OMPReadClause *)1637 void OMPClausePrinter::VisitOMPReadClause(OMPReadClause *) { OS << "read"; }
1638
VisitOMPWriteClause(OMPWriteClause *)1639 void OMPClausePrinter::VisitOMPWriteClause(OMPWriteClause *) { OS << "write"; }
1640
VisitOMPUpdateClause(OMPUpdateClause * Node)1641 void OMPClausePrinter::VisitOMPUpdateClause(OMPUpdateClause *Node) {
1642 OS << "update";
1643 if (Node->isExtended()) {
1644 OS << "(";
1645 OS << getOpenMPSimpleClauseTypeName(Node->getClauseKind(),
1646 Node->getDependencyKind());
1647 OS << ")";
1648 }
1649 }
1650
VisitOMPCaptureClause(OMPCaptureClause *)1651 void OMPClausePrinter::VisitOMPCaptureClause(OMPCaptureClause *) {
1652 OS << "capture";
1653 }
1654
VisitOMPSeqCstClause(OMPSeqCstClause *)1655 void OMPClausePrinter::VisitOMPSeqCstClause(OMPSeqCstClause *) {
1656 OS << "seq_cst";
1657 }
1658
VisitOMPAcqRelClause(OMPAcqRelClause *)1659 void OMPClausePrinter::VisitOMPAcqRelClause(OMPAcqRelClause *) {
1660 OS << "acq_rel";
1661 }
1662
VisitOMPAcquireClause(OMPAcquireClause *)1663 void OMPClausePrinter::VisitOMPAcquireClause(OMPAcquireClause *) {
1664 OS << "acquire";
1665 }
1666
VisitOMPReleaseClause(OMPReleaseClause *)1667 void OMPClausePrinter::VisitOMPReleaseClause(OMPReleaseClause *) {
1668 OS << "release";
1669 }
1670
VisitOMPRelaxedClause(OMPRelaxedClause *)1671 void OMPClausePrinter::VisitOMPRelaxedClause(OMPRelaxedClause *) {
1672 OS << "relaxed";
1673 }
1674
VisitOMPThreadsClause(OMPThreadsClause *)1675 void OMPClausePrinter::VisitOMPThreadsClause(OMPThreadsClause *) {
1676 OS << "threads";
1677 }
1678
VisitOMPSIMDClause(OMPSIMDClause *)1679 void OMPClausePrinter::VisitOMPSIMDClause(OMPSIMDClause *) { OS << "simd"; }
1680
VisitOMPDeviceClause(OMPDeviceClause * Node)1681 void OMPClausePrinter::VisitOMPDeviceClause(OMPDeviceClause *Node) {
1682 OS << "device(";
1683 OpenMPDeviceClauseModifier Modifier = Node->getModifier();
1684 if (Modifier != OMPC_DEVICE_unknown) {
1685 OS << getOpenMPSimpleClauseTypeName(Node->getClauseKind(), Modifier)
1686 << ": ";
1687 }
1688 Node->getDevice()->printPretty(OS, nullptr, Policy, 0);
1689 OS << ")";
1690 }
1691
VisitOMPNumTeamsClause(OMPNumTeamsClause * Node)1692 void OMPClausePrinter::VisitOMPNumTeamsClause(OMPNumTeamsClause *Node) {
1693 OS << "num_teams(";
1694 Node->getNumTeams()->printPretty(OS, nullptr, Policy, 0);
1695 OS << ")";
1696 }
1697
VisitOMPThreadLimitClause(OMPThreadLimitClause * Node)1698 void OMPClausePrinter::VisitOMPThreadLimitClause(OMPThreadLimitClause *Node) {
1699 OS << "thread_limit(";
1700 Node->getThreadLimit()->printPretty(OS, nullptr, Policy, 0);
1701 OS << ")";
1702 }
1703
VisitOMPPriorityClause(OMPPriorityClause * Node)1704 void OMPClausePrinter::VisitOMPPriorityClause(OMPPriorityClause *Node) {
1705 OS << "priority(";
1706 Node->getPriority()->printPretty(OS, nullptr, Policy, 0);
1707 OS << ")";
1708 }
1709
VisitOMPGrainsizeClause(OMPGrainsizeClause * Node)1710 void OMPClausePrinter::VisitOMPGrainsizeClause(OMPGrainsizeClause *Node) {
1711 OS << "grainsize(";
1712 Node->getGrainsize()->printPretty(OS, nullptr, Policy, 0);
1713 OS << ")";
1714 }
1715
VisitOMPNumTasksClause(OMPNumTasksClause * Node)1716 void OMPClausePrinter::VisitOMPNumTasksClause(OMPNumTasksClause *Node) {
1717 OS << "num_tasks(";
1718 Node->getNumTasks()->printPretty(OS, nullptr, Policy, 0);
1719 OS << ")";
1720 }
1721
VisitOMPHintClause(OMPHintClause * Node)1722 void OMPClausePrinter::VisitOMPHintClause(OMPHintClause *Node) {
1723 OS << "hint(";
1724 Node->getHint()->printPretty(OS, nullptr, Policy, 0);
1725 OS << ")";
1726 }
1727
VisitOMPDestroyClause(OMPDestroyClause *)1728 void OMPClausePrinter::VisitOMPDestroyClause(OMPDestroyClause *) {
1729 OS << "destroy";
1730 }
1731
1732 template<typename T>
VisitOMPClauseList(T * Node,char StartSym)1733 void OMPClausePrinter::VisitOMPClauseList(T *Node, char StartSym) {
1734 for (typename T::varlist_iterator I = Node->varlist_begin(),
1735 E = Node->varlist_end();
1736 I != E; ++I) {
1737 assert(*I && "Expected non-null Stmt");
1738 OS << (I == Node->varlist_begin() ? StartSym : ',');
1739 if (auto *DRE = dyn_cast<DeclRefExpr>(*I)) {
1740 if (isa<OMPCapturedExprDecl>(DRE->getDecl()))
1741 DRE->printPretty(OS, nullptr, Policy, 0);
1742 else
1743 DRE->getDecl()->printQualifiedName(OS);
1744 } else
1745 (*I)->printPretty(OS, nullptr, Policy, 0);
1746 }
1747 }
1748
VisitOMPAllocateClause(OMPAllocateClause * Node)1749 void OMPClausePrinter::VisitOMPAllocateClause(OMPAllocateClause *Node) {
1750 if (Node->varlist_empty())
1751 return;
1752 OS << "allocate";
1753 if (Expr *Allocator = Node->getAllocator()) {
1754 OS << "(";
1755 Allocator->printPretty(OS, nullptr, Policy, 0);
1756 OS << ":";
1757 VisitOMPClauseList(Node, ' ');
1758 } else {
1759 VisitOMPClauseList(Node, '(');
1760 }
1761 OS << ")";
1762 }
1763
VisitOMPPrivateClause(OMPPrivateClause * Node)1764 void OMPClausePrinter::VisitOMPPrivateClause(OMPPrivateClause *Node) {
1765 if (!Node->varlist_empty()) {
1766 OS << "private";
1767 VisitOMPClauseList(Node, '(');
1768 OS << ")";
1769 }
1770 }
1771
VisitOMPFirstprivateClause(OMPFirstprivateClause * Node)1772 void OMPClausePrinter::VisitOMPFirstprivateClause(OMPFirstprivateClause *Node) {
1773 if (!Node->varlist_empty()) {
1774 OS << "firstprivate";
1775 VisitOMPClauseList(Node, '(');
1776 OS << ")";
1777 }
1778 }
1779
VisitOMPLastprivateClause(OMPLastprivateClause * Node)1780 void OMPClausePrinter::VisitOMPLastprivateClause(OMPLastprivateClause *Node) {
1781 if (!Node->varlist_empty()) {
1782 OS << "lastprivate";
1783 OpenMPLastprivateModifier LPKind = Node->getKind();
1784 if (LPKind != OMPC_LASTPRIVATE_unknown) {
1785 OS << "("
1786 << getOpenMPSimpleClauseTypeName(OMPC_lastprivate, Node->getKind())
1787 << ":";
1788 }
1789 VisitOMPClauseList(Node, LPKind == OMPC_LASTPRIVATE_unknown ? '(' : ' ');
1790 OS << ")";
1791 }
1792 }
1793
VisitOMPSharedClause(OMPSharedClause * Node)1794 void OMPClausePrinter::VisitOMPSharedClause(OMPSharedClause *Node) {
1795 if (!Node->varlist_empty()) {
1796 OS << "shared";
1797 VisitOMPClauseList(Node, '(');
1798 OS << ")";
1799 }
1800 }
1801
VisitOMPReductionClause(OMPReductionClause * Node)1802 void OMPClausePrinter::VisitOMPReductionClause(OMPReductionClause *Node) {
1803 if (!Node->varlist_empty()) {
1804 OS << "reduction(";
1805 if (Node->getModifierLoc().isValid())
1806 OS << getOpenMPSimpleClauseTypeName(OMPC_reduction, Node->getModifier())
1807 << ", ";
1808 NestedNameSpecifier *QualifierLoc =
1809 Node->getQualifierLoc().getNestedNameSpecifier();
1810 OverloadedOperatorKind OOK =
1811 Node->getNameInfo().getName().getCXXOverloadedOperator();
1812 if (QualifierLoc == nullptr && OOK != OO_None) {
1813 // Print reduction identifier in C format
1814 OS << getOperatorSpelling(OOK);
1815 } else {
1816 // Use C++ format
1817 if (QualifierLoc != nullptr)
1818 QualifierLoc->print(OS, Policy);
1819 OS << Node->getNameInfo();
1820 }
1821 OS << ":";
1822 VisitOMPClauseList(Node, ' ');
1823 OS << ")";
1824 }
1825 }
1826
VisitOMPTaskReductionClause(OMPTaskReductionClause * Node)1827 void OMPClausePrinter::VisitOMPTaskReductionClause(
1828 OMPTaskReductionClause *Node) {
1829 if (!Node->varlist_empty()) {
1830 OS << "task_reduction(";
1831 NestedNameSpecifier *QualifierLoc =
1832 Node->getQualifierLoc().getNestedNameSpecifier();
1833 OverloadedOperatorKind OOK =
1834 Node->getNameInfo().getName().getCXXOverloadedOperator();
1835 if (QualifierLoc == nullptr && OOK != OO_None) {
1836 // Print reduction identifier in C format
1837 OS << getOperatorSpelling(OOK);
1838 } else {
1839 // Use C++ format
1840 if (QualifierLoc != nullptr)
1841 QualifierLoc->print(OS, Policy);
1842 OS << Node->getNameInfo();
1843 }
1844 OS << ":";
1845 VisitOMPClauseList(Node, ' ');
1846 OS << ")";
1847 }
1848 }
1849
VisitOMPInReductionClause(OMPInReductionClause * Node)1850 void OMPClausePrinter::VisitOMPInReductionClause(OMPInReductionClause *Node) {
1851 if (!Node->varlist_empty()) {
1852 OS << "in_reduction(";
1853 NestedNameSpecifier *QualifierLoc =
1854 Node->getQualifierLoc().getNestedNameSpecifier();
1855 OverloadedOperatorKind OOK =
1856 Node->getNameInfo().getName().getCXXOverloadedOperator();
1857 if (QualifierLoc == nullptr && OOK != OO_None) {
1858 // Print reduction identifier in C format
1859 OS << getOperatorSpelling(OOK);
1860 } else {
1861 // Use C++ format
1862 if (QualifierLoc != nullptr)
1863 QualifierLoc->print(OS, Policy);
1864 OS << Node->getNameInfo();
1865 }
1866 OS << ":";
1867 VisitOMPClauseList(Node, ' ');
1868 OS << ")";
1869 }
1870 }
1871
VisitOMPLinearClause(OMPLinearClause * Node)1872 void OMPClausePrinter::VisitOMPLinearClause(OMPLinearClause *Node) {
1873 if (!Node->varlist_empty()) {
1874 OS << "linear";
1875 if (Node->getModifierLoc().isValid()) {
1876 OS << '('
1877 << getOpenMPSimpleClauseTypeName(OMPC_linear, Node->getModifier());
1878 }
1879 VisitOMPClauseList(Node, '(');
1880 if (Node->getModifierLoc().isValid())
1881 OS << ')';
1882 if (Node->getStep() != nullptr) {
1883 OS << ": ";
1884 Node->getStep()->printPretty(OS, nullptr, Policy, 0);
1885 }
1886 OS << ")";
1887 }
1888 }
1889
VisitOMPAlignedClause(OMPAlignedClause * Node)1890 void OMPClausePrinter::VisitOMPAlignedClause(OMPAlignedClause *Node) {
1891 if (!Node->varlist_empty()) {
1892 OS << "aligned";
1893 VisitOMPClauseList(Node, '(');
1894 if (Node->getAlignment() != nullptr) {
1895 OS << ": ";
1896 Node->getAlignment()->printPretty(OS, nullptr, Policy, 0);
1897 }
1898 OS << ")";
1899 }
1900 }
1901
VisitOMPCopyinClause(OMPCopyinClause * Node)1902 void OMPClausePrinter::VisitOMPCopyinClause(OMPCopyinClause *Node) {
1903 if (!Node->varlist_empty()) {
1904 OS << "copyin";
1905 VisitOMPClauseList(Node, '(');
1906 OS << ")";
1907 }
1908 }
1909
VisitOMPCopyprivateClause(OMPCopyprivateClause * Node)1910 void OMPClausePrinter::VisitOMPCopyprivateClause(OMPCopyprivateClause *Node) {
1911 if (!Node->varlist_empty()) {
1912 OS << "copyprivate";
1913 VisitOMPClauseList(Node, '(');
1914 OS << ")";
1915 }
1916 }
1917
VisitOMPFlushClause(OMPFlushClause * Node)1918 void OMPClausePrinter::VisitOMPFlushClause(OMPFlushClause *Node) {
1919 if (!Node->varlist_empty()) {
1920 VisitOMPClauseList(Node, '(');
1921 OS << ")";
1922 }
1923 }
1924
VisitOMPDepobjClause(OMPDepobjClause * Node)1925 void OMPClausePrinter::VisitOMPDepobjClause(OMPDepobjClause *Node) {
1926 OS << "(";
1927 Node->getDepobj()->printPretty(OS, nullptr, Policy, 0);
1928 OS << ")";
1929 }
1930
VisitOMPDependClause(OMPDependClause * Node)1931 void OMPClausePrinter::VisitOMPDependClause(OMPDependClause *Node) {
1932 OS << "depend(";
1933 if (Expr *DepModifier = Node->getModifier()) {
1934 DepModifier->printPretty(OS, nullptr, Policy);
1935 OS << ", ";
1936 }
1937 OS << getOpenMPSimpleClauseTypeName(Node->getClauseKind(),
1938 Node->getDependencyKind());
1939 if (!Node->varlist_empty()) {
1940 OS << " :";
1941 VisitOMPClauseList(Node, ' ');
1942 }
1943 OS << ")";
1944 }
1945
1946 template <typename T>
PrintMapper(raw_ostream & OS,T * Node,const PrintingPolicy & Policy)1947 static void PrintMapper(raw_ostream &OS, T *Node,
1948 const PrintingPolicy &Policy) {
1949 OS << '(';
1950 NestedNameSpecifier *MapperNNS =
1951 Node->getMapperQualifierLoc().getNestedNameSpecifier();
1952 if (MapperNNS)
1953 MapperNNS->print(OS, Policy);
1954 OS << Node->getMapperIdInfo() << ')';
1955 }
1956
VisitOMPMapClause(OMPMapClause * Node)1957 void OMPClausePrinter::VisitOMPMapClause(OMPMapClause *Node) {
1958 if (!Node->varlist_empty()) {
1959 OS << "map(";
1960 if (Node->getMapType() != OMPC_MAP_unknown) {
1961 for (unsigned I = 0; I < NumberOfOMPMapClauseModifiers; ++I) {
1962 if (Node->getMapTypeModifier(I) != OMPC_MAP_MODIFIER_unknown) {
1963 OS << getOpenMPSimpleClauseTypeName(OMPC_map,
1964 Node->getMapTypeModifier(I));
1965 if (Node->getMapTypeModifier(I) == OMPC_MAP_MODIFIER_mapper)
1966 PrintMapper(OS, Node, Policy);
1967 OS << ',';
1968 }
1969 }
1970 OS << getOpenMPSimpleClauseTypeName(OMPC_map, Node->getMapType());
1971 OS << ':';
1972 }
1973 VisitOMPClauseList(Node, ' ');
1974 OS << ")";
1975 }
1976 }
1977
VisitOMPMotionClause(T * Node)1978 template <typename T> void OMPClausePrinter::VisitOMPMotionClause(T *Node) {
1979 if (Node->varlist_empty())
1980 return;
1981 OS << getOpenMPClauseName(Node->getClauseKind());
1982 unsigned ModifierCount = 0;
1983 for (unsigned I = 0; I < NumberOfOMPMotionModifiers; ++I) {
1984 if (Node->getMotionModifier(I) != OMPC_MOTION_MODIFIER_unknown)
1985 ++ModifierCount;
1986 }
1987 if (ModifierCount) {
1988 OS << '(';
1989 for (unsigned I = 0; I < NumberOfOMPMotionModifiers; ++I) {
1990 if (Node->getMotionModifier(I) != OMPC_MOTION_MODIFIER_unknown) {
1991 OS << getOpenMPSimpleClauseTypeName(Node->getClauseKind(),
1992 Node->getMotionModifier(I));
1993 if (Node->getMotionModifier(I) == OMPC_MOTION_MODIFIER_mapper)
1994 PrintMapper(OS, Node, Policy);
1995 if (I < ModifierCount - 1)
1996 OS << ", ";
1997 }
1998 }
1999 OS << ':';
2000 VisitOMPClauseList(Node, ' ');
2001 } else {
2002 VisitOMPClauseList(Node, '(');
2003 }
2004 OS << ")";
2005 }
2006
VisitOMPToClause(OMPToClause * Node)2007 void OMPClausePrinter::VisitOMPToClause(OMPToClause *Node) {
2008 VisitOMPMotionClause(Node);
2009 }
2010
VisitOMPFromClause(OMPFromClause * Node)2011 void OMPClausePrinter::VisitOMPFromClause(OMPFromClause *Node) {
2012 VisitOMPMotionClause(Node);
2013 }
2014
VisitOMPDistScheduleClause(OMPDistScheduleClause * Node)2015 void OMPClausePrinter::VisitOMPDistScheduleClause(OMPDistScheduleClause *Node) {
2016 OS << "dist_schedule(" << getOpenMPSimpleClauseTypeName(
2017 OMPC_dist_schedule, Node->getDistScheduleKind());
2018 if (auto *E = Node->getChunkSize()) {
2019 OS << ", ";
2020 E->printPretty(OS, nullptr, Policy);
2021 }
2022 OS << ")";
2023 }
2024
VisitOMPDefaultmapClause(OMPDefaultmapClause * Node)2025 void OMPClausePrinter::VisitOMPDefaultmapClause(OMPDefaultmapClause *Node) {
2026 OS << "defaultmap(";
2027 OS << getOpenMPSimpleClauseTypeName(OMPC_defaultmap,
2028 Node->getDefaultmapModifier());
2029 if (Node->getDefaultmapKind() != OMPC_DEFAULTMAP_unknown) {
2030 OS << ": ";
2031 OS << getOpenMPSimpleClauseTypeName(OMPC_defaultmap,
2032 Node->getDefaultmapKind());
2033 }
2034 OS << ")";
2035 }
2036
VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause * Node)2037 void OMPClausePrinter::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *Node) {
2038 if (!Node->varlist_empty()) {
2039 OS << "use_device_ptr";
2040 VisitOMPClauseList(Node, '(');
2041 OS << ")";
2042 }
2043 }
2044
VisitOMPUseDeviceAddrClause(OMPUseDeviceAddrClause * Node)2045 void OMPClausePrinter::VisitOMPUseDeviceAddrClause(
2046 OMPUseDeviceAddrClause *Node) {
2047 if (!Node->varlist_empty()) {
2048 OS << "use_device_addr";
2049 VisitOMPClauseList(Node, '(');
2050 OS << ")";
2051 }
2052 }
2053
VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause * Node)2054 void OMPClausePrinter::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *Node) {
2055 if (!Node->varlist_empty()) {
2056 OS << "is_device_ptr";
2057 VisitOMPClauseList(Node, '(');
2058 OS << ")";
2059 }
2060 }
2061
VisitOMPNontemporalClause(OMPNontemporalClause * Node)2062 void OMPClausePrinter::VisitOMPNontemporalClause(OMPNontemporalClause *Node) {
2063 if (!Node->varlist_empty()) {
2064 OS << "nontemporal";
2065 VisitOMPClauseList(Node, '(');
2066 OS << ")";
2067 }
2068 }
2069
VisitOMPOrderClause(OMPOrderClause * Node)2070 void OMPClausePrinter::VisitOMPOrderClause(OMPOrderClause *Node) {
2071 OS << "order(" << getOpenMPSimpleClauseTypeName(OMPC_order, Node->getKind())
2072 << ")";
2073 }
2074
VisitOMPInclusiveClause(OMPInclusiveClause * Node)2075 void OMPClausePrinter::VisitOMPInclusiveClause(OMPInclusiveClause *Node) {
2076 if (!Node->varlist_empty()) {
2077 OS << "inclusive";
2078 VisitOMPClauseList(Node, '(');
2079 OS << ")";
2080 }
2081 }
2082
VisitOMPExclusiveClause(OMPExclusiveClause * Node)2083 void OMPClausePrinter::VisitOMPExclusiveClause(OMPExclusiveClause *Node) {
2084 if (!Node->varlist_empty()) {
2085 OS << "exclusive";
2086 VisitOMPClauseList(Node, '(');
2087 OS << ")";
2088 }
2089 }
2090
VisitOMPUsesAllocatorsClause(OMPUsesAllocatorsClause * Node)2091 void OMPClausePrinter::VisitOMPUsesAllocatorsClause(
2092 OMPUsesAllocatorsClause *Node) {
2093 if (Node->getNumberOfAllocators() == 0)
2094 return;
2095 OS << "uses_allocators(";
2096 for (unsigned I = 0, E = Node->getNumberOfAllocators(); I < E; ++I) {
2097 OMPUsesAllocatorsClause::Data Data = Node->getAllocatorData(I);
2098 Data.Allocator->printPretty(OS, nullptr, Policy);
2099 if (Data.AllocatorTraits) {
2100 OS << "(";
2101 Data.AllocatorTraits->printPretty(OS, nullptr, Policy);
2102 OS << ")";
2103 }
2104 if (I < E - 1)
2105 OS << ",";
2106 }
2107 OS << ")";
2108 }
2109
VisitOMPAffinityClause(OMPAffinityClause * Node)2110 void OMPClausePrinter::VisitOMPAffinityClause(OMPAffinityClause *Node) {
2111 if (Node->varlist_empty())
2112 return;
2113 OS << "affinity";
2114 char StartSym = '(';
2115 if (Expr *Modifier = Node->getModifier()) {
2116 OS << "(";
2117 Modifier->printPretty(OS, nullptr, Policy);
2118 OS << " :";
2119 StartSym = ' ';
2120 }
2121 VisitOMPClauseList(Node, StartSym);
2122 OS << ")";
2123 }
2124
getAsVariantMatchInfo(ASTContext & ASTCtx,VariantMatchInfo & VMI) const2125 void OMPTraitInfo::getAsVariantMatchInfo(ASTContext &ASTCtx,
2126 VariantMatchInfo &VMI) const {
2127 for (const OMPTraitSet &Set : Sets) {
2128 for (const OMPTraitSelector &Selector : Set.Selectors) {
2129
2130 // User conditions are special as we evaluate the condition here.
2131 if (Selector.Kind == TraitSelector::user_condition) {
2132 assert(Selector.ScoreOrCondition &&
2133 "Ill-formed user condition, expected condition expression!");
2134 assert(Selector.Properties.size() == 1 &&
2135 Selector.Properties.front().Kind ==
2136 TraitProperty::user_condition_unknown &&
2137 "Ill-formed user condition, expected unknown trait property!");
2138
2139 if (Optional<APSInt> CondVal =
2140 Selector.ScoreOrCondition->getIntegerConstantExpr(ASTCtx))
2141 VMI.addTrait(CondVal->isNullValue()
2142 ? TraitProperty::user_condition_false
2143 : TraitProperty::user_condition_true,
2144 "<condition>");
2145 else
2146 VMI.addTrait(TraitProperty::user_condition_false, "<condition>");
2147 continue;
2148 }
2149
2150 Optional<llvm::APSInt> Score;
2151 llvm::APInt *ScorePtr = nullptr;
2152 if (Selector.ScoreOrCondition) {
2153 if ((Score = Selector.ScoreOrCondition->getIntegerConstantExpr(ASTCtx)))
2154 ScorePtr = &*Score;
2155 else
2156 VMI.addTrait(TraitProperty::user_condition_false,
2157 "<non-constant-score>");
2158 }
2159
2160 for (const OMPTraitProperty &Property : Selector.Properties)
2161 VMI.addTrait(Set.Kind, Property.Kind, Property.RawString, ScorePtr);
2162
2163 if (Set.Kind != TraitSet::construct)
2164 continue;
2165
2166 // TODO: This might not hold once we implement SIMD properly.
2167 assert(Selector.Properties.size() == 1 &&
2168 Selector.Properties.front().Kind ==
2169 getOpenMPContextTraitPropertyForSelector(
2170 Selector.Kind) &&
2171 "Ill-formed construct selector!");
2172
2173 VMI.ConstructTraits.push_back(Selector.Properties.front().Kind);
2174 }
2175 }
2176 }
2177
print(llvm::raw_ostream & OS,const PrintingPolicy & Policy) const2178 void OMPTraitInfo::print(llvm::raw_ostream &OS,
2179 const PrintingPolicy &Policy) const {
2180 bool FirstSet = true;
2181 for (const OMPTraitSet &Set : Sets) {
2182 if (!FirstSet)
2183 OS << ", ";
2184 FirstSet = false;
2185 OS << getOpenMPContextTraitSetName(Set.Kind) << "={";
2186
2187 bool FirstSelector = true;
2188 for (const OMPTraitSelector &Selector : Set.Selectors) {
2189 if (!FirstSelector)
2190 OS << ", ";
2191 FirstSelector = false;
2192 OS << getOpenMPContextTraitSelectorName(Selector.Kind);
2193
2194 bool AllowsTraitScore = false;
2195 bool RequiresProperty = false;
2196 isValidTraitSelectorForTraitSet(
2197 Selector.Kind, Set.Kind, AllowsTraitScore, RequiresProperty);
2198
2199 if (!RequiresProperty)
2200 continue;
2201
2202 OS << "(";
2203 if (Selector.Kind == TraitSelector::user_condition) {
2204 if (Selector.ScoreOrCondition)
2205 Selector.ScoreOrCondition->printPretty(OS, nullptr, Policy);
2206 else
2207 OS << "...";
2208 } else {
2209
2210 if (Selector.ScoreOrCondition) {
2211 OS << "score(";
2212 Selector.ScoreOrCondition->printPretty(OS, nullptr, Policy);
2213 OS << "): ";
2214 }
2215
2216 bool FirstProperty = true;
2217 for (const OMPTraitProperty &Property : Selector.Properties) {
2218 if (!FirstProperty)
2219 OS << ", ";
2220 FirstProperty = false;
2221 OS << getOpenMPContextTraitPropertyName(Property.Kind,
2222 Property.RawString);
2223 }
2224 }
2225 OS << ")";
2226 }
2227 OS << "}";
2228 }
2229 }
2230
getMangledName() const2231 std::string OMPTraitInfo::getMangledName() const {
2232 std::string MangledName;
2233 llvm::raw_string_ostream OS(MangledName);
2234 for (const OMPTraitSet &Set : Sets) {
2235 OS << '$' << 'S' << unsigned(Set.Kind);
2236 for (const OMPTraitSelector &Selector : Set.Selectors) {
2237
2238 bool AllowsTraitScore = false;
2239 bool RequiresProperty = false;
2240 isValidTraitSelectorForTraitSet(
2241 Selector.Kind, Set.Kind, AllowsTraitScore, RequiresProperty);
2242 OS << '$' << 's' << unsigned(Selector.Kind);
2243
2244 if (!RequiresProperty ||
2245 Selector.Kind == TraitSelector::user_condition)
2246 continue;
2247
2248 for (const OMPTraitProperty &Property : Selector.Properties)
2249 OS << '$' << 'P'
2250 << getOpenMPContextTraitPropertyName(Property.Kind,
2251 Property.RawString);
2252 }
2253 }
2254 return OS.str();
2255 }
2256
OMPTraitInfo(StringRef MangledName)2257 OMPTraitInfo::OMPTraitInfo(StringRef MangledName) {
2258 unsigned long U;
2259 do {
2260 if (!MangledName.consume_front("$S"))
2261 break;
2262 if (MangledName.consumeInteger(10, U))
2263 break;
2264 Sets.push_back(OMPTraitSet());
2265 OMPTraitSet &Set = Sets.back();
2266 Set.Kind = TraitSet(U);
2267 do {
2268 if (!MangledName.consume_front("$s"))
2269 break;
2270 if (MangledName.consumeInteger(10, U))
2271 break;
2272 Set.Selectors.push_back(OMPTraitSelector());
2273 OMPTraitSelector &Selector = Set.Selectors.back();
2274 Selector.Kind = TraitSelector(U);
2275 do {
2276 if (!MangledName.consume_front("$P"))
2277 break;
2278 Selector.Properties.push_back(OMPTraitProperty());
2279 OMPTraitProperty &Property = Selector.Properties.back();
2280 std::pair<StringRef, StringRef> PropRestPair = MangledName.split('$');
2281 Property.RawString = PropRestPair.first;
2282 Property.Kind = getOpenMPContextTraitPropertyKind(
2283 Set.Kind, Selector.Kind, PropRestPair.first);
2284 MangledName = MangledName.drop_front(PropRestPair.first.size());
2285 } while (true);
2286 } while (true);
2287 } while (true);
2288 }
2289
operator <<(llvm::raw_ostream & OS,const OMPTraitInfo & TI)2290 llvm::raw_ostream &clang::operator<<(llvm::raw_ostream &OS,
2291 const OMPTraitInfo &TI) {
2292 LangOptions LO;
2293 PrintingPolicy Policy(LO);
2294 TI.print(OS, Policy);
2295 return OS;
2296 }
operator <<(llvm::raw_ostream & OS,const OMPTraitInfo * TI)2297 llvm::raw_ostream &clang::operator<<(llvm::raw_ostream &OS,
2298 const OMPTraitInfo *TI) {
2299 return TI ? OS << *TI : OS;
2300 }
2301
TargetOMPContext(ASTContext & ASTCtx,std::function<void (StringRef)> && DiagUnknownTrait,const FunctionDecl * CurrentFunctionDecl)2302 TargetOMPContext::TargetOMPContext(
2303 ASTContext &ASTCtx, std::function<void(StringRef)> &&DiagUnknownTrait,
2304 const FunctionDecl *CurrentFunctionDecl)
2305 : OMPContext(ASTCtx.getLangOpts().OpenMPIsDevice,
2306 ASTCtx.getTargetInfo().getTriple()),
2307 FeatureValidityCheck([&](StringRef FeatureName) {
2308 return ASTCtx.getTargetInfo().isValidFeatureName(FeatureName);
2309 }),
2310 DiagUnknownTrait(std::move(DiagUnknownTrait)) {
2311 ASTCtx.getFunctionFeatureMap(FeatureMap, CurrentFunctionDecl);
2312 }
2313
matchesISATrait(StringRef RawString) const2314 bool TargetOMPContext::matchesISATrait(StringRef RawString) const {
2315 auto It = FeatureMap.find(RawString);
2316 if (It != FeatureMap.end())
2317 return It->second;
2318 if (!FeatureValidityCheck(RawString))
2319 DiagUnknownTrait(RawString);
2320 return false;
2321 }
2322