Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 1
//===- MicrosoftDemangleNodes.h ---------------------------------*- C++ -*-===//
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 the AST nodes used in the MSVC demangler.
10
//
11
//===----------------------------------------------------------------------===//
12
 
13
#ifndef LLVM_DEMANGLE_MICROSOFTDEMANGLENODES_H
14
#define LLVM_DEMANGLE_MICROSOFTDEMANGLENODES_H
15
 
16
#include "llvm/Demangle/StringView.h"
17
#include <array>
18
#include <cstdint>
19
#include <string>
20
 
21
namespace llvm {
22
namespace itanium_demangle {
23
class OutputBuffer;
24
}
25
}
26
 
27
using llvm::itanium_demangle::OutputBuffer;
28
using llvm::itanium_demangle::StringView;
29
 
30
namespace llvm {
31
namespace ms_demangle {
32
 
33
// Storage classes
34
enum Qualifiers : uint8_t {
35
  Q_None = 0,
36
  Q_Const = 1 << 0,
37
  Q_Volatile = 1 << 1,
38
  Q_Far = 1 << 2,
39
  Q_Huge = 1 << 3,
40
  Q_Unaligned = 1 << 4,
41
  Q_Restrict = 1 << 5,
42
  Q_Pointer64 = 1 << 6
43
};
44
 
45
enum class StorageClass : uint8_t {
46
  None,
47
  PrivateStatic,
48
  ProtectedStatic,
49
  PublicStatic,
50
  Global,
51
  FunctionLocalStatic,
52
};
53
 
54
enum class PointerAffinity { None, Pointer, Reference, RValueReference };
55
enum class FunctionRefQualifier { None, Reference, RValueReference };
56
 
57
// Calling conventions
58
enum class CallingConv : uint8_t {
59
  None,
60
  Cdecl,
61
  Pascal,
62
  Thiscall,
63
  Stdcall,
64
  Fastcall,
65
  Clrcall,
66
  Eabi,
67
  Vectorcall,
68
  Regcall,
69
  Swift,      // Clang-only
70
  SwiftAsync, // Clang-only
71
};
72
 
73
enum class ReferenceKind : uint8_t { None, LValueRef, RValueRef };
74
 
75
enum OutputFlags {
76
  OF_Default = 0,
77
  OF_NoCallingConvention = 1,
78
  OF_NoTagSpecifier = 2,
79
  OF_NoAccessSpecifier = 4,
80
  OF_NoMemberType = 8,
81
  OF_NoReturnType = 16,
82
  OF_NoVariableType = 32,
83
};
84
 
85
// Types
86
enum class PrimitiveKind {
87
  Void,
88
  Bool,
89
  Char,
90
  Schar,
91
  Uchar,
92
  Char8,
93
  Char16,
94
  Char32,
95
  Short,
96
  Ushort,
97
  Int,
98
  Uint,
99
  Long,
100
  Ulong,
101
  Int64,
102
  Uint64,
103
  Wchar,
104
  Float,
105
  Double,
106
  Ldouble,
107
  Nullptr,
108
};
109
 
110
enum class CharKind {
111
  Char,
112
  Char16,
113
  Char32,
114
  Wchar,
115
};
116
 
117
enum class IntrinsicFunctionKind : uint8_t {
118
  None,
119
  New,                        // ?2 # operator new
120
  Delete,                     // ?3 # operator delete
121
  Assign,                     // ?4 # operator=
122
  RightShift,                 // ?5 # operator>>
123
  LeftShift,                  // ?6 # operator<<
124
  LogicalNot,                 // ?7 # operator!
125
  Equals,                     // ?8 # operator==
126
  NotEquals,                  // ?9 # operator!=
127
  ArraySubscript,             // ?A # operator[]
128
  Pointer,                    // ?C # operator->
129
  Dereference,                // ?D # operator*
130
  Increment,                  // ?E # operator++
131
  Decrement,                  // ?F # operator--
132
  Minus,                      // ?G # operator-
133
  Plus,                       // ?H # operator+
134
  BitwiseAnd,                 // ?I # operator&
135
  MemberPointer,              // ?J # operator->*
136
  Divide,                     // ?K # operator/
137
  Modulus,                    // ?L # operator%
138
  LessThan,                   // ?M operator<
139
  LessThanEqual,              // ?N operator<=
140
  GreaterThan,                // ?O operator>
141
  GreaterThanEqual,           // ?P operator>=
142
  Comma,                      // ?Q operator,
143
  Parens,                     // ?R operator()
144
  BitwiseNot,                 // ?S operator~
145
  BitwiseXor,                 // ?T operator^
146
  BitwiseOr,                  // ?U operator|
147
  LogicalAnd,                 // ?V operator&&
148
  LogicalOr,                  // ?W operator||
149
  TimesEqual,                 // ?X operator*=
150
  PlusEqual,                  // ?Y operator+=
151
  MinusEqual,                 // ?Z operator-=
152
  DivEqual,                   // ?_0 operator/=
153
  ModEqual,                   // ?_1 operator%=
154
  RshEqual,                   // ?_2 operator>>=
155
  LshEqual,                   // ?_3 operator<<=
156
  BitwiseAndEqual,            // ?_4 operator&=
157
  BitwiseOrEqual,             // ?_5 operator|=
158
  BitwiseXorEqual,            // ?_6 operator^=
159
  VbaseDtor,                  // ?_D # vbase destructor
160
  VecDelDtor,                 // ?_E # vector deleting destructor
161
  DefaultCtorClosure,         // ?_F # default constructor closure
162
  ScalarDelDtor,              // ?_G # scalar deleting destructor
163
  VecCtorIter,                // ?_H # vector constructor iterator
164
  VecDtorIter,                // ?_I # vector destructor iterator
165
  VecVbaseCtorIter,           // ?_J # vector vbase constructor iterator
166
  VdispMap,                   // ?_K # virtual displacement map
167
  EHVecCtorIter,              // ?_L # eh vector constructor iterator
168
  EHVecDtorIter,              // ?_M # eh vector destructor iterator
169
  EHVecVbaseCtorIter,         // ?_N # eh vector vbase constructor iterator
170
  CopyCtorClosure,            // ?_O # copy constructor closure
171
  LocalVftableCtorClosure,    // ?_T # local vftable constructor closure
172
  ArrayNew,                   // ?_U operator new[]
173
  ArrayDelete,                // ?_V operator delete[]
174
  ManVectorCtorIter,          // ?__A managed vector ctor iterator
175
  ManVectorDtorIter,          // ?__B managed vector dtor iterator
176
  EHVectorCopyCtorIter,       // ?__C EH vector copy ctor iterator
177
  EHVectorVbaseCopyCtorIter,  // ?__D EH vector vbase copy ctor iterator
178
  VectorCopyCtorIter,         // ?__G vector copy constructor iterator
179
  VectorVbaseCopyCtorIter,    // ?__H vector vbase copy constructor iterator
180
  ManVectorVbaseCopyCtorIter, // ?__I managed vector vbase copy constructor
181
  CoAwait,                    // ?__L operator co_await
182
  Spaceship,                  // ?__M operator<=>
183
  MaxIntrinsic
184
};
185
 
186
enum class SpecialIntrinsicKind {
187
  None,
188
  Vftable,
189
  Vbtable,
190
  Typeof,
191
  VcallThunk,
192
  LocalStaticGuard,
193
  StringLiteralSymbol,
194
  UdtReturning,
195
  Unknown,
196
  DynamicInitializer,
197
  DynamicAtexitDestructor,
198
  RttiTypeDescriptor,
199
  RttiBaseClassDescriptor,
200
  RttiBaseClassArray,
201
  RttiClassHierarchyDescriptor,
202
  RttiCompleteObjLocator,
203
  LocalVftable,
204
  LocalStaticThreadGuard,
205
};
206
 
207
// Function classes
208
enum FuncClass : uint16_t {
209
  FC_None = 0,
210
  FC_Public = 1 << 0,
211
  FC_Protected = 1 << 1,
212
  FC_Private = 1 << 2,
213
  FC_Global = 1 << 3,
214
  FC_Static = 1 << 4,
215
  FC_Virtual = 1 << 5,
216
  FC_Far = 1 << 6,
217
  FC_ExternC = 1 << 7,
218
  FC_NoParameterList = 1 << 8,
219
  FC_VirtualThisAdjust = 1 << 9,
220
  FC_VirtualThisAdjustEx = 1 << 10,
221
  FC_StaticThisAdjust = 1 << 11,
222
};
223
 
224
enum class TagKind { Class, Struct, Union, Enum };
225
 
226
enum class NodeKind {
227
  Unknown,
228
  Md5Symbol,
229
  PrimitiveType,
230
  FunctionSignature,
231
  Identifier,
232
  NamedIdentifier,
233
  VcallThunkIdentifier,
234
  LocalStaticGuardIdentifier,
235
  IntrinsicFunctionIdentifier,
236
  ConversionOperatorIdentifier,
237
  DynamicStructorIdentifier,
238
  StructorIdentifier,
239
  LiteralOperatorIdentifier,
240
  ThunkSignature,
241
  PointerType,
242
  TagType,
243
  ArrayType,
244
  Custom,
245
  IntrinsicType,
246
  NodeArray,
247
  QualifiedName,
248
  TemplateParameterReference,
249
  EncodedStringLiteral,
250
  IntegerLiteral,
251
  RttiBaseClassDescriptor,
252
  LocalStaticGuardVariable,
253
  FunctionSymbol,
254
  VariableSymbol,
255
  SpecialTableSymbol
256
};
257
 
258
struct Node {
259
  explicit Node(NodeKind K) : Kind(K) {}
260
  virtual ~Node() = default;
261
 
262
  NodeKind kind() const { return Kind; }
263
 
264
  virtual void output(OutputBuffer &OB, OutputFlags Flags) const = 0;
265
 
266
  std::string toString(OutputFlags Flags = OF_Default) const;
267
 
268
private:
269
  NodeKind Kind;
270
};
271
 
272
struct TypeNode;
273
struct PrimitiveTypeNode;
274
struct FunctionSignatureNode;
275
struct IdentifierNode;
276
struct NamedIdentifierNode;
277
struct VcallThunkIdentifierNode;
278
struct IntrinsicFunctionIdentifierNode;
279
struct LiteralOperatorIdentifierNode;
280
struct ConversionOperatorIdentifierNode;
281
struct StructorIdentifierNode;
282
struct ThunkSignatureNode;
283
struct PointerTypeNode;
284
struct ArrayTypeNode;
285
struct TagTypeNode;
286
struct NodeArrayNode;
287
struct QualifiedNameNode;
288
struct TemplateParameterReferenceNode;
289
struct EncodedStringLiteralNode;
290
struct IntegerLiteralNode;
291
struct RttiBaseClassDescriptorNode;
292
struct LocalStaticGuardVariableNode;
293
struct SymbolNode;
294
struct FunctionSymbolNode;
295
struct VariableSymbolNode;
296
struct SpecialTableSymbolNode;
297
 
298
struct TypeNode : public Node {
299
  explicit TypeNode(NodeKind K) : Node(K) {}
300
 
301
  virtual void outputPre(OutputBuffer &OB, OutputFlags Flags) const = 0;
302
  virtual void outputPost(OutputBuffer &OB, OutputFlags Flags) const = 0;
303
 
304
  void output(OutputBuffer &OB, OutputFlags Flags) const override {
305
    outputPre(OB, Flags);
306
    outputPost(OB, Flags);
307
  }
308
 
309
  Qualifiers Quals = Q_None;
310
};
311
 
312
struct PrimitiveTypeNode : public TypeNode {
313
  explicit PrimitiveTypeNode(PrimitiveKind K)
314
      : TypeNode(NodeKind::PrimitiveType), PrimKind(K) {}
315
 
316
  void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
317
  void outputPost(OutputBuffer &OB, OutputFlags Flags) const override {}
318
 
319
  PrimitiveKind PrimKind;
320
};
321
 
322
struct FunctionSignatureNode : public TypeNode {
323
  explicit FunctionSignatureNode(NodeKind K) : TypeNode(K) {}
324
  FunctionSignatureNode() : TypeNode(NodeKind::FunctionSignature) {}
325
 
326
  void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
327
  void outputPost(OutputBuffer &OB, OutputFlags Flags) const override;
328
 
329
  // Valid if this FunctionTypeNode is the Pointee of a PointerType or
330
  // MemberPointerType.
331
  PointerAffinity Affinity = PointerAffinity::None;
332
 
333
  // The function's calling convention.
334
  CallingConv CallConvention = CallingConv::None;
335
 
336
  // Function flags (gloabl, public, etc)
337
  FuncClass FunctionClass = FC_Global;
338
 
339
  FunctionRefQualifier RefQualifier = FunctionRefQualifier::None;
340
 
341
  // The return type of the function.
342
  TypeNode *ReturnType = nullptr;
343
 
344
  // True if this is a C-style ... varargs function.
345
  bool IsVariadic = false;
346
 
347
  // Function parameters
348
  NodeArrayNode *Params = nullptr;
349
 
350
  // True if the function type is noexcept.
351
  bool IsNoexcept = false;
352
};
353
 
354
struct IdentifierNode : public Node {
355
  explicit IdentifierNode(NodeKind K) : Node(K) {}
356
 
357
  NodeArrayNode *TemplateParams = nullptr;
358
 
359
protected:
360
  void outputTemplateParameters(OutputBuffer &OB, OutputFlags Flags) const;
361
};
362
 
363
struct VcallThunkIdentifierNode : public IdentifierNode {
364
  VcallThunkIdentifierNode() : IdentifierNode(NodeKind::VcallThunkIdentifier) {}
365
 
366
  void output(OutputBuffer &OB, OutputFlags Flags) const override;
367
 
368
  uint64_t OffsetInVTable = 0;
369
};
370
 
371
struct DynamicStructorIdentifierNode : public IdentifierNode {
372
  DynamicStructorIdentifierNode()
373
      : IdentifierNode(NodeKind::DynamicStructorIdentifier) {}
374
 
375
  void output(OutputBuffer &OB, OutputFlags Flags) const override;
376
 
377
  VariableSymbolNode *Variable = nullptr;
378
  QualifiedNameNode *Name = nullptr;
379
  bool IsDestructor = false;
380
};
381
 
382
struct NamedIdentifierNode : public IdentifierNode {
383
  NamedIdentifierNode() : IdentifierNode(NodeKind::NamedIdentifier) {}
384
 
385
  void output(OutputBuffer &OB, OutputFlags Flags) const override;
386
 
387
  StringView Name;
388
};
389
 
390
struct IntrinsicFunctionIdentifierNode : public IdentifierNode {
391
  explicit IntrinsicFunctionIdentifierNode(IntrinsicFunctionKind Operator)
392
      : IdentifierNode(NodeKind::IntrinsicFunctionIdentifier),
393
        Operator(Operator) {}
394
 
395
  void output(OutputBuffer &OB, OutputFlags Flags) const override;
396
 
397
  IntrinsicFunctionKind Operator;
398
};
399
 
400
struct LiteralOperatorIdentifierNode : public IdentifierNode {
401
  LiteralOperatorIdentifierNode()
402
      : IdentifierNode(NodeKind::LiteralOperatorIdentifier) {}
403
 
404
  void output(OutputBuffer &OB, OutputFlags Flags) const override;
405
 
406
  StringView Name;
407
};
408
 
409
struct LocalStaticGuardIdentifierNode : public IdentifierNode {
410
  LocalStaticGuardIdentifierNode()
411
      : IdentifierNode(NodeKind::LocalStaticGuardIdentifier) {}
412
 
413
  void output(OutputBuffer &OB, OutputFlags Flags) const override;
414
 
415
  bool IsThread = false;
416
  uint32_t ScopeIndex = 0;
417
};
418
 
419
struct ConversionOperatorIdentifierNode : public IdentifierNode {
420
  ConversionOperatorIdentifierNode()
421
      : IdentifierNode(NodeKind::ConversionOperatorIdentifier) {}
422
 
423
  void output(OutputBuffer &OB, OutputFlags Flags) const override;
424
 
425
  // The type that this operator converts too.
426
  TypeNode *TargetType = nullptr;
427
};
428
 
429
struct StructorIdentifierNode : public IdentifierNode {
430
  StructorIdentifierNode() : IdentifierNode(NodeKind::StructorIdentifier) {}
431
  explicit StructorIdentifierNode(bool IsDestructor)
432
      : IdentifierNode(NodeKind::StructorIdentifier),
433
        IsDestructor(IsDestructor) {}
434
 
435
  void output(OutputBuffer &OB, OutputFlags Flags) const override;
436
 
437
  // The name of the class that this is a structor of.
438
  IdentifierNode *Class = nullptr;
439
  bool IsDestructor = false;
440
};
441
 
442
struct ThunkSignatureNode : public FunctionSignatureNode {
443
  ThunkSignatureNode() : FunctionSignatureNode(NodeKind::ThunkSignature) {}
444
 
445
  void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
446
  void outputPost(OutputBuffer &OB, OutputFlags Flags) const override;
447
 
448
  struct ThisAdjustor {
449
    uint32_t StaticOffset = 0;
450
    int32_t VBPtrOffset = 0;
451
    int32_t VBOffsetOffset = 0;
452
    int32_t VtordispOffset = 0;
453
  };
454
 
455
  ThisAdjustor ThisAdjust;
456
};
457
 
458
struct PointerTypeNode : public TypeNode {
459
  PointerTypeNode() : TypeNode(NodeKind::PointerType) {}
460
  void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
461
  void outputPost(OutputBuffer &OB, OutputFlags Flags) const override;
462
 
463
  // Is this a pointer, reference, or rvalue-reference?
464
  PointerAffinity Affinity = PointerAffinity::None;
465
 
466
  // If this is a member pointer, this is the class that the member is in.
467
  QualifiedNameNode *ClassParent = nullptr;
468
 
469
  // Represents a type X in "a pointer to X", "a reference to X", or
470
  // "rvalue-reference to X"
471
  TypeNode *Pointee = nullptr;
472
};
473
 
474
struct TagTypeNode : public TypeNode {
475
  explicit TagTypeNode(TagKind Tag) : TypeNode(NodeKind::TagType), Tag(Tag) {}
476
 
477
  void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
478
  void outputPost(OutputBuffer &OB, OutputFlags Flags) const override;
479
 
480
  QualifiedNameNode *QualifiedName = nullptr;
481
  TagKind Tag;
482
};
483
 
484
struct ArrayTypeNode : public TypeNode {
485
  ArrayTypeNode() : TypeNode(NodeKind::ArrayType) {}
486
 
487
  void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
488
  void outputPost(OutputBuffer &OB, OutputFlags Flags) const override;
489
 
490
  void outputDimensionsImpl(OutputBuffer &OB, OutputFlags Flags) const;
491
  void outputOneDimension(OutputBuffer &OB, OutputFlags Flags, Node *N) const;
492
 
493
  // A list of array dimensions.  e.g. [3,4,5] in `int Foo[3][4][5]`
494
  NodeArrayNode *Dimensions = nullptr;
495
 
496
  // The type of array element.
497
  TypeNode *ElementType = nullptr;
498
};
499
 
500
struct IntrinsicNode : public TypeNode {
501
  IntrinsicNode() : TypeNode(NodeKind::IntrinsicType) {}
502
  void output(OutputBuffer &OB, OutputFlags Flags) const override {}
503
};
504
 
505
struct CustomTypeNode : public TypeNode {
506
  CustomTypeNode() : TypeNode(NodeKind::Custom) {}
507
 
508
  void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
509
  void outputPost(OutputBuffer &OB, OutputFlags Flags) const override;
510
 
511
  IdentifierNode *Identifier = nullptr;
512
};
513
 
514
struct NodeArrayNode : public Node {
515
  NodeArrayNode() : Node(NodeKind::NodeArray) {}
516
 
517
  void output(OutputBuffer &OB, OutputFlags Flags) const override;
518
 
519
  void output(OutputBuffer &OB, OutputFlags Flags, StringView Separator) const;
520
 
521
  Node **Nodes = nullptr;
522
  size_t Count = 0;
523
};
524
 
525
struct QualifiedNameNode : public Node {
526
  QualifiedNameNode() : Node(NodeKind::QualifiedName) {}
527
 
528
  void output(OutputBuffer &OB, OutputFlags Flags) const override;
529
 
530
  NodeArrayNode *Components = nullptr;
531
 
532
  IdentifierNode *getUnqualifiedIdentifier() {
533
    Node *LastComponent = Components->Nodes[Components->Count - 1];
534
    return static_cast<IdentifierNode *>(LastComponent);
535
  }
536
};
537
 
538
struct TemplateParameterReferenceNode : public Node {
539
  TemplateParameterReferenceNode()
540
      : Node(NodeKind::TemplateParameterReference) {}
541
 
542
  void output(OutputBuffer &OB, OutputFlags Flags) const override;
543
 
544
  SymbolNode *Symbol = nullptr;
545
 
546
  int ThunkOffsetCount = 0;
547
  std::array<int64_t, 3> ThunkOffsets;
548
  PointerAffinity Affinity = PointerAffinity::None;
549
  bool IsMemberPointer = false;
550
};
551
 
552
struct IntegerLiteralNode : public Node {
553
  IntegerLiteralNode() : Node(NodeKind::IntegerLiteral) {}
554
  IntegerLiteralNode(uint64_t Value, bool IsNegative)
555
      : Node(NodeKind::IntegerLiteral), Value(Value), IsNegative(IsNegative) {}
556
 
557
  void output(OutputBuffer &OB, OutputFlags Flags) const override;
558
 
559
  uint64_t Value = 0;
560
  bool IsNegative = false;
561
};
562
 
563
struct RttiBaseClassDescriptorNode : public IdentifierNode {
564
  RttiBaseClassDescriptorNode()
565
      : IdentifierNode(NodeKind::RttiBaseClassDescriptor) {}
566
 
567
  void output(OutputBuffer &OB, OutputFlags Flags) const override;
568
 
569
  uint32_t NVOffset = 0;
570
  int32_t VBPtrOffset = 0;
571
  uint32_t VBTableOffset = 0;
572
  uint32_t Flags = 0;
573
};
574
 
575
struct SymbolNode : public Node {
576
  explicit SymbolNode(NodeKind K) : Node(K) {}
577
  void output(OutputBuffer &OB, OutputFlags Flags) const override;
578
  QualifiedNameNode *Name = nullptr;
579
};
580
 
581
struct SpecialTableSymbolNode : public SymbolNode {
582
  explicit SpecialTableSymbolNode()
583
      : SymbolNode(NodeKind::SpecialTableSymbol) {}
584
 
585
  void output(OutputBuffer &OB, OutputFlags Flags) const override;
586
  QualifiedNameNode *TargetName = nullptr;
587
  Qualifiers Quals = Qualifiers::Q_None;
588
};
589
 
590
struct LocalStaticGuardVariableNode : public SymbolNode {
591
  LocalStaticGuardVariableNode()
592
      : SymbolNode(NodeKind::LocalStaticGuardVariable) {}
593
 
594
  void output(OutputBuffer &OB, OutputFlags Flags) const override;
595
 
596
  bool IsVisible = false;
597
};
598
 
599
struct EncodedStringLiteralNode : public SymbolNode {
600
  EncodedStringLiteralNode() : SymbolNode(NodeKind::EncodedStringLiteral) {}
601
 
602
  void output(OutputBuffer &OB, OutputFlags Flags) const override;
603
 
604
  StringView DecodedString;
605
  bool IsTruncated = false;
606
  CharKind Char = CharKind::Char;
607
};
608
 
609
struct VariableSymbolNode : public SymbolNode {
610
  VariableSymbolNode() : SymbolNode(NodeKind::VariableSymbol) {}
611
 
612
  void output(OutputBuffer &OB, OutputFlags Flags) const override;
613
 
614
  StorageClass SC = StorageClass::None;
615
  TypeNode *Type = nullptr;
616
};
617
 
618
struct FunctionSymbolNode : public SymbolNode {
619
  FunctionSymbolNode() : SymbolNode(NodeKind::FunctionSymbol) {}
620
 
621
  void output(OutputBuffer &OB, OutputFlags Flags) const override;
622
 
623
  FunctionSignatureNode *Signature = nullptr;
624
};
625
 
626
} // namespace ms_demangle
627
} // namespace llvm
628
 
629
#endif