clang 22.0.0git
Mangle.h
Go to the documentation of this file.
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"
18#include "clang/AST/Type.h"
19#include "clang/Basic/ABI.h"
20#include "llvm/ADT/DenseMap.h"
21#include "llvm/Support/Casting.h"
22#include <optional>
23
24namespace llvm {
25class raw_ostream;
26}
27
28namespace clang {
29class ASTContext;
30class BlockDecl;
31class CXXConstructorDecl;
32class CXXDestructorDecl;
33class CXXMethodDecl;
34class FunctionDecl;
35struct MethodVFTableLocation;
36class NamedDecl;
37class ObjCMethodDecl;
38class StringLiteral;
39struct ThisAdjustment;
40struct ThunkInfo;
41class VarDecl;
42
43/// Extract mangling function name from MangleContext such that swift can call
44/// it to prepare for ObjCDirect in swift.
45void mangleObjCMethodName(raw_ostream &OS, bool includePrefixByte,
46 bool isInstanceMethod, StringRef ClassName,
47 std::optional<StringRef> CategoryName,
48 StringRef MethodName);
49
50/// MangleContext - Context for tracking state which persists across multiple
51/// calls to the C++ name mangler.
53public:
55
56private:
57 virtual void anchor();
58
59 ASTContext &Context;
60 DiagnosticsEngine &Diags;
61 const ManglerKind Kind;
62 /// For aux target. If true, uses mangling number for aux target from
63 /// ASTContext.
64 bool IsAux = false;
65
66 llvm::DenseMap<const BlockDecl *, unsigned> GlobalBlockIds;
67 llvm::DenseMap<const BlockDecl *, unsigned> LocalBlockIds;
68 llvm::DenseMap<const NamedDecl *, uint64_t> AnonStructIds;
69 llvm::DenseMap<const FunctionDecl *, unsigned> FuncAnonStructSize;
70
71public:
72 ManglerKind getKind() const { return Kind; }
73
74 bool isAux() const { return IsAux; }
75
76 explicit MangleContext(ASTContext &Context, DiagnosticsEngine &Diags,
77 ManglerKind Kind, bool IsAux = false)
78 : Context(Context), Diags(Diags), Kind(Kind), IsAux(IsAux) {}
79
80 virtual ~MangleContext() {}
81
82 ASTContext &getASTContext() const { return Context; }
83
84 DiagnosticsEngine &getDiags() const { return Diags; }
85
86 virtual void startNewFunction() { LocalBlockIds.clear(); }
87
88 unsigned getBlockId(const BlockDecl *BD, bool Local) {
89 llvm::DenseMap<const BlockDecl *, unsigned> &BlockIds =
90 Local ? LocalBlockIds : GlobalBlockIds;
91 std::pair<llvm::DenseMap<const BlockDecl *, unsigned>::iterator, bool>
92 Result = BlockIds.insert(std::make_pair(BD, BlockIds.size()));
93 return Result.first->second;
94 }
95
97 const FunctionDecl *FD = nullptr) {
98 auto FindResult = AnonStructIds.find(D);
99 if (FindResult != AnonStructIds.end())
100 return FindResult->second;
101
102 // If FunctionDecl is passed in, the anonymous structID will be per-function
103 // based.
104 unsigned Id = FD ? FuncAnonStructSize[FD]++ : AnonStructIds.size();
105 std::pair<llvm::DenseMap<const NamedDecl *, uint64_t>::iterator, bool>
106 Result = AnonStructIds.insert(std::make_pair(D, Id));
107 return Result.first->second;
108 }
109
111 llvm::DenseMap<const NamedDecl *, uint64_t>::iterator Result =
112 AnonStructIds.find(D);
113 // The decl should already be inserted, but return 0 in case it is not.
114 if (Result == AnonStructIds.end())
115 return 0;
116 return Result->second;
117 }
118
119 virtual std::string getLambdaString(const CXXRecordDecl *Lambda) = 0;
120
121 /// @name Mangler Entry Points
122 /// @{
123
124 bool shouldMangleDeclName(const NamedDecl *D);
125 virtual bool shouldMangleCXXName(const NamedDecl *D) = 0;
126 virtual bool shouldMangleStringLiteral(const StringLiteral *SL) = 0;
127
128 virtual bool isUniqueInternalLinkageDecl(const NamedDecl *ND) {
129 return false;
130 }
131
133
134 // FIXME: consider replacing raw_ostream & with something like SmallString &.
135 void mangleName(GlobalDecl GD, raw_ostream &);
136 virtual void mangleCXXName(GlobalDecl GD, raw_ostream &) = 0;
137 virtual void mangleThunk(const CXXMethodDecl *MD, const ThunkInfo &Thunk,
138 bool ElideOverrideInfo, raw_ostream &) = 0;
140 const ThunkInfo &Thunk,
141 bool ElideOverrideInfo, raw_ostream &) = 0;
142 virtual void mangleReferenceTemporary(const VarDecl *D,
143 unsigned ManglingNumber,
144 raw_ostream &) = 0;
145 virtual void mangleCXXVTable(const CXXRecordDecl *RD, raw_ostream &) = 0;
146 virtual void mangleCXXRTTI(QualType T, raw_ostream &) = 0;
147 virtual void mangleCXXRTTIName(QualType T, raw_ostream &,
148 bool NormalizeIntegers = false) = 0;
149 virtual void mangleStringLiteral(const StringLiteral *SL, raw_ostream &) = 0;
150 virtual void mangleMSGuidDecl(const MSGuidDecl *GD, raw_ostream &) const;
151
152 void mangleGlobalBlock(const BlockDecl *BD, const NamedDecl *ID,
153 raw_ostream &Out);
155 const BlockDecl *BD, raw_ostream &Out);
157 const BlockDecl *BD, raw_ostream &Out);
158 void mangleBlock(const DeclContext *DC, const BlockDecl *BD,
159 raw_ostream &Out);
160
161 void mangleObjCMethodName(const ObjCMethodDecl *MD, raw_ostream &OS,
162 bool includePrefixByte = true,
163 bool includeCategoryNamespace = true) const;
165 raw_ostream &) const;
166
167 virtual void mangleStaticGuardVariable(const VarDecl *D, raw_ostream &) = 0;
168
169 virtual void mangleDynamicInitializer(const VarDecl *D, raw_ostream &) = 0;
170
172 raw_ostream &) = 0;
173
174 virtual void mangleSEHFilterExpression(GlobalDecl EnclosingDecl,
175 raw_ostream &Out) = 0;
176
177 virtual void mangleSEHFinallyBlock(GlobalDecl EnclosingDecl,
178 raw_ostream &Out) = 0;
179
180 /// Generates a unique string for an externally visible type for use with TBAA
181 /// or type uniquing.
182 /// TODO: Extend this to internal types by generating names that are unique
183 /// across translation units so it can be used with LTO.
184 virtual void mangleCanonicalTypeName(QualType T, raw_ostream &,
185 bool NormalizeIntegers = false) = 0;
186
187 /// @}
188};
189
191public:
193 const NamedDecl *);
195 bool IsAux = false)
196 : MangleContext(C, D, MK_Itanium, IsAux) {}
197
198 virtual void mangleCXXVTT(const CXXRecordDecl *RD, raw_ostream &) = 0;
199 virtual void mangleCXXCtorVTable(const CXXRecordDecl *RD, int64_t Offset,
200 const CXXRecordDecl *Type,
201 raw_ostream &) = 0;
203 raw_ostream &) = 0;
205 raw_ostream &) = 0;
206
208 raw_ostream &) = 0;
210 raw_ostream &) = 0;
211
212 virtual void mangleLambdaSig(const CXXRecordDecl *Lambda, raw_ostream &) = 0;
213
214 virtual void mangleDynamicStermFinalizer(const VarDecl *D, raw_ostream &) = 0;
215
216 virtual void mangleModuleInitializer(const Module *Module, raw_ostream &) = 0;
217
218 // This has to live here, otherwise the CXXNameMangler won't have access to
219 // it.
221 static bool classof(const MangleContext *C) {
222 return C->getKind() == MK_Itanium;
223 }
224
225 static ItaniumMangleContext *
226 create(ASTContext &Context, DiagnosticsEngine &Diags, bool IsAux = false);
227 static ItaniumMangleContext *create(ASTContext &Context,
228 DiagnosticsEngine &Diags,
229 DiscriminatorOverrideTy Discriminator,
230 bool IsAux = false);
231};
232
234public:
236 bool IsAux = false)
237 : MangleContext(C, D, MK_Microsoft, IsAux) {}
238
239 /// Mangle vftable symbols. Only a subset of the bases along the path
240 /// to the vftable are included in the name. It's up to the caller to pick
241 /// them correctly.
242 virtual void mangleCXXVFTable(const CXXRecordDecl *Derived,
244 raw_ostream &Out) = 0;
245
246 /// Mangle vbtable symbols. Only a subset of the bases along the path
247 /// to the vbtable are included in the name. It's up to the caller to pick
248 /// them correctly.
249 virtual void mangleCXXVBTable(const CXXRecordDecl *Derived,
251 raw_ostream &Out) = 0;
252
254 unsigned GuardNum,
255 raw_ostream &Out) = 0;
256
258 const MethodVFTableLocation &ML,
259 raw_ostream &Out) = 0;
260
262 const CXXRecordDecl *DstRD,
263 raw_ostream &Out) = 0;
264
265 virtual void mangleCXXThrowInfo(QualType T, bool IsConst, bool IsVolatile,
266 bool IsUnaligned, uint32_t NumEntries,
267 raw_ostream &Out) = 0;
268
269 virtual void mangleCXXCatchableTypeArray(QualType T, uint32_t NumEntries,
270 raw_ostream &Out) = 0;
271
273 CXXCtorType CT, uint32_t Size,
274 uint32_t NVOffset, int32_t VBPtrOffset,
275 uint32_t VBIndex, raw_ostream &Out) = 0;
276
278 const CXXRecordDecl *Derived, uint32_t NVOffset, int32_t VBPtrOffset,
279 uint32_t VBTableOffset, uint32_t Flags, raw_ostream &Out) = 0;
280
281 virtual void mangleCXXRTTIBaseClassArray(const CXXRecordDecl *Derived,
282 raw_ostream &Out) = 0;
283 virtual void
285 raw_ostream &Out) = 0;
286
287 virtual void
290 raw_ostream &Out) = 0;
291
292 static bool classof(const MangleContext *C) {
293 return C->getKind() == MK_Microsoft;
294 }
295
297 create(ASTContext &Context, DiagnosticsEngine &Diags, bool IsAux = false);
298};
299
301public:
302 explicit ASTNameGenerator(ASTContext &Ctx);
304
305 /// Writes name for \p D to \p OS.
306 /// \returns true on failure, false on success.
307 bool writeName(const Decl *D, raw_ostream &OS);
308
309 /// \returns name for \p D
310 std::string getName(const Decl *D);
311
312 /// \returns all applicable mangled names.
313 /// For example C++ constructors/destructors can have multiple.
314 std::vector<std::string> getAllManglings(const Decl *D);
315
316private:
317 class Implementation;
318 std::unique_ptr<Implementation> Impl;
319};
320} // namespace clang
321
322#endif
Enums/classes describing ABI related information about constructors, destructors and thunks.
static char ID
Definition: Arena.cpp:183
const Decl * D
uint32_t Id
Definition: SemaARM.cpp:1179
C Language Family Type Representation.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition: ASTContext.h:188
std::string getName(const Decl *D)
Definition: Mangle.cpp:626
bool writeName(const Decl *D, raw_ostream &OS)
Writes name for D to OS.
Definition: Mangle.cpp:622
std::vector< std::string > getAllManglings(const Decl *D)
Definition: Mangle.cpp:630
Represents a block literal declaration, which is like an unnamed FunctionDecl.
Definition: Decl.h:4634
Represents a C++ constructor within a class.
Definition: DeclCXX.h:2604
Represents a C++ destructor within a class.
Definition: DeclCXX.h:2869
Represents a static or instance method of a struct/union/class.
Definition: DeclCXX.h:2129
Represents a C++ struct/union/class.
Definition: DeclCXX.h:258
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition: DeclBase.h:1449
Decl - This represents one declaration (or definition), e.g.
Definition: DeclBase.h:86
Concrete class used by the front-end to report problems and issues.
Definition: Diagnostic.h:231
Represents a function declaration or definition.
Definition: Decl.h:1999
GlobalDecl - represents a global declaration.
Definition: GlobalDecl.h:57
virtual DiscriminatorOverrideTy getDiscriminatorOverride() const =0
virtual void mangleDynamicStermFinalizer(const VarDecl *D, raw_ostream &)=0
virtual void mangleCXXVTT(const CXXRecordDecl *RD, raw_ostream &)=0
ItaniumMangleContext(ASTContext &C, DiagnosticsEngine &D, bool IsAux=false)
Definition: Mangle.h:194
virtual void mangleItaniumThreadLocalInit(const VarDecl *D, raw_ostream &)=0
virtual void mangleCXXCtorComdat(const CXXConstructorDecl *D, raw_ostream &)=0
virtual void mangleLambdaSig(const CXXRecordDecl *Lambda, raw_ostream &)=0
virtual void mangleCXXDtorComdat(const CXXDestructorDecl *D, raw_ostream &)=0
virtual void mangleItaniumThreadLocalWrapper(const VarDecl *D, raw_ostream &)=0
static ItaniumMangleContext * create(ASTContext &Context, DiagnosticsEngine &Diags, bool IsAux=false)
virtual void mangleCXXCtorVTable(const CXXRecordDecl *RD, int64_t Offset, const CXXRecordDecl *Type, raw_ostream &)=0
virtual void mangleModuleInitializer(const Module *Module, raw_ostream &)=0
UnsignedOrNone(*)(ASTContext &, const NamedDecl *) DiscriminatorOverrideTy
Definition: Mangle.h:193
static bool classof(const MangleContext *C)
Definition: Mangle.h:221
A global _GUID constant.
Definition: DeclCXX.h:4392
MangleContext - Context for tracking state which persists across multiple calls to the C++ name mangl...
Definition: Mangle.h:52
void mangleBlock(const DeclContext *DC, const BlockDecl *BD, raw_ostream &Out)
Definition: Mangle.cpp:310
virtual void mangleCXXDtorThunk(const CXXDestructorDecl *DD, CXXDtorType Type, const ThunkInfo &Thunk, bool ElideOverrideInfo, raw_ostream &)=0
virtual void mangleCXXRTTI(QualType T, raw_ostream &)=0
bool isAux() const
Definition: Mangle.h:74
unsigned getBlockId(const BlockDecl *BD, bool Local)
Definition: Mangle.h:88
virtual std::string getLambdaString(const CXXRecordDecl *Lambda)=0
virtual bool shouldMangleStringLiteral(const StringLiteral *SL)=0
void mangleCtorBlock(const CXXConstructorDecl *CD, CXXCtorType CT, const BlockDecl *BD, raw_ostream &Out)
Definition: Mangle.cpp:292
ASTContext & getASTContext() const
Definition: Mangle.h:82
uint64_t getAnonymousStructIdForDebugInfo(const NamedDecl *D)
Definition: Mangle.h:110
virtual void mangleDynamicAtExitDestructor(const VarDecl *D, raw_ostream &)=0
void mangleGlobalBlock(const BlockDecl *BD, const NamedDecl *ID, raw_ostream &Out)
Definition: Mangle.cpp:275
virtual bool isUniqueInternalLinkageDecl(const NamedDecl *ND)
Definition: Mangle.h:128
uint64_t getAnonymousStructId(const NamedDecl *D, const FunctionDecl *FD=nullptr)
Definition: Mangle.h:96
bool shouldMangleDeclName(const NamedDecl *D)
Definition: Mangle.cpp:121
virtual void mangleSEHFilterExpression(GlobalDecl EnclosingDecl, raw_ostream &Out)=0
virtual void mangleMSGuidDecl(const MSGuidDecl *GD, raw_ostream &) const
Definition: Mangle.cpp:260
virtual void mangleThunk(const CXXMethodDecl *MD, const ThunkInfo &Thunk, bool ElideOverrideInfo, raw_ostream &)=0
void mangleName(GlobalDecl GD, raw_ostream &)
Definition: Mangle.cpp:155
virtual ~MangleContext()
Definition: Mangle.h:80
virtual void mangleCanonicalTypeName(QualType T, raw_ostream &, bool NormalizeIntegers=false)=0
Generates a unique string for an externally visible type for use with TBAA or type uniquing.
virtual void mangleStringLiteral(const StringLiteral *SL, raw_ostream &)=0
virtual void mangleCXXName(GlobalDecl GD, raw_ostream &)=0
ManglerKind getKind() const
Definition: Mangle.h:72
virtual void needsUniqueInternalLinkageNames()
Definition: Mangle.h:132
virtual void mangleReferenceTemporary(const VarDecl *D, unsigned ManglingNumber, raw_ostream &)=0
virtual void startNewFunction()
Definition: Mangle.h:86
DiagnosticsEngine & getDiags() const
Definition: Mangle.h:84
virtual bool shouldMangleCXXName(const NamedDecl *D)=0
virtual void mangleCXXRTTIName(QualType T, raw_ostream &, bool NormalizeIntegers=false)=0
virtual void mangleDynamicInitializer(const VarDecl *D, raw_ostream &)=0
void mangleDtorBlock(const CXXDestructorDecl *CD, CXXDtorType DT, const BlockDecl *BD, raw_ostream &Out)
Definition: Mangle.cpp:301
virtual void mangleCXXVTable(const CXXRecordDecl *RD, raw_ostream &)=0
MangleContext(ASTContext &Context, DiagnosticsEngine &Diags, ManglerKind Kind, bool IsAux=false)
Definition: Mangle.h:76
virtual void mangleSEHFinallyBlock(GlobalDecl EnclosingDecl, raw_ostream &Out)=0
void mangleObjCMethodName(const ObjCMethodDecl *MD, raw_ostream &OS, bool includePrefixByte=true, bool includeCategoryNamespace=true) const
Definition: Mangle.cpp:345
void mangleObjCMethodNameAsSourceName(const ObjCMethodDecl *MD, raw_ostream &) const
Definition: Mangle.cpp:404
virtual void mangleStaticGuardVariable(const VarDecl *D, raw_ostream &)=0
virtual void mangleCXXVFTable(const CXXRecordDecl *Derived, ArrayRef< const CXXRecordDecl * > BasePath, raw_ostream &Out)=0
Mangle vftable symbols.
virtual void mangleVirtualMemPtrThunk(const CXXMethodDecl *MD, const MethodVFTableLocation &ML, raw_ostream &Out)=0
virtual void mangleCXXRTTICompleteObjectLocator(const CXXRecordDecl *Derived, ArrayRef< const CXXRecordDecl * > BasePath, raw_ostream &Out)=0
virtual void mangleCXXThrowInfo(QualType T, bool IsConst, bool IsVolatile, bool IsUnaligned, uint32_t NumEntries, raw_ostream &Out)=0
static bool classof(const MangleContext *C)
Definition: Mangle.h:292
virtual void mangleCXXVBTable(const CXXRecordDecl *Derived, ArrayRef< const CXXRecordDecl * > BasePath, raw_ostream &Out)=0
Mangle vbtable symbols.
virtual void mangleCXXRTTIClassHierarchyDescriptor(const CXXRecordDecl *Derived, raw_ostream &Out)=0
virtual void mangleThreadSafeStaticGuardVariable(const VarDecl *VD, unsigned GuardNum, raw_ostream &Out)=0
static MicrosoftMangleContext * create(ASTContext &Context, DiagnosticsEngine &Diags, bool IsAux=false)
virtual void mangleCXXCatchableTypeArray(QualType T, uint32_t NumEntries, raw_ostream &Out)=0
virtual void mangleCXXRTTIBaseClassDescriptor(const CXXRecordDecl *Derived, uint32_t NVOffset, int32_t VBPtrOffset, uint32_t VBTableOffset, uint32_t Flags, raw_ostream &Out)=0
virtual void mangleCXXCatchableType(QualType T, const CXXConstructorDecl *CD, CXXCtorType CT, uint32_t Size, uint32_t NVOffset, int32_t VBPtrOffset, uint32_t VBIndex, raw_ostream &Out)=0
virtual void mangleCXXRTTIBaseClassArray(const CXXRecordDecl *Derived, raw_ostream &Out)=0
virtual void mangleCXXVirtualDisplacementMap(const CXXRecordDecl *SrcRD, const CXXRecordDecl *DstRD, raw_ostream &Out)=0
MicrosoftMangleContext(ASTContext &C, DiagnosticsEngine &D, bool IsAux=false)
Definition: Mangle.h:235
Describes a module or submodule.
Definition: Module.h:144
This represents a decl that may have a name.
Definition: Decl.h:273
ObjCMethodDecl - Represents an instance or class method declaration.
Definition: DeclObjC.h:140
A (possibly-)qualified type.
Definition: TypeBase.h:937
StringLiteral - This represents a string literal expression, e.g.
Definition: Expr.h:1801
The base class of the type hierarchy.
Definition: TypeBase.h:1833
Represents a variable declaration or definition.
Definition: Decl.h:925
The JSON file list parser is used to communicate input to InstallAPI.
CXXCtorType
C++ constructor types.
Definition: ABI.h:24
bool isInstanceMethod(const Decl *D)
Definition: Attr.h:120
@ Result
The result type of a method or function.
CXXDtorType
C++ destructor types.
Definition: ABI.h:33
const FunctionProtoType * T
void mangleObjCMethodName(raw_ostream &OS, bool includePrefixByte, bool isInstanceMethod, StringRef ClassName, std::optional< StringRef > CategoryName, StringRef MethodName)
Extract mangling function name from MangleContext such that swift can call it to prepare for ObjCDire...
Definition: Mangle.cpp:32
Diagnostic wrappers for TextAPI types for error reporting.
Definition: Dominators.h:30
The this pointer adjustment as well as an optional return adjustment for a thunk.
Definition: Thunk.h:157