components/llvm/patches/012-TypeLocBuilder.cpp.patch
author John Beck <John.Beck@Oracle.COM>
Thu, 21 Jul 2016 12:51:35 -0700
changeset 6445 0edecb568b2e
parent 5434 9f55c805ce9d
permissions -rw-r--r--
23858073 Upgrade Python 2.7 line to 2.7.12

# https://llvm.org/bugs/show_bug.cgi?id=24615
--- tools/clang/lib/Sema/TypeLocBuilder.h	2014-08-13 09:25:19.000000000 -0700
+++ tools/clang/lib/Sema/TypeLocBuilder.h	2015-08-28 16:45:41.733661825 -0700
@@ -39,7 +39,7 @@
 #endif
     
   /// The inline buffer.
-  enum { BufferMaxAlignment = llvm::AlignOf<void*>::Alignment };
+  enum { BufferMaxAlignment = llvm::AlignOf<uint64_t>::Alignment };
   llvm::AlignedCharArray<BufferMaxAlignment, InlineCapacity> InlineBuffer;
   unsigned NumBytesAtAlign4, NumBytesAtAlign8;
 
@@ -52,7 +52,7 @@
 
   ~TypeLocBuilder() {
     if (Buffer != InlineBuffer.buffer)
-      delete[] Buffer;
+      std::free(Buffer);
   }
 
   /// Ensures that this buffer has at least as much capacity as described.
--- tools/clang/lib/Sema/TypeLocBuilder.cpp	2014-05-25 23:22:03.000000000 -0700
+++ tools/clang/lib/Sema/TypeLocBuilder.cpp	2015-08-25 18:53:43.000000000 -0700
@@ -13,6 +13,8 @@
 //===----------------------------------------------------------------------===//
 
 #include "TypeLocBuilder.h"
+#include <cstring>
+#include <stdlib.h>
 
 using namespace clang;
 
@@ -46,14 +48,36 @@
   assert(NewCapacity > Capacity);
 
   // Allocate the new buffer and copy the old data into it.
-  char *NewBuffer = new char[NewCapacity];
+  char *NewBuffer;
+
+#if defined(_MSC_VER)
+  NewBuffer = _aligned_malloc(NewCapacity, (size_t) BufferMaxAlignment);
+  assert(NewBuffer && "_aligned_malloc failed!");
+  if (!NewBuffer) {
+    llvm::errs() << __PRETTY_FUNCTION__ << ": _aligned_malloc failed!\n";
+    abort();
+  }
+#else
+  int R = posix_memalign((void**) &NewBuffer,
+                         (size_t) BufferMaxAlignment, NewCapacity);
+  assert((R == 0) && "posix_memalign failed!");
+  assert(NewBuffer && "posix_memalign failed!");
+  if ((R != 0) || (!NewBuffer)) {
+    llvm::errs() << __PRETTY_FUNCTION__ << ": posix_memalign failed!\n";
+    abort();
+  }
+#endif
+
+  (void) std::memset(NewBuffer, 0, NewCapacity);
+
   unsigned NewIndex = Index + NewCapacity - Capacity;
-  memcpy(&NewBuffer[NewIndex],
+  (void) std::memcpy(&NewBuffer[NewIndex],
          &Buffer[Index],
          Capacity - Index);
 
-  if (Buffer != InlineBuffer.buffer)
-    delete[] Buffer;
+  if (Buffer != InlineBuffer.buffer) {
+    std::free(Buffer);
+  }
 
   Buffer = NewBuffer;
   Capacity = NewCapacity;