I have reviewed this while reviewing: r212516 - [OPENMP] Parsing and sema analysis for 'omp parallel sections' directive.
All the code is a similar pattern and looks good. On Fri, Jun 20, 2014 at 7:19 AM, Alexey Bataev <[email protected]> wrote: > Author: abataev > Date: Fri Jun 20 06:19:47 2014 > New Revision: 211352 > > URL: http://llvm.org/viewvc/llvm-project?rev=211352&view=rev > Log: > [OPENMP] Initial support for 'nowait' clause. > > Modified: > cfe/trunk/include/clang/AST/DataRecursiveASTVisitor.h > cfe/trunk/include/clang/AST/OpenMPClause.h > cfe/trunk/include/clang/AST/RecursiveASTVisitor.h > cfe/trunk/include/clang/Basic/OpenMPKinds.def > cfe/trunk/include/clang/Sema/Sema.h > cfe/trunk/lib/AST/StmtPrinter.cpp > cfe/trunk/lib/AST/StmtProfile.cpp > cfe/trunk/lib/Basic/OpenMPKinds.cpp > cfe/trunk/lib/Parse/ParseOpenMP.cpp > cfe/trunk/lib/Sema/SemaOpenMP.cpp > cfe/trunk/lib/Sema/TreeTransform.h > cfe/trunk/lib/Serialization/ASTReaderStmt.cpp > cfe/trunk/lib/Serialization/ASTWriterStmt.cpp > cfe/trunk/test/OpenMP/for_ast_print.cpp > cfe/trunk/tools/libclang/CIndex.cpp > > Modified: cfe/trunk/include/clang/AST/DataRecursiveASTVisitor.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DataRecursiveASTVisitor.h?rev=211352&r1=211351&r2=211352&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/AST/DataRecursiveASTVisitor.h (original) > +++ cfe/trunk/include/clang/AST/DataRecursiveASTVisitor.h Fri Jun 20 > 06:19:47 2014 > @@ -2357,6 +2357,11 @@ RecursiveASTVisitor<Derived>::VisitOMPOr > } > > template <typename Derived> > +bool RecursiveASTVisitor<Derived>::VisitOMPNowaitClause(OMPNowaitClause > *) { > + return true; > +} > + > +template <typename Derived> > template <typename T> > void RecursiveASTVisitor<Derived>::VisitOMPClauseList(T *Node) { > for (auto *I : Node->varlists()) > > Modified: cfe/trunk/include/clang/AST/OpenMPClause.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/OpenMPClause.h?rev=211352&r1=211351&r2=211352&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/AST/OpenMPClause.h (original) > +++ cfe/trunk/include/clang/AST/OpenMPClause.h Fri Jun 20 06:19:47 2014 > @@ -629,6 +629,35 @@ public: > StmtRange children() { return StmtRange(); } > }; > > +/// \brief This represents 'nowait' clause in the '#pragma omp ...' > directive. > +/// > +/// \code > +/// #pragma omp for nowait > +/// \endcode > +/// In this example directive '#pragma omp for' has 'nowait' clause. > +/// > +class OMPNowaitClause : public OMPClause { > +public: > + /// \brief Build 'nowait' clause. > + /// > + /// \param StartLoc Starting location of the clause. > + /// \param EndLoc Ending location of the clause. > + /// > + OMPNowaitClause(SourceLocation StartLoc, SourceLocation EndLoc) > + : OMPClause(OMPC_nowait, StartLoc, EndLoc) {} > + > + /// \brief Build an empty clause. > + /// > + OMPNowaitClause() > + : OMPClause(OMPC_nowait, SourceLocation(), SourceLocation()) {} > + > + static bool classof(const OMPClause *T) { > + return T->getClauseKind() == OMPC_nowait; > + } > + > + StmtRange children() { return StmtRange(); } > +}; > + > /// \brief This represents clause 'private' in the '#pragma omp ...' > directives. > /// > /// \code > > Modified: cfe/trunk/include/clang/AST/RecursiveASTVisitor.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/RecursiveASTVisitor.h?rev=211352&r1=211351&r2=211352&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/AST/RecursiveASTVisitor.h (original) > +++ cfe/trunk/include/clang/AST/RecursiveASTVisitor.h Fri Jun 20 06:19:47 > 2014 > @@ -2378,6 +2378,11 @@ RecursiveASTVisitor<Derived>::VisitOMPOr > } > > template <typename Derived> > +bool RecursiveASTVisitor<Derived>::VisitOMPNowaitClause(OMPNowaitClause > *) { > + return true; > +} > + > +template <typename Derived> > template <typename T> > void RecursiveASTVisitor<Derived>::VisitOMPClauseList(T *Node) { > for (auto *I : Node->varlists()) > > Modified: cfe/trunk/include/clang/Basic/OpenMPKinds.def > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/OpenMPKinds.def?rev=211352&r1=211351&r2=211352&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/Basic/OpenMPKinds.def (original) > +++ cfe/trunk/include/clang/Basic/OpenMPKinds.def Fri Jun 20 06:19:47 2014 > @@ -61,6 +61,7 @@ OPENMP_CLAUSE(copyin, OMPCopyinClause) > OPENMP_CLAUSE(proc_bind, OMPProcBindClause) > OPENMP_CLAUSE(schedule, OMPScheduleClause) > OPENMP_CLAUSE(ordered, OMPOrderedClause) > +OPENMP_CLAUSE(nowait, OMPNowaitClause) > > // Clauses allowed for OpenMP directive 'parallel'. > OPENMP_PARALLEL_CLAUSE(if) > @@ -89,6 +90,7 @@ OPENMP_FOR_CLAUSE(reduction) > OPENMP_FOR_CLAUSE(collapse) > OPENMP_FOR_CLAUSE(schedule) > OPENMP_FOR_CLAUSE(ordered) > +OPENMP_FOR_CLAUSE(nowait) > > // Static attributes for 'default' clause. > OPENMP_DEFAULT_KIND(none) > > Modified: cfe/trunk/include/clang/Sema/Sema.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=211352&r1=211351&r2=211352&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/Sema/Sema.h (original) > +++ cfe/trunk/include/clang/Sema/Sema.h Fri Jun 20 06:19:47 2014 > @@ -7386,6 +7386,9 @@ public: > /// \brief Called on well-formed 'ordered' clause. > OMPClause *ActOnOpenMPOrderedClause(SourceLocation StartLoc, > SourceLocation EndLoc); > + /// \brief Called on well-formed 'nowait' clause. > + OMPClause *ActOnOpenMPNowaitClause(SourceLocation StartLoc, > + SourceLocation EndLoc); > > OMPClause * > ActOnOpenMPVarListClause(OpenMPClauseKind Kind, ArrayRef<Expr *> Vars, > > Modified: cfe/trunk/lib/AST/StmtPrinter.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/StmtPrinter.cpp?rev=211352&r1=211351&r2=211352&view=diff > > ============================================================================== > --- cfe/trunk/lib/AST/StmtPrinter.cpp (original) > +++ cfe/trunk/lib/AST/StmtPrinter.cpp Fri Jun 20 06:19:47 2014 > @@ -642,6 +642,10 @@ void OMPClausePrinter::VisitOMPOrderedCl > OS << "ordered"; > } > > +void OMPClausePrinter::VisitOMPNowaitClause(OMPNowaitClause *) { > + OS << "nowait"; > +} > + > template<typename T> > void OMPClausePrinter::VisitOMPClauseList(T *Node, char StartSym) { > for (typename T::varlist_iterator I = Node->varlist_begin(), > > Modified: cfe/trunk/lib/AST/StmtProfile.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/StmtProfile.cpp?rev=211352&r1=211351&r2=211352&view=diff > > ============================================================================== > --- cfe/trunk/lib/AST/StmtProfile.cpp (original) > +++ cfe/trunk/lib/AST/StmtProfile.cpp Fri Jun 20 06:19:47 2014 > @@ -295,6 +295,8 @@ void OMPClauseProfiler::VisitOMPSchedule > > void OMPClauseProfiler::VisitOMPOrderedClause(const OMPOrderedClause *) {} > > +void OMPClauseProfiler::VisitOMPNowaitClause(const OMPNowaitClause *) {} > + > template<typename T> > void OMPClauseProfiler::VisitOMPClauseList(T *Node) { > for (auto *I : Node->varlists()) > > Modified: cfe/trunk/lib/Basic/OpenMPKinds.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/OpenMPKinds.cpp?rev=211352&r1=211351&r2=211352&view=diff > > ============================================================================== > --- cfe/trunk/lib/Basic/OpenMPKinds.cpp (original) > +++ cfe/trunk/lib/Basic/OpenMPKinds.cpp Fri Jun 20 06:19:47 2014 > @@ -96,6 +96,7 @@ unsigned clang::getOpenMPSimpleClauseTyp > case OMPC_aligned: > case OMPC_copyin: > case OMPC_ordered: > + case OMPC_nowait: > break; > } > llvm_unreachable("Invalid OpenMP simple clause kind"); > @@ -149,6 +150,7 @@ const char *clang::getOpenMPSimpleClause > case OMPC_aligned: > case OMPC_copyin: > case OMPC_ordered: > + case OMPC_nowait: > break; > } > llvm_unreachable("Invalid OpenMP simple clause kind"); > > Modified: cfe/trunk/lib/Parse/ParseOpenMP.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseOpenMP.cpp?rev=211352&r1=211351&r2=211352&view=diff > > ============================================================================== > --- cfe/trunk/lib/Parse/ParseOpenMP.cpp (original) > +++ cfe/trunk/lib/Parse/ParseOpenMP.cpp Fri Jun 20 06:19:47 2014 > @@ -318,8 +318,11 @@ OMPClause *Parser::ParseOpenMPClause(Ope > Clause = ParseOpenMPSingleExprWithArgClause(CKind); > break; > case OMPC_ordered: > + case OMPC_nowait: > // OpenMP [2.7.1, Restrictions, p. 9] > // Only one ordered clause can appear on a loop directive. > + // OpenMP [2.7.1, Restrictions, C/C++, p. 4] > + // Only one nowait clause can appear on a for directive. > if (!FirstClause) { > Diag(Tok, diag::err_omp_more_one_clause) << > getOpenMPDirectiveName(DKind) > << > getOpenMPClauseName(CKind); > @@ -424,6 +427,9 @@ OMPClause *Parser::ParseOpenMPSimpleClau > /// ordered-clause: > /// 'ordered' > /// > +/// nowait-clause: > +/// 'nowait' > +/// > OMPClause *Parser::ParseOpenMPClause(OpenMPClauseKind Kind) { > SourceLocation Loc = Tok.getLocation(); > ConsumeAnyToken(); > > Modified: cfe/trunk/lib/Sema/SemaOpenMP.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOpenMP.cpp?rev=211352&r1=211351&r2=211352&view=diff > > ============================================================================== > --- cfe/trunk/lib/Sema/SemaOpenMP.cpp (original) > +++ cfe/trunk/lib/Sema/SemaOpenMP.cpp Fri Jun 20 06:19:47 2014 > @@ -1523,6 +1523,7 @@ OMPClause *Sema::ActOnOpenMPSingleExprCl > case OMPC_aligned: > case OMPC_copyin: > case OMPC_ordered: > + case OMPC_nowait: > case OMPC_threadprivate: > case OMPC_unknown: > llvm_unreachable("Clause is not allowed."); > @@ -1701,6 +1702,7 @@ OMPClause *Sema::ActOnOpenMPSimpleClause > case OMPC_aligned: > case OMPC_copyin: > case OMPC_ordered: > + case OMPC_nowait: > case OMPC_threadprivate: > case OMPC_unknown: > llvm_unreachable("Clause is not allowed."); > @@ -1810,6 +1812,7 @@ OMPClause *Sema::ActOnOpenMPSingleExprWi > case OMPC_aligned: > case OMPC_copyin: > case OMPC_ordered: > + case OMPC_nowait: > case OMPC_threadprivate: > case OMPC_unknown: > llvm_unreachable("Clause is not allowed."); > @@ -1881,6 +1884,9 @@ OMPClause *Sema::ActOnOpenMPClause(OpenM > case OMPC_ordered: > Res = ActOnOpenMPOrderedClause(StartLoc, EndLoc); > break; > + case OMPC_nowait: > + Res = ActOnOpenMPNowaitClause(StartLoc, EndLoc); > + break; > case OMPC_if: > case OMPC_num_threads: > case OMPC_safelen: > @@ -1908,6 +1914,11 @@ OMPClause *Sema::ActOnOpenMPOrderedClaus > return new (Context) OMPOrderedClause(StartLoc, EndLoc); > } > > +OMPClause *Sema::ActOnOpenMPNowaitClause(SourceLocation StartLoc, > + SourceLocation EndLoc) { > + return new (Context) OMPNowaitClause(StartLoc, EndLoc); > +} > + > OMPClause *Sema::ActOnOpenMPVarListClause( > OpenMPClauseKind Kind, ArrayRef<Expr *> VarList, Expr *TailExpr, > SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation > ColonLoc, > @@ -1950,6 +1961,7 @@ OMPClause *Sema::ActOnOpenMPVarListClaus > case OMPC_proc_bind: > case OMPC_schedule: > case OMPC_ordered: > + case OMPC_nowait: > case OMPC_threadprivate: > case OMPC_unknown: > llvm_unreachable("Clause is not allowed."); > > Modified: cfe/trunk/lib/Sema/TreeTransform.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TreeTransform.h?rev=211352&r1=211351&r2=211352&view=diff > > ============================================================================== > --- cfe/trunk/lib/Sema/TreeTransform.h (original) > +++ cfe/trunk/lib/Sema/TreeTransform.h Fri Jun 20 06:19:47 2014 > @@ -6507,6 +6507,13 @@ TreeTransform<Derived>::TransformOMPOrde > > template <typename Derived> > OMPClause * > +TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) { > + // No need to rebuild this clause, no template-dependent parameters. > + return C; > +} > + > +template <typename Derived> > +OMPClause * > TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { > llvm::SmallVector<Expr *, 16> Vars; > Vars.reserve(C->varlist_size()); > > Modified: cfe/trunk/lib/Serialization/ASTReaderStmt.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderStmt.cpp?rev=211352&r1=211351&r2=211352&view=diff > > ============================================================================== > --- cfe/trunk/lib/Serialization/ASTReaderStmt.cpp (original) > +++ cfe/trunk/lib/Serialization/ASTReaderStmt.cpp Fri Jun 20 06:19:47 2014 > @@ -1697,6 +1697,9 @@ OMPClause *OMPClauseReader::readClause() > case OMPC_ordered: > C = new (Context) OMPOrderedClause(); > break; > + case OMPC_nowait: > + C = new (Context) OMPNowaitClause(); > + break; > case OMPC_private: > C = OMPPrivateClause::CreateEmpty(Context, Record[Idx++]); > break; > @@ -1774,6 +1777,8 @@ void OMPClauseReader::VisitOMPScheduleCl > > void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *) {} > > +void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *) {} > + > void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *C) { > C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); > unsigned NumVars = C->varlist_size(); > > Modified: cfe/trunk/lib/Serialization/ASTWriterStmt.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriterStmt.cpp?rev=211352&r1=211351&r2=211352&view=diff > > ============================================================================== > --- cfe/trunk/lib/Serialization/ASTWriterStmt.cpp (original) > +++ cfe/trunk/lib/Serialization/ASTWriterStmt.cpp Fri Jun 20 06:19:47 2014 > @@ -1717,6 +1717,8 @@ void OMPClauseWriter::VisitOMPScheduleCl > > void OMPClauseWriter::VisitOMPOrderedClause(OMPOrderedClause *) {} > > +void OMPClauseWriter::VisitOMPNowaitClause(OMPNowaitClause *) {} > + > void OMPClauseWriter::VisitOMPPrivateClause(OMPPrivateClause *C) { > Record.push_back(C->varlist_size()); > Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record); > > Modified: cfe/trunk/test/OpenMP/for_ast_print.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/for_ast_print.cpp?rev=211352&r1=211351&r2=211352&view=diff > > ============================================================================== > --- cfe/trunk/test/OpenMP/for_ast_print.cpp (original) > +++ cfe/trunk/test/OpenMP/for_ast_print.cpp Fri Jun 20 06:19:47 2014 > @@ -20,12 +20,12 @@ T tmain(T argc) { > // CHECK-NEXT: for (int i = 0; i < 2; ++i) > // CHECK-NEXT: a = 2; > #pragma omp parallel > -#pragma omp for private(argc, b), firstprivate(c, d), lastprivate(d, f) > collapse(N) schedule(static, N) ordered > +#pragma omp for private(argc, b), firstprivate(c, d), lastprivate(d, f) > collapse(N) schedule(static, N) ordered nowait > for (int i = 0; i < 10; ++i) > for (int j = 0; j < 10; ++j) > foo(); > // CHECK-NEXT: #pragma omp parallel > - // CHECK-NEXT: #pragma omp for private(argc,b) firstprivate(c,d) > lastprivate(d,f) collapse(N) schedule(static, N) ordered > + // CHECK-NEXT: #pragma omp for private(argc,b) firstprivate(c,d) > lastprivate(d,f) collapse(N) schedule(static, N) ordered nowait > // CHECK-NEXT: for (int i = 0; i < 10; ++i) > // CHECK-NEXT: for (int j = 0; j < 10; ++j) > // CHECK-NEXT: foo(); > @@ -43,12 +43,12 @@ int main(int argc, char **argv) { > // CHECK-NEXT: for (int i = 0; i < 2; ++i) > // CHECK-NEXT: a = 2; > #pragma omp parallel > -#pragma omp for private(argc, b), firstprivate(argv, c), lastprivate(d, > f) collapse(2) schedule(auto) ordered > +#pragma omp for private(argc, b), firstprivate(argv, c), lastprivate(d, > f) collapse(2) schedule(auto) ordered nowait > for (int i = 0; i < 10; ++i) > for (int j = 0; j < 10; ++j) > foo(); > // CHECK-NEXT: #pragma omp parallel > - // CHECK-NEXT: #pragma omp for private(argc,b) firstprivate(argv,c) > lastprivate(d,f) collapse(2) schedule(auto) ordered > + // CHECK-NEXT: #pragma omp for private(argc,b) firstprivate(argv,c) > lastprivate(d,f) collapse(2) schedule(auto) ordered nowait > // CHECK-NEXT: for (int i = 0; i < 10; ++i) > // CHECK-NEXT: for (int j = 0; j < 10; ++j) > // CHECK-NEXT: foo(); > > Modified: cfe/trunk/tools/libclang/CIndex.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=211352&r1=211351&r2=211352&view=diff > > ============================================================================== > --- cfe/trunk/tools/libclang/CIndex.cpp (original) > +++ cfe/trunk/tools/libclang/CIndex.cpp Fri Jun 20 06:19:47 2014 > @@ -1951,6 +1951,8 @@ void OMPClauseEnqueue::VisitOMPScheduleC > > void OMPClauseEnqueue::VisitOMPOrderedClause(const OMPOrderedClause *) {} > > +void OMPClauseEnqueue::VisitOMPNowaitClause(const OMPNowaitClause *) {} > + > template<typename T> > void OMPClauseEnqueue::VisitOMPClauseList(T *Node) { > for (const auto *I : Node->varlists()) > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
