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