CGCXX.cpp revision 8b2423361648c39a7d8a3c5e8129e12006deac32
1e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson//===--- CGDecl.cpp - Emit LLVM Code for declarations ---------------------===//
2e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson//
3e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson//                     The LLVM Compiler Infrastructure
4e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson//
5e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson// This file is distributed under the University of Illinois Open Source
6e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson// License. See LICENSE.TXT for details.
7e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson//
8e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson//===----------------------------------------------------------------------===//
9e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson//
10e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson// This contains code dealing with C++ code generation.
11e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson//
12e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson//===----------------------------------------------------------------------===//
13e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson
141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump// We might split this into multiple files if it gets too unwieldy
15e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson
16e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson#include "CodeGenFunction.h"
17e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson#include "CodeGenModule.h"
18283a062a633d6e868aa2be319da812341fe73728Anders Carlsson#include "Mangle.h"
19e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson#include "clang/AST/ASTContext.h"
20742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian#include "clang/AST/RecordLayout.h"
21e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson#include "clang/AST/Decl.h"
22774e7c6881ee6cb970cd42239d700dce87ed402aAnders Carlsson#include "clang/AST/DeclCXX.h"
2386e9644199d91a33d0090395395bc718bd3a4981Anders Carlsson#include "clang/AST/DeclObjC.h"
246815e941998659a55c20c147861b0f437928c3d8Anders Carlsson#include "clang/AST/StmtCXX.h"
25d46f98573ba104eda102dd3224b2dca69f1c6336John McCall#include "clang/CodeGen/CodeGenOptions.h"
26e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson#include "llvm/ADT/StringExtras.h"
27e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlssonusing namespace clang;
28e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlssonusing namespace CodeGen;
29e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson
30c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall/// Determines whether the given function has a trivial body that does
31c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall/// not require any specific codegen.
32c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCallstatic bool HasTrivialBody(const FunctionDecl *FD) {
33c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  Stmt *S = FD->getBody();
34c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  if (!S)
35c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    return true;
36c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  if (isa<CompoundStmt>(S) && cast<CompoundStmt>(S)->body_empty())
37c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    return true;
38c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  return false;
39c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall}
40c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall
41c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall/// Try to emit a base destructor as an alias to its primary
42c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall/// base-class destructor.
43c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCallbool CodeGenModule::TryEmitBaseDestructorAsAlias(const CXXDestructorDecl *D) {
44d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  if (!getCodeGenOpts().CXXCtorDtorAliases)
45d46f98573ba104eda102dd3224b2dca69f1c6336John McCall    return true;
46d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
47c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // If the destructor doesn't have a trivial body, we have to emit it
48c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // separately.
49c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  if (!HasTrivialBody(D))
50c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    return true;
51d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
52c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  const CXXRecordDecl *Class = D->getParent();
53c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall
54c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // If we need to manipulate a VTT parameter, give up.
55c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  if (Class->getNumVBases()) {
56c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    // Extra Credit:  passing extra parameters is perfectly safe
57c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    // in many calling conventions, so only bail out if the ctor's
58c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    // calling convention is nonstandard.
59c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    return true;
60c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  }
61c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall
62c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // If any fields have a non-trivial destructor, we have to emit it
63c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // separately.
64c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  for (CXXRecordDecl::field_iterator I = Class->field_begin(),
65c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall         E = Class->field_end(); I != E; ++I)
66c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    if (const RecordType *RT = (*I)->getType()->getAs<RecordType>())
67c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall      if (!cast<CXXRecordDecl>(RT->getDecl())->hasTrivialDestructor())
68c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall        return true;
69c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall
70c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // Try to find a unique base class with a non-trivial destructor.
71c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  const CXXRecordDecl *UniqueBase = 0;
72c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  for (CXXRecordDecl::base_class_const_iterator I = Class->bases_begin(),
73c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall         E = Class->bases_end(); I != E; ++I) {
74c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall
75c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    // We're in the base destructor, so skip virtual bases.
76c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    if (I->isVirtual()) continue;
77c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall
78c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    // Skip base classes with trivial destructors.
79c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    const CXXRecordDecl *Base
80c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall      = cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl());
81c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    if (Base->hasTrivialDestructor()) continue;
82c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall
83c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    // If we've already found a base class with a non-trivial
84c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    // destructor, give up.
85c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    if (UniqueBase) return true;
86c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    UniqueBase = Base;
87d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  }
88d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
89c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // If we didn't find any bases with a non-trivial destructor, then
90c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // the base destructor is actually effectively trivial, which can
91c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // happen if it was needlessly user-defined or if there are virtual
92c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // bases with non-trivial destructors.
93c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  if (!UniqueBase)
94c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    return true;
95c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall
969a70846c5ffd5ff5cce60de49cd7b312146bf502John McCall  /// If we don't have a definition for the destructor yet, don't
979a70846c5ffd5ff5cce60de49cd7b312146bf502John McCall  /// emit.  We can't emit aliases to declarations; that's just not
989a70846c5ffd5ff5cce60de49cd7b312146bf502John McCall  /// how aliases work.
999a70846c5ffd5ff5cce60de49cd7b312146bf502John McCall  const CXXDestructorDecl *BaseD = UniqueBase->getDestructor(getContext());
1009a70846c5ffd5ff5cce60de49cd7b312146bf502John McCall  if (!BaseD->isImplicit() && !BaseD->getBody())
1019a70846c5ffd5ff5cce60de49cd7b312146bf502John McCall    return true;
1029a70846c5ffd5ff5cce60de49cd7b312146bf502John McCall
103c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // If the base is at a non-zero offset, give up.
104c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  const ASTRecordLayout &ClassLayout = Context.getASTRecordLayout(Class);
105c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  if (ClassLayout.getBaseClassOffset(UniqueBase) != 0)
106c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    return true;
107c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall
108c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  return TryEmitDefinitionAsAlias(GlobalDecl(D, Dtor_Base),
109c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall                                  GlobalDecl(BaseD, Dtor_Base));
110c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall}
111c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall
112c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall/// Try to emit a definition as a global alias for another definition.
113c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCallbool CodeGenModule::TryEmitDefinitionAsAlias(GlobalDecl AliasDecl,
114c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall                                             GlobalDecl TargetDecl) {
115c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  if (!getCodeGenOpts().CXXCtorDtorAliases)
116c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    return true;
117c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall
118d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // The alias will use the linkage of the referrent.  If we can't
119d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // support aliases with that linkage, fail.
120d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  llvm::GlobalValue::LinkageTypes Linkage
121d46f98573ba104eda102dd3224b2dca69f1c6336John McCall    = getFunctionLinkage(cast<FunctionDecl>(AliasDecl.getDecl()));
122d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
123d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  switch (Linkage) {
124d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // We can definitely emit aliases to definitions with external linkage.
125d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  case llvm::GlobalValue::ExternalLinkage:
126d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  case llvm::GlobalValue::ExternalWeakLinkage:
127d46f98573ba104eda102dd3224b2dca69f1c6336John McCall    break;
128d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
129d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // Same with local linkage.
130d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  case llvm::GlobalValue::InternalLinkage:
131d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  case llvm::GlobalValue::PrivateLinkage:
132d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  case llvm::GlobalValue::LinkerPrivateLinkage:
133d46f98573ba104eda102dd3224b2dca69f1c6336John McCall    break;
134d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
135d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // We should try to support linkonce linkages.
136d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  case llvm::GlobalValue::LinkOnceAnyLinkage:
137d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  case llvm::GlobalValue::LinkOnceODRLinkage:
138d46f98573ba104eda102dd3224b2dca69f1c6336John McCall    return true;
139d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
140d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // Other linkages will probably never be supported.
141d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  default:
142d46f98573ba104eda102dd3224b2dca69f1c6336John McCall    return true;
143d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  }
144d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
145bc6afd158cc67b5f87dcc2d8efe2a2254af8debeRafael Espindola  llvm::GlobalValue::LinkageTypes TargetLinkage
146bc6afd158cc67b5f87dcc2d8efe2a2254af8debeRafael Espindola    = getFunctionLinkage(cast<FunctionDecl>(TargetDecl.getDecl()));
147bc6afd158cc67b5f87dcc2d8efe2a2254af8debeRafael Espindola
1483c15745b4baaa0c075418cfbe9f1be19c3a59c45Rafael Espindola  if (llvm::GlobalValue::isWeakForLinker(TargetLinkage))
149bc6afd158cc67b5f87dcc2d8efe2a2254af8debeRafael Espindola    return true;
150bc6afd158cc67b5f87dcc2d8efe2a2254af8debeRafael Espindola
151c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // Derive the type for the alias.
152c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  const llvm::PointerType *AliasType
153c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    = getTypes().GetFunctionType(AliasDecl)->getPointerTo();
154c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall
155c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // Find the referrent.  Some aliases might require a bitcast, in
156c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // which case the caller is responsible for ensuring the soundness
157c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // of these semantics.
158c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  llvm::GlobalValue *Ref = cast<llvm::GlobalValue>(GetAddrOfGlobal(TargetDecl));
159c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  llvm::Constant *Aliasee = Ref;
160c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  if (Ref->getType() != AliasType)
161c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    Aliasee = llvm::ConstantExpr::getBitCast(Ref, AliasType);
162c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall
163d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // Create the alias with no name.
164d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  llvm::GlobalAlias *Alias =
165c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    new llvm::GlobalAlias(AliasType, Linkage, "", Aliasee, &getModule());
166d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
1671962beee04d3635b12cf6254a53b40ec6c50098dJohn McCall  // Switch any previous uses to the alias.
168f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCall  MangleBuffer MangledName;
169f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCall  getMangledName(MangledName, AliasDecl);
170f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCall  llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
171d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  if (Entry) {
1721962beee04d3635b12cf6254a53b40ec6c50098dJohn McCall    assert(Entry->isDeclaration() && "definition already exists for alias");
1731962beee04d3635b12cf6254a53b40ec6c50098dJohn McCall    assert(Entry->getType() == AliasType &&
1741962beee04d3635b12cf6254a53b40ec6c50098dJohn McCall           "declaration exists with different type");
175f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCall    Alias->takeName(Entry);
176d46f98573ba104eda102dd3224b2dca69f1c6336John McCall    Entry->replaceAllUsesWith(Alias);
177d46f98573ba104eda102dd3224b2dca69f1c6336John McCall    Entry->eraseFromParent();
178f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCall  } else {
179f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCall    Alias->setName(MangledName.getString());
180d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  }
181d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
182d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // Finally, set up the alias with its proper name and attributes.
183d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  SetCommonAttributes(AliasDecl.getDecl(), Alias);
184d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
185d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  return false;
186d46f98573ba104eda102dd3224b2dca69f1c6336John McCall}
187b9de2c55b2a33776e2bee8ee57df7599b374c8a5Anders Carlsson
18895d4e5d2f87a0f07fb143ccb824dfc4c5c595c78Anders Carlssonvoid CodeGenModule::EmitCXXConstructors(const CXXConstructorDecl *D) {
189d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // The constructor used for constructing this as a complete class;
190d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // constucts the virtual bases, then calls the base constructor.
19192ac9ffecd236a6be0d6ab30cef56100e56b171cJohn McCall  EmitGlobal(GlobalDecl(D, Ctor_Complete));
192d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
193d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // The constructor used for constructing this as a base class;
194d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // ignores virtual bases.
1958e51a1f5da6ef4a1a168d14116c6eed3a578a263John McCall  EmitGlobal(GlobalDecl(D, Ctor_Base));
19695d4e5d2f87a0f07fb143ccb824dfc4c5c595c78Anders Carlsson}
197363c184139e26ea38223b477ad64ee67b22bb9a7Anders Carlsson
1981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid CodeGenModule::EmitCXXConstructor(const CXXConstructorDecl *D,
19927ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson                                       CXXCtorType Type) {
200d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // The complete constructor is equivalent to the base constructor
201d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // for classes with no virtual bases.  Try to emit it as an alias.
202d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  if (Type == Ctor_Complete &&
203d46f98573ba104eda102dd3224b2dca69f1c6336John McCall      !D->getParent()->getNumVBases() &&
204d46f98573ba104eda102dd3224b2dca69f1c6336John McCall      !TryEmitDefinitionAsAlias(GlobalDecl(D, Ctor_Complete),
205d46f98573ba104eda102dd3224b2dca69f1c6336John McCall                                GlobalDecl(D, Ctor_Base)))
206d46f98573ba104eda102dd3224b2dca69f1c6336John McCall    return;
2071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
208d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  llvm::Function *Fn = cast<llvm::Function>(GetAddrOfCXXConstructor(D, Type));
2098b2423361648c39a7d8a3c5e8129e12006deac32John McCall  setFunctionLinkage(D, Fn);
2101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2110ff8bafde95f6fa51ccea70738c1b99db870bddcAnders Carlsson  CodeGenFunction(*this).GenerateCode(GlobalDecl(D, Type), Fn);
2121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
21327ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson  SetFunctionDefinitionAttributes(D, Fn);
21427ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson  SetLLVMFunctionAttributesForDefinition(D, Fn);
21527ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson}
21627ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson
217d46f98573ba104eda102dd3224b2dca69f1c6336John McCallllvm::GlobalValue *
2181eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpCodeGenModule::GetAddrOfCXXConstructor(const CXXConstructorDecl *D,
219363c184139e26ea38223b477ad64ee67b22bb9a7Anders Carlsson                                       CXXCtorType Type) {
220f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCall  MangleBuffer Name;
221f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCall  getMangledCXXCtorName(Name, D, Type);
222f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCall  if (llvm::GlobalValue *V = GetGlobalValue(Name))
223d46f98573ba104eda102dd3224b2dca69f1c6336John McCall    return V;
224d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
22530509a30a9a6ac9ee737e5cf39744a92170d7ea4Fariborz Jahanian  const FunctionProtoType *FPT = D->getType()->getAs<FunctionProtoType>();
226363c184139e26ea38223b477ad64ee67b22bb9a7Anders Carlsson  const llvm::FunctionType *FTy =
227f6c56e2323c3f973253805a2f35629f3253ebed4Anders Carlsson    getTypes().GetFunctionType(getTypes().getFunctionInfo(D, Type),
22830509a30a9a6ac9ee737e5cf39744a92170d7ea4Fariborz Jahanian                               FPT->isVariadic());
229b4880bab7fc1b61267cfd9a0ad52188e7a828cb3Chris Lattner  return cast<llvm::Function>(
230b4880bab7fc1b61267cfd9a0ad52188e7a828cb3Chris Lattner                      GetOrCreateLLVMFunction(Name, FTy, GlobalDecl(D, Type)));
231363c184139e26ea38223b477ad64ee67b22bb9a7Anders Carlsson}
23227ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson
233f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCallvoid CodeGenModule::getMangledCXXCtorName(MangleBuffer &Name,
234f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCall                                          const CXXConstructorDecl *D,
235f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCall                                          CXXCtorType Type) {
236f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCall  getMangleContext().mangleCXXCtor(D, Type, Name.getBuffer());
23727ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson}
23827ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson
23927ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlssonvoid CodeGenModule::EmitCXXDestructors(const CXXDestructorDecl *D) {
240d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // The destructor in a virtual table is always a 'deleting'
241d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // destructor, which calls the complete destructor and then uses the
242d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // appropriate operator delete.
243ea9a20834cf9311fdf758cfbd73b8daa8e655f15Eli Friedman  if (D->isVirtual())
244624c7d704dc9f1dbb5dd3e5a0ef7eacfb3b699e2Eli Friedman    EmitGlobal(GlobalDecl(D, Dtor_Deleting));
245d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
246d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // The destructor used for destructing this as a most-derived class;
247d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // call the base destructor and then destructs any virtual bases.
2488e51a1f5da6ef4a1a168d14116c6eed3a578a263John McCall  EmitGlobal(GlobalDecl(D, Dtor_Complete));
249d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
250d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // The destructor used for destructing this as a base class; ignores
251d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // virtual bases.
2528e51a1f5da6ef4a1a168d14116c6eed3a578a263John McCall  EmitGlobal(GlobalDecl(D, Dtor_Base));
25327ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson}
25427ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson
2551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid CodeGenModule::EmitCXXDestructor(const CXXDestructorDecl *D,
25627ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson                                      CXXDtorType Type) {
257d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // The complete destructor is equivalent to the base destructor for
258d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // classes with no virtual bases, so try to emit it as an alias.
259d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  if (Type == Dtor_Complete &&
260d46f98573ba104eda102dd3224b2dca69f1c6336John McCall      !D->getParent()->getNumVBases() &&
261d46f98573ba104eda102dd3224b2dca69f1c6336John McCall      !TryEmitDefinitionAsAlias(GlobalDecl(D, Dtor_Complete),
262d46f98573ba104eda102dd3224b2dca69f1c6336John McCall                                GlobalDecl(D, Dtor_Base)))
263d46f98573ba104eda102dd3224b2dca69f1c6336John McCall    return;
264d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
265c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // The base destructor is equivalent to the base destructor of its
266c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // base class if there is exactly one non-virtual base class with a
267c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // non-trivial destructor, there are no fields with a non-trivial
268c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // destructor, and the body of the destructor is trivial.
269c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  if (Type == Dtor_Base && !TryEmitBaseDestructorAsAlias(D))
270c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    return;
271c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall
272d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  llvm::Function *Fn = cast<llvm::Function>(GetAddrOfCXXDestructor(D, Type));
2738b2423361648c39a7d8a3c5e8129e12006deac32John McCall  setFunctionLinkage(D, Fn);
2741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2750ff8bafde95f6fa51ccea70738c1b99db870bddcAnders Carlsson  CodeGenFunction(*this).GenerateCode(GlobalDecl(D, Type), Fn);
2761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27727ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson  SetFunctionDefinitionAttributes(D, Fn);
27827ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson  SetLLVMFunctionAttributesForDefinition(D, Fn);
27927ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson}
28027ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson
281d46f98573ba104eda102dd3224b2dca69f1c6336John McCallllvm::GlobalValue *
2821eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpCodeGenModule::GetAddrOfCXXDestructor(const CXXDestructorDecl *D,
28327ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson                                      CXXDtorType Type) {
284f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCall  MangleBuffer Name;
285f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCall  getMangledCXXDtorName(Name, D, Type);
286f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCall  if (llvm::GlobalValue *V = GetGlobalValue(Name))
287d46f98573ba104eda102dd3224b2dca69f1c6336John McCall    return V;
288d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
28927ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson  const llvm::FunctionType *FTy =
290f6c56e2323c3f973253805a2f35629f3253ebed4Anders Carlsson    getTypes().GetFunctionType(getTypes().getFunctionInfo(D, Type), false);
2911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
292b4880bab7fc1b61267cfd9a0ad52188e7a828cb3Chris Lattner  return cast<llvm::Function>(
293b4880bab7fc1b61267cfd9a0ad52188e7a828cb3Chris Lattner                      GetOrCreateLLVMFunction(Name, FTy, GlobalDecl(D, Type)));
29427ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson}
29527ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson
296f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCallvoid CodeGenModule::getMangledCXXDtorName(MangleBuffer &Name,
297f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCall                                          const CXXDestructorDecl *D,
298f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCall                                          CXXDtorType Type) {
299f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCall  getMangleContext().mangleCXXDtor(D, Type, Name.getBuffer());
30027ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson}
301e7d346b6d5cee14b75e34928b3fd423f21d8d80dFariborz Jahanian
302046c294a43024874ff35656c6e785b64e72f1f36Anders Carlssonstatic llvm::Value *BuildVirtualCall(CodeGenFunction &CGF, uint64_t VTableIndex,
303566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson                                     llvm::Value *This, const llvm::Type *Ty) {
304566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson  Ty = Ty->getPointerTo()->getPointerTo()->getPointerTo();
305566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson
306046c294a43024874ff35656c6e785b64e72f1f36Anders Carlsson  llvm::Value *VTable = CGF.Builder.CreateBitCast(This, Ty);
307046c294a43024874ff35656c6e785b64e72f1f36Anders Carlsson  VTable = CGF.Builder.CreateLoad(VTable);
308566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson
309566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson  llvm::Value *VFuncPtr =
310046c294a43024874ff35656c6e785b64e72f1f36Anders Carlsson    CGF.Builder.CreateConstInBoundsGEP1_64(VTable, VTableIndex, "vfn");
311566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson  return CGF.Builder.CreateLoad(VFuncPtr);
312566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson}
313566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson
3142f1986b557fa671c4f8c9dd0d071398edfc073d5Anders Carlssonllvm::Value *
315566abee1e9828a7700b51e4d17ea08234fde3bb4Anders CarlssonCodeGenFunction::BuildVirtualCall(const CXXMethodDecl *MD, llvm::Value *This,
316f0070dbae9535836ad41711081465dec2259786bMike Stump                                  const llvm::Type *Ty) {
317566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson  MD = MD->getCanonicalDecl();
318046c294a43024874ff35656c6e785b64e72f1f36Anders Carlsson  uint64_t VTableIndex = CGM.getVTables().getMethodVTableIndex(MD);
3192b3583573ba6b26b605aacaad9a50492fb3d6fe6Anders Carlsson
320af4403545a50a60d208e6fcae057308d576a92e0Anders Carlsson  return ::BuildVirtualCall(*this, VTableIndex, This, Ty);
321566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson}
322566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson
323566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlssonllvm::Value *
324566abee1e9828a7700b51e4d17ea08234fde3bb4Anders CarlssonCodeGenFunction::BuildVirtualCall(const CXXDestructorDecl *DD, CXXDtorType Type,
325566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson                                  llvm::Value *&This, const llvm::Type *Ty) {
326566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson  DD = cast<CXXDestructorDecl>(DD->getCanonicalDecl());
327af4403545a50a60d208e6fcae057308d576a92e0Anders Carlsson  uint64_t VTableIndex =
328046c294a43024874ff35656c6e785b64e72f1f36Anders Carlsson    CGM.getVTables().getMethodVTableIndex(GlobalDecl(DD, Type));
329566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson
330af4403545a50a60d208e6fcae057308d576a92e0Anders Carlsson  return ::BuildVirtualCall(*this, VTableIndex, This, Ty);
331f0070dbae9535836ad41711081465dec2259786bMike Stump}
332