blob: 34b2ab46bb73c86b5ac9600e5eae819e9827453c [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"
Mike Stumpf1216772009-07-31 18:25:34 +000022#include "clang/AST/Type.h"
Anders Carlssonc4355b62009-10-07 01:45:02 +000023#include "llvm/ADT/DenseMap.h"
John McCallf746aa62010-03-19 23:29:14 +000024#include "llvm/ADT/StringRef.h"
25#include "llvm/ADT/SmallString.h"
Douglas Gregor5f2bfd42009-02-13 00:10:09 +000026
27namespace clang {
Anders Carlssonb73a5be2009-11-26 02:49:32 +000028 class ASTContext;
29 class CXXConstructorDecl;
30 class CXXDestructorDecl;
Anders Carlsson19879c92010-03-23 17:17:29 +000031 class CXXMethodDecl;
Anders Carlssonb73a5be2009-11-26 02:49:32 +000032 class FunctionDecl;
33 class NamedDecl;
34 class VarDecl;
Mike Stump1eb44332009-09-09 15:08:12 +000035
Anders Carlssonb73a5be2009-11-26 02:49:32 +000036namespace CodeGen {
Douglas Gregor9ff659b2010-03-24 16:59:08 +000037 struct ThisAdjustment;
38 struct ThunkInfo;
Anders Carlsson7622cd32009-11-26 03:09:37 +000039 class CovariantThunkAdjustment;
Anders Carlssonb73a5be2009-11-26 02:49:32 +000040 class ThunkAdjustment;
John McCallf746aa62010-03-19 23:29:14 +000041
42/// MangleBuffer - a convenient class for storing a name which is
43/// either the result of a mangling or is a constant string with
44/// external memory ownership.
45class MangleBuffer {
46public:
47 void setString(llvm::StringRef Ref) {
48 String = Ref;
49 }
50
51 llvm::SmallVectorImpl<char> &getBuffer() {
52 return Buffer;
53 }
54
55 llvm::StringRef getString() const {
56 if (!String.empty()) return String;
57 return Buffer.str();
58 }
59
60 operator llvm::StringRef() const {
61 return getString();
62 }
63
64private:
65 llvm::StringRef String;
66 llvm::SmallString<256> Buffer;
67};
Anders Carlssonb73a5be2009-11-26 02:49:32 +000068
Daniel Dunbar1b077112009-11-21 09:06:10 +000069/// MangleContext - Context for tracking state which persists across multiple
70/// calls to the C++ name mangler.
71class MangleContext {
72 ASTContext &Context;
Anders Carlssonc4355b62009-10-07 01:45:02 +000073
Daniel Dunbar1b077112009-11-21 09:06:10 +000074 llvm::DenseMap<const TagDecl *, uint64_t> AnonStructIds;
Fariborz Jahanian4819ac42010-03-04 01:02:03 +000075 unsigned Discriminator;
76 llvm::DenseMap<const NamedDecl*, unsigned> Uniquifier;
77
Daniel Dunbar1b077112009-11-21 09:06:10 +000078public:
79 explicit MangleContext(ASTContext &Context)
Anders Carlssonb5404912009-10-07 01:06:45 +000080 : Context(Context) { }
Anders Carlssonb5404912009-10-07 01:06:45 +000081
Daniel Dunbar1b077112009-11-21 09:06:10 +000082 ASTContext &getASTContext() const { return Context; }
83
84 uint64_t getAnonymousStructId(const TagDecl *TD) {
85 std::pair<llvm::DenseMap<const TagDecl *,
86 uint64_t>::iterator, bool> Result =
87 AnonStructIds.insert(std::make_pair(TD, AnonStructIds.size()));
88 return Result.first->second;
89 }
90
91 /// @name Mangler Entry Points
92 /// @{
93
Daniel Dunbarf981bf82009-11-21 09:14:52 +000094 bool shouldMangleDeclName(const NamedDecl *D);
95
96 void mangleName(const NamedDecl *D, llvm::SmallVectorImpl<char> &);
Anders Carlssona94822e2009-11-26 02:32:05 +000097 void mangleThunk(const FunctionDecl *FD,
Anders Carlssonb73a5be2009-11-26 02:49:32 +000098 const ThunkAdjustment &ThisAdjustment,
Daniel Dunbar94fd26d2009-11-21 09:06:22 +000099 llvm::SmallVectorImpl<char> &);
Anders Carlsson19879c92010-03-23 17:17:29 +0000100 void mangleThunk(const CXXMethodDecl *MD,
101 const ThunkInfo &Thunk,
102 llvm::SmallVectorImpl<char> &);
Eli Friedman61d89b62009-12-03 00:03:05 +0000103 void mangleCXXDtorThunk(const CXXDestructorDecl *D, CXXDtorType Type,
104 const ThunkAdjustment &ThisAdjustment,
105 llvm::SmallVectorImpl<char> &);
Anders Carlsson19879c92010-03-23 17:17:29 +0000106 void mangleCXXDtorThunk(const CXXDestructorDecl *DD, CXXDtorType Type,
107 const ThisAdjustment &ThisAdjustment,
108 llvm::SmallVectorImpl<char> &);
Anders Carlsson7622cd32009-11-26 03:09:37 +0000109 void mangleCovariantThunk(const FunctionDecl *FD,
110 const CovariantThunkAdjustment& Adjustment,
Daniel Dunbar94fd26d2009-11-21 09:06:22 +0000111 llvm::SmallVectorImpl<char> &);
112 void mangleGuardVariable(const VarDecl *D, llvm::SmallVectorImpl<char> &);
113 void mangleCXXVtable(const CXXRecordDecl *RD, llvm::SmallVectorImpl<char> &);
114 void mangleCXXVTT(const CXXRecordDecl *RD, llvm::SmallVectorImpl<char> &);
Daniel Dunbar1b077112009-11-21 09:06:10 +0000115 void mangleCXXCtorVtable(const CXXRecordDecl *RD, int64_t Offset,
Daniel Dunbar94fd26d2009-11-21 09:06:22 +0000116 const CXXRecordDecl *Type,
117 llvm::SmallVectorImpl<char> &);
Mike Stumpde050572009-12-02 18:57:08 +0000118 void mangleCXXRTTI(QualType T, llvm::SmallVectorImpl<char> &);
119 void mangleCXXRTTIName(QualType T, llvm::SmallVectorImpl<char> &);
Daniel Dunbar1b077112009-11-21 09:06:10 +0000120 void mangleCXXCtor(const CXXConstructorDecl *D, CXXCtorType Type,
Daniel Dunbar94fd26d2009-11-21 09:06:22 +0000121 llvm::SmallVectorImpl<char> &);
Daniel Dunbar1b077112009-11-21 09:06:10 +0000122 void mangleCXXDtor(const CXXDestructorDecl *D, CXXDtorType Type,
Daniel Dunbar94fd26d2009-11-21 09:06:22 +0000123 llvm::SmallVectorImpl<char> &);
Fariborz Jahanian4819ac42010-03-04 01:02:03 +0000124
125 void mangleInitDiscriminator() {
126 Discriminator = 0;
127 }
Daniel Dunbar1b077112009-11-21 09:06:10 +0000128
Fariborz Jahanian4819ac42010-03-04 01:02:03 +0000129 bool getNextDiscriminator(const NamedDecl *ND, unsigned &disc) {
130 unsigned &discriminator = Uniquifier[ND];
131 if (!discriminator)
132 discriminator = ++Discriminator;
133 if (discriminator == 1)
134 return false;
135 disc = discriminator-2;
136 return true;
137 }
Daniel Dunbar1b077112009-11-21 09:06:10 +0000138 /// @}
139};
Anders Carlssonb73a5be2009-11-26 02:49:32 +0000140
141}
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000142}
143
Mike Stump1eb44332009-09-09 15:08:12 +0000144#endif