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)