blob: 97f94b69b432f97fd11681e595c623269f387460 [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"
Anders Carlsson3ac86b52009-04-15 05:36:58 +000024
Douglas Gregor5f2bfd42009-02-13 00:10:09 +000025namespace llvm {
Anders Carlssonb73a5be2009-11-26 02:49:32 +000026 template<typename T> class SmallVectorImpl;
Douglas Gregor5f2bfd42009-02-13 00:10:09 +000027}
28
29namespace clang {
Anders Carlssonb73a5be2009-11-26 02:49:32 +000030 class ASTContext;
31 class CXXConstructorDecl;
32 class CXXDestructorDecl;
33 class FunctionDecl;
34 class NamedDecl;
35 class VarDecl;
Mike Stump1eb44332009-09-09 15:08:12 +000036
Anders Carlssonb73a5be2009-11-26 02:49:32 +000037namespace CodeGen {
Anders Carlsson7622cd32009-11-26 03:09:37 +000038 class CovariantThunkAdjustment;
Anders Carlssonb73a5be2009-11-26 02:49:32 +000039 class ThunkAdjustment;
40
Daniel Dunbar1b077112009-11-21 09:06:10 +000041/// MangleContext - Context for tracking state which persists across multiple
42/// calls to the C++ name mangler.
43class MangleContext {
44 ASTContext &Context;
Anders Carlssonc4355b62009-10-07 01:45:02 +000045
Daniel Dunbar1b077112009-11-21 09:06:10 +000046 llvm::DenseMap<const TagDecl *, uint64_t> AnonStructIds;
Fariborz Jahanian4819ac42010-03-04 01:02:03 +000047 unsigned Discriminator;
48 llvm::DenseMap<const NamedDecl*, unsigned> Uniquifier;
49
Daniel Dunbar1b077112009-11-21 09:06:10 +000050public:
51 explicit MangleContext(ASTContext &Context)
Anders Carlssonb5404912009-10-07 01:06:45 +000052 : Context(Context) { }
Anders Carlssonb5404912009-10-07 01:06:45 +000053
Daniel Dunbar1b077112009-11-21 09:06:10 +000054 ASTContext &getASTContext() const { return Context; }
55
56 uint64_t getAnonymousStructId(const TagDecl *TD) {
57 std::pair<llvm::DenseMap<const TagDecl *,
58 uint64_t>::iterator, bool> Result =
59 AnonStructIds.insert(std::make_pair(TD, AnonStructIds.size()));
60 return Result.first->second;
61 }
62
63 /// @name Mangler Entry Points
64 /// @{
65
Daniel Dunbarf981bf82009-11-21 09:14:52 +000066 bool shouldMangleDeclName(const NamedDecl *D);
67
68 void mangleName(const NamedDecl *D, llvm::SmallVectorImpl<char> &);
Anders Carlssona94822e2009-11-26 02:32:05 +000069 void mangleThunk(const FunctionDecl *FD,
Anders Carlssonb73a5be2009-11-26 02:49:32 +000070 const ThunkAdjustment &ThisAdjustment,
Daniel Dunbar94fd26d2009-11-21 09:06:22 +000071 llvm::SmallVectorImpl<char> &);
Eli Friedman61d89b62009-12-03 00:03:05 +000072 void mangleCXXDtorThunk(const CXXDestructorDecl *D, CXXDtorType Type,
73 const ThunkAdjustment &ThisAdjustment,
74 llvm::SmallVectorImpl<char> &);
Anders Carlsson7622cd32009-11-26 03:09:37 +000075 void mangleCovariantThunk(const FunctionDecl *FD,
76 const CovariantThunkAdjustment& Adjustment,
Daniel Dunbar94fd26d2009-11-21 09:06:22 +000077 llvm::SmallVectorImpl<char> &);
78 void mangleGuardVariable(const VarDecl *D, llvm::SmallVectorImpl<char> &);
79 void mangleCXXVtable(const CXXRecordDecl *RD, llvm::SmallVectorImpl<char> &);
80 void mangleCXXVTT(const CXXRecordDecl *RD, llvm::SmallVectorImpl<char> &);
Daniel Dunbar1b077112009-11-21 09:06:10 +000081 void mangleCXXCtorVtable(const CXXRecordDecl *RD, int64_t Offset,
Daniel Dunbar94fd26d2009-11-21 09:06:22 +000082 const CXXRecordDecl *Type,
83 llvm::SmallVectorImpl<char> &);
Mike Stumpde050572009-12-02 18:57:08 +000084 void mangleCXXRTTI(QualType T, llvm::SmallVectorImpl<char> &);
85 void mangleCXXRTTIName(QualType T, llvm::SmallVectorImpl<char> &);
Daniel Dunbar1b077112009-11-21 09:06:10 +000086 void mangleCXXCtor(const CXXConstructorDecl *D, CXXCtorType Type,
Daniel Dunbar94fd26d2009-11-21 09:06:22 +000087 llvm::SmallVectorImpl<char> &);
Daniel Dunbar1b077112009-11-21 09:06:10 +000088 void mangleCXXDtor(const CXXDestructorDecl *D, CXXDtorType Type,
Daniel Dunbar94fd26d2009-11-21 09:06:22 +000089 llvm::SmallVectorImpl<char> &);
Fariborz Jahanian4819ac42010-03-04 01:02:03 +000090
91 void mangleInitDiscriminator() {
92 Discriminator = 0;
93 }
Daniel Dunbar1b077112009-11-21 09:06:10 +000094
Fariborz Jahanian4819ac42010-03-04 01:02:03 +000095 bool getNextDiscriminator(const NamedDecl *ND, unsigned &disc) {
96 unsigned &discriminator = Uniquifier[ND];
97 if (!discriminator)
98 discriminator = ++Discriminator;
99 if (discriminator == 1)
100 return false;
101 disc = discriminator-2;
102 return true;
103 }
Daniel Dunbar1b077112009-11-21 09:06:10 +0000104 /// @}
105};
Anders Carlssonb73a5be2009-11-26 02:49:32 +0000106
107}
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000108}
109
Mike Stump1eb44332009-09-09 15:08:12 +0000110#endif