blob: 139f6c0377ec44f22edb351574d717ddf1ac8cbf [file] [log] [blame]
Douglas Gregor6ec36682009-02-18 23:53:56 +00001//===--- Mangle.h - Mangle C++ Names ----------------------------*- C++ -*-===//
Douglas Gregor5f2bfd42009-02-13 00:10:09 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// Implements C++ name mangling according to the Itanium C++ ABI,
11// which is used in GCC 3.2 and newer (and many compilers that are
12// ABI-compatible with GCC):
13//
14// http://www.codesourcery.com/public/cxx-abi/abi.html
15//
16//===----------------------------------------------------------------------===//
Chris Lattnerca3f25c2009-03-21 08:24:40 +000017
Douglas Gregor5f2bfd42009-02-13 00:10:09 +000018#ifndef LLVM_CLANG_CODEGEN_MANGLE_H
19#define LLVM_CLANG_CODEGEN_MANGLE_H
20
Anders Carlsson3ac86b52009-04-15 05:36:58 +000021#include "CGCXX.h"
Fariborz Jahanian564360b2010-06-24 00:08:06 +000022#include "GlobalDecl.h"
Mike Stumpf1216772009-07-31 18:25:34 +000023#include "clang/AST/Type.h"
Anders Carlssonc4355b62009-10-07 01:45:02 +000024#include "llvm/ADT/DenseMap.h"
John McCallf746aa62010-03-19 23:29:14 +000025#include "llvm/ADT/StringRef.h"
26#include "llvm/ADT/SmallString.h"
Charles Davis685b1d92010-05-26 18:25:27 +000027#include "llvm/Support/raw_ostream.h"
Douglas Gregor5f2bfd42009-02-13 00:10:09 +000028
29namespace clang {
Anders Carlssonb73a5be2009-11-26 02:49:32 +000030 class ASTContext;
Douglas Gregor35415f52010-05-25 17:04:15 +000031 class BlockDecl;
Anders Carlssonb73a5be2009-11-26 02:49:32 +000032 class CXXConstructorDecl;
33 class CXXDestructorDecl;
Anders Carlsson19879c92010-03-23 17:17:29 +000034 class CXXMethodDecl;
Anders Carlssonb73a5be2009-11-26 02:49:32 +000035 class FunctionDecl;
36 class NamedDecl;
Charles Davis685b1d92010-05-26 18:25:27 +000037 class ObjCMethodDecl;
Anders Carlssonb73a5be2009-11-26 02:49:32 +000038 class VarDecl;
Mike Stump1eb44332009-09-09 15:08:12 +000039
Anders Carlssonb73a5be2009-11-26 02:49:32 +000040namespace CodeGen {
Douglas Gregor9ff659b2010-03-24 16:59:08 +000041 struct ThisAdjustment;
42 struct ThunkInfo;
John McCallf746aa62010-03-19 23:29:14 +000043
44/// MangleBuffer - a convenient class for storing a name which is
45/// either the result of a mangling or is a constant string with
46/// external memory ownership.
47class MangleBuffer {
48public:
49 void setString(llvm::StringRef Ref) {
50 String = Ref;
51 }
52
53 llvm::SmallVectorImpl<char> &getBuffer() {
54 return Buffer;
55 }
56
57 llvm::StringRef getString() const {
58 if (!String.empty()) return String;
59 return Buffer.str();
60 }
61
62 operator llvm::StringRef() const {
63 return getString();
64 }
65
66private:
67 llvm::StringRef String;
68 llvm::SmallString<256> Buffer;
69};
Charles Davis685b1d92010-05-26 18:25:27 +000070
Daniel Dunbar1b077112009-11-21 09:06:10 +000071/// MangleContext - Context for tracking state which persists across multiple
72/// calls to the C++ name mangler.
73class MangleContext {
74 ASTContext &Context;
John McCall6ae1f352010-04-09 22:26:14 +000075 Diagnostic &Diags;
Anders Carlssonc4355b62009-10-07 01:45:02 +000076
Daniel Dunbar1b077112009-11-21 09:06:10 +000077 llvm::DenseMap<const TagDecl *, uint64_t> AnonStructIds;
Fariborz Jahanian4819ac42010-03-04 01:02:03 +000078 unsigned Discriminator;
79 llvm::DenseMap<const NamedDecl*, unsigned> Uniquifier;
Douglas Gregor35415f52010-05-25 17:04:15 +000080 llvm::DenseMap<const BlockDecl*, unsigned> GlobalBlockIds;
81 llvm::DenseMap<const BlockDecl*, unsigned> LocalBlockIds;
Fariborz Jahanian4819ac42010-03-04 01:02:03 +000082
Daniel Dunbar1b077112009-11-21 09:06:10 +000083public:
John McCall6ae1f352010-04-09 22:26:14 +000084 explicit MangleContext(ASTContext &Context,
85 Diagnostic &Diags)
86 : Context(Context), Diags(Diags) { }
Anders Carlssonb5404912009-10-07 01:06:45 +000087
Charles Davisc3926642010-06-09 23:25:41 +000088 virtual ~MangleContext() { }
89
Daniel Dunbar1b077112009-11-21 09:06:10 +000090 ASTContext &getASTContext() const { return Context; }
91
John McCall6ae1f352010-04-09 22:26:14 +000092 Diagnostic &getDiags() const { return Diags; }
93
Douglas Gregor35415f52010-05-25 17:04:15 +000094 void startNewFunction() { LocalBlockIds.clear(); }
95
Daniel Dunbar1b077112009-11-21 09:06:10 +000096 uint64_t getAnonymousStructId(const TagDecl *TD) {
97 std::pair<llvm::DenseMap<const TagDecl *,
98 uint64_t>::iterator, bool> Result =
99 AnonStructIds.insert(std::make_pair(TD, AnonStructIds.size()));
100 return Result.first->second;
101 }
102
Douglas Gregor35415f52010-05-25 17:04:15 +0000103 unsigned getBlockId(const BlockDecl *BD, bool Local) {
104 llvm::DenseMap<const BlockDecl *, unsigned> &BlockIds
105 = Local? LocalBlockIds : GlobalBlockIds;
106 std::pair<llvm::DenseMap<const BlockDecl *, unsigned>::iterator, bool>
107 Result = BlockIds.insert(std::make_pair(BD, BlockIds.size()));
108 return Result.first->second;
109 }
110
Daniel Dunbar1b077112009-11-21 09:06:10 +0000111 /// @name Mangler Entry Points
112 /// @{
113
Charles Davis971154d2010-06-11 04:25:47 +0000114 virtual bool shouldMangleDeclName(const NamedDecl *D);
Charles Davisc3926642010-06-09 23:25:41 +0000115 virtual void mangleName(const NamedDecl *D, llvm::SmallVectorImpl<char> &);
116 virtual void mangleThunk(const CXXMethodDecl *MD,
117 const ThunkInfo &Thunk,
Anders Carlsson19879c92010-03-23 17:17:29 +0000118 llvm::SmallVectorImpl<char> &);
Charles Davisc3926642010-06-09 23:25:41 +0000119 virtual void mangleCXXDtorThunk(const CXXDestructorDecl *DD, CXXDtorType Type,
120 const ThisAdjustment &ThisAdjustment,
121 llvm::SmallVectorImpl<char> &);
122 virtual void mangleGuardVariable(const VarDecl *D,
123 llvm::SmallVectorImpl<char> &);
Anders Carlsson715edf22010-06-26 16:09:40 +0000124 virtual void mangleReferenceTemporary(const VarDecl *D,
125 llvm::SmallVectorImpl<char> &);
Charles Davisc3926642010-06-09 23:25:41 +0000126 virtual void mangleCXXVTable(const CXXRecordDecl *RD,
127 llvm::SmallVectorImpl<char> &);
128 virtual void mangleCXXVTT(const CXXRecordDecl *RD,
129 llvm::SmallVectorImpl<char> &);
130 virtual void mangleCXXCtorVTable(const CXXRecordDecl *RD, int64_t Offset,
131 const CXXRecordDecl *Type,
132 llvm::SmallVectorImpl<char> &);
133 virtual void mangleCXXRTTI(QualType T, llvm::SmallVectorImpl<char> &);
134 virtual void mangleCXXRTTIName(QualType T, llvm::SmallVectorImpl<char> &);
135 virtual void mangleCXXCtor(const CXXConstructorDecl *D, CXXCtorType Type,
136 llvm::SmallVectorImpl<char> &);
137 virtual void mangleCXXDtor(const CXXDestructorDecl *D, CXXDtorType Type,
138 llvm::SmallVectorImpl<char> &);
Fariborz Jahanian564360b2010-06-24 00:08:06 +0000139 void mangleBlock(GlobalDecl GD,
140 const BlockDecl *BD, llvm::SmallVectorImpl<char> &);
Douglas Gregor35415f52010-05-25 17:04:15 +0000141
Fariborz Jahanian4819ac42010-03-04 01:02:03 +0000142 void mangleInitDiscriminator() {
143 Discriminator = 0;
144 }
Daniel Dunbar1b077112009-11-21 09:06:10 +0000145
Fariborz Jahanian4819ac42010-03-04 01:02:03 +0000146 bool getNextDiscriminator(const NamedDecl *ND, unsigned &disc) {
147 unsigned &discriminator = Uniquifier[ND];
148 if (!discriminator)
149 discriminator = ++Discriminator;
150 if (discriminator == 1)
151 return false;
152 disc = discriminator-2;
153 return true;
154 }
Daniel Dunbar1b077112009-11-21 09:06:10 +0000155 /// @}
156};
Charles Davis685b1d92010-05-26 18:25:27 +0000157
158/// MiscNameMangler - Mangles Objective-C method names and blocks.
159class MiscNameMangler {
160 MangleContext &Context;
161 llvm::raw_svector_ostream Out;
Anders Carlssonb73a5be2009-11-26 02:49:32 +0000162
Charles Davis685b1d92010-05-26 18:25:27 +0000163 ASTContext &getASTContext() const { return Context.getASTContext(); }
164
165public:
166 MiscNameMangler(MangleContext &C, llvm::SmallVectorImpl<char> &Res);
167
168 llvm::raw_svector_ostream &getStream() { return Out; }
169
Fariborz Jahanian564360b2010-06-24 00:08:06 +0000170 void mangleBlock(GlobalDecl GD, const BlockDecl *BD);
Charles Davis685b1d92010-05-26 18:25:27 +0000171 void mangleObjCMethodName(const ObjCMethodDecl *MD);
172};
173
Anders Carlssonb73a5be2009-11-26 02:49:32 +0000174}
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000175}
176
Mike Stump1eb44332009-09-09 15:08:12 +0000177#endif