<div dir="ltr">This is causing memory leaks:  <a href="http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/21207">http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/21207</a>.  Please take a look.<div><br></div><div><pre style="font-family:"Courier New",courier,monotype,monospace;color:rgb(0,0,0);font-size:medium;text-decoration-style:initial;text-decoration-color:initial"><span class="gmail-stdout" style="font-family:"Courier New",courier,monotype,monospace;color:black">==38753==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 1776 byte(s) in 74 object(s) allocated from:
    #0 0x50cfa8 in operator new(unsigned long) /b/sanitizer-x86_64-linux-fast/build/llvm/projects/compiler-rt/lib/asan/asan_new_delete.cc:92
    #1 0x51452e in ArenaAllocator /b/sanitizer-x86_64-linux-fast/build/llvm/lib/Demangle/MicrosoftDemangle.cpp:39:27
    #2 0x51452e in Demangler /b/sanitizer-x86_64-linux-fast/build/llvm/lib/Demangle/MicrosoftDemangle.cpp:594
    #3 0x51452e in llvm::microsoftDemangle(char const*, char*, unsigned long*, int*) /b/sanitizer-x86_64-linux-fast/build/llvm/lib/Demangle/MicrosoftDemangle.cpp:1535
    #4 0x5128c0 in demangle(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) /b/sanitizer-x86_64-linux-fast/build/llvm/tools/llvm-undname/llvm-undname.cpp:34:21
    #5 0x5122b9 in main /b/sanitizer-x86_64-linux-fast/build/llvm/tools/llvm-undname/llvm-undname.cpp:67:7
    #6 0x7f9756c832e0 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x202e0)

SUMMARY: AddressSanitizer: 1776 byte(s) leaked in 74 allocation(s).
</span></pre><br class="gmail-Apple-interchange-newline"><br></div></div><br><div class="gmail_quote"><div dir="ltr">On Fri, Jul 20, 2018 at 11:40 AM Zachary Turner via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: zturner<br>
Date: Fri Jul 20 11:35:06 2018<br>
New Revision: 337596<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=337596&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=337596&view=rev</a><br>
Log:<br>
[Demangler] Correctly factor in assignment when allocating.<br>
<br>
Incidentally all allocations that we currently perform were<br>
properly aligned, but this was only an accident.<br>
<br>
Thanks to Erik Pilkington for catching this.<br>
<br>
Modified:<br>
    llvm/trunk/lib/Demangle/MicrosoftDemangle.cpp<br>
<br>
Modified: llvm/trunk/lib/Demangle/MicrosoftDemangle.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Demangle/MicrosoftDemangle.cpp?rev=337596&r1=337595&r2=337596&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Demangle/MicrosoftDemangle.cpp?rev=337596&r1=337595&r2=337596&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Demangle/MicrosoftDemangle.cpp (original)<br>
+++ llvm/trunk/lib/Demangle/MicrosoftDemangle.cpp Fri Jul 20 11:35:06 2018<br>
@@ -46,21 +46,28 @@ public:<br>
     }<br>
   }<br>
