1 //===- StmtOpenMP.h - Classes for OpenMP directives ------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 /// \file 10 /// \brief This file defines OpenMP AST classes for executable directives and 11 /// clauses. 12 /// 13 //===----------------------------------------------------------------------===// 14 15 #ifndef LLVM_CLANG_AST_STMTOPENMP_H 16 #define LLVM_CLANG_AST_STMTOPENMP_H 17 18 #include "clang/AST/Expr.h" 19 #include "clang/AST/OpenMPClause.h" 20 #include "clang/AST/Stmt.h" 21 #include "clang/Basic/OpenMPKinds.h" 22 #include "clang/Basic/SourceLocation.h" 23 24 namespace clang { 25 26 //===----------------------------------------------------------------------===// 27 // AST classes for directives. 28 //===----------------------------------------------------------------------===// 29 30 /// \brief This is a basic class for representing single OpenMP executable 31 /// directive. 32 /// 33 class OMPExecutableDirective : public Stmt { 34 friend class ASTStmtReader; 35 /// \brief Kind of the directive. 36 OpenMPDirectiveKind Kind; 37 /// \brief Starting location of the directive (directive keyword). 38 SourceLocation StartLoc; 39 /// \brief Ending location of the directive. 40 SourceLocation EndLoc; 41 /// \brief Numbers of clauses. 42 const unsigned NumClauses; 43 /// \brief Number of child expressions/stmts. 44 const unsigned NumChildren; 45 /// \brief Offset from this to the start of clauses. 46 /// There are NumClauses pointers to clauses, they are followed by 47 /// NumChildren pointers to child stmts/exprs (if the directive type 48 /// requires an associated stmt, then it has to be the first of them). 49 const unsigned ClausesOffset; 50 51 /// \brief Get the clauses storage. getClauses()52 MutableArrayRef<OMPClause *> getClauses() { 53 OMPClause **ClauseStorage = reinterpret_cast<OMPClause **>( 54 reinterpret_cast<char *>(this) + ClausesOffset); 55 return MutableArrayRef<OMPClause *>(ClauseStorage, NumClauses); 56 } 57 58 protected: 59 /// \brief Build instance of directive of class \a K. 60 /// 61 /// \param SC Statement class. 62 /// \param K Kind of OpenMP directive. 63 /// \param StartLoc Starting location of the directive (directive keyword). 64 /// \param EndLoc Ending location of the directive. 65 /// 66 template <typename T> OMPExecutableDirective(const T *,StmtClass SC,OpenMPDirectiveKind K,SourceLocation StartLoc,SourceLocation EndLoc,unsigned NumClauses,unsigned NumChildren)67 OMPExecutableDirective(const T *, StmtClass SC, OpenMPDirectiveKind K, 68 SourceLocation StartLoc, SourceLocation EndLoc, 69 unsigned NumClauses, unsigned NumChildren) 70 : Stmt(SC), Kind(K), StartLoc(std::move(StartLoc)), 71 EndLoc(std::move(EndLoc)), NumClauses(NumClauses), 72 NumChildren(NumChildren), 73 ClausesOffset(llvm::RoundUpToAlignment(sizeof(T), 74 llvm::alignOf<OMPClause *>())) {} 75 76 /// \brief Sets the list of variables for this clause. 77 /// 78 /// \param Clauses The list of clauses for the directive. 79 /// 80 void setClauses(ArrayRef<OMPClause *> Clauses); 81 82 /// \brief Set the associated statement for the directive. 83 /// 84 /// /param S Associated statement. 85 /// setAssociatedStmt(Stmt * S)86 void setAssociatedStmt(Stmt *S) { *child_begin() = S; } 87 88 public: 89 /// \brief Iterates over a filtered subrange of clauses applied to a 90 /// directive. 91 /// 92 /// This iterator visits only those declarations that meet some run-time 93 /// criteria. 94 template <class FilterPredicate> class filtered_clause_iterator { 95 ArrayRef<OMPClause *>::const_iterator Current; 96 ArrayRef<OMPClause *>::const_iterator End; 97 FilterPredicate Pred; SkipToNextClause()98 void SkipToNextClause() { 99 while (Current != End && !Pred(*Current)) 100 ++Current; 101 } 102 103 public: 104 typedef const OMPClause *value_type; filtered_clause_iterator()105 filtered_clause_iterator() : Current(), End() {} filtered_clause_iterator(ArrayRef<OMPClause * > Arr,FilterPredicate Pred)106 filtered_clause_iterator(ArrayRef<OMPClause *> Arr, FilterPredicate Pred) 107 : Current(Arr.begin()), End(Arr.end()), Pred(Pred) { 108 SkipToNextClause(); 109 } 110 value_type operator*() const { return *Current; } 111 value_type operator->() const { return *Current; } 112 filtered_clause_iterator &operator++() { 113 ++Current; 114 SkipToNextClause(); 115 return *this; 116 } 117 118 filtered_clause_iterator operator++(int) { 119 filtered_clause_iterator tmp(*this); 120 ++(*this); 121 return tmp; 122 } 123 124 bool operator!() { return Current == End; } 125 operator bool() { return Current != End; } 126 }; 127 128 /// \brief Returns starting location of directive kind. getLocStart()129 SourceLocation getLocStart() const { return StartLoc; } 130 /// \brief Returns ending location of directive. getLocEnd()131 SourceLocation getLocEnd() const { return EndLoc; } 132 133 /// \brief Set starting location of directive kind. 134 /// 135 /// \param Loc New starting location of directive. 136 /// setLocStart(SourceLocation Loc)137 void setLocStart(SourceLocation Loc) { StartLoc = Loc; } 138 /// \brief Set ending location of directive. 139 /// 140 /// \param Loc New ending location of directive. 141 /// setLocEnd(SourceLocation Loc)142 void setLocEnd(SourceLocation Loc) { EndLoc = Loc; } 143 144 /// \brief Get number of clauses. getNumClauses()145 unsigned getNumClauses() const { return NumClauses; } 146 147 /// \brief Returns specified clause. 148 /// 149 /// \param i Number of clause. 150 /// getClause(unsigned i)151 OMPClause *getClause(unsigned i) const { return clauses()[i]; } 152 153 /// \brief Returns statement associated with the directive. getAssociatedStmt()154 Stmt *getAssociatedStmt() const { return const_cast<Stmt *>(*child_begin()); } 155 getDirectiveKind()156 OpenMPDirectiveKind getDirectiveKind() const { return Kind; } 157 classof(const Stmt * S)158 static bool classof(const Stmt *S) { 159 return S->getStmtClass() >= firstOMPExecutableDirectiveConstant && 160 S->getStmtClass() <= lastOMPExecutableDirectiveConstant; 161 } 162 children()163 child_range children() { 164 Stmt **ChildStorage = reinterpret_cast<Stmt **>(getClauses().end()); 165 return child_range(ChildStorage, ChildStorage + NumChildren); 166 } 167 clauses()168 ArrayRef<OMPClause *> clauses() { return getClauses(); } 169 clauses()170 ArrayRef<OMPClause *> clauses() const { 171 return const_cast<OMPExecutableDirective *>(this)->getClauses(); 172 } 173 }; 174 175 /// \brief This represents '#pragma omp parallel' directive. 176 /// 177 /// \code 178 /// #pragma omp parallel private(a,b) reduction(+: c,d) 179 /// \endcode 180 /// In this example directive '#pragma omp parallel' has clauses 'private' 181 /// with the variables 'a' and 'b' and 'reduction' with operator '+' and 182 /// variables 'c' and 'd'. 183 /// 184 class OMPParallelDirective : public OMPExecutableDirective { 185 /// \brief Build directive with the given start and end location. 186 /// 187 /// \param StartLoc Starting location of the directive (directive keyword). 188 /// \param EndLoc Ending Location of the directive. 189 /// OMPParallelDirective(SourceLocation StartLoc,SourceLocation EndLoc,unsigned NumClauses)190 OMPParallelDirective(SourceLocation StartLoc, SourceLocation EndLoc, 191 unsigned NumClauses) 192 : OMPExecutableDirective(this, OMPParallelDirectiveClass, OMPD_parallel, 193 StartLoc, EndLoc, NumClauses, 1) {} 194 195 /// \brief Build an empty directive. 196 /// 197 /// \param NumClauses Number of clauses. 198 /// OMPParallelDirective(unsigned NumClauses)199 explicit OMPParallelDirective(unsigned NumClauses) 200 : OMPExecutableDirective(this, OMPParallelDirectiveClass, OMPD_parallel, 201 SourceLocation(), SourceLocation(), NumClauses, 202 1) {} 203 204 public: 205 /// \brief Creates directive with a list of \a Clauses. 206 /// 207 /// \param C AST context. 208 /// \param StartLoc Starting location of the directive kind. 209 /// \param EndLoc Ending Location of the directive. 210 /// \param Clauses List of clauses. 211 /// \param AssociatedStmt Statement associated with the directive. 212 /// 213 static OMPParallelDirective * 214 Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 215 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt); 216 217 /// \brief Creates an empty directive with the place for \a N clauses. 218 /// 219 /// \param C AST context. 220 /// \param NumClauses Number of clauses. 221 /// 222 static OMPParallelDirective *CreateEmpty(const ASTContext &C, 223 unsigned NumClauses, EmptyShell); 224 classof(const Stmt * T)225 static bool classof(const Stmt *T) { 226 return T->getStmtClass() == OMPParallelDirectiveClass; 227 } 228 }; 229 230 /// \brief This represents '#pragma omp simd' directive. 231 /// 232 /// \code 233 /// #pragma omp simd private(a,b) linear(i,j:s) reduction(+:c,d) 234 /// \endcode 235 /// In this example directive '#pragma omp simd' has clauses 'private' 236 /// with the variables 'a' and 'b', 'linear' with variables 'i', 'j' and 237 /// linear step 's', 'reduction' with operator '+' and variables 'c' and 'd'. 238 /// 239 class OMPSimdDirective : public OMPExecutableDirective { 240 friend class ASTStmtReader; 241 /// \brief Number of collapsed loops as specified by 'collapse' clause. 242 unsigned CollapsedNum; 243 /// \brief Build directive with the given start and end location. 244 /// 245 /// \param StartLoc Starting location of the directive kind. 246 /// \param EndLoc Ending location of the directive. 247 /// \param CollapsedNum Number of collapsed nested loops. 248 /// \param NumClauses Number of clauses. 249 /// OMPSimdDirective(SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,unsigned NumClauses)250 OMPSimdDirective(SourceLocation StartLoc, SourceLocation EndLoc, 251 unsigned CollapsedNum, unsigned NumClauses) 252 : OMPExecutableDirective(this, OMPSimdDirectiveClass, OMPD_simd, StartLoc, 253 EndLoc, NumClauses, 1), 254 CollapsedNum(CollapsedNum) {} 255 256 /// \brief Build an empty directive. 257 /// 258 /// \param CollapsedNum Number of collapsed nested loops. 259 /// \param NumClauses Number of clauses. 260 /// OMPSimdDirective(unsigned CollapsedNum,unsigned NumClauses)261 explicit OMPSimdDirective(unsigned CollapsedNum, unsigned NumClauses) 262 : OMPExecutableDirective(this, OMPSimdDirectiveClass, OMPD_simd, 263 SourceLocation(), SourceLocation(), NumClauses, 264 1), 265 CollapsedNum(CollapsedNum) {} 266 267 public: 268 /// \brief Creates directive with a list of \a Clauses. 269 /// 270 /// \param C AST context. 271 /// \param StartLoc Starting location of the directive kind. 272 /// \param EndLoc Ending Location of the directive. 273 /// \param CollapsedNum Number of collapsed loops. 274 /// \param Clauses List of clauses. 275 /// \param AssociatedStmt Statement, associated with the directive. 276 /// 277 static OMPSimdDirective *Create(const ASTContext &C, SourceLocation StartLoc, 278 SourceLocation EndLoc, unsigned CollapsedNum, 279 ArrayRef<OMPClause *> Clauses, 280 Stmt *AssociatedStmt); 281 282 /// \brief Creates an empty directive with the place 283 /// for \a NumClauses clauses. 284 /// 285 /// \param C AST context. 286 /// \param CollapsedNum Number of collapsed nested loops. 287 /// \param NumClauses Number of clauses. 288 /// 289 static OMPSimdDirective *CreateEmpty(const ASTContext &C, unsigned NumClauses, 290 unsigned CollapsedNum, EmptyShell); 291 getCollapsedNumber()292 unsigned getCollapsedNumber() const { return CollapsedNum; } 293 classof(const Stmt * T)294 static bool classof(const Stmt *T) { 295 return T->getStmtClass() == OMPSimdDirectiveClass; 296 } 297 }; 298 299 /// \brief This represents '#pragma omp for' directive. 300 /// 301 /// \code 302 /// #pragma omp for private(a,b) reduction(+:c,d) 303 /// \endcode 304 /// In this example directive '#pragma omp for' has clauses 'private' with the 305 /// variables 'a' and 'b' and 'reduction' with operator '+' and variables 'c' 306 /// and 'd'. 307 /// 308 class OMPForDirective : public OMPExecutableDirective { 309 friend class ASTStmtReader; 310 /// \brief Number of collapsed loops as specified by 'collapse' clause. 311 unsigned CollapsedNum; 312 /// \brief Build directive with the given start and end location. 313 /// 314 /// \param StartLoc Starting location of the directive kind. 315 /// \param EndLoc Ending location of the directive. 316 /// \param CollapsedNum Number of collapsed nested loops. 317 /// \param NumClauses Number of clauses. 318 /// OMPForDirective(SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,unsigned NumClauses)319 OMPForDirective(SourceLocation StartLoc, SourceLocation EndLoc, 320 unsigned CollapsedNum, unsigned NumClauses) 321 : OMPExecutableDirective(this, OMPForDirectiveClass, OMPD_for, StartLoc, 322 EndLoc, NumClauses, 1), 323 CollapsedNum(CollapsedNum) {} 324 325 /// \brief Build an empty directive. 326 /// 327 /// \param CollapsedNum Number of collapsed nested loops. 328 /// \param NumClauses Number of clauses. 329 /// OMPForDirective(unsigned CollapsedNum,unsigned NumClauses)330 explicit OMPForDirective(unsigned CollapsedNum, unsigned NumClauses) 331 : OMPExecutableDirective(this, OMPForDirectiveClass, OMPD_for, 332 SourceLocation(), SourceLocation(), NumClauses, 333 1), 334 CollapsedNum(CollapsedNum) {} 335 336 public: 337 /// \brief Creates directive with a list of \a Clauses. 338 /// 339 /// \param C AST context. 340 /// \param StartLoc Starting location of the directive kind. 341 /// \param EndLoc Ending Location of the directive. 342 /// \param CollapsedNum Number of collapsed loops. 343 /// \param Clauses List of clauses. 344 /// \param AssociatedStmt Statement, associated with the directive. 345 /// 346 static OMPForDirective *Create(const ASTContext &C, SourceLocation StartLoc, 347 SourceLocation EndLoc, unsigned CollapsedNum, 348 ArrayRef<OMPClause *> Clauses, 349 Stmt *AssociatedStmt); 350 351 /// \brief Creates an empty directive with the place 352 /// for \a NumClauses clauses. 353 /// 354 /// \param C AST context. 355 /// \param CollapsedNum Number of collapsed nested loops. 356 /// \param NumClauses Number of clauses. 357 /// 358 static OMPForDirective *CreateEmpty(const ASTContext &C, unsigned NumClauses, 359 unsigned CollapsedNum, EmptyShell); 360 getCollapsedNumber()361 unsigned getCollapsedNumber() const { return CollapsedNum; } 362 classof(const Stmt * T)363 static bool classof(const Stmt *T) { 364 return T->getStmtClass() == OMPForDirectiveClass; 365 } 366 }; 367 368 /// \brief This represents '#pragma omp sections' directive. 369 /// 370 /// \code 371 /// #pragma omp sections private(a,b) reduction(+:c,d) 372 /// \endcode 373 /// In this example directive '#pragma omp sections' has clauses 'private' with 374 /// the variables 'a' and 'b' and 'reduction' with operator '+' and variables 375 /// 'c' and 'd'. 376 /// 377 class OMPSectionsDirective : public OMPExecutableDirective { 378 friend class ASTStmtReader; 379 /// \brief Build directive with the given start and end location. 380 /// 381 /// \param StartLoc Starting location of the directive kind. 382 /// \param EndLoc Ending location of the directive. 383 /// \param NumClauses Number of clauses. 384 /// OMPSectionsDirective(SourceLocation StartLoc,SourceLocation EndLoc,unsigned NumClauses)385 OMPSectionsDirective(SourceLocation StartLoc, SourceLocation EndLoc, 386 unsigned NumClauses) 387 : OMPExecutableDirective(this, OMPSectionsDirectiveClass, OMPD_sections, 388 StartLoc, EndLoc, NumClauses, 1) {} 389 390 /// \brief Build an empty directive. 391 /// 392 /// \param NumClauses Number of clauses. 393 /// OMPSectionsDirective(unsigned NumClauses)394 explicit OMPSectionsDirective(unsigned NumClauses) 395 : OMPExecutableDirective(this, OMPSectionsDirectiveClass, OMPD_sections, 396 SourceLocation(), SourceLocation(), NumClauses, 397 1) {} 398 399 public: 400 /// \brief Creates directive with a list of \a Clauses. 401 /// 402 /// \param C AST context. 403 /// \param StartLoc Starting location of the directive kind. 404 /// \param EndLoc Ending Location of the directive. 405 /// \param Clauses List of clauses. 406 /// \param AssociatedStmt Statement, associated with the directive. 407 /// 408 static OMPSectionsDirective * 409 Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 410 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt); 411 412 /// \brief Creates an empty directive with the place for \a NumClauses 413 /// clauses. 414 /// 415 /// \param C AST context. 416 /// \param NumClauses Number of clauses. 417 /// 418 static OMPSectionsDirective *CreateEmpty(const ASTContext &C, 419 unsigned NumClauses, EmptyShell); 420 classof(const Stmt * T)421 static bool classof(const Stmt *T) { 422 return T->getStmtClass() == OMPSectionsDirectiveClass; 423 } 424 }; 425 426 /// \brief This represents '#pragma omp section' directive. 427 /// 428 /// \code 429 /// #pragma omp section 430 /// \endcode 431 /// 432 class OMPSectionDirective : public OMPExecutableDirective { 433 friend class ASTStmtReader; 434 /// \brief Build directive with the given start and end location. 435 /// 436 /// \param StartLoc Starting location of the directive kind. 437 /// \param EndLoc Ending location of the directive. 438 /// OMPSectionDirective(SourceLocation StartLoc,SourceLocation EndLoc)439 OMPSectionDirective(SourceLocation StartLoc, SourceLocation EndLoc) 440 : OMPExecutableDirective(this, OMPSectionDirectiveClass, OMPD_section, 441 StartLoc, EndLoc, 0, 1) {} 442 443 /// \brief Build an empty directive. 444 /// OMPSectionDirective()445 explicit OMPSectionDirective() 446 : OMPExecutableDirective(this, OMPSectionDirectiveClass, OMPD_section, 447 SourceLocation(), SourceLocation(), 0, 1) {} 448 449 public: 450 /// \brief Creates directive. 451 /// 452 /// \param C AST context. 453 /// \param StartLoc Starting location of the directive kind. 454 /// \param EndLoc Ending Location of the directive. 455 /// \param AssociatedStmt Statement, associated with the directive. 456 /// 457 static OMPSectionDirective *Create(const ASTContext &C, 458 SourceLocation StartLoc, 459 SourceLocation EndLoc, 460 Stmt *AssociatedStmt); 461 462 /// \brief Creates an empty directive. 463 /// 464 /// \param C AST context. 465 /// 466 static OMPSectionDirective *CreateEmpty(const ASTContext &C, EmptyShell); 467 classof(const Stmt * T)468 static bool classof(const Stmt *T) { 469 return T->getStmtClass() == OMPSectionDirectiveClass; 470 } 471 }; 472 473 /// \brief This represents '#pragma omp single' directive. 474 /// 475 /// \code 476 /// #pragma omp single private(a,b) copyprivate(c,d) 477 /// \endcode 478 /// In this example directive '#pragma omp single' has clauses 'private' with 479 /// the variables 'a' and 'b' and 'copyprivate' with variables 'c' and 'd'. 480 /// 481 class OMPSingleDirective : public OMPExecutableDirective { 482 friend class ASTStmtReader; 483 /// \brief Build directive with the given start and end location. 484 /// 485 /// \param StartLoc Starting location of the directive kind. 486 /// \param EndLoc Ending location of the directive. 487 /// \param NumClauses Number of clauses. 488 /// OMPSingleDirective(SourceLocation StartLoc,SourceLocation EndLoc,unsigned NumClauses)489 OMPSingleDirective(SourceLocation StartLoc, SourceLocation EndLoc, 490 unsigned NumClauses) 491 : OMPExecutableDirective(this, OMPSingleDirectiveClass, OMPD_single, 492 StartLoc, EndLoc, NumClauses, 1) {} 493 494 /// \brief Build an empty directive. 495 /// 496 /// \param NumClauses Number of clauses. 497 /// OMPSingleDirective(unsigned NumClauses)498 explicit OMPSingleDirective(unsigned NumClauses) 499 : OMPExecutableDirective(this, OMPSingleDirectiveClass, OMPD_single, 500 SourceLocation(), SourceLocation(), NumClauses, 501 1) {} 502 503 public: 504 /// \brief Creates directive with a list of \a Clauses. 505 /// 506 /// \param C AST context. 507 /// \param StartLoc Starting location of the directive kind. 508 /// \param EndLoc Ending Location of the directive. 509 /// \param Clauses List of clauses. 510 /// \param AssociatedStmt Statement, associated with the directive. 511 /// 512 static OMPSingleDirective * 513 Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 514 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt); 515 516 /// \brief Creates an empty directive with the place for \a NumClauses 517 /// clauses. 518 /// 519 /// \param C AST context. 520 /// \param NumClauses Number of clauses. 521 /// 522 static OMPSingleDirective *CreateEmpty(const ASTContext &C, 523 unsigned NumClauses, EmptyShell); 524 classof(const Stmt * T)525 static bool classof(const Stmt *T) { 526 return T->getStmtClass() == OMPSingleDirectiveClass; 527 } 528 }; 529 530 /// \brief This represents '#pragma omp parallel for' directive. 531 /// 532 /// \code 533 /// #pragma omp parallel for private(a,b) reduction(+:c,d) 534 /// \endcode 535 /// In this example directive '#pragma omp parallel for' has clauses 'private' 536 /// with the variables 'a' and 'b' and 'reduction' with operator '+' and 537 /// variables 'c' and 'd'. 538 /// 539 class OMPParallelForDirective : public OMPExecutableDirective { 540 friend class ASTStmtReader; 541 /// \brief Number of collapsed loops as specified by 'collapse' clause. 542 unsigned CollapsedNum; 543 /// \brief Build directive with the given start and end location. 544 /// 545 /// \param StartLoc Starting location of the directive kind. 546 /// \param EndLoc Ending location of the directive. 547 /// \param CollapsedNum Number of collapsed nested loops. 548 /// \param NumClauses Number of clauses. 549 /// OMPParallelForDirective(SourceLocation StartLoc,SourceLocation EndLoc,unsigned CollapsedNum,unsigned NumClauses)550 OMPParallelForDirective(SourceLocation StartLoc, SourceLocation EndLoc, 551 unsigned CollapsedNum, unsigned NumClauses) 552 : OMPExecutableDirective(this, OMPParallelForDirectiveClass, 553 OMPD_parallel_for, StartLoc, EndLoc, NumClauses, 554 1), 555 CollapsedNum(CollapsedNum) {} 556 557 /// \brief Build an empty directive. 558 /// 559 /// \param CollapsedNum Number of collapsed nested loops. 560 /// \param NumClauses Number of clauses. 561 /// OMPParallelForDirective(unsigned CollapsedNum,unsigned NumClauses)562 explicit OMPParallelForDirective(unsigned CollapsedNum, unsigned NumClauses) 563 : OMPExecutableDirective(this, OMPParallelForDirectiveClass, 564 OMPD_parallel_for, SourceLocation(), 565 SourceLocation(), NumClauses, 1), 566 CollapsedNum(CollapsedNum) {} 567 568 public: 569 /// \brief Creates directive with a list of \a Clauses. 570 /// 571 /// \param C AST context. 572 /// \param StartLoc Starting location of the directive kind. 573 /// \param EndLoc Ending Location of the directive. 574 /// \param CollapsedNum Number of collapsed loops. 575 /// \param Clauses List of clauses. 576 /// \param AssociatedStmt Statement, associated with the directive. 577 /// 578 static OMPParallelForDirective * 579 Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 580 unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, 581 Stmt *AssociatedStmt); 582 583 /// \brief Creates an empty directive with the place 584 /// for \a NumClauses clauses. 585 /// 586 /// \param C AST context. 587 /// \param CollapsedNum Number of collapsed nested loops. 588 /// \param NumClauses Number of clauses. 589 /// 590 static OMPParallelForDirective *CreateEmpty(const ASTContext &C, 591 unsigned NumClauses, 592 unsigned CollapsedNum, 593 EmptyShell); 594 getCollapsedNumber()595 unsigned getCollapsedNumber() const { return CollapsedNum; } 596 classof(const Stmt * T)597 static bool classof(const Stmt *T) { 598 return T->getStmtClass() == OMPParallelForDirectiveClass; 599 } 600 }; 601 602 /// \brief This represents '#pragma omp parallel sections' directive. 603 /// 604 /// \code 605 /// #pragma omp parallel sections private(a,b) reduction(+:c,d) 606 /// \endcode 607 /// In this example directive '#pragma omp parallel sections' has clauses 608 /// 'private' with the variables 'a' and 'b' and 'reduction' with operator '+' 609 /// and variables 'c' and 'd'. 610 /// 611 class OMPParallelSectionsDirective : public OMPExecutableDirective { 612 friend class ASTStmtReader; 613 /// \brief Build directive with the given start and end location. 614 /// 615 /// \param StartLoc Starting location of the directive kind. 616 /// \param EndLoc Ending location of the directive. 617 /// \param NumClauses Number of clauses. 618 /// OMPParallelSectionsDirective(SourceLocation StartLoc,SourceLocation EndLoc,unsigned NumClauses)619 OMPParallelSectionsDirective(SourceLocation StartLoc, SourceLocation EndLoc, 620 unsigned NumClauses) 621 : OMPExecutableDirective(this, OMPParallelSectionsDirectiveClass, 622 OMPD_parallel_sections, StartLoc, EndLoc, 623 NumClauses, 1) {} 624 625 /// \brief Build an empty directive. 626 /// 627 /// \param NumClauses Number of clauses. 628 /// OMPParallelSectionsDirective(unsigned NumClauses)629 explicit OMPParallelSectionsDirective(unsigned NumClauses) 630 : OMPExecutableDirective(this, OMPParallelSectionsDirectiveClass, 631 OMPD_parallel_sections, SourceLocation(), 632 SourceLocation(), NumClauses, 1) {} 633 634 public: 635 /// \brief Creates directive with a list of \a Clauses. 636 /// 637 /// \param C AST context. 638 /// \param StartLoc Starting location of the directive kind. 639 /// \param EndLoc Ending Location of the directive. 640 /// \param Clauses List of clauses. 641 /// \param AssociatedStmt Statement, associated with the directive. 642 /// 643 static OMPParallelSectionsDirective * 644 Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, 645 ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt); 646 647 /// \brief Creates an empty directive with the place for \a NumClauses 648 /// clauses. 649 /// 650 /// \param C AST context. 651 /// \param NumClauses Number of clauses. 652 /// 653 static OMPParallelSectionsDirective * 654 CreateEmpty(const ASTContext &C, unsigned NumClauses, EmptyShell); 655 classof(const Stmt * T)656 static bool classof(const Stmt *T) { 657 return T->getStmtClass() == OMPParallelSectionsDirectiveClass; 658 } 659 }; 660 661 } // end namespace clang 662 663 #endif 664