1 //===- IdentifierTable.h - Hash table for identifier lookup -----*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 /// \file
10 /// Defines the clang::IdentifierInfo, clang::IdentifierTable, and
11 /// clang::Selector interfaces.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #ifndef LLVM_CLANG_BASIC_IDENTIFIERTABLE_H
16 #define LLVM_CLANG_BASIC_IDENTIFIERTABLE_H
17
18 #include "clang/Basic/Builtins.h"
19 #include "clang/Basic/DiagnosticIDs.h"
20 #include "clang/Basic/LLVM.h"
21 #include "clang/Basic/TokenKinds.h"
22 #include "llvm/ADT/DenseMapInfo.h"
23 #include "llvm/ADT/FoldingSet.h"
24 #include "llvm/ADT/PointerIntPair.h"
25 #include "llvm/ADT/PointerUnion.h"
26 #include "llvm/ADT/SmallString.h"
27 #include "llvm/ADT/StringMap.h"
28 #include "llvm/ADT/StringRef.h"
29 #include "llvm/Support/Allocator.h"
30 #include "llvm/Support/PointerLikeTypeTraits.h"
31 #include "llvm/Support/type_traits.h"
32 #include <cassert>
33 #include <cstddef>
34 #include <cstdint>
35 #include <cstring>
36 #include <string>
37 #include <utility>
38
39 namespace clang {
40
41 class DeclarationName;
42 class DeclarationNameTable;
43 class IdentifierInfo;
44 class LangOptions;
45 class MultiKeywordSelector;
46 class SourceLocation;
47
48 enum class ReservedIdentifierStatus {
49 NotReserved = 0,
50 StartsWithUnderscoreAtGlobalScope,
51 StartsWithUnderscoreAndIsExternC,
52 StartsWithDoubleUnderscore,
53 StartsWithUnderscoreFollowedByCapitalLetter,
54 ContainsDoubleUnderscore,
55 };
56
57 enum class ReservedLiteralSuffixIdStatus {
58 NotReserved = 0,
59 NotStartsWithUnderscore,
60 ContainsDoubleUnderscore,
61 };
62
63 /// Determine whether an identifier is reserved for use as a name at global
64 /// scope. Such identifiers might be implementation-specific global functions
65 /// or variables.
isReservedAtGlobalScope(ReservedIdentifierStatus Status)66 inline bool isReservedAtGlobalScope(ReservedIdentifierStatus Status) {
67 return Status != ReservedIdentifierStatus::NotReserved;
68 }
69
70 /// Determine whether an identifier is reserved in all contexts. Such
71 /// identifiers might be implementation-specific keywords or macros, for
72 /// example.
isReservedInAllContexts(ReservedIdentifierStatus Status)73 inline bool isReservedInAllContexts(ReservedIdentifierStatus Status) {
74 return Status != ReservedIdentifierStatus::NotReserved &&
75 Status != ReservedIdentifierStatus::StartsWithUnderscoreAtGlobalScope &&
76 Status != ReservedIdentifierStatus::StartsWithUnderscoreAndIsExternC;
77 }
78
79 /// A simple pair of identifier info and location.
80 using IdentifierLocPair = std::pair<IdentifierInfo *, SourceLocation>;
81
82 /// IdentifierInfo and other related classes are aligned to
83 /// 8 bytes so that DeclarationName can use the lower 3 bits
84 /// of a pointer to one of these classes.
85 enum { IdentifierInfoAlignment = 8 };
86
87 static constexpr int InterestingIdentifierBits = 16;
88
89 /// The "layout" of InterestingIdentifier is:
90 /// - ObjCKeywordKind enumerators
91 /// - NotableIdentifierKind enumerators
92 /// - Builtin::ID enumerators
93 /// - NotInterestingIdentifier
94 enum class InterestingIdentifier {
95 #define OBJC_AT_KEYWORD(X) objc_##X,
96 #include "clang/Basic/TokenKinds.def"
97 NUM_OBJC_KEYWORDS,
98
99 #define NOTABLE_IDENTIFIER(X) X,
100 #include "clang/Basic/TokenKinds.def"
101 NUM_OBJC_KEYWORDS_AND_NOTABLE_IDENTIFIERS,
102
103 NotBuiltin,
104 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
105 #include "clang/Basic/Builtins.inc"
106 FirstTSBuiltin,
107
108 NotInterestingIdentifier = 65534
109 };
110
111 /// One of these records is kept for each identifier that
112 /// is lexed. This contains information about whether the token was \#define'd,
113 /// is a language keyword, or if it is a front-end token of some sort (e.g. a
114 /// variable or function name). The preprocessor keeps this information in a
115 /// set, and all tok::identifier tokens have a pointer to one of these.
116 /// It is aligned to 8 bytes because DeclarationName needs the lower 3 bits.
117 class alignas(IdentifierInfoAlignment) IdentifierInfo {
118 friend class IdentifierTable;
119
120 // Front-end token ID or tok::identifier.
121 LLVM_PREFERRED_TYPE(tok::TokenKind)
122 unsigned TokenID : 9;
123
124 LLVM_PREFERRED_TYPE(InterestingIdentifier)
125 unsigned InterestingIdentifierID : InterestingIdentifierBits;
126
127 // True if there is a #define for this.
128 LLVM_PREFERRED_TYPE(bool)
129 unsigned HasMacro : 1;
130
131 // True if there was a #define for this.
132 LLVM_PREFERRED_TYPE(bool)
133 unsigned HadMacro : 1;
134
135 // True if the identifier is a language extension.
136 LLVM_PREFERRED_TYPE(bool)
137 unsigned IsExtension : 1;
138
139 // True if the identifier is a keyword in a newer or proposed Standard.
140 LLVM_PREFERRED_TYPE(bool)
141 unsigned IsFutureCompatKeyword : 1;
142
143 // True if the identifier is poisoned.
144 LLVM_PREFERRED_TYPE(bool)
145 unsigned IsPoisoned : 1;
146
147 // True if the identifier is a C++ operator keyword.
148 LLVM_PREFERRED_TYPE(bool)
149 unsigned IsCPPOperatorKeyword : 1;
150
151 // Internal bit set by the member function RecomputeNeedsHandleIdentifier.
152 // See comment about RecomputeNeedsHandleIdentifier for more info.
153 LLVM_PREFERRED_TYPE(bool)
154 unsigned NeedsHandleIdentifier : 1;
155
156 // True if the identifier was loaded (at least partially) from an AST file.
157 LLVM_PREFERRED_TYPE(bool)
158 unsigned IsFromAST : 1;
159
160 // True if the identifier has changed from the definition
161 // loaded from an AST file.
162 LLVM_PREFERRED_TYPE(bool)
163 unsigned ChangedAfterLoad : 1;
164
165 // True if the identifier's frontend information has changed from the
166 // definition loaded from an AST file.
167 LLVM_PREFERRED_TYPE(bool)
168 unsigned FEChangedAfterLoad : 1;
169
170 // True if revertTokenIDToIdentifier was called.
171 LLVM_PREFERRED_TYPE(bool)
172 unsigned RevertedTokenID : 1;
173
174 // True if there may be additional information about
175 // this identifier stored externally.
176 LLVM_PREFERRED_TYPE(bool)
177 unsigned OutOfDate : 1;
178
179 // True if this is the 'import' contextual keyword.
180 LLVM_PREFERRED_TYPE(bool)
181 unsigned IsModulesImport : 1;
182
183 // True if this is a mangled OpenMP variant name.
184 LLVM_PREFERRED_TYPE(bool)
185 unsigned IsMangledOpenMPVariantName : 1;
186
187 // True if this is a deprecated macro.
188 LLVM_PREFERRED_TYPE(bool)
189 unsigned IsDeprecatedMacro : 1;
190
191 // True if this macro is unsafe in headers.
192 LLVM_PREFERRED_TYPE(bool)
193 unsigned IsRestrictExpansion : 1;
194
195 // True if this macro is final.
196 LLVM_PREFERRED_TYPE(bool)
197 unsigned IsFinal : 1;
198
199 // 22 bits left in a 64-bit word.
200
201 // Managed by the language front-end.
202 void *FETokenInfo = nullptr;
203
204 llvm::StringMapEntry<IdentifierInfo *> *Entry = nullptr;
205
IdentifierInfo()206 IdentifierInfo()
207 : TokenID(tok::identifier),
208 InterestingIdentifierID(llvm::to_underlying(
209 InterestingIdentifier::NotInterestingIdentifier)),
210 HasMacro(false), HadMacro(false), IsExtension(false),
211 IsFutureCompatKeyword(false), IsPoisoned(false),
212 IsCPPOperatorKeyword(false), NeedsHandleIdentifier(false),
213 IsFromAST(false), ChangedAfterLoad(false), FEChangedAfterLoad(false),
214 RevertedTokenID(false), OutOfDate(false), IsModulesImport(false),
215 IsMangledOpenMPVariantName(false), IsDeprecatedMacro(false),
216 IsRestrictExpansion(false), IsFinal(false) {}
217
218 public:
219 IdentifierInfo(const IdentifierInfo &) = delete;
220 IdentifierInfo &operator=(const IdentifierInfo &) = delete;
221 IdentifierInfo(IdentifierInfo &&) = delete;
222 IdentifierInfo &operator=(IdentifierInfo &&) = delete;
223
224 /// Return true if this is the identifier for the specified string.
225 ///
226 /// This is intended to be used for string literals only: II->isStr("foo").
227 template <std::size_t StrLen>
isStr(const char (& Str)[StrLen])228 bool isStr(const char (&Str)[StrLen]) const {
229 return getLength() == StrLen-1 &&
230 memcmp(getNameStart(), Str, StrLen-1) == 0;
231 }
232
233 /// Return true if this is the identifier for the specified StringRef.
isStr(llvm::StringRef Str)234 bool isStr(llvm::StringRef Str) const {
235 llvm::StringRef ThisStr(getNameStart(), getLength());
236 return ThisStr == Str;
237 }
238
239 /// Return the beginning of the actual null-terminated string for this
240 /// identifier.
getNameStart()241 const char *getNameStart() const { return Entry->getKeyData(); }
242
243 /// Efficiently return the length of this identifier info.
getLength()244 unsigned getLength() const { return Entry->getKeyLength(); }
245
246 /// Return the actual identifier string.
getName()247 StringRef getName() const {
248 return StringRef(getNameStart(), getLength());
249 }
250
251 /// Return true if this identifier is \#defined to some other value.
252 /// \note The current definition may be in a module and not currently visible.
hasMacroDefinition()253 bool hasMacroDefinition() const {
254 return HasMacro;
255 }
setHasMacroDefinition(bool Val)256 void setHasMacroDefinition(bool Val) {
257 if (HasMacro == Val) return;
258
259 HasMacro = Val;
260 if (Val) {
261 NeedsHandleIdentifier = true;
262 HadMacro = true;
263 } else {
264 // If this is a final macro, make the deprecation and header unsafe bits
265 // stick around after the undefinition so they apply to any redefinitions.
266 if (!IsFinal) {
267 // Because calling the setters of these calls recomputes, just set them
268 // manually to avoid recomputing a bunch of times.
269 IsDeprecatedMacro = false;
270 IsRestrictExpansion = false;
271 }
272 RecomputeNeedsHandleIdentifier();
273 }
274 }
275 /// Returns true if this identifier was \#defined to some value at any
276 /// moment. In this case there should be an entry for the identifier in the
277 /// macro history table in Preprocessor.
hadMacroDefinition()278 bool hadMacroDefinition() const {
279 return HadMacro;
280 }
281
isDeprecatedMacro()282 bool isDeprecatedMacro() const { return IsDeprecatedMacro; }
283
setIsDeprecatedMacro(bool Val)284 void setIsDeprecatedMacro(bool Val) {
285 if (IsDeprecatedMacro == Val)
286 return;
287 IsDeprecatedMacro = Val;
288 if (Val)
289 NeedsHandleIdentifier = true;
290 else
291 RecomputeNeedsHandleIdentifier();
292 }
293
isRestrictExpansion()294 bool isRestrictExpansion() const { return IsRestrictExpansion; }
295
setIsRestrictExpansion(bool Val)296 void setIsRestrictExpansion(bool Val) {
297 if (IsRestrictExpansion == Val)
298 return;
299 IsRestrictExpansion = Val;
300 if (Val)
301 NeedsHandleIdentifier = true;
302 else
303 RecomputeNeedsHandleIdentifier();
304 }
305
isFinal()306 bool isFinal() const { return IsFinal; }
307
setIsFinal(bool Val)308 void setIsFinal(bool Val) { IsFinal = Val; }
309
310 /// If this is a source-language token (e.g. 'for'), this API
311 /// can be used to cause the lexer to map identifiers to source-language
312 /// tokens.
getTokenID()313 tok::TokenKind getTokenID() const { return (tok::TokenKind)TokenID; }
314
315 /// True if revertTokenIDToIdentifier() was called.
hasRevertedTokenIDToIdentifier()316 bool hasRevertedTokenIDToIdentifier() const { return RevertedTokenID; }
317
318 /// Revert TokenID to tok::identifier; used for GNU libstdc++ 4.2
319 /// compatibility.
320 ///
321 /// TokenID is normally read-only but there are 2 instances where we revert it
322 /// to tok::identifier for libstdc++ 4.2. Keep track of when this happens
323 /// using this method so we can inform serialization about it.
revertTokenIDToIdentifier()324 void revertTokenIDToIdentifier() {
325 assert(TokenID != tok::identifier && "Already at tok::identifier");
326 TokenID = tok::identifier;
327 RevertedTokenID = true;
328 }
revertIdentifierToTokenID(tok::TokenKind TK)329 void revertIdentifierToTokenID(tok::TokenKind TK) {
330 assert(TokenID == tok::identifier && "Should be at tok::identifier");
331 TokenID = TK;
332 RevertedTokenID = false;
333 }
334
335 /// Return the preprocessor keyword ID for this identifier.
336 ///
337 /// For example, "define" will return tok::pp_define.
338 tok::PPKeywordKind getPPKeywordID() const;
339
340 /// Return the Objective-C keyword ID for the this identifier.
341 ///
342 /// For example, 'class' will return tok::objc_class if ObjC is enabled.
getObjCKeywordID()343 tok::ObjCKeywordKind getObjCKeywordID() const {
344 assert(0 == llvm::to_underlying(InterestingIdentifier::objc_not_keyword));
345 auto Value = static_cast<InterestingIdentifier>(InterestingIdentifierID);
346 if (Value < InterestingIdentifier::NUM_OBJC_KEYWORDS)
347 return static_cast<tok::ObjCKeywordKind>(InterestingIdentifierID);
348 return tok::objc_not_keyword;
349 }
setObjCKeywordID(tok::ObjCKeywordKind ID)350 void setObjCKeywordID(tok::ObjCKeywordKind ID) {
351 assert(0 == llvm::to_underlying(InterestingIdentifier::objc_not_keyword));
352 InterestingIdentifierID = ID;
353 assert(getObjCKeywordID() == ID && "ID too large for field!");
354 }
355
356 /// Return a value indicating whether this is a builtin function.
getBuiltinID()357 unsigned getBuiltinID() const {
358 auto Value = static_cast<InterestingIdentifier>(InterestingIdentifierID);
359 if (Value >
360 InterestingIdentifier::NUM_OBJC_KEYWORDS_AND_NOTABLE_IDENTIFIERS &&
361 Value != InterestingIdentifier::NotInterestingIdentifier) {
362 auto FirstBuiltin =
363 llvm::to_underlying(InterestingIdentifier::NotBuiltin);
364 return static_cast<Builtin::ID>(InterestingIdentifierID - FirstBuiltin);
365 }
366 return Builtin::ID::NotBuiltin;
367 }
setBuiltinID(unsigned ID)368 void setBuiltinID(unsigned ID) {
369 assert(ID != Builtin::ID::NotBuiltin);
370 auto FirstBuiltin = llvm::to_underlying(InterestingIdentifier::NotBuiltin);
371 InterestingIdentifierID = ID + FirstBuiltin;
372 assert(getBuiltinID() == ID && "ID too large for field!");
373 }
clearBuiltinID()374 void clearBuiltinID() {
375 InterestingIdentifierID =
376 llvm::to_underlying(InterestingIdentifier::NotInterestingIdentifier);
377 }
378
getNotableIdentifierID()379 tok::NotableIdentifierKind getNotableIdentifierID() const {
380 auto Value = static_cast<InterestingIdentifier>(InterestingIdentifierID);
381 if (Value > InterestingIdentifier::NUM_OBJC_KEYWORDS &&
382 Value <
383 InterestingIdentifier::NUM_OBJC_KEYWORDS_AND_NOTABLE_IDENTIFIERS) {
384 auto FirstNotableIdentifier =
385 1 + llvm::to_underlying(InterestingIdentifier::NUM_OBJC_KEYWORDS);
386 return static_cast<tok::NotableIdentifierKind>(InterestingIdentifierID -
387 FirstNotableIdentifier);
388 }
389 return tok::not_notable;
390 }
setNotableIdentifierID(unsigned ID)391 void setNotableIdentifierID(unsigned ID) {
392 assert(ID != tok::not_notable);
393 auto FirstNotableIdentifier =
394 1 + llvm::to_underlying(InterestingIdentifier::NUM_OBJC_KEYWORDS);
395 InterestingIdentifierID = ID + FirstNotableIdentifier;
396 assert(getNotableIdentifierID() == ID && "ID too large for field!");
397 }
398
getObjCOrBuiltinID()399 unsigned getObjCOrBuiltinID() const { return InterestingIdentifierID; }
setObjCOrBuiltinID(unsigned ID)400 void setObjCOrBuiltinID(unsigned ID) { InterestingIdentifierID = ID; }
401
402 /// get/setExtension - Initialize information about whether or not this
403 /// language token is an extension. This controls extension warnings, and is
404 /// only valid if a custom token ID is set.
isExtensionToken()405 bool isExtensionToken() const { return IsExtension; }
setIsExtensionToken(bool Val)406 void setIsExtensionToken(bool Val) {
407 IsExtension = Val;
408 if (Val)
409 NeedsHandleIdentifier = true;
410 else
411 RecomputeNeedsHandleIdentifier();
412 }
413
414 /// is/setIsFutureCompatKeyword - Initialize information about whether or not
415 /// this language token is a keyword in a newer or proposed Standard. This
416 /// controls compatibility warnings, and is only true when not parsing the
417 /// corresponding Standard. Once a compatibility problem has been diagnosed
418 /// with this keyword, the flag will be cleared.
isFutureCompatKeyword()419 bool isFutureCompatKeyword() const { return IsFutureCompatKeyword; }
setIsFutureCompatKeyword(bool Val)420 void setIsFutureCompatKeyword(bool Val) {
421 IsFutureCompatKeyword = Val;
422 if (Val)
423 NeedsHandleIdentifier = true;
424 else
425 RecomputeNeedsHandleIdentifier();
426 }
427
428 /// setIsPoisoned - Mark this identifier as poisoned. After poisoning, the
429 /// Preprocessor will emit an error every time this token is used.
430 void setIsPoisoned(bool Value = true) {
431 IsPoisoned = Value;
432 if (Value)
433 NeedsHandleIdentifier = true;
434 else
435 RecomputeNeedsHandleIdentifier();
436 }
437
438 /// Return true if this token has been poisoned.
isPoisoned()439 bool isPoisoned() const { return IsPoisoned; }
440
441 /// isCPlusPlusOperatorKeyword/setIsCPlusPlusOperatorKeyword controls whether
442 /// this identifier is a C++ alternate representation of an operator.
443 void setIsCPlusPlusOperatorKeyword(bool Val = true) {
444 IsCPPOperatorKeyword = Val;
445 }
isCPlusPlusOperatorKeyword()446 bool isCPlusPlusOperatorKeyword() const { return IsCPPOperatorKeyword; }
447
448 /// Return true if this token is a keyword in the specified language.
449 bool isKeyword(const LangOptions &LangOpts) const;
450
451 /// Return true if this token is a C++ keyword in the specified
452 /// language.
453 bool isCPlusPlusKeyword(const LangOptions &LangOpts) const;
454
455 /// Get and set FETokenInfo. The language front-end is allowed to associate
456 /// arbitrary metadata with this token.
getFETokenInfo()457 void *getFETokenInfo() const { return FETokenInfo; }
setFETokenInfo(void * T)458 void setFETokenInfo(void *T) { FETokenInfo = T; }
459
460 /// Return true if the Preprocessor::HandleIdentifier must be called
461 /// on a token of this identifier.
462 ///
463 /// If this returns false, we know that HandleIdentifier will not affect
464 /// the token.
isHandleIdentifierCase()465 bool isHandleIdentifierCase() const { return NeedsHandleIdentifier; }
466
467 /// Return true if the identifier in its current state was loaded
468 /// from an AST file.
isFromAST()469 bool isFromAST() const { return IsFromAST; }
470
setIsFromAST()471 void setIsFromAST() { IsFromAST = true; }
472
473 /// Determine whether this identifier has changed since it was loaded
474 /// from an AST file.
hasChangedSinceDeserialization()475 bool hasChangedSinceDeserialization() const {
476 return ChangedAfterLoad;
477 }
478
479 /// Note that this identifier has changed since it was loaded from
480 /// an AST file.
setChangedSinceDeserialization()481 void setChangedSinceDeserialization() {
482 ChangedAfterLoad = true;
483 }
484
485 /// Determine whether the frontend token information for this
486 /// identifier has changed since it was loaded from an AST file.
hasFETokenInfoChangedSinceDeserialization()487 bool hasFETokenInfoChangedSinceDeserialization() const {
488 return FEChangedAfterLoad;
489 }
490
491 /// Note that the frontend token information for this identifier has
492 /// changed since it was loaded from an AST file.
setFETokenInfoChangedSinceDeserialization()493 void setFETokenInfoChangedSinceDeserialization() {
494 FEChangedAfterLoad = true;
495 }
496
497 /// Determine whether the information for this identifier is out of
498 /// date with respect to the external source.
isOutOfDate()499 bool isOutOfDate() const { return OutOfDate; }
500
501 /// Set whether the information for this identifier is out of
502 /// date with respect to the external source.
setOutOfDate(bool OOD)503 void setOutOfDate(bool OOD) {
504 OutOfDate = OOD;
505 if (OOD)
506 NeedsHandleIdentifier = true;
507 else
508 RecomputeNeedsHandleIdentifier();
509 }
510
511 /// Determine whether this is the contextual keyword \c import.
isModulesImport()512 bool isModulesImport() const { return IsModulesImport; }
513
514 /// Set whether this identifier is the contextual keyword \c import.
setModulesImport(bool I)515 void setModulesImport(bool I) {
516 IsModulesImport = I;
517 if (I)
518 NeedsHandleIdentifier = true;
519 else
520 RecomputeNeedsHandleIdentifier();
521 }
522
523 /// Determine whether this is the mangled name of an OpenMP variant.
isMangledOpenMPVariantName()524 bool isMangledOpenMPVariantName() const { return IsMangledOpenMPVariantName; }
525
526 /// Set whether this is the mangled name of an OpenMP variant.
setMangledOpenMPVariantName(bool I)527 void setMangledOpenMPVariantName(bool I) { IsMangledOpenMPVariantName = I; }
528
529 /// Return true if this identifier is an editor placeholder.
530 ///
531 /// Editor placeholders are produced by the code-completion engine and are
532 /// represented as characters between '<#' and '#>' in the source code. An
533 /// example of auto-completed call with a placeholder parameter is shown
534 /// below:
535 /// \code
536 /// function(<#int x#>);
537 /// \endcode
isEditorPlaceholder()538 bool isEditorPlaceholder() const {
539 return getName().starts_with("<#") && getName().ends_with("#>");
540 }
541
542 /// Determine whether \p this is a name reserved for the implementation (C99
543 /// 7.1.3, C++ [lib.global.names]).
544 ReservedIdentifierStatus isReserved(const LangOptions &LangOpts) const;
545
546 /// Determine whether \p this is a name reserved for future standardization or
547 /// the implementation (C++ [usrlit.suffix]).
548 ReservedLiteralSuffixIdStatus isReservedLiteralSuffixId() const;
549
550 /// If the identifier is an "uglified" reserved name, return a cleaned form.
551 /// e.g. _Foo => Foo. Otherwise, just returns the name.
552 StringRef deuglifiedName() const;
isPlaceholder()553 bool isPlaceholder() const {
554 return getLength() == 1 && getNameStart()[0] == '_';
555 }
556
557 /// Provide less than operator for lexicographical sorting.
558 bool operator<(const IdentifierInfo &RHS) const {
559 return getName() < RHS.getName();
560 }
561
562 private:
563 /// The Preprocessor::HandleIdentifier does several special (but rare)
564 /// things to identifiers of various sorts. For example, it changes the
565 /// \c for keyword token from tok::identifier to tok::for.
566 ///
567 /// This method is very tied to the definition of HandleIdentifier. Any
568 /// change to it should be reflected here.
RecomputeNeedsHandleIdentifier()569 void RecomputeNeedsHandleIdentifier() {
570 NeedsHandleIdentifier = isPoisoned() || hasMacroDefinition() ||
571 isExtensionToken() || isFutureCompatKeyword() ||
572 isOutOfDate() || isModulesImport();
573 }
574 };
575
576 /// An RAII object for [un]poisoning an identifier within a scope.
577 ///
578 /// \p II is allowed to be null, in which case objects of this type have
579 /// no effect.
580 class PoisonIdentifierRAIIObject {
581 IdentifierInfo *const II;
582 const bool OldValue;
583
584 public:
PoisonIdentifierRAIIObject(IdentifierInfo * II,bool NewValue)585 PoisonIdentifierRAIIObject(IdentifierInfo *II, bool NewValue)
586 : II(II), OldValue(II ? II->isPoisoned() : false) {
587 if(II)
588 II->setIsPoisoned(NewValue);
589 }
590
~PoisonIdentifierRAIIObject()591 ~PoisonIdentifierRAIIObject() {
592 if(II)
593 II->setIsPoisoned(OldValue);
594 }
595 };
596
597 /// An iterator that walks over all of the known identifiers
598 /// in the lookup table.
599 ///
600 /// Since this iterator uses an abstract interface via virtual
601 /// functions, it uses an object-oriented interface rather than the
602 /// more standard C++ STL iterator interface. In this OO-style
603 /// iteration, the single function \c Next() provides dereference,
604 /// advance, and end-of-sequence checking in a single
605 /// operation. Subclasses of this iterator type will provide the
606 /// actual functionality.
607 class IdentifierIterator {
608 protected:
609 IdentifierIterator() = default;
610
611 public:
612 IdentifierIterator(const IdentifierIterator &) = delete;
613 IdentifierIterator &operator=(const IdentifierIterator &) = delete;
614
615 virtual ~IdentifierIterator();
616
617 /// Retrieve the next string in the identifier table and
618 /// advances the iterator for the following string.
619 ///
620 /// \returns The next string in the identifier table. If there is
621 /// no such string, returns an empty \c StringRef.
622 virtual StringRef Next() = 0;
623 };
624
625 /// Provides lookups to, and iteration over, IdentiferInfo objects.
626 class IdentifierInfoLookup {
627 public:
628 virtual ~IdentifierInfoLookup();
629
630 /// Return the IdentifierInfo for the specified named identifier.
631 ///
632 /// Unlike the version in IdentifierTable, this returns a pointer instead
633 /// of a reference. If the pointer is null then the IdentifierInfo cannot
634 /// be found.
635 virtual IdentifierInfo* get(StringRef Name) = 0;
636
637 /// Retrieve an iterator into the set of all identifiers
638 /// known to this identifier lookup source.
639 ///
640 /// This routine provides access to all of the identifiers known to
641 /// the identifier lookup, allowing access to the contents of the
642 /// identifiers without introducing the overhead of constructing
643 /// IdentifierInfo objects for each.
644 ///
645 /// \returns A new iterator into the set of known identifiers. The
646 /// caller is responsible for deleting this iterator.
647 virtual IdentifierIterator *getIdentifiers();
648 };
649
650 /// Implements an efficient mapping from strings to IdentifierInfo nodes.
651 ///
652 /// This has no other purpose, but this is an extremely performance-critical
653 /// piece of the code, as each occurrence of every identifier goes through
654 /// here when lexed.
655 class IdentifierTable {
656 // Shark shows that using MallocAllocator is *much* slower than using this
657 // BumpPtrAllocator!
658 using HashTableTy = llvm::StringMap<IdentifierInfo *, llvm::BumpPtrAllocator>;
659 HashTableTy HashTable;
660
661 IdentifierInfoLookup* ExternalLookup;
662
663 public:
664 /// Create the identifier table.
665 explicit IdentifierTable(IdentifierInfoLookup *ExternalLookup = nullptr);
666
667 /// Create the identifier table, populating it with info about the
668 /// language keywords for the language specified by \p LangOpts.
669 explicit IdentifierTable(const LangOptions &LangOpts,
670 IdentifierInfoLookup *ExternalLookup = nullptr);
671
672 /// Set the external identifier lookup mechanism.
setExternalIdentifierLookup(IdentifierInfoLookup * IILookup)673 void setExternalIdentifierLookup(IdentifierInfoLookup *IILookup) {
674 ExternalLookup = IILookup;
675 }
676
677 /// Retrieve the external identifier lookup object, if any.
getExternalIdentifierLookup()678 IdentifierInfoLookup *getExternalIdentifierLookup() const {
679 return ExternalLookup;
680 }
681
getAllocator()682 llvm::BumpPtrAllocator& getAllocator() {
683 return HashTable.getAllocator();
684 }
685
686 /// Return the identifier token info for the specified named
687 /// identifier.
get(StringRef Name)688 IdentifierInfo &get(StringRef Name) {
689 auto &Entry = *HashTable.try_emplace(Name, nullptr).first;
690
691 IdentifierInfo *&II = Entry.second;
692 if (II) return *II;
693
694 // No entry; if we have an external lookup, look there first.
695 if (ExternalLookup) {
696 II = ExternalLookup->get(Name);
697 if (II)
698 return *II;
699 }
700
701 // Lookups failed, make a new IdentifierInfo.
702 void *Mem = getAllocator().Allocate<IdentifierInfo>();
703 II = new (Mem) IdentifierInfo();
704
705 // Make sure getName() knows how to find the IdentifierInfo
706 // contents.
707 II->Entry = &Entry;
708
709 return *II;
710 }
711
get(StringRef Name,tok::TokenKind TokenCode)712 IdentifierInfo &get(StringRef Name, tok::TokenKind TokenCode) {
713 IdentifierInfo &II = get(Name);
714 II.TokenID = TokenCode;
715 assert(II.TokenID == (unsigned) TokenCode && "TokenCode too large");
716 return II;
717 }
718
719 /// Gets an IdentifierInfo for the given name without consulting
720 /// external sources.
721 ///
722 /// This is a version of get() meant for external sources that want to
723 /// introduce or modify an identifier. If they called get(), they would
724 /// likely end up in a recursion.
getOwn(StringRef Name)725 IdentifierInfo &getOwn(StringRef Name) {
726 auto &Entry = *HashTable.insert(std::make_pair(Name, nullptr)).first;
727
728 IdentifierInfo *&II = Entry.second;
729 if (II)
730 return *II;
731
732 // Lookups failed, make a new IdentifierInfo.
733 void *Mem = getAllocator().Allocate<IdentifierInfo>();
734 II = new (Mem) IdentifierInfo();
735
736 // Make sure getName() knows how to find the IdentifierInfo
737 // contents.
738 II->Entry = &Entry;
739
740 // If this is the 'import' contextual keyword, mark it as such.
741 if (Name == "import")
742 II->setModulesImport(true);
743
744 return *II;
745 }
746
747 using iterator = HashTableTy::const_iterator;
748 using const_iterator = HashTableTy::const_iterator;
749
begin()750 iterator begin() const { return HashTable.begin(); }
end()751 iterator end() const { return HashTable.end(); }
size()752 unsigned size() const { return HashTable.size(); }
753
find(StringRef Name)754 iterator find(StringRef Name) const { return HashTable.find(Name); }
755
756 /// Print some statistics to stderr that indicate how well the
757 /// hashing is doing.
758 void PrintStats() const;
759
760 /// Populate the identifier table with info about the language keywords
761 /// for the language specified by \p LangOpts.
762 void AddKeywords(const LangOptions &LangOpts);
763
764 /// Returns the correct diagnostic to issue for a future-compat diagnostic
765 /// warning. Note, this function assumes the identifier passed has already
766 /// been determined to be a future compatible keyword.
767 diag::kind getFutureCompatDiagKind(const IdentifierInfo &II,
768 const LangOptions &LangOpts);
769 };
770
771 /// A family of Objective-C methods.
772 ///
773 /// These families have no inherent meaning in the language, but are
774 /// nonetheless central enough in the existing implementations to
775 /// merit direct AST support. While, in theory, arbitrary methods can
776 /// be considered to form families, we focus here on the methods
777 /// involving allocation and retain-count management, as these are the
778 /// most "core" and the most likely to be useful to diverse clients
779 /// without extra information.
780 ///
781 /// Both selectors and actual method declarations may be classified
782 /// into families. Method families may impose additional restrictions
783 /// beyond their selector name; for example, a method called '_init'
784 /// that returns void is not considered to be in the 'init' family
785 /// (but would be if it returned 'id'). It is also possible to
786 /// explicitly change or remove a method's family. Therefore the
787 /// method's family should be considered the single source of truth.
788 enum ObjCMethodFamily {
789 /// No particular method family.
790 OMF_None,
791
792 // Selectors in these families may have arbitrary arity, may be
793 // written with arbitrary leading underscores, and may have
794 // additional CamelCase "words" in their first selector chunk
795 // following the family name.
796 OMF_alloc,
797 OMF_copy,
798 OMF_init,
799 OMF_mutableCopy,
800 OMF_new,
801
802 // These families are singletons consisting only of the nullary
803 // selector with the given name.
804 OMF_autorelease,
805 OMF_dealloc,
806 OMF_finalize,
807 OMF_release,
808 OMF_retain,
809 OMF_retainCount,
810 OMF_self,
811 OMF_initialize,
812
813 // performSelector families
814 OMF_performSelector
815 };
816
817 /// Enough bits to store any enumerator in ObjCMethodFamily or
818 /// InvalidObjCMethodFamily.
819 enum { ObjCMethodFamilyBitWidth = 4 };
820
821 /// An invalid value of ObjCMethodFamily.
822 enum { InvalidObjCMethodFamily = (1 << ObjCMethodFamilyBitWidth) - 1 };
823
824 /// A family of Objective-C methods.
825 ///
826 /// These are family of methods whose result type is initially 'id', but
827 /// but are candidate for the result type to be changed to 'instancetype'.
828 enum ObjCInstanceTypeFamily {
829 OIT_None,
830 OIT_Array,
831 OIT_Dictionary,
832 OIT_Singleton,
833 OIT_Init,
834 OIT_ReturnsSelf
835 };
836
837 enum ObjCStringFormatFamily {
838 SFF_None,
839 SFF_NSString,
840 SFF_CFString
841 };
842
843 namespace detail {
844
845 /// DeclarationNameExtra is used as a base of various uncommon special names.
846 /// This class is needed since DeclarationName has not enough space to store
847 /// the kind of every possible names. Therefore the kind of common names is
848 /// stored directly in DeclarationName, and the kind of uncommon names is
849 /// stored in DeclarationNameExtra. It is aligned to 8 bytes because
850 /// DeclarationName needs the lower 3 bits to store the kind of common names.
851 /// DeclarationNameExtra is tightly coupled to DeclarationName and any change
852 /// here is very likely to require changes in DeclarationName(Table).
853 class alignas(IdentifierInfoAlignment) DeclarationNameExtra {
854 friend class clang::DeclarationName;
855 friend class clang::DeclarationNameTable;
856
857 protected:
858 /// The kind of "extra" information stored in the DeclarationName. See
859 /// @c ExtraKindOrNumArgs for an explanation of how these enumerator values
860 /// are used. Note that DeclarationName depends on the numerical values
861 /// of the enumerators in this enum. See DeclarationName::StoredNameKind
862 /// for more info.
863 enum ExtraKind {
864 CXXDeductionGuideName,
865 CXXLiteralOperatorName,
866 CXXUsingDirective,
867 ObjCMultiArgSelector
868 };
869
870 /// ExtraKindOrNumArgs has one of the following meaning:
871 /// * The kind of an uncommon C++ special name. This DeclarationNameExtra
872 /// is in this case in fact either a CXXDeductionGuideNameExtra or
873 /// a CXXLiteralOperatorIdName.
874 ///
875 /// * It may be also name common to C++ using-directives (CXXUsingDirective),
876 ///
877 /// * Otherwise it is ObjCMultiArgSelector+NumArgs, where NumArgs is
878 /// the number of arguments in the Objective-C selector, in which
879 /// case the DeclarationNameExtra is also a MultiKeywordSelector.
880 unsigned ExtraKindOrNumArgs;
881
DeclarationNameExtra(ExtraKind Kind)882 DeclarationNameExtra(ExtraKind Kind) : ExtraKindOrNumArgs(Kind) {}
DeclarationNameExtra(unsigned NumArgs)883 DeclarationNameExtra(unsigned NumArgs)
884 : ExtraKindOrNumArgs(ObjCMultiArgSelector + NumArgs) {}
885
886 /// Return the corresponding ExtraKind.
getKind()887 ExtraKind getKind() const {
888 return static_cast<ExtraKind>(ExtraKindOrNumArgs >
889 (unsigned)ObjCMultiArgSelector
890 ? (unsigned)ObjCMultiArgSelector
891 : ExtraKindOrNumArgs);
892 }
893
894 /// Return the number of arguments in an ObjC selector. Only valid when this
895 /// is indeed an ObjCMultiArgSelector.
getNumArgs()896 unsigned getNumArgs() const {
897 assert(ExtraKindOrNumArgs >= (unsigned)ObjCMultiArgSelector &&
898 "getNumArgs called but this is not an ObjC selector!");
899 return ExtraKindOrNumArgs - (unsigned)ObjCMultiArgSelector;
900 }
901 };
902
903 } // namespace detail
904
905 /// One of these variable length records is kept for each
906 /// selector containing more than one keyword. We use a folding set
907 /// to unique aggregate names (keyword selectors in ObjC parlance). Access to
908 /// this class is provided strictly through Selector.
909 class alignas(IdentifierInfoAlignment) MultiKeywordSelector
910 : public detail::DeclarationNameExtra,
911 public llvm::FoldingSetNode {
MultiKeywordSelector(unsigned nKeys)912 MultiKeywordSelector(unsigned nKeys) : DeclarationNameExtra(nKeys) {}
913
914 public:
915 // Constructor for keyword selectors.
MultiKeywordSelector(unsigned nKeys,const IdentifierInfo ** IIV)916 MultiKeywordSelector(unsigned nKeys, const IdentifierInfo **IIV)
917 : DeclarationNameExtra(nKeys) {
918 assert((nKeys > 1) && "not a multi-keyword selector");
919
920 // Fill in the trailing keyword array.
921 const IdentifierInfo **KeyInfo =
922 reinterpret_cast<const IdentifierInfo **>(this + 1);
923 for (unsigned i = 0; i != nKeys; ++i)
924 KeyInfo[i] = IIV[i];
925 }
926
927 // getName - Derive the full selector name and return it.
928 std::string getName() const;
929
930 using DeclarationNameExtra::getNumArgs;
931
932 using keyword_iterator = const IdentifierInfo *const *;
933
keyword_begin()934 keyword_iterator keyword_begin() const {
935 return reinterpret_cast<keyword_iterator>(this + 1);
936 }
937
keyword_end()938 keyword_iterator keyword_end() const {
939 return keyword_begin() + getNumArgs();
940 }
941
getIdentifierInfoForSlot(unsigned i)942 const IdentifierInfo *getIdentifierInfoForSlot(unsigned i) const {
943 assert(i < getNumArgs() && "getIdentifierInfoForSlot(): illegal index");
944 return keyword_begin()[i];
945 }
946
Profile(llvm::FoldingSetNodeID & ID,keyword_iterator ArgTys,unsigned NumArgs)947 static void Profile(llvm::FoldingSetNodeID &ID, keyword_iterator ArgTys,
948 unsigned NumArgs) {
949 ID.AddInteger(NumArgs);
950 for (unsigned i = 0; i != NumArgs; ++i)
951 ID.AddPointer(ArgTys[i]);
952 }
953
Profile(llvm::FoldingSetNodeID & ID)954 void Profile(llvm::FoldingSetNodeID &ID) {
955 Profile(ID, keyword_begin(), getNumArgs());
956 }
957 };
958
959 /// Smart pointer class that efficiently represents Objective-C method
960 /// names.
961 ///
962 /// This class will either point to an IdentifierInfo or a
963 /// MultiKeywordSelector (which is private). This enables us to optimize
964 /// selectors that take no arguments and selectors that take 1 argument, which
965 /// accounts for 78% of all selectors in Cocoa.h.
966 class Selector {
967 friend class Diagnostic;
968 friend class SelectorTable; // only the SelectorTable can create these
969 friend class DeclarationName; // and the AST's DeclarationName.
970
971 enum IdentifierInfoFlag {
972 // Empty selector = 0. Note that these enumeration values must
973 // correspond to the enumeration values of DeclarationName::StoredNameKind
974 ZeroArg = 0x01,
975 OneArg = 0x02,
976 // IMPORTANT NOTE: see comments in InfoPtr (below) about this enumerator
977 // value.
978 MultiArg = 0x07,
979 };
980
981 /// IMPORTANT NOTE: the order of the types in this PointerUnion are
982 /// important! The DeclarationName class has bidirectional conversion
983 /// to/from Selector through an opaque pointer (void *) which corresponds
984 /// to this PointerIntPair. The discriminator bit from the PointerUnion
985 /// corresponds to the high bit in the MultiArg enumerator. So while this
986 /// PointerIntPair only has two bits for the integer (and we mask off the
987 /// high bit in `MultiArg` when it is used), that discrimator bit is
988 /// still necessary for the opaque conversion. The discriminator bit
989 /// from the PointerUnion and the two integer bits from the
990 /// PointerIntPair are also exposed via the DeclarationName::StoredNameKind
991 /// enumeration; see the comments in DeclarationName.h for more details.
992 /// Do not reorder or add any arguments to this template
993 /// without thoroughly understanding how tightly coupled these classes are.
994 llvm::PointerIntPair<
995 llvm::PointerUnion<const IdentifierInfo *, MultiKeywordSelector *>, 2>
996 InfoPtr;
997
Selector(const IdentifierInfo * II,unsigned nArgs)998 Selector(const IdentifierInfo *II, unsigned nArgs) {
999 assert(nArgs < 2 && "nArgs not equal to 0/1");
1000 InfoPtr.setPointerAndInt(II, nArgs + 1);
1001 }
1002
Selector(MultiKeywordSelector * SI)1003 Selector(MultiKeywordSelector *SI) {
1004 // IMPORTANT NOTE: we mask off the upper bit of this value because we only
1005 // reserve two bits for the integer in the PointerIntPair. See the comments
1006 // in `InfoPtr` for more details.
1007 InfoPtr.setPointerAndInt(SI, MultiArg & 0b11);
1008 }
1009
getAsIdentifierInfo()1010 const IdentifierInfo *getAsIdentifierInfo() const {
1011 return InfoPtr.getPointer().dyn_cast<const IdentifierInfo *>();
1012 }
1013
getMultiKeywordSelector()1014 MultiKeywordSelector *getMultiKeywordSelector() const {
1015 return InfoPtr.getPointer().get<MultiKeywordSelector *>();
1016 }
1017
getIdentifierInfoFlag()1018 unsigned getIdentifierInfoFlag() const {
1019 unsigned new_flags = InfoPtr.getInt();
1020 // IMPORTANT NOTE: We have to reconstitute this data rather than use the
1021 // value directly from the PointerIntPair. See the comments in `InfoPtr`
1022 // for more details.
1023 if (InfoPtr.getPointer().is<MultiKeywordSelector *>())
1024 new_flags |= MultiArg;
1025 return new_flags;
1026 }
1027
1028 static ObjCMethodFamily getMethodFamilyImpl(Selector sel);
1029
1030 static ObjCStringFormatFamily getStringFormatFamilyImpl(Selector sel);
1031
1032 public:
1033 /// The default ctor should only be used when creating data structures that
1034 /// will contain selectors.
1035 Selector() = default;
Selector(uintptr_t V)1036 explicit Selector(uintptr_t V) {
1037 InfoPtr.setFromOpaqueValue(reinterpret_cast<void *>(V));
1038 }
1039
1040 /// operator==/!= - Indicate whether the specified selectors are identical.
1041 bool operator==(Selector RHS) const {
1042 return InfoPtr.getOpaqueValue() == RHS.InfoPtr.getOpaqueValue();
1043 }
1044 bool operator!=(Selector RHS) const {
1045 return InfoPtr.getOpaqueValue() != RHS.InfoPtr.getOpaqueValue();
1046 }
1047
getAsOpaquePtr()1048 void *getAsOpaquePtr() const { return InfoPtr.getOpaqueValue(); }
1049
1050 /// Determine whether this is the empty selector.
isNull()1051 bool isNull() const { return InfoPtr.getOpaqueValue() == nullptr; }
1052
1053 // Predicates to identify the selector type.
isKeywordSelector()1054 bool isKeywordSelector() const { return InfoPtr.getInt() != ZeroArg; }
1055
isUnarySelector()1056 bool isUnarySelector() const { return InfoPtr.getInt() == ZeroArg; }
1057
1058 /// If this selector is the specific keyword selector described by Names.
1059 bool isKeywordSelector(ArrayRef<StringRef> Names) const;
1060
1061 /// If this selector is the specific unary selector described by Name.
1062 bool isUnarySelector(StringRef Name) const;
1063
1064 unsigned getNumArgs() const;
1065
1066 /// Retrieve the identifier at a given position in the selector.
1067 ///
1068 /// Note that the identifier pointer returned may be NULL. Clients that only
1069 /// care about the text of the identifier string, and not the specific,
1070 /// uniqued identifier pointer, should use \c getNameForSlot(), which returns
1071 /// an empty string when the identifier pointer would be NULL.
1072 ///
1073 /// \param argIndex The index for which we want to retrieve the identifier.
1074 /// This index shall be less than \c getNumArgs() unless this is a keyword
1075 /// selector, in which case 0 is the only permissible value.
1076 ///
1077 /// \returns the uniqued identifier for this slot, or NULL if this slot has
1078 /// no corresponding identifier.
1079 const IdentifierInfo *getIdentifierInfoForSlot(unsigned argIndex) const;
1080
1081 /// Retrieve the name at a given position in the selector.
1082 ///
1083 /// \param argIndex The index for which we want to retrieve the name.
1084 /// This index shall be less than \c getNumArgs() unless this is a keyword
1085 /// selector, in which case 0 is the only permissible value.
1086 ///
1087 /// \returns the name for this slot, which may be the empty string if no
1088 /// name was supplied.
1089 StringRef getNameForSlot(unsigned argIndex) const;
1090
1091 /// Derive the full selector name (e.g. "foo:bar:") and return
1092 /// it as an std::string.
1093 std::string getAsString() const;
1094
1095 /// Prints the full selector name (e.g. "foo:bar:").
1096 void print(llvm::raw_ostream &OS) const;
1097
1098 void dump() const;
1099
1100 /// Derive the conventional family of this method.
getMethodFamily()1101 ObjCMethodFamily getMethodFamily() const {
1102 return getMethodFamilyImpl(*this);
1103 }
1104
getStringFormatFamily()1105 ObjCStringFormatFamily getStringFormatFamily() const {
1106 return getStringFormatFamilyImpl(*this);
1107 }
1108
getEmptyMarker()1109 static Selector getEmptyMarker() {
1110 return Selector(uintptr_t(-1));
1111 }
1112
getTombstoneMarker()1113 static Selector getTombstoneMarker() {
1114 return Selector(uintptr_t(-2));
1115 }
1116
1117 static ObjCInstanceTypeFamily getInstTypeMethodFamily(Selector sel);
1118 };
1119
1120 /// This table allows us to fully hide how we implement
1121 /// multi-keyword caching.
1122 class SelectorTable {
1123 // Actually a SelectorTableImpl
1124 void *Impl;
1125
1126 public:
1127 SelectorTable();
1128 SelectorTable(const SelectorTable &) = delete;
1129 SelectorTable &operator=(const SelectorTable &) = delete;
1130 ~SelectorTable();
1131
1132 /// Can create any sort of selector.
1133 ///
1134 /// \p NumArgs indicates whether this is a no argument selector "foo", a
1135 /// single argument selector "foo:" or multi-argument "foo:bar:".
1136 Selector getSelector(unsigned NumArgs, const IdentifierInfo **IIV);
1137
getUnarySelector(const IdentifierInfo * ID)1138 Selector getUnarySelector(const IdentifierInfo *ID) {
1139 return Selector(ID, 1);
1140 }
1141
getNullarySelector(const IdentifierInfo * ID)1142 Selector getNullarySelector(const IdentifierInfo *ID) {
1143 return Selector(ID, 0);
1144 }
1145
1146 /// Return the total amount of memory allocated for managing selectors.
1147 size_t getTotalMemory() const;
1148
1149 /// Return the default setter name for the given identifier.
1150 ///
1151 /// This is "set" + \p Name where the initial character of \p Name
1152 /// has been capitalized.
1153 static SmallString<64> constructSetterName(StringRef Name);
1154
1155 /// Return the default setter selector for the given identifier.
1156 ///
1157 /// This is "set" + \p Name where the initial character of \p Name
1158 /// has been capitalized.
1159 static Selector constructSetterSelector(IdentifierTable &Idents,
1160 SelectorTable &SelTable,
1161 const IdentifierInfo *Name);
1162
1163 /// Return the property name for the given setter selector.
1164 static std::string getPropertyNameFromSetterSelector(Selector Sel);
1165 };
1166
1167 } // namespace clang
1168
1169 namespace llvm {
1170
1171 /// Define DenseMapInfo so that Selectors can be used as keys in DenseMap and
1172 /// DenseSets.
1173 template <>
1174 struct DenseMapInfo<clang::Selector> {
1175 static clang::Selector getEmptyKey() {
1176 return clang::Selector::getEmptyMarker();
1177 }
1178
1179 static clang::Selector getTombstoneKey() {
1180 return clang::Selector::getTombstoneMarker();
1181 }
1182
1183 static unsigned getHashValue(clang::Selector S);
1184
1185 static bool isEqual(clang::Selector LHS, clang::Selector RHS) {
1186 return LHS == RHS;
1187 }
1188 };
1189
1190 template<>
1191 struct PointerLikeTypeTraits<clang::Selector> {
1192 static const void *getAsVoidPointer(clang::Selector P) {
1193 return P.getAsOpaquePtr();
1194 }
1195
1196 static clang::Selector getFromVoidPointer(const void *P) {
1197 return clang::Selector(reinterpret_cast<uintptr_t>(P));
1198 }
1199
1200 static constexpr int NumLowBitsAvailable = 0;
1201 };
1202
1203 } // namespace llvm
1204
1205 #endif // LLVM_CLANG_BASIC_IDENTIFIERTABLE_H
1206