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