<br>
-  void *alloc(size_t Size) {<br>
+  template <typename T, typename... Args> T *alloc(Args &&... ConstructorArgs) {<br>
+<br>
+    size_t Size = sizeof(T);<br>
     assert(Size < Unit);<br>
     assert(Head && Head->Buf);<br>
<br>
-    uint8_t *P = Head->Buf + Head->Used;<br>
-    Head->Used += Size;<br>
+    size_t P = (size_t)Head->Buf + Head->Used;<br>
+    uintptr_t AlignedP =<br>
+        (((size_t)P + alignof(T) - 1) & ~(size_t)(alignof(T) - 1));<br>
+    uint8_t *PP = (uint8_t *)AlignedP;<br>
+    size_t Adjustment = AlignedP - P;<br>
+<br>
+    Head->Used += Size + Adjustment;<br>
     if (Head->Used < Unit)<br>
-      return P;<br>
+      return new (PP) T(std::forward<Args>(ConstructorArgs)...);<br>
<br>
     AllocatorNode *NewHead = new AllocatorNode;<br>
     NewHead->Buf = new uint8_t[ArenaAllocator::Unit];<br>
     NewHead->Next = Head;<br>
     Head = NewHead;<br>
     NewHead->Used = Size;<br>
-    return NewHead->Buf;<br>
+    return new (NewHead->Buf) T(std::forward<Args>(ConstructorArgs)...);<br>
   }<br>
<br>
 private:<br>
@@ -84,8 +91,6 @@ static void outputSpaceIfNecessary(Outpu<br>
     OS << " ";<br>
 }<br>
<br>
-void *operator new(size_t Size, ArenaAllocator &A) { return A.alloc(Size); }<br>
-<br>
 // Storage classes<br>
 enum Qualifiers : uint8_t {<br>
   Q_None = 0,<br>
@@ -374,7 +379,7 @@ static void outputName(OutputStream &OS,<br>
 namespace {<br>
<br>
 Type *Type::clone(ArenaAllocator &Arena) const {<br>
-  return new (Arena) Type(*this);<br>
+  return Arena.alloc<Type>(*this);<br>
 }<br>
<br>
 // Write the "first half" of a given type.<br>
@@ -471,7 +476,7 @@ void Type::outputPre(OutputStream &OS) {<br>
 void Type::outputPost(OutputStream &OS) {}<br>
<br>
 Type *PointerType::clone(ArenaAllocator &Arena) const {<br>
-  return new (Arena) PointerType(*this);<br>
+  return Arena.alloc<PointerType>(*this);<br>
 }<br>
<br>
 void PointerType::outputPre(OutputStream &OS) {<br>
@@ -509,7 +514,7 @@ void PointerType::outputPost(OutputStrea<br>
 }<br>
<br>
 Type *FunctionType::clone(ArenaAllocator &Arena) const {<br>
-  return new (Arena) FunctionType(*this);<br>
+  return Arena.alloc<FunctionType>(*this);<br>
 }<br>
<br>
 void FunctionType::outputPre(OutputStream &OS) {<br>
@@ -536,7 +541,7 @@ void FunctionType::outputPost(OutputStre<br>
 }<br>
<br>
 Type *UdtType::clone(ArenaAllocator &Arena) const {<br>
-  return new (Arena) UdtType(*this);<br>
+  return Arena.alloc<UdtType>(*this);<br>
 }<br>
<br>
 void UdtType::outputPre(OutputStream &OS) {<br>
@@ -561,7 +566,7 @@ void UdtType::outputPre(OutputStream &OS<br>
 }<br>
<br>
 Type *ArrayType::clone(ArenaAllocator &Arena) const {<br>
-  return new (Arena) ArrayType(*this);<br>
+  return Arena.alloc<ArrayType>(*this);<br>
 }<br>
<br>
 void ArrayType::outputPre(OutputStream &OS) {<br>
@@ -659,9 +664,9 @@ private:<br>
 void Demangler::parse() {<br>
   // MSVC-style mangled symbols must start with '?'.<br>
   if (!MangledName.consumeFront("?")) {<br>
-    SymbolName = new (Arena) Name;<br>
+    SymbolName = Arena.alloc<Name>();<br>
     SymbolName->Str = MangledName;<br>
-    SymbolType = new (Arena) Type;<br>
+    SymbolType = Arena.alloc<Type>();<br>
     SymbolType->Prim = PrimTy::Unknown;<br>
   }<br>
<br>
@@ -832,7 +837,7 @@ Name *Demangler::demangleName() {<br>
   Name *Head = nullptr;<br>
<br>
   while (!MangledName.consumeFront("@")) {<br>
-    Name *Elem = new (Arena) Name;<br>
+    Name *Elem = Arena.alloc<Name>();<br>
<br>
     assert(!Error);<br>
     demangleNamePiece(*Elem, Head == nullptr);<br>
@@ -1239,7 +1244,7 @@ ReferenceKind Demangler::demangleReferen<br>
 }<br>
<br>
 Type *Demangler::demangleFunctionEncoding() {<br>
-  FunctionType *FTy = new (Arena) FunctionType;<br>
+  FunctionType *FTy = Arena.alloc<FunctionType>();<br>
<br>
   FTy->Prim = PrimTy::Function;<br>
   FTy->FunctionClass = (FuncClass)demangleFunctionClass();<br>
@@ -1265,7 +1270,7 @@ Type *Demangler::demangleFunctionEncodin<br>
<br>
 // Reads a primitive type.<br>
 Type *Demangler::demangleBasicType() {<br>
-  Type *Ty = new (Arena) Type;<br>
+  Type *Ty = Arena.alloc<Type>();<br>
<br>
   switch (MangledName.popFront()) {<br>
   case 'X':<br>
@@ -1335,7 +1340,7 @@ Type *Demangler::demangleBasicType() {<br>
 }<br>
<br>
 UdtType *Demangler::demangleClassType() {<br>
-  UdtType *UTy = new (Arena) UdtType;<br>
+  UdtType *UTy = Arena.alloc<UdtType>();<br>
<br>
   switch (MangledName.popFront()) {<br>
   case 'T':<br>
@@ -1365,7 +1370,7 @@ UdtType *Demangler::demangleClassType()<br>
 // <pointer-type> ::= E? <pointer-cvr-qualifiers> <ext-qualifiers> <type><br>
 //                       # the E is required for 64-bit non-static pointers<br>
 PointerType *Demangler::demanglePointerType() {<br>
-  PointerType *Pointer = new (Arena) PointerType;<br>
+  PointerType *Pointer = Arena.alloc<PointerType>();<br>
<br>
   Pointer->Quals = Q_None;<br>
   switch (MangledName.popFront()) {<br>
@@ -1392,7 +1397,7 @@ PointerType *Demangler::demanglePointerT<br>
   }<br>
<br>
   if (MangledName.consumeFront("6")) {<br>
-    FunctionType *FTy = new (Arena) FunctionType;<br>
+    FunctionType *FTy = Arena.alloc<FunctionType>();<br>
     FTy->Prim = PrimTy::Function;<br>
     FTy->CallConvention = demangleCallingConvention();<br>
<br>
@@ -1435,12 +1440,12 @@ ArrayType *Demangler::demangleArrayType(<br>
     return nullptr;<br>
   }<br>
<br>
-  ArrayType *ATy = new (Arena) ArrayType;<br>
+  ArrayType *ATy = Arena.alloc<ArrayType>();<br>
   ArrayType *Dim = ATy;<br>
   for (int I = 0; I < Dimension; ++I) {<br>
     Dim->Prim = PrimTy::Array;<br>
     Dim->ArrayDimension = demangleNumber();<br>
-    Dim->NextDimension = new (Arena) ArrayType;<br>
+    Dim->NextDimension = Arena.alloc<ArrayType>();<br>
     Dim = Dim->NextDimension;<br>
   }<br>
<br>
@@ -1476,7 +1481,7 @@ ParamList Demangler::demangleParameterLi<br>
       }<br>
       MangledName = MangledName.dropFront();<br>
<br>
-      *Current = new (Arena) ParamList;<br>
+      *Current = Arena.alloc<ParamList>();<br>
       (*Current)->Current = BackRef[N]->clone(Arena);<br>
       Current = &(*Current)->Next;<br>
       continue;<br>
@@ -1484,7 +1489,7 @@ ParamList Demangler::demangleParameterLi<br>
<br>
     size_t ArrayDimension = MangledName.size();<br>
<br>
-    *Current = new (Arena) ParamList;<br>
+    *Current = Arena.alloc<ParamList>();<br>
     (*Current)->Current = demangleType(QualifierMangleMode::Drop);<br>
<br>
     // Single-letter types are ignored for backreferences because<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>