14 #ifndef LLVM_CLANG_ANALYSIS_ANALYSES_THREADSAFETYUTIL_H 15 #define LLVM_CLANG_ANALYSIS_ANALYSES_THREADSAFETYUTIL_H 19 #include "llvm/ADT/StringRef.h" 20 #include "llvm/ADT/iterator_range.h" 21 #include "llvm/Support/Allocator.h" 34 namespace threadSafety {
53 return Allocator->Allocate(Sz,
alignof(AlignmentType));
56 template <
typename T> T *
allocateT() {
return Allocator->Allocate<T>(); }
58 template <
typename T> T *
allocateT(
size_t NumElems) {
59 return Allocator->Allocate<T>(NumElems);
63 llvm::BumpPtrAllocator *Allocator =
nullptr;
71 inline void *
operator new(
size_t Sz,
73 return R.allocate(Sz);
77 namespace threadSafety {
89 : Data(Dat), Size(Sz), Capacity(Cp) {}
91 : Data(Cp == 0 ? nullptr : A.
allocateT<T>(Cp)), Capacity(Cp) {}
95 : Data(A.Data), Size(A.Size), Capacity(A.Capacity) {
105 Capacity = RHS.Capacity;
108 RHS.Size = RHS.Capacity = 0;
120 memcpy(Data, Odata,
sizeof(T) * Size);
126 reserve(u_max(InitialCapacity, N), A);
127 else if (Size + N < Capacity)
128 reserve(u_max(Size + N, Capacity * 2), A);
136 size_t size()
const {
return Size; }
140 assert(i < Size &&
"Array index out of bounds.");
145 assert(i < Size &&
"Array index out of bounds.");
150 assert(Size &&
"No elements in the array.");
151 return Data[Size - 1];
155 assert(Size &&
"No elements in the array.");
156 return Data[Size - 1];
180 assert(Size < Capacity);
191 assert(Sz <= Capacity);
193 for (
unsigned i = 0; i < Sz; ++i) {
198 template <
class Iter>
unsigned append(Iter I, Iter E) {
201 for (; J < Capacity && I != E; ++J, ++I)
207 llvm::iterator_range<reverse_iterator>
reverse() {
208 return llvm::make_range(rbegin(), rend());
211 llvm::iterator_range<const_reverse_iterator>
reverse()
const {
212 return llvm::make_range(rbegin(), rend());
218 size_t u_max(
size_t i,
size_t j) {
return (i < j) ? j : i; }
220 static const size_t InitialCapacity = 4;
239 unsigned NumRefs = 1;
242 VectorData() =
default;
243 VectorData(
const VectorData &VD) : Vect(VD.Vect) {}
267 bool writable()
const {
return Data && Data->NumRefs == 1; }
272 Data =
new VectorData();
280 if (Data->NumRefs <= 1)
290 Data =
new VectorData();
293 if (Data->NumRefs == 1)
296 Data =
new VectorData(*Data);
304 const std::vector<T> &
elements()
const {
return Data->Vect; }
309 const T&
operator[](
unsigned i)
const {
return elements()[i]; }
311 unsigned size()
const {
return Data ? elements().size() : 0; }
318 assert(writable() &&
"Vector is not writable!");
324 assert(writable() &&
"Vector is not writable!");
325 Data->Vect.push_back(Elem);
331 assert(writable() &&
"Vector is not writable!");
332 return Data->Vect[i];
337 assert(writable() &&
"Vector is not writable!");
338 Data->Vect.erase(Data->Vect.begin() + i, Data->Vect.end());
348 VectorData *Data =
nullptr;
351 inline std::ostream&
operator<<(std::ostream& ss,
const StringRef str) {
352 return ss.write(str.data(), str.size());
358 #endif // LLVM_CLANG_THREAD_SAFETY_UTIL_H
SimpleArray(T *Dat, size_t Cp, size_t Sz=0)
void push_back(const T &Elem)
const_reverse_iterator rbegin() const
std::string getSourceLiteralString(const Expr *CE)
typename std::vector< NameVarPair >::const_iterator const_iterator
void push_back(const T &Elem)
const_iterator cbegin() const
T * allocateT(size_t NumElems)
const_iterator cend() const
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified...
void downsize(unsigned i)
A basic block is part of an SCFG.
const_iterator begin() const
llvm::iterator_range< reverse_iterator > reverse()
CopyOnWriteVector clone()
std::reverse_iterator< iterator > reverse_iterator
const_iterator end() const
reverse_iterator rbegin()
const_iterator begin() const
const T & operator[](unsigned i) const
T & operator[](unsigned i)
std::ostream & operator<<(std::ostream &ss, const StringRef str)
CopyOnWriteVector & operator=(CopyOnWriteVector &&V)
llvm::iterator_range< const_reverse_iterator > reverse() const
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
bool sameAs(const CopyOnWriteVector &V) const
void reserveCheck(size_t N, MemRegionRef A)
const_reverse_iterator rend() const
Dataflow Directional Tag Classes.
const_iterator end() const
SimpleArray(SimpleArray< T > &&A)
unsigned append(Iter I, Iter E)
const std::vector< T > & elements() const
MemRegionRef(llvm::BumpPtrAllocator *A)
void setValues(unsigned Sz, const T &C)
void reserve(size_t Ncp, MemRegionRef A)
SimpleArray(MemRegionRef A, size_t Cp)
SimpleArray & operator=(SimpleArray &&RHS)
void * allocate(size_t Sz)
CopyOnWriteVector(CopyOnWriteVector &&V)
const T & operator[](unsigned i) const
std::reverse_iterator< const_iterator > const_reverse_iterator