diff --git a/include/llvm/ADT/BitVector.h b/include/llvm/ADT/BitVector.h index 661437126d4..cf3756d0d9c 100644 --- a/include/llvm/ADT/BitVector.h +++ b/include/llvm/ADT/BitVector.h @@ -21,6 +21,7 @@ #include #include #include +#include namespace llvm { @@ -45,14 +46,13 @@ public: BitWord *WordRef; unsigned BitPos; - reference(); // Undefined - public: reference(BitVector &b, unsigned Idx) { WordRef = &b.Bits[Idx / BITWORD_SIZE]; BitPos = Idx % BITWORD_SIZE; } + reference() = delete; reference(const reference&) = default; reference &operator=(reference t) { diff --git a/include/llvm/ADT/ImmutableList.h b/include/llvm/ADT/ImmutableList.h index a1d26bd9704..e5f51bafe99 100644 --- a/include/llvm/ADT/ImmutableList.h +++ b/include/llvm/ADT/ImmutableList.h @@ -16,8 +16,9 @@ #include "llvm/ADT/FoldingSet.h" #include "llvm/Support/Allocator.h" -#include "llvm/Support/DataTypes.h" #include +#include +#include namespace llvm { @@ -25,18 +26,18 @@ template class ImmutableListFactory; template class ImmutableListImpl : public FoldingSetNode { + friend class ImmutableListFactory; + T Head; const ImmutableListImpl* Tail; ImmutableListImpl(const T& head, const ImmutableListImpl* tail = nullptr) : Head(head), Tail(tail) {} - friend class ImmutableListFactory; - - void operator=(const ImmutableListImpl&) = delete; - ImmutableListImpl(const ImmutableListImpl&) = delete; - public: + ImmutableListImpl(const ImmutableListImpl &) = delete; + ImmutableListImpl &operator=(const ImmutableListImpl &) = delete; + const T& getHead() const { return Head; } const ImmutableListImpl* getTail() const { return Tail; } @@ -79,15 +80,17 @@ public: } class iterator { - const ImmutableListImpl* L; + const ImmutableListImpl* L = nullptr; + public: - iterator() : L(nullptr) {} + iterator() = default; iterator(ImmutableList l) : L(l.getInternalPointer()) {} iterator& operator++() { L = L->getTail(); return *this; } bool operator==(const iterator& I) const { return L == I.L; } bool operator!=(const iterator& I) const { return L != I.L; } const value_type& operator*() const { return L->getHead(); } + ImmutableList getList() const { return L; } }; @@ -121,7 +124,7 @@ public: /// getHead - Returns the head of the list. const T& getHead() { - assert (!isEmpty() && "Cannot get the head of an empty list."); + assert(!isEmpty() && "Cannot get the head of an empty list."); return X->getHead(); } @@ -145,7 +148,7 @@ class ImmutableListFactory { uintptr_t Allocator; bool ownsAllocator() const { - return Allocator & 0x1 ? false : true; + return (Allocator & 0x1) == 0; } BumpPtrAllocator& getAllocator() const { @@ -203,18 +206,21 @@ public: //===----------------------------------------------------------------------===// template struct DenseMapInfo; -template struct DenseMapInfo > { +template struct DenseMapInfo> { static inline ImmutableList getEmptyKey() { return reinterpret_cast*>(-1); } + static inline ImmutableList getTombstoneKey() { return reinterpret_cast*>(-2); } + static unsigned getHashValue(ImmutableList X) { uintptr_t PtrVal = reinterpret_cast(X.getInternalPointer()); return (unsigned((uintptr_t)PtrVal) >> 4) ^ (unsigned((uintptr_t)PtrVal) >> 9); } + static bool isEqual(ImmutableList X1, ImmutableList X2) { return X1 == X2; } @@ -222,8 +228,8 @@ template struct DenseMapInfo > { template struct isPodLike; template -struct isPodLike > { static const bool value = true; }; +struct isPodLike> { static const bool value = true; }; -} // end llvm namespace +} // end namespace llvm #endif // LLVM_ADT_IMMUTABLELIST_H diff --git a/include/llvm/ADT/ImmutableMap.h b/include/llvm/ADT/ImmutableMap.h index 7480cd73da6..f197d407ba3 100644 --- a/include/llvm/ADT/ImmutableMap.h +++ b/include/llvm/ADT/ImmutableMap.h @@ -14,7 +14,10 @@ #ifndef LLVM_ADT_IMMUTABLEMAP_H #define LLVM_ADT_IMMUTABLEMAP_H +#include "llvm/ADT/FoldingSet.h" #include "llvm/ADT/ImmutableSet.h" +#include "llvm/Support/Allocator.h" +#include namespace llvm { @@ -56,7 +59,7 @@ struct ImutKeyValueInfo { }; template > + typename ValInfo = ImutKeyValueInfo> class ImmutableMap { public: typedef typename ValInfo::value_type value_type; @@ -106,6 +109,9 @@ public: Factory(BumpPtrAllocator &Alloc, bool canonicalize = true) : F(Alloc), Canonicalize(canonicalize) {} + Factory(const Factory &) = delete; + Factory &operator=(const Factory &) = delete; + ImmutableMap getEmptyMap() { return ImmutableMap(F.getEmptyTree()); } ImmutableMap add(ImmutableMap Old, key_type_ref K, data_type_ref D) { @@ -121,10 +127,6 @@ public: typename TreeTy::Factory *getTreeFactory() const { return const_cast(&F); } - - private: - Factory(const Factory& RHS) = delete; - void operator=(const Factory& RHS) = delete; }; bool contains(key_type_ref K) const { @@ -203,9 +205,10 @@ public: //===--------------------------------------------------===// class iterator : public ImutAVLValueIterator { + friend class ImmutableMap; + iterator() = default; explicit iterator(TreeTy *Tree) : iterator::ImutAVLValueIterator(Tree) {} - friend class ImmutableMap; public: key_type_ref getKey() const { return (*this)->first; } @@ -248,7 +251,7 @@ public: // NOTE: This will possibly become the new implementation of ImmutableMap some day. template > +typename ValInfo = ImutKeyValueInfo> class ImmutableMapRef { public: typedef typename ValInfo::value_type value_type; @@ -362,9 +365,10 @@ public: //===--------------------------------------------------===// class iterator : public ImutAVLValueIterator { + friend class ImmutableMapRef; + iterator() = default; explicit iterator(TreeTy *Tree) : iterator::ImutAVLValueIterator(Tree) {} - friend class ImmutableMapRef; public: key_type_ref getKey() const { return (*this)->first; } diff --git a/include/llvm/ADT/PackedVector.h b/include/llvm/ADT/PackedVector.h index 09267173fd7..8f925f1ff5c 100644 --- a/include/llvm/ADT/PackedVector.h +++ b/include/llvm/ADT/PackedVector.h @@ -15,6 +15,7 @@ #define LLVM_ADT_PACKEDVECTOR_H #include "llvm/ADT/BitVector.h" +#include #include namespace llvm { @@ -83,14 +84,15 @@ public: PackedVector &Vec; const unsigned Idx; - reference(); // Undefined public: + reference() = delete; reference(PackedVector &vec, unsigned idx) : Vec(vec), Idx(idx) {} reference &operator=(T val) { Vec.setValue(Vec.Bits, Idx, val); return *this; } + operator T() const { return Vec.getValue(Vec.Bits, Idx); } @@ -144,6 +146,6 @@ public: // Leave BitNum=0 undefined. template class PackedVector; -} // end llvm namespace +} // end namespace llvm -#endif +#endif // LLVM_ADT_PACKEDVECTOR_H diff --git a/include/llvm/ADT/ScopedHashTable.h b/include/llvm/ADT/ScopedHashTable.h index 4af3d6d37e3..ad805b0991c 100644 --- a/include/llvm/ADT/ScopedHashTable.h +++ b/include/llvm/ADT/ScopedHashTable.h @@ -32,7 +32,10 @@ #define LLVM_ADT_SCOPEDHASHTABLE_H #include "llvm/ADT/DenseMap.h" +#include "llvm/ADT/DenseMapInfo.h" #include "llvm/Support/Allocator.h" +#include +#include namespace llvm { @@ -46,6 +49,7 @@ class ScopedHashTableVal { ScopedHashTableVal *NextForKey; K Key; V Val; + ScopedHashTableVal(const K &key, const V &val) : Key(key), Val(val) {} public: @@ -89,11 +93,11 @@ class ScopedHashTableScope { /// LastValInScope - This is the last value that was inserted for this scope /// or null if none have been inserted yet. ScopedHashTableVal *LastValInScope; - void operator=(ScopedHashTableScope &) = delete; - ScopedHashTableScope(ScopedHashTableScope &) = delete; public: ScopedHashTableScope(ScopedHashTable &HT); + ScopedHashTableScope(ScopedHashTableScope &) = delete; + ScopedHashTableScope &operator=(ScopedHashTableScope &) = delete; ~ScopedHashTableScope(); ScopedHashTableScope *getParentScope() { return PrevScope; } @@ -101,6 +105,7 @@ public: private: friend class ScopedHashTable; + ScopedHashTableVal *getLastValInScope() { return LastValInScope; } @@ -150,19 +155,20 @@ public: typedef unsigned size_type; private: + friend class ScopedHashTableScope; + typedef ScopedHashTableVal ValTy; DenseMap TopLevelMap; - ScopeTy *CurScope; + ScopeTy *CurScope = nullptr; AllocatorTy Allocator; - ScopedHashTable(const ScopedHashTable &); // NOT YET IMPLEMENTED - void operator=(const ScopedHashTable &); // NOT YET IMPLEMENTED - friend class ScopedHashTableScope; - public: - ScopedHashTable() : CurScope(nullptr) {} + ScopedHashTable() = default; ScopedHashTable(AllocatorTy A) : CurScope(0), Allocator(A) {} + ScopedHashTable(const ScopedHashTable &) = delete; + ScopedHashTable &operator=(const ScopedHashTable &) = delete; + ~ScopedHashTable() { assert(!CurScope && TopLevelMap.empty() && "Scope imbalance!"); } @@ -253,4 +259,4 @@ ScopedHashTableScope::~ScopedHashTableScope() { } // end namespace llvm -#endif +#endif // LLVM_ADT_SCOPEDHASHTABLE_H diff --git a/include/llvm/ADT/SmallPtrSet.h b/include/llvm/ADT/SmallPtrSet.h index 88826ab49a7..16e5ed8933f 100644 --- a/include/llvm/ADT/SmallPtrSet.h +++ b/include/llvm/ADT/SmallPtrSet.h @@ -16,7 +16,6 @@ #define LLVM_ADT_SMALLPTRSET_H #include "llvm/Support/Compiler.h" -#include "llvm/Support/DataTypes.h" #include "llvm/Support/PointerLikeTypeTraits.h" #include #include @@ -28,8 +27,6 @@ namespace llvm { -class SmallPtrSetIteratorImpl; - /// SmallPtrSetImplBase - This is the common code shared among all the /// SmallPtrSet<>'s, which is almost everything. SmallPtrSet has two modes, one /// for small and one for large sets. @@ -72,12 +69,14 @@ protected: const SmallPtrSetImplBase &that); SmallPtrSetImplBase(const void **SmallStorage, unsigned SmallSize, SmallPtrSetImplBase &&that); + explicit SmallPtrSetImplBase(const void **SmallStorage, unsigned SmallSize) : SmallArray(SmallStorage), CurArray(SmallStorage), CurArraySize(SmallSize), NumNonEmpty(0), NumTombstones(0) { assert(SmallSize && (SmallSize & (SmallSize-1)) == 0 && "Initial size must be a power of two!"); } + ~SmallPtrSetImplBase() { if (!isSmall()) free(CurArray); @@ -85,6 +84,9 @@ protected: public: typedef unsigned size_type; + + SmallPtrSetImplBase &operator=(const SmallPtrSetImplBase &) = delete; + LLVM_NODISCARD bool empty() const { return size() == 0; } size_type size() const { return NumNonEmpty - NumTombstones; } @@ -104,6 +106,7 @@ public: protected: static void *getTombstoneMarker() { return reinterpret_cast(-2); } + static void *getEmptyMarker() { // Note that -1 is chosen to make clear() efficiently implementable with // memset and because it's not a valid pointer value. @@ -178,8 +181,6 @@ private: /// Grow - Allocate a larger backing store for the buckets and move it over. void Grow(unsigned NewSize); - void operator=(const SmallPtrSetImplBase &RHS) = delete; - protected: /// swap - Swaps the elements of two sets. /// Note: This method assumes that both sets have the same small size. @@ -295,8 +296,6 @@ template class SmallPtrSetImpl : public SmallPtrSetImplBase { typedef PointerLikeTypeTraits PtrTraits; - SmallPtrSetImpl(const SmallPtrSetImpl &) = delete; - protected: // Constructors that forward to the base. SmallPtrSetImpl(const void **SmallStorage, const SmallPtrSetImpl &that) @@ -311,6 +310,8 @@ public: typedef SmallPtrSetIterator iterator; typedef SmallPtrSetIterator const_iterator; + SmallPtrSetImpl(const SmallPtrSetImpl &) = delete; + /// Inserts Ptr if and only if there is no element in the container equal to /// Ptr. The bool component of the returned pair is true if and only if the /// insertion takes place, and the iterator component of the pair points to @@ -391,7 +392,7 @@ public: return *this; } - SmallPtrSet& + SmallPtrSet & operator=(SmallPtrSet &&RHS) { if (&RHS != this) this->MoveFrom(SmallSizePowTwo, std::move(RHS)); @@ -410,14 +411,17 @@ public: SmallPtrSetImplBase::swap(RHS); } }; -} + +} // end namespace llvm namespace std { + /// Implement std::swap in terms of SmallPtrSet swap. template inline void swap(llvm::SmallPtrSet &LHS, llvm::SmallPtrSet &RHS) { LHS.swap(RHS); } -} -#endif +} // end namespace std + +#endif // LLVM_ADT_SMALLPTRSET_H diff --git a/include/llvm/ADT/SmallVector.h b/include/llvm/ADT/SmallVector.h index 996f56f0f54..b9588214023 100644 --- a/include/llvm/ADT/SmallVector.h +++ b/include/llvm/ADT/SmallVector.h @@ -27,6 +27,9 @@ #include #include #include +#include +#include +#include namespace llvm { @@ -57,8 +60,6 @@ public: LLVM_NODISCARD bool empty() const { return BeginX == EndX; } }; -template struct SmallVectorStorage; - /// This is the part of SmallVectorTemplateBase which does not depend on whether /// the type T is a POD. The extra dummy template argument is used by ArrayRef /// to avoid unnecessarily requiring T to be complete. @@ -70,7 +71,7 @@ private: // Allocate raw space for N elements of type T. If T has a ctor or dtor, we // don't want it to be automatically run, so we need to represent the space as // something else. Use an array of char of sufficient alignment. - typedef llvm::AlignedCharArrayUnion U; + typedef AlignedCharArrayUnion U; U FirstEl; // Space after 'FirstEl' is clobbered, do not add any instance vars after it. @@ -93,6 +94,7 @@ protected: } void setEnd(T *P) { this->EndX = P; } + public: typedef size_t size_type; typedef ptrdiff_t difference_type; @@ -117,11 +119,12 @@ public: iterator end() { return (iterator)this->EndX; } LLVM_ATTRIBUTE_ALWAYS_INLINE const_iterator end() const { return (const_iterator)this->EndX; } + protected: iterator capacity_ptr() { return (iterator)this->CapacityX; } const_iterator capacity_ptr() const { return (const_iterator)this->CapacityX;} -public: +public: // reverse iterator creation methods. reverse_iterator rbegin() { return reverse_iterator(end()); } const_reverse_iterator rbegin() const{ return const_reverse_iterator(end()); } @@ -298,6 +301,7 @@ protected: void grow(size_t MinSize = 0) { this->grow_pod(MinSize*sizeof(T), sizeof(T)); } + public: void push_back(const T &Elt) { if (LLVM_UNLIKELY(this->EndX >= this->CapacityX)) @@ -311,14 +315,12 @@ public: } }; - /// This class consists of common code factored out of the SmallVector class to /// reduce code duplication based on the SmallVector 'N' template parameter. template class SmallVectorImpl : public SmallVectorTemplateBase::value> { typedef SmallVectorTemplateBase::value > SuperClass; - SmallVectorImpl(const SmallVectorImpl&) = delete; public: typedef typename SuperClass::iterator iterator; typedef typename SuperClass::const_iterator const_iterator; @@ -331,6 +333,8 @@ protected: } public: + SmallVectorImpl(const SmallVectorImpl &) = delete; + ~SmallVectorImpl() { // Destroy the constructed elements in the vector. this->destroy_range(this->begin(), this->end()); @@ -340,7 +344,6 @@ public: free(this->begin()); } - void clear() { this->destroy_range(this->begin(), this->end()); this->EndX = this->BeginX; @@ -668,7 +671,6 @@ public: } }; - template void SmallVectorImpl::swap(SmallVectorImpl &RHS) { if (this == &RHS) return; @@ -841,6 +843,7 @@ template class SmallVector : public SmallVectorImpl { /// Inline space for elements which aren't stored in the base class. SmallVectorStorage Storage; + public: SmallVector() : SmallVectorImpl(N) { } @@ -856,7 +859,7 @@ public: } template - explicit SmallVector(const llvm::iterator_range &R) + explicit SmallVector(const iterator_range &R) : SmallVectorImpl(N) { this->append(R.begin(), R.end()); } @@ -906,9 +909,10 @@ static inline size_t capacity_in_bytes(const SmallVector &X) { return X.capacity_in_bytes(); } -} // End llvm namespace +} // end namespace llvm namespace std { + /// Implement std::swap in terms of SmallVector swap. template inline void @@ -922,6 +926,7 @@ namespace std { swap(llvm::SmallVector &LHS, llvm::SmallVector &RHS) { LHS.swap(RHS); } -} -#endif +} // end namespace std + +#endif // LLVM_ADT_SMALLVECTOR_H diff --git a/include/llvm/ADT/SparseMultiSet.h b/include/llvm/ADT/SparseMultiSet.h index e3aa2589b79..08da4b68eba 100644 --- a/include/llvm/ADT/SparseMultiSet.h +++ b/include/llvm/ADT/SparseMultiSet.h @@ -21,7 +21,15 @@ #ifndef LLVM_ADT_SPARSEMULTISET_H #define LLVM_ADT_SPARSEMULTISET_H +#include "llvm/ADT/SmallVector.h" #include "llvm/ADT/SparseSet.h" +#include "llvm/ADT/STLExtras.h" +#include +#include +#include +#include +#include +#include namespace llvm { @@ -73,7 +81,7 @@ namespace llvm { /// @tparam SparseT An unsigned integer type. See above. /// template, + typename KeyFunctorT = identity, typename SparseT = uint8_t> class SparseMultiSet { static_assert(std::numeric_limits::is_integer && @@ -113,16 +121,16 @@ class SparseMultiSet { typedef typename KeyFunctorT::argument_type KeyT; typedef SmallVector DenseT; DenseT Dense; - SparseT *Sparse; - unsigned Universe; + SparseT *Sparse = nullptr; + unsigned Universe = 0; KeyFunctorT KeyIndexOf; SparseSetValFunctor ValIndexOf; /// We have a built-in recycler for reusing tombstone slots. This recycler /// puts a singly-linked free list into tombstone slots, allowing us quick /// erasure, iterator preservation, and dense size. - unsigned FreelistIdx; - unsigned NumFree; + unsigned FreelistIdx = SMSNode::INVALID; + unsigned NumFree = 0; unsigned sparseIndex(const ValueT &Val) const { assert(ValIndexOf(Val) < Universe && @@ -131,11 +139,6 @@ class SparseMultiSet { } unsigned sparseIndex(const SMSNode &N) const { return sparseIndex(N.Data); } - // Disable copy construction and assignment. - // This data structure is not meant to be used that way. - SparseMultiSet(const SparseMultiSet&) = delete; - SparseMultiSet &operator=(const SparseMultiSet&) = delete; - /// Whether the given entry is the head of the list. List heads's previous /// pointers are to the tail of the list, allowing for efficient access to the /// list tail. D must be a valid entry node. @@ -187,9 +190,9 @@ public: typedef const ValueT *const_pointer; typedef unsigned size_type; - SparseMultiSet() - : Sparse(nullptr), Universe(0), FreelistIdx(SMSNode::INVALID), NumFree(0) {} - + SparseMultiSet() = default; + SparseMultiSet(const SparseMultiSet &) = delete; + SparseMultiSet &operator=(const SparseMultiSet &) = delete; ~SparseMultiSet() { free(Sparse); } /// Set the universe size which determines the largest key the set can hold. @@ -218,6 +221,7 @@ public: class iterator_base : public std::iterator { friend class SparseMultiSet; + SMSPtrTy SMS; unsigned Idx; unsigned SparseIdx; @@ -515,4 +519,4 @@ private: } // end namespace llvm -#endif +#endif // LLVM_ADT_SPARSEMULTISET_H diff --git a/include/llvm/ADT/SparseSet.h b/include/llvm/ADT/SparseSet.h index 5b6494d1712..00c18c74321 100644 --- a/include/llvm/ADT/SparseSet.h +++ b/include/llvm/ADT/SparseSet.h @@ -22,8 +22,11 @@ #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallVector.h" -#include "llvm/Support/DataTypes.h" +#include +#include +#include #include +#include namespace llvm { @@ -115,7 +118,7 @@ struct SparseSetValFunctor { /// @tparam SparseT An unsigned integer type. See above. /// template, + typename KeyFunctorT = identity, typename SparseT = uint8_t> class SparseSet { static_assert(std::numeric_limits::is_integer && @@ -126,16 +129,11 @@ class SparseSet { typedef SmallVector DenseT; typedef unsigned size_type; DenseT Dense; - SparseT *Sparse; - unsigned Universe; + SparseT *Sparse = nullptr; + unsigned Universe = 0; KeyFunctorT KeyIndexOf; SparseSetValFunctor ValIndexOf; - // Disable copy construction and assignment. - // This data structure is not meant to be used that way. - SparseSet(const SparseSet&) = delete; - SparseSet &operator=(const SparseSet&) = delete; - public: typedef ValueT value_type; typedef ValueT &reference; @@ -143,7 +141,9 @@ public: typedef ValueT *pointer; typedef const ValueT *const_pointer; - SparseSet() : Sparse(nullptr), Universe(0) {} + SparseSet() = default; + SparseSet(const SparseSet &) = delete; + SparseSet &operator=(const SparseSet &) = delete; ~SparseSet() { free(Sparse); } /// setUniverse - Set the universe size which determines the largest key the @@ -308,9 +308,8 @@ public: erase(I); return true; } - }; } // end namespace llvm -#endif +#endif // LLVM_ADT_SPARSESET_H diff --git a/include/llvm/ADT/Twine.h b/include/llvm/ADT/Twine.h index 81b1a6d946f..47caf46f7c2 100644 --- a/include/llvm/ADT/Twine.h +++ b/include/llvm/ADT/Twine.h @@ -12,12 +12,13 @@ #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringRef.h" -#include "llvm/Support/DataTypes.h" #include "llvm/Support/ErrorHandling.h" #include +#include #include namespace llvm { + class raw_ostream; /// Twine - A lightweight data structure for efficiently representing the @@ -146,7 +147,6 @@ namespace llvm { const uint64_t *uHex; }; - private: /// LHS - The prefix in the concatenation, which may be uninitialized for /// Null or Empty kinds. Child LHS; @@ -158,7 +158,6 @@ namespace llvm { /// RHSKind - The NodeKind of the right hand side, \see getRHSKind(). NodeKind RHSKind; - private: /// Construct a nullary twine; the kind must be NullKind or EmptyKind. explicit Twine(NodeKind Kind) : LHSKind(Kind), RHSKind(EmptyKind) { @@ -179,10 +178,6 @@ namespace llvm { assert(isValid() && "Invalid twine!"); } - /// Since the intended use of twines is as temporary objects, assignments - /// when concatenating might cause undefined behavior or stack corruptions - Twine &operator=(const Twine &Other) = delete; - /// Check for the null twine. bool isNull() const { return getLHSKind() == NullKind; @@ -370,6 +365,10 @@ namespace llvm { assert(isValid() && "Invalid twine!"); } + /// Since the intended use of twines is as temporary objects, assignments + /// when concatenating might cause undefined behavior or stack corruptions + Twine &operator=(const Twine &) = delete; + /// Create a 'null' string, which is an empty string that always /// concatenates to form another empty string. static Twine createNull() { @@ -535,6 +534,7 @@ namespace llvm { } /// @} -} -#endif +} // end namespace llvm + +#endif // LLVM_ADT_TWINE_H diff --git a/include/llvm/ADT/ilist.h b/include/llvm/ADT/ilist.h index 295129f3a17..a788f811e4c 100644 --- a/include/llvm/ADT/ilist.h +++ b/include/llvm/ADT/ilist.h @@ -25,11 +25,9 @@ #define LLVM_ADT_ILIST_H #include "llvm/ADT/simple_ilist.h" -#include "llvm/Support/Compiler.h" #include #include #include -#include namespace llvm { @@ -208,12 +206,12 @@ private: static bool op_less(const_reference L, const_reference R) { return L < R; } static bool op_equal(const_reference L, const_reference R) { return L == R; } - // Copying intrusively linked nodes doesn't make sense. - iplist_impl(const iplist_impl &) = delete; - void operator=(const iplist_impl &) = delete; - public: iplist_impl() = default; + + iplist_impl(const iplist_impl &) = delete; + iplist_impl &operator=(const iplist_impl &) = delete; + iplist_impl(iplist_impl &&X) : TraitsT(std::move(X)), IntrusiveListT(std::move(X)) {} iplist_impl &operator=(iplist_impl &&X) { @@ -221,6 +219,7 @@ public: *static_cast(this) = std::move(X); return *this; } + ~iplist_impl() { clear(); } // Miscellaneous inspection routines. @@ -308,7 +307,6 @@ private: } public: - //===----------------------------------------------------------------------=== // Functionality derived from other functions defined above... // @@ -408,25 +406,29 @@ class iplist public: iplist() = default; - iplist(iplist &&X) : iplist_impl_type(std::move(X)) {} + iplist(const iplist &X) = delete; + iplist &operator=(const iplist &X) = delete; + + iplist(iplist &&X) : iplist_impl_type(std::move(X)) {} iplist &operator=(iplist &&X) { *static_cast(this) = std::move(X); return *this; } - iplist &operator=(const iplist &X) = delete; }; template using ilist = iplist; -} // End llvm namespace +} // end namespace llvm namespace std { + // Ensure that swap uses the fast list swap... template void swap(llvm::iplist &Left, llvm::iplist &Right) { Left.swap(Right); } -} // End 'std' extensions... + +} // end namespace std #endif // LLVM_ADT_ILIST_H diff --git a/lib/IR/AttributeImpl.h b/lib/IR/AttributeImpl.h index 1341937c9bc..d0d27101aa8 100644 --- a/lib/IR/AttributeImpl.h +++ b/lib/IR/AttributeImpl.h @@ -16,17 +16,22 @@ #ifndef LLVM_LIB_IR_ATTRIBUTEIMPL_H #define LLVM_LIB_IR_ATTRIBUTEIMPL_H -#include "llvm/ADT/FoldingSet.h" -#include "llvm/ADT/Optional.h" -#include "llvm/IR/Attributes.h" #include "AttributeSetNode.h" -#include "llvm/Support/DataTypes.h" +#include "llvm/ADT/ArrayRef.h" +#include "llvm/ADT/FoldingSet.h" +#include "llvm/ADT/StringRef.h" +#include "llvm/IR/Attributes.h" +#include "llvm/Support/TrailingObjects.h" +#include +#include #include +#include +#include #include +#include namespace llvm { -class Constant; class LLVMContext; //===----------------------------------------------------------------------===// @@ -36,10 +41,6 @@ class LLVMContext; class AttributeImpl : public FoldingSetNode { unsigned char KindID; ///< Holds the AttrEntryKind of the attribute - // AttributesImpl is uniqued, these should not be publicly available. - void operator=(const AttributeImpl &) = delete; - AttributeImpl(const AttributeImpl &) = delete; - protected: enum AttrEntryKind { EnumAttrEntry, @@ -50,6 +51,10 @@ protected: AttributeImpl(AttrEntryKind KindID) : KindID(KindID) {} public: + // AttributesImpl is uniqued, these should not be available. + AttributeImpl(const AttributeImpl &) = delete; + AttributeImpl &operator=(const AttributeImpl &) = delete; + virtual ~AttributeImpl(); bool isEnumAttribute() const { return KindID == EnumAttrEntry; } @@ -165,12 +170,9 @@ private: return getTrailingObjects() + Slot; } - // AttributesSet is uniqued, these should not be publicly available. - void operator=(const AttributeSetImpl &) = delete; - AttributeSetImpl(const AttributeSetImpl &) = delete; public: AttributeSetImpl(LLVMContext &C, - ArrayRef > Slots) + ArrayRef> Slots) : Context(C), NumSlots(Slots.size()), AvailableFunctionAttrs(0) { static_assert(Attribute::EndAttrKinds <= sizeof(AvailableFunctionAttrs) * CHAR_BIT, @@ -203,6 +205,10 @@ public: } } + // AttributesSetImpt is uniqued, these should not be available. + AttributeSetImpl(const AttributeSetImpl &) = delete; + AttributeSetImpl &operator=(const AttributeSetImpl &) = delete; + void operator delete(void *p) { ::operator delete(p); } /// \brief Get the context that created this AttributeSetImpl. @@ -248,16 +254,16 @@ public: Profile(ID, makeArrayRef(getNode(0), getNumSlots())); } static void Profile(FoldingSetNodeID &ID, - ArrayRef > Nodes) { - for (unsigned i = 0, e = Nodes.size(); i != e; ++i) { - ID.AddInteger(Nodes[i].first); - ID.AddPointer(Nodes[i].second); + ArrayRef> Nodes) { + for (const auto &Node : Nodes) { + ID.AddInteger(Node.first); + ID.AddPointer(Node.second); } } void dump() const; }; -} // end llvm namespace +} // end namespace llvm -#endif +#endif // LLVM_LIB_IR_ATTRIBUTEIMPL_H diff --git a/lib/IR/AttributeSetNode.h b/lib/IR/AttributeSetNode.h index fab1ed51e4d..23ce3713c20 100644 --- a/lib/IR/AttributeSetNode.h +++ b/lib/IR/AttributeSetNode.h @@ -15,10 +15,17 @@ #ifndef LLVM_IR_ATTRIBUTESETNODE_H #define LLVM_IR_ATTRIBUTESETNODE_H +#include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/FoldingSet.h" +#include "llvm/ADT/Optional.h" +#include "llvm/ADT/StringRef.h" #include "llvm/IR/Attributes.h" #include "llvm/Support/TrailingObjects.h" +#include #include +#include +#include +#include namespace llvm { @@ -49,10 +56,11 @@ class AttributeSetNode final } } - // AttributesSetNode is uniqued, these should not be publicly available. - void operator=(const AttributeSetNode &) = delete; - AttributeSetNode(const AttributeSetNode &) = delete; public: + // AttributesSetNode is uniqued, these should not be available. + AttributeSetNode(const AttributeSetNode &) = delete; + AttributeSetNode &operator=(const AttributeSetNode &) = delete; + void operator delete(void *p) { ::operator delete(p); } static AttributeSetNode *get(LLVMContext &C, ArrayRef Attrs); @@ -88,11 +96,11 @@ public: Profile(ID, makeArrayRef(begin(), end())); } static void Profile(FoldingSetNodeID &ID, ArrayRef AttrList) { - for (unsigned I = 0, E = AttrList.size(); I != E; ++I) - AttrList[I].Profile(ID); + for (const auto &Attr : AttrList) + Attr.Profile(ID); } }; -} // end llvm namespace +} // end namespace llvm -#endif +#endif // LLVM_IR_ATTRIBUTESETNODE_H diff --git a/lib/IR/ConstantsContext.h b/lib/IR/ConstantsContext.h index 7db87edff01..eda751d8af4 100644 --- a/lib/IR/ConstantsContext.h +++ b/lib/IR/ConstantsContext.h @@ -1,4 +1,4 @@ -//===-- ConstantsContext.h - Constants-related Context Interals -----------===// +//===-- ConstantsContext.h - Constants-related Context Interals -*- C++ -*-===// // // The LLVM Compiler Infrastructure // @@ -15,14 +15,26 @@ #ifndef LLVM_LIB_IR_CONSTANTSCONTEXT_H #define LLVM_LIB_IR_CONSTANTSCONTEXT_H +#include "llvm/ADT/ArrayRef.h" +#include "llvm/ADT/DenseMapInfo.h" #include "llvm/ADT/DenseSet.h" #include "llvm/ADT/Hashing.h" +#include "llvm/ADT/None.h" +#include "llvm/ADT/SmallVector.h" +#include "llvm/ADT/StringRef.h" +#include "llvm/IR/Constants.h" +#include "llvm/IR/DerivedTypes.h" #include "llvm/IR/InlineAsm.h" -#include "llvm/IR/Instructions.h" -#include "llvm/IR/Operator.h" +#include "llvm/IR/Instruction.h" +#include "llvm/IR/OperandTraits.h" +#include "llvm/Support/Casting.h" #include "llvm/Support/Debug.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/raw_ostream.h" +#include +#include +#include +#include #define DEBUG_TYPE "ir" @@ -32,16 +44,20 @@ namespace llvm { /// behind the scenes to implement unary constant exprs. class UnaryConstantExpr : public ConstantExpr { void anchor() override; - void *operator new(size_t, unsigned) = delete; + public: - // allocate space for exactly one operand - void *operator new(size_t s) { - return User::operator new(s, 1); - } UnaryConstantExpr(unsigned Opcode, Constant *C, Type *Ty) : ConstantExpr(Ty, Opcode, &Op<0>(), 1) { Op<0>() = C; } + + // allocate space for exactly one operand + void *operator new(size_t s) { + return User::operator new(s, 1); + } + + void *operator new(size_t, unsigned) = delete; + DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); }; @@ -49,12 +65,8 @@ public: /// behind the scenes to implement binary constant exprs. class BinaryConstantExpr : public ConstantExpr { void anchor() override; - void *operator new(size_t, unsigned) = delete; + public: - // allocate space for exactly two operands - void *operator new(size_t s) { - return User::operator new(s, 2); - } BinaryConstantExpr(unsigned Opcode, Constant *C1, Constant *C2, unsigned Flags) : ConstantExpr(C1->getType(), Opcode, &Op<0>(), 2) { @@ -62,6 +74,14 @@ public: Op<1>() = C2; SubclassOptionalData = Flags; } + + // allocate space for exactly two operands + void *operator new(size_t s) { + return User::operator new(s, 2); + } + + void *operator new(size_t, unsigned) = delete; + /// Transparently provide more efficient getOperand methods. DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); }; @@ -70,18 +90,22 @@ public: /// behind the scenes to implement select constant exprs. class SelectConstantExpr : public ConstantExpr { void anchor() override; - void *operator new(size_t, unsigned) = delete; + public: - // allocate space for exactly three operands - void *operator new(size_t s) { - return User::operator new(s, 3); - } SelectConstantExpr(Constant *C1, Constant *C2, Constant *C3) : ConstantExpr(C2->getType(), Instruction::Select, &Op<0>(), 3) { Op<0>() = C1; Op<1>() = C2; Op<2>() = C3; } + + // allocate space for exactly three operands + void *operator new(size_t s) { + return User::operator new(s, 3); + } + + void *operator new(size_t, unsigned) = delete; + /// Transparently provide more efficient getOperand methods. DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); }; @@ -91,18 +115,22 @@ public: /// extractelement constant exprs. class ExtractElementConstantExpr : public ConstantExpr { void anchor() override; - void *operator new(size_t, unsigned) = delete; + public: - // allocate space for exactly two operands - void *operator new(size_t s) { - return User::operator new(s, 2); - } ExtractElementConstantExpr(Constant *C1, Constant *C2) : ConstantExpr(cast(C1->getType())->getElementType(), Instruction::ExtractElement, &Op<0>(), 2) { Op<0>() = C1; Op<1>() = C2; } + + // allocate space for exactly two operands + void *operator new(size_t s) { + return User::operator new(s, 2); + } + + void *operator new(size_t, unsigned) = delete; + /// Transparently provide more efficient getOperand methods. DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); }; @@ -112,12 +140,8 @@ public: /// insertelement constant exprs. class InsertElementConstantExpr : public ConstantExpr { void anchor() override; - void *operator new(size_t, unsigned) = delete; + public: - // allocate space for exactly three operands - void *operator new(size_t s) { - return User::operator new(s, 3); - } InsertElementConstantExpr(Constant *C1, Constant *C2, Constant *C3) : ConstantExpr(C1->getType(), Instruction::InsertElement, &Op<0>(), 3) { @@ -125,6 +149,14 @@ public: Op<1>() = C2; Op<2>() = C3; } + + // allocate space for exactly three operands + void *operator new(size_t s) { + return User::operator new(s, 3); + } + + void *operator new(size_t, unsigned) = delete; + /// Transparently provide more efficient getOperand methods. DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); }; @@ -134,12 +166,8 @@ public: /// shufflevector constant exprs. class ShuffleVectorConstantExpr : public ConstantExpr { void anchor() override; - void *operator new(size_t, unsigned) = delete; + public: - // allocate space for exactly three operands - void *operator new(size_t s) { - return User::operator new(s, 3); - } ShuffleVectorConstantExpr(Constant *C1, Constant *C2, Constant *C3) : ConstantExpr(VectorType::get( cast(C1->getType())->getElementType(), @@ -150,6 +178,14 @@ public: Op<1>() = C2; Op<2>() = C3; } + + // allocate space for exactly three operands + void *operator new(size_t s) { + return User::operator new(s, 3); + } + + void *operator new(size_t, unsigned) = delete; + /// Transparently provide more efficient getOperand methods. DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); }; @@ -159,12 +195,8 @@ public: /// extractvalue constant exprs. class ExtractValueConstantExpr : public ConstantExpr { void anchor() override; - void *operator new(size_t, unsigned) = delete; + public: - // allocate space for exactly one operand - void *operator new(size_t s) { - return User::operator new(s, 1); - } ExtractValueConstantExpr(Constant *Agg, ArrayRef IdxList, Type *DestTy) : ConstantExpr(DestTy, Instruction::ExtractValue, &Op<0>(), 1), @@ -172,6 +204,13 @@ public: Op<0>() = Agg; } + // allocate space for exactly one operand + void *operator new(size_t s) { + return User::operator new(s, 1); + } + + void *operator new(size_t, unsigned) = delete; + /// Indices - These identify which value to extract. const SmallVector Indices; @@ -191,12 +230,8 @@ public: /// insertvalue constant exprs. class InsertValueConstantExpr : public ConstantExpr { void anchor() override; - void *operator new(size_t, unsigned) = delete; + public: - // allocate space for exactly one operand - void *operator new(size_t s) { - return User::operator new(s, 2); - } InsertValueConstantExpr(Constant *Agg, Constant *Val, ArrayRef IdxList, Type *DestTy) : ConstantExpr(DestTy, Instruction::InsertValue, &Op<0>(), 2), @@ -205,6 +240,13 @@ public: Op<1>() = Val; } + // allocate space for exactly one operand + void *operator new(size_t s) { + return User::operator new(s, 2); + } + + void *operator new(size_t, unsigned) = delete; + /// Indices - These identify the position for the insertion. const SmallVector Indices; @@ -224,10 +266,12 @@ public: class GetElementPtrConstantExpr : public ConstantExpr { Type *SrcElementTy; Type *ResElementTy; - void anchor() override; + GetElementPtrConstantExpr(Type *SrcElementTy, Constant *C, ArrayRef IdxList, Type *DestTy); + void anchor() override; + public: static GetElementPtrConstantExpr *Create(Type *SrcElementTy, Constant *C, ArrayRef IdxList, @@ -237,8 +281,10 @@ public: Result->SubclassOptionalData = Flags; return Result; } + Type *getSourceElementType() const; Type *getResultElementType() const; + /// Transparently provide more efficient getOperand methods. DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); @@ -255,12 +301,8 @@ public: // needed in order to store the predicate value for these instructions. class CompareConstantExpr : public ConstantExpr { void anchor() override; - void *operator new(size_t, unsigned) = delete; + public: - // allocate space for exactly two operands - void *operator new(size_t s) { - return User::operator new(s, 2); - } unsigned short predicate; CompareConstantExpr(Type *ty, Instruction::OtherOps opc, unsigned short pred, Constant* LHS, Constant* RHS) @@ -268,6 +310,14 @@ public: Op<0>() = LHS; Op<1>() = RHS; } + + // allocate space for exactly two operands + void *operator new(size_t s) { + return User::operator new(s, 2); + } + + void *operator new(size_t, unsigned) = delete; + /// Transparently provide more efficient getOperand methods. DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); @@ -373,6 +423,7 @@ template struct ConstantAggrKeyType { bool operator==(const ConstantAggrKeyType &X) const { return Operands == X.Operands; } + bool operator==(const ConstantClass *C) const { if (Operands.size() != C->getNumOperands()) return false; @@ -381,6 +432,7 @@ template struct ConstantAggrKeyType { return false; return true; } + unsigned getHash() const { return hash_combine_range(Operands.begin(), Operands.end()); } @@ -416,6 +468,7 @@ struct InlineAsmKeyType { AsmString == X.AsmString && Constraints == X.Constraints && FTy == X.FTy; } + bool operator==(const InlineAsm *Asm) const { return HasSideEffects == Asm->hasSideEffects() && IsAlignStack == Asm->isAlignStack() && @@ -424,6 +477,7 @@ struct InlineAsmKeyType { Constraints == Asm->getConstraintString() && FTy == Asm->getFunctionType(); } + unsigned getHash() const { return hash_combine(AsmString, Constraints, HasSideEffects, IsAlignStack, AsmDialect, FTy); @@ -553,22 +607,28 @@ private: static inline ConstantClass *getEmptyKey() { return ConstantClassInfo::getEmptyKey(); } + static inline ConstantClass *getTombstoneKey() { return ConstantClassInfo::getTombstoneKey(); } + static unsigned getHashValue(const ConstantClass *CP) { SmallVector Storage; return getHashValue(LookupKey(CP->getType(), ValType(CP, Storage))); } + static bool isEqual(const ConstantClass *LHS, const ConstantClass *RHS) { return LHS == RHS; } + static unsigned getHashValue(const LookupKey &Val) { return hash_combine(Val.first, Val.second.getHash()); } + static unsigned getHashValue(const LookupKeyHashed &Val) { return Val.first; } + static bool isEqual(const LookupKey &LHS, const ConstantClass *RHS) { if (RHS == getEmptyKey() || RHS == getTombstoneKey()) return false; @@ -576,6 +636,7 @@ private: return false; return LHS.second == RHS; } + static bool isEqual(const LookupKeyHashed &LHS, const ConstantClass *RHS) { return isEqual(LHS.second, RHS); } @@ -595,6 +656,7 @@ public: for (auto &I : Map) delete I; // Asserts that use_empty(). } + private: ConstantClass *create(TypeClass *Ty, ValType V, LookupKeyHashed &HashKey) { ConstantClass *Result = V.create(Ty); @@ -665,4 +727,4 @@ public: } // end namespace llvm -#endif +#endif // LLVM_LIB_IR_CONSTANTSCONTEXT_H