• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===--- IdentifierTable.h - Hash table for identifier lookup ---*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 ///
10 /// \file
11 /// \brief Defines the clang::IdentifierInfo, clang::IdentifierTable, and
12 /// clang::Selector interfaces.
13 ///
14 //===----------------------------------------------------------------------===//
15 
16 #ifndef LLVM_CLANG_BASIC_IDENTIFIERTABLE_H
17 #define LLVM_CLANG_BASIC_IDENTIFIERTABLE_H
18 
19 #include "clang/Basic/LLVM.h"
20 #include "clang/Basic/TokenKinds.h"
21 #include "llvm/ADT/StringMap.h"
22 #include "llvm/ADT/StringRef.h"
23 #include <cassert>
24 #include <string>
25 
26 namespace llvm {
27   template <typename T> struct DenseMapInfo;
28 }
29 
30 namespace clang {
31   class LangOptions;
32   class IdentifierInfo;
33   class IdentifierTable;
34   class SourceLocation;
35   class MultiKeywordSelector; // private class used by Selector
36   class DeclarationName;      // AST class that stores declaration names
37 
38   /// \brief A simple pair of identifier info and location.
39   typedef std::pair<IdentifierInfo*, SourceLocation> IdentifierLocPair;
40 
41 
42 /// One of these records is kept for each identifier that
43 /// is lexed.  This contains information about whether the token was \#define'd,
44 /// is a language keyword, or if it is a front-end token of some sort (e.g. a
45 /// variable or function name).  The preprocessor keeps this information in a
46 /// set, and all tok::identifier tokens have a pointer to one of these.
47 class IdentifierInfo {
48   unsigned TokenID            : 9; // Front-end token ID or tok::identifier.
49   // Objective-C keyword ('protocol' in '@protocol') or builtin (__builtin_inf).
50   // First NUM_OBJC_KEYWORDS values are for Objective-C, the remaining values
51   // are for builtins.
52   unsigned ObjCOrBuiltinID    :13;
53   bool HasMacro               : 1; // True if there is a #define for this.
54   bool HadMacro               : 1; // True if there was a #define for this.
55   bool IsExtension            : 1; // True if identifier is a lang extension.
56   bool IsFutureCompatKeyword  : 1; // True if identifier is a keyword in a
57                                    // newer Standard or proposed Standard.
58   bool IsPoisoned             : 1; // True if identifier is poisoned.
59   bool IsCPPOperatorKeyword   : 1; // True if ident is a C++ operator keyword.
60   bool NeedsHandleIdentifier  : 1; // See "RecomputeNeedsHandleIdentifier".
61   bool IsFromAST              : 1; // True if identifier was loaded (at least
62                                    // partially) from an AST file.
63   bool ChangedAfterLoad       : 1; // True if identifier has changed from the
64                                    // definition loaded from an AST file.
65   bool RevertedTokenID        : 1; // True if revertTokenIDToIdentifier was
66                                    // called.
67   bool OutOfDate              : 1; // True if there may be additional
68                                    // information about this identifier
69                                    // stored externally.
70   bool IsModulesImport        : 1; // True if this is the 'import' contextual
71                                    // keyword.
72   // 30 bit left in 64-bit word.
73 
74   void *FETokenInfo;               // Managed by the language front-end.
75   llvm::StringMapEntry<IdentifierInfo*> *Entry;
76 
77   IdentifierInfo(const IdentifierInfo&) = delete;
78   void operator=(const IdentifierInfo&) = delete;
79 
80   friend class IdentifierTable;
81 
82 public:
83   IdentifierInfo();
84 
85 
86   /// \brief Return true if this is the identifier for the specified string.
87   ///
88   /// This is intended to be used for string literals only: II->isStr("foo").
89   template <std::size_t StrLen>
isStr(const char (& Str)[StrLen])90   bool isStr(const char (&Str)[StrLen]) const {
91     return getLength() == StrLen-1 && !memcmp(getNameStart(), Str, StrLen-1);
92   }
93 
94   /// \brief Return the beginning of the actual null-terminated string for this
95   /// identifier.
96   ///
getNameStart()97   const char *getNameStart() const {
98     if (Entry) return Entry->getKeyData();
99     // FIXME: This is gross. It would be best not to embed specific details
100     // of the PTH file format here.
101     // The 'this' pointer really points to a
102     // std::pair<IdentifierInfo, const char*>, where internal pointer
103     // points to the external string data.
104     typedef std::pair<IdentifierInfo, const char*> actualtype;
105     return ((const actualtype*) this)->second;
106   }
107 
108   /// \brief Efficiently return the length of this identifier info.
109   ///
getLength()110   unsigned getLength() const {
111     if (Entry) return Entry->getKeyLength();
112     // FIXME: This is gross. It would be best not to embed specific details
113     // of the PTH file format here.
114     // The 'this' pointer really points to a
115     // std::pair<IdentifierInfo, const char*>, where internal pointer
116     // points to the external string data.
117     typedef std::pair<IdentifierInfo, const char*> actualtype;
118     const char* p = ((const actualtype*) this)->second - 2;
119     return (((unsigned) p[0]) | (((unsigned) p[1]) << 8)) - 1;
120   }
121 
122   /// \brief Return the actual identifier string.
getName()123   StringRef getName() const {
124     return StringRef(getNameStart(), getLength());
125   }
126 
127   /// \brief Return true if this identifier is \#defined to some other value.
128   /// \note The current definition may be in a module and not currently visible.
hasMacroDefinition()129   bool hasMacroDefinition() const {
130     return HasMacro;
131   }
setHasMacroDefinition(bool Val)132   void setHasMacroDefinition(bool Val) {
133     if (HasMacro == Val) return;
134 
135     HasMacro = Val;
136     if (Val) {
137       NeedsHandleIdentifier = 1;
138       HadMacro = true;
139     } else {
140       RecomputeNeedsHandleIdentifier();
141     }
142   }
143   /// \brief Returns true if this identifier was \#defined to some value at any
144   /// moment. In this case there should be an entry for the identifier in the
145   /// macro history table in Preprocessor.
hadMacroDefinition()146   bool hadMacroDefinition() const {
147     return HadMacro;
148   }
149 
150   /// If this is a source-language token (e.g. 'for'), this API
151   /// can be used to cause the lexer to map identifiers to source-language
152   /// tokens.
getTokenID()153   tok::TokenKind getTokenID() const { return (tok::TokenKind)TokenID; }
154 
155   /// \brief True if revertTokenIDToIdentifier() was called.
hasRevertedTokenIDToIdentifier()156   bool hasRevertedTokenIDToIdentifier() const { return RevertedTokenID; }
157 
158   /// \brief Revert TokenID to tok::identifier; used for GNU libstdc++ 4.2
159   /// compatibility.
160   ///
161   /// TokenID is normally read-only but there are 2 instances where we revert it
162   /// to tok::identifier for libstdc++ 4.2. Keep track of when this happens
163   /// using this method so we can inform serialization about it.
revertTokenIDToIdentifier()164   void revertTokenIDToIdentifier() {
165     assert(TokenID != tok::identifier && "Already at tok::identifier");
166     TokenID = tok::identifier;
167     RevertedTokenID = true;
168   }
revertIdentifierToTokenID(tok::TokenKind TK)169   void revertIdentifierToTokenID(tok::TokenKind TK) {
170     assert(TokenID == tok::identifier && "Should be at tok::identifier");
171     TokenID = TK;
172     RevertedTokenID = false;
173   }
174 
175   /// \brief Return the preprocessor keyword ID for this identifier.
176   ///
177   /// For example, "define" will return tok::pp_define.
178   tok::PPKeywordKind getPPKeywordID() const;
179 
180   /// \brief Return the Objective-C keyword ID for the this identifier.
181   ///
182   /// For example, 'class' will return tok::objc_class if ObjC is enabled.
getObjCKeywordID()183   tok::ObjCKeywordKind getObjCKeywordID() const {
184     if (ObjCOrBuiltinID < tok::NUM_OBJC_KEYWORDS)
185       return tok::ObjCKeywordKind(ObjCOrBuiltinID);
186     else
187       return tok::objc_not_keyword;
188   }
setObjCKeywordID(tok::ObjCKeywordKind ID)189   void setObjCKeywordID(tok::ObjCKeywordKind ID) { ObjCOrBuiltinID = ID; }
190 
191   /// \brief True if setNotBuiltin() was called.
hasRevertedBuiltin()192   bool hasRevertedBuiltin() const {
193     return ObjCOrBuiltinID == tok::NUM_OBJC_KEYWORDS;
194   }
195 
196   /// \brief Revert the identifier to a non-builtin identifier. We do this if
197   /// the name of a known builtin library function is used to declare that
198   /// function, but an unexpected type is specified.
revertBuiltin()199   void revertBuiltin() {
200     setBuiltinID(0);
201   }
202 
203   /// \brief Return a value indicating whether this is a builtin function.
204   ///
205   /// 0 is not-built-in.  1 is builtin-for-some-nonprimary-target.
206   /// 2+ are specific builtin functions.
getBuiltinID()207   unsigned getBuiltinID() const {
208     if (ObjCOrBuiltinID >= tok::NUM_OBJC_KEYWORDS)
209       return ObjCOrBuiltinID - tok::NUM_OBJC_KEYWORDS;
210     else
211       return 0;
212   }
setBuiltinID(unsigned ID)213   void setBuiltinID(unsigned ID) {
214     ObjCOrBuiltinID = ID + tok::NUM_OBJC_KEYWORDS;
215     assert(ObjCOrBuiltinID - unsigned(tok::NUM_OBJC_KEYWORDS) == ID
216            && "ID too large for field!");
217   }
218 
getObjCOrBuiltinID()219   unsigned getObjCOrBuiltinID() const { return ObjCOrBuiltinID; }
setObjCOrBuiltinID(unsigned ID)220   void setObjCOrBuiltinID(unsigned ID) { ObjCOrBuiltinID = ID; }
221 
222   /// get/setExtension - Initialize information about whether or not this
223   /// language token is an extension.  This controls extension warnings, and is
224   /// only valid if a custom token ID is set.
isExtensionToken()225   bool isExtensionToken() const { return IsExtension; }
setIsExtensionToken(bool Val)226   void setIsExtensionToken(bool Val) {
227     IsExtension = Val;
228     if (Val)
229       NeedsHandleIdentifier = 1;
230     else
231       RecomputeNeedsHandleIdentifier();
232   }
233 
234   /// is/setIsFutureCompatKeyword - Initialize information about whether or not
235   /// this language token is a keyword in a newer or proposed Standard. This
236   /// controls compatibility warnings, and is only true when not parsing the
237   /// corresponding Standard. Once a compatibility problem has been diagnosed
238   /// with this keyword, the flag will be cleared.
isFutureCompatKeyword()239   bool isFutureCompatKeyword() const { return IsFutureCompatKeyword; }
setIsFutureCompatKeyword(bool Val)240   void setIsFutureCompatKeyword(bool Val) {
241     IsFutureCompatKeyword = Val;
242     if (Val)
243       NeedsHandleIdentifier = 1;
244     else
245       RecomputeNeedsHandleIdentifier();
246   }
247 
248   /// setIsPoisoned - Mark this identifier as poisoned.  After poisoning, the
249   /// Preprocessor will emit an error every time this token is used.
250   void setIsPoisoned(bool Value = true) {
251     IsPoisoned = Value;
252     if (Value)
253       NeedsHandleIdentifier = 1;
254     else
255       RecomputeNeedsHandleIdentifier();
256   }
257 
258   /// \brief Return true if this token has been poisoned.
isPoisoned()259   bool isPoisoned() const { return IsPoisoned; }
260 
261   /// isCPlusPlusOperatorKeyword/setIsCPlusPlusOperatorKeyword controls whether
262   /// this identifier is a C++ alternate representation of an operator.
263   void setIsCPlusPlusOperatorKeyword(bool Val = true) {
264     IsCPPOperatorKeyword = Val;
265     if (Val)
266       NeedsHandleIdentifier = 1;
267     else
268       RecomputeNeedsHandleIdentifier();
269   }
isCPlusPlusOperatorKeyword()270   bool isCPlusPlusOperatorKeyword() const { return IsCPPOperatorKeyword; }
271 
272   /// \brief Return true if this token is a keyword in the specified language.
273   bool isKeyword(const LangOptions &LangOpts);
274 
275   /// getFETokenInfo/setFETokenInfo - The language front-end is allowed to
276   /// associate arbitrary metadata with this token.
277   template<typename T>
getFETokenInfo()278   T *getFETokenInfo() const { return static_cast<T*>(FETokenInfo); }
setFETokenInfo(void * T)279   void setFETokenInfo(void *T) { FETokenInfo = T; }
280 
281   /// \brief Return true if the Preprocessor::HandleIdentifier must be called
282   /// on a token of this identifier.
283   ///
284   /// If this returns false, we know that HandleIdentifier will not affect
285   /// the token.
isHandleIdentifierCase()286   bool isHandleIdentifierCase() const { return NeedsHandleIdentifier; }
287 
288   /// \brief Return true if the identifier in its current state was loaded
289   /// from an AST file.
isFromAST()290   bool isFromAST() const { return IsFromAST; }
291 
setIsFromAST()292   void setIsFromAST() { IsFromAST = true; }
293 
294   /// \brief Determine whether this identifier has changed since it was loaded
295   /// from an AST file.
hasChangedSinceDeserialization()296   bool hasChangedSinceDeserialization() const {
297     return ChangedAfterLoad;
298   }
299 
300   /// \brief Note that this identifier has changed since it was loaded from
301   /// an AST file.
setChangedSinceDeserialization()302   void setChangedSinceDeserialization() {
303     ChangedAfterLoad = true;
304   }
305 
306   /// \brief Determine whether the information for this identifier is out of
307   /// date with respect to the external source.
isOutOfDate()308   bool isOutOfDate() const { return OutOfDate; }
309 
310   /// \brief Set whether the information for this identifier is out of
311   /// date with respect to the external source.
setOutOfDate(bool OOD)312   void setOutOfDate(bool OOD) {
313     OutOfDate = OOD;
314     if (OOD)
315       NeedsHandleIdentifier = true;
316     else
317       RecomputeNeedsHandleIdentifier();
318   }
319 
320   /// \brief Determine whether this is the contextual keyword \c import.
isModulesImport()321   bool isModulesImport() const { return IsModulesImport; }
322 
323   /// \brief Set whether this identifier is the contextual keyword \c import.
setModulesImport(bool I)324   void setModulesImport(bool I) {
325     IsModulesImport = I;
326     if (I)
327       NeedsHandleIdentifier = true;
328     else
329       RecomputeNeedsHandleIdentifier();
330   }
331 
332   /// \brief Provide less than operator for lexicographical sorting.
333   bool operator<(const IdentifierInfo &RHS) const {
334     return getName() < RHS.getName();
335   }
336 
337 private:
338   /// The Preprocessor::HandleIdentifier does several special (but rare)
339   /// things to identifiers of various sorts.  For example, it changes the
340   /// \c for keyword token from tok::identifier to tok::for.
341   ///
342   /// This method is very tied to the definition of HandleIdentifier.  Any
343   /// change to it should be reflected here.
RecomputeNeedsHandleIdentifier()344   void RecomputeNeedsHandleIdentifier() {
345     NeedsHandleIdentifier =
346       (isPoisoned() | hasMacroDefinition() | isCPlusPlusOperatorKeyword() |
347        isExtensionToken() | isFutureCompatKeyword() || isOutOfDate() ||
348        isModulesImport());
349   }
350 };
351 
352 /// \brief An RAII object for [un]poisoning an identifier within a scope.
353 ///
354 /// \p II is allowed to be null, in which case objects of this type have
355 /// no effect.
356 class PoisonIdentifierRAIIObject {
357   IdentifierInfo *const II;
358   const bool OldValue;
359 public:
PoisonIdentifierRAIIObject(IdentifierInfo * II,bool NewValue)360   PoisonIdentifierRAIIObject(IdentifierInfo *II, bool NewValue)
361     : II(II), OldValue(II ? II->isPoisoned() : false) {
362     if(II)
363       II->setIsPoisoned(NewValue);
364   }
365 
~PoisonIdentifierRAIIObject()366   ~PoisonIdentifierRAIIObject() {
367     if(II)
368       II->setIsPoisoned(OldValue);
369   }
370 };
371 
372 /// \brief An iterator that walks over all of the known identifiers
373 /// in the lookup table.
374 ///
375 /// Since this iterator uses an abstract interface via virtual
376 /// functions, it uses an object-oriented interface rather than the
377 /// more standard C++ STL iterator interface. In this OO-style
378 /// iteration, the single function \c Next() provides dereference,
379 /// advance, and end-of-sequence checking in a single
380 /// operation. Subclasses of this iterator type will provide the
381 /// actual functionality.
382 class IdentifierIterator {
383 private:
384   IdentifierIterator(const IdentifierIterator &) = delete;
385   void operator=(const IdentifierIterator &) = delete;
386 
387 protected:
IdentifierIterator()388   IdentifierIterator() { }
389 
390 public:
391   virtual ~IdentifierIterator();
392 
393   /// \brief Retrieve the next string in the identifier table and
394   /// advances the iterator for the following string.
395   ///
396   /// \returns The next string in the identifier table. If there is
397   /// no such string, returns an empty \c StringRef.
398   virtual StringRef Next() = 0;
399 };
400 
401 /// \brief Provides lookups to, and iteration over, IdentiferInfo objects.
402 class IdentifierInfoLookup {
403 public:
404   virtual ~IdentifierInfoLookup();
405 
406   /// \brief Return the IdentifierInfo for the specified named identifier.
407   ///
408   /// Unlike the version in IdentifierTable, this returns a pointer instead
409   /// of a reference.  If the pointer is null then the IdentifierInfo cannot
410   /// be found.
411   virtual IdentifierInfo* get(StringRef Name) = 0;
412 
413   /// \brief Retrieve an iterator into the set of all identifiers
414   /// known to this identifier lookup source.
415   ///
416   /// This routine provides access to all of the identifiers known to
417   /// the identifier lookup, allowing access to the contents of the
418   /// identifiers without introducing the overhead of constructing
419   /// IdentifierInfo objects for each.
420   ///
421   /// \returns A new iterator into the set of known identifiers. The
422   /// caller is responsible for deleting this iterator.
423   virtual IdentifierIterator *getIdentifiers();
424 };
425 
426 /// \brief Implements an efficient mapping from strings to IdentifierInfo nodes.
427 ///
428 /// This has no other purpose, but this is an extremely performance-critical
429 /// piece of the code, as each occurrence of every identifier goes through
430 /// here when lexed.
431 class IdentifierTable {
432   // Shark shows that using MallocAllocator is *much* slower than using this
433   // BumpPtrAllocator!
434   typedef llvm::StringMap<IdentifierInfo*, llvm::BumpPtrAllocator> HashTableTy;
435   HashTableTy HashTable;
436 
437   IdentifierInfoLookup* ExternalLookup;
438 
439 public:
440   /// \brief Create the identifier table, populating it with info about the
441   /// language keywords for the language specified by \p LangOpts.
442   IdentifierTable(const LangOptions &LangOpts,
443                   IdentifierInfoLookup* externalLookup = nullptr);
444 
445   /// \brief Set the external identifier lookup mechanism.
setExternalIdentifierLookup(IdentifierInfoLookup * IILookup)446   void setExternalIdentifierLookup(IdentifierInfoLookup *IILookup) {
447     ExternalLookup = IILookup;
448   }
449 
450   /// \brief Retrieve the external identifier lookup object, if any.
getExternalIdentifierLookup()451   IdentifierInfoLookup *getExternalIdentifierLookup() const {
452     return ExternalLookup;
453   }
454 
getAllocator()455   llvm::BumpPtrAllocator& getAllocator() {
456     return HashTable.getAllocator();
457   }
458 
459   /// \brief Return the identifier token info for the specified named
460   /// identifier.
get(StringRef Name)461   IdentifierInfo &get(StringRef Name) {
462     auto &Entry = *HashTable.insert(std::make_pair(Name, nullptr)).first;
463 
464     IdentifierInfo *&II = Entry.second;
465     if (II) return *II;
466 
467     // No entry; if we have an external lookup, look there first.
468     if (ExternalLookup) {
469       II = ExternalLookup->get(Name);
470       if (II)
471         return *II;
472     }
473 
474     // Lookups failed, make a new IdentifierInfo.
475     void *Mem = getAllocator().Allocate<IdentifierInfo>();
476     II = new (Mem) IdentifierInfo();
477 
478     // Make sure getName() knows how to find the IdentifierInfo
479     // contents.
480     II->Entry = &Entry;
481 
482     return *II;
483   }
484 
get(StringRef Name,tok::TokenKind TokenCode)485   IdentifierInfo &get(StringRef Name, tok::TokenKind TokenCode) {
486     IdentifierInfo &II = get(Name);
487     II.TokenID = TokenCode;
488     assert(II.TokenID == (unsigned) TokenCode && "TokenCode too large");
489     return II;
490   }
491 
492   /// \brief Gets an IdentifierInfo for the given name without consulting
493   ///        external sources.
494   ///
495   /// This is a version of get() meant for external sources that want to
496   /// introduce or modify an identifier. If they called get(), they would
497   /// likely end up in a recursion.
getOwn(StringRef Name)498   IdentifierInfo &getOwn(StringRef Name) {
499     auto &Entry = *HashTable.insert(std::make_pair(Name, nullptr)).first;
500 
501     IdentifierInfo *&II = Entry.second;
502     if (II)
503       return *II;
504 
505     // Lookups failed, make a new IdentifierInfo.
506     void *Mem = getAllocator().Allocate<IdentifierInfo>();
507     II = new (Mem) IdentifierInfo();
508 
509     // Make sure getName() knows how to find the IdentifierInfo
510     // contents.
511     II->Entry = &Entry;
512 
513     // If this is the 'import' contextual keyword, mark it as such.
514     if (Name.equals("import"))
515       II->setModulesImport(true);
516 
517     return *II;
518   }
519 
520   typedef HashTableTy::const_iterator iterator;
521   typedef HashTableTy::const_iterator const_iterator;
522 
begin()523   iterator begin() const { return HashTable.begin(); }
end()524   iterator end() const   { return HashTable.end(); }
size()525   unsigned size() const { return HashTable.size(); }
526 
527   /// \brief Print some statistics to stderr that indicate how well the
528   /// hashing is doing.
529   void PrintStats() const;
530 
531   void AddKeywords(const LangOptions &LangOpts);
532 };
533 
534 /// \brief A family of Objective-C methods.
535 ///
536 /// These families have no inherent meaning in the language, but are
537 /// nonetheless central enough in the existing implementations to
538 /// merit direct AST support.  While, in theory, arbitrary methods can
539 /// be considered to form families, we focus here on the methods
540 /// involving allocation and retain-count management, as these are the
541 /// most "core" and the most likely to be useful to diverse clients
542 /// without extra information.
543 ///
544 /// Both selectors and actual method declarations may be classified
545 /// into families.  Method families may impose additional restrictions
546 /// beyond their selector name; for example, a method called '_init'
547 /// that returns void is not considered to be in the 'init' family
548 /// (but would be if it returned 'id').  It is also possible to
549 /// explicitly change or remove a method's family.  Therefore the
550 /// method's family should be considered the single source of truth.
551 enum ObjCMethodFamily {
552   /// \brief No particular method family.
553   OMF_None,
554 
555   // Selectors in these families may have arbitrary arity, may be
556   // written with arbitrary leading underscores, and may have
557   // additional CamelCase "words" in their first selector chunk
558   // following the family name.
559   OMF_alloc,
560   OMF_copy,
561   OMF_init,
562   OMF_mutableCopy,
563   OMF_new,
564 
565   // These families are singletons consisting only of the nullary
566   // selector with the given name.
567   OMF_autorelease,
568   OMF_dealloc,
569   OMF_finalize,
570   OMF_release,
571   OMF_retain,
572   OMF_retainCount,
573   OMF_self,
574   OMF_initialize,
575 
576   // performSelector families
577   OMF_performSelector
578 };
579 
580 /// Enough bits to store any enumerator in ObjCMethodFamily or
581 /// InvalidObjCMethodFamily.
582 enum { ObjCMethodFamilyBitWidth = 4 };
583 
584 /// \brief An invalid value of ObjCMethodFamily.
585 enum { InvalidObjCMethodFamily = (1 << ObjCMethodFamilyBitWidth) - 1 };
586 
587 /// \brief A family of Objective-C methods.
588 ///
589 /// These are family of methods whose result type is initially 'id', but
590 /// but are candidate for the result type to be changed to 'instancetype'.
591 enum ObjCInstanceTypeFamily {
592   OIT_None,
593   OIT_Array,
594   OIT_Dictionary,
595   OIT_Singleton,
596   OIT_Init,
597   OIT_ReturnsSelf
598 };
599 
600 enum ObjCStringFormatFamily {
601   SFF_None,
602   SFF_NSString,
603   SFF_CFString
604 };
605 
606 /// \brief Smart pointer class that efficiently represents Objective-C method
607 /// names.
608 ///
609 /// This class will either point to an IdentifierInfo or a
610 /// MultiKeywordSelector (which is private). This enables us to optimize
611 /// selectors that take no arguments and selectors that take 1 argument, which
612 /// accounts for 78% of all selectors in Cocoa.h.
613 class Selector {
614   friend class Diagnostic;
615 
616   enum IdentifierInfoFlag {
617     // Empty selector = 0.
618     ZeroArg  = 0x1,
619     OneArg   = 0x2,
620     MultiArg = 0x3,
621     ArgFlags = ZeroArg|OneArg
622   };
623   uintptr_t InfoPtr; // a pointer to the MultiKeywordSelector or IdentifierInfo.
624 
Selector(IdentifierInfo * II,unsigned nArgs)625   Selector(IdentifierInfo *II, unsigned nArgs) {
626     InfoPtr = reinterpret_cast<uintptr_t>(II);
627     assert((InfoPtr & ArgFlags) == 0 &&"Insufficiently aligned IdentifierInfo");
628     assert(nArgs < 2 && "nArgs not equal to 0/1");
629     InfoPtr |= nArgs+1;
630   }
Selector(MultiKeywordSelector * SI)631   Selector(MultiKeywordSelector *SI) {
632     InfoPtr = reinterpret_cast<uintptr_t>(SI);
633     assert((InfoPtr & ArgFlags) == 0 &&"Insufficiently aligned IdentifierInfo");
634     InfoPtr |= MultiArg;
635   }
636 
getAsIdentifierInfo()637   IdentifierInfo *getAsIdentifierInfo() const {
638     if (getIdentifierInfoFlag() < MultiArg)
639       return reinterpret_cast<IdentifierInfo *>(InfoPtr & ~ArgFlags);
640     return nullptr;
641   }
getMultiKeywordSelector()642   MultiKeywordSelector *getMultiKeywordSelector() const {
643     return reinterpret_cast<MultiKeywordSelector *>(InfoPtr & ~ArgFlags);
644   }
645 
getIdentifierInfoFlag()646   unsigned getIdentifierInfoFlag() const {
647     return InfoPtr & ArgFlags;
648   }
649 
650   static ObjCMethodFamily getMethodFamilyImpl(Selector sel);
651 
652   static ObjCStringFormatFamily getStringFormatFamilyImpl(Selector sel);
653 
654 public:
655   friend class SelectorTable; // only the SelectorTable can create these
656   friend class DeclarationName; // and the AST's DeclarationName.
657 
658   /// The default ctor should only be used when creating data structures that
659   ///  will contain selectors.
Selector()660   Selector() : InfoPtr(0) {}
Selector(uintptr_t V)661   Selector(uintptr_t V) : InfoPtr(V) {}
662 
663   /// operator==/!= - Indicate whether the specified selectors are identical.
664   bool operator==(Selector RHS) const {
665     return InfoPtr == RHS.InfoPtr;
666   }
667   bool operator!=(Selector RHS) const {
668     return InfoPtr != RHS.InfoPtr;
669   }
getAsOpaquePtr()670   void *getAsOpaquePtr() const {
671     return reinterpret_cast<void*>(InfoPtr);
672   }
673 
674   /// \brief Determine whether this is the empty selector.
isNull()675   bool isNull() const { return InfoPtr == 0; }
676 
677   // Predicates to identify the selector type.
isKeywordSelector()678   bool isKeywordSelector() const {
679     return getIdentifierInfoFlag() != ZeroArg;
680   }
isUnarySelector()681   bool isUnarySelector() const {
682     return getIdentifierInfoFlag() == ZeroArg;
683   }
684   unsigned getNumArgs() const;
685 
686 
687   /// \brief Retrieve the identifier at a given position in the selector.
688   ///
689   /// Note that the identifier pointer returned may be NULL. Clients that only
690   /// care about the text of the identifier string, and not the specific,
691   /// uniqued identifier pointer, should use \c getNameForSlot(), which returns
692   /// an empty string when the identifier pointer would be NULL.
693   ///
694   /// \param argIndex The index for which we want to retrieve the identifier.
695   /// This index shall be less than \c getNumArgs() unless this is a keyword
696   /// selector, in which case 0 is the only permissible value.
697   ///
698   /// \returns the uniqued identifier for this slot, or NULL if this slot has
699   /// no corresponding identifier.
700   IdentifierInfo *getIdentifierInfoForSlot(unsigned argIndex) const;
701 
702   /// \brief Retrieve the name at a given position in the selector.
703   ///
704   /// \param argIndex The index for which we want to retrieve the name.
705   /// This index shall be less than \c getNumArgs() unless this is a keyword
706   /// selector, in which case 0 is the only permissible value.
707   ///
708   /// \returns the name for this slot, which may be the empty string if no
709   /// name was supplied.
710   StringRef getNameForSlot(unsigned argIndex) const;
711 
712   /// \brief Derive the full selector name (e.g. "foo:bar:") and return
713   /// it as an std::string.
714   std::string getAsString() const;
715 
716   /// \brief Prints the full selector name (e.g. "foo:bar:").
717   void print(llvm::raw_ostream &OS) const;
718 
719   /// \brief Derive the conventional family of this method.
getMethodFamily()720   ObjCMethodFamily getMethodFamily() const {
721     return getMethodFamilyImpl(*this);
722   }
723 
getStringFormatFamily()724   ObjCStringFormatFamily getStringFormatFamily() const {
725     return getStringFormatFamilyImpl(*this);
726   }
727 
getEmptyMarker()728   static Selector getEmptyMarker() {
729     return Selector(uintptr_t(-1));
730   }
getTombstoneMarker()731   static Selector getTombstoneMarker() {
732     return Selector(uintptr_t(-2));
733   }
734 
735   static ObjCInstanceTypeFamily getInstTypeMethodFamily(Selector sel);
736 };
737 
738 /// \brief This table allows us to fully hide how we implement
739 /// multi-keyword caching.
740 class SelectorTable {
741   void *Impl;  // Actually a SelectorTableImpl
742   SelectorTable(const SelectorTable &) = delete;
743   void operator=(const SelectorTable &) = delete;
744 public:
745   SelectorTable();
746   ~SelectorTable();
747 
748   /// \brief Can create any sort of selector.
749   ///
750   /// \p NumArgs indicates whether this is a no argument selector "foo", a
751   /// single argument selector "foo:" or multi-argument "foo:bar:".
752   Selector getSelector(unsigned NumArgs, IdentifierInfo **IIV);
753 
getUnarySelector(IdentifierInfo * ID)754   Selector getUnarySelector(IdentifierInfo *ID) {
755     return Selector(ID, 1);
756   }
getNullarySelector(IdentifierInfo * ID)757   Selector getNullarySelector(IdentifierInfo *ID) {
758     return Selector(ID, 0);
759   }
760 
761   /// \brief Return the total amount of memory allocated for managing selectors.
762   size_t getTotalMemory() const;
763 
764   /// \brief Return the default setter name for the given identifier.
765   ///
766   /// This is "set" + \p Name where the initial character of \p Name
767   /// has been capitalized.
768   static SmallString<64> constructSetterName(StringRef Name);
769 
770   /// \brief Return the default setter selector for the given identifier.
771   ///
772   /// This is "set" + \p Name where the initial character of \p Name
773   /// has been capitalized.
774   static Selector constructSetterSelector(IdentifierTable &Idents,
775                                           SelectorTable &SelTable,
776                                           const IdentifierInfo *Name);
777 };
778 
779 /// DeclarationNameExtra - Common base of the MultiKeywordSelector,
780 /// CXXSpecialName, and CXXOperatorIdName classes, all of which are
781 /// private classes that describe different kinds of names.
782 class DeclarationNameExtra {
783 public:
784   /// ExtraKind - The kind of "extra" information stored in the
785   /// DeclarationName. See @c ExtraKindOrNumArgs for an explanation of
786   /// how these enumerator values are used.
787   enum ExtraKind {
788     CXXConstructor = 0,
789     CXXDestructor,
790     CXXConversionFunction,
791 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
792     CXXOperator##Name,
793 #include "clang/Basic/OperatorKinds.def"
794     CXXLiteralOperator,
795     CXXUsingDirective,
796     NUM_EXTRA_KINDS
797   };
798 
799   /// ExtraKindOrNumArgs - Either the kind of C++ special name or
800   /// operator-id (if the value is one of the CXX* enumerators of
801   /// ExtraKind), in which case the DeclarationNameExtra is also a
802   /// CXXSpecialName, (for CXXConstructor, CXXDestructor, or
803   /// CXXConversionFunction) CXXOperatorIdName, or CXXLiteralOperatorName,
804   /// it may be also name common to C++ using-directives (CXXUsingDirective),
805   /// otherwise it is NUM_EXTRA_KINDS+NumArgs, where NumArgs is the number of
806   /// arguments in the Objective-C selector, in which case the
807   /// DeclarationNameExtra is also a MultiKeywordSelector.
808   unsigned ExtraKindOrNumArgs;
809 };
810 
811 }  // end namespace clang
812 
813 namespace llvm {
814 /// Define DenseMapInfo so that Selectors can be used as keys in DenseMap and
815 /// DenseSets.
816 template <>
817 struct DenseMapInfo<clang::Selector> {
818   static inline clang::Selector getEmptyKey() {
819     return clang::Selector::getEmptyMarker();
820   }
821   static inline clang::Selector getTombstoneKey() {
822     return clang::Selector::getTombstoneMarker();
823   }
824 
825   static unsigned getHashValue(clang::Selector S);
826 
827   static bool isEqual(clang::Selector LHS, clang::Selector RHS) {
828     return LHS == RHS;
829   }
830 };
831 
832 template <>
833 struct isPodLike<clang::Selector> { static const bool value = true; };
834 
835 template <typename T> class PointerLikeTypeTraits;
836 
837 template<>
838 class PointerLikeTypeTraits<clang::Selector> {
839 public:
840   static inline const void *getAsVoidPointer(clang::Selector P) {
841     return P.getAsOpaquePtr();
842   }
843   static inline clang::Selector getFromVoidPointer(const void *P) {
844     return clang::Selector(reinterpret_cast<uintptr_t>(P));
845   }
846   enum { NumLowBitsAvailable = 0 };
847 };
848 
849 // Provide PointerLikeTypeTraits for IdentifierInfo pointers, which
850 // are not guaranteed to be 8-byte aligned.
851 template<>
852 class PointerLikeTypeTraits<clang::IdentifierInfo*> {
853 public:
854   static inline void *getAsVoidPointer(clang::IdentifierInfo* P) {
855     return P;
856   }
857   static inline clang::IdentifierInfo *getFromVoidPointer(void *P) {
858     return static_cast<clang::IdentifierInfo*>(P);
859   }
860   enum { NumLowBitsAvailable = 1 };
861 };
862 
863 template<>
864 class PointerLikeTypeTraits<const clang::IdentifierInfo*> {
865 public:
866   static inline const void *getAsVoidPointer(const clang::IdentifierInfo* P) {
867     return P;
868   }
869   static inline const clang::IdentifierInfo *getFromVoidPointer(const void *P) {
870     return static_cast<const clang::IdentifierInfo*>(P);
871   }
872   enum { NumLowBitsAvailable = 1 };
873 };
874 
875 }  // end namespace llvm
876 #endif
877