From 59f0c12216432a3567afb321e082848b63e878fa Mon Sep 17 00:00:00 2001 From: Nerixyz Date: Wed, 5 Nov 2025 17:38:04 +0100 Subject: [PATCH] [MsDemangle] Use NodeList over SmallVector for target names --- llvm/lib/Demangle/MicrosoftDemangle.cpp | 50 ++++++++++++------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/llvm/lib/Demangle/MicrosoftDemangle.cpp b/llvm/lib/Demangle/MicrosoftDemangle.cpp index 250d382998982..0aefe6e077c24 100644 --- a/llvm/lib/Demangle/MicrosoftDemangle.cpp +++ b/llvm/lib/Demangle/MicrosoftDemangle.cpp @@ -15,8 +15,6 @@ #include "llvm/Demangle/MicrosoftDemangle.h" -#include "llvm/ADT/ArrayRef.h" -#include "llvm/ADT/SmallVector.h" #include "llvm/Demangle/Demangle.h" #include "llvm/Demangle/DemangleConfig.h" #include "llvm/Demangle/MicrosoftDemangleNodes.h" @@ -279,13 +277,16 @@ demanglePointerCVQualifiers(std::string_view &MangledName) { DEMANGLE_UNREACHABLE; } -static NodeArrayNode *smallVecToNodeArray(ArenaAllocator &Arena, - ArrayRef Vec) { - NodeArrayNode *Arr = Arena.alloc(); - Arr->Count = Vec.size(); - Arr->Nodes = Arena.allocArray(Vec.size()); - std::memcpy(Arr->Nodes, Vec.data(), Vec.size() * sizeof(Node *)); - return Arr; +static NodeArrayNode *nodeListToNodeArray(ArenaAllocator &Arena, NodeList *Head, + size_t Count) { + NodeArrayNode *N = Arena.alloc(); + N->Count = Count; + N->Nodes = Arena.allocArray(Count); + for (size_t I = 0; I < Count; ++I) { + N->Nodes[I] = Head->N; + Head = Head->Next; + } + return N; } std::string_view Demangler::copyString(std::string_view Borrowed) { @@ -335,17 +336,28 @@ Demangler::demangleSpecialTableSymbolNode(std::string_view &MangledName, std::tie(STSN->Quals, IsMember) = demangleQualifiers(MangledName); - SmallVector TargetNames; + NodeList *TargetCurrent = nullptr; + NodeList *TargetHead = nullptr; + size_t Count = 0; while (!consumeFront(MangledName, '@')) { + ++Count; + + NodeList *Next = Arena.alloc(); + if (TargetCurrent) + TargetCurrent->Next = Next; + else + TargetHead = Next; + + TargetCurrent = Next; QualifiedNameNode *QN = demangleFullyQualifiedTypeName(MangledName); if (Error) return nullptr; assert(QN); - TargetNames.push_back(QN); + TargetCurrent->N = QN; } - if (!TargetNames.empty()) - STSN->TargetNames = smallVecToNodeArray(Arena, TargetNames); + if (Count > 0) + STSN->TargetNames = nodeListToNodeArray(Arena, TargetHead, Count); return STSN; } @@ -1627,18 +1639,6 @@ Demangler::demangleNameScopePiece(std::string_view &MangledName) { return demangleSimpleName(MangledName, /*Memorize=*/true); } -static NodeArrayNode *nodeListToNodeArray(ArenaAllocator &Arena, NodeList *Head, - size_t Count) { - NodeArrayNode *N = Arena.alloc(); - N->Count = Count; - N->Nodes = Arena.allocArray(Count); - for (size_t I = 0; I < Count; ++I) { - N->Nodes[I] = Head->N; - Head = Head->Next; - } - return N; -} - QualifiedNameNode * Demangler::demangleNameScopeChain(std::string_view &MangledName, IdentifierNode *UnqualifiedName) {