diff options
author | Sunil Kuravinakop <koops@hpe.com> | 2022-05-24 23:55:08 -0500 |
---|---|---|
committer | Chi-Chun, Chen <chichunchen844@gmail.com> | 2022-05-24 23:56:42 -0500 |
commit | 232bf8189ef7d574a468bd5bfd1e84e962f7f16e (patch) | |
tree | 2f942cde25390f0db10eeb3819db11dfe292f235 /clang/lib/Parse/ParseOpenMP.cpp | |
parent | 66db5312bd6676cae721b3ad9f76b68af7909e7c (diff) | |
download | llvm-232bf8189ef7d574a468bd5bfd1e84e962f7f16e.zip llvm-232bf8189ef7d574a468bd5bfd1e84e962f7f16e.tar.gz llvm-232bf8189ef7d574a468bd5bfd1e84e962f7f16e.tar.bz2 |
[OpenMP] atomic compare fail : Parser & AST support
This is a support for " #pragma omp atomic compare fail ". It has Parser & AST support for now.
Reviewed By: tianshilei1992
Differential Revision: https://reviews.llvm.org/D123235
Diffstat (limited to 'clang/lib/Parse/ParseOpenMP.cpp')
-rw-r--r-- | clang/lib/Parse/ParseOpenMP.cpp | 46 |
1 files changed, 45 insertions, 1 deletions
diff --git a/clang/lib/Parse/ParseOpenMP.cpp b/clang/lib/Parse/ParseOpenMP.cpp index 48ee1b0..3d5c9c9 100644 --- a/clang/lib/Parse/ParseOpenMP.cpp +++ b/clang/lib/Parse/ParseOpenMP.cpp @@ -3234,6 +3234,7 @@ OMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind DKind, case OMPC_write: case OMPC_capture: case OMPC_compare: + case OMPC_fail: case OMPC_seq_cst: case OMPC_acq_rel: case OMPC_acquire: @@ -3620,6 +3621,45 @@ OMPClause *Parser::ParseOpenMPSimpleClause(OpenMPClauseKind Kind, Val.getValue().Loc, Val.getValue().RLoc); } +OMPClause *Parser::ParseOpenMPFailClause(OMPClause *Clause) { + + OMPFailClause *FailClause = static_cast<OMPFailClause *>(Clause); + SourceLocation LParenLoc; + if (Tok.is(tok::l_paren)) { + LParenLoc = Tok.getLocation(); + ConsumeAnyToken(); + } else { + Diag(diag::err_expected_lparen_after) << getOpenMPClauseName(OMPC_fail); + return Clause; + } + + + OpenMPClauseKind CKind = Tok.isAnnotation() + ? OMPC_unknown + : getOpenMPClauseKind(PP.getSpelling(Tok)); + if (CKind == OMPC_unknown) { + Diag(diag::err_omp_expected_clause) << ("atomic compare fail"); + return Clause; + } + OMPClause *MemoryOrderClause = ParseOpenMPClause(CKind, false); + SourceLocation MemOrderLoc; + // Store Memory Order SubClause for Sema. + if (MemoryOrderClause) { + MemOrderLoc = Tok.getLocation(); + } + + if (Tok.is(tok::r_paren)) { + FailClause->initFailClause(LParenLoc,MemoryOrderClause,MemOrderLoc); + ConsumeAnyToken(); + } else { + const IdentifierInfo *Arg = Tok.getIdentifierInfo(); + Diag(Tok, diag::err_expected_rparen_after) + << (Arg ? Arg->getName() : "atomic compare fail"); + } + + return Clause; +} + /// Parsing of OpenMP clauses like 'ordered'. /// /// ordered-clause: @@ -3652,7 +3692,11 @@ OMPClause *Parser::ParseOpenMPClause(OpenMPClauseKind Kind, bool ParseOnly) { if (ParseOnly) return nullptr; - return Actions.ActOnOpenMPClause(Kind, Loc, Tok.getLocation()); + OMPClause *Clause = Actions.ActOnOpenMPClause(Kind, Loc, Tok.getLocation()); + if (Kind == llvm::omp::Clause::OMPC_fail) { + Clause = ParseOpenMPFailClause(Clause); + } + return Clause; } /// Parsing of OpenMP clauses with single expressions and some additional |