Clang Project

clang_source_code/include/clang/AST/Mangle.h
1//===--- Mangle.h - Mangle C++ Names ----------------------------*- 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// Defines the C++ name mangling interface.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_CLANG_AST_MANGLE_H
14#define LLVM_CLANG_AST_MANGLE_H
15
16#include "clang/AST/Decl.h"
17#include "clang/AST/Type.h"
18#include "clang/Basic/ABI.h"
19#include "llvm/ADT/DenseMap.h"
20#include "llvm/Support/Casting.h"
21
22namespace llvm {
23  class raw_ostream;
24}
25
26namespace clang {
27  class ASTContext;
28  class BlockDecl;
29  class CXXConstructorDecl;
30  class CXXDestructorDecl;
31  class CXXMethodDecl;
32  class FunctionDecl;
33  struct MethodVFTableLocation;
34  class NamedDecl;
35  class ObjCMethodDecl;
36  class StringLiteral;
37  struct ThisAdjustment;
38  struct ThunkInfo;
39  class VarDecl;
40
41/// MangleContext - Context for tracking state which persists across multiple
42/// calls to the C++ name mangler.
43class MangleContext {
44public:
45  enum ManglerKind {
46    MK_Itanium,
47    MK_Microsoft
48  };
49
50private:
51  virtual void anchor();
52
53  ASTContext &Context;
54  DiagnosticsEngine &Diags;
55  const ManglerKind Kind;
56
57  llvm::DenseMap<const BlockDecl*, unsignedGlobalBlockIds;
58  llvm::DenseMap<const BlockDecl*, unsignedLocalBlockIds;
59  llvm::DenseMap<const TagDecl*, uint64_t> AnonStructIds;
60
61public:
62  ManglerKind getKind() const { return Kind; }
63
64  explicit MangleContext(ASTContext &Context,
65                         DiagnosticsEngine &Diags,
66                         ManglerKind Kind)
67      : Context(Context), Diags(Diags), Kind(Kind) {}
68
69  virtual ~MangleContext() { }
70
71  ASTContext &getASTContext() const { return Context; }
72
73  DiagnosticsEngine &getDiags() const { return Diags; }
74
75  virtual void startNewFunction() { LocalBlockIds.clear(); }
76
77  unsigned getBlockId(const BlockDecl *BDbool Local) {
78    llvm::DenseMap<const BlockDecl *, unsigned> &BlockIds
79      = Local? LocalBlockIds : GlobalBlockIds;
80    std::pair<llvm::DenseMap<const BlockDecl *, unsigned>::iterator, bool>
81      Result = BlockIds.insert(std::make_pair(BD, BlockIds.size()));
82    return Result.first->second;
83  }
84
85  uint64_t getAnonymousStructId(const TagDecl *TD) {
86    std::pair<llvm::DenseMap<const TagDecl *, uint64_t>::iterator, bool>
87        Result = AnonStructIds.insert(std::make_pair(TD, AnonStructIds.size()));
88    return Result.first->second;
89  }
90
91  /// @name Mangler Entry Points
92  /// @{
93
94  bool shouldMangleDeclName(const NamedDecl *D);
95  virtual bool shouldMangleCXXName(const NamedDecl *D) = 0;
96  virtual bool shouldMangleStringLiteral(const StringLiteral *SL) = 0;
97
98  // FIXME: consider replacing raw_ostream & with something like SmallString &.
99  void mangleName(const NamedDecl *Draw_ostream &);
100  virtual void mangleCXXName(const NamedDecl *Draw_ostream &) = 0;
101  virtual void mangleThunk(const CXXMethodDecl *MD,
102                          const ThunkInfo &Thunk,
103                          raw_ostream &) = 0;
104  virtual void mangleCXXDtorThunk(const CXXDestructorDecl *DDCXXDtorType Type,
105                                  const ThisAdjustment &ThisAdjustment,
106                                  raw_ostream &) = 0;
107  virtual void mangleReferenceTemporary(const VarDecl *D,
108                                        unsigned ManglingNumber,
109                                        raw_ostream &) = 0;
110  virtual void mangleCXXRTTI(QualType Traw_ostream &) = 0;
111  virtual void mangleCXXRTTIName(QualType Traw_ostream &) = 0;
112  virtual void mangleCXXCtor(const CXXConstructorDecl *DCXXCtorType Type,
113                             raw_ostream &) = 0;
114  virtual void mangleCXXDtor(const CXXDestructorDecl *DCXXDtorType Type,
115                             raw_ostream &) = 0;
116  virtual void mangleStringLiteral(const StringLiteral *SLraw_ostream &) = 0;
117
118  void mangleGlobalBlock(const BlockDecl *BD,
119                         const NamedDecl *ID,
120                         raw_ostream &Out);
121  void mangleCtorBlock(const CXXConstructorDecl *CDCXXCtorType CT,
122                       const BlockDecl *BDraw_ostream &Out);
123  void mangleDtorBlock(const CXXDestructorDecl *CDCXXDtorType DT,
124                       const BlockDecl *BDraw_ostream &Out);
125  void mangleBlock(const DeclContext *DCconst BlockDecl *BD,
126                   raw_ostream &Out);
127
128  void mangleObjCMethodNameWithoutSize(const ObjCMethodDecl *MDraw_ostream &);
129  void mangleObjCMethodName(const ObjCMethodDecl *MDraw_ostream &);
130
131  virtual void mangleStaticGuardVariable(const VarDecl *Draw_ostream &) = 0;
132
133  virtual void mangleDynamicInitializer(const VarDecl *Draw_ostream &) = 0;
134
135  virtual void mangleDynamicAtExitDestructor(const VarDecl *D,
136                                             raw_ostream &) = 0;
137
138  virtual void mangleSEHFilterExpression(const NamedDecl *EnclosingDecl,
139                                         raw_ostream &Out) = 0;
140
141  virtual void mangleSEHFinallyBlock(const NamedDecl *EnclosingDecl,
142                                     raw_ostream &Out) = 0;
143
144  /// Generates a unique string for an externally visible type for use with TBAA
145  /// or type uniquing.
146  /// TODO: Extend this to internal types by generating names that are unique
147  /// across translation units so it can be used with LTO.
148  virtual void mangleTypeName(QualType Traw_ostream &) = 0;
149
150  /// @}
151};
152
153class ItaniumMangleContext : public MangleContext {
154public:
155  explicit ItaniumMangleContext(ASTContext &CDiagnosticsEngine &D)
156      : MangleContext(CDMK_Itanium) {}
157
158  virtual void mangleCXXVTable(const CXXRecordDecl *RDraw_ostream &) = 0;
159  virtual void mangleCXXVTT(const CXXRecordDecl *RDraw_ostream &) = 0;
160  virtual void mangleCXXCtorVTable(const CXXRecordDecl *RDint64_t Offset,
161                                   const CXXRecordDecl *Type,
162                                   raw_ostream &) = 0;
163  virtual void mangleItaniumThreadLocalInit(const VarDecl *D,
164                                            raw_ostream &) = 0;
165  virtual void mangleItaniumThreadLocalWrapper(const VarDecl *D,
166                                               raw_ostream &) = 0;
167
168  virtual void mangleCXXCtorComdat(const CXXConstructorDecl *D,
169                                   raw_ostream &) = 0;
170  virtual void mangleCXXDtorComdat(const CXXDestructorDecl *D,
171                                   raw_ostream &) = 0;
172
173  static bool classof(const MangleContext *C) {
174    return C->getKind() == MK_Itanium;
175  }
176
177  static ItaniumMangleContext *create(ASTContext &Context,
178                                      DiagnosticsEngine &Diags);
179};
180
181class MicrosoftMangleContext : public MangleContext {
182public:
183  explicit MicrosoftMangleContext(ASTContext &CDiagnosticsEngine &D)
184      : MangleContext(CDMK_Microsoft) {}
185
186  /// Mangle vftable symbols.  Only a subset of the bases along the path
187  /// to the vftable are included in the name.  It's up to the caller to pick
188  /// them correctly.
189  virtual void mangleCXXVFTable(const CXXRecordDecl *Derived,
190                                ArrayRef<const CXXRecordDecl *> BasePath,
191                                raw_ostream &Out) = 0;
192
193  /// Mangle vbtable symbols.  Only a subset of the bases along the path
194  /// to the vbtable are included in the name.  It's up to the caller to pick
195  /// them correctly.
196  virtual void mangleCXXVBTable(const CXXRecordDecl *Derived,
197                                ArrayRef<const CXXRecordDecl *> BasePath,
198                                raw_ostream &Out) = 0;
199
200  virtual void mangleThreadSafeStaticGuardVariable(const VarDecl *VD,
201                                                   unsigned GuardNum,
202                                                   raw_ostream &Out) = 0;
203
204  virtual void mangleVirtualMemPtrThunk(const CXXMethodDecl *MD,
205                                        const MethodVFTableLocation &ML,
206                                        raw_ostream &Out) = 0;
207
208  virtual void mangleCXXVirtualDisplacementMap(const CXXRecordDecl *SrcRD,
209                                               const CXXRecordDecl *DstRD,
210                                               raw_ostream &Out) = 0;
211
212  virtual void mangleCXXThrowInfo(QualType Tbool IsConstbool IsVolatile,
213                                  bool IsUnaligneduint32_t NumEntries,
214                                  raw_ostream &Out) = 0;
215
216  virtual void mangleCXXCatchableTypeArray(QualType Tuint32_t NumEntries,
217                                           raw_ostream &Out) = 0;
218
219  virtual void mangleCXXCatchableType(QualType Tconst CXXConstructorDecl *CD,
220                                      CXXCtorType CTuint32_t Size,
221                                      uint32_t NVOffsetint32_t VBPtrOffset,
222                                      uint32_t VBIndexraw_ostream &Out) = 0;
223
224  virtual void mangleCXXRTTIBaseClassDescriptor(
225      const CXXRecordDecl *Deriveduint32_t NVOffsetint32_t VBPtrOffset,
226      uint32_t VBTableOffsetuint32_t Flagsraw_ostream &Out) = 0;
227
228  virtual void mangleCXXRTTIBaseClassArray(const CXXRecordDecl *Derived,
229                                           raw_ostream &Out) = 0;
230  virtual void
231  mangleCXXRTTIClassHierarchyDescriptor(const CXXRecordDecl *Derived,
232                                        raw_ostream &Out) = 0;
233
234  virtual void
235  mangleCXXRTTICompleteObjectLocator(const CXXRecordDecl *Derived,
236                                     ArrayRef<const CXXRecordDecl *> BasePath,
237                                     raw_ostream &Out) = 0;
238
239  static bool classof(const MangleContext *C) {
240    return C->getKind() == MK_Microsoft;
241  }
242
243  static MicrosoftMangleContext *create(ASTContext &Context,
244                                        DiagnosticsEngine &Diags);
245};
246}
247
248#endif
249
clang::MangleContext::ManglerKind
clang::MangleContext::anchor
clang::MangleContext::Context
clang::MangleContext::Diags
clang::MangleContext::Kind
clang::MangleContext::GlobalBlockIds
clang::MangleContext::LocalBlockIds
clang::MangleContext::AnonStructIds
clang::MangleContext::getKind
clang::MangleContext::getASTContext
clang::MangleContext::getDiags
clang::MangleContext::startNewFunction
clang::MangleContext::getBlockId
clang::MangleContext::getAnonymousStructId
clang::MangleContext::shouldMangleDeclName
clang::MangleContext::shouldMangleCXXName
clang::MangleContext::shouldMangleStringLiteral
clang::MangleContext::mangleName
clang::MangleContext::mangleCXXName
clang::MangleContext::mangleThunk
clang::MangleContext::mangleCXXDtorThunk
clang::MangleContext::mangleReferenceTemporary
clang::MangleContext::mangleCXXRTTI
clang::MangleContext::mangleCXXRTTIName
clang::MangleContext::mangleCXXCtor
clang::MangleContext::mangleCXXDtor
clang::MangleContext::mangleStringLiteral
clang::MangleContext::mangleGlobalBlock
clang::MangleContext::mangleCtorBlock
clang::MangleContext::mangleDtorBlock
clang::MangleContext::mangleBlock
clang::MangleContext::mangleObjCMethodNameWithoutSize
clang::MangleContext::mangleObjCMethodName
clang::MangleContext::mangleStaticGuardVariable
clang::MangleContext::mangleDynamicInitializer
clang::MangleContext::mangleDynamicAtExitDestructor
clang::MangleContext::mangleSEHFilterExpression
clang::MangleContext::mangleSEHFinallyBlock
clang::MangleContext::mangleTypeName
clang::ItaniumMangleContext::mangleCXXVTable
clang::ItaniumMangleContext::mangleCXXVTT
clang::ItaniumMangleContext::mangleCXXCtorVTable
clang::ItaniumMangleContext::mangleItaniumThreadLocalInit
clang::ItaniumMangleContext::mangleItaniumThreadLocalWrapper
clang::ItaniumMangleContext::mangleCXXCtorComdat
clang::ItaniumMangleContext::mangleCXXDtorComdat
clang::ItaniumMangleContext::classof
clang::ItaniumMangleContext::create
clang::MicrosoftMangleContext::mangleCXXVFTable
clang::MicrosoftMangleContext::mangleCXXVBTable
clang::MicrosoftMangleContext::mangleThreadSafeStaticGuardVariable
clang::MicrosoftMangleContext::mangleVirtualMemPtrThunk
clang::MicrosoftMangleContext::mangleCXXVirtualDisplacementMap
clang::MicrosoftMangleContext::mangleCXXThrowInfo
clang::MicrosoftMangleContext::mangleCXXCatchableTypeArray
clang::MicrosoftMangleContext::mangleCXXCatchableType
clang::MicrosoftMangleContext::mangleCXXRTTIBaseClassDescriptor
clang::MicrosoftMangleContext::mangleCXXRTTIBaseClassArray
clang::MicrosoftMangleContext::mangleCXXRTTIClassHierarchyDescriptor
clang::MicrosoftMangleContext::mangleCXXRTTICompleteObjectLocator
clang::MicrosoftMangleContext::classof
clang::MicrosoftMangleContext::create