CGCXX.cpp revision 771c678c04f5f685b4f188ec6c2fd88ad0f7457f
1daaf1de7c5f975b77798c551aaefeb36349e5ca7Devang Patel//===--- CGCXX.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
163a811f1f4286ee3fd0c563c1cfe623956f3caa24Charles Davis#include "CGCXXABI.h"
17e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson#include "CodeGenFunction.h"
18e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson#include "CodeGenModule.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"
2414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne#include "clang/AST/Mangle.h"
256815e941998659a55c20c147861b0f437928c3d8Anders Carlsson#include "clang/AST/StmtCXX.h"
2606057cef0bcd7804e80f3ce2bbe352178396c715Chandler Carruth#include "clang/Frontend/CodeGenOptions.h"
27e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson#include "llvm/ADT/StringExtras.h"
28e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlssonusing namespace clang;
29e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlssonusing namespace CodeGen;
30e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson
31c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall/// Determines whether the given function has a trivial body that does
32c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall/// not require any specific codegen.
33c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCallstatic bool HasTrivialBody(const FunctionDecl *FD) {
34c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  Stmt *S = FD->getBody();
35c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  if (!S)
36c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    return true;
37c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  if (isa<CompoundStmt>(S) && cast<CompoundStmt>(S)->body_empty())
38c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    return true;
39c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  return false;
40c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall}
41c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall
42c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall/// Try to emit a base destructor as an alias to its primary
43c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall/// base-class destructor.
44c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCallbool CodeGenModule::TryEmitBaseDestructorAsAlias(const CXXDestructorDecl *D) {
45d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  if (!getCodeGenOpts().CXXCtorDtorAliases)
46d46f98573ba104eda102dd3224b2dca69f1c6336John McCall    return true;
47d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
48c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // If the destructor doesn't have a trivial body, we have to emit it
49c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // separately.
50c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  if (!HasTrivialBody(D))
51c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    return true;
52d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
53c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  const CXXRecordDecl *Class = D->getParent();
54c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall
55c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // If we need to manipulate a VTT parameter, give up.
56c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  if (Class->getNumVBases()) {
57c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    // Extra Credit:  passing extra parameters is perfectly safe
58c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    // in many calling conventions, so only bail out if the ctor's
59c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    // calling convention is nonstandard.
60c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    return true;
61c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  }
62c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall
63c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // If any fields have a non-trivial destructor, we have to emit it
64c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // separately.
65c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  for (CXXRecordDecl::field_iterator I = Class->field_begin(),
66c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall         E = Class->field_end(); I != E; ++I)
67c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    if (const RecordType *RT = (*I)->getType()->getAs<RecordType>())
68c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall      if (!cast<CXXRecordDecl>(RT->getDecl())->hasTrivialDestructor())
69c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall        return true;
70c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall
71c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // Try to find a unique base class with a non-trivial destructor.
72c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  const CXXRecordDecl *UniqueBase = 0;
73c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  for (CXXRecordDecl::base_class_const_iterator I = Class->bases_begin(),
74c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall         E = Class->bases_end(); I != E; ++I) {
75c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall
76c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    // We're in the base destructor, so skip virtual bases.
77c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    if (I->isVirtual()) continue;
78c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall
79c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    // Skip base classes with trivial destructors.
80c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    const CXXRecordDecl *Base
81c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall      = cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl());
82c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    if (Base->hasTrivialDestructor()) continue;
83c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall
84c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    // If we've already found a base class with a non-trivial
85c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    // destructor, give up.
86c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    if (UniqueBase) return true;
87c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    UniqueBase = Base;
88d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  }
89d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
90c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // If we didn't find any bases with a non-trivial destructor, then
91c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // the base destructor is actually effectively trivial, which can
92c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // happen if it was needlessly user-defined or if there are virtual
93c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // bases with non-trivial destructors.
94c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  if (!UniqueBase)
95c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    return true;
96c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall
979a70846c5ffd5ff5cce60de49cd7b312146bf502John McCall  /// If we don't have a definition for the destructor yet, don't
989a70846c5ffd5ff5cce60de49cd7b312146bf502John McCall  /// emit.  We can't emit aliases to declarations; that's just not
999a70846c5ffd5ff5cce60de49cd7b312146bf502John McCall  /// how aliases work.
1001d110e05e0ff48c1c7a483d6b7fd094cdf28316aDouglas Gregor  const CXXDestructorDecl *BaseD = UniqueBase->getDestructor();
10106a54a38be5054c910ffc92db60edab23f9ea105Argyrios Kyrtzidis  if (!BaseD->isImplicit() && !BaseD->hasBody())
1029a70846c5ffd5ff5cce60de49cd7b312146bf502John McCall    return true;
1039a70846c5ffd5ff5cce60de49cd7b312146bf502John McCall
104c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // If the base is at a non-zero offset, give up.
105c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  const ASTRecordLayout &ClassLayout = Context.getASTRecordLayout(Class);
106a14f5979572aa25c03d24750ee4724d2031d4edeAnders Carlsson  if (ClassLayout.getBaseClassOffsetInBits(UniqueBase) != 0)
107c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    return true;
108c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall
109c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  return TryEmitDefinitionAsAlias(GlobalDecl(D, Dtor_Base),
110c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall                                  GlobalDecl(BaseD, Dtor_Base));
111c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall}
112c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall
113c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall/// Try to emit a definition as a global alias for another definition.
114c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCallbool CodeGenModule::TryEmitDefinitionAsAlias(GlobalDecl AliasDecl,
115c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall                                             GlobalDecl TargetDecl) {
116c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  if (!getCodeGenOpts().CXXCtorDtorAliases)
117c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    return true;
118c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall
119d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // The alias will use the linkage of the referrent.  If we can't
120d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // support aliases with that linkage, fail.
121d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  llvm::GlobalValue::LinkageTypes Linkage
122d46f98573ba104eda102dd3224b2dca69f1c6336John McCall    = getFunctionLinkage(cast<FunctionDecl>(AliasDecl.getDecl()));
123d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
124d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  switch (Linkage) {
125d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // We can definitely emit aliases to definitions with external linkage.
126d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  case llvm::GlobalValue::ExternalLinkage:
127d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  case llvm::GlobalValue::ExternalWeakLinkage:
128d46f98573ba104eda102dd3224b2dca69f1c6336John McCall    break;
129d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
130d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // Same with local linkage.
131d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  case llvm::GlobalValue::InternalLinkage:
132d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  case llvm::GlobalValue::PrivateLinkage:
133d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  case llvm::GlobalValue::LinkerPrivateLinkage:
134d46f98573ba104eda102dd3224b2dca69f1c6336John McCall    break;
135d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
136d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // We should try to support linkonce linkages.
137d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  case llvm::GlobalValue::LinkOnceAnyLinkage:
138d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  case llvm::GlobalValue::LinkOnceODRLinkage:
139d46f98573ba104eda102dd3224b2dca69f1c6336John McCall    return true;
140d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
141d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // Other linkages will probably never be supported.
142d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  default:
143d46f98573ba104eda102dd3224b2dca69f1c6336John McCall    return true;
144d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  }
145d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
146bc6afd158cc67b5f87dcc2d8efe2a2254af8debeRafael Espindola  llvm::GlobalValue::LinkageTypes TargetLinkage
147bc6afd158cc67b5f87dcc2d8efe2a2254af8debeRafael Espindola    = getFunctionLinkage(cast<FunctionDecl>(TargetDecl.getDecl()));
148bc6afd158cc67b5f87dcc2d8efe2a2254af8debeRafael Espindola
1493c15745b4baaa0c075418cfbe9f1be19c3a59c45Rafael Espindola  if (llvm::GlobalValue::isWeakForLinker(TargetLinkage))
150bc6afd158cc67b5f87dcc2d8efe2a2254af8debeRafael Espindola    return true;
151bc6afd158cc67b5f87dcc2d8efe2a2254af8debeRafael Espindola
152c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // Derive the type for the alias.
153c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  const llvm::PointerType *AliasType
154c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    = getTypes().GetFunctionType(AliasDecl)->getPointerTo();
155c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall
156c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // Find the referrent.  Some aliases might require a bitcast, in
157c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // which case the caller is responsible for ensuring the soundness
158c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // of these semantics.
159c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  llvm::GlobalValue *Ref = cast<llvm::GlobalValue>(GetAddrOfGlobal(TargetDecl));
160c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  llvm::Constant *Aliasee = Ref;
161c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  if (Ref->getType() != AliasType)
162c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    Aliasee = llvm::ConstantExpr::getBitCast(Ref, AliasType);
163c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall
164d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // Create the alias with no name.
165d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  llvm::GlobalAlias *Alias =
166c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    new llvm::GlobalAlias(AliasType, Linkage, "", Aliasee, &getModule());
167d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
1681962beee04d3635b12cf6254a53b40ec6c50098dJohn McCall  // Switch any previous uses to the alias.
1699a20d55807cc2f6534a9c51a46cc8143ed16786dAnders Carlsson  llvm::StringRef MangledName = getMangledName(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 {
1799a20d55807cc2f6534a9c51a46cc8143ed16786dAnders Carlsson    Alias->setName(MangledName);
180d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  }
181d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
182d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // Finally, set up the alias with its proper name and attributes.
1831fb0caaa7bef765b85972274e3b434af2572c141John McCall  SetCommonAttributes(cast<NamedDecl>(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) {
220dc709a8aea1072f11080f3a9519fd253582bf973Anders Carlsson  GlobalDecl GD(D, Type);
221dc709a8aea1072f11080f3a9519fd253582bf973Anders Carlsson
2229a20d55807cc2f6534a9c51a46cc8143ed16786dAnders Carlsson  llvm::StringRef Name = getMangledName(GD);
223f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCall  if (llvm::GlobalValue *V = GetGlobalValue(Name))
224d46f98573ba104eda102dd3224b2dca69f1c6336John McCall    return V;
225d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
22630509a30a9a6ac9ee737e5cf39744a92170d7ea4Fariborz Jahanian  const FunctionProtoType *FPT = D->getType()->getAs<FunctionProtoType>();
227363c184139e26ea38223b477ad64ee67b22bb9a7Anders Carlsson  const llvm::FunctionType *FTy =
228f6c56e2323c3f973253805a2f35629f3253ebed4Anders Carlsson    getTypes().GetFunctionType(getTypes().getFunctionInfo(D, Type),
22930509a30a9a6ac9ee737e5cf39744a92170d7ea4Fariborz Jahanian                               FPT->isVariadic());
23001de7a44cea9f77cbcda65faad8edc8b48a3b617Rafael Espindola  return cast<llvm::Function>(GetOrCreateLLVMFunction(Name, FTy, GD));
231363c184139e26ea38223b477ad64ee67b22bb9a7Anders Carlsson}
23227ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson
23327ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlssonvoid CodeGenModule::EmitCXXDestructors(const CXXDestructorDecl *D) {
234d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // The destructor in a virtual table is always a 'deleting'
235d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // destructor, which calls the complete destructor and then uses the
236d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // appropriate operator delete.
237ea9a20834cf9311fdf758cfbd73b8daa8e655f15Eli Friedman  if (D->isVirtual())
238624c7d704dc9f1dbb5dd3e5a0ef7eacfb3b699e2Eli Friedman    EmitGlobal(GlobalDecl(D, Dtor_Deleting));
239d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
240d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // The destructor used for destructing this as a most-derived class;
241d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // call the base destructor and then destructs any virtual bases.
2428e51a1f5da6ef4a1a168d14116c6eed3a578a263John McCall  EmitGlobal(GlobalDecl(D, Dtor_Complete));
243d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
244d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // The destructor used for destructing this as a base class; ignores
245d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // virtual bases.
2468e51a1f5da6ef4a1a168d14116c6eed3a578a263John McCall  EmitGlobal(GlobalDecl(D, Dtor_Base));
24727ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson}
24827ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson
2491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid CodeGenModule::EmitCXXDestructor(const CXXDestructorDecl *D,
25027ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson                                      CXXDtorType Type) {
251d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // The complete destructor is equivalent to the base destructor for
252d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // classes with no virtual bases, so try to emit it as an alias.
253d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  if (Type == Dtor_Complete &&
254d46f98573ba104eda102dd3224b2dca69f1c6336John McCall      !D->getParent()->getNumVBases() &&
255d46f98573ba104eda102dd3224b2dca69f1c6336John McCall      !TryEmitDefinitionAsAlias(GlobalDecl(D, Dtor_Complete),
256d46f98573ba104eda102dd3224b2dca69f1c6336John McCall                                GlobalDecl(D, Dtor_Base)))
257d46f98573ba104eda102dd3224b2dca69f1c6336John McCall    return;
258d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
259c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // The base destructor is equivalent to the base destructor of its
260c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // base class if there is exactly one non-virtual base class with a
261c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // non-trivial destructor, there are no fields with a non-trivial
262c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // destructor, and the body of the destructor is trivial.
263c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  if (Type == Dtor_Base && !TryEmitBaseDestructorAsAlias(D))
264c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    return;
265c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall
266d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  llvm::Function *Fn = cast<llvm::Function>(GetAddrOfCXXDestructor(D, Type));
2678b2423361648c39a7d8a3c5e8129e12006deac32John McCall  setFunctionLinkage(D, Fn);
2681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2690ff8bafde95f6fa51ccea70738c1b99db870bddcAnders Carlsson  CodeGenFunction(*this).GenerateCode(GlobalDecl(D, Type), Fn);
2701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27127ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson  SetFunctionDefinitionAttributes(D, Fn);
27227ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson  SetLLVMFunctionAttributesForDefinition(D, Fn);
27327ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson}
27427ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson
275d46f98573ba104eda102dd3224b2dca69f1c6336John McCallllvm::GlobalValue *
2761eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpCodeGenModule::GetAddrOfCXXDestructor(const CXXDestructorDecl *D,
27727ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson                                      CXXDtorType Type) {
278dc709a8aea1072f11080f3a9519fd253582bf973Anders Carlsson  GlobalDecl GD(D, Type);
279dc709a8aea1072f11080f3a9519fd253582bf973Anders Carlsson
2809a20d55807cc2f6534a9c51a46cc8143ed16786dAnders Carlsson  llvm::StringRef Name = getMangledName(GD);
281f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCall  if (llvm::GlobalValue *V = GetGlobalValue(Name))
282d46f98573ba104eda102dd3224b2dca69f1c6336John McCall    return V;
283d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
28427ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson  const llvm::FunctionType *FTy =
285f6c56e2323c3f973253805a2f35629f3253ebed4Anders Carlsson    getTypes().GetFunctionType(getTypes().getFunctionInfo(D, Type), false);
2861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
28701de7a44cea9f77cbcda65faad8edc8b48a3b617Rafael Espindola  return cast<llvm::Function>(GetOrCreateLLVMFunction(Name, FTy, GD));
28827ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson}
28927ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson
290046c294a43024874ff35656c6e785b64e72f1f36Anders Carlssonstatic llvm::Value *BuildVirtualCall(CodeGenFunction &CGF, uint64_t VTableIndex,
291566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson                                     llvm::Value *This, const llvm::Type *Ty) {
292043fb9a1fc0609285f60f0f87e5a18195408f34cDan Gohman  Ty = Ty->getPointerTo()->getPointerTo();
293566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson
294043fb9a1fc0609285f60f0f87e5a18195408f34cDan Gohman  llvm::Value *VTable = CGF.GetVTablePtr(This, Ty);
295566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson  llvm::Value *VFuncPtr =
296046c294a43024874ff35656c6e785b64e72f1f36Anders Carlsson    CGF.Builder.CreateConstInBoundsGEP1_64(VTable, VTableIndex, "vfn");
297566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson  return CGF.Builder.CreateLoad(VFuncPtr);
298566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson}
299566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson
3002f1986b557fa671c4f8c9dd0d071398edfc073d5Anders Carlssonllvm::Value *
301566abee1e9828a7700b51e4d17ea08234fde3bb4Anders CarlssonCodeGenFunction::BuildVirtualCall(const CXXMethodDecl *MD, llvm::Value *This,
302f0070dbae9535836ad41711081465dec2259786bMike Stump                                  const llvm::Type *Ty) {
303566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson  MD = MD->getCanonicalDecl();
304046c294a43024874ff35656c6e785b64e72f1f36Anders Carlsson  uint64_t VTableIndex = CGM.getVTables().getMethodVTableIndex(MD);
3052b3583573ba6b26b605aacaad9a50492fb3d6fe6Anders Carlsson
306af4403545a50a60d208e6fcae057308d576a92e0Anders Carlsson  return ::BuildVirtualCall(*this, VTableIndex, This, Ty);
307566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson}
308566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson
3092726267f094a0c1f5ac5b501ec5a9898c58876bfFariborz Jahanian/// BuildVirtualCall - This routine is to support gcc's kext ABI making
3102726267f094a0c1f5ac5b501ec5a9898c58876bfFariborz Jahanian/// indirect call to virtual functions. It makes the call through indexing
3112726267f094a0c1f5ac5b501ec5a9898c58876bfFariborz Jahanian/// into the vtable.
3122726267f094a0c1f5ac5b501ec5a9898c58876bfFariborz Jahanianllvm::Value *
3132726267f094a0c1f5ac5b501ec5a9898c58876bfFariborz JahanianCodeGenFunction::BuildAppleKextVirtualCall(const CXXMethodDecl *MD,
3142726267f094a0c1f5ac5b501ec5a9898c58876bfFariborz Jahanian                                  NestedNameSpecifier *Qual,
3152726267f094a0c1f5ac5b501ec5a9898c58876bfFariborz Jahanian                                  const llvm::Type *Ty) {
3162726267f094a0c1f5ac5b501ec5a9898c58876bfFariborz Jahanian  llvm::Value *VTable = 0;
3172726267f094a0c1f5ac5b501ec5a9898c58876bfFariborz Jahanian  assert((Qual->getKind() == NestedNameSpecifier::TypeSpec) &&
3182726267f094a0c1f5ac5b501ec5a9898c58876bfFariborz Jahanian         "BuildAppleKextVirtualCall - bad Qual kind");
3192726267f094a0c1f5ac5b501ec5a9898c58876bfFariborz Jahanian
3202726267f094a0c1f5ac5b501ec5a9898c58876bfFariborz Jahanian  const Type *QTy = Qual->getAsType();
3212726267f094a0c1f5ac5b501ec5a9898c58876bfFariborz Jahanian  QualType T = QualType(QTy, 0);
3222726267f094a0c1f5ac5b501ec5a9898c58876bfFariborz Jahanian  const RecordType *RT = T->getAs<RecordType>();
3232726267f094a0c1f5ac5b501ec5a9898c58876bfFariborz Jahanian  assert(RT && "BuildAppleKextVirtualCall - Qual type must be record");
3242726267f094a0c1f5ac5b501ec5a9898c58876bfFariborz Jahanian  const CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl());
325ccd5259d33cbbdd6f5fbf7ccab4cb4a2702309eaFariborz Jahanian
326ccd5259d33cbbdd6f5fbf7ccab4cb4a2702309eaFariborz Jahanian  if (const CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(MD))
327ccd5259d33cbbdd6f5fbf7ccab4cb4a2702309eaFariborz Jahanian    return BuildAppleKextVirtualDestructorCall(DD, Dtor_Complete, RD);
328ccd5259d33cbbdd6f5fbf7ccab4cb4a2702309eaFariborz Jahanian
3292726267f094a0c1f5ac5b501ec5a9898c58876bfFariborz Jahanian  VTable = CGM.getVTables().GetAddrOfVTable(RD);
3302726267f094a0c1f5ac5b501ec5a9898c58876bfFariborz Jahanian  Ty = Ty->getPointerTo()->getPointerTo();
3312726267f094a0c1f5ac5b501ec5a9898c58876bfFariborz Jahanian  VTable = Builder.CreateBitCast(VTable, Ty);
3322726267f094a0c1f5ac5b501ec5a9898c58876bfFariborz Jahanian  assert(VTable && "BuildVirtualCall = kext vtbl pointer is null");
3332726267f094a0c1f5ac5b501ec5a9898c58876bfFariborz Jahanian  MD = MD->getCanonicalDecl();
3342726267f094a0c1f5ac5b501ec5a9898c58876bfFariborz Jahanian  uint64_t VTableIndex = CGM.getVTables().getMethodVTableIndex(MD);
335a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian  uint64_t AddressPoint =
336a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian    CGM.getVTables().getAddressPoint(BaseSubobject(RD, 0), RD);
337a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian  VTableIndex += AddressPoint;
3382726267f094a0c1f5ac5b501ec5a9898c58876bfFariborz Jahanian  llvm::Value *VFuncPtr =
3392726267f094a0c1f5ac5b501ec5a9898c58876bfFariborz Jahanian    CGF.Builder.CreateConstInBoundsGEP1_64(VTable, VTableIndex, "vfnkxt");
3402726267f094a0c1f5ac5b501ec5a9898c58876bfFariborz Jahanian  return CGF.Builder.CreateLoad(VFuncPtr);
3412726267f094a0c1f5ac5b501ec5a9898c58876bfFariborz Jahanian}
3422726267f094a0c1f5ac5b501ec5a9898c58876bfFariborz Jahanian
343ccd5259d33cbbdd6f5fbf7ccab4cb4a2702309eaFariborz Jahanian/// BuildVirtualCall - This routine makes indirect vtable call for
344ccd5259d33cbbdd6f5fbf7ccab4cb4a2702309eaFariborz Jahanian/// call to virtual destructors. It returns 0 if it could not do it.
345ccd5259d33cbbdd6f5fbf7ccab4cb4a2702309eaFariborz Jahanianllvm::Value *
346ccd5259d33cbbdd6f5fbf7ccab4cb4a2702309eaFariborz JahanianCodeGenFunction::BuildAppleKextVirtualDestructorCall(
347ccd5259d33cbbdd6f5fbf7ccab4cb4a2702309eaFariborz Jahanian                                            const CXXDestructorDecl *DD,
348ccd5259d33cbbdd6f5fbf7ccab4cb4a2702309eaFariborz Jahanian                                            CXXDtorType Type,
349ccd5259d33cbbdd6f5fbf7ccab4cb4a2702309eaFariborz Jahanian                                            const CXXRecordDecl *RD) {
350ccd5259d33cbbdd6f5fbf7ccab4cb4a2702309eaFariborz Jahanian  llvm::Value * Callee = 0;
351ccd5259d33cbbdd6f5fbf7ccab4cb4a2702309eaFariborz Jahanian  const CXXMethodDecl *MD = cast<CXXMethodDecl>(DD);
352ccd5259d33cbbdd6f5fbf7ccab4cb4a2702309eaFariborz Jahanian  // FIXME. Dtor_Base dtor is always direct!!
353ccd5259d33cbbdd6f5fbf7ccab4cb4a2702309eaFariborz Jahanian  // It need be somehow inline expanded into the caller.
354ccd5259d33cbbdd6f5fbf7ccab4cb4a2702309eaFariborz Jahanian  // -O does that. But need to support -O0 as well.
355ccd5259d33cbbdd6f5fbf7ccab4cb4a2702309eaFariborz Jahanian  if (MD->isVirtual() && Type != Dtor_Base) {
356ccd5259d33cbbdd6f5fbf7ccab4cb4a2702309eaFariborz Jahanian    // Compute the function type we're calling.
357ccd5259d33cbbdd6f5fbf7ccab4cb4a2702309eaFariborz Jahanian    const CGFunctionInfo *FInfo =
358ccd5259d33cbbdd6f5fbf7ccab4cb4a2702309eaFariborz Jahanian    &CGM.getTypes().getFunctionInfo(cast<CXXDestructorDecl>(MD),
359ccd5259d33cbbdd6f5fbf7ccab4cb4a2702309eaFariborz Jahanian                                    Dtor_Complete);
360ccd5259d33cbbdd6f5fbf7ccab4cb4a2702309eaFariborz Jahanian    const FunctionProtoType *FPT = MD->getType()->getAs<FunctionProtoType>();
361ccd5259d33cbbdd6f5fbf7ccab4cb4a2702309eaFariborz Jahanian    const llvm::Type *Ty
362ccd5259d33cbbdd6f5fbf7ccab4cb4a2702309eaFariborz Jahanian      = CGM.getTypes().GetFunctionType(*FInfo, FPT->isVariadic());
363771c678c04f5f685b4f188ec6c2fd88ad0f7457fFariborz Jahanian
364ccd5259d33cbbdd6f5fbf7ccab4cb4a2702309eaFariborz Jahanian    llvm::Value *VTable = CGM.getVTables().GetAddrOfVTable(RD);
365ccd5259d33cbbdd6f5fbf7ccab4cb4a2702309eaFariborz Jahanian    Ty = Ty->getPointerTo()->getPointerTo();
366ccd5259d33cbbdd6f5fbf7ccab4cb4a2702309eaFariborz Jahanian    VTable = Builder.CreateBitCast(VTable, Ty);
367771c678c04f5f685b4f188ec6c2fd88ad0f7457fFariborz Jahanian    DD = cast<CXXDestructorDecl>(DD->getCanonicalDecl());
368ccd5259d33cbbdd6f5fbf7ccab4cb4a2702309eaFariborz Jahanian    uint64_t VTableIndex =
369771c678c04f5f685b4f188ec6c2fd88ad0f7457fFariborz Jahanian      CGM.getVTables().getMethodVTableIndex(GlobalDecl(DD, Type));
370ccd5259d33cbbdd6f5fbf7ccab4cb4a2702309eaFariborz Jahanian    uint64_t AddressPoint =
371771c678c04f5f685b4f188ec6c2fd88ad0f7457fFariborz Jahanian      CGM.getVTables().getAddressPoint(BaseSubobject(RD, 0), RD);
372ccd5259d33cbbdd6f5fbf7ccab4cb4a2702309eaFariborz Jahanian    VTableIndex += AddressPoint;
373ccd5259d33cbbdd6f5fbf7ccab4cb4a2702309eaFariborz Jahanian    llvm::Value *VFuncPtr =
374771c678c04f5f685b4f188ec6c2fd88ad0f7457fFariborz Jahanian      CGF.Builder.CreateConstInBoundsGEP1_64(VTable, VTableIndex, "vfnkxt");
375ccd5259d33cbbdd6f5fbf7ccab4cb4a2702309eaFariborz Jahanian    Callee = CGF.Builder.CreateLoad(VFuncPtr);
376ccd5259d33cbbdd6f5fbf7ccab4cb4a2702309eaFariborz Jahanian  }
377ccd5259d33cbbdd6f5fbf7ccab4cb4a2702309eaFariborz Jahanian  return Callee;
378ccd5259d33cbbdd6f5fbf7ccab4cb4a2702309eaFariborz Jahanian}
379ccd5259d33cbbdd6f5fbf7ccab4cb4a2702309eaFariborz Jahanian
380566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlssonllvm::Value *
381566abee1e9828a7700b51e4d17ea08234fde3bb4Anders CarlssonCodeGenFunction::BuildVirtualCall(const CXXDestructorDecl *DD, CXXDtorType Type,
38283eedd9fa800c273647c7a90465ea9c110f9d93cAnders Carlsson                                  llvm::Value *This, const llvm::Type *Ty) {
383566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson  DD = cast<CXXDestructorDecl>(DD->getCanonicalDecl());
384af4403545a50a60d208e6fcae057308d576a92e0Anders Carlsson  uint64_t VTableIndex =
385046c294a43024874ff35656c6e785b64e72f1f36Anders Carlsson    CGM.getVTables().getMethodVTableIndex(GlobalDecl(DD, Type));
386566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson
387af4403545a50a60d208e6fcae057308d576a92e0Anders Carlsson  return ::BuildVirtualCall(*this, VTableIndex, This, Ty);
388f0070dbae9535836ad41711081465dec2259786bMike Stump}
3893a811f1f4286ee3fd0c563c1cfe623956f3caa24Charles Davis
390