LLVM  16.0.0git
MicrosoftDemangleNodes.cpp
Go to the documentation of this file.
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 //===----------------------------------------------------------------------===//
12 
14 #include "llvm/Demangle/Utility.h"
15 #include <cctype>
16 #include <string>
17 
18 using namespace llvm;
19 using namespace ms_demangle;
20 
21 #define OUTPUT_ENUM_CLASS_VALUE(Enum, Value, Desc) \
22  case Enum::Value: \
23  OB << Desc; \
24  break;
25 
26 // Writes a space if the last token does not end with a punctuation.
27 static void outputSpaceIfNecessary(OutputBuffer &OB) {
28  if (OB.empty())
29  return;
30 
31  char C = OB.back();
32  if (std::isalnum(C) || C == '>')
33  OB << " ";
34 }
35 
36 static void outputSingleQualifier(OutputBuffer &OB, Qualifiers Q) {
37  switch (Q) {
38  case Q_Const:
39  OB << "const";
40  break;
41  case Q_Volatile:
42  OB << "volatile";
43  break;
44  case Q_Restrict:
45  OB << "__restrict";
46  break;
47  default:
48  break;
49  }
50 }
51 
52 static bool outputQualifierIfPresent(OutputBuffer &OB, Qualifiers Q,
53  Qualifiers Mask, bool NeedSpace) {
54  if (!(Q & Mask))
55  return NeedSpace;
56 
57  if (NeedSpace)
58  OB << " ";
59 
61  return true;
62 }
63 
64 static void outputQualifiers(OutputBuffer &OB, Qualifiers Q, bool SpaceBefore,
65  bool SpaceAfter) {
66  if (Q == Q_None)
67  return;
68 
69  size_t Pos1 = OB.getCurrentPosition();
70  SpaceBefore = outputQualifierIfPresent(OB, Q, Q_Const, SpaceBefore);
71  SpaceBefore = outputQualifierIfPresent(OB, Q, Q_Volatile, SpaceBefore);
72  SpaceBefore = outputQualifierIfPresent(OB, Q, Q_Restrict, SpaceBefore);
73  size_t Pos2 = OB.getCurrentPosition();
74  if (SpaceAfter && Pos2 > Pos1)
75  OB << " ";
76 }
77 
78 static void outputCallingConvention(OutputBuffer &OB, CallingConv CC) {
80 
81  switch (CC) {
82  case CallingConv::Cdecl:
83  OB << "__cdecl";
84  break;
86  OB << "__fastcall";
87  break;
89  OB << "__pascal";
90  break;
92  OB << "__regcall";
93  break;
95  OB << "__stdcall";
96  break;
98  OB << "__thiscall";
99  break;
100  case CallingConv::Eabi:
101  OB << "__eabi";
102  break;
104  OB << "__vectorcall";
105  break;
107  OB << "__clrcall";
108  break;
109  case CallingConv::Swift:
110  OB << "__attribute__((__swiftcall__)) ";
111  break;
113  OB << "__attribute__((__swiftasynccall__)) ";
114  break;
115  default:
116  break;
117  }
118 }
119 
120 std::string Node::toString(OutputFlags Flags) const {
121  OutputBuffer OB;
122  this->output(OB, Flags);
123  StringView SV = OB;
124  std::string Owned(SV.begin(), SV.end());
125  std::free(OB.getBuffer());
126  return Owned;
127 }
128 
129 void PrimitiveTypeNode::outputPre(OutputBuffer &OB, OutputFlags Flags) const {
130  switch (PrimKind) {
132  OUTPUT_ENUM_CLASS_VALUE(PrimitiveKind, Bool, "bool");
133  OUTPUT_ENUM_CLASS_VALUE(PrimitiveKind, Char, "char");
135  OUTPUT_ENUM_CLASS_VALUE(PrimitiveKind, Uchar, "unsigned char");
136  OUTPUT_ENUM_CLASS_VALUE(PrimitiveKind, Char8, "char8_t");
137  OUTPUT_ENUM_CLASS_VALUE(PrimitiveKind, Char16, "char16_t");
138  OUTPUT_ENUM_CLASS_VALUE(PrimitiveKind, Char32, "char32_t");
140  OUTPUT_ENUM_CLASS_VALUE(PrimitiveKind, Ushort, "unsigned short");
142  OUTPUT_ENUM_CLASS_VALUE(PrimitiveKind, Uint, "unsigned int");
144  OUTPUT_ENUM_CLASS_VALUE(PrimitiveKind, Ulong, "unsigned long");
145  OUTPUT_ENUM_CLASS_VALUE(PrimitiveKind, Int64, "__int64");
146  OUTPUT_ENUM_CLASS_VALUE(PrimitiveKind, Uint64, "unsigned __int64");
148  OUTPUT_ENUM_CLASS_VALUE(PrimitiveKind, Float, "float");
149  OUTPUT_ENUM_CLASS_VALUE(PrimitiveKind, Double, "double");
151  OUTPUT_ENUM_CLASS_VALUE(PrimitiveKind, Nullptr, "std::nullptr_t");
152  }
153  outputQualifiers(OB, Quals, true, false);
154 }
155 
156 void NodeArrayNode::output(OutputBuffer &OB, OutputFlags Flags) const {
157  output(OB, Flags, ", ");
158 }
159 
160 void NodeArrayNode::output(OutputBuffer &OB, OutputFlags Flags,
161  StringView Separator) const {
162  if (Count == 0)
163  return;
164  if (Nodes[0])
165  Nodes[0]->output(OB, Flags);
166  for (size_t I = 1; I < Count; ++I) {
167  OB << Separator;
168  Nodes[I]->output(OB, Flags);
169  }
170 }
171 
173  OutputFlags Flags) const {
174  switch (Char) {
175  case CharKind::Wchar:
176  OB << "L\"";
177  break;
178  case CharKind::Char:
179  OB << "\"";
180  break;
181  case CharKind::Char16:
182  OB << "u\"";
183  break;
184  case CharKind::Char32:
185  OB << "U\"";
186  break;
187  }
188  OB << DecodedString << "\"";
189  if (IsTruncated)
190  OB << "...";
191 }
192 
193 void IntegerLiteralNode::output(OutputBuffer &OB, OutputFlags Flags) const {
194  if (IsNegative)
195  OB << '-';
196  OB << Value;
197 }
198 
200  OutputFlags Flags) const {
201  if (ThunkOffsetCount > 0)
202  OB << "{";
204  OB << "&";
205 
206  if (Symbol) {
207  Symbol->output(OB, Flags);
208  if (ThunkOffsetCount > 0)
209  OB << ", ";
210  }
211 
212  if (ThunkOffsetCount > 0)
213  OB << ThunkOffsets[0];
214  for (int I = 1; I < ThunkOffsetCount; ++I) {
215  OB << ", " << ThunkOffsets[I];
216  }
217  if (ThunkOffsetCount > 0)
218  OB << "}";
219 }
220 
222  OutputFlags Flags) const {
223  if (!TemplateParams)
224  return;
225  OB << "<";
226  TemplateParams->output(OB, Flags);
227  OB << ">";
228 }
229 
231  OutputFlags Flags) const {
232  if (IsDestructor)
233  OB << "`dynamic atexit destructor for ";
234  else
235  OB << "`dynamic initializer for ";
236 
237  if (Variable) {
238  OB << "`";
239  Variable->output(OB, Flags);
240  OB << "''";
241  } else {
242  OB << "'";
243  Name->output(OB, Flags);
244  OB << "''";
245  }
246 }
247 
248 void NamedIdentifierNode::output(OutputBuffer &OB, OutputFlags Flags) const {
249  OB << Name;
251 }
252 
254  OutputFlags Flags) const {
255  switch (Operator) {
265  "operator[]");
266  OUTPUT_ENUM_CLASS_VALUE(IntrinsicFunctionKind, Pointer, "operator->");
274  "operator->*");
281  "operator>=");
282  OUTPUT_ENUM_CLASS_VALUE(IntrinsicFunctionKind, Comma, "operator,");
297  "operator&=");
299  "operator|=");
301  "operator^=");
304  "`vector deleting dtor'");
306  "`default ctor closure'");
308  "`scalar deleting dtor'");
310  "`vector ctor iterator'");
312  "`vector dtor iterator'");
314  "`vector vbase ctor iterator'");
316  "`virtual displacement map'");
318  "`eh vector ctor iterator'");
320  "`eh vector dtor iterator'");
322  "`eh vector vbase ctor iterator'");
324  "`copy ctor closure'");
326  "`local vftable ctor closure'");
329  "operator delete[]");
331  "`managed vector ctor iterator'");
333  "`managed vector dtor iterator'");
335  "`EH vector copy ctor iterator'");
337  "`EH vector vbase copy ctor iterator'");
339  "`vector copy ctor iterator'");
341  "`vector vbase copy constructor iterator'");
343  "`managed vector vbase copy constructor iterator'");
345  "operator co_await");
349  break;
350  }
352 }
353 
355  OutputFlags Flags) const {
356  if (IsThread)
357  OB << "`local static thread guard'";
358  else
359  OB << "`local static guard'";
360  if (ScopeIndex > 0)
361  OB << "{" << ScopeIndex << "}";
362 }
363 
365  OutputFlags Flags) const {
366  OB << "operator";
368  OB << " ";
369  TargetType->output(OB, Flags);
370 }
371 
372 void StructorIdentifierNode::output(OutputBuffer &OB, OutputFlags Flags) const {
373  if (IsDestructor)
374  OB << "~";
375  Class->output(OB, Flags);
377 }
378 
380  OutputFlags Flags) const {
381  OB << "operator \"\"" << Name;
383 }
384 
386  OutputFlags Flags) const {
387  if (!(Flags & OF_NoAccessSpecifier)) {
388  if (FunctionClass & FC_Public)
389  OB << "public: ";
391  OB << "protected: ";
393  OB << "private: ";
394  }
395 
396  if (!(Flags & OF_NoMemberType)) {
397  if (!(FunctionClass & FC_Global)) {
398  if (FunctionClass & FC_Static)
399  OB << "static ";
400  }
402  OB << "virtual ";
403 
405  OB << "extern \"C\" ";
406  }
407 
408  if (!(Flags & OF_NoReturnType) && ReturnType) {
409  ReturnType->outputPre(OB, Flags);
410  OB << " ";
411  }
412 
413  if (!(Flags & OF_NoCallingConvention))
415 }
416 
418  OutputFlags Flags) const {
420  OB << "(";
421  if (Params)
422  Params->output(OB, Flags);
423  else
424  OB << "void";
425 
426  if (IsVariadic) {
427  if (OB.back() != '(')
428  OB << ", ";
429  OB << "...";
430  }
431  OB << ")";
432  }
433 
434  if (Quals & Q_Const)
435  OB << " const";
436  if (Quals & Q_Volatile)
437  OB << " volatile";
438  if (Quals & Q_Restrict)
439  OB << " __restrict";
440  if (Quals & Q_Unaligned)
441  OB << " __unaligned";
442 
443  if (IsNoexcept)
444  OB << " noexcept";
445 
447  OB << " &";
449  OB << " &&";
450 
451  if (!(Flags & OF_NoReturnType) && ReturnType)
452  ReturnType->outputPost(OB, Flags);
453 }
454 
455 void ThunkSignatureNode::outputPre(OutputBuffer &OB, OutputFlags Flags) const {
456  OB << "[thunk]: ";
457 
459 }
460 
461 void ThunkSignatureNode::outputPost(OutputBuffer &OB, OutputFlags Flags) const {
463  OB << "`adjustor{" << ThisAdjust.StaticOffset << "}'";
464  } else if (FunctionClass & FC_VirtualThisAdjust) {
466  OB << "`vtordispex{" << ThisAdjust.VBPtrOffset << ", "
468  << ", " << ThisAdjust.StaticOffset << "}'";
469  } else {
470  OB << "`vtordisp{" << ThisAdjust.VtordispOffset << ", "
471  << ThisAdjust.StaticOffset << "}'";
472  }
473  }
474 
476 }
477 
478 void PointerTypeNode::outputPre(OutputBuffer &OB, OutputFlags Flags) const {
480  // If this is a pointer to a function, don't output the calling convention.
481  // It needs to go inside the parentheses.
482  const FunctionSignatureNode *Sig =
483  static_cast<const FunctionSignatureNode *>(Pointee);
485  } else
486  Pointee->outputPre(OB, Flags);
487 
489 
490  if (Quals & Q_Unaligned)
491  OB << "__unaligned ";
492 
493  if (Pointee->kind() == NodeKind::ArrayType) {
494  OB << "(";
495  } else if (Pointee->kind() == NodeKind::FunctionSignature) {
496  OB << "(";
497  const FunctionSignatureNode *Sig =
498  static_cast<const FunctionSignatureNode *>(Pointee);
500  OB << " ";
501  }
502 
503  if (ClassParent) {
504  ClassParent->output(OB, Flags);
505  OB << "::";
506  }
507 
508  switch (Affinity) {
510  OB << "*";
511  break;
513  OB << "&";
514  break;
516  OB << "&&";
517  break;
518  default:
519  assert(false);
520  }
521  outputQualifiers(OB, Quals, false, false);
522 }
523 
524 void PointerTypeNode::outputPost(OutputBuffer &OB, OutputFlags Flags) const {
525  if (Pointee->kind() == NodeKind::ArrayType ||
527  OB << ")";
528 
529  Pointee->outputPost(OB, Flags);
530 }
531 
532 void TagTypeNode::outputPre(OutputBuffer &OB, OutputFlags Flags) const {
533  if (!(Flags & OF_NoTagSpecifier)) {
534  switch (Tag) {
535  OUTPUT_ENUM_CLASS_VALUE(TagKind, Class, "class");
537  OUTPUT_ENUM_CLASS_VALUE(TagKind, Union, "union");
538  OUTPUT_ENUM_CLASS_VALUE(TagKind, Enum, "enum");
539  }
540  OB << " ";
541  }
542  QualifiedName->output(OB, Flags);
543  outputQualifiers(OB, Quals, true, false);
544 }
545 
546 void TagTypeNode::outputPost(OutputBuffer &OB, OutputFlags Flags) const {}
547 
548 void ArrayTypeNode::outputPre(OutputBuffer &OB, OutputFlags Flags) const {
549  ElementType->outputPre(OB, Flags);
550  outputQualifiers(OB, Quals, true, false);
551 }
552 
554  Node *N) const {
555  assert(N->kind() == NodeKind::IntegerLiteral);
556  IntegerLiteralNode *ILN = static_cast<IntegerLiteralNode *>(N);
557  if (ILN->Value != 0)
558  ILN->output(OB, Flags);
559 }
560 
562  OutputFlags Flags) const {
563  if (Dimensions->Count == 0)
564  return;
565 
566  outputOneDimension(OB, Flags, Dimensions->Nodes[0]);
567  for (size_t I = 1; I < Dimensions->Count; ++I) {
568  OB << "][";
570  }
571 }
572 
573 void ArrayTypeNode::outputPost(OutputBuffer &OB, OutputFlags Flags) const {
574  OB << "[";
575  outputDimensionsImpl(OB, Flags);
576  OB << "]";
577 
578  ElementType->outputPost(OB, Flags);
579 }
580 
581 void SymbolNode::output(OutputBuffer &OB, OutputFlags Flags) const {
582  Name->output(OB, Flags);
583 }
584 
585 void FunctionSymbolNode::output(OutputBuffer &OB, OutputFlags Flags) const {
586  Signature->outputPre(OB, Flags);
588  Name->output(OB, Flags);
589  Signature->outputPost(OB, Flags);
590 }
591 
592 void VariableSymbolNode::output(OutputBuffer &OB, OutputFlags Flags) const {
593  const char *AccessSpec = nullptr;
594  bool IsStatic = true;
595  switch (SC) {
597  AccessSpec = "private";
598  break;
600  AccessSpec = "public";
601  break;
603  AccessSpec = "protected";
604  break;
605  default:
606  IsStatic = false;
607  break;
608  }
609  if (!(Flags & OF_NoAccessSpecifier) && AccessSpec)
610  OB << AccessSpec << ": ";
611  if (!(Flags & OF_NoMemberType) && IsStatic)
612  OB << "static ";
613 
614  if (!(Flags & OF_NoVariableType) && Type) {
615  Type->outputPre(OB, Flags);
617  }
618  Name->output(OB, Flags);
619  if (!(Flags & OF_NoVariableType) && Type)
620  Type->outputPost(OB, Flags);
621 }
622 
623 void CustomTypeNode::outputPre(OutputBuffer &OB, OutputFlags Flags) const {
624  Identifier->output(OB, Flags);
625 }
626 void CustomTypeNode::outputPost(OutputBuffer &OB, OutputFlags Flags) const {}
627 
628 void QualifiedNameNode::output(OutputBuffer &OB, OutputFlags Flags) const {
629  Components->output(OB, Flags, "::");
630 }
631 
633  OutputFlags Flags) const {
634  OB << "`RTTI Base Class Descriptor at (";
635  OB << NVOffset << ", " << VBPtrOffset << ", " << VBTableOffset << ", "
636  << this->Flags;
637  OB << ")'";
638 }
639 
641  OutputFlags Flags) const {
642  Name->output(OB, Flags);
643 }
644 
646  OutputFlags Flags) const {
647  OB << "`vcall'{" << OffsetInVTable << ", {flat}}";
648 }
649 
650 void SpecialTableSymbolNode::output(OutputBuffer &OB, OutputFlags Flags) const {
651  outputQualifiers(OB, Quals, false, true);
652  Name->output(OB, Flags);
653  if (TargetName) {
654  OB << "{for `";
655  TargetName->output(OB, Flags);
656  OB << "'}";
657  }
658 }
llvm::ms_demangle::FunctionSignatureNode::FunctionClass
FuncClass FunctionClass
Definition: MicrosoftDemangleNodes.h:337
llvm::ms_demangle::PointerTypeNode::outputPre
void outputPre(OutputBuffer &OB, OutputFlags Flags) const override
Definition: MicrosoftDemangleNodes.cpp:478
llvm::ms_demangle::DynamicStructorIdentifierNode::Name
QualifiedNameNode * Name
Definition: MicrosoftDemangleNodes.h:378
llvm::ms_demangle::FunctionRefQualifier::Reference
@ Reference
llvm::ms_demangle::IntegerLiteralNode::IsNegative
bool IsNegative
Definition: MicrosoftDemangleNodes.h:560
llvm::ms_demangle::LocalStaticGuardVariableNode::output
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition: MicrosoftDemangleNodes.cpp:640
llvm::ms_demangle::ArrayTypeNode::outputPost
void outputPost(OutputBuffer &OB, OutputFlags Flags) const override
Definition: MicrosoftDemangleNodes.cpp:573
llvm::ms_demangle::VcallThunkIdentifierNode::output
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition: MicrosoftDemangleNodes.cpp:645
llvm::ms_demangle::NodeArrayNode::Nodes
Node ** Nodes
Definition: MicrosoftDemangleNodes.h:521
llvm::ms_demangle::FC_Private
@ FC_Private
Definition: MicrosoftDemangleNodes.h:212
llvm::ms_demangle::Node
Definition: MicrosoftDemangleNodes.h:258
llvm
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
llvm::ms_demangle::PrimitiveKind::Ldouble
@ Ldouble
llvm::Operator
This is a utility class that provides an abstraction for the common functionality between Instruction...
Definition: Operator.h:32
llvm::ms_demangle::TemplateParameterReferenceNode::Symbol
SymbolNode * Symbol
Definition: MicrosoftDemangleNodes.h:544
llvm::ms_demangle::IntrinsicFunctionKind::BitwiseXor
@ BitwiseXor
llvm::ms_demangle::IntrinsicFunctionKind::BitwiseAnd
@ BitwiseAnd
llvm::ms_demangle::IntegerLiteralNode
Definition: MicrosoftDemangleNodes.h:552
llvm::ms_demangle::TemplateParameterReferenceNode::Affinity
PointerAffinity Affinity
Definition: MicrosoftDemangleNodes.h:548
llvm::ms_demangle::NodeKind::FunctionSignature
@ FunctionSignature
llvm::ms_demangle::IntrinsicFunctionKind::DefaultCtorClosure
@ DefaultCtorClosure
llvm::ms_demangle::QualifiedNameNode::Components
NodeArrayNode * Components
Definition: MicrosoftDemangleNodes.h:530
llvm::ms_demangle::OF_NoTagSpecifier
@ OF_NoTagSpecifier
Definition: MicrosoftDemangleNodes.h:78
llvm::ms_demangle::SpecialTableSymbolNode::TargetName
QualifiedNameNode * TargetName
Definition: MicrosoftDemangleNodes.h:586
llvm::ms_demangle::ThunkSignatureNode::outputPost
void outputPost(OutputBuffer &OB, OutputFlags Flags) const override
Definition: MicrosoftDemangleNodes.cpp:461
llvm::ms_demangle::IntrinsicFunctionKind::Equals
@ Equals
llvm::ms_demangle::ThunkSignatureNode::ThisAdjustor::VBPtrOffset
int32_t VBPtrOffset
Definition: MicrosoftDemangleNodes.h:450
llvm::ms_demangle::CallingConv::Pascal
@ Pascal
llvm::ms_demangle::StructorIdentifierNode::IsDestructor
bool IsDestructor
Definition: MicrosoftDemangleNodes.h:439
llvm::ms_demangle::PointerAffinity::Pointer
@ Pointer
llvm::ms_demangle::IntrinsicFunctionKind::None
@ None
llvm::ms_demangle::IntrinsicFunctionKind::LessThan
@ LessThan
llvm::ms_demangle::IntrinsicFunctionKind::GreaterThanEqual
@ GreaterThanEqual
llvm::ms_demangle::IntrinsicFunctionKind::MemberPointer
@ MemberPointer
llvm::ms_demangle::CustomTypeNode::outputPost
void outputPost(OutputBuffer &OB, OutputFlags Flags) const override
Definition: MicrosoftDemangleNodes.cpp:626
llvm::ms_demangle::CallingConv::Cdecl
@ Cdecl
llvm::ms_demangle::Q_Restrict
@ Q_Restrict
Definition: MicrosoftDemangleNodes.h:41
llvm::ms_demangle::IntrinsicFunctionKind::BitwiseAndEqual
@ BitwiseAndEqual
llvm::ms_demangle::FunctionSignatureNode
Definition: MicrosoftDemangleNodes.h:322
llvm::ms_demangle::FunctionSymbolNode::Signature
FunctionSignatureNode * Signature
Definition: MicrosoftDemangleNodes.h:623
llvm::ms_demangle::LiteralOperatorIdentifierNode::output
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition: MicrosoftDemangleNodes.cpp:379
llvm::ms_demangle::SpecialTableSymbolNode::Quals
Qualifiers Quals
Definition: MicrosoftDemangleNodes.h:587
llvm::ms_demangle::IntrinsicFunctionKind::RshEqual
@ RshEqual
llvm::ms_demangle::TagTypeNode::outputPost
void outputPost(OutputBuffer &OB, OutputFlags Flags) const override
Definition: MicrosoftDemangleNodes.cpp:546
llvm::ms_demangle::Q_Unaligned
@ Q_Unaligned
Definition: MicrosoftDemangleNodes.h:40
llvm::Type
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
Utility.h
llvm::ms_demangle::DynamicStructorIdentifierNode::Variable
VariableSymbolNode * Variable
Definition: MicrosoftDemangleNodes.h:377
llvm::ms_demangle::IntrinsicFunctionKind::ArrayNew
@ ArrayNew
llvm::ms_demangle::IntrinsicFunctionKind::Delete
@ Delete
llvm::ms_demangle::IdentifierNode::outputTemplateParameters
void outputTemplateParameters(OutputBuffer &OB, OutputFlags Flags) const
Definition: MicrosoftDemangleNodes.cpp:221
llvm::ms_demangle::CallingConv::Swift
@ Swift
llvm::ms_demangle::IntrinsicFunctionKind::EHVectorVbaseCopyCtorIter
@ EHVectorVbaseCopyCtorIter
llvm::ms_demangle::IntrinsicFunctionKind::MaxIntrinsic
@ MaxIntrinsic
llvm::ms_demangle::Q_Const
@ Q_Const
Definition: MicrosoftDemangleNodes.h:36
llvm::ms_demangle::ArrayTypeNode::Dimensions
NodeArrayNode * Dimensions
Definition: MicrosoftDemangleNodes.h:494
llvm::ms_demangle::IntrinsicFunctionKind::ManVectorVbaseCopyCtorIter
@ ManVectorVbaseCopyCtorIter
llvm::ms_demangle::Node::output
virtual void output(OutputBuffer &OB, OutputFlags Flags) const =0
llvm::dwarf::Tag
Tag
Definition: Dwarf.h:105
llvm::ms_demangle::IntrinsicFunctionKind::TimesEqual
@ TimesEqual
llvm::ms_demangle::IntrinsicFunctionKind::LshEqual
@ LshEqual
llvm::ms_demangle::IntrinsicFunctionKind::EHVectorCopyCtorIter
@ EHVectorCopyCtorIter
llvm::ms_demangle::PrimitiveTypeNode::PrimKind
PrimitiveKind PrimKind
Definition: MicrosoftDemangleNodes.h:319
llvm::ms_demangle::ConversionOperatorIdentifierNode::output
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition: MicrosoftDemangleNodes.cpp:364
llvm::ms_demangle::VariableSymbolNode::SC
StorageClass SC
Definition: MicrosoftDemangleNodes.h:614
llvm::ms_demangle::FC_Global
@ FC_Global
Definition: MicrosoftDemangleNodes.h:213
llvm::BitmaskEnumDetail::Mask
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
Definition: BitmaskEnum.h:80
llvm::ms_demangle::IntrinsicFunctionKind::LeftShift
@ LeftShift
llvm::ms_demangle::IntrinsicFunctionKind::LogicalNot
@ LogicalNot
outputQualifiers
static void outputQualifiers(OutputBuffer &OB, Qualifiers Q, bool SpaceBefore, bool SpaceAfter)
Definition: MicrosoftDemangleNodes.cpp:64
llvm::ms_demangle::FC_Static
@ FC_Static
Definition: MicrosoftDemangleNodes.h:214
llvm::ms_demangle::TypeNode::outputPost
virtual void outputPost(OutputBuffer &OB, OutputFlags Flags) const =0
llvm::ms_demangle::IntrinsicFunctionKind::VectorCopyCtorIter
@ VectorCopyCtorIter
llvm::ms_demangle::IntrinsicFunctionKind::Assign
@ Assign
llvm::ms_demangle::SymbolNode::output
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition: MicrosoftDemangleNodes.cpp:581
llvm::ms_demangle::OF_NoVariableType
@ OF_NoVariableType
Definition: MicrosoftDemangleNodes.h:82
llvm::ms_demangle::CallingConv
CallingConv
Definition: MicrosoftDemangleNodes.h:58
llvm::ms_demangle::OF_NoCallingConvention
@ OF_NoCallingConvention
Definition: MicrosoftDemangleNodes.h:77
llvm::ms_demangle::FC_NoParameterList
@ FC_NoParameterList
Definition: MicrosoftDemangleNodes.h:218
llvm::ms_demangle::IntrinsicFunctionKind::ArrayDelete
@ ArrayDelete
llvm::ms_demangle::CharKind::Wchar
@ Wchar
llvm::ms_demangle::IntrinsicFunctionKind
IntrinsicFunctionKind
Definition: MicrosoftDemangleNodes.h:117
llvm::ms_demangle::FunctionSignatureNode::CallConvention
CallingConv CallConvention
Definition: MicrosoftDemangleNodes.h:334
llvm::ms_demangle::FunctionSignatureNode::ReturnType
TypeNode * ReturnType
Definition: MicrosoftDemangleNodes.h:342
C
(vector float) vec_cmpeq(*A, *B) C
Definition: README_ALTIVEC.txt:86
llvm::ms_demangle::IntrinsicFunctionKind::BitwiseNot
@ BitwiseNot
llvm::ms_demangle::CallingConv::Fastcall
@ Fastcall
llvm::ms_demangle::StructorIdentifierNode::output
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition: MicrosoftDemangleNodes.cpp:372
outputCallingConvention
static void outputCallingConvention(OutputBuffer &OB, CallingConv CC)
Definition: MicrosoftDemangleNodes.cpp:78
llvm::ms_demangle::CallingConv::Vectorcall
@ Vectorcall
llvm::ms_demangle::PointerTypeNode::Pointee
TypeNode * Pointee
Definition: MicrosoftDemangleNodes.h:471
llvm::ms_demangle::FC_StaticThisAdjust
@ FC_StaticThisAdjust
Definition: MicrosoftDemangleNodes.h:221
llvm::ms_demangle::RttiBaseClassDescriptorNode::VBPtrOffset
int32_t VBPtrOffset
Definition: MicrosoftDemangleNodes.h:570
llvm::ms_demangle::OF_NoReturnType
@ OF_NoReturnType
Definition: MicrosoftDemangleNodes.h:81
llvm::ms_demangle::IntrinsicFunctionKind::NotEquals
@ NotEquals
llvm::ms_demangle::CharKind::Char16
@ Char16
llvm::ms_demangle::ThunkSignatureNode::ThisAdjustor::StaticOffset
uint32_t StaticOffset
Definition: MicrosoftDemangleNodes.h:449
Long
@ Long
Definition: TargetLibraryInfo.cpp:50
llvm::ms_demangle::ArrayTypeNode::outputDimensionsImpl
void outputDimensionsImpl(OutputBuffer &OB, OutputFlags Flags) const
Definition: MicrosoftDemangleNodes.cpp:561
llvm::ms_demangle::IntrinsicFunctionKind::LessThanEqual
@ LessThanEqual
llvm::ms_demangle::IntrinsicFunctionKind::Decrement
@ Decrement
llvm::ms_demangle::IntrinsicFunctionKind::PlusEqual
@ PlusEqual
llvm::ms_demangle::IntrinsicFunctionKind::EHVecDtorIter
@ EHVecDtorIter
llvm::ms_demangle::RttiBaseClassDescriptorNode::NVOffset
uint32_t NVOffset
Definition: MicrosoftDemangleNodes.h:569
llvm::ms_demangle::IntrinsicFunctionKind::CoAwait
@ CoAwait
llvm::ms_demangle::CustomTypeNode::outputPre
void outputPre(OutputBuffer &OB, OutputFlags Flags) const override
Definition: MicrosoftDemangleNodes.cpp:623
llvm::ms_demangle::CallingConv::Eabi
@ Eabi
llvm::ms_demangle::IntrinsicFunctionKind::VbaseDtor
@ VbaseDtor
Int
@ Int
Definition: TargetLibraryInfo.cpp:48
llvm::ms_demangle::LocalStaticGuardIdentifierNode::IsThread
bool IsThread
Definition: MicrosoftDemangleNodes.h:415
llvm::ms_demangle::EncodedStringLiteralNode::IsTruncated
bool IsTruncated
Definition: MicrosoftDemangleNodes.h:605
llvm::ms_demangle::IntrinsicFunctionKind::VecVbaseCtorIter
@ VecVbaseCtorIter
llvm::ms_demangle::OF_NoMemberType
@ OF_NoMemberType
Definition: MicrosoftDemangleNodes.h:80
llvm::ms_demangle::Node::kind
NodeKind kind() const
Definition: MicrosoftDemangleNodes.h:262
llvm::ms_demangle::FunctionSignatureNode::RefQualifier
FunctionRefQualifier RefQualifier
Definition: MicrosoftDemangleNodes.h:339
llvm::ms_demangle::StructorIdentifierNode::Class
IdentifierNode * Class
Definition: MicrosoftDemangleNodes.h:438
llvm::ms_demangle::TagTypeNode::outputPre
void outputPre(OutputBuffer &OB, OutputFlags Flags) const override
Definition: MicrosoftDemangleNodes.cpp:532
llvm::ms_demangle::DynamicStructorIdentifierNode::output
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition: MicrosoftDemangleNodes.cpp:230
llvm::ms_demangle::IntrinsicFunctionKind::Increment
@ Increment
llvm::ms_demangle::IntegerLiteralNode::Value
uint64_t Value
Definition: MicrosoftDemangleNodes.h:559
llvm::ms_demangle::NodeArrayNode::Count
size_t Count
Definition: MicrosoftDemangleNodes.h:522
llvm::ms_demangle::StorageClass::PrivateStatic
@ PrivateStatic
llvm::ms_demangle::ArrayTypeNode::outputOneDimension
void outputOneDimension(OutputBuffer &OB, OutputFlags Flags, Node *N) const
Definition: MicrosoftDemangleNodes.cpp:553
llvm::ms_demangle::CallingConv::Thiscall
@ Thiscall
llvm::ms_demangle::IntrinsicFunctionKind::BitwiseOrEqual
@ BitwiseOrEqual
llvm::ms_demangle::FC_Public
@ FC_Public
Definition: MicrosoftDemangleNodes.h:210
llvm::ms_demangle::Q_None
@ Q_None
Definition: MicrosoftDemangleNodes.h:35
outputSpaceIfNecessary
static void outputSpaceIfNecessary(OutputBuffer &OB)
Definition: MicrosoftDemangleNodes.cpp:27
llvm::ms_demangle::FC_VirtualThisAdjustEx
@ FC_VirtualThisAdjustEx
Definition: MicrosoftDemangleNodes.h:220
llvm::ms_demangle::DynamicStructorIdentifierNode::IsDestructor
bool IsDestructor
Definition: MicrosoftDemangleNodes.h:379
llvm::ms_demangle::IntrinsicFunctionKind::LogicalOr
@ LogicalOr
llvm::ms_demangle::CharKind::Char32
@ Char32
QualifiedName
Definition: ItaniumDemangle.h:1055
llvm::ms_demangle::NodeArrayNode::output
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition: MicrosoftDemangleNodes.cpp:156
llvm::ms_demangle::IntrinsicFunctionKind::Dereference
@ Dereference
Qualifiers
Qualifiers
Definition: ItaniumDemangle.h:394
I
#define I(x, y, z)
Definition: MD5.cpp:58
llvm::ms_demangle::IntrinsicFunctionKind::ModEqual
@ ModEqual
llvm::ms_demangle::NamedIdentifierNode::Name
StringView Name
Definition: MicrosoftDemangleNodes.h:387
llvm::ms_demangle::Q_Volatile
@ Q_Volatile
Definition: MicrosoftDemangleNodes.h:37
llvm::ms_demangle::IntrinsicFunctionKind::VecCtorIter
@ VecCtorIter
llvm::ms_demangle::LiteralOperatorIdentifierNode::Name
StringView Name
Definition: MicrosoftDemangleNodes.h:406
MicrosoftDemangleNodes.h
llvm::ms_demangle::CustomTypeNode::Identifier
IdentifierNode * Identifier
Definition: MicrosoftDemangleNodes.h:511
llvm::ms_demangle::FunctionRefQualifier::RValueReference
@ RValueReference
llvm::ms_demangle::IntrinsicFunctionKind::Parens
@ Parens
llvm::ms_demangle::IntrinsicFunctionKind::GreaterThan
@ GreaterThan
llvm::ms_demangle::Node::toString
std::string toString(OutputFlags Flags=OF_Default) const
Definition: MicrosoftDemangleNodes.cpp:120
llvm::ms_demangle::IntrinsicFunctionKind::RightShift
@ RightShift
llvm::ms_demangle::VcallThunkIdentifierNode::OffsetInVTable
uint64_t OffsetInVTable
Definition: MicrosoftDemangleNodes.h:368
llvm::ms_demangle::IntrinsicFunctionKind::VecDtorIter
@ VecDtorIter
llvm::ms_demangle::ArrayTypeNode::outputPre
void outputPre(OutputBuffer &OB, OutputFlags Flags) const override
Definition: MicrosoftDemangleNodes.cpp:548
assert
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
llvm::ms_demangle::IntrinsicFunctionKind::CopyCtorClosure
@ CopyCtorClosure
llvm::ms_demangle::TemplateParameterReferenceNode::output
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition: MicrosoftDemangleNodes.cpp:199
llvm::ms_demangle::IntrinsicFunctionIdentifierNode::output
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition: MicrosoftDemangleNodes.cpp:253
llvm::ms_demangle::FunctionSymbolNode::output
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition: MicrosoftDemangleNodes.cpp:585
llvm::ms_demangle::IdentifierNode::TemplateParams
NodeArrayNode * TemplateParams
Definition: MicrosoftDemangleNodes.h:357
llvm::ms_demangle::TemplateParameterReferenceNode::ThunkOffsets
std::array< int64_t, 3 > ThunkOffsets
Definition: MicrosoftDemangleNodes.h:547
llvm::ms_demangle::IntrinsicFunctionKind::Minus
@ Minus
llvm::X86II::OB
@ OB
Definition: X86BaseInfo.h:806
llvm::ms_demangle::IntrinsicFunctionKind::VectorVbaseCopyCtorIter
@ VectorVbaseCopyCtorIter
llvm::ms_demangle::IntrinsicFunctionKind::ManVectorCtorIter
@ ManVectorCtorIter
llvm::ms_demangle::PrimitiveKind::Schar
@ Schar
llvm::ms_demangle::CharKind::Char
@ Char
llvm::ms_demangle::ConversionOperatorIdentifierNode::TargetType
TypeNode * TargetType
Definition: MicrosoftDemangleNodes.h:426
llvm::ms_demangle::LocalStaticGuardIdentifierNode::output
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition: MicrosoftDemangleNodes.cpp:354
llvm::ms_demangle::IntrinsicFunctionKind::VdispMap
@ VdispMap
outputQualifierIfPresent
static bool outputQualifierIfPresent(OutputBuffer &OB, Qualifiers Q, Qualifiers Mask, bool NeedSpace)
Definition: MicrosoftDemangleNodes.cpp:52
llvm::ms_demangle::IntrinsicFunctionKind::DivEqual
@ DivEqual
llvm::ms_demangle::PrimitiveKind::Ushort
@ Ushort
llvm::ms_demangle::FC_VirtualThisAdjust
@ FC_VirtualThisAdjust
Definition: MicrosoftDemangleNodes.h:219
llvm::ms_demangle::NodeKind::IntegerLiteral
@ IntegerLiteral
llvm::ms_demangle::IntrinsicFunctionKind::New
@ New
llvm::ms_demangle::FunctionSignatureNode::outputPre
void outputPre(OutputBuffer &OB, OutputFlags Flags) const override
Definition: MicrosoftDemangleNodes.cpp:385
llvm::ms_demangle::IntrinsicFunctionKind::ManVectorDtorIter
@ ManVectorDtorIter
CC
auto CC
Definition: RISCVRedundantCopyElimination.cpp:79
llvm::ms_demangle::ThunkSignatureNode::ThisAdjust
ThisAdjustor ThisAdjust
Definition: MicrosoftDemangleNodes.h:455
llvm::ms_demangle::SpecialTableSymbolNode::output
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition: MicrosoftDemangleNodes.cpp:650
llvm::ms_demangle::NamedIdentifierNode::output
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition: MicrosoftDemangleNodes.cpp:248
llvm::ms_demangle::TypeNode::output
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition: MicrosoftDemangleNodes.h:304
llvm::ms_demangle::IntrinsicFunctionKind::BitwiseXorEqual
@ BitwiseXorEqual
llvm::ms_demangle::RttiBaseClassDescriptorNode::VBTableOffset
uint32_t VBTableOffset
Definition: MicrosoftDemangleNodes.h:571
llvm::ms_demangle::PrimitiveKind
PrimitiveKind
Definition: MicrosoftDemangleNodes.h:86
llvm::ms_demangle::PrimitiveTypeNode::outputPre
void outputPre(OutputBuffer &OB, OutputFlags Flags) const override
Definition: MicrosoftDemangleNodes.cpp:129
llvm::ms_demangle::PrimitiveKind::Uint64
@ Uint64
llvm::ms_demangle::EncodedStringLiteralNode::output
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition: MicrosoftDemangleNodes.cpp:172
llvm::ms_demangle::IntrinsicFunctionKind::Plus
@ Plus
llvm::ms_demangle::IntrinsicFunctionKind::LocalVftableCtorClosure
@ LocalVftableCtorClosure
llvm::ms_demangle::IntrinsicFunctionKind::Modulus
@ Modulus
llvm::ms_demangle::OF_NoAccessSpecifier
@ OF_NoAccessSpecifier
Definition: MicrosoftDemangleNodes.h:79
llvm::ms_demangle::IntrinsicFunctionKind::ScalarDelDtor
@ ScalarDelDtor
llvm::ms_demangle::TypeNode::outputPre
virtual void outputPre(OutputBuffer &OB, OutputFlags Flags) const =0
llvm::ms_demangle::FunctionSignatureNode::Params
NodeArrayNode * Params
Definition: MicrosoftDemangleNodes.h:348
llvm::ms_demangle::TypeNode::Quals
Qualifiers Quals
Definition: MicrosoftDemangleNodes.h:309
llvm::ms_demangle::ArrayTypeNode::ElementType
TypeNode * ElementType
Definition: MicrosoftDemangleNodes.h:497
llvm::ms_demangle::PrimitiveKind::Uchar
@ Uchar
llvm::ms_demangle::ThunkSignatureNode::ThisAdjustor::VBOffsetOffset
int32_t VBOffsetOffset
Definition: MicrosoftDemangleNodes.h:451
llvm::ms_demangle::PrimitiveKind::Short
@ Short
llvm::ms_demangle::ThunkSignatureNode::ThisAdjustor::VtordispOffset
int32_t VtordispOffset
Definition: MicrosoftDemangleNodes.h:452
llvm::ms_demangle::IntrinsicFunctionKind::MinusEqual
@ MinusEqual
llvm::ms_demangle::FunctionSignatureNode::outputPost
void outputPost(OutputBuffer &OB, OutputFlags Flags) const override
Definition: MicrosoftDemangleNodes.cpp:417
llvm::ms_demangle::IntrinsicFunctionKind::Spaceship
@ Spaceship
llvm::ms_demangle::FunctionSignatureNode::IsVariadic
bool IsVariadic
Definition: MicrosoftDemangleNodes.h:345
llvm::ms_demangle::CallingConv::Clrcall
@ Clrcall
llvm::ms_demangle::IntrinsicFunctionKind::EHVecVbaseCtorIter
@ EHVecVbaseCtorIter
llvm::ms_demangle::CallingConv::Stdcall
@ Stdcall
llvm::ms_demangle::PointerTypeNode::ClassParent
QualifiedNameNode * ClassParent
Definition: MicrosoftDemangleNodes.h:467
OUTPUT_ENUM_CLASS_VALUE
#define OUTPUT_ENUM_CLASS_VALUE(Enum, Value, Desc)
Definition: MicrosoftDemangleNodes.cpp:21
llvm::ms_demangle::IntrinsicFunctionKind::Divide
@ Divide
llvm::ms_demangle::PointerTypeNode::outputPost
void outputPost(OutputBuffer &OB, OutputFlags Flags) const override
Definition: MicrosoftDemangleNodes.cpp:524
llvm::ms_demangle::QualifiedNameNode::output
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition: MicrosoftDemangleNodes.cpp:628
llvm::ms_demangle::FC_Protected
@ FC_Protected
Definition: MicrosoftDemangleNodes.h:211
llvm::ms_demangle::PointerAffinity::Reference
@ Reference
llvm::ms_demangle::StorageClass::ProtectedStatic
@ ProtectedStatic
llvm::ms_demangle::IntrinsicFunctionKind::VecDelDtor
@ VecDelDtor
llvm::ms_demangle::EncodedStringLiteralNode::DecodedString
StringView DecodedString
Definition: MicrosoftDemangleNodes.h:604
llvm::ms_demangle::RttiBaseClassDescriptorNode::output
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition: MicrosoftDemangleNodes.cpp:632
llvm::ms_demangle::FC_Virtual
@ FC_Virtual
Definition: MicrosoftDemangleNodes.h:215
llvm::ms_demangle::TemplateParameterReferenceNode::ThunkOffsetCount
int ThunkOffsetCount
Definition: MicrosoftDemangleNodes.h:546
N
#define N
llvm::ms_demangle::FC_ExternC
@ FC_ExternC
Definition: MicrosoftDemangleNodes.h:217
llvm::ms_demangle::PrimitiveKind::Uint
@ Uint
llvm::ms_demangle::SymbolNode::Name
QualifiedNameNode * Name
Definition: MicrosoftDemangleNodes.h:578
Struct
@ Struct
Definition: TargetLibraryInfo.cpp:61
llvm::ms_demangle::IntrinsicFunctionKind::ArraySubscript
@ ArraySubscript
llvm::ms_demangle::IntrinsicFunctionKind::EHVecCtorIter
@ EHVecCtorIter
llvm::ms_demangle::CallingConv::Regcall
@ Regcall
llvm::ms_demangle::CallingConv::SwiftAsync
@ SwiftAsync
llvm::ms_demangle::PointerTypeNode::Affinity
PointerAffinity Affinity
Definition: MicrosoftDemangleNodes.h:464
llvm::ms_demangle::RttiBaseClassDescriptorNode::Flags
uint32_t Flags
Definition: MicrosoftDemangleNodes.h:572
llvm::ms_demangle::FunctionSignatureNode::IsNoexcept
bool IsNoexcept
Definition: MicrosoftDemangleNodes.h:351
llvm::ms_demangle::OutputFlags
OutputFlags
Definition: MicrosoftDemangleNodes.h:75
llvm::ms_demangle::EncodedStringLiteralNode::Char
CharKind Char
Definition: MicrosoftDemangleNodes.h:606
llvm::ms_demangle::PrimitiveKind::Wchar
@ Wchar
llvm::ms_demangle::StorageClass::PublicStatic
@ PublicStatic
outputSingleQualifier
static void outputSingleQualifier(OutputBuffer &OB, Qualifiers Q)
Definition: MicrosoftDemangleNodes.cpp:36
llvm::ms_demangle::IntrinsicFunctionKind::BitwiseOr
@ BitwiseOr
llvm::ms_demangle::PrimitiveKind::Ulong
@ Ulong
llvm::ms_demangle::IntegerLiteralNode::output
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition: MicrosoftDemangleNodes.cpp:193
llvm::ms_demangle::TagKind
TagKind
Definition: MicrosoftDemangleNodes.h:224
llvm::ms_demangle::PrimitiveKind::Nullptr
@ Nullptr
Void
@ Void
Definition: TargetLibraryInfo.cpp:44
llvm::ms_demangle::LocalStaticGuardIdentifierNode::ScopeIndex
uint32_t ScopeIndex
Definition: MicrosoftDemangleNodes.h:416
llvm::ms_demangle::NodeKind::ArrayType
@ ArrayType
llvm::ms_demangle::PointerAffinity::RValueReference
@ RValueReference
llvm::ms_demangle::VariableSymbolNode::output
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition: MicrosoftDemangleNodes.cpp:592
llvm::ms_demangle::IntrinsicFunctionKind::LogicalAnd
@ LogicalAnd
llvm::ms_demangle::ThunkSignatureNode::outputPre
void outputPre(OutputBuffer &OB, OutputFlags Flags) const override
Definition: MicrosoftDemangleNodes.cpp:455