summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDean Michael Berris <dberris@google.com>2018-06-05 03:46:54 +0000
committerDean Michael Berris <dberris@google.com>2018-06-05 03:46:54 +0000
commit5db124d9c36ec78fd4b1b8c7407a81dab6810ef0 (patch)
treec5ae5885be480ca41db4f3b3d58efbdc59e94352 /lib
parent393b329e7345976d7d0c5ee08425eacb34b4c5be (diff)
[XRay][compiler-rt] Remove reliance on C++ ABI from BufferQueue
Summary: This is part of the work to address http://llvm.org/PR32274. We remove the calls to array-placement-new and array-delete. This allows us to rely on the internal memory management provided by sanitizer_common/sanitizer_internal_allocator.h. Reviewers: eizan, kpw Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D47695 git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@333982 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/xray/xray_buffer_queue.cc35
-rw-r--r--lib/xray/xray_buffer_queue.h2
2 files changed, 31 insertions, 6 deletions
diff --git a/lib/xray/xray_buffer_queue.cc b/lib/xray/xray_buffer_queue.cc
index a2e97f943..dc5023862 100644
--- a/lib/xray/xray_buffer_queue.cc
+++ b/lib/xray/xray_buffer_queue.cc
@@ -16,14 +16,37 @@
#include "sanitizer_common/sanitizer_allocator_internal.h"
#include "sanitizer_common/sanitizer_common.h"
#include "sanitizer_common/sanitizer_libc.h"
+#include <memory>
using namespace __xray;
using namespace __sanitizer;
+template <class T> static T *initArray(size_t N) {
+ auto A = reinterpret_cast<T *>(
+ InternalAlloc(N * sizeof(T), nullptr, kCacheLineSize));
+ if (A != nullptr)
+ while (N > 0)
+ new (A + (--N)) T();
+ return A;
+}
+
BufferQueue::BufferQueue(size_t B, size_t N, bool &Success)
- : BufferSize(B), Buffers(new BufferRep[N]()), BufferCount(N), Finalizing{0},
- OwnedBuffers(new void *[N]()), Next(Buffers), First(Buffers),
- LiveBuffers(0) {
+ : BufferSize(B), Buffers(initArray<BufferQueue::BufferRep>(N)),
+ BufferCount(N), Finalizing{0}, OwnedBuffers(initArray<void *>(N)),
+ Next(Buffers), First(Buffers), LiveBuffers(0) {
+ if (Buffers == nullptr) {
+ Success = false;
+ return;
+ }
+ if (OwnedBuffers == nullptr) {
+ // Clean up the buffers we've already allocated.
+ for (auto B = Buffers, E = Buffers + BufferCount; B != E; ++B)
+ B->~BufferRep();
+ InternalFree(Buffers);
+ Success = false;
+ return;
+ };
+
for (size_t i = 0; i < N; ++i) {
auto &T = Buffers[i];
void *Tmp = InternalAlloc(BufferSize, nullptr, 64);
@@ -109,6 +132,8 @@ BufferQueue::~BufferQueue() {
InternalFree(Buf.Data);
InternalFree(Buf.Extents);
}
- delete[] Buffers;
- delete[] OwnedBuffers;
+ for (auto B = Buffers, E = Buffers + BufferCount; B != E; ++B)
+ B->~BufferRep();
+ InternalFree(Buffers);
+ InternalFree(OwnedBuffers);
}
diff --git a/lib/xray/xray_buffer_queue.h b/lib/xray/xray_buffer_queue.h
index 3f61263a8..70e64b453 100644
--- a/lib/xray/xray_buffer_queue.h
+++ b/lib/xray/xray_buffer_queue.h
@@ -39,7 +39,6 @@ public:
BufferExtents *Extents;
};
-private:
struct BufferRep {
// The managed buffer.
Buffer Buff;
@@ -49,6 +48,7 @@ private:
bool Used = false;
};
+private:
// This models a ForwardIterator. |T| Must be either a `Buffer` or `const
// Buffer`. Note that we only advance to the "used" buffers, when
// incrementing, so that at dereference we're always at a valid point.