blob: f05220c38b26067763f80ba0f9a12965197ac28f [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 {
26 class raw_ostream;
27}
28
29namespace clang {
30 class ASTContext;
Anders Carlsson3ac86b52009-04-15 05:36:58 +000031 class CXXConstructorDecl;
Anders Carlsson27ae5362009-04-17 01:58:57 +000032 class CXXDestructorDecl;
Mike Stumpdec025b2009-09-07 04:27:52 +000033 class FunctionDecl;
Douglas Gregor5f2bfd42009-02-13 00:10:09 +000034 class NamedDecl;
Anders Carlsson41aa8c12009-04-13 18:02:10 +000035 class VarDecl;
Mike Stump1eb44332009-09-09 15:08:12 +000036
Anders Carlssonb5404912009-10-07 01:06:45 +000037 class MangleContext {
38 ASTContext &Context;
Anders Carlssonc4355b62009-10-07 01:45:02 +000039
40 llvm::DenseMap<const TagDecl *, uint64_t> AnonStructIds;
41
Anders Carlssonb5404912009-10-07 01:06:45 +000042 public:
43 explicit MangleContext(ASTContext &Context)
44 : Context(Context) { }
45
46 ASTContext &getASTContext() const { return Context; }
Anders Carlssonc4355b62009-10-07 01:45:02 +000047
48 uint64_t getAnonymousStructId(const TagDecl *TD) {
49 std::pair<llvm::DenseMap<const TagDecl *,
50 uint64_t>::iterator, bool> Result =
51 AnonStructIds.insert(std::make_pair(TD, AnonStructIds.size()));
52 return Result.first->second;
53 }
Anders Carlssonb5404912009-10-07 01:06:45 +000054 };
55
56 bool mangleName(MangleContext &Context, const NamedDecl *D,
Douglas Gregor5f2bfd42009-02-13 00:10:09 +000057 llvm::raw_ostream &os);
Anders Carlssonb5404912009-10-07 01:06:45 +000058 void mangleThunk(MangleContext &Context, const FunctionDecl *FD,
59 int64_t n, int64_t vn, llvm::raw_ostream &os);
60 void mangleCovariantThunk(MangleContext &Context, const FunctionDecl *FD,
61 int64_t nv_t, int64_t v_t,
62 int64_t nv_r, int64_t v_r,
Mike Stump6e319f62009-09-11 23:25:56 +000063 llvm::raw_ostream &os);
Anders Carlssonb5404912009-10-07 01:06:45 +000064 void mangleGuardVariable(MangleContext &Context, const VarDecl *D,
Anders Carlsson41aa8c12009-04-13 18:02:10 +000065 llvm::raw_ostream &os);
Anders Carlssonb5404912009-10-07 01:06:45 +000066 void mangleCXXVtable(MangleContext &Context, QualType T, llvm::raw_ostream &os);
67 void mangleCXXRtti(MangleContext &Context, QualType T, llvm::raw_ostream &os);
68 void mangleCXXCtor(MangleContext &Context, const CXXConstructorDecl *D,
69 CXXCtorType Type, llvm::raw_ostream &os);
70 void mangleCXXDtor(MangleContext &Context, const CXXDestructorDecl *D,
71 CXXDtorType Type, llvm::raw_ostream &os);
Douglas Gregor5f2bfd42009-02-13 00:10:09 +000072}
73
Mike Stump1eb44332009-09-09 15:08:12 +000074#endif