forked from OSchip/llvm-project
[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 llvm-svn: 204933
This commit is contained in:
parent
64cf5a4eb2
commit
fd2b75948d
|
@ -38,10 +38,22 @@ class OMPExecutableDirective : public Stmt {
|
|||
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.
|
||||
|
|
|
@ -1193,9 +1193,9 @@ OMPSharedClause *OMPSharedClause::CreateEmpty(const ASTContext &C,
|
|||
}
|
||||
|
||||
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(
|
||||
|
|
Loading…
Reference in New Issue