diff --git a/clang-tools-extra/clangd/XRefs.cpp b/clang-tools-extra/clangd/XRefs.cpp --- a/clang-tools-extra/clangd/XRefs.cpp +++ b/clang-tools-extra/clangd/XRefs.cpp @@ -43,6 +43,7 @@ #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/None.h" #include "llvm/ADT/STLExtras.h" +#include "llvm/ADT/SmallSet.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/Casting.h" 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 @@ -5249,19 +5249,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; @@ -5330,7 +5325,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; } @@ -5340,7 +5335,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; } @@ -5415,7 +5410,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]; } @@ -5425,7 +5420,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]; } @@ -7144,6 +7139,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 @@ -7158,27 +7166,14 @@ /// Reconstruct a (partial) OMPTraitInfo object from a mangled name. OMPTraitInfo(StringRef MangledName); - 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( llvm::function_ref Cond) { - return llvm::any_of(Sets, [&](OMPTraitInfo::OMPTraitSet &Set) { + return llvm::any_of(Sets, [&](OMPTraitSet &Set) { return llvm::any_of( - Set.Selectors, [&](OMPTraitInfo::OMPTraitSelector &Selector) { + Set.Selectors, [&](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 @@ -91,6 +91,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 @@ -2936,32 +2940,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. @@ -3107,9 +3111,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 ExtraModifierLoc; 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 @@ -58,6 +58,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" @@ -9861,8 +9862,7 @@ /// The associated OpenMP context selector mangling. std::string NameSuffix; - OMPDeclareVariantScope(OMPTraitInfo &TI) - : TI(&TI), NameSuffix(TI.getMangledName()) {} + OMPDeclareVariantScope(OMPTraitInfo &TI); }; /// The current `omp begin/end declare variant` scopes. 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 @@ -1754,7 +1754,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)); @@ -1934,14 +1934,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 << getOpenMPContextTraitSetName(Set.Kind) << "={"; bool FirstSelector = true; - for (const OMPTraitInfo::OMPTraitSelector &Selector : Set.Selectors) { + for (const OMPTraitSelector &Selector : Set.Selectors) { if (!FirstSelector) OS << ", "; FirstSelector = false; @@ -1967,8 +1967,7 @@ } bool FirstProperty = true; - for (const OMPTraitInfo::OMPTraitProperty &Property : - Selector.Properties) { + for (const OMPTraitProperty &Property : Selector.Properties) { if (!FirstProperty) OS << ", "; FirstProperty = false; @@ -1984,9 +1983,9 @@ std::string OMPTraitInfo::getMangledName() const { std::string MangledName; llvm::raw_string_ostream OS(MangledName); - for (const OMPTraitInfo::OMPTraitSet &Set : Sets) { + for (const OMPTraitSet &Set : Sets) { OS << '.' << 'S' << unsigned(Set.Kind); - for (const OMPTraitInfo::OMPTraitSelector &Selector : Set.Selectors) { + for (const OMPTraitSelector &Selector : Set.Selectors) { bool AllowsTraitScore = false; bool RequiresProperty = false; @@ -1998,7 +1997,7 @@ Selector.Kind == TraitSelector::user_condition) continue; - for (const OMPTraitInfo::OMPTraitProperty &Property : Selector.Properties) + for (const OMPTraitProperty &Property : Selector.Properties) OS << '.' << 'P' << getOpenMPContextTraitPropertyName(Property.Kind); } 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/Basic/TargetInfo.h" @@ -865,7 +866,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; @@ -934,14 +935,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. @@ -975,7 +976,7 @@ } void Parser::parseOMPTraitSelectorKind( - OMPTraitInfo::OMPTraitSelector &TISelector, llvm::omp::TraitSet Set, + OMPTraitSelector &TISelector, llvm::omp::TraitSet Set, llvm::StringMap &Seen) { TISelector.Kind = TraitSelector::invalid; @@ -1054,7 +1055,7 @@ /// /// ['('[] [, ]* ')'] void Parser::parseOMPContextSelector( - OMPTraitInfo::OMPTraitSelector &TISelector, llvm::omp::TraitSet Set, + OMPTraitSelector &TISelector, llvm::omp::TraitSet Set, llvm::StringMap &SeenSelectors) { unsigned short OuterPC = ParenCount; @@ -1160,7 +1161,7 @@ BDT.consumeClose(); } -void Parser::parseOMPTraitSetKind(OMPTraitInfo::OMPTraitSet &TISet, +void Parser::parseOMPTraitSetKind(OMPTraitSet &TISet, llvm::StringMap &Seen) { TISet.Kind = TraitSet::invalid; @@ -1224,7 +1225,7 @@ /// /// '=' '{' [, ]* '}' void Parser::parseOMPContextSelectorSet( - OMPTraitInfo::OMPTraitSet &TISet, + OMPTraitSet &TISet, llvm::StringMap &SeenSets) { auto OuterBC = BraceCount; @@ -1279,7 +1280,7 @@ llvm::StringMap SeenSelectors; do { - OMPTraitInfo::OMPTraitSelector TISelector; + OMPTraitSelector TISelector; parseOMPContextSelector(TISelector, TISet.Kind, SeenSelectors); if (TISelector.Kind != TraitSelector::invalid && !TISelector.Properties.empty()) @@ -1301,10 +1302,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 @@ -35,6 +35,8 @@ #include "llvm/ADT/PointerEmbeddedInt.h" #include "llvm/ADT/STLExtras.h" #include "llvm/Frontend/OpenMP/OMPConstants.h" +#include + using namespace clang; using namespace llvm::omp; @@ -5543,6 +5545,9 @@ FD->setParams(Params); } +Sema::OMPDeclareVariantScope::OMPDeclareVariantScope(OMPTraitInfo &TI) + : TI(&TI), NameSuffix(TI.getMangledName()) {} + FunctionDecl * Sema::ActOnStartOfFunctionDefinitionInOpenMPDeclareVariantScope(Scope *S, Declarator &D) { @@ -17054,7 +17059,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; @@ -17064,7 +17069,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 @@ -12335,7 +12335,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 @@ -6403,7 +6403,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)); } diff --git a/clang/lib/Tooling/Transformer/SourceCode.cpp b/clang/lib/Tooling/Transformer/SourceCode.cpp --- a/clang/lib/Tooling/Transformer/SourceCode.cpp +++ b/clang/lib/Tooling/Transformer/SourceCode.cpp @@ -20,6 +20,7 @@ #include "clang/Basic/SourceManager.h" #include "clang/Lex/Lexer.h" #include "llvm/Support/Errc.h" +#include using namespace clang;