[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