[compiler-rt] r333982 - [XRay][compiler-rt] Remove reliance on C++ ABI from BufferQueue

Dean Michael Berris via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 4 20:46:54 PDT 2018


Author: dberris
Date: Mon Jun  4 20:46:54 2018
New Revision: 333982

URL: http://llvm.org/viewvc/llvm-project?rev=333982&view=rev
Log:
[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

Modified:
    compiler-rt/trunk/lib/xray/xray_buffer_queue.cc
    compiler-rt/trunk/lib/xray/xray_buffer_queue.h

Modified: compiler-rt/trunk/lib/xray/xray_buffer_queue.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/xray/xray_buffer_queue.cc?rev=333982&r1=333981&r2=333982&view=diff
==============================================================================
--- compiler-rt/trunk/lib/xray/xray_buffer_queue.cc (original)
+++ compiler-rt/trunk/lib/xray/xray_buffer_queue.cc Mon Jun  4 20:46:54 2018
@@ -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);
 }

Modified: compiler-rt/trunk/lib/xray/xray_buffer_queue.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/xray/xray_buffer_queue.h?rev=333982&r1=333981&r2=333982&view=diff
==============================================================================
--- compiler-rt/trunk/lib/xray/xray_buffer_queue.h (original)
+++ compiler-rt/trunk/lib/xray/xray_buffer_queue.h Mon Jun  4 20:46:54 2018
@@ -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.




More information about the llvm-commits mailing list