[clang] [clang][NFC] Refactor `Selector` to use `PointerIntPair` inside (PR #69916)
Aaron Ballman via cfe-commits
cfe-commits at lists.llvm.org
Tue Oct 24 05:24:38 PDT 2023
================
@@ -809,43 +927,42 @@ class Selector {
enum IdentifierInfoFlag {
// Empty selector = 0. Note that these enumeration values must
// correspond to the enumeration values of DeclarationName::StoredNameKind
- ZeroArg = 0x01,
- OneArg = 0x02,
+ ZeroArg = 0x01,
+ OneArg = 0x02,
MultiArg = 0x07,
- ArgFlags = 0x07
};
/// A pointer to the MultiKeywordSelector or IdentifierInfo. We use the low
- /// three bits of InfoPtr to store an IdentifierInfoFlag. Note that in any
+ /// three bits of InfoPtr to store an IdentifierInfoFlag, but the highest
+ /// of them is also a discriminator for pointer type. Note that in any
/// case IdentifierInfo and MultiKeywordSelector are already aligned to
/// 8 bytes even on 32 bits archs because of DeclarationName.
- uintptr_t InfoPtr = 0;
+ llvm::PointerIntPair<
+ llvm::PointerUnion<IdentifierInfo *, MultiKeywordSelector *>, 2>
+ InfoPtr;
Selector(IdentifierInfo *II, unsigned nArgs) {
- InfoPtr = reinterpret_cast<uintptr_t>(II);
- assert((InfoPtr & ArgFlags) == 0 &&"Insufficiently aligned IdentifierInfo");
assert(nArgs < 2 && "nArgs not equal to 0/1");
- InfoPtr |= nArgs+1;
+ InfoPtr.setPointerAndInt(II, nArgs + 1);
}
Selector(MultiKeywordSelector *SI) {
- InfoPtr = reinterpret_cast<uintptr_t>(SI);
- assert((InfoPtr & ArgFlags) == 0 &&"Insufficiently aligned IdentifierInfo");
- InfoPtr |= MultiArg;
+ InfoPtr.setPointerAndInt(SI, MultiArg & 0b11);
----------------
AaronBallman wrote:
It's a bit strange to me that `MultiArg` is 0x7 and not 0x3 to begin with; are we able to reorder `DeclarationName::StoredNameKind` such that `StoredDeclarationNameExtra` is value 3 and then we can shave a bit off from the value of `MultiArg` and not have to do this odd masking here?
https://github.com/llvm/llvm-project/pull/69916
More information about the cfe-commits
mailing list