Skip to content

Commit 93a586f

Browse files
committed
Synchronize the representations of DeclarationName and Selector so
that bridging between the two is free. Saves ~4k of code size, although I don't see any measurable performance difference (unfortunately). llvm-svn: 156187
1 parent 06a48a6 commit 93a586f

File tree

4 files changed

+31
-61
lines changed

4 files changed

+31
-61
lines changed

clang/include/clang/AST/DeclarationName.h

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,14 @@ class DeclarationName {
5858
private:
5959
/// StoredNameKind - The kind of name that is actually stored in the
6060
/// upper bits of the Ptr field. This is only used internally.
61+
///
62+
/// Note: The entries here are synchronized with the entries in Selector,
63+
/// for efficient translation between the two.
6164
enum StoredNameKind {
6265
StoredIdentifier = 0,
63-
StoredObjCZeroArgSelector,
64-
StoredObjCOneArgSelector,
65-
StoredDeclarationNameExtra,
66+
StoredObjCZeroArgSelector = 0x01,
67+
StoredObjCOneArgSelector = 0x02,
68+
StoredDeclarationNameExtra = 0x03,
6669
PtrMask = 0x03
6770
};
6871

@@ -174,7 +177,7 @@ class DeclarationName {
174177
}
175178

176179
// Construct a declaration name from an Objective-C selector.
177-
DeclarationName(Selector Sel);
180+
DeclarationName(Selector Sel) : Ptr(Sel.InfoPtr) { }
178181

179182
/// getUsingDirectiveName - Return name for all using-directives.
180183
static DeclarationName getUsingDirectiveName();
@@ -257,7 +260,13 @@ class DeclarationName {
257260

258261
/// getObjCSelector - Get the Objective-C selector stored in this
259262
/// declaration name.
260-
Selector getObjCSelector() const;
263+
Selector getObjCSelector() const {
264+
assert((getNameKind() == ObjCZeroArgSelector ||
265+
getNameKind() == ObjCOneArgSelector ||
266+
getNameKind() == ObjCMultiArgSelector ||
267+
Ptr == 0) && "Not a selector!");
268+
return Selector(Ptr);
269+
}
261270

262271
/// getFETokenInfo/setFETokenInfo - The language front-end is
263272
/// allowed to associate arbitrary metadata with some kinds of

clang/include/clang/Basic/IdentifierTable.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -574,9 +574,10 @@ class Selector {
574574
friend class Diagnostic;
575575

576576
enum IdentifierInfoFlag {
577-
// MultiKeywordSelector = 0.
577+
// Empty selector = 0.
578578
ZeroArg = 0x1,
579579
OneArg = 0x2,
580+
MultiArg = 0x3,
580581
ArgFlags = ZeroArg|OneArg
581582
};
582583
uintptr_t InfoPtr; // a pointer to the MultiKeywordSelector or IdentifierInfo.
@@ -590,13 +591,18 @@ class Selector {
590591
Selector(MultiKeywordSelector *SI) {
591592
InfoPtr = reinterpret_cast<uintptr_t>(SI);
592593
assert((InfoPtr & ArgFlags) == 0 &&"Insufficiently aligned IdentifierInfo");
594+
InfoPtr |= MultiArg;
593595
}
594596

595597
IdentifierInfo *getAsIdentifierInfo() const {
596-
if (getIdentifierInfoFlag())
598+
if (getIdentifierInfoFlag() < MultiArg)
597599
return reinterpret_cast<IdentifierInfo *>(InfoPtr & ~ArgFlags);
598600
return 0;
599601
}
602+
MultiKeywordSelector *getMultiKeywordSelector() const {
603+
return reinterpret_cast<MultiKeywordSelector *>(InfoPtr & ~ArgFlags);
604+
}
605+
600606
unsigned getIdentifierInfoFlag() const {
601607
return InfoPtr & ArgFlags;
602608
}

clang/lib/AST/DeclarationName.cpp

Lines changed: 0 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -135,33 +135,6 @@ int DeclarationName::compare(DeclarationName LHS, DeclarationName RHS) {
135135

136136
} // end namespace clang
137137

138-
DeclarationName::DeclarationName(Selector Sel) {
139-
if (!Sel.getAsOpaquePtr()) {
140-
Ptr = 0;
141-
return;
142-
}
143-
144-
switch (Sel.getNumArgs()) {
145-
case 0:
146-
Ptr = reinterpret_cast<uintptr_t>(Sel.getAsIdentifierInfo());
147-
assert((Ptr & PtrMask) == 0 && "Improperly aligned IdentifierInfo");
148-
Ptr |= StoredObjCZeroArgSelector;
149-
break;
150-
151-
case 1:
152-
Ptr = reinterpret_cast<uintptr_t>(Sel.getAsIdentifierInfo());
153-
assert((Ptr & PtrMask) == 0 && "Improperly aligned IdentifierInfo");
154-
Ptr |= StoredObjCOneArgSelector;
155-
break;
156-
157-
default:
158-
Ptr = Sel.InfoPtr & ~Selector::ArgFlags;
159-
assert((Ptr & PtrMask) == 0 && "Improperly aligned MultiKeywordSelector");
160-
Ptr |= StoredDeclarationNameExtra;
161-
break;
162-
}
163-
}
164-
165138
DeclarationName::NameKind DeclarationName::getNameKind() const {
166139
switch (getStoredNameKind()) {
167140
case StoredIdentifier: return Identifier;
@@ -305,24 +278,6 @@ IdentifierInfo *DeclarationName::getCXXLiteralIdentifier() const {
305278
return 0;
306279
}
307280

308-
Selector DeclarationName::getObjCSelector() const {
309-
switch (getNameKind()) {
310-
case ObjCZeroArgSelector:
311-
return Selector(reinterpret_cast<IdentifierInfo *>(Ptr & ~PtrMask), 0);
312-
313-
case ObjCOneArgSelector:
314-
return Selector(reinterpret_cast<IdentifierInfo *>(Ptr & ~PtrMask), 1);
315-
316-
case ObjCMultiArgSelector:
317-
return Selector(reinterpret_cast<MultiKeywordSelector *>(Ptr & ~PtrMask));
318-
319-
default:
320-
break;
321-
}
322-
323-
return Selector();
324-
}
325-
326281
void *DeclarationName::getFETokenInfoAsVoidSlow() const {
327282
switch (getNameKind()) {
328283
case Identifier:

clang/lib/Basic/IdentifierTable.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -335,22 +335,22 @@ class MultiKeywordSelector
335335

336336
unsigned Selector::getNumArgs() const {
337337
unsigned IIF = getIdentifierInfoFlag();
338-
if (IIF == ZeroArg)
338+
if (IIF <= ZeroArg)
339339
return 0;
340340
if (IIF == OneArg)
341341
return 1;
342-
// We point to a MultiKeywordSelector (pointer doesn't contain any flags).
343-
MultiKeywordSelector *SI = reinterpret_cast<MultiKeywordSelector *>(InfoPtr);
342+
// We point to a MultiKeywordSelector.
343+
MultiKeywordSelector *SI = getMultiKeywordSelector();
344344
return SI->getNumArgs();
345345
}
346346

347347
IdentifierInfo *Selector::getIdentifierInfoForSlot(unsigned argIndex) const {
348-
if (getIdentifierInfoFlag()) {
348+
if (getIdentifierInfoFlag() < MultiArg) {
349349
assert(argIndex == 0 && "illegal keyword index");
350350
return getAsIdentifierInfo();
351351
}
352-
// We point to a MultiKeywordSelector (pointer doesn't contain any flags).
353-
MultiKeywordSelector *SI = reinterpret_cast<MultiKeywordSelector *>(InfoPtr);
352+
// We point to a MultiKeywordSelector.
353+
MultiKeywordSelector *SI = getMultiKeywordSelector();
354354
return SI->getIdentifierInfoForSlot(argIndex);
355355
}
356356

@@ -375,7 +375,7 @@ std::string Selector::getAsString() const {
375375
if (InfoPtr == 0)
376376
return "<null selector>";
377377

378-
if (InfoPtr & ArgFlags) {
378+
if (getIdentifierInfoFlag() < MultiArg) {
379379
IdentifierInfo *II = getAsIdentifierInfo();
380380

381381
// If the number of arguments is 0 then II is guaranteed to not be null.
@@ -388,8 +388,8 @@ std::string Selector::getAsString() const {
388388
return II->getName().str() + ":";
389389
}
390390

391-
// We have a multiple keyword selector (no embedded flags).
392-
return reinterpret_cast<MultiKeywordSelector *>(InfoPtr)->getName();
391+
// We have a multiple keyword selector.
392+
return getMultiKeywordSelector()->getName();
393393
}
394394

395395
/// Interpreting the given string using the normal CamelCase

0 commit comments

Comments
 (0)