Mangle.h revision 651f13cea278ec967336033dd032faef0e9fc2ec
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//===--- Mangle.h - Mangle C++ Names ----------------------------*- C++ -*-===//
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//                     The LLVM Compiler Infrastructure
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This file is distributed under the University of Illinois Open Source
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// License. See LICENSE.TXT for details.
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//===----------------------------------------------------------------------===//
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Defines the C++ name mangling interface.
111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)//
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//===----------------------------------------------------------------------===//
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef LLVM_CLANG_AST_MANGLE_H
1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#define LLVM_CLANG_AST_MANGLE_H
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "clang/AST/Type.h"
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "clang/Basic/ABI.h"
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "llvm/ADT/DenseMap.h"
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "llvm/ADT/SmallString.h"
210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "llvm/ADT/StringRef.h"
220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "llvm/Support/Casting.h"
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "llvm/Support/raw_ostream.h"
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace clang {
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  class ASTContext;
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  class BlockDecl;
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  class CXXConstructorDecl;
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  class CXXDestructorDecl;
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  class CXXMethodDecl;
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  class FunctionDecl;
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  class NamedDecl;
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  class ObjCMethodDecl;
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  class StringLiteral;
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  struct ThisAdjustment;
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  struct ThunkInfo;
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  class VarDecl;
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/// MangleBuffer - a convenient class for storing a name which is
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/// either the result of a mangling or is a constant string with
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/// external memory ownership.
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class MangleBuffer {
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)public:
440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void setString(StringRef Ref) {
450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    String = Ref;
460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
48558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SmallVectorImpl<char> &getBuffer() {
49558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return Buffer;
50558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
51558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
52558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  StringRef getString() const {
53558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    if (!String.empty()) return String;
540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return Buffer.str();
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  operator StringRef() const {
581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return getString();
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)private:
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  StringRef String;
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SmallString<256> Buffer;
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/// MangleContext - Context for tracking state which persists across multiple
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/// calls to the C++ name mangler.
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class MangleContext {
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)public:
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  enum ManglerKind {
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    MK_Itanium,
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    MK_Microsoft
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)private:
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void anchor();
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASTContext &Context;
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DiagnosticsEngine &Diags;
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const ManglerKind Kind;
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  llvm::DenseMap<const BlockDecl*, unsigned> GlobalBlockIds;
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  llvm::DenseMap<const BlockDecl*, unsigned> LocalBlockIds;
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  llvm::DenseMap<const TagDecl*, uint64_t> AnonStructIds;
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)public:
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ManglerKind getKind() const { return Kind; }
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  explicit MangleContext(ASTContext &Context,
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         DiagnosticsEngine &Diags,
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         ManglerKind Kind)
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : Context(Context), Diags(Diags), Kind(Kind) {}
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~MangleContext() { }
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASTContext &getASTContext() const { return Context; }
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DiagnosticsEngine &getDiags() const { return Diags; }
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void startNewFunction() { LocalBlockIds.clear(); }
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  unsigned getBlockId(const BlockDecl *BD, bool Local) {
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    llvm::DenseMap<const BlockDecl *, unsigned> &BlockIds
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      = Local? LocalBlockIds : GlobalBlockIds;
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::pair<llvm::DenseMap<const BlockDecl *, unsigned>::iterator, bool>
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      Result = BlockIds.insert(std::make_pair(BD, BlockIds.size()));
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return Result.first->second;
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  uint64_t getAnonymousStructId(const TagDecl *TD) {
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::pair<llvm::DenseMap<const TagDecl *, uint64_t>::iterator, bool>
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        Result = AnonStructIds.insert(std::make_pair(TD, AnonStructIds.size()));
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return Result.first->second;
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// @name Mangler Entry Points
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// @{
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool shouldMangleDeclName(const NamedDecl *D);
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool shouldMangleCXXName(const NamedDecl *D) = 0;
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool shouldMangleStringLiteral(const StringLiteral *SL) = 0;
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // FIXME: consider replacing raw_ostream & with something like SmallString &.
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void mangleName(const NamedDecl *D, raw_ostream &);
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void mangleCXXName(const NamedDecl *D, raw_ostream &) = 0;
12668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void mangleThunk(const CXXMethodDecl *MD,
12768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                          const ThunkInfo &Thunk,
12868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                          raw_ostream &) = 0;
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void mangleCXXDtorThunk(const CXXDestructorDecl *DD, CXXDtorType Type,
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  const ThisAdjustment &ThisAdjustment,
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  raw_ostream &) = 0;
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void mangleReferenceTemporary(const VarDecl *D,
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                        raw_ostream &) = 0;
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void mangleCXXRTTI(QualType T, raw_ostream &) = 0;
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void mangleCXXRTTIName(QualType T, raw_ostream &) = 0;
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void mangleCXXCtor(const CXXConstructorDecl *D, CXXCtorType Type,
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             raw_ostream &) = 0;
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void mangleCXXDtor(const CXXDestructorDecl *D, CXXDtorType Type,
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             raw_ostream &) = 0;
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void mangleStringLiteral(const StringLiteral *SL, raw_ostream &) = 0;
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void mangleGlobalBlock(const BlockDecl *BD,
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         const NamedDecl *ID,
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         raw_ostream &Out);
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void mangleCtorBlock(const CXXConstructorDecl *CD, CXXCtorType CT,
1467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                       const BlockDecl *BD, raw_ostream &Out);
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void mangleDtorBlock(const CXXDestructorDecl *CD, CXXDtorType DT,
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       const BlockDecl *BD, raw_ostream &Out);
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void mangleBlock(const DeclContext *DC, const BlockDecl *BD,
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   raw_ostream &Out);
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void mangleObjCMethodName(const ObjCMethodDecl *MD, raw_ostream &);
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void mangleStaticGuardVariable(const VarDecl *D, raw_ostream &) = 0;
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void mangleDynamicInitializer(const VarDecl *D, raw_ostream &) = 0;
1570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void mangleDynamicAtExitDestructor(const VarDecl *D,
1597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                             raw_ostream &) = 0;
1600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// Generates a unique string for an externally visible type for use with TBAA
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// or type uniquing.
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// TODO: Extend this to internal types by generating names that are unique
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// across translation units so it can be used with LTO.
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void mangleTypeName(QualType T, raw_ostream &) = 0;
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// @}
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class ItaniumMangleContext : public MangleContext {
1710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochpublic:
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  explicit ItaniumMangleContext(ASTContext &C, DiagnosticsEngine &D)
1730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      : MangleContext(C, D, MK_Itanium) {}
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual void mangleCXXVTable(const CXXRecordDecl *RD, raw_ostream &) = 0;
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void mangleCXXVTT(const CXXRecordDecl *RD, raw_ostream &) = 0;
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void mangleCXXCtorVTable(const CXXRecordDecl *RD, int64_t Offset,
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   const CXXRecordDecl *Type,
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   raw_ostream &) = 0;
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void mangleItaniumThreadLocalInit(const VarDecl *D,
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                            raw_ostream &) = 0;
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void mangleItaniumThreadLocalWrapper(const VarDecl *D,
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                               raw_ostream &) = 0;
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static bool classof(const MangleContext *C) {
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return C->getKind() == MK_Itanium;
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static ItaniumMangleContext *create(ASTContext &Context,
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      DiagnosticsEngine &Diags);
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class MicrosoftMangleContext : public MangleContext {
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)public:
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  explicit MicrosoftMangleContext(ASTContext &C, DiagnosticsEngine &D)
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : MangleContext(C, D, MK_Microsoft) {}
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// \brief Mangle vftable symbols.  Only a subset of the bases along the path
19923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  /// to the vftable are included in the name.  It's up to the caller to pick
20023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  /// them correctly.
20123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  virtual void mangleCXXVFTable(const CXXRecordDecl *Derived,
20223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                ArrayRef<const CXXRecordDecl *> BasePath,
20323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                raw_ostream &Out) = 0;
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// \brief Mangle vbtable symbols.  Only a subset of the bases along the path
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// to the vbtable are included in the name.  It's up to the caller to pick
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// them correctly.
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void mangleCXXVBTable(const CXXRecordDecl *Derived,
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                ArrayRef<const CXXRecordDecl *> BasePath,
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                raw_ostream &Out) = 0;
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void mangleVirtualMemPtrThunk(const CXXMethodDecl *MD,
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                        raw_ostream &) = 0;
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static bool classof(const MangleContext *C) {
2163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return C->getKind() == MK_Microsoft;
2173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
2183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  static MicrosoftMangleContext *create(ASTContext &Context,
220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                        DiagnosticsEngine &Diags);
221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
225f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)