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