diff options
| author | Alexey Bataev <a.bataev@hotmail.com> | 2014-06-20 09:44:06 +0000 |
|---|---|---|
| committer | Alexey Bataev <a.bataev@hotmail.com> | 2014-06-20 09:44:06 +0000 |
| commit | 142e1fc9eae98667c54e07325196d113ecc94c74 (patch) | |
| tree | 5ac278d2dacef0c29c8ca25f8e24087d88cc051e /clang/lib | |
| parent | 6a29b55a5a390bcc60c27ec49776a6642ae58194 (diff) | |
| download | bcm5719-llvm-142e1fc9eae98667c54e07325196d113ecc94c74.tar.gz bcm5719-llvm-142e1fc9eae98667c54e07325196d113ecc94c74.zip | |
[OPENMP] Initial support for 'ordered' clause.
llvm-svn: 211347
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/AST/StmtPrinter.cpp | 4 | ||||
| -rw-r--r-- | clang/lib/AST/StmtProfile.cpp | 2 | ||||
| -rw-r--r-- | clang/lib/Basic/OpenMPKinds.cpp | 2 | ||||
| -rw-r--r-- | clang/lib/Parse/ParseOpenMP.cpp | 23 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaOpenMP.cpp | 39 | ||||
| -rw-r--r-- | clang/lib/Sema/TreeTransform.h | 7 | ||||
| -rw-r--r-- | clang/lib/Serialization/ASTReaderStmt.cpp | 5 | ||||
| -rw-r--r-- | clang/lib/Serialization/ASTWriterStmt.cpp | 2 |
8 files changed, 84 insertions, 0 deletions
diff --git a/clang/lib/AST/StmtPrinter.cpp b/clang/lib/AST/StmtPrinter.cpp index ca18e708a0d..b5c122c1f65 100644 --- a/clang/lib/AST/StmtPrinter.cpp +++ b/clang/lib/AST/StmtPrinter.cpp @@ -638,6 +638,10 @@ void OMPClausePrinter::VisitOMPScheduleClause(OMPScheduleClause *Node) { OS << ")"; } +void OMPClausePrinter::VisitOMPOrderedClause(OMPOrderedClause *) { + OS << "ordered"; +} + template<typename T> void OMPClausePrinter::VisitOMPClauseList(T *Node, char StartSym) { for (typename T::varlist_iterator I = Node->varlist_begin(), diff --git a/clang/lib/AST/StmtProfile.cpp b/clang/lib/AST/StmtProfile.cpp index bb41489597e..534d6bb7729 100644 --- a/clang/lib/AST/StmtProfile.cpp +++ b/clang/lib/AST/StmtProfile.cpp @@ -293,6 +293,8 @@ void OMPClauseProfiler::VisitOMPScheduleClause(const OMPScheduleClause *C) { Profiler->VisitStmt(C->getChunkSize()); } +void OMPClauseProfiler::VisitOMPOrderedClause(const OMPOrderedClause *) {} + template<typename T> void OMPClauseProfiler::VisitOMPClauseList(T *Node) { for (auto *I : Node->varlists()) diff --git a/clang/lib/Basic/OpenMPKinds.cpp b/clang/lib/Basic/OpenMPKinds.cpp index 131d40a3754..ec5198e06eb 100644 --- a/clang/lib/Basic/OpenMPKinds.cpp +++ b/clang/lib/Basic/OpenMPKinds.cpp @@ -95,6 +95,7 @@ unsigned clang::getOpenMPSimpleClauseType(OpenMPClauseKind Kind, case OMPC_linear: case OMPC_aligned: case OMPC_copyin: + case OMPC_ordered: break; } llvm_unreachable("Invalid OpenMP simple clause kind"); @@ -147,6 +148,7 @@ const char *clang::getOpenMPSimpleClauseTypeName(OpenMPClauseKind Kind, case OMPC_linear: case OMPC_aligned: case OMPC_copyin: + case OMPC_ordered: break; } llvm_unreachable("Invalid OpenMP simple clause kind"); diff --git a/clang/lib/Parse/ParseOpenMP.cpp b/clang/lib/Parse/ParseOpenMP.cpp index 9cd9d4d6340..599dda42124 100644 --- a/clang/lib/Parse/ParseOpenMP.cpp +++ b/clang/lib/Parse/ParseOpenMP.cpp @@ -317,6 +317,16 @@ OMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind DKind, Clause = ParseOpenMPSingleExprWithArgClause(CKind); break; + case OMPC_ordered: + // OpenMP [2.7.1, Restrictions, p. 9] + // Only one ordered clause can appear on a loop directive. + if (!FirstClause) { + Diag(Tok, diag::err_omp_more_one_clause) << getOpenMPDirectiveName(DKind) + << getOpenMPClauseName(CKind); + } + + Clause = ParseOpenMPClause(CKind); + break; case OMPC_private: case OMPC_firstprivate: case OMPC_lastprivate: @@ -409,6 +419,19 @@ OMPClause *Parser::ParseOpenMPSimpleClause(OpenMPClauseKind Kind) { Tok.getLocation()); } +/// \brief Parsing of OpenMP clauses like 'ordered'. +/// +/// ordered-clause: +/// 'ordered' +/// +OMPClause *Parser::ParseOpenMPClause(OpenMPClauseKind Kind) { + SourceLocation Loc = Tok.getLocation(); + ConsumeAnyToken(); + + return Actions.ActOnOpenMPClause(Kind, Loc, Tok.getLocation()); +} + + /// \brief Parsing of OpenMP clauses with single expressions and some additional /// argument like 'schedule' or 'dist_schedule'. /// diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index 515bd5f8c48..23c003815a7 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -1522,6 +1522,7 @@ OMPClause *Sema::ActOnOpenMPSingleExprClause(OpenMPClauseKind Kind, Expr *Expr, case OMPC_linear: case OMPC_aligned: case OMPC_copyin: + case OMPC_ordered: case OMPC_threadprivate: case OMPC_unknown: llvm_unreachable("Clause is not allowed."); @@ -1699,6 +1700,7 @@ OMPClause *Sema::ActOnOpenMPSimpleClause( case OMPC_linear: case OMPC_aligned: case OMPC_copyin: + case OMPC_ordered: case OMPC_threadprivate: case OMPC_unknown: llvm_unreachable("Clause is not allowed."); @@ -1807,6 +1809,7 @@ OMPClause *Sema::ActOnOpenMPSingleExprWithArgClause( case OMPC_linear: case OMPC_aligned: case OMPC_copyin: + case OMPC_ordered: case OMPC_threadprivate: case OMPC_unknown: llvm_unreachable("Clause is not allowed."); @@ -1870,6 +1873,41 @@ OMPClause *Sema::ActOnOpenMPScheduleClause( EndLoc, Kind, ValExpr); } +OMPClause *Sema::ActOnOpenMPClause(OpenMPClauseKind Kind, + SourceLocation StartLoc, + SourceLocation EndLoc) { + OMPClause *Res = nullptr; + switch (Kind) { + case OMPC_ordered: + Res = ActOnOpenMPOrderedClause(StartLoc, EndLoc); + break; + case OMPC_if: + case OMPC_num_threads: + case OMPC_safelen: + case OMPC_collapse: + case OMPC_schedule: + case OMPC_private: + case OMPC_firstprivate: + case OMPC_lastprivate: + case OMPC_shared: + case OMPC_reduction: + case OMPC_linear: + case OMPC_aligned: + case OMPC_copyin: + case OMPC_default: + case OMPC_proc_bind: + case OMPC_threadprivate: + case OMPC_unknown: + llvm_unreachable("Clause is not allowed."); + } + return Res; +} + +OMPClause *Sema::ActOnOpenMPOrderedClause(SourceLocation StartLoc, + SourceLocation EndLoc) { + return new (Context) OMPOrderedClause(StartLoc, EndLoc); +} + OMPClause *Sema::ActOnOpenMPVarListClause( OpenMPClauseKind Kind, ArrayRef<Expr *> VarList, Expr *TailExpr, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation ColonLoc, @@ -1911,6 +1949,7 @@ OMPClause *Sema::ActOnOpenMPVarListClause( case OMPC_default: case OMPC_proc_bind: case OMPC_schedule: + case OMPC_ordered: case OMPC_threadprivate: case OMPC_unknown: llvm_unreachable("Clause is not allowed."); diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 69685a95394..27b134c801a 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -6500,6 +6500,13 @@ TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { template <typename Derived> OMPClause * +TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *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()); diff --git a/clang/lib/Serialization/ASTReaderStmt.cpp b/clang/lib/Serialization/ASTReaderStmt.cpp index cda835597f1..65f86707fcb 100644 --- a/clang/lib/Serialization/ASTReaderStmt.cpp +++ b/clang/lib/Serialization/ASTReaderStmt.cpp @@ -1694,6 +1694,9 @@ OMPClause *OMPClauseReader::readClause() { case OMPC_schedule: C = new (Context) OMPScheduleClause(); break; + case OMPC_ordered: + C = new (Context) OMPOrderedClause(); + break; case OMPC_private: C = OMPPrivateClause::CreateEmpty(Context, Record[Idx++]); break; @@ -1769,6 +1772,8 @@ void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *C) { C->setCommaLoc(Reader->ReadSourceLocation(Record, Idx)); } +void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *) {} + void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *C) { C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); unsigned NumVars = C->varlist_size(); diff --git a/clang/lib/Serialization/ASTWriterStmt.cpp b/clang/lib/Serialization/ASTWriterStmt.cpp index 0de9221c73e..3904192aa91 100644 --- a/clang/lib/Serialization/ASTWriterStmt.cpp +++ b/clang/lib/Serialization/ASTWriterStmt.cpp @@ -1715,6 +1715,8 @@ void OMPClauseWriter::VisitOMPScheduleClause(OMPScheduleClause *C) { Writer->Writer.AddSourceLocation(C->getCommaLoc(), Record); } +void OMPClauseWriter::VisitOMPOrderedClause(OMPOrderedClause *) {} + void OMPClauseWriter::VisitOMPPrivateClause(OMPPrivateClause *C) { Record.push_back(C->varlist_size()); Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record); |

