clang  10.0.0svn
Attributes.cpp
Go to the documentation of this file.
5 #include "llvm/ADT/StringSwitch.h"
6 using namespace clang;
7 
9  const IdentifierInfo *Attr, const TargetInfo &Target,
10  const LangOptions &LangOpts) {
11  StringRef Name = Attr->getName();
12  // Normalize the attribute name, __foo__ becomes foo.
13  if (Name.size() >= 4 && Name.startswith("__") && Name.endswith("__"))
14  Name = Name.substr(2, Name.size() - 4);
15 
16  // Normalize the scope name, but only for gnu and clang attributes.
17  StringRef ScopeName = Scope ? Scope->getName() : "";
18  if (ScopeName == "__gnu__")
19  ScopeName = "gnu";
20  else if (ScopeName == "_Clang")
21  ScopeName = "clang";
22 
23 #include "clang/Basic/AttrHasAttributeImpl.inc"
24 
25  return 0;
26 }
27 
29  switch (Rule) {
30 #define ATTR_MATCH_RULE(NAME, SPELLING, IsAbstract) \
31  case attr::NAME: \
32  return SPELLING;
33 #include "clang/Basic/AttrSubMatchRulesList.inc"
34  }
35  llvm_unreachable("Invalid subject match rule");
36 }
37 
38 static StringRef
39 normalizeAttrScopeName(StringRef ScopeName,
40  AttributeCommonInfo::Syntax SyntaxUsed) {
41  // Normalize the "__gnu__" scope name to be "gnu" and the "_Clang" scope name
42  // to be "clang".
43  if (SyntaxUsed == AttributeCommonInfo::AS_CXX11 ||
44  SyntaxUsed == AttributeCommonInfo::AS_C2x) {
45  if (ScopeName == "__gnu__")
46  ScopeName = "gnu";
47  else if (ScopeName == "_Clang")
48  ScopeName = "clang";
49  }
50  return ScopeName;
51 }
52 
53 static StringRef normalizeAttrName(StringRef AttrName,
54  StringRef NormalizedScopeName,
55  AttributeCommonInfo::Syntax SyntaxUsed) {
56  // Normalize the attribute name, __foo__ becomes foo. This is only allowable
57  // for GNU attributes, and attributes using the double square bracket syntax.
58  bool ShouldNormalize =
59  SyntaxUsed == AttributeCommonInfo::AS_GNU ||
60  ((SyntaxUsed == AttributeCommonInfo::AS_CXX11 ||
61  SyntaxUsed == AttributeCommonInfo::AS_C2x) &&
62  (NormalizedScopeName.empty() || NormalizedScopeName == "gnu" ||
63  NormalizedScopeName == "clang"));
64  if (ShouldNormalize && AttrName.size() >= 4 && AttrName.startswith("__") &&
65  AttrName.endswith("__"))
66  AttrName = AttrName.slice(2, AttrName.size() - 2);
67 
68  return AttrName;
69 }
70 
72  return ScopeName && (ScopeName->isStr("gnu") || ScopeName->isStr("__gnu__"));
73 }
74 
75 #include "clang/Sema/AttrParsedAttrKinds.inc"
76 
79  const IdentifierInfo *ScopeName,
80  Syntax SyntaxUsed) {
81  StringRef AttrName = Name->getName();
82 
83  SmallString<64> FullName;
84  if (ScopeName)
85  FullName += normalizeAttrScopeName(ScopeName->getName(), SyntaxUsed);
86 
87  AttrName = normalizeAttrName(AttrName, FullName, SyntaxUsed);
88 
89  // Ensure that in the case of C++11 attributes, we look for '::foo' if it is
90  // unscoped.
91  if (ScopeName || SyntaxUsed == AS_CXX11 || SyntaxUsed == AS_C2x)
92  FullName += "::";
93  FullName += AttrName;
94 
95  return ::getAttrKind(FullName, SyntaxUsed);
96 }
97 
98 unsigned AttributeCommonInfo::calculateAttributeSpellingListIndex() const {
99  // Both variables will be used in tablegen generated
100  // attribute spell list index matching code.
101  auto Syntax = static_cast<AttributeCommonInfo::Syntax>(getSyntax());
102  StringRef Scope =
104  : "";
105  StringRef Name = normalizeAttrName(getAttrName()->getName(), Scope, Syntax);
106 
107 #include "clang/Sema/AttrSpellingListIndex.inc"
108 }
Syntax
The style used to specify an attribute.
One of these records is kept for each identifier that is lexed.
SubjectMatchRule
A list of all the recognized kinds of attributes.
bool isStr(const char(&Str)[StrLen]) const
Return true if this is the identifier for the specified string.
static StringRef normalizeAttrScopeName(StringRef ScopeName, AttributeCommonInfo::Syntax SyntaxUsed)
Definition: Attributes.cpp:39
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
Definition: LangOptions.h:49
AttrSyntax
Definition: Attributes.h:19
Scope - A scope is a transient data structure that is used while parsing the program.
Definition: Scope.h:40
int hasAttribute(AttrSyntax Syntax, const IdentifierInfo *Scope, const IdentifierInfo *Attr, const TargetInfo &Target, const LangOptions &LangOpts)
Return the version number associated with the attribute if we recognize and implement the attribute s...
Definition: Attributes.cpp:8
const IdentifierInfo * getAttrName() const
Exposes information about the current target.
Definition: TargetInfo.h:161
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
const char * getSubjectMatchRuleSpelling(SubjectMatchRule Rule)
Definition: Attributes.cpp:28
StringRef getName() const
Return the actual identifier string.
Dataflow Directional Tag Classes.
static std::string getName(const CallEvent &Call)
static StringRef normalizeAttrName(StringRef AttrName, StringRef NormalizedScopeName, AttributeCommonInfo::Syntax SyntaxUsed)
Definition: Attributes.cpp:53
const IdentifierInfo * getScopeName() const
Attr - This represents one attribute.
Definition: Attr.h:45