mirror of
https://github.com/RPCS3/llvm.git
synced 2024-11-25 04:39:51 +00:00
[ADT, IR] Fix some Clang-tidy modernize-use-equals-delete and Include What You Use warnings; other minor fixes (NFC).
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@288989 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
4e51983ffa
commit
553d8c8203
@ -21,6 +21,7 @@
|
||||
#include <cstdint>
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
#include <utility>
|
||||
|
||||
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) {
|
||||
|
@ -16,8 +16,9 @@
|
||||
|
||||
#include "llvm/ADT/FoldingSet.h"
|
||||
#include "llvm/Support/Allocator.h"
|
||||
#include "llvm/Support/DataTypes.h"
|
||||
#include <cassert>
|
||||
#include <cstdint>
|
||||
#include <new>
|
||||
|
||||
namespace llvm {
|
||||
|
||||
@ -25,18 +26,18 @@ template <typename T> class ImmutableListFactory;
|
||||
|
||||
template <typename T>
|
||||
class ImmutableListImpl : public FoldingSetNode {
|
||||
friend class ImmutableListFactory<T>;
|
||||
|
||||
T Head;
|
||||
const ImmutableListImpl* Tail;
|
||||
|
||||
ImmutableListImpl(const T& head, const ImmutableListImpl* tail = nullptr)
|
||||
: Head(head), Tail(tail) {}
|
||||
|
||||
friend class ImmutableListFactory<T>;
|
||||
|
||||
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<T>* L;
|
||||
const ImmutableListImpl<T>* 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<typename T> struct DenseMapInfo;
|
||||
template<typename T> struct DenseMapInfo<ImmutableList<T> > {
|
||||
template<typename T> struct DenseMapInfo<ImmutableList<T>> {
|
||||
static inline ImmutableList<T> getEmptyKey() {
|
||||
return reinterpret_cast<ImmutableListImpl<T>*>(-1);
|
||||
}
|
||||
|
||||
static inline ImmutableList<T> getTombstoneKey() {
|
||||
return reinterpret_cast<ImmutableListImpl<T>*>(-2);
|
||||
}
|
||||
|
||||
static unsigned getHashValue(ImmutableList<T> X) {
|
||||
uintptr_t PtrVal = reinterpret_cast<uintptr_t>(X.getInternalPointer());
|
||||
return (unsigned((uintptr_t)PtrVal) >> 4) ^
|
||||
(unsigned((uintptr_t)PtrVal) >> 9);
|
||||
}
|
||||
|
||||
static bool isEqual(ImmutableList<T> X1, ImmutableList<T> X2) {
|
||||
return X1 == X2;
|
||||
}
|
||||
@ -222,8 +228,8 @@ template<typename T> struct DenseMapInfo<ImmutableList<T> > {
|
||||
|
||||
template <typename T> struct isPodLike;
|
||||
template <typename T>
|
||||
struct isPodLike<ImmutableList<T> > { static const bool value = true; };
|
||||
struct isPodLike<ImmutableList<T>> { static const bool value = true; };
|
||||
|
||||
} // end llvm namespace
|
||||
} // end namespace llvm
|
||||
|
||||
#endif // LLVM_ADT_IMMUTABLELIST_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 <utility>
|
||||
|
||||
namespace llvm {
|
||||
|
||||
@ -56,7 +59,7 @@ struct ImutKeyValueInfo {
|
||||
};
|
||||
|
||||
template <typename KeyT, typename ValT,
|
||||
typename ValInfo = ImutKeyValueInfo<KeyT,ValT> >
|
||||
typename ValInfo = ImutKeyValueInfo<KeyT,ValT>>
|
||||
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<typename TreeTy::Factory *>(&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<ImmutableMap> {
|
||||
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 KeyT, typename ValT,
|
||||
typename ValInfo = ImutKeyValueInfo<KeyT,ValT> >
|
||||
typename ValInfo = ImutKeyValueInfo<KeyT,ValT>>
|
||||
class ImmutableMapRef {
|
||||
public:
|
||||
typedef typename ValInfo::value_type value_type;
|
||||
@ -362,9 +365,10 @@ public:
|
||||
//===--------------------------------------------------===//
|
||||
|
||||
class iterator : public ImutAVLValueIterator<ImmutableMapRef> {
|
||||
friend class ImmutableMapRef;
|
||||
|
||||
iterator() = default;
|
||||
explicit iterator(TreeTy *Tree) : iterator::ImutAVLValueIterator(Tree) {}
|
||||
friend class ImmutableMapRef;
|
||||
|
||||
public:
|
||||
key_type_ref getKey() const { return (*this)->first; }
|
||||
|
@ -15,6 +15,7 @@
|
||||
#define LLVM_ADT_PACKEDVECTOR_H
|
||||
|
||||
#include "llvm/ADT/BitVector.h"
|
||||
#include <cassert>
|
||||
#include <limits>
|
||||
|
||||
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 <typename T> class PackedVector<T, 0>;
|
||||
|
||||
} // end llvm namespace
|
||||
} // end namespace llvm
|
||||
|
||||
#endif
|
||||
#endif // LLVM_ADT_PACKEDVECTOR_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 <cassert>
|
||||
#include <new>
|
||||
|
||||
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<K, V> *LastValInScope;
|
||||
void operator=(ScopedHashTableScope &) = delete;
|
||||
ScopedHashTableScope(ScopedHashTableScope &) = delete;
|
||||
|
||||
public:
|
||||
ScopedHashTableScope(ScopedHashTable<K, V, KInfo, AllocatorTy> &HT);
|
||||
ScopedHashTableScope(ScopedHashTableScope &) = delete;
|
||||
ScopedHashTableScope &operator=(ScopedHashTableScope &) = delete;
|
||||
~ScopedHashTableScope();
|
||||
|
||||
ScopedHashTableScope *getParentScope() { return PrevScope; }
|
||||
@ -101,6 +105,7 @@ public:
|
||||
|
||||
private:
|
||||
friend class ScopedHashTable<K, V, KInfo, AllocatorTy>;
|
||||
|
||||
ScopedHashTableVal<K, V> *getLastValInScope() {
|
||||
return LastValInScope;
|
||||
}
|
||||
@ -150,19 +155,20 @@ public:
|
||||
typedef unsigned size_type;
|
||||
|
||||
private:
|
||||
friend class ScopedHashTableScope<K, V, KInfo, AllocatorTy>;
|
||||
|
||||
typedef ScopedHashTableVal<K, V> ValTy;
|
||||
DenseMap<K, ValTy*, KInfo> TopLevelMap;
|
||||
ScopeTy *CurScope;
|
||||
ScopeTy *CurScope = nullptr;
|
||||
|
||||
AllocatorTy Allocator;
|
||||
|
||||
ScopedHashTable(const ScopedHashTable &); // NOT YET IMPLEMENTED
|
||||
void operator=(const ScopedHashTable &); // NOT YET IMPLEMENTED
|
||||
friend class ScopedHashTableScope<K, V, KInfo, AllocatorTy>;
|
||||
|
||||
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<K, V, KInfo, Allocator>::~ScopedHashTableScope() {
|
||||
|
||||
} // end namespace llvm
|
||||
|
||||
#endif
|
||||
#endif // LLVM_ADT_SCOPEDHASHTABLE_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 <cassert>
|
||||
#include <cstddef>
|
||||
@ -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<void*>(-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 <typename PtrType>
|
||||
class SmallPtrSetImpl : public SmallPtrSetImplBase {
|
||||
typedef PointerLikeTypeTraits<PtrType> 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<PtrType> iterator;
|
||||
typedef SmallPtrSetIterator<PtrType> 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<PtrType, SmallSize>&
|
||||
SmallPtrSet<PtrType, SmallSize> &
|
||||
operator=(SmallPtrSet<PtrType, SmallSize> &&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<class T, unsigned N>
|
||||
inline void swap(llvm::SmallPtrSet<T, N> &LHS, llvm::SmallPtrSet<T, N> &RHS) {
|
||||
LHS.swap(RHS);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
} // end namespace std
|
||||
|
||||
#endif // LLVM_ADT_SMALLPTRSET_H
|
||||
|
@ -27,6 +27,9 @@
|
||||
#include <initializer_list>
|
||||
#include <iterator>
|
||||
#include <memory>
|
||||
#include <new>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
|
||||
namespace llvm {
|
||||
|
||||
@ -57,8 +60,6 @@ public:
|
||||
LLVM_NODISCARD bool empty() const { return BeginX == EndX; }
|
||||
};
|
||||
|
||||
template <typename T, unsigned N> 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<T> U;
|
||||
typedef AlignedCharArrayUnion<T> 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 <typename T>
|
||||
class SmallVectorImpl : public SmallVectorTemplateBase<T, isPodLike<T>::value> {
|
||||
typedef SmallVectorTemplateBase<T, isPodLike<T>::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 <typename T>
|
||||
void SmallVectorImpl<T>::swap(SmallVectorImpl<T> &RHS) {
|
||||
if (this == &RHS) return;
|
||||
@ -841,6 +843,7 @@ template <typename T, unsigned N>
|
||||
class SmallVector : public SmallVectorImpl<T> {
|
||||
/// Inline space for elements which aren't stored in the base class.
|
||||
SmallVectorStorage<T, N> Storage;
|
||||
|
||||
public:
|
||||
SmallVector() : SmallVectorImpl<T>(N) {
|
||||
}
|
||||
@ -856,7 +859,7 @@ public:
|
||||
}
|
||||
|
||||
template <typename RangeTy>
|
||||
explicit SmallVector(const llvm::iterator_range<RangeTy> &R)
|
||||
explicit SmallVector(const iterator_range<RangeTy> &R)
|
||||
: SmallVectorImpl<T>(N) {
|
||||
this->append(R.begin(), R.end());
|
||||
}
|
||||
@ -906,9 +909,10 @@ static inline size_t capacity_in_bytes(const SmallVector<T, N> &X) {
|
||||
return X.capacity_in_bytes();
|
||||
}
|
||||
|
||||
} // End llvm namespace
|
||||
} // end namespace llvm
|
||||
|
||||
namespace std {
|
||||
|
||||
/// Implement std::swap in terms of SmallVector swap.
|
||||
template<typename T>
|
||||
inline void
|
||||
@ -922,6 +926,7 @@ namespace std {
|
||||
swap(llvm::SmallVector<T, N> &LHS, llvm::SmallVector<T, N> &RHS) {
|
||||
LHS.swap(RHS);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
} // end namespace std
|
||||
|
||||
#endif // LLVM_ADT_SMALLVECTOR_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 <cassert>
|
||||
#include <cstdint>
|
||||
#include <cstdlib>
|
||||
#include <iterator>
|
||||
#include <limits>
|
||||
#include <utility>
|
||||
|
||||
namespace llvm {
|
||||
|
||||
@ -73,7 +81,7 @@ namespace llvm {
|
||||
/// @tparam SparseT An unsigned integer type. See above.
|
||||
///
|
||||
template<typename ValueT,
|
||||
typename KeyFunctorT = llvm::identity<unsigned>,
|
||||
typename KeyFunctorT = identity<unsigned>,
|
||||
typename SparseT = uint8_t>
|
||||
class SparseMultiSet {
|
||||
static_assert(std::numeric_limits<SparseT>::is_integer &&
|
||||
@ -113,16 +121,16 @@ class SparseMultiSet {
|
||||
typedef typename KeyFunctorT::argument_type KeyT;
|
||||
typedef SmallVector<SMSNode, 8> DenseT;
|
||||
DenseT Dense;
|
||||
SparseT *Sparse;
|
||||
unsigned Universe;
|
||||
SparseT *Sparse = nullptr;
|
||||
unsigned Universe = 0;
|
||||
KeyFunctorT KeyIndexOf;
|
||||
SparseSetValFunctor<KeyT, ValueT, KeyFunctorT> 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<std::bidirectional_iterator_tag,
|
||||
ValueT> {
|
||||
friend class SparseMultiSet;
|
||||
|
||||
SMSPtrTy SMS;
|
||||
unsigned Idx;
|
||||
unsigned SparseIdx;
|
||||
@ -515,4 +519,4 @@ private:
|
||||
|
||||
} // end namespace llvm
|
||||
|
||||
#endif
|
||||
#endif // LLVM_ADT_SPARSEMULTISET_H
|
||||
|
@ -22,8 +22,11 @@
|
||||
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/Support/DataTypes.h"
|
||||
#include <cassert>
|
||||
#include <cstdint>
|
||||
#include <cstdlib>
|
||||
#include <limits>
|
||||
#include <utility>
|
||||
|
||||
namespace llvm {
|
||||
|
||||
@ -115,7 +118,7 @@ struct SparseSetValFunctor<KeyT, KeyT, KeyFunctorT> {
|
||||
/// @tparam SparseT An unsigned integer type. See above.
|
||||
///
|
||||
template<typename ValueT,
|
||||
typename KeyFunctorT = llvm::identity<unsigned>,
|
||||
typename KeyFunctorT = identity<unsigned>,
|
||||
typename SparseT = uint8_t>
|
||||
class SparseSet {
|
||||
static_assert(std::numeric_limits<SparseT>::is_integer &&
|
||||
@ -126,16 +129,11 @@ class SparseSet {
|
||||
typedef SmallVector<ValueT, 8> DenseT;
|
||||
typedef unsigned size_type;
|
||||
DenseT Dense;
|
||||
SparseT *Sparse;
|
||||
unsigned Universe;
|
||||
SparseT *Sparse = nullptr;
|
||||
unsigned Universe = 0;
|
||||
KeyFunctorT KeyIndexOf;
|
||||
SparseSetValFunctor<KeyT, ValueT, KeyFunctorT> 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
|
||||
|
@ -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 <cassert>
|
||||
#include <cstdint>
|
||||
#include <string>
|
||||
|
||||
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
|
||||
|
@ -25,11 +25,9 @@
|
||||
#define LLVM_ADT_ILIST_H
|
||||
|
||||
#include "llvm/ADT/simple_ilist.h"
|
||||
#include "llvm/Support/Compiler.h"
|
||||
#include <cassert>
|
||||
#include <cstddef>
|
||||
#include <iterator>
|
||||
#include <type_traits>
|
||||
|
||||
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<IntrusiveListT *>(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<iplist_impl_type *>(this) = std::move(X);
|
||||
return *this;
|
||||
}
|
||||
iplist &operator=(const iplist &X) = delete;
|
||||
};
|
||||
|
||||
template <class T, class... Options> using ilist = iplist<T, Options...>;
|
||||
|
||||
} // End llvm namespace
|
||||
} // end namespace llvm
|
||||
|
||||
namespace std {
|
||||
|
||||
// Ensure that swap uses the fast list swap...
|
||||
template<class Ty>
|
||||
void swap(llvm::iplist<Ty> &Left, llvm::iplist<Ty> &Right) {
|
||||
Left.swap(Right);
|
||||
}
|
||||
} // End 'std' extensions...
|
||||
|
||||
} // end namespace std
|
||||
|
||||
#endif // LLVM_ADT_ILIST_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 <algorithm>
|
||||
#include <cassert>
|
||||
#include <climits>
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
|
||||
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<IndexAttrPair>() + Slot;
|
||||
}
|
||||
|
||||
// AttributesSet is uniqued, these should not be publicly available.
|
||||
void operator=(const AttributeSetImpl &) = delete;
|
||||
AttributeSetImpl(const AttributeSetImpl &) = delete;
|
||||
public:
|
||||
AttributeSetImpl(LLVMContext &C,
|
||||
ArrayRef<std::pair<unsigned, AttributeSetNode *> > Slots)
|
||||
ArrayRef<std::pair<unsigned, AttributeSetNode *>> 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<std::pair<unsigned, AttributeSetNode*> > Nodes) {
|
||||
for (unsigned i = 0, e = Nodes.size(); i != e; ++i) {
|
||||
ID.AddInteger(Nodes[i].first);
|
||||
ID.AddPointer(Nodes[i].second);
|
||||
ArrayRef<std::pair<unsigned, AttributeSetNode*>> 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
|
||||
|
@ -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 <algorithm>
|
||||
#include <climits>
|
||||
#include <cstdint>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
|
||||
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<Attribute> Attrs);
|
||||
@ -88,11 +96,11 @@ public:
|
||||
Profile(ID, makeArrayRef(begin(), end()));
|
||||
}
|
||||
static void Profile(FoldingSetNodeID &ID, ArrayRef<Attribute> 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
|
||||
|
@ -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 <cassert>
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
#include <utility>
|
||||
|
||||
#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<VectorType>(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<VectorType>(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<unsigned> 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<unsigned, 4> 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<unsigned> 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<unsigned, 4> Indices;
|
||||
|
||||
@ -224,10 +266,12 @@ public:
|
||||
class GetElementPtrConstantExpr : public ConstantExpr {
|
||||
Type *SrcElementTy;
|
||||
Type *ResElementTy;
|
||||
void anchor() override;
|
||||
|
||||
GetElementPtrConstantExpr(Type *SrcElementTy, Constant *C,
|
||||
ArrayRef<Constant *> IdxList, Type *DestTy);
|
||||
|
||||
void anchor() override;
|
||||
|
||||
public:
|
||||
static GetElementPtrConstantExpr *Create(Type *SrcElementTy, Constant *C,
|
||||
ArrayRef<Constant *> 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 <class ConstantClass> 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 <class ConstantClass> 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<Constant *, 32> 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
|
||||
|
Loading…
Reference in New Issue
Block a user