14 #ifndef LLVM_CLANG_ANALYSIS_ANALYSES_THREADSAFETYUTIL_H 15 #define LLVM_CLANG_ANALYSIS_ANALYSES_THREADSAFETYUTIL_H 18 #include "llvm/ADT/StringRef.h" 19 #include "llvm/Support/AlignOf.h" 20 #include "llvm/Support/Allocator.h" 21 #include "llvm/Support/Compiler.h" 29 namespace threadSafety {
48 return Allocator->Allocate(Sz,
alignof(AlignmentType));
51 template <
typename T>
T *
allocateT() {
return Allocator->Allocate<
T>(); }
54 return Allocator->Allocate<
T>(NumElems);
58 llvm::BumpPtrAllocator *Allocator;
65 inline void *
operator new(
size_t Sz,
67 return R.allocate(Sz);
71 namespace threadSafety {
75 using llvm::StringRef;
86 : Data(Dat), Size(Sz), Capacity(Cp) {}
88 : Data(Cp == 0 ? nullptr : A.
allocateT<
T>(Cp)), Size(0), Capacity(Cp) {}
90 : Data(A.Data), Size(A.Size), Capacity(A.Capacity) {
100 Capacity = RHS.Capacity;
103 RHS.Size = RHS.Capacity = 0;
115 memcpy(Data, Odata,
sizeof(
T) * Size);
121 reserve(u_max(InitialCapacity, N), A);
122 else if (Size + N < Capacity)
123 reserve(u_max(Size + N, Capacity * 2), A);
131 size_t size()
const {
return Size; }
135 assert(i < Size &&
"Array index out of bounds.");
139 assert(i < Size &&
"Array index out of bounds.");
143 assert(Size &&
"No elements in the array.");
144 return Data[Size - 1];
147 assert(Size &&
"No elements in the array.");
148 return Data[Size - 1];
152 iterator
end() {
return Data + Size; }
154 const_iterator
begin()
const {
return Data; }
155 const_iterator
end()
const {
return Data + Size; }
157 const_iterator
cbegin()
const {
return Data; }
158 const_iterator
cend()
const {
return Data + Size; }
160 reverse_iterator
rbegin() {
return reverse_iterator(end()); }
161 reverse_iterator
rend() {
return reverse_iterator(begin()); }
164 return const_reverse_iterator(end());
166 const_reverse_iterator
rend()
const {
167 return const_reverse_iterator(begin());
171 assert(Size < Capacity);
182 assert(Sz <= Capacity);
184 for (
unsigned i = 0; i < Sz; ++i) {
189 template <
class Iter>
unsigned append(Iter I, Iter E) {
192 for (; J < Capacity && I != E; ++J, ++I)
198 llvm::iterator_range<reverse_iterator>
reverse() {
199 return llvm::make_range(rbegin(), rend());
201 llvm::iterator_range<const_reverse_iterator>
reverse()
const {
202 return llvm::make_range(rbegin(), rend());
208 size_t u_max(
size_t i,
size_t j) {
return (i < j) ? j : i; }
210 static const size_t InitialCapacity = 4;
231 VectorData() : NumRefs(1) { }
232 VectorData(
const VectorData &VD) : NumRefs(1), Vect(VD.Vect) { }
251 bool writable()
const {
return Data && Data->NumRefs == 1; }
256 Data =
new VectorData();
264 if (Data->NumRefs <= 1)
274 Data =
new VectorData();
277 if (Data->NumRefs == 1)
280 Data =
new VectorData(*Data);
295 const std::vector<T> &
elements()
const {
return Data->Vect; }
297 const_iterator
begin()
const {
return elements().cbegin(); }
298 const_iterator
end()
const {
return elements().cend(); }
302 unsigned size()
const {
return Data ? elements().size() : 0; }
309 assert(writable() &&
"Vector is not writable!");
315 assert(writable() &&
"Vector is not writable!");
316 Data->Vect.push_back(Elem);
322 assert(writable() &&
"Vector is not writable!");
323 return Data->Vect[i];
328 assert(writable() &&
"Vector is not writable!");
329 Data->Vect.erase(Data->Vect.begin() + i, Data->Vect.end());
342 inline std::ostream&
operator<<(std::ostream& ss,
const StringRef str) {
343 return ss.write(str.data(), str.size());
349 #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
Defines the clang::Expr interface and subclasses for C++ expressions.
void push_back(const T &Elem)
const_iterator cbegin() const
std::vector< T >::const_iterator const_iterator
T * allocateT(size_t NumElems)
const_iterator cend() const
void downsize(unsigned i)
const_iterator begin() const
llvm::iterator_range< reverse_iterator > reverse()
std::reverse_iterator< const_iterator > const_reverse_iterator
CopyOnWriteVector clone()
Expr - This represents one expression.
const FunctionProtoType * T
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)
Encodes a location in the source.
std::ostream & operator<<(std::ostream &ss, const StringRef str)
CopyOnWriteVector & operator=(CopyOnWriteVector &&V)
llvm::iterator_range< const_reverse_iterator > reverse() const
std::string getSourceLiteralString(const clang::Expr *CE)
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