diff options
Diffstat (limited to 'include/llvm/ExecutionEngine/Orc/SymbolStringPool.h')
-rw-r--r-- | include/llvm/ExecutionEngine/Orc/SymbolStringPool.h | 85 |
1 files changed, 54 insertions, 31 deletions
diff --git a/include/llvm/ExecutionEngine/Orc/SymbolStringPool.h b/include/llvm/ExecutionEngine/Orc/SymbolStringPool.h index 717076e25609..c354f6c3559c 100644 --- a/include/llvm/ExecutionEngine/Orc/SymbolStringPool.h +++ b/include/llvm/ExecutionEngine/Orc/SymbolStringPool.h @@ -1,9 +1,8 @@ //===- SymbolStringPool.h - Multi-threaded pool for JIT symbols -*- C++ -*-===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // @@ -51,25 +50,20 @@ private: class SymbolStringPtr { friend class SymbolStringPool; friend struct DenseMapInfo<SymbolStringPtr>; - friend bool operator==(const SymbolStringPtr &LHS, - const SymbolStringPtr &RHS); - friend bool operator<(const SymbolStringPtr &LHS, const SymbolStringPtr &RHS); - - static SymbolStringPool::PoolMapEntry Tombstone; public: SymbolStringPtr() = default; SymbolStringPtr(const SymbolStringPtr &Other) : S(Other.S) { - if (S) + if (isRealPoolEntry(S)) ++S->getValue(); } SymbolStringPtr& operator=(const SymbolStringPtr &Other) { - if (S) + if (isRealPoolEntry(S)) --S->getValue(); S = Other.S; - if (S) + if (isRealPoolEntry(S)) ++S->getValue(); return *this; } @@ -79,7 +73,7 @@ public: } SymbolStringPtr& operator=(SymbolStringPtr &&Other) { - if (S) + if (isRealPoolEntry(S)) --S->getValue(); S = nullptr; std::swap(S, Other.S); @@ -87,34 +81,64 @@ public: } ~SymbolStringPtr() { - if (S) + if (isRealPoolEntry(S)) --S->getValue(); } StringRef operator*() const { return S->first(); } + friend bool operator==(const SymbolStringPtr &LHS, + const SymbolStringPtr &RHS) { + return LHS.S == RHS.S; + } + + friend bool operator!=(const SymbolStringPtr &LHS, + const SymbolStringPtr &RHS) { + return !(LHS == RHS); + } + + friend bool operator<(const SymbolStringPtr &LHS, + const SymbolStringPtr &RHS) { + return LHS.S < RHS.S; + } + private: + using PoolEntryPtr = SymbolStringPool::PoolMapEntry *; SymbolStringPtr(SymbolStringPool::PoolMapEntry *S) : S(S) { - if (S) + if (isRealPoolEntry(S)) ++S->getValue(); } - SymbolStringPool::PoolMapEntry *S = nullptr; -}; + // Returns false for null, empty, and tombstone values, true otherwise. + bool isRealPoolEntry(PoolEntryPtr P) { + return ((reinterpret_cast<uintptr_t>(P) - 1) & InvalidPtrMask) != + InvalidPtrMask; + } -inline bool operator==(const SymbolStringPtr &LHS, const SymbolStringPtr &RHS) { - return LHS.S == RHS.S; -} + static SymbolStringPtr getEmptyVal() { + return SymbolStringPtr(reinterpret_cast<PoolEntryPtr>(EmptyBitPattern)); + } -inline bool operator!=(const SymbolStringPtr &LHS, const SymbolStringPtr &RHS) { - return !(LHS == RHS); -} + static SymbolStringPtr getTombstoneVal() { + return SymbolStringPtr(reinterpret_cast<PoolEntryPtr>(TombstoneBitPattern)); + } -inline bool operator<(const SymbolStringPtr &LHS, const SymbolStringPtr &RHS) { - return LHS.S < RHS.S; -} + constexpr static uintptr_t EmptyBitPattern = + std::numeric_limits<uintptr_t>::max() + << PointerLikeTypeTraits<PoolEntryPtr>::NumLowBitsAvailable; + + constexpr static uintptr_t TombstoneBitPattern = + (std::numeric_limits<uintptr_t>::max() - 1) + << PointerLikeTypeTraits<PoolEntryPtr>::NumLowBitsAvailable; + + constexpr static uintptr_t InvalidPtrMask = + (std::numeric_limits<uintptr_t>::max() - 3) + << PointerLikeTypeTraits<PoolEntryPtr>::NumLowBitsAvailable; + + PoolEntryPtr S = nullptr; +}; inline SymbolStringPool::~SymbolStringPool() { #ifndef NDEBUG @@ -151,16 +175,15 @@ template <> struct DenseMapInfo<orc::SymbolStringPtr> { static orc::SymbolStringPtr getEmptyKey() { - return orc::SymbolStringPtr(); + return orc::SymbolStringPtr::getEmptyVal(); } static orc::SymbolStringPtr getTombstoneKey() { - return orc::SymbolStringPtr(&orc::SymbolStringPtr::Tombstone); + return orc::SymbolStringPtr::getTombstoneVal(); } - static unsigned getHashValue(orc::SymbolStringPtr V) { - uintptr_t IV = reinterpret_cast<uintptr_t>(V.S); - return unsigned(IV) ^ unsigned(IV >> 9); + static unsigned getHashValue(const orc::SymbolStringPtr &V) { + return DenseMapInfo<orc::SymbolStringPtr::PoolEntryPtr>::getHashValue(V.S); } static bool isEqual(const orc::SymbolStringPtr &LHS, |