|
15 | 15 |
|
16 | 16 | #include "llvm/Demangle/MicrosoftDemangle.h" |
17 | 17 |
|
| 18 | +#include "llvm/ADT/ArrayRef.h" |
| 19 | +#include "llvm/ADT/SmallVector.h" |
18 | 20 | #include "llvm/Demangle/Demangle.h" |
19 | 21 | #include "llvm/Demangle/DemangleConfig.h" |
20 | 22 | #include "llvm/Demangle/MicrosoftDemangleNodes.h" |
@@ -277,6 +279,15 @@ demanglePointerCVQualifiers(std::string_view &MangledName) { |
277 | 279 | DEMANGLE_UNREACHABLE; |
278 | 280 | } |
279 | 281 |
|
| 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; |
| 289 | +} |
| 290 | + |
280 | 291 | std::string_view Demangler::copyString(std::string_view Borrowed) { |
281 | 292 | char *Stable = Arena.allocUnalignedBuffer(Borrowed.size()); |
282 | 293 | // This is not a micro-optimization, it avoids UB, should Borrowed be an null |
@@ -323,8 +334,19 @@ Demangler::demangleSpecialTableSymbolNode(std::string_view &MangledName, |
323 | 334 | } |
324 | 335 |
|
325 | 336 | std::tie(STSN->Quals, IsMember) = demangleQualifiers(MangledName); |
326 | | - if (!consumeFront(MangledName, '@')) |
327 | | - STSN->TargetName = demangleFullyQualifiedTypeName(MangledName); |
| 337 | + |
| 338 | + SmallVector<Node *, 1> TargetNames; |
| 339 | + while (!consumeFront(MangledName, '@')) { |
| 340 | + QualifiedNameNode *QN = demangleFullyQualifiedTypeName(MangledName); |
| 341 | + if (Error) |
| 342 | + return nullptr; |
| 343 | + assert(QN); |
| 344 | + TargetNames.push_back(QN); |
| 345 | + } |
| 346 | + |
| 347 | + if (!TargetNames.empty()) |
| 348 | + STSN->TargetNames = smallVecToNodeArray(Arena, TargetNames); |
| 349 | + |
328 | 350 | return STSN; |
329 | 351 | } |
330 | 352 |
|
|
0 commit comments