Skip to content

Commit a1f0fe1

Browse files
authored
[MsDemangle] Use NodeList over SmallVector for target names (llvm#166586)
Using `SmallVector` would introduce a dependency cycle (see llvm#155630 (comment)), so this uses a NodeList.
1 parent 6312d27 commit a1f0fe1

File tree

1 file changed

+25
-25
lines changed

1 file changed

+25
-25
lines changed

llvm/lib/Demangle/MicrosoftDemangle.cpp

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515

1616
#include "llvm/Demangle/MicrosoftDemangle.h"
1717

18-
#include "llvm/ADT/ArrayRef.h"
19-
#include "llvm/ADT/SmallVector.h"
2018
#include "llvm/Demangle/Demangle.h"
2119
#include "llvm/Demangle/DemangleConfig.h"
2220
#include "llvm/Demangle/MicrosoftDemangleNodes.h"
@@ -279,13 +277,16 @@ demanglePointerCVQualifiers(std::string_view &MangledName) {
279277
DEMANGLE_UNREACHABLE;
280278
}
281279

282-
static NodeArrayNode *smallVecToNodeArray(ArenaAllocator &Arena,
283-
ArrayRef<Node *> Vec) {
284-
NodeArrayNode *Arr = Arena.alloc<NodeArrayNode>();
285-
Arr->Count = Vec.size();
286-
Arr->Nodes = Arena.allocArray<Node *>(Vec.size());
287-
std::memcpy(Arr->Nodes, Vec.data(), Vec.size() * sizeof(Node *));
288-
return Arr;
280+
static NodeArrayNode *nodeListToNodeArray(ArenaAllocator &Arena, NodeList *Head,
281+
size_t Count) {
282+
NodeArrayNode *N = Arena.alloc<NodeArrayNode>();
283+
N->Count = Count;
284+
N->Nodes = Arena.allocArray<Node *>(Count);
285+
for (size_t I = 0; I < Count; ++I) {
286+
N->Nodes[I] = Head->N;
287+
Head = Head->Next;
288+
}
289+
return N;
289290
}
290291

291292
std::string_view Demangler::copyString(std::string_view Borrowed) {
@@ -335,17 +336,28 @@ Demangler::demangleSpecialTableSymbolNode(std::string_view &MangledName,
335336

336337
std::tie(STSN->Quals, IsMember) = demangleQualifiers(MangledName);
337338

338-
SmallVector<Node *, 1> TargetNames;
339+
NodeList *TargetCurrent = nullptr;
340+
NodeList *TargetHead = nullptr;
341+
size_t Count = 0;
339342
while (!consumeFront(MangledName, '@')) {
343+
++Count;
344+
345+
NodeList *Next = Arena.alloc<NodeList>();
346+
if (TargetCurrent)
347+
TargetCurrent->Next = Next;
348+
else
349+
TargetHead = Next;
350+
351+
TargetCurrent = Next;
340352
QualifiedNameNode *QN = demangleFullyQualifiedTypeName(MangledName);
341353
if (Error)
342354
return nullptr;
343355
assert(QN);
344-
TargetNames.push_back(QN);
356+
TargetCurrent->N = QN;
345357
}
346358

347-
if (!TargetNames.empty())
348-
STSN->TargetNames = smallVecToNodeArray(Arena, TargetNames);
359+
if (Count > 0)
360+
STSN->TargetNames = nodeListToNodeArray(Arena, TargetHead, Count);
349361

350362
return STSN;
351363
}
@@ -1627,18 +1639,6 @@ Demangler::demangleNameScopePiece(std::string_view &MangledName) {
16271639
return demangleSimpleName(MangledName, /*Memorize=*/true);
16281640
}
16291641

1630-
static NodeArrayNode *nodeListToNodeArray(ArenaAllocator &Arena, NodeList *Head,
1631-
size_t Count) {
1632-
NodeArrayNode *N = Arena.alloc<NodeArrayNode>();
1633-
N->Count = Count;
1634-
N->Nodes = Arena.allocArray<Node *>(Count);
1635-
for (size_t I = 0; I < Count; ++I) {
1636-
N->Nodes[I] = Head->N;
1637-
Head = Head->Next;
1638-
}
1639-
return N;
1640-
}
1641-
16421642
QualifiedNameNode *
16431643
Demangler::demangleNameScopeChain(std::string_view &MangledName,
16441644
IdentifierNode *UnqualifiedName) {

0 commit comments

Comments
 (0)