summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexey Bataev <a.bataev@hotmail.com>2013-09-24 03:17:45 +0000
committerAlexey Bataev <a.bataev@hotmail.com>2013-09-24 03:17:45 +0000
commit756c196f1463f2c666f853aecb20e198d8af010d (patch)
tree8643031801147465637162c6ebf28724f76fc425
parent036f16dc8c494efca4a342703fd572b6de76a1fa (diff)
downloadbcm5719-llvm-756c196f1463f2c666f853aecb20e198d8af010d.tar.gz
bcm5719-llvm-756c196f1463f2c666f853aecb20e198d8af010d.zip
[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. llvm-svn: 191265
-rw-r--r--clang/include/clang/AST/RecursiveASTVisitor.h20
-rw-r--r--clang/include/clang/AST/StmtOpenMP.h2
-rw-r--r--clang/lib/AST/StmtPrinter.cpp20
-rw-r--r--clang/lib/AST/StmtProfile.cpp19
-rw-r--r--clang/lib/Sema/SemaOpenMP.cpp6
-rw-r--r--clang/lib/Sema/TreeTransform.h8
-rw-r--r--clang/lib/Serialization/ASTWriterStmt.cpp8
-rw-r--r--clang/tools/libclang/CIndex.cpp20
-rw-r--r--clang/tools/libclang/RecursiveASTVisitor.h20
9 files changed, 74 insertions, 49 deletions
diff --git a/clang/include/clang/AST/RecursiveASTVisitor.h b/clang/include/clang/AST/RecursiveASTVisitor.h
index ac6ea675943..8c047d3b7e8 100644
--- a/clang/include/clang/AST/RecursiveASTVisitor.h
+++ b/clang/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 <typename T>
+ void VisitOMPClauseList(T *Node);
struct EnqueueJob {
Stmt *S;
@@ -2348,26 +2351,27 @@ bool RecursiveASTVisitor<Derived>::VisitOMPDefaultClause(OMPDefaultClause *C) {
return true;
}
-#define PROCESS_OMP_CLAUSE_LIST(Class, Node) \
- for (OMPVarList<Class>::varlist_iterator I = Node->varlist_begin(), \
- E = Node->varlist_end(); \
- I != E; ++I) \
+template<typename Derived>
+template<typename T>
+void RecursiveASTVisitor<Derived>::VisitOMPClauseList(T *Node) {
+ for (typename T::varlist_iterator I = Node->varlist_begin(),
+ E = Node->varlist_end();
+ I != E; ++I)
TraverseStmt(*I);
+}
template<typename Derived>
bool RecursiveASTVisitor<Derived>::VisitOMPPrivateClause(OMPPrivateClause *C) {
- PROCESS_OMP_CLAUSE_LIST(OMPPrivateClause, C)
+ VisitOMPClauseList(C);
return true;
}
template<typename Derived>
bool RecursiveASTVisitor<Derived>::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/clang/include/clang/AST/StmtOpenMP.h b/clang/include/clang/AST/StmtOpenMP.h
index dc68d77a8cf..57097e994c2 100644
--- a/clang/include/clang/AST/StmtOpenMP.h
+++ b/clang/include/clang/AST/StmtOpenMP.h
@@ -275,7 +275,7 @@ class OMPSharedClause : public OMPClause, public OMPVarList<OMPSharedClause> {
/// \param N Number of variables.
///
explicit OMPSharedClause(unsigned N)
- : OMPClause(OMPC_private, SourceLocation(), SourceLocation()),
+ : OMPClause(OMPC_shared, SourceLocation(), SourceLocation()),
OMPVarList<OMPSharedClause>(SourceLocation(), N) { }
public:
/// \brief Creates clause with a list of variables \a VL.
diff --git a/clang/lib/AST/StmtPrinter.cpp b/clang/lib/AST/StmtPrinter.cpp
index ee3852a3e98..df8d2bbf09d 100644
--- a/clang/lib/AST/StmtPrinter.cpp
+++ b/clang/lib/AST/StmtPrinter.cpp
@@ -586,6 +586,9 @@ void StmtPrinter::VisitSEHFinallyStmt(SEHFinallyStmt *Node) {
namespace {
class OMPClausePrinter : public OMPClauseVisitor<OMPClausePrinter> {
raw_ostream &OS;
+ /// \brief Process clauses with list of variables.
+ template <typename T>
+ 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<Class>::varlist_iterator I = Node->varlist_begin(), \
- E = Node->varlist_end(); \
- I != E; ++I) \
- OS << (I == Node->varlist_begin() ? StartSym : ',') \
+template<typename T>
+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<NamedDecl>(cast<DeclRefExpr>(*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/clang/lib/AST/StmtProfile.cpp b/clang/lib/AST/StmtProfile.cpp
index 9591127b8af..cde95ee3514 100644
--- a/clang/lib/AST/StmtProfile.cpp
+++ b/clang/lib/AST/StmtProfile.cpp
@@ -255,6 +255,9 @@ StmtProfiler::VisitObjCAutoreleasePoolStmt(const ObjCAutoreleasePoolStmt *S) {
namespace {
class OMPClauseProfiler : public ConstOMPClauseVisitor<OMPClauseProfiler> {
StmtProfiler *Profiler;
+ /// \brief Process clauses with list of variables.
+ template <typename T>
+ 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<Class>::varlist_const_iterator I = Node->varlist_begin(), \
- E = Node->varlist_end(); \
- I != E; ++I) \
+
+template<typename T>
+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/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index b1296936c21..a0e67807935 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -717,7 +717,8 @@ OMPClause *Sema::ActOnOpenMPPrivateClause(ArrayRef<Expr *> VarList,
SmallVector<Expr *, 8> Vars;
for (ArrayRef<Expr *>::iterator I = VarList.begin(), E = VarList.end();
I != E; ++I) {
- if (*I && isa<DependentScopeDeclRefExpr>(*I)) {
+ assert(*I && "NULL expr in OpenMP private clause.");
+ if (isa<DependentScopeDeclRefExpr>(*I)) {
// It will be analyzed later.
Vars.push_back(*I);
continue;
@@ -849,7 +850,8 @@ OMPClause *Sema::ActOnOpenMPSharedClause(ArrayRef<Expr *> VarList,
SmallVector<Expr *, 8> Vars;
for (ArrayRef<Expr *>::iterator I = VarList.begin(), E = VarList.end();
I != E; ++I) {
- if (*I && isa<DependentScopeDeclRefExpr>(*I)) {
+ assert(*I && "NULL expr in OpenMP shared clause.");
+ if (isa<DependentScopeDeclRefExpr>(*I)) {
// It will be analyzed later.
Vars.push_back(*I);
continue;
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h
index b91c73b075b..5d080f9efb7 100644
--- a/clang/lib/Sema/TreeTransform.h
+++ b/clang/lib/Sema/TreeTransform.h
@@ -6325,8 +6325,8 @@ OMPClause *
TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
llvm::SmallVector<Expr *, 16> Vars;
Vars.reserve(C->varlist_size());
- for (OMPVarList<OMPPrivateClause>::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<Expr>(*I));
if (EVar.isInvalid())
@@ -6344,8 +6344,8 @@ OMPClause *
TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
llvm::SmallVector<Expr *, 16> Vars;
Vars.reserve(C->varlist_size());
- for (OMPVarList<OMPSharedClause>::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<Expr>(*I));
if (EVar.isInvalid())
diff --git a/clang/lib/Serialization/ASTWriterStmt.cpp b/clang/lib/Serialization/ASTWriterStmt.cpp
index d527fcd382d..e38d8c69a72 100644
--- a/clang/lib/Serialization/ASTWriterStmt.cpp
+++ b/clang/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<OMPPrivateClause>::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<OMPSharedClause>::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/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp
index 036b46dcf79..5d376ae6add 100644
--- a/clang/tools/libclang/CIndex.cpp
+++ b/clang/tools/libclang/CIndex.cpp
@@ -1911,6 +1911,9 @@ void EnqueueVisitor::EnqueueChildren(const Stmt *S) {
namespace {
class OMPClauseEnqueue : public ConstOMPClauseVisitor<OMPClauseEnqueue> {
EnqueueVisitor *Visitor;
+ /// \brief Process clauses with list of variables.
+ template <typename T>
+ 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<Class>::varlist_const_iterator I = Node->varlist_begin(), \
- E = Node->varlist_end(); \
- I != E; ++I) \
+
+template<typename T>
+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/clang/tools/libclang/RecursiveASTVisitor.h b/clang/tools/libclang/RecursiveASTVisitor.h
index b8e66d481b4..fe936f922ef 100644
--- a/clang/tools/libclang/RecursiveASTVisitor.h
+++ b/clang/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 <typename T>
+ void VisitOMPClauseList(T *Node);
typedef SmallVector<Stmt *, 16> StmtsTy;
typedef SmallVector<StmtsTy *, 4> QueuesTy;
@@ -2326,26 +2329,27 @@ bool RecursiveASTVisitor<Derived>::VisitOMPDefaultClause(OMPDefaultClause *C) {
return true;
}
-#define PROCESS_OMP_CLAUSE_LIST(Class, Node) \
- for (OMPVarList<Class>::varlist_iterator I = Node->varlist_begin(), \
- E = Node->varlist_end(); \
- I != E; ++I) \
+template<typename Derived>
+template<typename T>
+void RecursiveASTVisitor<Derived>::VisitOMPClauseList(T *Node) {
+ for (typename T::varlist_iterator I = Node->varlist_begin(),
+ E = Node->varlist_end();
+ I != E; ++I)
TraverseStmt(*I);
+}
template<typename Derived>
bool RecursiveASTVisitor<Derived>::VisitOMPPrivateClause(OMPPrivateClause *C) {
- PROCESS_OMP_CLAUSE_LIST(OMPPrivateClause, C)
+ VisitOMPClauseList(C);
return true;
}
template<typename Derived>
bool RecursiveASTVisitor<Derived>::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
OpenPOWER on IntegriCloud