From: Alexey Bataev Date: Tue, 24 Sep 2013 03:17:45 +0000 (+0000) Subject: [OPENMP] Bug fixes and improvements. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=543c4ae954f2bce5ac58ed22080f23cbd94794d2;p=clang [OPENMP] Bug fixes and improvements. 1. Fixed constructor of shared clause. 2. Some macros for clauses processing are replaced by private template methods. 3. Additional checks in sema analysis of OpenMP clauses. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@191265 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/RecursiveASTVisitor.h b/include/clang/AST/RecursiveASTVisitor.h index ac6ea67594..8c047d3b7e 100644 --- a/include/clang/AST/RecursiveASTVisitor.h +++ b/include/clang/AST/RecursiveASTVisitor.h @@ -426,6 +426,9 @@ private: #define OPENMP_CLAUSE(Name, Class) \ bool Visit##Class(Class *C); #include "clang/Basic/OpenMPKinds.def" + /// \brief Process clauses with list of variables. + template + void VisitOMPClauseList(T *Node); struct EnqueueJob { Stmt *S; @@ -2348,26 +2351,27 @@ bool RecursiveASTVisitor::VisitOMPDefaultClause(OMPDefaultClause *C) { return true; } -#define PROCESS_OMP_CLAUSE_LIST(Class, Node) \ - for (OMPVarList::varlist_iterator I = Node->varlist_begin(), \ - E = Node->varlist_end(); \ - I != E; ++I) \ +template +template +void RecursiveASTVisitor::VisitOMPClauseList(T *Node) { + for (typename T::varlist_iterator I = Node->varlist_begin(), + E = Node->varlist_end(); + I != E; ++I) TraverseStmt(*I); +} template bool RecursiveASTVisitor::VisitOMPPrivateClause(OMPPrivateClause *C) { - PROCESS_OMP_CLAUSE_LIST(OMPPrivateClause, C) + VisitOMPClauseList(C); return true; } template bool RecursiveASTVisitor::VisitOMPSharedClause(OMPSharedClause *C) { - PROCESS_OMP_CLAUSE_LIST(OMPSharedClause, C) + VisitOMPClauseList(C); return true; } -#undef PROCESS_OMP_CLAUSE_LIST - // FIXME: look at the following tricky-seeming exprs to see if we // need to recurse on anything. These are ones that have methods // returning decls or qualtypes or nestednamespecifier -- though I'm diff --git a/include/clang/AST/StmtOpenMP.h b/include/clang/AST/StmtOpenMP.h index dc68d77a8c..57097e994c 100644 --- a/include/clang/AST/StmtOpenMP.h +++ b/include/clang/AST/StmtOpenMP.h @@ -275,7 +275,7 @@ class OMPSharedClause : public OMPClause, public OMPVarList { /// \param N Number of variables. /// explicit OMPSharedClause(unsigned N) - : OMPClause(OMPC_private, SourceLocation(), SourceLocation()), + : OMPClause(OMPC_shared, SourceLocation(), SourceLocation()), OMPVarList(SourceLocation(), N) { } public: /// \brief Creates clause with a list of variables \a VL. diff --git a/lib/AST/StmtPrinter.cpp b/lib/AST/StmtPrinter.cpp index ee3852a3e9..df8d2bbf09 100644 --- a/lib/AST/StmtPrinter.cpp +++ b/lib/AST/StmtPrinter.cpp @@ -586,6 +586,9 @@ void StmtPrinter::VisitSEHFinallyStmt(SEHFinallyStmt *Node) { namespace { class OMPClausePrinter : public OMPClauseVisitor { raw_ostream &OS; + /// \brief Process clauses with list of variables. + template + void VisitOMPClauseList(T *Node, char StartSym); public: OMPClausePrinter(raw_ostream &OS) : OS(OS) { } #define OPENMP_CLAUSE(Name, Class) \ @@ -599,17 +602,19 @@ void OMPClausePrinter::VisitOMPDefaultClause(OMPDefaultClause *Node) { << ")"; } -#define PROCESS_OMP_CLAUSE_LIST(Class, Node, StartSym) \ - for (OMPVarList::varlist_iterator I = Node->varlist_begin(), \ - E = Node->varlist_end(); \ - I != E; ++I) \ - OS << (I == Node->varlist_begin() ? StartSym : ',') \ +template +void OMPClausePrinter::VisitOMPClauseList(T *Node, char StartSym) { + for (typename T::varlist_iterator I = Node->varlist_begin(), + E = Node->varlist_end(); + I != E; ++I) + OS << (I == Node->varlist_begin() ? StartSym : ',') << *cast(cast(*I)->getDecl()); +} void OMPClausePrinter::VisitOMPPrivateClause(OMPPrivateClause *Node) { if (!Node->varlist_empty()) { OS << "private"; - PROCESS_OMP_CLAUSE_LIST(OMPPrivateClause, Node, '(') + VisitOMPClauseList(Node, '('); OS << ")"; } } @@ -617,12 +622,11 @@ void OMPClausePrinter::VisitOMPPrivateClause(OMPPrivateClause *Node) { void OMPClausePrinter::VisitOMPSharedClause(OMPSharedClause *Node) { if (!Node->varlist_empty()) { OS << "shared"; - PROCESS_OMP_CLAUSE_LIST(OMPSharedClause, Node, '(') + VisitOMPClauseList(Node, '('); OS << ")"; } } -#undef PROCESS_OMP_CLAUSE_LIST } //===----------------------------------------------------------------------===// diff --git a/lib/AST/StmtProfile.cpp b/lib/AST/StmtProfile.cpp index 9591127b8a..cde95ee351 100644 --- a/lib/AST/StmtProfile.cpp +++ b/lib/AST/StmtProfile.cpp @@ -255,6 +255,9 @@ StmtProfiler::VisitObjCAutoreleasePoolStmt(const ObjCAutoreleasePoolStmt *S) { namespace { class OMPClauseProfiler : public ConstOMPClauseVisitor { StmtProfiler *Profiler; + /// \brief Process clauses with list of variables. + template + void VisitOMPClauseList(T *Node); public: OMPClauseProfiler(StmtProfiler *P) : Profiler(P) { } #define OPENMP_CLAUSE(Name, Class) \ @@ -263,19 +266,21 @@ public: }; void OMPClauseProfiler::VisitOMPDefaultClause(const OMPDefaultClause *C) { } -#define PROCESS_OMP_CLAUSE_LIST(Class, Node) \ - for (OMPVarList::varlist_const_iterator I = Node->varlist_begin(), \ - E = Node->varlist_end(); \ - I != E; ++I) \ + +template +void OMPClauseProfiler::VisitOMPClauseList(T *Node) { + for (typename T::varlist_const_iterator I = Node->varlist_begin(), + E = Node->varlist_end(); + I != E; ++I) Profiler->VisitStmt(*I); +} void OMPClauseProfiler::VisitOMPPrivateClause(const OMPPrivateClause *C) { - PROCESS_OMP_CLAUSE_LIST(OMPPrivateClause, C) + VisitOMPClauseList(C); } void OMPClauseProfiler::VisitOMPSharedClause(const OMPSharedClause *C) { - PROCESS_OMP_CLAUSE_LIST(OMPSharedClause, C) + VisitOMPClauseList(C); } -#undef PROCESS_OMP_CLAUSE_LIST } void diff --git a/lib/Sema/SemaOpenMP.cpp b/lib/Sema/SemaOpenMP.cpp index b1296936c2..a0e6780793 100644 --- a/lib/Sema/SemaOpenMP.cpp +++ b/lib/Sema/SemaOpenMP.cpp @@ -717,7 +717,8 @@ OMPClause *Sema::ActOnOpenMPPrivateClause(ArrayRef VarList, SmallVector Vars; for (ArrayRef::iterator I = VarList.begin(), E = VarList.end(); I != E; ++I) { - if (*I && isa(*I)) { + assert(*I && "NULL expr in OpenMP private clause."); + if (isa(*I)) { // It will be analyzed later. Vars.push_back(*I); continue; @@ -849,7 +850,8 @@ OMPClause *Sema::ActOnOpenMPSharedClause(ArrayRef VarList, SmallVector Vars; for (ArrayRef::iterator I = VarList.begin(), E = VarList.end(); I != E; ++I) { - if (*I && isa(*I)) { + assert(*I && "NULL expr in OpenMP shared clause."); + if (isa(*I)) { // It will be analyzed later. Vars.push_back(*I); continue; diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h index b91c73b075..5d080f9efb 100644 --- a/lib/Sema/TreeTransform.h +++ b/lib/Sema/TreeTransform.h @@ -6325,8 +6325,8 @@ OMPClause * TreeTransform::TransformOMPPrivateClause(OMPPrivateClause *C) { llvm::SmallVector Vars; Vars.reserve(C->varlist_size()); - for (OMPVarList::varlist_iterator I = C->varlist_begin(), - E = C->varlist_end(); + for (OMPPrivateClause::varlist_iterator I = C->varlist_begin(), + E = C->varlist_end(); I != E; ++I) { ExprResult EVar = getDerived().TransformExpr(cast(*I)); if (EVar.isInvalid()) @@ -6344,8 +6344,8 @@ OMPClause * TreeTransform::TransformOMPSharedClause(OMPSharedClause *C) { llvm::SmallVector Vars; Vars.reserve(C->varlist_size()); - for (OMPVarList::varlist_iterator I = C->varlist_begin(), - E = C->varlist_end(); + for (OMPSharedClause::varlist_iterator I = C->varlist_begin(), + E = C->varlist_end(); I != E; ++I) { ExprResult EVar = getDerived().TransformExpr(cast(*I)); if (EVar.isInvalid()) diff --git a/lib/Serialization/ASTWriterStmt.cpp b/lib/Serialization/ASTWriterStmt.cpp index d527fcd382..e38d8c69a7 100644 --- a/lib/Serialization/ASTWriterStmt.cpp +++ b/lib/Serialization/ASTWriterStmt.cpp @@ -1706,8 +1706,8 @@ void OMPClauseWriter::VisitOMPDefaultClause(OMPDefaultClause *C) { void OMPClauseWriter::VisitOMPPrivateClause(OMPPrivateClause *C) { Record.push_back(C->varlist_size()); Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record); - for (OMPVarList::varlist_iterator I = C->varlist_begin(), - E = C->varlist_end(); + for (OMPPrivateClause::varlist_iterator I = C->varlist_begin(), + E = C->varlist_end(); I != E; ++I) Writer->Writer.AddStmt(*I); } @@ -1715,8 +1715,8 @@ void OMPClauseWriter::VisitOMPPrivateClause(OMPPrivateClause *C) { void OMPClauseWriter::VisitOMPSharedClause(OMPSharedClause *C) { Record.push_back(C->varlist_size()); Writer->Writer.AddSourceLocation(C->getLParenLoc(), Record); - for (OMPVarList::varlist_iterator I = C->varlist_begin(), - E = C->varlist_end(); + for (OMPSharedClause::varlist_iterator I = C->varlist_begin(), + E = C->varlist_end(); I != E; ++I) Writer->Writer.AddStmt(*I); } diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp index 036b46dcf7..5d376ae6ad 100644 --- a/tools/libclang/CIndex.cpp +++ b/tools/libclang/CIndex.cpp @@ -1911,6 +1911,9 @@ void EnqueueVisitor::EnqueueChildren(const Stmt *S) { namespace { class OMPClauseEnqueue : public ConstOMPClauseVisitor { EnqueueVisitor *Visitor; + /// \brief Process clauses with list of variables. + template + void VisitOMPClauseList(T *Node); public: OMPClauseEnqueue(EnqueueVisitor *Visitor) : Visitor(Visitor) { } #define OPENMP_CLAUSE(Name, Class) \ @@ -1919,20 +1922,23 @@ public: }; void OMPClauseEnqueue::VisitOMPDefaultClause(const OMPDefaultClause *C) { } -#define PROCESS_OMP_CLAUSE_LIST(Class, Node) \ - for (OMPVarList::varlist_const_iterator I = Node->varlist_begin(), \ - E = Node->varlist_end(); \ - I != E; ++I) \ + +template +void OMPClauseEnqueue::VisitOMPClauseList(T *Node) { + for (typename T::varlist_const_iterator I = Node->varlist_begin(), + E = Node->varlist_end(); + I != E; ++I) Visitor->AddStmt(*I); +} void OMPClauseEnqueue::VisitOMPPrivateClause(const OMPPrivateClause *C) { - PROCESS_OMP_CLAUSE_LIST(OMPPrivateClause, C) + VisitOMPClauseList(C); } void OMPClauseEnqueue::VisitOMPSharedClause(const OMPSharedClause *C) { - PROCESS_OMP_CLAUSE_LIST(OMPSharedClause, C) + VisitOMPClauseList(C); } -#undef PROCESS_OMP_CLAUSE_LIST } + void EnqueueVisitor::EnqueueChildren(const OMPClause *S) { unsigned size = WL.size(); OMPClauseEnqueue Visitor(this); diff --git a/tools/libclang/RecursiveASTVisitor.h b/tools/libclang/RecursiveASTVisitor.h index b8e66d481b..fe936f922e 100644 --- a/tools/libclang/RecursiveASTVisitor.h +++ b/tools/libclang/RecursiveASTVisitor.h @@ -410,6 +410,9 @@ private: #define OPENMP_CLAUSE(Name, Class) \ bool Visit##Class(Class *C); #include "clang/Basic/OpenMPKinds.def" + /// \brief Process clauses with list of variables. + template + void VisitOMPClauseList(T *Node); typedef SmallVector StmtsTy; typedef SmallVector QueuesTy; @@ -2326,26 +2329,27 @@ bool RecursiveASTVisitor::VisitOMPDefaultClause(OMPDefaultClause *C) { return true; } -#define PROCESS_OMP_CLAUSE_LIST(Class, Node) \ - for (OMPVarList::varlist_iterator I = Node->varlist_begin(), \ - E = Node->varlist_end(); \ - I != E; ++I) \ +template +template +void RecursiveASTVisitor::VisitOMPClauseList(T *Node) { + for (typename T::varlist_iterator I = Node->varlist_begin(), + E = Node->varlist_end(); + I != E; ++I) TraverseStmt(*I); +} template bool RecursiveASTVisitor::VisitOMPPrivateClause(OMPPrivateClause *C) { - PROCESS_OMP_CLAUSE_LIST(OMPPrivateClause, C) + VisitOMPClauseList(C); return true; } template bool RecursiveASTVisitor::VisitOMPSharedClause(OMPSharedClause *C) { - PROCESS_OMP_CLAUSE_LIST(OMPSharedClause, C) + VisitOMPClauseList(C); return true; } -#undef PROCESS_OMP_CLAUSE_LIST - // FIXME: look at the following tricky-seeming exprs to see if we // need to recurse on anything. These are ones that have methods // returning decls or qualtypes or nestednamespecifier -- though I'm