20#include "llvm/ADT/StringMap.h"
21#include "llvm/ADT/StringSwitch.h"
29#include "clang/Basic/AttrHasAttributeImpl.inc"
37 StringRef Name =
Attr->getName();
39 if (Name.size() >= 4 && Name.starts_with(
"__") && Name.ends_with(
"__"))
40 Name = Name.substr(2, Name.size() - 4);
43 StringRef ScopeName =
Scope ?
Scope->getName() :
"";
44 if (ScopeName ==
"__gnu__")
46 else if (ScopeName ==
"_Clang")
56 if (LangOpts.OpenMP && ScopeName ==
"omp" &&
57 (Name ==
"directive" || Name ==
"sequence"))
66 if (Ptr->hasSpelling(Syntax, Name))
74#define ATTR_MATCH_RULE(NAME, SPELLING, IsAbstract) \
77#include "clang/Basic/AttrSubMatchRulesList.inc"
79 llvm_unreachable(
"Invalid subject match rule");
90 StringRef ScopeName =
Scope->getName();
93 if (ScopeName ==
"__gnu__")
95 else if (ScopeName ==
"_Clang")
102 StringRef NormalizedScopeName,
106 bool ShouldNormalize =
110 (NormalizedScopeName.empty() || NormalizedScopeName ==
"gnu" ||
111 NormalizedScopeName ==
"clang"));
112 StringRef AttrName = Name->getName();
113 if (ShouldNormalize && AttrName.size() >= 4 && AttrName.starts_with(
"__") &&
114 AttrName.ends_with(
"__"))
115 AttrName = AttrName.slice(2, AttrName.size() - 2);
121 return ScopeName && (ScopeName->
isStr(
"gnu") || ScopeName->
isStr(
"__gnu__"));
125 return ScopeName && (ScopeName->
isStr(
"clang") || ScopeName->
isStr(
"_Clang"));
128#include "clang/Sema/AttrParsedAttrKinds.inc"
137 if (!ScopeName.empty()) {
151 return ::getAttrKind(
normalizeName(Name, ScopeName, SyntaxUsed), SyntaxUsed);
155 return static_cast<std::string
>(