clang: lib/Basic/Attributes.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
19
20#include "llvm/ADT/StringMap.h"
21#include "llvm/ADT/StringSwitch.h"
22
23using namespace clang;
24
28
29#include "clang/Basic/AttrHasAttributeImpl.inc"
30
31 return 0;
32}
33
37 StringRef Name = Attr->getName();
38
39 if (Name.size() >= 4 && Name.starts_with("__") && Name.ends_with("__"))
40 Name = Name.substr(2, Name.size() - 4);
41
42
43 StringRef ScopeName = Scope ? Scope->getName() : "";
44 if (ScopeName == "__gnu__")
45 ScopeName = "gnu";
46 else if (ScopeName == "_Clang")
47 ScopeName = "clang";
48
49
50
51
52
53
54
55
56 if (LangOpts.OpenMP && ScopeName == "omp" &&
57 (Name == "directive" || Name == "sequence"))
58 return 1;
59
61 if (res)
62 return res;
63
64
66 if (Ptr->hasSpelling(Syntax, Name))
67 return 1;
68
69 return 0;
70}
71
73 switch (Rule) {
74#define ATTR_MATCH_RULE(NAME, SPELLING, IsAbstract) \
75 case attr::NAME: \
76 return SPELLING;
77#include "clang/Basic/AttrSubMatchRulesList.inc"
78 }
79 llvm_unreachable("Invalid subject match rule");
80}
81
82static StringRef
86 return "";
87
88
89
90 StringRef ScopeName = Scope->getName();
93 if (ScopeName == "__gnu__")
94 ScopeName = "gnu";
95 else if (ScopeName == "_Clang")
96 ScopeName = "clang";
97 }
98 return ScopeName;
99}
100
102 StringRef NormalizedScopeName,
104
105
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);
116
117 return AttrName;
118}
119
121 return ScopeName && (ScopeName->isStr("gnu") || ScopeName->isStr("__gnu__"));
122}
123
125 return ScopeName && (ScopeName->isStr("clang") || ScopeName->isStr("_Clang"));
126}
127
128#include "clang/Sema/AttrParsedAttrKinds.inc"
129
134 StringRef AttrName = normalizeAttrName(Name, ScopeName, SyntaxUsed);
135
137 if (!ScopeName.empty()) {
141 }
143
145}
146
151 return ::getAttrKind(normalizeName(Name, ScopeName, SyntaxUsed), SyntaxUsed);
152}
153
155 return static_caststd::string\(
157}
158
161 return llvm::StringSwitchAttributeCommonInfo::Scope(ScopeName)
170}
171
172unsigned AttributeCommonInfo::calculateAttributeSpellingListIndex() const {
173
174
178
181
182#include "clang/Sema/AttrSpellingListIndex.inc"
183}
static SmallString< 64 > normalizeName(const IdentifierInfo *Name, const IdentifierInfo *Scope, AttributeCommonInfo::Syntax SyntaxUsed)
static AttributeCommonInfo::Scope getScopeFromNormalizedScopeName(StringRef ScopeName)
static int hasAttributeImpl(AttributeCommonInfo::Syntax Syntax, StringRef Name, StringRef ScopeName, const TargetInfo &Target, const LangOptions &LangOpts)
static StringRef normalizeAttrScopeName(const IdentifierInfo *Scope, AttributeCommonInfo::Syntax SyntaxUsed)
static StringRef normalizeAttrName(const IdentifierInfo *Name, StringRef NormalizedScopeName, AttributeCommonInfo::Syntax SyntaxUsed)
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Defines the clang::LangOptions interface.
llvm::MachO::Target Target
Attr - This represents one attribute.
bool isClangScope() const
std::string getNormalizedFullName() const
Gets the normalized full name, which consists of both scope and name and with surrounding underscores...
Syntax
The style used to specify an attribute.
const IdentifierInfo * getScopeName() const
const IdentifierInfo * getAttrName() const
Kind getParsedKind() const
One of these records is kept for each identifier that is lexed.
bool isStr(const char(&Str)[StrLen]) const
Return true if this is the identifier for the specified string.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
Scope - A scope is a transient data structure that is used while parsing the program.
Exposes information about the current target.
Defines the clang::TargetInfo interface.
SubjectMatchRule
A list of all the recognized kinds of attributes.
const char * getSubjectMatchRuleSpelling(SubjectMatchRule Rule)
The JSON file list parser is used to communicate input to InstallAPI.
int hasAttribute(AttributeCommonInfo::Syntax 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...
const std::list< std::unique_ptr< ParsedAttrInfo > > & getAttributePluginInstances()