1 //===- MicrosoftDemangle.cpp ----------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file defines a demangler for MSVC-style mangled symbols. 10 // 11 // This file has no dependencies on the rest of LLVM so that it can be 12 // easily reused in other programs such as libcxxabi. 13 // 14 //===----------------------------------------------------------------------===// 15 16 #include "llvm/Demangle/MicrosoftDemangle.h" 17 #include "llvm/Demangle/Demangle.h" 18 #include "llvm/Demangle/MicrosoftDemangleNodes.h" 19 20 #include "llvm/Demangle/DemangleConfig.h" 21 #include "llvm/Demangle/StringView.h" 22 #include "llvm/Demangle/Utility.h" 23 24 #include <array> 25 #include <cctype> 26 #include <cstdio> 27 #include <tuple> 28 29 using namespace llvm; 30 using namespace ms_demangle; 31 32 static bool startsWithDigit(StringView S) { 33 return !S.empty() && std::isdigit(S.front()); 34 } 35 36 37 struct NodeList { 38 Node *N = nullptr; 39 NodeList *Next = nullptr; 40 }; 41 42 static bool isMemberPointer(StringView MangledName, bool &Error) { 43 Error = false; 44 switch (MangledName.popFront()) { 45 case '$': 46 // This is probably an rvalue reference (e.g. $$Q), and you cannot have an 47 // rvalue reference to a member. 48 return false; 49 case 'A': 50 // 'A' indicates a reference, and you cannot have a reference to a member 51 // function or member. 52 return false; 53 case 'P': 54 case 'Q': 55 case 'R': 56 case 'S': 57 // These 4 values indicate some kind of pointer, but we still don't know 58 // what. 59 break; 60 default: 61 Error = true; 62 return false; 63 } 64 65 // If it starts with a number, then 6 indicates a non-member function 66 // pointer, and 8 indicates a member function pointer. 67 if (startsWithDigit(MangledName)) { 68 if (MangledName[0] != '6' && MangledName[0] != '8') { 69 Error = true; 70 return false; 71 } 72 return (MangledName[0] == '8'); 73 } 74 75 // Remove ext qualifiers since those can appear on either type and are 76 // therefore not indicative. 77 MangledName.consumeFront('E'); // 64-bit 78 MangledName.consumeFront('I'); // restrict 79 MangledName.consumeFront('F'); // unaligned 80 81 if (MangledName.empty()) { 82 Error = true; 83 return false; 84 } 85 86 // The next value should be either ABCD (non-member) or QRST (member). 87 switch (MangledName.front()) { 88 case 'A': 89 case 'B': 90 case 'C': 91 case 'D': 92 return false; 93 case 'Q': 94 case 'R': 95 case 'S': 96 case 'T': 97 return true; 98 default: 99 Error = true; 100 return false; 101 } 102 } 103 104 static SpecialIntrinsicKind 105 consumeSpecialIntrinsicKind(StringView &MangledName) { 106 if (MangledName.consumeFront("?_7")) 107 return SpecialIntrinsicKind::Vftable; 108 if (MangledName.consumeFront("?_8")) 109 return SpecialIntrinsicKind::Vbtable; 110 if (MangledName.consumeFront("?_9")) 111 return SpecialIntrinsicKind::VcallThunk; 112 if (MangledName.consumeFront("?_A")) 113 return SpecialIntrinsicKind::Typeof; 114 if (MangledName.consumeFront("?_B")) 115 return SpecialIntrinsicKind::LocalStaticGuard; 116 if (MangledName.consumeFront("?_C")) 117 return SpecialIntrinsicKind::StringLiteralSymbol; 118 if (MangledName.consumeFront("?_P")) 119 return SpecialIntrinsicKind::UdtReturning; 120 if (MangledName.consumeFront("?_R0")) 121 return SpecialIntrinsicKind::RttiTypeDescriptor; 122 if (MangledName.consumeFront("?_R1")) 123 return SpecialIntrinsicKind::RttiBaseClassDescriptor; 124 if (MangledName.consumeFront("?_R2")) 125 return SpecialIntrinsicKind::RttiBaseClassArray; 126 if (MangledName.consumeFront("?_R3")) 127 return SpecialIntrinsicKind::RttiClassHierarchyDescriptor; 128 if (MangledName.consumeFront("?_R4")) 129 return SpecialIntrinsicKind::RttiCompleteObjLocator; 130 if (MangledName.consumeFront("?_S")) 131 return SpecialIntrinsicKind::LocalVftable; 132 if (MangledName.consumeFront("?__E")) 133 return SpecialIntrinsicKind::DynamicInitializer; 134 if (MangledName.consumeFront("?__F")) 135 return SpecialIntrinsicKind::DynamicAtexitDestructor; 136 if (MangledName.consumeFront("?__J")) 137 return SpecialIntrinsicKind::LocalStaticThreadGuard; 138 return SpecialIntrinsicKind::None; 139 } 140 141 static bool startsWithLocalScopePattern(StringView S) { 142 if (!S.consumeFront('?')) 143 return false; 144 if (S.size() < 2) 145 return false; 146 147 size_t End = S.find('?'); 148 if (End == StringView::npos) 149 return false; 150 StringView Candidate = S.substr(0, End); 151 if (Candidate.empty()) 152 return false; 153 154 // \?[0-9]\? 155 // ?@? is the discriminator 0. 156 if (Candidate.size() == 1) 157 return Candidate[0] == '@' || (Candidate[0] >= '0' && Candidate[0] <= '9'); 158 159 // If it's not 0-9, then it's an encoded number terminated with an @ 160 if (Candidate.back() != '@') 161 return false; 162 Candidate = Candidate.dropBack(); 163 164 // An encoded number starts with B-P and all subsequent digits are in A-P. 165 // Note that the reason the first digit cannot be A is two fold. First, it 166 // would create an ambiguity with ?A which delimits the beginning of an 167 // anonymous namespace. Second, A represents 0, and you don't start a multi 168 // digit number with a leading 0. Presumably the anonymous namespace 169 // ambiguity is also why single digit encoded numbers use 0-9 rather than A-J. 170 if (Candidate[0] < 'B' || Candidate[0] > 'P') 171 return false; 172 Candidate = Candidate.dropFront(); 173 while (!Candidate.empty()) { 174 if (Candidate[0] < 'A' || Candidate[0] > 'P') 175 return false; 176 Candidate = Candidate.dropFront(); 177 } 178 179 return true; 180 } 181 182 static bool isTagType(StringView S) { 183 switch (S.front()) { 184 case 'T': // union 185 case 'U': // struct 186 case 'V': // class 187 case 'W': // enum 188 return true; 189 } 190 return false; 191 } 192 193 static bool isCustomType(StringView S) { return S[0] == '?'; } 194 195 static bool isPointerType(StringView S) { 196 if (S.startsWith("$$Q")) // foo && 197 return true; 198 199 switch (S.front()) { 200 case 'A': // foo & 201 case 'P': // foo * 202 case 'Q': // foo *const 203 case 'R': // foo *volatile 204 case 'S': // foo *const volatile 205 return true; 206 } 207 return false; 208 } 209 210 static bool isArrayType(StringView S) { return S[0] == 'Y'; } 211 212 static bool isFunctionType(StringView S) { 213 return S.startsWith("$$A8@@") || S.startsWith("$$A6"); 214 } 215 216 static FunctionRefQualifier 217 demangleFunctionRefQualifier(StringView &MangledName) { 218 if (MangledName.consumeFront('G')) 219 return FunctionRefQualifier::Reference; 220 else if (MangledName.consumeFront('H')) 221 return FunctionRefQualifier::RValueReference; 222 return FunctionRefQualifier::None; 223 } 224 225 static std::pair<Qualifiers, PointerAffinity> 226 demanglePointerCVQualifiers(StringView &MangledName) { 227 if (MangledName.consumeFront("$$Q")) 228 return std::make_pair(Q_None, PointerAffinity::RValueReference); 229 230 switch (MangledName.popFront()) { 231 case 'A': 232 return std::make_pair(Q_None, PointerAffinity::Reference); 233 case 'P': 234 return std::make_pair(Q_None, PointerAffinity::Pointer); 235 case 'Q': 236 return std::make_pair(Q_Const, PointerAffinity::Pointer); 237 case 'R': 238 return std::make_pair(Q_Volatile, PointerAffinity::Pointer); 239 case 'S': 240 return std::make_pair(Qualifiers(Q_Const | Q_Volatile), 241 PointerAffinity::Pointer); 242 default: 243 assert(false && "Ty is not a pointer type!"); 244 } 245 return std::make_pair(Q_None, PointerAffinity::Pointer); 246 } 247 248 StringView Demangler::copyString(StringView Borrowed) { 249 char *Stable = Arena.allocUnalignedBuffer(Borrowed.size() + 1); 250 std::strcpy(Stable, Borrowed.begin()); 251 252 return {Stable, Borrowed.size()}; 253 } 254 255 SpecialTableSymbolNode * 256 Demangler::demangleSpecialTableSymbolNode(StringView &MangledName, 257 SpecialIntrinsicKind K) { 258 NamedIdentifierNode *NI = Arena.alloc<NamedIdentifierNode>(); 259 switch (K) { 260 case SpecialIntrinsicKind::Vftable: 261 NI->Name = "`vftable'"; 262 break; 263 case SpecialIntrinsicKind::Vbtable: 264 NI->Name = "`vbtable'"; 265 break; 266 case SpecialIntrinsicKind::LocalVftable: 267 NI->Name = "`local vftable'"; 268 break; 269 case SpecialIntrinsicKind::RttiCompleteObjLocator: 270 NI->Name = "`RTTI Complete Object Locator'"; 271 break; 272 default: 273 DEMANGLE_UNREACHABLE; 274 } 275 QualifiedNameNode *QN = demangleNameScopeChain(MangledName, NI); 276 SpecialTableSymbolNode *STSN = Arena.alloc<SpecialTableSymbolNode>(); 277 STSN->Name = QN; 278 bool IsMember = false; 279 if (MangledName.empty()) { 280 Error = true; 281 return nullptr; 282 } 283 char Front = MangledName.popFront(); 284 if (Front != '6' && Front != '7') { 285 Error = true; 286 return nullptr; 287 } 288 289 std::tie(STSN->Quals, IsMember) = demangleQualifiers(MangledName); 290 if (!MangledName.consumeFront('@')) 291 STSN->TargetName = demangleFullyQualifiedTypeName(MangledName); 292 return STSN; 293 } 294 295 LocalStaticGuardVariableNode * 296 Demangler::demangleLocalStaticGuard(StringView &MangledName) { 297 LocalStaticGuardIdentifierNode *LSGI = 298 Arena.alloc<LocalStaticGuardIdentifierNode>(); 299 QualifiedNameNode *QN = demangleNameScopeChain(MangledName, LSGI); 300 LocalStaticGuardVariableNode *LSGVN = 301 Arena.alloc<LocalStaticGuardVariableNode>(); 302 LSGVN->Name = QN; 303 304 if (MangledName.consumeFront("4IA")) 305 LSGVN->IsVisible = false; 306 else if (MangledName.consumeFront("5")) 307 LSGVN->IsVisible = true; 308 else { 309 Error = true; 310 return nullptr; 311 } 312 313 if (!MangledName.empty()) 314 LSGI->ScopeIndex = demangleUnsigned(MangledName); 315 return LSGVN; 316 } 317 318 static NamedIdentifierNode *synthesizeNamedIdentifier(ArenaAllocator &Arena, 319 StringView Name) { 320 NamedIdentifierNode *Id = Arena.alloc<NamedIdentifierNode>(); 321 Id->Name = Name; 322 return Id; 323 } 324 325 static QualifiedNameNode *synthesizeQualifiedName(ArenaAllocator &Arena, 326 IdentifierNode *Identifier) { 327 QualifiedNameNode *QN = Arena.alloc<QualifiedNameNode>(); 328 QN->Components = Arena.alloc<NodeArrayNode>(); 329 QN->Components->Count = 1; 330 QN->Components->Nodes = Arena.allocArray<Node *>(1); 331 QN->Components->Nodes[0] = Identifier; 332 return QN; 333 } 334 335 static QualifiedNameNode *synthesizeQualifiedName(ArenaAllocator &Arena, 336 StringView Name) { 337 NamedIdentifierNode *Id = synthesizeNamedIdentifier(Arena, Name); 338 return synthesizeQualifiedName(Arena, Id); 339 } 340 341 static VariableSymbolNode *synthesizeVariable(ArenaAllocator &Arena, 342 TypeNode *Type, 343 StringView VariableName) { 344 VariableSymbolNode *VSN = Arena.alloc<VariableSymbolNode>(); 345 VSN->Type = Type; 346 VSN->Name = synthesizeQualifiedName(Arena, VariableName); 347 return VSN; 348 } 349 350 VariableSymbolNode *Demangler::demangleUntypedVariable( 351 ArenaAllocator &Arena, StringView &MangledName, StringView VariableName) { 352 NamedIdentifierNode *NI = synthesizeNamedIdentifier(Arena, VariableName); 353 QualifiedNameNode *QN = demangleNameScopeChain(MangledName, NI); 354 VariableSymbolNode *VSN = Arena.alloc<VariableSymbolNode>(); 355 VSN->Name = QN; 356 if (MangledName.consumeFront("8")) 357 return VSN; 358 359 Error = true; 360 return nullptr; 361 } 362 363 VariableSymbolNode * 364 Demangler::demangleRttiBaseClassDescriptorNode(ArenaAllocator &Arena, 365 StringView &MangledName) { 366 RttiBaseClassDescriptorNode *RBCDN = 367 Arena.alloc<RttiBaseClassDescriptorNode>(); 368 RBCDN->NVOffset = demangleUnsigned(MangledName); 369 RBCDN->VBPtrOffset = demangleSigned(MangledName); 370 RBCDN->VBTableOffset = demangleUnsigned(MangledName); 371 RBCDN->Flags = demangleUnsigned(MangledName); 372 if (Error) 373 return nullptr; 374 375 VariableSymbolNode *VSN = Arena.alloc<VariableSymbolNode>(); 376 VSN->Name = demangleNameScopeChain(MangledName, RBCDN); 377 MangledName.consumeFront('8'); 378 return VSN; 379 } 380 381 FunctionSymbolNode *Demangler::demangleInitFiniStub(StringView &MangledName, 382 bool IsDestructor) { 383 DynamicStructorIdentifierNode *DSIN = 384 Arena.alloc<DynamicStructorIdentifierNode>(); 385 DSIN->IsDestructor = IsDestructor; 386 387 bool IsKnownStaticDataMember = false; 388 if (MangledName.consumeFront('?')) 389 IsKnownStaticDataMember = true; 390 391 SymbolNode *Symbol = demangleDeclarator(MangledName); 392 if (Error) 393 return nullptr; 394 395 FunctionSymbolNode *FSN = nullptr; 396 397 if (Symbol->kind() == NodeKind::VariableSymbol) { 398 DSIN->Variable = static_cast<VariableSymbolNode *>(Symbol); 399 400 // Older versions of clang mangled this type of symbol incorrectly. They 401 // would omit the leading ? and they would only emit a single @ at the end. 402 // The correct mangling is a leading ? and 2 trailing @ signs. Handle 403 // both cases. 404 int AtCount = IsKnownStaticDataMember ? 2 : 1; 405 for (int I = 0; I < AtCount; ++I) { 406 if (MangledName.consumeFront('@')) 407 continue; 408 Error = true; 409 return nullptr; 410 } 411 412 FSN = demangleFunctionEncoding(MangledName); 413 if (FSN) 414 FSN->Name = synthesizeQualifiedName(Arena, DSIN); 415 } else { 416 if (IsKnownStaticDataMember) { 417 // This was supposed to be a static data member, but we got a function. 418 Error = true; 419 return nullptr; 420 } 421 422 FSN = static_cast<FunctionSymbolNode *>(Symbol); 423 DSIN->Name = Symbol->Name; 424 FSN->Name = synthesizeQualifiedName(Arena, DSIN); 425 } 426 427 return FSN; 428 } 429 430 SymbolNode *Demangler::demangleSpecialIntrinsic(StringView &MangledName) { 431 SpecialIntrinsicKind SIK = consumeSpecialIntrinsicKind(MangledName); 432 if (SIK == SpecialIntrinsicKind::None) 433 return nullptr; 434 435 switch (SIK) { 436 case SpecialIntrinsicKind::StringLiteralSymbol: 437 return demangleStringLiteral(MangledName); 438 case SpecialIntrinsicKind::Vftable: 439 case SpecialIntrinsicKind::Vbtable: 440 case SpecialIntrinsicKind::LocalVftable: 441 case SpecialIntrinsicKind::RttiCompleteObjLocator: 442 return demangleSpecialTableSymbolNode(MangledName, SIK); 443 case SpecialIntrinsicKind::VcallThunk: 444 return demangleVcallThunkNode(MangledName); 445 case SpecialIntrinsicKind::LocalStaticGuard: 446 return demangleLocalStaticGuard(MangledName); 447 case SpecialIntrinsicKind::RttiTypeDescriptor: { 448 TypeNode *T = demangleType(MangledName, QualifierMangleMode::Result); 449 if (Error) 450 break; 451 if (!MangledName.consumeFront("@8")) 452 break; 453 if (!MangledName.empty()) 454 break; 455 return synthesizeVariable(Arena, T, "`RTTI Type Descriptor'"); 456 } 457 case SpecialIntrinsicKind::RttiBaseClassArray: 458 return demangleUntypedVariable(Arena, MangledName, 459 "`RTTI Base Class Array'"); 460 case SpecialIntrinsicKind::RttiClassHierarchyDescriptor: 461 return demangleUntypedVariable(Arena, MangledName, 462 "`RTTI Class Hierarchy Descriptor'"); 463 case SpecialIntrinsicKind::RttiBaseClassDescriptor: 464 return demangleRttiBaseClassDescriptorNode(Arena, MangledName); 465 case SpecialIntrinsicKind::DynamicInitializer: 466 return demangleInitFiniStub(MangledName, false); 467 case SpecialIntrinsicKind::DynamicAtexitDestructor: 468 return demangleInitFiniStub(MangledName, true); 469 default: 470 break; 471 } 472 Error = true; 473 return nullptr; 474 } 475 476 IdentifierNode * 477 Demangler::demangleFunctionIdentifierCode(StringView &MangledName) { 478 assert(MangledName.startsWith('?')); 479 MangledName = MangledName.dropFront(); 480 if (MangledName.empty()) { 481 Error = true; 482 return nullptr; 483 } 484 485 if (MangledName.consumeFront("__")) 486 return demangleFunctionIdentifierCode( 487 MangledName, FunctionIdentifierCodeGroup::DoubleUnder); 488 if (MangledName.consumeFront("_")) 489 return demangleFunctionIdentifierCode(MangledName, 490 FunctionIdentifierCodeGroup::Under); 491 return demangleFunctionIdentifierCode(MangledName, 492 FunctionIdentifierCodeGroup::Basic); 493 } 494 495 StructorIdentifierNode * 496 Demangler::demangleStructorIdentifier(StringView &MangledName, 497 bool IsDestructor) { 498 StructorIdentifierNode *N = Arena.alloc<StructorIdentifierNode>(); 499 N->IsDestructor = IsDestructor; 500 return N; 501 } 502 503 ConversionOperatorIdentifierNode * 504 Demangler::demangleConversionOperatorIdentifier(StringView &MangledName) { 505 ConversionOperatorIdentifierNode *N = 506 Arena.alloc<ConversionOperatorIdentifierNode>(); 507 return N; 508 } 509 510 LiteralOperatorIdentifierNode * 511 Demangler::demangleLiteralOperatorIdentifier(StringView &MangledName) { 512 LiteralOperatorIdentifierNode *N = 513 Arena.alloc<LiteralOperatorIdentifierNode>(); 514 N->Name = demangleSimpleString(MangledName, /*Memorize=*/false); 515 return N; 516 } 517 518 IntrinsicFunctionKind 519 Demangler::translateIntrinsicFunctionCode(char CH, 520 FunctionIdentifierCodeGroup Group) { 521 using IFK = IntrinsicFunctionKind; 522 if (!(CH >= '0' && CH <= '9') && !(CH >= 'A' && CH <= 'Z')) { 523 Error = true; 524 return IFK::None; 525 } 526 527 // Not all ? identifiers are intrinsics *functions*. This function only maps 528 // operator codes for the special functions, all others are handled elsewhere, 529 // hence the IFK::None entries in the table. 530 static IFK Basic[36] = { 531 IFK::None, // ?0 # Foo::Foo() 532 IFK::None, // ?1 # Foo::~Foo() 533 IFK::New, // ?2 # operator new 534 IFK::Delete, // ?3 # operator delete 535 IFK::Assign, // ?4 # operator= 536 IFK::RightShift, // ?5 # operator>> 537 IFK::LeftShift, // ?6 # operator<< 538 IFK::LogicalNot, // ?7 # operator! 539 IFK::Equals, // ?8 # operator== 540 IFK::NotEquals, // ?9 # operator!= 541 IFK::ArraySubscript, // ?A # operator[] 542 IFK::None, // ?B # Foo::operator <type>() 543 IFK::Pointer, // ?C # operator-> 544 IFK::Dereference, // ?D # operator* 545 IFK::Increment, // ?E # operator++ 546 IFK::Decrement, // ?F # operator-- 547 IFK::Minus, // ?G # operator- 548 IFK::Plus, // ?H # operator+ 549 IFK::BitwiseAnd, // ?I # operator& 550 IFK::MemberPointer, // ?J # operator->* 551 IFK::Divide, // ?K # operator/ 552 IFK::Modulus, // ?L # operator% 553 IFK::LessThan, // ?M operator< 554 IFK::LessThanEqual, // ?N operator<= 555 IFK::GreaterThan, // ?O operator> 556 IFK::GreaterThanEqual, // ?P operator>= 557 IFK::Comma, // ?Q operator, 558 IFK::Parens, // ?R operator() 559 IFK::BitwiseNot, // ?S operator~ 560 IFK::BitwiseXor, // ?T operator^ 561 IFK::BitwiseOr, // ?U operator| 562 IFK::LogicalAnd, // ?V operator&& 563 IFK::LogicalOr, // ?W operator|| 564 IFK::TimesEqual, // ?X operator*= 565 IFK::PlusEqual, // ?Y operator+= 566 IFK::MinusEqual, // ?Z operator-= 567 }; 568 static IFK Under[36] = { 569 IFK::DivEqual, // ?_0 operator/= 570 IFK::ModEqual, // ?_1 operator%= 571 IFK::RshEqual, // ?_2 operator>>= 572 IFK::LshEqual, // ?_3 operator<<= 573 IFK::BitwiseAndEqual, // ?_4 operator&= 574 IFK::BitwiseOrEqual, // ?_5 operator|= 575 IFK::BitwiseXorEqual, // ?_6 operator^= 576 IFK::None, // ?_7 # vftable 577 IFK::None, // ?_8 # vbtable 578 IFK::None, // ?_9 # vcall 579 IFK::None, // ?_A # typeof 580 IFK::None, // ?_B # local static guard 581 IFK::None, // ?_C # string literal 582 IFK::VbaseDtor, // ?_D # vbase destructor 583 IFK::VecDelDtor, // ?_E # vector deleting destructor 584 IFK::DefaultCtorClosure, // ?_F # default constructor closure 585 IFK::ScalarDelDtor, // ?_G # scalar deleting destructor 586 IFK::VecCtorIter, // ?_H # vector constructor iterator 587 IFK::VecDtorIter, // ?_I # vector destructor iterator 588 IFK::VecVbaseCtorIter, // ?_J # vector vbase constructor iterator 589 IFK::VdispMap, // ?_K # virtual displacement map 590 IFK::EHVecCtorIter, // ?_L # eh vector constructor iterator 591 IFK::EHVecDtorIter, // ?_M # eh vector destructor iterator 592 IFK::EHVecVbaseCtorIter, // ?_N # eh vector vbase constructor iterator 593 IFK::CopyCtorClosure, // ?_O # copy constructor closure 594 IFK::None, // ?_P<name> # udt returning <name> 595 IFK::None, // ?_Q # <unknown> 596 IFK::None, // ?_R0 - ?_R4 # RTTI Codes 597 IFK::None, // ?_S # local vftable 598 IFK::LocalVftableCtorClosure, // ?_T # local vftable constructor closure 599 IFK::ArrayNew, // ?_U operator new[] 600 IFK::ArrayDelete, // ?_V operator delete[] 601 IFK::None, // ?_W <unused> 602 IFK::None, // ?_X <unused> 603 IFK::None, // ?_Y <unused> 604 IFK::None, // ?_Z <unused> 605 }; 606 static IFK DoubleUnder[36] = { 607 IFK::None, // ?__0 <unused> 608 IFK::None, // ?__1 <unused> 609 IFK::None, // ?__2 <unused> 610 IFK::None, // ?__3 <unused> 611 IFK::None, // ?__4 <unused> 612 IFK::None, // ?__5 <unused> 613 IFK::None, // ?__6 <unused> 614 IFK::None, // ?__7 <unused> 615 IFK::None, // ?__8 <unused> 616 IFK::None, // ?__9 <unused> 617 IFK::ManVectorCtorIter, // ?__A managed vector ctor iterator 618 IFK::ManVectorDtorIter, // ?__B managed vector dtor iterator 619 IFK::EHVectorCopyCtorIter, // ?__C EH vector copy ctor iterator 620 IFK::EHVectorVbaseCopyCtorIter, // ?__D EH vector vbase copy ctor iter 621 IFK::None, // ?__E dynamic initializer for `T' 622 IFK::None, // ?__F dynamic atexit destructor for `T' 623 IFK::VectorCopyCtorIter, // ?__G vector copy constructor iter 624 IFK::VectorVbaseCopyCtorIter, // ?__H vector vbase copy ctor iter 625 IFK::ManVectorVbaseCopyCtorIter, // ?__I managed vector vbase copy ctor 626 // iter 627 IFK::None, // ?__J local static thread guard 628 IFK::None, // ?__K operator ""_name 629 IFK::CoAwait, // ?__L operator co_await 630 IFK::Spaceship, // ?__M operator<=> 631 IFK::None, // ?__N <unused> 632 IFK::None, // ?__O <unused> 633 IFK::None, // ?__P <unused> 634 IFK::None, // ?__Q <unused> 635 IFK::None, // ?__R <unused> 636 IFK::None, // ?__S <unused> 637 IFK::None, // ?__T <unused> 638 IFK::None, // ?__U <unused> 639 IFK::None, // ?__V <unused> 640 IFK::None, // ?__W <unused> 641 IFK::None, // ?__X <unused> 642 IFK::None, // ?__Y <unused> 643 IFK::None, // ?__Z <unused> 644 }; 645 646 int Index = (CH >= '0' && CH <= '9') ? (CH - '0') : (CH - 'A' + 10); 647 switch (Group) { 648 case FunctionIdentifierCodeGroup::Basic: 649 return Basic[Index]; 650 case FunctionIdentifierCodeGroup::Under: 651 return Under[Index]; 652 case FunctionIdentifierCodeGroup::DoubleUnder: 653 return DoubleUnder[Index]; 654 } 655 DEMANGLE_UNREACHABLE; 656 } 657 658 IdentifierNode * 659 Demangler::demangleFunctionIdentifierCode(StringView &MangledName, 660 FunctionIdentifierCodeGroup Group) { 661 if (MangledName.empty()) { 662 Error = true; 663 return nullptr; 664 } 665 switch (Group) { 666 case FunctionIdentifierCodeGroup::Basic: 667 switch (char CH = MangledName.popFront()) { 668 case '0': 669 case '1': 670 return demangleStructorIdentifier(MangledName, CH == '1'); 671 case 'B': 672 return demangleConversionOperatorIdentifier(MangledName); 673 default: 674 return Arena.alloc<IntrinsicFunctionIdentifierNode>( 675 translateIntrinsicFunctionCode(CH, Group)); 676 } 677 case FunctionIdentifierCodeGroup::Under: 678 return Arena.alloc<IntrinsicFunctionIdentifierNode>( 679 translateIntrinsicFunctionCode(MangledName.popFront(), Group)); 680 case FunctionIdentifierCodeGroup::DoubleUnder: 681 switch (char CH = MangledName.popFront()) { 682 case 'K': 683 return demangleLiteralOperatorIdentifier(MangledName); 684 default: 685 return Arena.alloc<IntrinsicFunctionIdentifierNode>( 686 translateIntrinsicFunctionCode(CH, Group)); 687 } 688 } 689 690 DEMANGLE_UNREACHABLE; 691 } 692 693 SymbolNode *Demangler::demangleEncodedSymbol(StringView &MangledName, 694 QualifiedNameNode *Name) { 695 if (MangledName.empty()) { 696 Error = true; 697 return nullptr; 698 } 699 700 // Read a variable. 701 switch (MangledName.front()) { 702 case '0': 703 case '1': 704 case '2': 705 case '3': 706 case '4': { 707 StorageClass SC = demangleVariableStorageClass(MangledName); 708 return demangleVariableEncoding(MangledName, SC); 709 } 710 } 711 FunctionSymbolNode *FSN = demangleFunctionEncoding(MangledName); 712 713 IdentifierNode *UQN = Name->getUnqualifiedIdentifier(); 714 if (UQN->kind() == NodeKind::ConversionOperatorIdentifier) { 715 ConversionOperatorIdentifierNode *COIN = 716 static_cast<ConversionOperatorIdentifierNode *>(UQN); 717 if (FSN) 718 COIN->TargetType = FSN->Signature->ReturnType; 719 } 720 return FSN; 721 } 722 723 SymbolNode *Demangler::demangleDeclarator(StringView &MangledName) { 724 // What follows is a main symbol name. This may include namespaces or class 725 // back references. 726 QualifiedNameNode *QN = demangleFullyQualifiedSymbolName(MangledName); 727 if (Error) 728 return nullptr; 729 730 SymbolNode *Symbol = demangleEncodedSymbol(MangledName, QN); 731 if (Error) 732 return nullptr; 733 Symbol->Name = QN; 734 735 IdentifierNode *UQN = QN->getUnqualifiedIdentifier(); 736 if (UQN->kind() == NodeKind::ConversionOperatorIdentifier) { 737 ConversionOperatorIdentifierNode *COIN = 738 static_cast<ConversionOperatorIdentifierNode *>(UQN); 739 if (!COIN->TargetType) { 740 Error = true; 741 return nullptr; 742 } 743 } 744 return Symbol; 745 } 746 747 SymbolNode *Demangler::demangleMD5Name(StringView &MangledName) { 748 assert(MangledName.startsWith("??@")); 749 // This is an MD5 mangled name. We can't demangle it, just return the 750 // mangled name. 751 // An MD5 mangled name is ??@ followed by 32 characters and a terminating @. 752 size_t MD5Last = MangledName.find('@', strlen("??@")); 753 if (MD5Last == StringView::npos) { 754 Error = true; 755 return nullptr; 756 } 757 const char *Start = MangledName.begin(); 758 MangledName = MangledName.dropFront(MD5Last + 1); 759 760 // There are two additional special cases for MD5 names: 761 // 1. For complete object locators where the object name is long enough 762 // for the object to have an MD5 name, the complete object locator is 763 // called ??@...@??_R4@ (with a trailing "??_R4@" instead of the usual 764 // leading "??_R4". This is handled here. 765 // 2. For catchable types, in versions of MSVC before 2015 (<1900) or after 766 // 2017.2 (>= 1914), the catchable type mangling is _CT??@...@??@...@8 767 // instead of_CT??@...@8 with just one MD5 name. Since we don't yet 768 // demangle catchable types anywhere, this isn't handled for MD5 names 769 // either. 770 MangledName.consumeFront("??_R4@"); 771 772 StringView MD5(Start, MangledName.begin()); 773 SymbolNode *S = Arena.alloc<SymbolNode>(NodeKind::Md5Symbol); 774 S->Name = synthesizeQualifiedName(Arena, MD5); 775 776 return S; 777 } 778 779 // Parser entry point. 780 SymbolNode *Demangler::parse(StringView &MangledName) { 781 if (MangledName.startsWith("??@")) 782 return demangleMD5Name(MangledName); 783 784 // MSVC-style mangled symbols must start with '?'. 785 if (!MangledName.startsWith('?')) { 786 Error = true; 787 return nullptr; 788 } 789 790 MangledName.consumeFront('?'); 791 792 // ?$ is a template instantiation, but all other names that start with ? are 793 // operators / special names. 794 if (SymbolNode *SI = demangleSpecialIntrinsic(MangledName)) 795 return SI; 796 797 return demangleDeclarator(MangledName); 798 } 799 800 TagTypeNode *Demangler::parseTagUniqueName(StringView &MangledName) { 801 if (!MangledName.consumeFront(".?A")) 802 return nullptr; 803 MangledName.consumeFront(".?A"); 804 if (MangledName.empty()) 805 return nullptr; 806 807 return demangleClassType(MangledName); 808 } 809 810 // <type-encoding> ::= <storage-class> <variable-type> 811 // <storage-class> ::= 0 # private static member 812 // ::= 1 # protected static member 813 // ::= 2 # public static member 814 // ::= 3 # global 815 // ::= 4 # static local 816 817 VariableSymbolNode *Demangler::demangleVariableEncoding(StringView &MangledName, 818 StorageClass SC) { 819 VariableSymbolNode *VSN = Arena.alloc<VariableSymbolNode>(); 820 821 VSN->Type = demangleType(MangledName, QualifierMangleMode::Drop); 822 VSN->SC = SC; 823 824 if (Error) 825 return nullptr; 826 827 // <variable-type> ::= <type> <cvr-qualifiers> 828 // ::= <type> <pointee-cvr-qualifiers> # pointers, references 829 switch (VSN->Type->kind()) { 830 case NodeKind::PointerType: { 831 PointerTypeNode *PTN = static_cast<PointerTypeNode *>(VSN->Type); 832 833 Qualifiers ExtraChildQuals = Q_None; 834 PTN->Quals = Qualifiers(VSN->Type->Quals | 835 demanglePointerExtQualifiers(MangledName)); 836 837 bool IsMember = false; 838 std::tie(ExtraChildQuals, IsMember) = demangleQualifiers(MangledName); 839 840 if (PTN->ClassParent) { 841 QualifiedNameNode *BackRefName = 842 demangleFullyQualifiedTypeName(MangledName); 843 (void)BackRefName; 844 } 845 PTN->Pointee->Quals = Qualifiers(PTN->Pointee->Quals | ExtraChildQuals); 846 847 break; 848 } 849 default: 850 VSN->Type->Quals = demangleQualifiers(MangledName).first; 851 break; 852 } 853 854 return VSN; 855 } 856 857 // Sometimes numbers are encoded in mangled symbols. For example, 858 // "int (*x)[20]" is a valid C type (x is a pointer to an array of 859 // length 20), so we need some way to embed numbers as part of symbols. 860 // This function parses it. 861 // 862 // <number> ::= [?] <non-negative integer> 863 // 864 // <non-negative integer> ::= <decimal digit> # when 1 <= Number <= 10 865 // ::= <hex digit>+ @ # when Number == 0 or >= 10 866 // 867 // <hex-digit> ::= [A-P] # A = 0, B = 1, ... 868 std::pair<uint64_t, bool> Demangler::demangleNumber(StringView &MangledName) { 869 bool IsNegative = MangledName.consumeFront('?'); 870 871 if (startsWithDigit(MangledName)) { 872 uint64_t Ret = MangledName[0] - '0' + 1; 873 MangledName = MangledName.dropFront(1); 874 return {Ret, IsNegative}; 875 } 876 877 uint64_t Ret = 0; 878 for (size_t i = 0; i < MangledName.size(); ++i) { 879 char C = MangledName[i]; 880 if (C == '@') { 881 MangledName = MangledName.dropFront(i + 1); 882 return {Ret, IsNegative}; 883 } 884 if ('A' <= C && C <= 'P') { 885 Ret = (Ret << 4) + (C - 'A'); 886 continue; 887 } 888 break; 889 } 890 891 Error = true; 892 return {0ULL, false}; 893 } 894 895 uint64_t Demangler::demangleUnsigned(StringView &MangledName) { 896 bool IsNegative = false; 897 uint64_t Number = 0; 898 std::tie(Number, IsNegative) = demangleNumber(MangledName); 899 if (IsNegative) 900 Error = true; 901 return Number; 902 } 903 904 int64_t Demangler::demangleSigned(StringView &MangledName) { 905 bool IsNegative = false; 906 uint64_t Number = 0; 907 std::tie(Number, IsNegative) = demangleNumber(MangledName); 908 if (Number > INT64_MAX) 909 Error = true; 910 int64_t I = static_cast<int64_t>(Number); 911 return IsNegative ? -I : I; 912 } 913 914 // First 10 strings can be referenced by special BackReferences ?0, ?1, ..., ?9. 915 // Memorize it. 916 void Demangler::memorizeString(StringView S) { 917 if (Backrefs.NamesCount >= BackrefContext::Max) 918 return; 919 for (size_t i = 0; i < Backrefs.NamesCount; ++i) 920 if (S == Backrefs.Names[i]->Name) 921 return; 922 NamedIdentifierNode *N = Arena.alloc<NamedIdentifierNode>(); 923 N->Name = S; 924 Backrefs.Names[Backrefs.NamesCount++] = N; 925 } 926 927 NamedIdentifierNode *Demangler::demangleBackRefName(StringView &MangledName) { 928 assert(startsWithDigit(MangledName)); 929 930 size_t I = MangledName[0] - '0'; 931 if (I >= Backrefs.NamesCount) { 932 Error = true; 933 return nullptr; 934 } 935 936 MangledName = MangledName.dropFront(); 937 return Backrefs.Names[I]; 938 } 939 940 void Demangler::memorizeIdentifier(IdentifierNode *Identifier) { 941 // Render this class template name into a string buffer so that we can 942 // memorize it for the purpose of back-referencing. 943 OutputStream OS; 944 if (!initializeOutputStream(nullptr, nullptr, OS, 1024)) 945 // FIXME: Propagate out-of-memory as an error? 946 std::terminate(); 947 Identifier->output(OS, OF_Default); 948 OS << '\0'; 949 char *Name = OS.getBuffer(); 950 951 StringView Owned = copyString(Name); 952 memorizeString(Owned); 953 std::free(Name); 954 } 955 956 IdentifierNode * 957 Demangler::demangleTemplateInstantiationName(StringView &MangledName, 958 NameBackrefBehavior NBB) { 959 assert(MangledName.startsWith("?$")); 960 MangledName.consumeFront("?$"); 961 962 BackrefContext OuterContext; 963 std::swap(OuterContext, Backrefs); 964 965 IdentifierNode *Identifier = 966 demangleUnqualifiedSymbolName(MangledName, NBB_Simple); 967 if (!Error) 968 Identifier->TemplateParams = demangleTemplateParameterList(MangledName); 969 970 std::swap(OuterContext, Backrefs); 971 if (Error) 972 return nullptr; 973 974 if (NBB & NBB_Template) { 975 // NBB_Template is only set for types and non-leaf names ("a::" in "a::b"). 976 // Structors and conversion operators only makes sense in a leaf name, so 977 // reject them in NBB_Template contexts. 978 if (Identifier->kind() == NodeKind::ConversionOperatorIdentifier || 979 Identifier->kind() == NodeKind::StructorIdentifier) { 980 Error = true; 981 return nullptr; 982 } 983 984 memorizeIdentifier(Identifier); 985 } 986 987 return Identifier; 988 } 989 990 NamedIdentifierNode *Demangler::demangleSimpleName(StringView &MangledName, 991 bool Memorize) { 992 StringView S = demangleSimpleString(MangledName, Memorize); 993 if (Error) 994 return nullptr; 995 996 NamedIdentifierNode *Name = Arena.alloc<NamedIdentifierNode>(); 997 Name->Name = S; 998 return Name; 999 } 1000 1001 static bool isRebasedHexDigit(char C) { return (C >= 'A' && C <= 'P'); } 1002 1003 static uint8_t rebasedHexDigitToNumber(char C) { 1004 assert(isRebasedHexDigit(C)); 1005 return (C <= 'J') ? (C - 'A') : (10 + C - 'K'); 1006 } 1007 1008 uint8_t Demangler::demangleCharLiteral(StringView &MangledName) { 1009 assert(!MangledName.empty()); 1010 if (!MangledName.startsWith('?')) 1011 return MangledName.popFront(); 1012 1013 MangledName = MangledName.dropFront(); 1014 if (MangledName.empty()) 1015 goto CharLiteralError; 1016 1017 if (MangledName.consumeFront('$')) { 1018 // Two hex digits 1019 if (MangledName.size() < 2) 1020 goto CharLiteralError; 1021 StringView Nibbles = MangledName.substr(0, 2); 1022 if (!isRebasedHexDigit(Nibbles[0]) || !isRebasedHexDigit(Nibbles[1])) 1023 goto CharLiteralError; 1024 // Don't append the null terminator. 1025 uint8_t C1 = rebasedHexDigitToNumber(Nibbles[0]); 1026 uint8_t C2 = rebasedHexDigitToNumber(Nibbles[1]); 1027 MangledName = MangledName.dropFront(2); 1028 return (C1 << 4) | C2; 1029 } 1030 1031 if (startsWithDigit(MangledName)) { 1032 const char *Lookup = ",/\\:. \n\t'-"; 1033 char C = Lookup[MangledName[0] - '0']; 1034 MangledName = MangledName.dropFront(); 1035 return C; 1036 } 1037 1038 if (MangledName[0] >= 'a' && MangledName[0] <= 'z') { 1039 char Lookup[26] = {'\xE1', '\xE2', '\xE3', '\xE4', '\xE5', '\xE6', '\xE7', 1040 '\xE8', '\xE9', '\xEA', '\xEB', '\xEC', '\xED', '\xEE', 1041 '\xEF', '\xF0', '\xF1', '\xF2', '\xF3', '\xF4', '\xF5', 1042 '\xF6', '\xF7', '\xF8', '\xF9', '\xFA'}; 1043 char C = Lookup[MangledName[0] - 'a']; 1044 MangledName = MangledName.dropFront(); 1045 return C; 1046 } 1047 1048 if (MangledName[0] >= 'A' && MangledName[0] <= 'Z') { 1049 char Lookup[26] = {'\xC1', '\xC2', '\xC3', '\xC4', '\xC5', '\xC6', '\xC7', 1050 '\xC8', '\xC9', '\xCA', '\xCB', '\xCC', '\xCD', '\xCE', 1051 '\xCF', '\xD0', '\xD1', '\xD2', '\xD3', '\xD4', '\xD5', 1052 '\xD6', '\xD7', '\xD8', '\xD9', '\xDA'}; 1053 char C = Lookup[MangledName[0] - 'A']; 1054 MangledName = MangledName.dropFront(); 1055 return C; 1056 } 1057 1058 CharLiteralError: 1059 Error = true; 1060 return '\0'; 1061 } 1062 1063 wchar_t Demangler::demangleWcharLiteral(StringView &MangledName) { 1064 uint8_t C1, C2; 1065 1066 C1 = demangleCharLiteral(MangledName); 1067 if (Error || MangledName.empty()) 1068 goto WCharLiteralError; 1069 C2 = demangleCharLiteral(MangledName); 1070 if (Error) 1071 goto WCharLiteralError; 1072 1073 return ((wchar_t)C1 << 8) | (wchar_t)C2; 1074 1075 WCharLiteralError: 1076 Error = true; 1077 return L'\0'; 1078 } 1079 1080 static void writeHexDigit(char *Buffer, uint8_t Digit) { 1081 assert(Digit <= 15); 1082 *Buffer = (Digit < 10) ? ('0' + Digit) : ('A' + Digit - 10); 1083 } 1084 1085 static void outputHex(OutputStream &OS, unsigned C) { 1086 if (C == 0) { 1087 OS << "\\x00"; 1088 return; 1089 } 1090 // It's easier to do the math if we can work from right to left, but we need 1091 // to print the numbers from left to right. So render this into a temporary 1092 // buffer first, then output the temporary buffer. Each byte is of the form 1093 // \xAB, which means that each byte needs 4 characters. Since there are at 1094 // most 4 bytes, we need a 4*4+1 = 17 character temporary buffer. 1095 char TempBuffer[17]; 1096 1097 ::memset(TempBuffer, 0, sizeof(TempBuffer)); 1098 constexpr int MaxPos = sizeof(TempBuffer) - 1; 1099 1100 int Pos = MaxPos - 1; // TempBuffer[MaxPos] is the terminating \0. 1101 while (C != 0) { 1102 for (int I = 0; I < 2; ++I) { 1103 writeHexDigit(&TempBuffer[Pos--], C % 16); 1104 C /= 16; 1105 } 1106 } 1107 TempBuffer[Pos--] = 'x'; 1108 assert(Pos >= 0); 1109 TempBuffer[Pos--] = '\\'; 1110 OS << StringView(&TempBuffer[Pos + 1]); 1111 } 1112 1113 static void outputEscapedChar(OutputStream &OS, unsigned C) { 1114 switch (C) { 1115 case '\0': // nul 1116 OS << "\\0"; 1117 return; 1118 case '\'': // single quote 1119 OS << "\\\'"; 1120 return; 1121 case '\"': // double quote 1122 OS << "\\\""; 1123 return; 1124 case '\\': // backslash 1125 OS << "\\\\"; 1126 return; 1127 case '\a': // bell 1128 OS << "\\a"; 1129 return; 1130 case '\b': // backspace 1131 OS << "\\b"; 1132 return; 1133 case '\f': // form feed 1134 OS << "\\f"; 1135 return; 1136 case '\n': // new line 1137 OS << "\\n"; 1138 return; 1139 case '\r': // carriage return 1140 OS << "\\r"; 1141 return; 1142 case '\t': // tab 1143 OS << "\\t"; 1144 return; 1145 case '\v': // vertical tab 1146 OS << "\\v"; 1147 return; 1148 default: 1149 break; 1150 } 1151 1152 if (C > 0x1F && C < 0x7F) { 1153 // Standard ascii char. 1154 OS << (char)C; 1155 return; 1156 } 1157 1158 outputHex(OS, C); 1159 } 1160 1161 static unsigned countTrailingNullBytes(const uint8_t *StringBytes, int Length) { 1162 const uint8_t *End = StringBytes + Length - 1; 1163 unsigned Count = 0; 1164 while (Length > 0 && *End == 0) { 1165 --Length; 1166 --End; 1167 ++Count; 1168 } 1169 return Count; 1170 } 1171 1172 static unsigned countEmbeddedNulls(const uint8_t *StringBytes, 1173 unsigned Length) { 1174 unsigned Result = 0; 1175 for (unsigned I = 0; I < Length; ++I) { 1176 if (*StringBytes++ == 0) 1177 ++Result; 1178 } 1179 return Result; 1180 } 1181 1182 // A mangled (non-wide) string literal stores the total length of the string it 1183 // refers to (passed in NumBytes), and it contains up to 32 bytes of actual text 1184 // (passed in StringBytes, NumChars). 1185 static unsigned guessCharByteSize(const uint8_t *StringBytes, unsigned NumChars, 1186 uint64_t NumBytes) { 1187 assert(NumBytes > 0); 1188 1189 // If the number of bytes is odd, this is guaranteed to be a char string. 1190 if (NumBytes % 2 == 1) 1191 return 1; 1192 1193 // All strings can encode at most 32 bytes of data. If it's less than that, 1194 // then we encoded the entire string. In this case we check for a 1-byte, 1195 // 2-byte, or 4-byte null terminator. 1196 if (NumBytes < 32) { 1197 unsigned TrailingNulls = countTrailingNullBytes(StringBytes, NumChars); 1198 if (TrailingNulls >= 4 && NumBytes % 4 == 0) 1199 return 4; 1200 if (TrailingNulls >= 2) 1201 return 2; 1202 return 1; 1203 } 1204 1205 // The whole string was not able to be encoded. Try to look at embedded null 1206 // terminators to guess. The heuristic is that we count all embedded null 1207 // terminators. If more than 2/3 are null, it's a char32. If more than 1/3 1208 // are null, it's a char16. Otherwise it's a char8. This obviously isn't 1209 // perfect and is biased towards languages that have ascii alphabets, but this 1210 // was always going to be best effort since the encoding is lossy. 1211 unsigned Nulls = countEmbeddedNulls(StringBytes, NumChars); 1212 if (Nulls >= 2 * NumChars / 3 && NumBytes % 4 == 0) 1213 return 4; 1214 if (Nulls >= NumChars / 3) 1215 return 2; 1216 return 1; 1217 } 1218 1219 static unsigned decodeMultiByteChar(const uint8_t *StringBytes, 1220 unsigned CharIndex, unsigned CharBytes) { 1221 assert(CharBytes == 1 || CharBytes == 2 || CharBytes == 4); 1222 unsigned Offset = CharIndex * CharBytes; 1223 unsigned Result = 0; 1224 StringBytes = StringBytes + Offset; 1225 for (unsigned I = 0; I < CharBytes; ++I) { 1226 unsigned C = static_cast<unsigned>(StringBytes[I]); 1227 Result |= C << (8 * I); 1228 } 1229 return Result; 1230 } 1231 1232 FunctionSymbolNode *Demangler::demangleVcallThunkNode(StringView &MangledName) { 1233 FunctionSymbolNode *FSN = Arena.alloc<FunctionSymbolNode>(); 1234 VcallThunkIdentifierNode *VTIN = Arena.alloc<VcallThunkIdentifierNode>(); 1235 FSN->Signature = Arena.alloc<ThunkSignatureNode>(); 1236 FSN->Signature->FunctionClass = FC_NoParameterList; 1237 1238 FSN->Name = demangleNameScopeChain(MangledName, VTIN); 1239 if (!Error) 1240 Error = !MangledName.consumeFront("$B"); 1241 if (!Error) 1242 VTIN->OffsetInVTable = demangleUnsigned(MangledName); 1243 if (!Error) 1244 Error = !MangledName.consumeFront('A'); 1245 if (!Error) 1246 FSN->Signature->CallConvention = demangleCallingConvention(MangledName); 1247 return (Error) ? nullptr : FSN; 1248 } 1249 1250 EncodedStringLiteralNode * 1251 Demangler::demangleStringLiteral(StringView &MangledName) { 1252 // This function uses goto, so declare all variables up front. 1253 OutputStream OS; 1254 StringView CRC; 1255 uint64_t StringByteSize; 1256 bool IsWcharT = false; 1257 bool IsNegative = false; 1258 size_t CrcEndPos = 0; 1259 char *ResultBuffer = nullptr; 1260 1261 EncodedStringLiteralNode *Result = Arena.alloc<EncodedStringLiteralNode>(); 1262 1263 // Must happen before the first `goto StringLiteralError`. 1264 if (!initializeOutputStream(nullptr, nullptr, OS, 1024)) 1265 // FIXME: Propagate out-of-memory as an error? 1266 std::terminate(); 1267 1268 // Prefix indicating the beginning of a string literal 1269 if (!MangledName.consumeFront("@_")) 1270 goto StringLiteralError; 1271 if (MangledName.empty()) 1272 goto StringLiteralError; 1273 1274 // Char Type (regular or wchar_t) 1275 switch (MangledName.popFront()) { 1276 case '1': 1277 IsWcharT = true; 1278 DEMANGLE_FALLTHROUGH; 1279 case '0': 1280 break; 1281 default: 1282 goto StringLiteralError; 1283 } 1284 1285 // Encoded Length 1286 std::tie(StringByteSize, IsNegative) = demangleNumber(MangledName); 1287 if (Error || IsNegative || StringByteSize < (IsWcharT ? 2 : 1)) 1288 goto StringLiteralError; 1289 1290 // CRC 32 (always 8 characters plus a terminator) 1291 CrcEndPos = MangledName.find('@'); 1292 if (CrcEndPos == StringView::npos) 1293 goto StringLiteralError; 1294 CRC = MangledName.substr(0, CrcEndPos); 1295 MangledName = MangledName.dropFront(CrcEndPos + 1); 1296 if (MangledName.empty()) 1297 goto StringLiteralError; 1298 1299 if (IsWcharT) { 1300 Result->Char = CharKind::Wchar; 1301 if (StringByteSize > 64) 1302 Result->IsTruncated = true; 1303 1304 while (!MangledName.consumeFront('@')) { 1305 if (MangledName.size() < 2) 1306 goto StringLiteralError; 1307 wchar_t W = demangleWcharLiteral(MangledName); 1308 if (StringByteSize != 2 || Result->IsTruncated) 1309 outputEscapedChar(OS, W); 1310 StringByteSize -= 2; 1311 if (Error) 1312 goto StringLiteralError; 1313 } 1314 } else { 1315 // The max byte length is actually 32, but some compilers mangled strings 1316 // incorrectly, so we have to assume it can go higher. 1317 constexpr unsigned MaxStringByteLength = 32 * 4; 1318 uint8_t StringBytes[MaxStringByteLength]; 1319 1320 unsigned BytesDecoded = 0; 1321 while (!MangledName.consumeFront('@')) { 1322 if (MangledName.size() < 1 || BytesDecoded >= MaxStringByteLength) 1323 goto StringLiteralError; 1324 StringBytes[BytesDecoded++] = demangleCharLiteral(MangledName); 1325 } 1326 1327 if (StringByteSize > BytesDecoded) 1328 Result->IsTruncated = true; 1329 1330 unsigned CharBytes = 1331 guessCharByteSize(StringBytes, BytesDecoded, StringByteSize); 1332 assert(StringByteSize % CharBytes == 0); 1333 switch (CharBytes) { 1334 case 1: 1335 Result->Char = CharKind::Char; 1336 break; 1337 case 2: 1338 Result->Char = CharKind::Char16; 1339 break; 1340 case 4: 1341 Result->Char = CharKind::Char32; 1342 break; 1343 default: 1344 DEMANGLE_UNREACHABLE; 1345 } 1346 const unsigned NumChars = BytesDecoded / CharBytes; 1347 for (unsigned CharIndex = 0; CharIndex < NumChars; ++CharIndex) { 1348 unsigned NextChar = 1349 decodeMultiByteChar(StringBytes, CharIndex, CharBytes); 1350 if (CharIndex + 1 < NumChars || Result->IsTruncated) 1351 outputEscapedChar(OS, NextChar); 1352 } 1353 } 1354 1355 OS << '\0'; 1356 ResultBuffer = OS.getBuffer(); 1357 Result->DecodedString = copyString(ResultBuffer); 1358 std::free(ResultBuffer); 1359 return Result; 1360 1361 StringLiteralError: 1362 Error = true; 1363 std::free(OS.getBuffer()); 1364 return nullptr; 1365 } 1366 1367 // Returns MangledName's prefix before the first '@', or an error if 1368 // MangledName contains no '@' or the prefix has length 0. 1369 StringView Demangler::demangleSimpleString(StringView &MangledName, 1370 bool Memorize) { 1371 StringView S; 1372 for (size_t i = 0; i < MangledName.size(); ++i) { 1373 if (MangledName[i] != '@') 1374 continue; 1375 if (i == 0) 1376 break; 1377 S = MangledName.substr(0, i); 1378 MangledName = MangledName.dropFront(i + 1); 1379 1380 if (Memorize) 1381 memorizeString(S); 1382 return S; 1383 } 1384 1385 Error = true; 1386 return {}; 1387 } 1388 1389 NamedIdentifierNode * 1390 Demangler::demangleAnonymousNamespaceName(StringView &MangledName) { 1391 assert(MangledName.startsWith("?A")); 1392 MangledName.consumeFront("?A"); 1393 1394 NamedIdentifierNode *Node = Arena.alloc<NamedIdentifierNode>(); 1395 Node->Name = "`anonymous namespace'"; 1396 size_t EndPos = MangledName.find('@'); 1397 if (EndPos == StringView::npos) { 1398 Error = true; 1399 return nullptr; 1400 } 1401 StringView NamespaceKey = MangledName.substr(0, EndPos); 1402 memorizeString(NamespaceKey); 1403 MangledName = MangledName.substr(EndPos + 1); 1404 return Node; 1405 } 1406 1407 NamedIdentifierNode * 1408 Demangler::demangleLocallyScopedNamePiece(StringView &MangledName) { 1409 assert(startsWithLocalScopePattern(MangledName)); 1410 1411 NamedIdentifierNode *Identifier = Arena.alloc<NamedIdentifierNode>(); 1412 MangledName.consumeFront('?'); 1413 uint64_t Number = 0; 1414 bool IsNegative = false; 1415 std::tie(Number, IsNegative) = demangleNumber(MangledName); 1416 assert(!IsNegative); 1417 1418 // One ? to terminate the number 1419 MangledName.consumeFront('?'); 1420 1421 assert(!Error); 1422 Node *Scope = parse(MangledName); 1423 if (Error) 1424 return nullptr; 1425 1426 // Render the parent symbol's name into a buffer. 1427 OutputStream OS; 1428 if (!initializeOutputStream(nullptr, nullptr, OS, 1024)) 1429 // FIXME: Propagate out-of-memory as an error? 1430 std::terminate(); 1431 OS << '`'; 1432 Scope->output(OS, OF_Default); 1433 OS << '\''; 1434 OS << "::`" << Number << "'"; 1435 OS << '\0'; 1436 char *Result = OS.getBuffer(); 1437 Identifier->Name = copyString(Result); 1438 std::free(Result); 1439 return Identifier; 1440 } 1441 1442 // Parses a type name in the form of A@B@C@@ which represents C::B::A. 1443 QualifiedNameNode * 1444 Demangler::demangleFullyQualifiedTypeName(StringView &MangledName) { 1445 IdentifierNode *Identifier = 1446 demangleUnqualifiedTypeName(MangledName, /*Memorize=*/true); 1447 if (Error) 1448 return nullptr; 1449 assert(Identifier); 1450 1451 QualifiedNameNode *QN = demangleNameScopeChain(MangledName, Identifier); 1452 if (Error) 1453 return nullptr; 1454 assert(QN); 1455 return QN; 1456 } 1457 1458 // Parses a symbol name in the form of A@B@C@@ which represents C::B::A. 1459 // Symbol names have slightly different rules regarding what can appear 1460 // so we separate out the implementations for flexibility. 1461 QualifiedNameNode * 1462 Demangler::demangleFullyQualifiedSymbolName(StringView &MangledName) { 1463 // This is the final component of a symbol name (i.e. the leftmost component 1464 // of a mangled name. Since the only possible template instantiation that 1465 // can appear in this context is a function template, and since those are 1466 // not saved for the purposes of name backreferences, only backref simple 1467 // names. 1468 IdentifierNode *Identifier = 1469 demangleUnqualifiedSymbolName(MangledName, NBB_Simple); 1470 if (Error) 1471 return nullptr; 1472 1473 QualifiedNameNode *QN = demangleNameScopeChain(MangledName, Identifier); 1474 if (Error) 1475 return nullptr; 1476 1477 if (Identifier->kind() == NodeKind::StructorIdentifier) { 1478 if (QN->Components->Count < 2) { 1479 Error = true; 1480 return nullptr; 1481 } 1482 StructorIdentifierNode *SIN = 1483 static_cast<StructorIdentifierNode *>(Identifier); 1484 Node *ClassNode = QN->Components->Nodes[QN->Components->Count - 2]; 1485 SIN->Class = static_cast<IdentifierNode *>(ClassNode); 1486 } 1487 assert(QN); 1488 return QN; 1489 } 1490 1491 IdentifierNode *Demangler::demangleUnqualifiedTypeName(StringView &MangledName, 1492 bool Memorize) { 1493 // An inner-most name can be a back-reference, because a fully-qualified name 1494 // (e.g. Scope + Inner) can contain other fully qualified names inside of 1495 // them (for example template parameters), and these nested parameters can 1496 // refer to previously mangled types. 1497 if (startsWithDigit(MangledName)) 1498 return demangleBackRefName(MangledName); 1499 1500 if (MangledName.startsWith("?$")) 1501 return demangleTemplateInstantiationName(MangledName, NBB_Template); 1502 1503 return demangleSimpleName(MangledName, Memorize); 1504 } 1505 1506 IdentifierNode * 1507 Demangler::demangleUnqualifiedSymbolName(StringView &MangledName, 1508 NameBackrefBehavior NBB) { 1509 if (startsWithDigit(MangledName)) 1510 return demangleBackRefName(MangledName); 1511 if (MangledName.startsWith("?$")) 1512 return demangleTemplateInstantiationName(MangledName, NBB); 1513 if (MangledName.startsWith('?')) 1514 return demangleFunctionIdentifierCode(MangledName); 1515 return demangleSimpleName(MangledName, /*Memorize=*/(NBB & NBB_Simple) != 0); 1516 } 1517 1518 IdentifierNode *Demangler::demangleNameScopePiece(StringView &MangledName) { 1519 if (startsWithDigit(MangledName)) 1520 return demangleBackRefName(MangledName); 1521 1522 if (MangledName.startsWith("?$")) 1523 return demangleTemplateInstantiationName(MangledName, NBB_Template); 1524 1525 if (MangledName.startsWith("?A")) 1526 return demangleAnonymousNamespaceName(MangledName); 1527 1528 if (startsWithLocalScopePattern(MangledName)) 1529 return demangleLocallyScopedNamePiece(MangledName); 1530 1531 return demangleSimpleName(MangledName, /*Memorize=*/true); 1532 } 1533 1534 static NodeArrayNode *nodeListToNodeArray(ArenaAllocator &Arena, NodeList *Head, 1535 size_t Count) { 1536 NodeArrayNode *N = Arena.alloc<NodeArrayNode>(); 1537 N->Count = Count; 1538 N->Nodes = Arena.allocArray<Node *>(Count); 1539 for (size_t I = 0; I < Count; ++I) { 1540 N->Nodes[I] = Head->N; 1541 Head = Head->Next; 1542 } 1543 return N; 1544 } 1545 1546 QualifiedNameNode * 1547 Demangler::demangleNameScopeChain(StringView &MangledName, 1548 IdentifierNode *UnqualifiedName) { 1549 NodeList *Head = Arena.alloc<NodeList>(); 1550 1551 Head->N = UnqualifiedName; 1552 1553 size_t Count = 1; 1554 while (!MangledName.consumeFront("@")) { 1555 ++Count; 1556 NodeList *NewHead = Arena.alloc<NodeList>(); 1557 NewHead->Next = Head; 1558 Head = NewHead; 1559 1560 if (MangledName.empty()) { 1561 Error = true; 1562 return nullptr; 1563 } 1564 1565 assert(!Error); 1566 IdentifierNode *Elem = demangleNameScopePiece(MangledName); 1567 if (Error) 1568 return nullptr; 1569 1570 Head->N = Elem; 1571 } 1572 1573 QualifiedNameNode *QN = Arena.alloc<QualifiedNameNode>(); 1574 QN->Components = nodeListToNodeArray(Arena, Head, Count); 1575 return QN; 1576 } 1577 1578 FuncClass Demangler::demangleFunctionClass(StringView &MangledName) { 1579 switch (MangledName.popFront()) { 1580 case '9': 1581 return FuncClass(FC_ExternC | FC_NoParameterList); 1582 case 'A': 1583 return FC_Private; 1584 case 'B': 1585 return FuncClass(FC_Private | FC_Far); 1586 case 'C': 1587 return FuncClass(FC_Private | FC_Static); 1588 case 'D': 1589 return FuncClass(FC_Private | FC_Static); 1590 case 'E': 1591 return FuncClass(FC_Private | FC_Virtual); 1592 case 'F': 1593 return FuncClass(FC_Private | FC_Virtual); 1594 case 'G': 1595 return FuncClass(FC_Private | FC_StaticThisAdjust); 1596 case 'H': 1597 return FuncClass(FC_Private | FC_StaticThisAdjust | FC_Far); 1598 case 'I': 1599 return FuncClass(FC_Protected); 1600 case 'J': 1601 return FuncClass(FC_Protected | FC_Far); 1602 case 'K': 1603 return FuncClass(FC_Protected | FC_Static); 1604 case 'L': 1605 return FuncClass(FC_Protected | FC_Static | FC_Far); 1606 case 'M': 1607 return FuncClass(FC_Protected | FC_Virtual); 1608 case 'N': 1609 return FuncClass(FC_Protected | FC_Virtual | FC_Far); 1610 case 'O': 1611 return FuncClass(FC_Protected | FC_Virtual | FC_StaticThisAdjust); 1612 case 'P': 1613 return FuncClass(FC_Protected | FC_Virtual | FC_StaticThisAdjust | FC_Far); 1614 case 'Q': 1615 return FuncClass(FC_Public); 1616 case 'R': 1617 return FuncClass(FC_Public | FC_Far); 1618 case 'S': 1619 return FuncClass(FC_Public | FC_Static); 1620 case 'T': 1621 return FuncClass(FC_Public | FC_Static | FC_Far); 1622 case 'U': 1623 return FuncClass(FC_Public | FC_Virtual); 1624 case 'V': 1625 return FuncClass(FC_Public | FC_Virtual | FC_Far); 1626 case 'W': 1627 return FuncClass(FC_Public | FC_Virtual | FC_StaticThisAdjust); 1628 case 'X': 1629 return FuncClass(FC_Public | FC_Virtual | FC_StaticThisAdjust | FC_Far); 1630 case 'Y': 1631 return FuncClass(FC_Global); 1632 case 'Z': 1633 return FuncClass(FC_Global | FC_Far); 1634 case '$': { 1635 FuncClass VFlag = FC_VirtualThisAdjust; 1636 if (MangledName.consumeFront('R')) 1637 VFlag = FuncClass(VFlag | FC_VirtualThisAdjustEx); 1638 if (MangledName.empty()) 1639 break; 1640 switch (MangledName.popFront()) { 1641 case '0': 1642 return FuncClass(FC_Private | FC_Virtual | VFlag); 1643 case '1': 1644 return FuncClass(FC_Private | FC_Virtual | VFlag | FC_Far); 1645 case '2': 1646 return FuncClass(FC_Protected | FC_Virtual | VFlag); 1647 case '3': 1648 return FuncClass(FC_Protected | FC_Virtual | VFlag | FC_Far); 1649 case '4': 1650 return FuncClass(FC_Public | FC_Virtual | VFlag); 1651 case '5': 1652 return FuncClass(FC_Public | FC_Virtual | VFlag | FC_Far); 1653 } 1654 } 1655 } 1656 1657 Error = true; 1658 return FC_Public; 1659 } 1660 1661 CallingConv Demangler::demangleCallingConvention(StringView &MangledName) { 1662 if (MangledName.empty()) { 1663 Error = true; 1664 return CallingConv::None; 1665 } 1666 1667 switch (MangledName.popFront()) { 1668 case 'A': 1669 case 'B': 1670 return CallingConv::Cdecl; 1671 case 'C': 1672 case 'D': 1673 return CallingConv::Pascal; 1674 case 'E': 1675 case 'F': 1676 return CallingConv::Thiscall; 1677 case 'G': 1678 case 'H': 1679 return CallingConv::Stdcall; 1680 case 'I': 1681 case 'J': 1682 return CallingConv::Fastcall; 1683 case 'M': 1684 case 'N': 1685 return CallingConv::Clrcall; 1686 case 'O': 1687 case 'P': 1688 return CallingConv::Eabi; 1689 case 'Q': 1690 return CallingConv::Vectorcall; 1691 } 1692 1693 return CallingConv::None; 1694 } 1695 1696 StorageClass Demangler::demangleVariableStorageClass(StringView &MangledName) { 1697 assert(std::isdigit(MangledName.front())); 1698 1699 switch (MangledName.popFront()) { 1700 case '0': 1701 return StorageClass::PrivateStatic; 1702 case '1': 1703 return StorageClass::ProtectedStatic; 1704 case '2': 1705 return StorageClass::PublicStatic; 1706 case '3': 1707 return StorageClass::Global; 1708 case '4': 1709 return StorageClass::FunctionLocalStatic; 1710 } 1711 Error = true; 1712 return StorageClass::None; 1713 } 1714 1715 std::pair<Qualifiers, bool> 1716 Demangler::demangleQualifiers(StringView &MangledName) { 1717 if (MangledName.empty()) { 1718 Error = true; 1719 return std::make_pair(Q_None, false); 1720 } 1721 1722 switch (MangledName.popFront()) { 1723 // Member qualifiers 1724 case 'Q': 1725 return std::make_pair(Q_None, true); 1726 case 'R': 1727 return std::make_pair(Q_Const, true); 1728 case 'S': 1729 return std::make_pair(Q_Volatile, true); 1730 case 'T': 1731 return std::make_pair(Qualifiers(Q_Const | Q_Volatile), true); 1732 // Non-Member qualifiers 1733 case 'A': 1734 return std::make_pair(Q_None, false); 1735 case 'B': 1736 return std::make_pair(Q_Const, false); 1737 case 'C': 1738 return std::make_pair(Q_Volatile, false); 1739 case 'D': 1740 return std::make_pair(Qualifiers(Q_Const | Q_Volatile), false); 1741 } 1742 Error = true; 1743 return std::make_pair(Q_None, false); 1744 } 1745 1746 // <variable-type> ::= <type> <cvr-qualifiers> 1747 // ::= <type> <pointee-cvr-qualifiers> # pointers, references 1748 TypeNode *Demangler::demangleType(StringView &MangledName, 1749 QualifierMangleMode QMM) { 1750 Qualifiers Quals = Q_None; 1751 bool IsMember = false; 1752 if (QMM == QualifierMangleMode::Mangle) { 1753 std::tie(Quals, IsMember) = demangleQualifiers(MangledName); 1754 } else if (QMM == QualifierMangleMode::Result) { 1755 if (MangledName.consumeFront('?')) 1756 std::tie(Quals, IsMember) = demangleQualifiers(MangledName); 1757 } 1758 1759 if (MangledName.empty()) { 1760 Error = true; 1761 return nullptr; 1762 } 1763 1764 TypeNode *Ty = nullptr; 1765 if (isTagType(MangledName)) 1766 Ty = demangleClassType(MangledName); 1767 else if (isPointerType(MangledName)) { 1768 if (isMemberPointer(MangledName, Error)) 1769 Ty = demangleMemberPointerType(MangledName); 1770 else if (!Error) 1771 Ty = demanglePointerType(MangledName); 1772 else 1773 return nullptr; 1774 } else if (isArrayType(MangledName)) 1775 Ty = demangleArrayType(MangledName); 1776 else if (isFunctionType(MangledName)) { 1777 if (MangledName.consumeFront("$$A8@@")) 1778 Ty = demangleFunctionType(MangledName, true); 1779 else { 1780 assert(MangledName.startsWith("$$A6")); 1781 MangledName.consumeFront("$$A6"); 1782 Ty = demangleFunctionType(MangledName, false); 1783 } 1784 } else if (isCustomType(MangledName)) { 1785 Ty = demangleCustomType(MangledName); 1786 } else { 1787 Ty = demanglePrimitiveType(MangledName); 1788 } 1789 1790 if (!Ty || Error) 1791 return Ty; 1792 Ty->Quals = Qualifiers(Ty->Quals | Quals); 1793 return Ty; 1794 } 1795 1796 bool Demangler::demangleThrowSpecification(StringView &MangledName) { 1797 if (MangledName.consumeFront("_E")) 1798 return true; 1799 if (MangledName.consumeFront('Z')) 1800 return false; 1801 1802 Error = true; 1803 return false; 1804 } 1805 1806 FunctionSignatureNode *Demangler::demangleFunctionType(StringView &MangledName, 1807 bool HasThisQuals) { 1808 FunctionSignatureNode *FTy = Arena.alloc<FunctionSignatureNode>(); 1809 1810 if (HasThisQuals) { 1811 FTy->Quals = demanglePointerExtQualifiers(MangledName); 1812 FTy->RefQualifier = demangleFunctionRefQualifier(MangledName); 1813 FTy->Quals = Qualifiers(FTy->Quals | demangleQualifiers(MangledName).first); 1814 } 1815 1816 // Fields that appear on both member and non-member functions. 1817 FTy->CallConvention = demangleCallingConvention(MangledName); 1818 1819 // <return-type> ::= <type> 1820 // ::= @ # structors (they have no declared return type) 1821 bool IsStructor = MangledName.consumeFront('@'); 1822 if (!IsStructor) 1823 FTy->ReturnType = demangleType(MangledName, QualifierMangleMode::Result); 1824 1825 FTy->Params = demangleFunctionParameterList(MangledName); 1826 1827 FTy->IsNoexcept = demangleThrowSpecification(MangledName); 1828 1829 return FTy; 1830 } 1831 1832 FunctionSymbolNode * 1833 Demangler::demangleFunctionEncoding(StringView &MangledName) { 1834 FuncClass ExtraFlags = FC_None; 1835 if (MangledName.consumeFront("$$J0")) 1836 ExtraFlags = FC_ExternC; 1837 1838 if (MangledName.empty()) { 1839 Error = true; 1840 return nullptr; 1841 } 1842 1843 FuncClass FC = demangleFunctionClass(MangledName); 1844 FC = FuncClass(ExtraFlags | FC); 1845 1846 FunctionSignatureNode *FSN = nullptr; 1847 ThunkSignatureNode *TTN = nullptr; 1848 if (FC & FC_StaticThisAdjust) { 1849 TTN = Arena.alloc<ThunkSignatureNode>(); 1850 TTN->ThisAdjust.StaticOffset = demangleSigned(MangledName); 1851 } else if (FC & FC_VirtualThisAdjust) { 1852 TTN = Arena.alloc<ThunkSignatureNode>(); 1853 if (FC & FC_VirtualThisAdjustEx) { 1854 TTN->ThisAdjust.VBPtrOffset = demangleSigned(MangledName); 1855 TTN->ThisAdjust.VBOffsetOffset = demangleSigned(MangledName); 1856 } 1857 TTN->ThisAdjust.VtordispOffset = demangleSigned(MangledName); 1858 TTN->ThisAdjust.StaticOffset = demangleSigned(MangledName); 1859 } 1860 1861 if (FC & FC_NoParameterList) { 1862 // This is an extern "C" function whose full signature hasn't been mangled. 1863 // This happens when we need to mangle a local symbol inside of an extern 1864 // "C" function. 1865 FSN = Arena.alloc<FunctionSignatureNode>(); 1866 } else { 1867 bool HasThisQuals = !(FC & (FC_Global | FC_Static)); 1868 FSN = demangleFunctionType(MangledName, HasThisQuals); 1869 } 1870 1871 if (Error) 1872 return nullptr; 1873 1874 if (TTN) { 1875 *static_cast<FunctionSignatureNode *>(TTN) = *FSN; 1876 FSN = TTN; 1877 } 1878 FSN->FunctionClass = FC; 1879 1880 FunctionSymbolNode *Symbol = Arena.alloc<FunctionSymbolNode>(); 1881 Symbol->Signature = FSN; 1882 return Symbol; 1883 } 1884 1885 CustomTypeNode *Demangler::demangleCustomType(StringView &MangledName) { 1886 assert(MangledName.startsWith('?')); 1887 MangledName.popFront(); 1888 1889 CustomTypeNode *CTN = Arena.alloc<CustomTypeNode>(); 1890 CTN->Identifier = demangleUnqualifiedTypeName(MangledName, /*Memorize=*/true); 1891 if (!MangledName.consumeFront('@')) 1892 Error = true; 1893 if (Error) 1894 return nullptr; 1895 return CTN; 1896 } 1897 1898 // Reads a primitive type. 1899 PrimitiveTypeNode *Demangler::demanglePrimitiveType(StringView &MangledName) { 1900 if (MangledName.consumeFront("$$T")) 1901 return Arena.alloc<PrimitiveTypeNode>(PrimitiveKind::Nullptr); 1902 1903 switch (MangledName.popFront()) { 1904 case 'X': 1905 return Arena.alloc<PrimitiveTypeNode>(PrimitiveKind::Void); 1906 case 'D': 1907 return Arena.alloc<PrimitiveTypeNode>(PrimitiveKind::Char); 1908 case 'C': 1909 return Arena.alloc<PrimitiveTypeNode>(PrimitiveKind::Schar); 1910 case 'E': 1911 return Arena.alloc<PrimitiveTypeNode>(PrimitiveKind::Uchar); 1912 case 'F': 1913 return Arena.alloc<PrimitiveTypeNode>(PrimitiveKind::Short); 1914 case 'G': 1915 return Arena.alloc<PrimitiveTypeNode>(PrimitiveKind::Ushort); 1916 case 'H': 1917 return Arena.alloc<PrimitiveTypeNode>(PrimitiveKind::Int); 1918 case 'I': 1919 return Arena.alloc<PrimitiveTypeNode>(PrimitiveKind::Uint); 1920 case 'J': 1921 return Arena.alloc<PrimitiveTypeNode>(PrimitiveKind::Long); 1922 case 'K': 1923 return Arena.alloc<PrimitiveTypeNode>(PrimitiveKind::Ulong); 1924 case 'M': 1925 return Arena.alloc<PrimitiveTypeNode>(PrimitiveKind::Float); 1926 case 'N': 1927 return Arena.alloc<PrimitiveTypeNode>(PrimitiveKind::Double); 1928 case 'O': 1929 return Arena.alloc<PrimitiveTypeNode>(PrimitiveKind::Ldouble); 1930 case '_': { 1931 if (MangledName.empty()) { 1932 Error = true; 1933 return nullptr; 1934 } 1935 switch (MangledName.popFront()) { 1936 case 'N': 1937 return Arena.alloc<PrimitiveTypeNode>(PrimitiveKind::Bool); 1938 case 'J': 1939 return Arena.alloc<PrimitiveTypeNode>(PrimitiveKind::Int64); 1940 case 'K': 1941 return Arena.alloc<PrimitiveTypeNode>(PrimitiveKind::Uint64); 1942 case 'W': 1943 return Arena.alloc<PrimitiveTypeNode>(PrimitiveKind::Wchar); 1944 case 'S': 1945 return Arena.alloc<PrimitiveTypeNode>(PrimitiveKind::Char16); 1946 case 'U': 1947 return Arena.alloc<PrimitiveTypeNode>(PrimitiveKind::Char32); 1948 } 1949 break; 1950 } 1951 } 1952 Error = true; 1953 return nullptr; 1954 } 1955 1956 TagTypeNode *Demangler::demangleClassType(StringView &MangledName) { 1957 TagTypeNode *TT = nullptr; 1958 1959 switch (MangledName.popFront()) { 1960 case 'T': 1961 TT = Arena.alloc<TagTypeNode>(TagKind::Union); 1962 break; 1963 case 'U': 1964 TT = Arena.alloc<TagTypeNode>(TagKind::Struct); 1965 break; 1966 case 'V': 1967 TT = Arena.alloc<TagTypeNode>(TagKind::Class); 1968 break; 1969 case 'W': 1970 if (!MangledName.consumeFront('4')) { 1971 Error = true; 1972 return nullptr; 1973 } 1974 TT = Arena.alloc<TagTypeNode>(TagKind::Enum); 1975 break; 1976 default: 1977 assert(false); 1978 } 1979 1980 TT->QualifiedName = demangleFullyQualifiedTypeName(MangledName); 1981 return TT; 1982 } 1983 1984 // <pointer-type> ::= E? <pointer-cvr-qualifiers> <ext-qualifiers> <type> 1985 // # the E is required for 64-bit non-static pointers 1986 PointerTypeNode *Demangler::demanglePointerType(StringView &MangledName) { 1987 PointerTypeNode *Pointer = Arena.alloc<PointerTypeNode>(); 1988 1989 std::tie(Pointer->Quals, Pointer->Affinity) = 1990 demanglePointerCVQualifiers(MangledName); 1991 1992 if (MangledName.consumeFront("6")) { 1993 Pointer->Pointee = demangleFunctionType(MangledName, false); 1994 return Pointer; 1995 } 1996 1997 Qualifiers ExtQuals = demanglePointerExtQualifiers(MangledName); 1998 Pointer->Quals = Qualifiers(Pointer->Quals | ExtQuals); 1999 2000 Pointer->Pointee = demangleType(MangledName, QualifierMangleMode::Mangle); 2001 return Pointer; 2002 } 2003 2004 PointerTypeNode *Demangler::demangleMemberPointerType(StringView &MangledName) { 2005 PointerTypeNode *Pointer = Arena.alloc<PointerTypeNode>(); 2006 2007 std::tie(Pointer->Quals, Pointer->Affinity) = 2008 demanglePointerCVQualifiers(MangledName); 2009 assert(Pointer->Affinity == PointerAffinity::Pointer); 2010 2011 Qualifiers ExtQuals = demanglePointerExtQualifiers(MangledName); 2012 Pointer->Quals = Qualifiers(Pointer->Quals | ExtQuals); 2013 2014 // isMemberPointer() only returns true if there is at least one character 2015 // after the qualifiers. 2016 if (MangledName.consumeFront("8")) { 2017 Pointer->ClassParent = demangleFullyQualifiedTypeName(MangledName); 2018 Pointer->Pointee = demangleFunctionType(MangledName, true); 2019 } else { 2020 Qualifiers PointeeQuals = Q_None; 2021 bool IsMember = false; 2022 std::tie(PointeeQuals, IsMember) = demangleQualifiers(MangledName); 2023 assert(IsMember || Error); 2024 Pointer->ClassParent = demangleFullyQualifiedTypeName(MangledName); 2025 2026 Pointer->Pointee = demangleType(MangledName, QualifierMangleMode::Drop); 2027 if (Pointer->Pointee) 2028 Pointer->Pointee->Quals = PointeeQuals; 2029 } 2030 2031 return Pointer; 2032 } 2033 2034 Qualifiers Demangler::demanglePointerExtQualifiers(StringView &MangledName) { 2035 Qualifiers Quals = Q_None; 2036 if (MangledName.consumeFront('E')) 2037 Quals = Qualifiers(Quals | Q_Pointer64); 2038 if (MangledName.consumeFront('I')) 2039 Quals = Qualifiers(Quals | Q_Restrict); 2040 if (MangledName.consumeFront('F')) 2041 Quals = Qualifiers(Quals | Q_Unaligned); 2042 2043 return Quals; 2044 } 2045 2046 ArrayTypeNode *Demangler::demangleArrayType(StringView &MangledName) { 2047 assert(MangledName.front() == 'Y'); 2048 MangledName.popFront(); 2049 2050 uint64_t Rank = 0; 2051 bool IsNegative = false; 2052 std::tie(Rank, IsNegative) = demangleNumber(MangledName); 2053 if (IsNegative || Rank == 0) { 2054 Error = true; 2055 return nullptr; 2056 } 2057 2058 ArrayTypeNode *ATy = Arena.alloc<ArrayTypeNode>(); 2059 NodeList *Head = Arena.alloc<NodeList>(); 2060 NodeList *Tail = Head; 2061 2062 for (uint64_t I = 0; I < Rank; ++I) { 2063 uint64_t D = 0; 2064 std::tie(D, IsNegative) = demangleNumber(MangledName); 2065 if (Error || IsNegative) { 2066 Error = true; 2067 return nullptr; 2068 } 2069 Tail->N = Arena.alloc<IntegerLiteralNode>(D, IsNegative); 2070 if (I + 1 < Rank) { 2071 Tail->Next = Arena.alloc<NodeList>(); 2072 Tail = Tail->Next; 2073 } 2074 } 2075 ATy->Dimensions = nodeListToNodeArray(Arena, Head, Rank); 2076 2077 if (MangledName.consumeFront("$$C")) { 2078 bool IsMember = false; 2079 std::tie(ATy->Quals, IsMember) = demangleQualifiers(MangledName); 2080 if (IsMember) { 2081 Error = true; 2082 return nullptr; 2083 } 2084 } 2085 2086 ATy->ElementType = demangleType(MangledName, QualifierMangleMode::Drop); 2087 return ATy; 2088 } 2089 2090 // Reads a function or a template parameters. 2091 NodeArrayNode * 2092 Demangler::demangleFunctionParameterList(StringView &MangledName) { 2093 // Empty parameter list. 2094 if (MangledName.consumeFront('X')) 2095 return nullptr; 2096 2097 NodeList *Head = Arena.alloc<NodeList>(); 2098 NodeList **Current = &Head; 2099 size_t Count = 0; 2100 while (!Error && !MangledName.startsWith('@') && 2101 !MangledName.startsWith('Z')) { 2102 ++Count; 2103 2104 if (startsWithDigit(MangledName)) { 2105 size_t N = MangledName[0] - '0'; 2106 if (N >= Backrefs.FunctionParamCount) { 2107 Error = true; 2108 return nullptr; 2109 } 2110 MangledName = MangledName.dropFront(); 2111 2112 *Current = Arena.alloc<NodeList>(); 2113 (*Current)->N = Backrefs.FunctionParams[N]; 2114 Current = &(*Current)->Next; 2115 continue; 2116 } 2117 2118 size_t OldSize = MangledName.size(); 2119 2120 *Current = Arena.alloc<NodeList>(); 2121 TypeNode *TN = demangleType(MangledName, QualifierMangleMode::Drop); 2122 if (!TN || Error) 2123 return nullptr; 2124 2125 (*Current)->N = TN; 2126 2127 size_t CharsConsumed = OldSize - MangledName.size(); 2128 assert(CharsConsumed != 0); 2129 2130 // Single-letter types are ignored for backreferences because memorizing 2131 // them doesn't save anything. 2132 if (Backrefs.FunctionParamCount <= 9 && CharsConsumed > 1) 2133 Backrefs.FunctionParams[Backrefs.FunctionParamCount++] = TN; 2134 2135 Current = &(*Current)->Next; 2136 } 2137 2138 if (Error) 2139 return nullptr; 2140 2141 NodeArrayNode *NA = nodeListToNodeArray(Arena, Head, Count); 2142 // A non-empty parameter list is terminated by either 'Z' (variadic) parameter 2143 // list or '@' (non variadic). Careful not to consume "@Z", as in that case 2144 // the following Z could be a throw specifier. 2145 if (MangledName.consumeFront('@')) 2146 return NA; 2147 2148 if (MangledName.consumeFront('Z')) { 2149 // This is a variadic parameter list. We probably need a variadic node to 2150 // append to the end. 2151 return NA; 2152 } 2153 2154 Error = true; 2155 return nullptr; 2156 } 2157 2158 NodeArrayNode * 2159 Demangler::demangleTemplateParameterList(StringView &MangledName) { 2160 NodeList *Head; 2161 NodeList **Current = &Head; 2162 size_t Count = 0; 2163 2164 while (!Error && !MangledName.startsWith('@')) { 2165 if (MangledName.consumeFront("$S") || MangledName.consumeFront("$$V") || 2166 MangledName.consumeFront("$$$V") || MangledName.consumeFront("$$Z")) { 2167 // parameter pack separator 2168 continue; 2169 } 2170 2171 ++Count; 2172 2173 // Template parameter lists don't participate in back-referencing. 2174 *Current = Arena.alloc<NodeList>(); 2175 2176 NodeList &TP = **Current; 2177 2178 TemplateParameterReferenceNode *TPRN = nullptr; 2179 if (MangledName.consumeFront("$$Y")) { 2180 // Template alias 2181 TP.N = demangleFullyQualifiedTypeName(MangledName); 2182 } else if (MangledName.consumeFront("$$B")) { 2183 // Array 2184 TP.N = demangleType(MangledName, QualifierMangleMode::Drop); 2185 } else if (MangledName.consumeFront("$$C")) { 2186 // Type has qualifiers. 2187 TP.N = demangleType(MangledName, QualifierMangleMode::Mangle); 2188 } else if (MangledName.startsWith("$1") || MangledName.startsWith("$H") || 2189 MangledName.startsWith("$I") || MangledName.startsWith("$J")) { 2190 // Pointer to member 2191 TP.N = TPRN = Arena.alloc<TemplateParameterReferenceNode>(); 2192 TPRN->IsMemberPointer = true; 2193 2194 MangledName = MangledName.dropFront(); 2195 // 1 - single inheritance <name> 2196 // H - multiple inheritance <name> <number> 2197 // I - virtual inheritance <name> <number> <number> <number> 2198 // J - unspecified inheritance <name> <number> <number> <number> 2199 char InheritanceSpecifier = MangledName.popFront(); 2200 SymbolNode *S = nullptr; 2201 if (MangledName.startsWith('?')) { 2202 S = parse(MangledName); 2203 if (Error || !S->Name) { 2204 Error = true; 2205 return nullptr; 2206 } 2207 memorizeIdentifier(S->Name->getUnqualifiedIdentifier()); 2208 } 2209 2210 switch (InheritanceSpecifier) { 2211 case 'J': 2212 TPRN->ThunkOffsets[TPRN->ThunkOffsetCount++] = 2213 demangleSigned(MangledName); 2214 DEMANGLE_FALLTHROUGH; 2215 case 'I': 2216 TPRN->ThunkOffsets[TPRN->ThunkOffsetCount++] = 2217 demangleSigned(MangledName); 2218 DEMANGLE_FALLTHROUGH; 2219 case 'H': 2220 TPRN->ThunkOffsets[TPRN->ThunkOffsetCount++] = 2221 demangleSigned(MangledName); 2222 DEMANGLE_FALLTHROUGH; 2223 case '1': 2224 break; 2225 default: 2226 Error = true; 2227 break; 2228 } 2229 TPRN->Affinity = PointerAffinity::Pointer; 2230 TPRN->Symbol = S; 2231 } else if (MangledName.startsWith("$E?")) { 2232 MangledName.consumeFront("$E"); 2233 // Reference to symbol 2234 TP.N = TPRN = Arena.alloc<TemplateParameterReferenceNode>(); 2235 TPRN->Symbol = parse(MangledName); 2236 TPRN->Affinity = PointerAffinity::Reference; 2237 } else if (MangledName.startsWith("$F") || MangledName.startsWith("$G")) { 2238 TP.N = TPRN = Arena.alloc<TemplateParameterReferenceNode>(); 2239 2240 // Data member pointer. 2241 MangledName = MangledName.dropFront(); 2242 char InheritanceSpecifier = MangledName.popFront(); 2243 2244 switch (InheritanceSpecifier) { 2245 case 'G': 2246 TPRN->ThunkOffsets[TPRN->ThunkOffsetCount++] = 2247 demangleSigned(MangledName); 2248 DEMANGLE_FALLTHROUGH; 2249 case 'F': 2250 TPRN->ThunkOffsets[TPRN->ThunkOffsetCount++] = 2251 demangleSigned(MangledName); 2252 TPRN->ThunkOffsets[TPRN->ThunkOffsetCount++] = 2253 demangleSigned(MangledName); 2254 DEMANGLE_FALLTHROUGH; 2255 case '0': 2256 break; 2257 default: 2258 Error = true; 2259 break; 2260 } 2261 TPRN->IsMemberPointer = true; 2262 2263 } else if (MangledName.consumeFront("$0")) { 2264 // Integral non-type template parameter 2265 bool IsNegative = false; 2266 uint64_t Value = 0; 2267 std::tie(Value, IsNegative) = demangleNumber(MangledName); 2268 2269 TP.N = Arena.alloc<IntegerLiteralNode>(Value, IsNegative); 2270 } else { 2271 TP.N = demangleType(MangledName, QualifierMangleMode::Drop); 2272 } 2273 if (Error) 2274 return nullptr; 2275 2276 Current = &TP.Next; 2277 } 2278 2279 if (Error) 2280 return nullptr; 2281 2282 // Template parameter lists cannot be variadic, so it can only be terminated 2283 // by @. 2284 if (MangledName.consumeFront('@')) 2285 return nodeListToNodeArray(Arena, Head, Count); 2286 Error = true; 2287 return nullptr; 2288 } 2289 2290 void Demangler::dumpBackReferences() { 2291 std::printf("%d function parameter backreferences\n", 2292 (int)Backrefs.FunctionParamCount); 2293 2294 // Create an output stream so we can render each type. 2295 OutputStream OS; 2296 if (!initializeOutputStream(nullptr, nullptr, OS, 1024)) 2297 std::terminate(); 2298 for (size_t I = 0; I < Backrefs.FunctionParamCount; ++I) { 2299 OS.setCurrentPosition(0); 2300 2301 TypeNode *T = Backrefs.FunctionParams[I]; 2302 T->output(OS, OF_Default); 2303 2304 std::printf(" [%d] - %.*s\n", (int)I, (int)OS.getCurrentPosition(), 2305 OS.getBuffer()); 2306 } 2307 std::free(OS.getBuffer()); 2308 2309 if (Backrefs.FunctionParamCount > 0) 2310 std::printf("\n"); 2311 std::printf("%d name backreferences\n", (int)Backrefs.NamesCount); 2312 for (size_t I = 0; I < Backrefs.NamesCount; ++I) { 2313 std::printf(" [%d] - %.*s\n", (int)I, (int)Backrefs.Names[I]->Name.size(), 2314 Backrefs.Names[I]->Name.begin()); 2315 } 2316 if (Backrefs.NamesCount > 0) 2317 std::printf("\n"); 2318 } 2319 2320 char *llvm::microsoftDemangle(const char *MangledName, char *Buf, size_t *N, 2321 int *Status, MSDemangleFlags Flags) { 2322 int InternalStatus = demangle_success; 2323 Demangler D; 2324 OutputStream S; 2325 2326 StringView Name{MangledName}; 2327 SymbolNode *AST = D.parse(Name); 2328 2329 if (Flags & MSDF_DumpBackrefs) 2330 D.dumpBackReferences(); 2331 2332 if (D.Error) 2333 InternalStatus = demangle_invalid_mangled_name; 2334 else if (!initializeOutputStream(Buf, N, S, 1024)) 2335 InternalStatus = demangle_memory_alloc_failure; 2336 else { 2337 AST->output(S, OF_Default); 2338 S += '\0'; 2339 if (N != nullptr) 2340 *N = S.getCurrentPosition(); 2341 Buf = S.getBuffer(); 2342 } 2343 2344 if (Status) 2345 *Status = InternalStatus; 2346 return InternalStatus == demangle_success ? Buf : nullptr; 2347 } 2348