forked from OSchip/llvm-project
[sanitizer] Implement InternalScopedBuffer with InternalMmapVector
llvm-svn: 331616
This commit is contained in:
parent
4ba3e97333
commit
db4241a046
|
@ -151,49 +151,6 @@ typedef void (*fill_profile_f)(uptr start, uptr rss, bool file,
|
|||
// |stats_size| elements.
|
||||
void GetMemoryProfile(fill_profile_f cb, uptr *stats, uptr stats_size);
|
||||
|
||||
// InternalScopedBuffer can be used instead of large stack arrays to
|
||||
// keep frame size low.
|
||||
// FIXME: use InternalAlloc instead of MmapOrDie once
|
||||
// InternalAlloc is made libc-free.
|
||||
template <typename T>
|
||||
class InternalScopedBuffer {
|
||||
public:
|
||||
explicit InternalScopedBuffer(uptr cnt) {
|
||||
cnt_ = cnt;
|
||||
ptr_ = (T *)MmapOrDie(cnt * sizeof(T), "InternalScopedBuffer");
|
||||
}
|
||||
~InternalScopedBuffer() { UnmapOrDie(ptr_, cnt_ * sizeof(T)); }
|
||||
T &operator[](uptr i) { return ptr_[i]; }
|
||||
T *data() { return ptr_; }
|
||||
uptr size() { return cnt_; }
|
||||
|
||||
private:
|
||||
T *ptr_;
|
||||
uptr cnt_;
|
||||
// Disallow copies and moves.
|
||||
InternalScopedBuffer(const InternalScopedBuffer &) = delete;
|
||||
InternalScopedBuffer &operator=(const InternalScopedBuffer &) = delete;
|
||||
InternalScopedBuffer(InternalScopedBuffer &&) = delete;
|
||||
InternalScopedBuffer &operator=(InternalScopedBuffer &&) = delete;
|
||||
};
|
||||
|
||||
class InternalScopedString : public InternalScopedBuffer<char> {
|
||||
public:
|
||||
explicit InternalScopedString(uptr max_length)
|
||||
: InternalScopedBuffer<char>(max_length), length_(0) {
|
||||
(*this)[0] = '\0';
|
||||
}
|
||||
uptr length() { return length_; }
|
||||
void clear() {
|
||||
(*this)[0] = '\0';
|
||||
length_ = 0;
|
||||
}
|
||||
void append(const char *format, ...);
|
||||
|
||||
private:
|
||||
uptr length_;
|
||||
};
|
||||
|
||||
// Simple low-level (mmap-based) allocator for internal use. Doesn't have
|
||||
// constructor, so all instances of LowLevelAllocator should be
|
||||
// linker initialized.
|
||||
|
@ -574,9 +531,40 @@ class InternalMmapVector : public InternalMmapVectorNoCtor<T> {
|
|||
InternalMmapVectorNoCtor<T>::Initialize(initial_capacity);
|
||||
}
|
||||
~InternalMmapVector() { InternalMmapVectorNoCtor<T>::Destroy(); }
|
||||
// Disallow evil constructors.
|
||||
InternalMmapVector(const InternalMmapVector&);
|
||||
void operator=(const InternalMmapVector&);
|
||||
// Disallow copies and moves.
|
||||
InternalMmapVector(const InternalMmapVector &) = delete;
|
||||
InternalMmapVector &operator=(const InternalMmapVector &) = delete;
|
||||
InternalMmapVector(InternalMmapVector &&) = delete;
|
||||
InternalMmapVector &operator=(InternalMmapVector &&) = delete;
|
||||
};
|
||||
|
||||
// InternalScopedBuffer can be used instead of large stack arrays to
|
||||
// keep frame size low.
|
||||
// FIXME: use InternalAlloc instead of MmapOrDie once
|
||||
// InternalAlloc is made libc-free.
|
||||
template <typename T>
|
||||
class InternalScopedBuffer : public InternalMmapVector<T> {
|
||||
public:
|
||||
explicit InternalScopedBuffer(uptr cnt) : InternalMmapVector<T>(cnt) {
|
||||
this->resize(cnt);
|
||||
}
|
||||
};
|
||||
|
||||
class InternalScopedString : public InternalScopedBuffer<char> {
|
||||
public:
|
||||
explicit InternalScopedString(uptr max_length)
|
||||
: InternalScopedBuffer<char>(max_length), length_(0) {
|
||||
(*this)[0] = '\0';
|
||||
}
|
||||
uptr length() { return length_; }
|
||||
void clear() {
|
||||
(*this)[0] = '\0';
|
||||
length_ = 0;
|
||||
}
|
||||
void append(const char *format, ...);
|
||||
|
||||
private:
|
||||
uptr length_;
|
||||
};
|
||||
|
||||
// HeapSort for arrays and InternalMmapVector.
|
||||
|
|
Loading…
Reference in New Issue