[llvm] a1f0fe1 - [MsDemangle] Use NodeList over SmallVector for target names (#166586)

via llvm-commits llvm-commits at lists.llvm.org
Wed Nov 5 09:19:47 PST 2025


Author: nerix
Date: 2025-11-05T17:19:43Z
New Revision: a1f0fe140a0e8f15dcd33df42b2c8cf170f69db8

URL: https://github.com/llvm/llvm-project/commit/a1f0fe140a0e8f15dcd33df42b2c8cf170f69db8
DIFF: https://github.com/llvm/llvm-project/commit/a1f0fe140a0e8f15dcd33df42b2c8cf170f69db8.diff

LOG: [MsDemangle] Use NodeList over SmallVector for target names (#166586)

Using `SmallVector` would introduce a dependency cycle (see
https://github.com/llvm/llvm-project/pull/155630#discussion_r2495268497),
so this uses a NodeList.

Added: 
    

Modified: 
    llvm/lib/Demangle/MicrosoftDemangle.cpp

Removed: 
    


################################################################################
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<Node *> Vec) {
-  NodeArrayNode *Arr = Arena.alloc<NodeArrayNode>();
-  Arr->Count = Vec.size();
-  Arr->Nodes = Arena.allocArray<Node *>(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<NodeArrayNode>();
+  N->Count = Count;
+  N->Nodes = Arena.allocArray<Node *>(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<Node *, 1> TargetNames;
+  NodeList *TargetCurrent = nullptr;
+  NodeList *TargetHead = nullptr;
+  size_t Count = 0;
   while (!consumeFront(MangledName, '@')) {
+    ++Count;
+
+    NodeList *Next = Arena.alloc<NodeList>();
+    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<NodeArrayNode>();
-  N->Count = Count;
-  N->Nodes = Arena.allocArray<Node *>(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) {


        


More information about the llvm-commits mailing list