[llvm] r358489 - llvm-undname: Tweak arena allocator

Nico Weber via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 16 06:52:30 PDT 2019


Author: nico
Date: Tue Apr 16 06:52:30 2019
New Revision: 358489

URL: http://llvm.org/viewvc/llvm-project?rev=358489&view=rev
Log:
llvm-undname: Tweak arena allocator

- Make `allocUnalignedBuffer` look more like `allocArray` and `alloc`.
  No behavior change.
- Change `Head->Used < Head->Capacity` to `Head->Used <= Head->Capacity`
  in `allocArray` and `alloc`. No intended behavior change, might be a
  minuscule memory usage improvement. Noticed this since it was the logic
  used in `allocUnalignedBuffer`.
- Don't let `allocArray` alloc too small buffers for names that have
  more than 512 levels of nesting (in 64-bit builds). Fixes a heap
  buffer overflow found by oss-fuzz.

Differential Revision: https://reviews.llvm.org/D60774

Modified:
    llvm/trunk/include/llvm/Demangle/MicrosoftDemangle.h
    llvm/trunk/test/Demangle/ms-nested-scopes.test

Modified: llvm/trunk/include/llvm/Demangle/MicrosoftDemangle.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Demangle/MicrosoftDemangle.h?rev=358489&r1=358488&r2=358489&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Demangle/MicrosoftDemangle.h (original)
+++ llvm/trunk/include/llvm/Demangle/MicrosoftDemangle.h Tue Apr 16 06:52:30 2019
@@ -55,24 +55,21 @@ public:
     }
   }
 
-  char *allocUnalignedBuffer(size_t Length) {
-    uint8_t *Buf = Head->Buf + Head->Used;
+  char *allocUnalignedBuffer(size_t Size) {
+    assert(Head && Head->Buf);
 
-    Head->Used += Length;
-    if (Head->Used > Head->Capacity) {
-      // It's possible we need a buffer which is larger than our default unit
-      // size, so we need to be careful to add a node with capacity that is at
-      // least as large as what we need.
-      addNode(std::max(AllocUnit, Length));
-      Head->Used = Length;
-      Buf = Head->Buf;
-    }
+    uint8_t *P = Head->Buf + Head->Used;
 
-    return reinterpret_cast<char *>(Buf);
+    Head->Used += Size;
+    if (Head->Used <= Head->Capacity)
+      return reinterpret_cast<char *>(P);
+
+    addNode(std::max(AllocUnit, Size));
+    Head->Used = Size;
+    return reinterpret_cast<char *>(Head->Buf);
   }
 
   template <typename T, typename... Args> T *allocArray(size_t Count) {
-
     size_t Size = Count * sizeof(T);
     assert(Head && Head->Buf);
 
@@ -83,17 +80,16 @@ public:
     size_t Adjustment = AlignedP - P;
 
     Head->Used += Size + Adjustment;
-    if (Head->Used < Head->Capacity)
+    if (Head->Used <= Head->Capacity)
       return new (PP) T[Count]();
 
-    addNode(AllocUnit);
+    addNode(std::max(AllocUnit, Size));
     Head->Used = Size;
     return new (Head->Buf) T[Count]();
   }
 
   template <typename T, typename... Args> T *alloc(Args &&... ConstructorArgs) {
-
-    size_t Size = sizeof(T);
+    constexpr size_t Size = sizeof(T);
     assert(Head && Head->Buf);
 
     size_t P = (size_t)Head->Buf + Head->Used;
@@ -103,9 +99,10 @@ public:
     size_t Adjustment = AlignedP - P;
 
     Head->Used += Size + Adjustment;
-    if (Head->Used < Head->Capacity)
+    if (Head->Used <= Head->Capacity)
       return new (PP) T(std::forward<Args>(ConstructorArgs)...);
 
+    static_assert(Size < AllocUnit, "");
     addNode(AllocUnit);
     Head->Used = Size;
     return new (Head->Buf) T(std::forward<Args>(ConstructorArgs)...);

Modified: llvm/trunk/test/Demangle/ms-nested-scopes.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Demangle/ms-nested-scopes.test?rev=358489&r1=358488&r2=358489&view=diff
==============================================================================
--- llvm/trunk/test/Demangle/ms-nested-scopes.test (original)
+++ llvm/trunk/test/Demangle/ms-nested-scopes.test Tue Apr 16 06:52:30 2019
@@ -144,3 +144,6 @@
 
 ?A@?1??B@?$C at H@C at 1310@QEAAHXZ at 4HA
 ; CHECK: int `public: int __cdecl A::B::C::B::C::C<int>::B(void)'::`2'::A
+
+?a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a at a@a@@3HA
+; CHECK: int a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a::a




More information about the llvm-commits mailing list