blob: 62656b95da1b1049c78b8944d3f0ee7f7c6cf393 [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;
31 class FunctionDecl;
32 class NamedDecl;
33 class VarDecl;
Mike Stump1eb44332009-09-09 15:08:12 +000034
Anders Carlssonb73a5be2009-11-26 02:49:32 +000035namespace CodeGen {
Anders Carlsson7622cd32009-11-26 03:09:37 +000036 class CovariantThunkAdjustment;
Anders Carlssonb73a5be2009-11-26 02:49:32 +000037 class ThunkAdjustment;
John McCallf746aa62010-03-19 23:29:14 +000038
39/// MangleBuffer - a convenient class for storing a name which is
40/// either the result of a mangling or is a constant string with
41/// external memory ownership.
42class MangleBuffer {
43public:
44 void setString(llvm::StringRef Ref) {
45 String = Ref;
46 }
47
48 llvm::SmallVectorImpl<char> &getBuffer() {
49 return Buffer;
50 }
51
52 llvm::StringRef getString() const {
53 if (!String.empty()) return String;
54 return Buffer.str();
55 }
56
57 operator llvm::StringRef() const {
58 return getString();
59 }
60
61private:
62 llvm::StringRef String;
63 llvm::SmallString<256> Buffer;
64};
Anders Carlssonb73a5be2009-11-26 02:49:32 +000065
Daniel Dunbar1b077112009-11-21 09:06:10 +000066/// MangleContext - Context for tracking state which persists across multiple
67/// calls to the C++ name mangler.
68class MangleContext {
69 ASTContext &Context;
Anders Carlssonc4355b62009-10-07 01:45:02 +000070
Daniel Dunbar1b077112009-11-21 09:06:10 +000071 llvm::DenseMap<const TagDecl *, uint64_t> AnonStructIds;
Fariborz Jahanian4819ac42010-03-04 01:02:03 +000072 unsigned Discriminator;
73 llvm::DenseMap<const NamedDecl*, unsigned> Uniquifier;
74
Daniel Dunbar1b077112009-11-21 09:06:10 +000075public:
76 explicit MangleContext(ASTContext &Context)
Anders Carlssonb5404912009-10-07 01:06:45 +000077 : Context(Context) { }
Anders Carlssonb5404912009-10-07 01:06:45 +000078
Daniel Dunbar1b077112009-11-21 09:06:10 +000079 ASTContext &getASTContext() const { return Context; }
80
81 uint64_t getAnonymousStructId(const TagDecl *TD) {
82 std::pair<llvm::DenseMap<const TagDecl *,
83 uint64_t>::iterator, bool> Result =
84 AnonStructIds.insert(std::make_pair(TD, AnonStructIds.size()));
85 return Result.first->second;
86 }
87
88 /// @name Mangler Entry Points
89 /// @{
90
Daniel Dunbarf981bf82009-11-21 09:14:52 +000091 bool shouldMangleDeclName(const NamedDecl *D);
92
93 void mangleName(const NamedDecl *D, llvm::SmallVectorImpl<char> &);
Anders Carlssona94822e2009-11-26 02:32:05 +000094 void mangleThunk(const FunctionDecl *FD,
Anders Carlssonb73a5be2009-11-26 02:49:32 +000095 const ThunkAdjustment &ThisAdjustment,
Daniel Dunbar94fd26d2009-11-21 09:06:22 +000096 llvm::SmallVectorImpl<char> &);
Eli Friedman61d89b62009-12-03 00:03:05 +000097 void mangleCXXDtorThunk(const CXXDestructorDecl *D, CXXDtorType Type,
98 const ThunkAdjustment &ThisAdjustment,
99 llvm::SmallVectorImpl<char> &);
Anders Carlsson7622cd32009-11-26 03:09:37 +0000100 void mangleCovariantThunk(const FunctionDecl *FD,
101 const CovariantThunkAdjustment& Adjustment,
Daniel Dunbar94fd26d2009-11-21 09:06:22 +0000102 llvm::SmallVectorImpl<char> &);
103 void mangleGuardVariable(const VarDecl *D, llvm::SmallVectorImpl<char> &);
104 void mangleCXXVtable(const CXXRecordDecl *RD, llvm::SmallVectorImpl<char> &);
105 void mangleCXXVTT(const CXXRecordDecl *RD, llvm::SmallVectorImpl<char> &);
Daniel Dunbar1b077112009-11-21 09:06:10 +0000106 void mangleCXXCtorVtable(const CXXRecordDecl *RD, int64_t Offset,
Daniel Dunbar94fd26d2009-11-21 09:06:22 +0000107 const CXXRecordDecl *Type,
108 llvm::SmallVectorImpl<char> &);
Mike Stumpde050572009-12-02 18:57:08 +0000109 void mangleCXXRTTI(QualType T, llvm::SmallVectorImpl<char> &);
110 void mangleCXXRTTIName(QualType T, llvm::SmallVectorImpl<char> &);
Daniel Dunbar1b077112009-11-21 09:06:10 +0000111 void mangleCXXCtor(const CXXConstructorDecl *D, CXXCtorType Type,
Daniel Dunbar94fd26d2009-11-21 09:06:22 +0000112 llvm::SmallVectorImpl<char> &);
Daniel Dunbar1b077112009-11-21 09:06:10 +0000113 void mangleCXXDtor(const CXXDestructorDecl *D, CXXDtorType Type,
Daniel Dunbar94fd26d2009-11-21 09:06:22 +0000114 llvm::SmallVectorImpl<char> &);
Fariborz Jahanian4819ac42010-03-04 01:02:03 +0000115
116 void mangleInitDiscriminator() {
117 Discriminator = 0;
118 }
Daniel Dunbar1b077112009-11-21 09:06:10 +0000119
Fariborz Jahanian4819ac42010-03-04 01:02:03 +0000120 bool getNextDiscriminator(const NamedDecl *ND, unsigned &disc) {
121 unsigned &discriminator = Uniquifier[ND];
122 if (!discriminator)
123 discriminator = ++Discriminator;
124 if (discriminator == 1)
125 return false;
126 disc = discriminator-2;
127 return true;
128 }
Daniel Dunbar1b077112009-11-21 09:06:10 +0000129 /// @}
130};
Anders Carlssonb73a5be2009-11-26 02:49:32 +0000131
132}
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000133}
134
Mike Stump1eb44332009-09-09 15:08:12 +0000135#endif