|
15 | 15 |
|
16 | 16 | #include "llvm/Demangle/MicrosoftDemangle.h" |
17 | 17 |
|
18 | | -#include "llvm/ADT/ArrayRef.h" |
19 | | -#include "llvm/ADT/SmallVector.h" |
20 | 18 | #include "llvm/Demangle/Demangle.h" |
21 | 19 | #include "llvm/Demangle/DemangleConfig.h" |
22 | 20 | #include "llvm/Demangle/MicrosoftDemangleNodes.h" |
@@ -279,13 +277,16 @@ demanglePointerCVQualifiers(std::string_view &MangledName) { |
279 | 277 | DEMANGLE_UNREACHABLE; |
280 | 278 | } |
281 | 279 |
|
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; |
289 | 290 | } |
290 | 291 |
|
291 | 292 | std::string_view Demangler::copyString(std::string_view Borrowed) { |
@@ -335,17 +336,28 @@ Demangler::demangleSpecialTableSymbolNode(std::string_view &MangledName, |
335 | 336 |
|
336 | 337 | std::tie(STSN->Quals, IsMember) = demangleQualifiers(MangledName); |
337 | 338 |
|
338 | | - SmallVector<Node *, 1> TargetNames; |
| 339 | + NodeList *TargetCurrent = nullptr; |
| 340 | + NodeList *TargetHead = nullptr; |
| 341 | + size_t Count = 0; |
339 | 342 | 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; |
340 | 352 | QualifiedNameNode *QN = demangleFullyQualifiedTypeName(MangledName); |
341 | 353 | if (Error) |
342 | 354 | return nullptr; |
343 | 355 | assert(QN); |
344 | | - TargetNames.push_back(QN); |
| 356 | + TargetCurrent->N = QN; |
345 | 357 | } |
346 | 358 |
|
347 | | - if (!TargetNames.empty()) |
348 | | - STSN->TargetNames = smallVecToNodeArray(Arena, TargetNames); |
| 359 | + if (Count > 0) |
| 360 | + STSN->TargetNames = nodeListToNodeArray(Arena, TargetHead, Count); |
349 | 361 |
|
350 | 362 | return STSN; |
351 | 363 | } |
@@ -1627,18 +1639,6 @@ Demangler::demangleNameScopePiece(std::string_view &MangledName) { |
1627 | 1639 | return demangleSimpleName(MangledName, /*Memorize=*/true); |
1628 | 1640 | } |
1629 | 1641 |
|
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 | | - |
1642 | 1642 | QualifiedNameNode * |
1643 | 1643 | Demangler::demangleNameScopeChain(std::string_view &MangledName, |
1644 | 1644 | IdentifierNode *UnqualifiedName) { |
|
0 commit comments