r265287 - [OPENMP 4.0] Support for 'inbranch|noinbranch' clauses in 'declare
Alexey Bataev via cfe-commits
cfe-commits at lists.llvm.org
Mon Apr 4 03:12:16 PDT 2016
Author: abataev
Date: Mon Apr 4 05:12:15 2016
New Revision: 265287
URL: http://llvm.org/viewvc/llvm-project?rev=265287&view=rev
Log:
[OPENMP 4.0] Support for 'inbranch|noinbranch' clauses in 'declare
simd'.
Added parsing/semantic analysis for 'inbranch|notinbranch' clauses of
'#pragma omp declare simd' construct.
Modified:
cfe/trunk/include/clang/Basic/Attr.td
cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td
cfe/trunk/include/clang/Sema/Sema.h
cfe/trunk/lib/Parse/ParseOpenMP.cpp
cfe/trunk/lib/Sema/SemaOpenMP.cpp
cfe/trunk/test/OpenMP/declare_simd_ast_print.c
cfe/trunk/test/OpenMP/declare_simd_ast_print.cpp
cfe/trunk/test/OpenMP/declare_simd_messages.cpp
cfe/trunk/test/OpenMP/dump.cpp
Modified: cfe/trunk/include/clang/Basic/Attr.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Attr.td?rev=265287&r1=265286&r2=265287&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/Attr.td (original)
+++ cfe/trunk/include/clang/Basic/Attr.td Mon Apr 4 05:12:15 2016
@@ -2265,8 +2265,14 @@ def OMPDeclareSimdDecl : Attr {
let SemaHandler = 0;
let HasCustomParsing = 1;
let Documentation = [OMPDeclareSimdDocs];
+ let Args = [EnumArgument<"BranchState", "BranchStateTy",
+ ["", "inbranch", "notinbranch"],
+ ["BS_Undefined", "BS_Inbranch", "BS_Notinbranch"]>];
let AdditionalMembers = [{
- void printPrettyPragma(raw_ostream &OS, const PrintingPolicy &Policy) const {}
+ void printPrettyPragma(raw_ostream & OS, const PrintingPolicy &Policy)
+ const {
+ OS << ' ' << ConvertBranchStateTyToStr(getBranchState());
+ }
}];
}
Modified: cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td?rev=265287&r1=265286&r2=265287&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td Mon Apr 4 05:12:15 2016
@@ -961,6 +961,8 @@ def err_omp_unknown_map_type_modifier :
"incorrect map type modifier, expected 'always'">;
def err_omp_map_type_missing : Error<
"missing map type">;
+def err_omp_declare_simd_inbranch_notinbranch : Error<
+ "unexpected '%0' clause, '%1' is specified already">;
// Pragma loop support.
def err_pragma_loop_missing_argument : Error<
Modified: cfe/trunk/include/clang/Sema/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=265287&r1=265286&r2=265287&view=diff
==============================================================================
--- cfe/trunk/include/clang/Sema/Sema.h (original)
+++ cfe/trunk/include/clang/Sema/Sema.h Mon Apr 4 05:12:15 2016
@@ -8091,8 +8091,10 @@ public:
/// \brief Called on well-formed '\#pragma omp declare simd' after parsing of
/// the associated method/function.
- DeclGroupPtrTy ActOnOpenMPDeclareSimdDirective(DeclGroupPtrTy DG,
- SourceLocation StartLoc);
+ DeclGroupPtrTy
+ ActOnOpenMPDeclareSimdDirective(DeclGroupPtrTy DG,
+ OMPDeclareSimdDeclAttr::BranchStateTy BS,
+ SourceRange SR);
OMPClause *ActOnOpenMPSingleExprClause(OpenMPClauseKind Kind,
Expr *Expr,
Modified: cfe/trunk/lib/Parse/ParseOpenMP.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseOpenMP.cpp?rev=265287&r1=265286&r2=265287&view=diff
==============================================================================
--- cfe/trunk/lib/Parse/ParseOpenMP.cpp (original)
+++ cfe/trunk/lib/Parse/ParseOpenMP.cpp Mon Apr 4 05:12:15 2016
@@ -323,6 +323,37 @@ Parser::ParseOpenMPDeclareReductionDirec
IsCorrect);
}
+/// Parses clauses for 'declare simd' directive.
+/// clause:
+/// 'inbranch' | 'notinbranch'
+static void parseDeclareSimdClauses(Parser &P,
+ OMPDeclareSimdDeclAttr::BranchStateTy &BS) {
+ SourceRange BSRange;
+ const Token &Tok = P.getCurToken();
+ while (Tok.isNot(tok::annot_pragma_openmp_end)) {
+ if (Tok.isNot(tok::identifier))
+ break;
+ OMPDeclareSimdDeclAttr::BranchStateTy Out;
+ StringRef TokName = Tok.getIdentifierInfo()->getName();
+ // Parse 'inranch|notinbranch' clauses.
+ if (OMPDeclareSimdDeclAttr::ConvertStrToBranchStateTy(TokName, Out)) {
+ if (BS != OMPDeclareSimdDeclAttr::BS_Undefined && BS != Out) {
+ P.Diag(Tok, diag::err_omp_declare_simd_inbranch_notinbranch)
+ << TokName << OMPDeclareSimdDeclAttr::ConvertBranchStateTyToStr(BS)
+ << BSRange;
+ }
+ BS = Out;
+ BSRange = SourceRange(Tok.getLocation(), Tok.getEndLoc());
+ } else
+ // TODO: add parsing of other clauses.
+ break;
+ P.ConsumeToken();
+ // Skip ',' if any.
+ if (Tok.is(tok::comma))
+ P.ConsumeToken();
+ }
+}
+
/// \brief Parsing of declarative OpenMP directives.
///
/// threadprivate-directive:
@@ -387,8 +418,11 @@ Parser::DeclGroupPtrTy Parser::ParseOpen
//
ConsumeToken();
- // The last seen token is annot_pragma_openmp_end - need to check for
- // extra tokens.
+ OMPDeclareSimdDeclAttr::BranchStateTy BS =
+ OMPDeclareSimdDeclAttr::BS_Undefined;
+ parseDeclareSimdClauses(*this, BS);
+
+ // Need to check for extra tokens.
if (Tok.isNot(tok::annot_pragma_openmp_end)) {
Diag(Tok, diag::warn_omp_extra_tokens_at_eol)
<< getOpenMPDirectiveName(OMPD_declare_simd);
@@ -396,12 +430,12 @@ Parser::DeclGroupPtrTy Parser::ParseOpen
ConsumeAnyToken();
}
// Skip the last annot_pragma_openmp_end.
- ConsumeToken();
+ SourceLocation EndLoc = ConsumeToken();
DeclGroupPtrTy Ptr;
- if (Tok.is(tok::annot_pragma_openmp)) {
+ if (Tok.is(tok::annot_pragma_openmp))
Ptr = ParseOpenMPDeclarativeDirectiveWithExtDecl(AS, Attrs, TagType, Tag);
- } else if (Tok.isNot(tok::r_brace) && !isEofOrEom()) {
+ else if (Tok.isNot(tok::r_brace) && !isEofOrEom()) {
// Here we expect to see some function declaration.
if (AS == AS_none) {
assert(TagType == DeclSpec::TST_unspecified);
@@ -419,7 +453,8 @@ Parser::DeclGroupPtrTy Parser::ParseOpen
return DeclGroupPtrTy();
}
- return Actions.ActOnOpenMPDeclareSimdDirective(Ptr, Loc);
+ return Actions.ActOnOpenMPDeclareSimdDirective(Ptr, BS,
+ SourceRange(Loc, EndLoc));
}
case OMPD_unknown:
Diag(Tok, diag::err_omp_unknown_directive);
Modified: cfe/trunk/lib/Sema/SemaOpenMP.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOpenMP.cpp?rev=265287&r1=265286&r2=265287&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaOpenMP.cpp (original)
+++ cfe/trunk/lib/Sema/SemaOpenMP.cpp Mon Apr 4 05:12:15 2016
@@ -3183,12 +3183,13 @@ StmtResult Sema::ActOnOpenMPExecutableDi
Sema::DeclGroupPtrTy
Sema::ActOnOpenMPDeclareSimdDirective(DeclGroupPtrTy DG,
- SourceLocation StartLoc) {
+ OMPDeclareSimdDeclAttr::BranchStateTy BS,
+ SourceRange SR) {
if (!DG || DG.get().isNull())
return DeclGroupPtrTy();
if (!DG.get().isSingleDecl()) {
- Diag(StartLoc, diag::err_omp_single_decl_in_declare_simd);
+ Diag(SR.getBegin(), diag::err_omp_single_decl_in_declare_simd);
return DG;
}
auto *ADecl = DG.get().getSingleDecl();
@@ -3201,8 +3202,7 @@ Sema::ActOnOpenMPDeclareSimdDirective(De
return DeclGroupPtrTy();
}
- auto *NewAttr = OMPDeclareSimdDeclAttr::CreateImplicit(
- Context, SourceRange(StartLoc, StartLoc));
+ auto *NewAttr = OMPDeclareSimdDeclAttr::CreateImplicit(Context, BS, SR);
ADecl->addAttr(NewAttr);
return ConvertDeclToDeclGroup(ADecl);
}
Modified: cfe/trunk/test/OpenMP/declare_simd_ast_print.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/declare_simd_ast_print.c?rev=265287&r1=265286&r2=265287&view=diff
==============================================================================
--- cfe/trunk/test/OpenMP/declare_simd_ast_print.c (original)
+++ cfe/trunk/test/OpenMP/declare_simd_ast_print.c Mon Apr 4 05:12:15 2016
@@ -8,9 +8,13 @@
#pragma omp declare simd
#pragma omp declare simd
+#pragma omp declare simd inbranch
+#pragma omp declare simd notinbranch
void add_1(float *d, float *s1, float *s2) __attribute__((cold));
-// CHECK: #pragma omp declare simd
+// CHECK: #pragma omp declare simd notinbranch
+// CHECK-NEXT: #pragma omp declare simd inbranch
+// CHECK-NEXT: #pragma omp declare simd
// CHECK-NEXT: #pragma omp declare simd
// CHECK-NEXT: void add_1(float *d, float *s1, float *s2) __attribute__((cold))
Modified: cfe/trunk/test/OpenMP/declare_simd_ast_print.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/declare_simd_ast_print.cpp?rev=265287&r1=265286&r2=265287&view=diff
==============================================================================
--- cfe/trunk/test/OpenMP/declare_simd_ast_print.cpp (original)
+++ cfe/trunk/test/OpenMP/declare_simd_ast_print.cpp Mon Apr 4 05:12:15 2016
@@ -7,9 +7,13 @@
#define HEADER
#pragma omp declare simd
+#pragma omp declare simd inbranch
+#pragma omp declare simd notinbranch
void add_1(float *d) __attribute__((cold));
-// CHECK: #pragma omp declare simd
+// CHECK: #pragma omp declare simd notinbranch
+// CHECK-NEXT: #pragma omp declare simd inbranch
+// CHECK-NEXT: #pragma omp declare simd
// CHECK-NEXT: void add_1(float *d) __attribute__((cold));
//
Modified: cfe/trunk/test/OpenMP/declare_simd_messages.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/declare_simd_messages.cpp?rev=265287&r1=265286&r2=265287&view=diff
==============================================================================
--- cfe/trunk/test/OpenMP/declare_simd_messages.cpp (original)
+++ cfe/trunk/test/OpenMP/declare_simd_messages.cpp Mon Apr 4 05:12:15 2016
@@ -46,6 +46,12 @@ void h(int *hp, int *hp2, int *hq, int *
h((float *)hp, (float *)hp2, (float *)hq, (float *)lin);
}
+#pragma omp declare simd inbranch inbranch
+#pragma omp declare simd notinbranch notinbranch
+#pragma omp declare simd inbranch inbranch notinbranch // expected-error {{unexpected 'notinbranch' clause, 'inbranch' is specified already}}
+#pragma omp declare simd notinbranch notinbranch inbranch // expected-error {{unexpected 'inbranch' clause, 'notinbranch' is specified already}}
+void foo();
+
template <class T>
struct St {
// expected-error at +2 {{function declaration is expected after 'declare simd' directive}}
Modified: cfe/trunk/test/OpenMP/dump.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/dump.cpp?rev=265287&r1=265286&r2=265287&view=diff
==============================================================================
--- cfe/trunk/test/OpenMP/dump.cpp (original)
+++ cfe/trunk/test/OpenMP/dump.cpp Mon Apr 4 05:12:15 2016
@@ -59,10 +59,10 @@ struct S {
// CHECK-NEXT: | | | | `-DeclRefExpr {{.+}} <<invalid sloc>> 'int' lvalue OMPCapturedExpr {{.+}} 'a' 'int &'
#pragma omp declare simd
-#pragma omp declare simd
+#pragma omp declare simd inbranch
void foo();
// CHECK: `-FunctionDecl {{.+}} <line:63:1, col:10> col:6 foo 'void (void)'
-// CHECK-NEXT: |-OMPDeclareSimdDeclAttr {{.+}} <line:62:9> Implicit
-// CHECK-NEXT: `-OMPDeclareSimdDeclAttr {{.+}} <line:61:9> Implicit
+// CHECK-NEXT: |-OMPDeclareSimdDeclAttr {{.+}} <line:62:9, col:34> Implicit BS_Inbranch
+// CHECK-NEXT: `-OMPDeclareSimdDeclAttr {{.+}} <line:61:9, col:25> Implicit BS_Undefined
More information about the cfe-commits
mailing list