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