diff --git a/clang/include/clang/AST/Attr.h b/clang/include/clang/AST/Attr.h --- a/clang/include/clang/AST/Attr.h +++ b/clang/include/clang/AST/Attr.h @@ -16,10 +16,10 @@ #include "clang/AST/ASTFwd.h" #include "clang/AST/AttrIterator.h" #include "clang/AST/Decl.h" -#include "clang/AST/OpenMPClause.h" #include "clang/AST/Type.h" #include "clang/Basic/AttrKinds.h" #include "clang/Basic/AttributeCommonInfo.h" +#include "clang/Basic/LangOptions.h" #include "clang/Basic/LLVM.h" #include "clang/Basic/OpenMPKinds.h" #include "clang/Basic/Sanitizers.h" @@ -40,6 +40,7 @@ class QualType; class FunctionDecl; class TypeSourceInfo; +class OMPTraitInfo; /// Attr - This represents one attribute. class Attr : public AttributeCommonInfo { diff --git a/clang/include/clang/AST/OpenMPClause.h b/clang/include/clang/AST/OpenMPClause.h --- a/clang/include/clang/AST/OpenMPClause.h +++ b/clang/include/clang/AST/OpenMPClause.h @@ -5194,19 +5194,14 @@ return getUniqueDeclarationsNum() + getTotalComponentListNum(); } -public: - /// Number of allowed map-type-modifiers. - static constexpr unsigned NumberOfModifiers = - OMPC_MAP_MODIFIER_last - OMPC_MAP_MODIFIER_unknown - 1; - private: /// Map-type-modifiers for the 'map' clause. - OpenMPMapModifierKind MapTypeModifiers[NumberOfModifiers] = { + OpenMPMapModifierKind MapTypeModifiers[NumberOfOMPMapClauseModifiers] = { OMPC_MAP_MODIFIER_unknown, OMPC_MAP_MODIFIER_unknown, OMPC_MAP_MODIFIER_unknown}; /// Location of map-type-modifiers for the 'map' clause. - SourceLocation MapTypeModifiersLoc[NumberOfModifiers]; + SourceLocation MapTypeModifiersLoc[NumberOfOMPMapClauseModifiers]; /// Map type for the 'map' clause. OpenMPMapClauseKind MapType = OMPC_MAP_unknown; @@ -5275,7 +5270,7 @@ /// \param I index for map-type-modifier. /// \param T map-type-modifier for the clause. void setMapTypeModifier(unsigned I, OpenMPMapModifierKind T) { - assert(I < NumberOfModifiers && + assert(I < NumberOfOMPMapClauseModifiers && "Unexpected index to store map type modifier, exceeds array size."); MapTypeModifiers[I] = T; } @@ -5285,7 +5280,7 @@ /// \param I index for map-type-modifier location. /// \param TLoc map-type-modifier location. void setMapTypeModifierLoc(unsigned I, SourceLocation TLoc) { - assert(I < NumberOfModifiers && + assert(I < NumberOfOMPMapClauseModifiers && "Index to store map type modifier location exceeds array size."); MapTypeModifiersLoc[I] = TLoc; } @@ -5360,7 +5355,7 @@ /// /// \param Cnt index for map-type-modifier. OpenMPMapModifierKind getMapTypeModifier(unsigned Cnt) const LLVM_READONLY { - assert(Cnt < NumberOfModifiers && + assert(Cnt < NumberOfOMPMapClauseModifiers && "Requested modifier exceeds the total number of modifiers."); return MapTypeModifiers[Cnt]; } @@ -5370,7 +5365,7 @@ /// /// \param Cnt index for map-type-modifier location. SourceLocation getMapTypeModifierLoc(unsigned Cnt) const LLVM_READONLY { - assert(Cnt < NumberOfModifiers && + assert(Cnt < NumberOfOMPMapClauseModifiers && "Requested modifier location exceeds total number of modifiers."); return MapTypeModifiersLoc[Cnt]; } @@ -6879,6 +6874,19 @@ #include "clang/Basic/OpenMPKinds.def" }; +struct OMPTraitProperty { + llvm::omp::TraitProperty Kind = llvm::omp::TraitProperty::invalid; +}; +struct OMPTraitSelector { + Expr *ScoreOrCondition = nullptr; + llvm::omp::TraitSelector Kind = llvm::omp::TraitSelector::invalid; + llvm::SmallVector Properties; +}; +struct OMPTraitSet { + llvm::omp::TraitSet Kind = llvm::omp::TraitSet::invalid; + llvm::SmallVector Selectors; +}; + /// Helper data structure representing the traits in a match clause of an /// `declare variant` or `metadirective`. The outer level is an ordered /// collection of selector sets, each with an associated kind and an ordered @@ -6890,27 +6898,14 @@ friend class ASTContext; public: - struct OMPTraitProperty { - llvm::omp::TraitProperty Kind = llvm::omp::TraitProperty::invalid; - }; - struct OMPTraitSelector { - Expr *ScoreOrCondition = nullptr; - llvm::omp::TraitSelector Kind = llvm::omp::TraitSelector::invalid; - llvm::SmallVector Properties; - }; - struct OMPTraitSet { - llvm::omp::TraitSet Kind = llvm::omp::TraitSet::invalid; - llvm::SmallVector Selectors; - }; - /// The outermost level of selector sets. llvm::SmallVector Sets; bool anyScoreOrCondition( const llvm::function_ref &Cond) { - return llvm::any_of(Sets, [&Cond](OMPTraitInfo::OMPTraitSet &Set) { + return llvm::any_of(Sets, [&Cond](OMPTraitSet &Set) { return llvm::any_of( - Set.Selectors, [&Cond](OMPTraitInfo::OMPTraitSelector &Selector) { + Set.Selectors, [&Cond](OMPTraitSelector &Selector) { return Cond(Selector.ScoreOrCondition, /* IsScore */ Selector.Kind != llvm::omp::TraitSelector::user_condition); diff --git a/clang/include/clang/Basic/OpenMPKinds.h b/clang/include/clang/Basic/OpenMPKinds.h --- a/clang/include/clang/Basic/OpenMPKinds.h +++ b/clang/include/clang/Basic/OpenMPKinds.h @@ -84,6 +84,10 @@ OMPC_MAP_MODIFIER_last }; + /// Number of allowed map-type-modifiers. +static constexpr unsigned NumberOfOMPMapClauseModifiers = + OMPC_MAP_MODIFIER_last - OMPC_MAP_MODIFIER_unknown - 1; + /// OpenMP modifier kind for 'to' clause. enum OpenMPToModifierKind { #define OPENMP_TO_MODIFIER_KIND(Name) \ diff --git a/clang/include/clang/Parse/Parser.h b/clang/include/clang/Parse/Parser.h --- a/clang/include/clang/Parse/Parser.h +++ b/clang/include/clang/Parse/Parser.h @@ -13,7 +13,6 @@ #ifndef LLVM_CLANG_PARSE_PARSER_H #define LLVM_CLANG_PARSE_PARSER_H -#include "clang/AST/OpenMPClause.h" #include "clang/AST/Availability.h" #include "clang/Basic/BitmaskEnum.h" #include "clang/Basic/OpenMPKinds.h" @@ -24,6 +23,7 @@ #include "clang/Sema/DeclSpec.h" #include "clang/Sema/Sema.h" #include "llvm/ADT/SmallVector.h" +#include "llvm/Frontend/OpenMP/OMPContext.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/PrettyStackTrace.h" #include "llvm/Support/SaveAndRestore.h" @@ -49,6 +49,10 @@ class OMPClause; class ObjCTypeParamList; class ObjCTypeParameter; + struct OMPTraitProperty; + struct OMPTraitSelector; + struct OMPTraitSet; + class OMPTraitInfo; /// Parser - This implements a parser for the C family of languages. After /// parsing units of the grammar, productions are invoked to handle whatever has @@ -2928,32 +2932,32 @@ /// Parse a property kind into \p TIProperty for the selector set \p Set and /// selector \p Selector. - void parseOMPTraitPropertyKind(OMPTraitInfo::OMPTraitProperty &TIProperty, + void parseOMPTraitPropertyKind(OMPTraitProperty &TIProperty, llvm::omp::TraitSet Set, llvm::omp::TraitSelector Selector, llvm::StringMap &Seen); /// Parse a selector kind into \p TISelector for the selector set \p Set. - void parseOMPTraitSelectorKind(OMPTraitInfo::OMPTraitSelector &TISelector, + void parseOMPTraitSelectorKind(OMPTraitSelector &TISelector, llvm::omp::TraitSet Set, llvm::StringMap &Seen); /// Parse a selector set kind into \p TISet. - void parseOMPTraitSetKind(OMPTraitInfo::OMPTraitSet &TISet, + void parseOMPTraitSetKind(OMPTraitSet &TISet, llvm::StringMap &Seen); /// Parses an OpenMP context property. - void parseOMPContextProperty(OMPTraitInfo::OMPTraitSelector &TISelector, + void parseOMPContextProperty(OMPTraitSelector &TISelector, llvm::omp::TraitSet Set, llvm::StringMap &Seen); /// Parses an OpenMP context selector. - void parseOMPContextSelector(OMPTraitInfo::OMPTraitSelector &TISelector, + void parseOMPContextSelector(OMPTraitSelector &TISelector, llvm::omp::TraitSet Set, llvm::StringMap &SeenSelectors); /// Parses an OpenMP context selector set. - void parseOMPContextSelectorSet(OMPTraitInfo::OMPTraitSet &TISet, + void parseOMPContextSelectorSet(OMPTraitSet &TISet, llvm::StringMap &SeenSets); /// Parses OpenMP context selectors. @@ -3067,9 +3071,9 @@ DeclarationNameInfo ReductionOrMapperId; int ExtraModifier = -1; ///< Additional modifier for linear, map, depend or ///< lastprivate clause. - SmallVector + SmallVector MapTypeModifiers; - SmallVector + SmallVector MapTypeModifiersLoc; bool IsMapTypeImplicit = false; SourceLocation DepLinMapLastLoc; diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -57,6 +57,7 @@ #include "llvm/ADT/Optional.h" #include "llvm/ADT/SetVector.h" #include "llvm/ADT/SmallBitVector.h" +#include "llvm/ADT/SmallSet.h" #include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/TinyPtrVector.h" diff --git a/clang/lib/AST/AttrImpl.cpp b/clang/lib/AST/AttrImpl.cpp --- a/clang/lib/AST/AttrImpl.cpp +++ b/clang/lib/AST/AttrImpl.cpp @@ -151,6 +151,11 @@ return llvm::None; } +namespace clang { +llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const OMPTraitInfo &TI); +llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const OMPTraitInfo *TI); +} + void OMPDeclareVariantAttr::printPrettyPragma( raw_ostream &OS, const PrintingPolicy &Policy) const { if (const Expr *E = getVariantFuncRef()) { @@ -158,9 +163,7 @@ E->printPretty(OS, nullptr, Policy); OS << ")"; } - OS << " match("; - traitInfos->print(OS, Policy); - OS << ")"; + OS << " match(" << traitInfos << ")"; } #include "clang/AST/AttrImpl.inc" diff --git a/clang/lib/AST/OpenMPClause.cpp b/clang/lib/AST/OpenMPClause.cpp --- a/clang/lib/AST/OpenMPClause.cpp +++ b/clang/lib/AST/OpenMPClause.cpp @@ -1680,7 +1680,7 @@ if (!Node->varlist_empty()) { OS << "map("; if (Node->getMapType() != OMPC_MAP_unknown) { - for (unsigned I = 0; I < OMPMapClause::NumberOfModifiers; ++I) { + for (unsigned I = 0; I < NumberOfOMPMapClauseModifiers; ++I) { if (Node->getMapTypeModifier(I) != OMPC_MAP_MODIFIER_unknown) { OS << getOpenMPSimpleClauseTypeName(OMPC_map, Node->getMapTypeModifier(I)); @@ -1841,14 +1841,14 @@ void OMPTraitInfo::print(llvm::raw_ostream &OS, const PrintingPolicy &Policy) const { bool FirstSet = true; - for (const OMPTraitInfo::OMPTraitSet &Set : Sets) { + for (const OMPTraitSet &Set : Sets) { if (!FirstSet) OS << ", "; FirstSet = false; OS << llvm::omp::getOpenMPContextTraitSetName(Set.Kind) << "={"; bool FirstSelector = true; - for (const OMPTraitInfo::OMPTraitSelector &Selector : Set.Selectors) { + for (const OMPTraitSelector &Selector : Set.Selectors) { if (!FirstSelector) OS << ", "; FirstSelector = false; @@ -1874,7 +1874,7 @@ } bool FirstProperty = true; - for (const OMPTraitInfo::OMPTraitProperty &Property : + for (const OMPTraitProperty &Property : Selector.Properties) { if (!FirstProperty) OS << ", "; diff --git a/clang/lib/Parse/ParseOpenMP.cpp b/clang/lib/Parse/ParseOpenMP.cpp --- a/clang/lib/Parse/ParseOpenMP.cpp +++ b/clang/lib/Parse/ParseOpenMP.cpp @@ -11,6 +11,7 @@ //===----------------------------------------------------------------------===// #include "clang/AST/ASTContext.h" +#include "clang/AST/OpenMPClause.h" #include "clang/AST/StmtOpenMP.h" #include "clang/Basic/OpenMPKinds.h" #include "clang/Parse/ParseDiagnostic.h" @@ -862,7 +863,7 @@ } // namespace void Parser::parseOMPTraitPropertyKind( - OMPTraitInfo::OMPTraitProperty &TIProperty, llvm::omp::TraitSet Set, + OMPTraitProperty &TIProperty, llvm::omp::TraitSet Set, llvm::omp::TraitSelector Selector, llvm::StringMap &Seen) { TIProperty.Kind = TraitProperty::invalid; @@ -931,14 +932,14 @@ << CONTEXT_TRAIT_LVL << listOpenMPContextTraitProperties(Set, Selector); } -void Parser::parseOMPContextProperty(OMPTraitInfo::OMPTraitSelector &TISelector, +void Parser::parseOMPContextProperty(OMPTraitSelector &TISelector, llvm::omp::TraitSet Set, llvm::StringMap &Seen) { assert(TISelector.Kind != TraitSelector::user_condition && "User conditions are special properties not handled here!"); SourceLocation PropertyLoc = Tok.getLocation(); - OMPTraitInfo::OMPTraitProperty TIProperty; + OMPTraitProperty TIProperty; parseOMPTraitPropertyKind(TIProperty, Set, TISelector.Kind, Seen); // If we have an invalid property here we already issued a warning. @@ -972,7 +973,7 @@ } void Parser::parseOMPTraitSelectorKind( - OMPTraitInfo::OMPTraitSelector &TISelector, llvm::omp::TraitSet Set, + OMPTraitSelector &TISelector, llvm::omp::TraitSet Set, llvm::StringMap &Seen) { TISelector.Kind = TraitSelector::invalid; @@ -1051,7 +1052,7 @@ /// /// ['('[] [, ]* ')'] void Parser::parseOMPContextSelector( - OMPTraitInfo::OMPTraitSelector &TISelector, llvm::omp::TraitSet Set, + OMPTraitSelector &TISelector, llvm::omp::TraitSet Set, llvm::StringMap &SeenSelectors) { unsigned short OuterPC = ParenCount; @@ -1151,7 +1152,7 @@ BDT.consumeClose(); } -void Parser::parseOMPTraitSetKind(OMPTraitInfo::OMPTraitSet &TISet, +void Parser::parseOMPTraitSetKind(OMPTraitSet &TISet, llvm::StringMap &Seen) { TISet.Kind = TraitSet::invalid; @@ -1215,7 +1216,7 @@ /// /// '=' '{' [, ]* '}' void Parser::parseOMPContextSelectorSet( - OMPTraitInfo::OMPTraitSet &TISet, + OMPTraitSet &TISet, llvm::StringMap &SeenSets) { auto OuterBC = BraceCount; @@ -1270,7 +1271,7 @@ llvm::StringMap SeenSelectors; do { - OMPTraitInfo::OMPTraitSelector TISelector; + OMPTraitSelector TISelector; parseOMPContextSelector(TISelector, TISet.Kind, SeenSelectors); if (TISelector.Kind != TraitSelector::invalid && !TISelector.Properties.empty()) @@ -1292,10 +1293,10 @@ /// Parse OpenMP context selectors: /// /// [, ]* -bool Parser::parseOMPContextSelectors(SourceLocation Loc, OMPTraitInfo &TI) { +bool Parser::parseOMPContextSelectors(SourceLocation Loc, OMPTraitInfo& TI) { llvm::StringMap SeenSets; do { - OMPTraitInfo::OMPTraitSet TISet; + OMPTraitSet TISet; parseOMPContextSelectorSet(TISet, SeenSets); if (TISet.Kind != TraitSet::invalid && !TISet.Selectors.empty()) TI.Sets.push_back(TISet); diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -16641,7 +16641,7 @@ OpenMPMapModifierKind Modifiers[] = {OMPC_MAP_MODIFIER_unknown, OMPC_MAP_MODIFIER_unknown, OMPC_MAP_MODIFIER_unknown}; - SourceLocation ModifiersLoc[OMPMapClause::NumberOfModifiers]; + SourceLocation ModifiersLoc[NumberOfOMPMapClauseModifiers]; // Process map-type-modifiers, flag errors for duplicate modifiers. unsigned Count = 0; @@ -16651,7 +16651,7 @@ Diag(MapTypeModifiersLoc[I], diag::err_omp_duplicate_map_type_modifier); continue; } - assert(Count < OMPMapClause::NumberOfModifiers && + assert(Count < NumberOfOMPMapClauseModifiers && "Modifiers exceed the allowed number of map type modifiers"); Modifiers[Count] = MapTypeModifiers[I]; ModifiersLoc[Count] = MapTypeModifiersLoc[I]; diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -12292,7 +12292,7 @@ void OMPClauseReader::VisitOMPMapClause(OMPMapClause *C) { C->setLParenLoc(Record.readSourceLocation()); - for (unsigned I = 0; I < OMPMapClause::NumberOfModifiers; ++I) { + for (unsigned I = 0; I < NumberOfOMPMapClauseModifiers; ++I) { C->setMapTypeModifier( I, static_cast(Record.readInt())); C->setMapTypeModifierLoc(I, Record.readSourceLocation()); diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -6381,7 +6381,7 @@ Record.push_back(C->getTotalComponentListNum()); Record.push_back(C->getTotalComponentsNum()); Record.AddSourceLocation(C->getLParenLoc()); - for (unsigned I = 0; I < OMPMapClause::NumberOfModifiers; ++I) { + for (unsigned I = 0; I < NumberOfOMPMapClauseModifiers; ++I) { Record.push_back(C->getMapTypeModifier(I)); Record.AddSourceLocation(C->getMapTypeModifierLoc(I)); }