[clang] [llvm] [OpenMP] OpenMP 5.1 "assume" directive parsing support (PR #92731)
Julian Brown via cfe-commits
cfe-commits at lists.llvm.org
Thu Aug 1 12:04:06 PDT 2024
================
@@ -2013,6 +2064,184 @@ class OMPMergeableClause : public OMPClause {
}
};
+/// This represents the 'absent' clause in the '#pragma omp assume'
+/// directive.
+///
+/// \code
+/// #pragma omp assume absent(<directive-name list>)
+/// \endcode
+/// In this example directive '#pragma omp assume' has an 'absent' clause.
+class OMPAbsentClause final
+ : public OMPDirectiveListClause<OMPAbsentClause>,
+ private llvm::TrailingObjects<OMPAbsentClause, OpenMPDirectiveKind> {
+ friend OMPDirectiveListClause;
+ friend TrailingObjects;
+
+public:
+ /// Build 'absent' clause.
+ ///
+ /// \param StartLoc Starting location of the clause.
+ /// \param LParenLoc Location of '('.
+ /// \param EndLoc Ending location of the clause.
+ /// \param NumKinds Number of directive kinds listed in the clause.
+ OMPAbsentClause(SourceLocation StartLoc, SourceLocation LParenLoc,
+ SourceLocation EndLoc, unsigned NumKinds)
+ : OMPDirectiveListClause<OMPAbsentClause>(
+ llvm::omp::OMPC_absent, StartLoc, LParenLoc, EndLoc, NumKinds) {}
+
+ /// Build an empty clause.
+ OMPAbsentClause(unsigned NumKinds)
+ : OMPDirectiveListClause<OMPAbsentClause>(
+ llvm::omp::OMPC_absent, SourceLocation(), SourceLocation(),
+ SourceLocation(), NumKinds) {}
+
+ static OMPAbsentClause *Create(const ASTContext &C,
+ ArrayRef<OpenMPDirectiveKind> DKVec,
+ SourceLocation Loc, SourceLocation LLoc,
+ SourceLocation RLoc);
+
+ static OMPAbsentClause *CreateEmpty(const ASTContext &C, unsigned NumKinds);
+
+ static bool classof(const OMPClause *C) {
+ return C->getClauseKind() == llvm::omp::OMPC_absent;
+ }
+};
+
+/// This represents the 'contains' clause in the '#pragma omp assume'
+/// directive.
+///
+/// \code
+/// #pragma omp assume contains(<directive-name list>)
+/// \endcode
+/// In this example directive '#pragma omp assume' has a 'contains' clause.
+class OMPContainsClause final
+ : public OMPDirectiveListClause<OMPContainsClause>,
+ private llvm::TrailingObjects<OMPContainsClause, OpenMPDirectiveKind> {
+ friend OMPDirectiveListClause;
+ friend TrailingObjects;
+
+public:
+ /// Build 'contains' clause.
+ ///
+ /// \param StartLoc Starting location of the clause.
+ /// \param LParenLoc Location of '('.
+ /// \param EndLoc Ending location of the clause.
+ /// \param NumKinds Number of directive kinds listed in the clause.
+ OMPContainsClause(SourceLocation StartLoc, SourceLocation LParenLoc,
+ SourceLocation EndLoc, unsigned NumKinds)
+ : OMPDirectiveListClause<OMPContainsClause>(
+ llvm::omp::OMPC_contains, StartLoc, LParenLoc, EndLoc, NumKinds) {}
+
+ /// Build an empty clause.
+ OMPContainsClause(unsigned NumKinds)
+ : OMPDirectiveListClause<OMPContainsClause>(
+ llvm::omp::OMPC_contains, SourceLocation(), SourceLocation(),
+ SourceLocation(), NumKinds) {}
+
+ static OMPContainsClause *Create(const ASTContext &C,
+ ArrayRef<OpenMPDirectiveKind> DKVec,
+ SourceLocation Loc, SourceLocation LLoc,
+ SourceLocation RLoc);
+
+ static OMPContainsClause *CreateEmpty(const ASTContext &C, unsigned NumKinds);
+
+ static bool classof(const OMPClause *C) {
+ return C->getClauseKind() == llvm::omp::OMPC_contains;
+ }
+};
+
+/// This represents the 'holds' clause in the '#pragma omp assume'
+/// directive.
+///
+/// \code
+/// #pragma omp assume holds(<expr>)
+/// \endcode
+/// In this example directive '#pragma omp assume' has a 'holds' clause.
+class OMPHoldsClause final
+ : public OMPOneStmtClause<llvm::omp::OMPC_holds, OMPClause> {
+ friend class OMPClauseReader;
+
+public:
+ /// Build 'holds' clause.
+ ///
+ /// \param StartLoc Starting location of the clause.
+ /// \param EndLoc Ending location of the clause.
+ OMPHoldsClause(Expr *E, SourceLocation StartLoc, SourceLocation LParenLoc,
+ SourceLocation EndLoc)
+ : OMPOneStmtClause(E, StartLoc, LParenLoc, EndLoc) {}
+
+ /// Build an empty clause.
+ OMPHoldsClause() : OMPOneStmtClause() {}
+
+ Expr *getExpr() const { return getStmtAs<Expr>(); }
+ void setExpr(Expr *E) { setStmt(E); }
+};
+
+/// This represents the 'no_openmp' clause in the '#pragma omp assume'
+/// directive.
+///
+/// \code
+/// #pragma omp assume no_openmp
+/// \endcode
+/// In this example directive '#pragma omp assume' has a 'no_openmp' clause.
+class OMPNoOpenMPClause final
+ : public OMPNoChildClause<llvm::omp::OMPC_no_openmp> {
+public:
+ /// Build 'no_openmp' clause.
+ ///
+ /// \param StartLoc Starting location of the clause.
+ /// \param EndLoc Ending location of the clause.
+ OMPNoOpenMPClause(SourceLocation StartLoc, SourceLocation EndLoc)
+ : OMPNoChildClause(StartLoc, EndLoc) {}
+
+ /// Build an empty clause.
+ OMPNoOpenMPClause() : OMPNoChildClause() {}
+};
+
+/// This represents the 'no_openmp_routines' clause in the '#pragma omp assume'
+/// directive.
+///
+/// \code
+/// #pragma omp assume no_openmp_routines
+/// \endcode
+/// In this example directive '#pragma omp assume' has a 'no_openmp_routines'
+/// clause.
+class OMPNoOpenMPRoutinesClause final
----------------
jtb20 wrote:
I understand splitting patches into logical units, but that seems a bit unnecessary. What's the motivation? The mid-way point (half the clauses supported, say) isn't a useful state.
https://github.com/llvm/llvm-project/pull/92731
More information about the cfe-commits
mailing list