Author: amusman Date: Thu Mar 27 10:14:18 2014 New Revision: 204933 URL: http://llvm.org/viewvc/llvm-project?rev=204933&view=rev Log: [OPENMP] OMPExecutableDirective re-factoring
Store the number of clauses and children of OMPExecutableDirective and dynamically compute the locations of corresponding arrays. http://llvm-reviews.chandlerc.com/D2977 Modified: cfe/trunk/include/clang/AST/StmtOpenMP.h cfe/trunk/lib/AST/Stmt.cpp Modified: cfe/trunk/include/clang/AST/StmtOpenMP.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/StmtOpenMP.h?rev=204933&r1=204932&r2=204933&view=diff ============================================================================== --- cfe/trunk/include/clang/AST/StmtOpenMP.h (original) +++ cfe/trunk/include/clang/AST/StmtOpenMP.h Thu Mar 27 10:14:18 2014 @@ -38,10 +38,22 @@ class OMPExecutableDirective : public St SourceLocation StartLoc; /// \brief Ending location of the directive. SourceLocation EndLoc; - /// \brief Pointer to the list of clauses. - llvm::MutableArrayRef<OMPClause *> Clauses; - /// \brief Associated statement (if any) and expressions. - llvm::MutableArrayRef<Stmt *> StmtAndExpressions; + /// \brief Numbers of clauses. + const unsigned NumClauses; + /// \brief Number of child expressions/stmts. + const unsigned NumChildren; + /// \brief Offset from this to the start of clauses. + /// There are NumClauses pointers to clauses, they are followed by + /// NumChildren pointers to child stmts/exprs (if the directive type + /// requires an associated stmt, then it has to be the first of them). + const unsigned ClausesOffset; + + /// \brief Get the clauses storage. + llvm::MutableArrayRef<OMPClause *> getClauses() { + OMPClause **ClauseStorage = reinterpret_cast<OMPClause **>( + reinterpret_cast<char *>(this) + ClausesOffset); + return llvm::MutableArrayRef<OMPClause *>(ClauseStorage, NumClauses); + } protected: /// \brief Build instance of directive of class \a K. @@ -54,15 +66,11 @@ protected: template <typename T> OMPExecutableDirective(const T *, StmtClass SC, OpenMPDirectiveKind K, SourceLocation StartLoc, SourceLocation EndLoc, - unsigned NumClauses, unsigned NumberOfExpressions) + unsigned NumClauses, unsigned NumChildren) : Stmt(SC), Kind(K), StartLoc(StartLoc), EndLoc(EndLoc), - Clauses(reinterpret_cast<OMPClause **>( - reinterpret_cast<char *>(this) + - llvm::RoundUpToAlignment(sizeof(T), - llvm::alignOf<OMPClause *>())), - NumClauses), - StmtAndExpressions(reinterpret_cast<Stmt **>(Clauses.end()), - NumberOfExpressions) {} + NumClauses(NumClauses), NumChildren(NumChildren), + ClausesOffset(llvm::RoundUpToAlignment(sizeof(T), + llvm::alignOf<OMPClause *>())) {} /// \brief Sets the list of variables for this clause. /// @@ -74,7 +82,7 @@ protected: /// /// /param S Associated statement. /// - void setAssociatedStmt(Stmt *S) { StmtAndExpressions[0] = S; } + void setAssociatedStmt(Stmt *S) { *child_begin() = S; } public: /// \brief Returns starting location of directive kind. @@ -94,19 +102,16 @@ public: void setLocEnd(SourceLocation Loc) { EndLoc = Loc; } /// \brief Get number of clauses. - unsigned getNumClauses() const { return Clauses.size(); } + unsigned getNumClauses() const { return NumClauses; } /// \brief Returns specified clause. /// /// \param i Number of clause. /// - OMPClause *getClause(unsigned i) const { - assert(i < Clauses.size() && "index out of bound!"); - return Clauses[i]; - } + OMPClause *getClause(unsigned i) const { return clauses()[i]; } /// \brief Returns statement associated with the directive. - Stmt *getAssociatedStmt() const { return StmtAndExpressions[0]; } + Stmt *getAssociatedStmt() const { return const_cast<Stmt *>(*child_begin()); } OpenMPDirectiveKind getDirectiveKind() const { return Kind; } @@ -116,12 +121,15 @@ public: } child_range children() { - return child_range(StmtAndExpressions.begin(), StmtAndExpressions.end()); + Stmt **ChildStorage = reinterpret_cast<Stmt **>(getClauses().end()); + return child_range(ChildStorage, ChildStorage + NumChildren); } - ArrayRef<OMPClause *> clauses() { return Clauses; } + ArrayRef<OMPClause *> clauses() { return getClauses(); } - ArrayRef<OMPClause *> clauses() const { return Clauses; } + ArrayRef<OMPClause *> clauses() const { + return const_cast<OMPExecutableDirective *>(this)->getClauses(); + } }; /// \brief This represents '#pragma omp parallel' directive. Modified: cfe/trunk/lib/AST/Stmt.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Stmt.cpp?rev=204933&r1=204932&r2=204933&view=diff ============================================================================== --- cfe/trunk/lib/AST/Stmt.cpp (original) +++ cfe/trunk/lib/AST/Stmt.cpp Thu Mar 27 10:14:18 2014 @@ -1193,9 +1193,9 @@ OMPSharedClause *OMPSharedClause::Create } void OMPExecutableDirective::setClauses(ArrayRef<OMPClause *> Clauses) { - assert(Clauses.size() == this->Clauses.size() && + assert(Clauses.size() == getNumClauses() && "Number of clauses is not the same as the preallocated buffer"); - std::copy(Clauses.begin(), Clauses.end(), this->Clauses.begin()); + std::copy(Clauses.begin(), Clauses.end(), getClauses().begin()); } OMPParallelDirective *OMPParallelDirective::Create( _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
