summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2008-11-06 16:32:23 +0000
committerDouglas Gregor <dgregor@apple.com>2008-11-06 16:32:23 +0000
commit2ad7ee9145080b7227d452c815fcbd0591d15f89 (patch)
tree6ffc90bc30ba5a56fb885b638fe92bf613e16d3e /clang
parent2817338558506b364701bf65ff8137b013b3a31c (diff)
downloadbcm5719-llvm-2ad7ee9145080b7227d452c815fcbd0591d15f89.tar.gz
bcm5719-llvm-2ad7ee9145080b7227d452c815fcbd0591d15f89.zip
Reclaim some bits in IdentifierInfo, for later use as overloaded operator names.
llvm-svn: 58806
Diffstat (limited to 'clang')
-rw-r--r--clang/include/clang/Basic/IdentifierTable.h28
-rw-r--r--clang/lib/Basic/IdentifierTable.cpp3
2 files changed, 20 insertions, 11 deletions
diff --git a/clang/include/clang/Basic/IdentifierTable.h b/clang/include/clang/Basic/IdentifierTable.h
index fc32b4d7d36..acdf3dae8f6 100644
--- a/clang/include/clang/Basic/IdentifierTable.h
+++ b/clang/include/clang/Basic/IdentifierTable.h
@@ -45,14 +45,15 @@ class IdentifierInfo {
// Note: DON'T make TokenID a 'tok::TokenKind'; MSVC will treat it as a
// signed char and TokenKinds > 127 won't be handled correctly.
unsigned TokenID : 8; // Front-end token ID or tok::identifier.
- unsigned BuiltinID :10; // ID if this is a builtin (__builtin_inf).
- // NOTE: VC++ treats enums as signed, avoid using tok::ObjCKeywordKind enum
- unsigned ObjCID : 5; // ID for objc @ keyword like @'protocol'.
+ // Objective-C keyword ('protocol' in '@protocol') or builtin (__builtin_inf).
+ // First NUM_OBJC_KEYWORDS values are for Objective-C, the remaining values
+ // are for builtins.
+ unsigned ObjCOrBuiltinID :10;
bool HasMacro : 1; // True if there is a #define for this.
bool IsExtension : 1; // True if identifier is a lang extension.
bool IsPoisoned : 1; // True if identifier is poisoned.
bool IsCPPOperatorKeyword : 1; // True if ident is a C++ operator keyword.
- // 5 bits left in 32-bit word.
+ // 10 bits left in 32-bit word.
void *FETokenInfo; // Managed by the language front-end.
IdentifierInfo(const IdentifierInfo&); // NONCOPYABLE.
void operator=(const IdentifierInfo&); // NONASSIGNABLE.
@@ -97,17 +98,26 @@ public:
/// identifier. For example, 'class' will return tok::objc_class if ObjC is
/// enabled.
tok::ObjCKeywordKind getObjCKeywordID() const {
- return tok::ObjCKeywordKind(ObjCID);
+ if (ObjCOrBuiltinID < tok::NUM_OBJC_KEYWORDS)
+ return tok::ObjCKeywordKind(ObjCOrBuiltinID);
+ else
+ return tok::objc_not_keyword;
}
- void setObjCKeywordID(tok::ObjCKeywordKind ID) { ObjCID = ID; }
+ void setObjCKeywordID(tok::ObjCKeywordKind ID) { ObjCOrBuiltinID = ID; }
/// getBuiltinID - Return a value indicating whether this is a builtin
/// function. 0 is not-built-in. 1 is builtin-for-some-nonprimary-target.
/// 2+ are specific builtin functions.
- unsigned getBuiltinID() const { return BuiltinID; }
+ unsigned getBuiltinID() const {
+ if (ObjCOrBuiltinID >= tok::NUM_OBJC_KEYWORDS)
+ return ObjCOrBuiltinID - tok::NUM_OBJC_KEYWORDS;
+ else
+ return 0;
+ }
void setBuiltinID(unsigned ID) {
- BuiltinID = ID;
- assert(BuiltinID == ID && "ID too large for field!");
+ ObjCOrBuiltinID = ID + tok::NUM_OBJC_KEYWORDS;
+ assert(ObjCOrBuiltinID - tok::NUM_OBJC_KEYWORDS == ID
+ && "ID too large for field!");
}
/// get/setExtension - Initialize information about whether or not this
diff --git a/clang/lib/Basic/IdentifierTable.cpp b/clang/lib/Basic/IdentifierTable.cpp
index e650993bd04..8f0387e99e6 100644
--- a/clang/lib/Basic/IdentifierTable.cpp
+++ b/clang/lib/Basic/IdentifierTable.cpp
@@ -27,8 +27,7 @@ using namespace clang;
IdentifierInfo::IdentifierInfo() {
TokenID = tok::identifier;
- ObjCID = tok::objc_not_keyword;
- BuiltinID = 0;
+ ObjCOrBuiltinID = 0;
HasMacro = false;
IsExtension = false;
IsPoisoned = false;
OpenPOWER on IntegriCloud