[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