# 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;