[PATCH] D10599: [OPENMP 4.0] Initial support for '#pragma omp declare simd' directive.

Bataev, Alexey a.bataev at hotmail.com
Wed Jul 8 20:41:35 PDT 2015


> Would it make sense to return Ptr here instead so that further
> diagnostics can be reported?
I think you're right. Will be fixed.

Best regards,
Alexey Bataev
=============
Software Engineer
Intel Compiler Team

08.07.2015 23:55, Aaron Ballman пишет:
> LGTM with one question below. I would wait for review from Richard or
> Hal before committing.
>
>> Index: lib/Parse/ParseOpenMP.cpp
>> ===================================================================
>> --- lib/Parse/ParseOpenMP.cpp
>> +++ lib/Parse/ParseOpenMP.cpp
>> @@ -30,6 +30,7 @@
>>     // E.g.: OMPD_for OMPD_simd ===> OMPD_for_simd
>>     // TODO: add other combined directives in topological order.
>>     const OpenMPDirectiveKind F[][3] = {
>> +      {OMPD_unknown /*declare*/, OMPD_simd, OMPD_declare_simd},
>>         {OMPD_unknown /*cancellation*/, OMPD_unknown /*point*/,
>>          OMPD_cancellation_point},
>>         {OMPD_for, OMPD_simd, OMPD_for_simd},
>> @@ -43,25 +44,25 @@
>>             : getOpenMPDirectiveKind(P.getPreprocessor().getSpelling(Tok));
>>     bool TokenMatched = false;
>>     for (unsigned i = 0; i < llvm::array_lengthof(F); ++i) {
>> -    if (!Tok.isAnnotation() && DKind == OMPD_unknown) {
>> +    if (!Tok.isAnnotation() && DKind == OMPD_unknown)
>>         TokenMatched =
>> -          (i == 0) &&
>> -          !P.getPreprocessor().getSpelling(Tok).compare("cancellation");
>> -    } else {
>> +          ((i == 0) &&
>> +           !P.getPreprocessor().getSpelling(Tok).compare("declare")) ||
>> +          ((i == 1) &&
>> +           !P.getPreprocessor().getSpelling(Tok).compare("cancellation"));
>> +    else
>>         TokenMatched = DKind == F[i][0] && DKind != OMPD_unknown;
>> -    }
>>       if (TokenMatched) {
>>         Tok = P.getPreprocessor().LookAhead(0);
>>         auto SDKind =
>>             Tok.isAnnotation()
>>                 ? OMPD_unknown
>>                 : getOpenMPDirectiveKind(P.getPreprocessor().getSpelling(Tok));
>> -      if (!Tok.isAnnotation() && DKind == OMPD_unknown) {
>> +      if (!Tok.isAnnotation() && SDKind == OMPD_unknown)
>>           TokenMatched =
>> -            (i == 0) && !P.getPreprocessor().getSpelling(Tok).compare("point");
>> -      } else {
>> +            (i == 1) && !P.getPreprocessor().getSpelling(Tok).compare("point");
>> +      else
>>           TokenMatched = SDKind == F[i][1] && SDKind != OMPD_unknown;
>> -      }
>>         if (TokenMatched) {
>>           P.ConsumeToken();
>>           DKind = F[i][2];
>> @@ -75,14 +76,25 @@
>>   ///
>>   ///       threadprivate-directive:
>>   ///         annot_pragma_openmp 'threadprivate' simple-variable-list
>> +///         annot_pragma_omp_end
>>   ///
>> -Parser::DeclGroupPtrTy Parser::ParseOpenMPDeclarativeDirective() {
>> +///       declare-simd-directive:
>> +///         annot_pragma_openmp 'declare simd' {<clause> [,]}
>> +///         annot_pragma_omp_end
>> +///         <function declaration/definition>
>> +///
>> +Parser::DeclGroupPtrTy
>> +Parser::ParseOpenMPDeclarativeDirectiveWithExtDecl(bool IsInTagDecl,
>> +                                                   unsigned Level) {
>>     assert(Tok.is(tok::annot_pragma_openmp) && "Not an OpenMP directive!");
>>     ParenBraceBracketBalancer BalancerRAIIObj(*this);
>>
>> +  auto AnnotationVal = reinterpret_cast<uintptr_t>(Tok.getAnnotationValue());
>>     SourceLocation Loc = ConsumeToken();
>>     SmallVector<Expr *, 5> Identifiers;
>> -  auto DKind = ParseOpenMPDirectiveKind(*this);
>> +  OpenMPDirectiveKind DKind =
>> +      (AnnotationVal == 0) ? ParseOpenMPDirectiveKind(*this)
>> +                           : static_cast<OpenMPDirectiveKind>(AnnotationVal);
>>
>>     switch (DKind) {
>>     case OMPD_threadprivate:
>> @@ -100,6 +112,86 @@
>>         return Actions.ActOnOpenMPThreadprivateDirective(Loc, Identifiers);
>>       }
>>       break;
>> +  case OMPD_declare_simd: {
>> +    // The syntax is:
>> +    // { #pragma omp declare simd }
>> +    // <function-declaration-or-definition>
>> +    //
>> +    if (AnnotationVal == 0)
>> +      // Skip 'simd' if it was restored from cached tokens.
>> +      ConsumeToken();
>> +    if (IsInTagDecl) {
>> +      LateParseOpenMPDeclarativeDirectiveWithTemplateFunction(
>> +          /*DKind=*/OMPD_declare_simd, Loc);
>> +      return DeclGroupPtrTy();
>> +    }
>> +
>> +    SmallVector<llvm::PointerIntPair<OMPClause *, 1, bool>, OMPC_unknown + 1>
>> +        FirstClauses(OMPC_unknown + 1);
>> +    SmallVector<OMPClause *, 4> Clauses;
>> +    SmallVector<Token, 8> CachedPragmas;
>> +
>> +    while (Tok.isNot(tok::annot_pragma_openmp_end) && Tok.isNot(tok::eof)) {
>> +      CachedPragmas.push_back(Tok);
>> +      ConsumeAnyToken();
>> +    }
>> +    CachedPragmas.push_back(Tok);
>> +    if (Tok.isNot(tok::eof))
>> +      ConsumeAnyToken();
>> +
>> +    DeclGroupPtrTy Ptr;
>> +    if (Tok.is(tok::annot_pragma_openmp)) {
>> +      Ptr = ParseOpenMPDeclarativeDirectiveWithExtDecl(IsInTagDecl, Level + 1);
>> +    } else {
>> +      // Here we expect to see some function declaration.
>> +      ParsedAttributesWithRange Attrs(AttrFactory);
>> +      MaybeParseCXX11Attributes(Attrs);
>> +      MaybeParseMicrosoftAttributes(Attrs);
>> +      ParsingDeclSpec PDS(*this);
>> +      Ptr = ParseExternalDeclaration(Attrs, &PDS);
>> +    }
>> +    if (!Ptr || Ptr.get().isNull())
>> +      return DeclGroupPtrTy();
>> +    if (Ptr.get().isDeclGroup()) {
>> +      Diag(Tok, diag::err_omp_single_decl_in_declare_simd);
>> +      return DeclGroupPtrTy();
> Would it make sense to return Ptr here instead so that further
> diagnostics can be reported?
>
> ~Aaron
>
> On Wed, Jul 8, 2015 at 12:35 AM, Alexey Bataev <a.bataev at hotmail.com> wrote:
>>
>> Update after review
>>
>>
>> http://reviews.llvm.org/D10599
>>
>> Files:
>>    include/clang/AST/ASTMutationListener.h
>>    include/clang/Basic/Attr.td
>>    include/clang/Basic/AttrDocs.td
>>    include/clang/Basic/DiagnosticParseKinds.td
>>    include/clang/Basic/DiagnosticSemaKinds.td
>>    include/clang/Basic/OpenMPKinds.def
>>    include/clang/Parse/Parser.h
>>    include/clang/Sema/Sema.h
>>    include/clang/Serialization/ASTWriter.h
>>    lib/AST/DeclPrinter.cpp
>>    lib/Basic/OpenMPKinds.cpp
>>    lib/Frontend/MultiplexConsumer.cpp
>>    lib/Parse/ParseDeclCXX.cpp
>>    lib/Parse/ParseOpenMP.cpp
>>    lib/Parse/Parser.cpp
>>    lib/Sema/SemaOpenMP.cpp
>>    lib/Serialization/ASTCommon.h
>>    lib/Serialization/ASTReaderDecl.cpp
>>    lib/Serialization/ASTWriter.cpp
>>    test/OpenMP/declare_simd_ast_print.c
>>    test/OpenMP/declare_simd_ast_print.cpp
>>    test/OpenMP/declare_simd_messages.cpp
>>





More information about the cfe-commits mailing list