CGCXX.cpp revision c00129a08c829bb34f22dc13727043c994c85644
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
163a811f1f4286ee3fd0c563c1cfe623956f3caa24Charles Davis#include "CGCXXABI.h"
17e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson#include "CodeGenFunction.h"
18e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson#include "CodeGenModule.h"
19283a062a633d6e868aa2be319da812341fe73728Anders Carlsson#include "Mangle.h"
20e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson#include "clang/AST/ASTContext.h"
21742cd1b7bb86b52b23b335d47abbd842dac0e1bfFariborz Jahanian#include "clang/AST/RecordLayout.h"
22e1b29efab32d02e114046d33cca242a88585bf8aAnders Carlsson#include "clang/AST/Decl.h"
23774e7c6881ee6cb970cd42239d700dce87ed402aAnders Carlsson#include "clang/AST/DeclCXX.h"
2486e9644199d91a33d0090395395bc718bd3a4981Anders Carlsson#include "clang/AST/DeclObjC.h"
256815e941998659a55c20c147861b0f437928c3d8Anders Carlsson#include "clang/AST/StmtCXX.h"
26d46f98573ba104eda102dd3224b2dca69f1c6336John McCall#include "clang/CodeGen/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.
1009a70846c5ffd5ff5cce60de49cd7b312146bf502John McCall  const CXXDestructorDecl *BaseD = UniqueBase->getDestructor(getContext());
1019a70846c5ffd5ff5cce60de49cd7b312146bf502John McCall  if (!BaseD->isImplicit() && !BaseD->getBody())
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);
106c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  if (ClassLayout.getBaseClassOffset(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.
169f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCall  MangleBuffer MangledName;
170f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCall  getMangledName(MangledName, AliasDecl);
171f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCall  llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
172d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  if (Entry) {
1731962beee04d3635b12cf6254a53b40ec6c50098dJohn McCall    assert(Entry->isDeclaration() && "definition already exists for alias");
1741962beee04d3635b12cf6254a53b40ec6c50098dJohn McCall    assert(Entry->getType() == AliasType &&
1751962beee04d3635b12cf6254a53b40ec6c50098dJohn McCall           "declaration exists with different type");
176f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCall    Alias->takeName(Entry);
177d46f98573ba104eda102dd3224b2dca69f1c6336John McCall    Entry->replaceAllUsesWith(Alias);
178d46f98573ba104eda102dd3224b2dca69f1c6336John McCall    Entry->eraseFromParent();
179f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCall  } else {
180f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCall    Alias->setName(MangledName.getString());
181d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  }
182d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
183d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // Finally, set up the alias with its proper name and attributes.
184d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  SetCommonAttributes(AliasDecl.getDecl(), Alias);
185d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
186d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  return false;
187d46f98573ba104eda102dd3224b2dca69f1c6336John McCall}
188b9de2c55b2a33776e2bee8ee57df7599b374c8a5Anders Carlsson
18995d4e5d2f87a0f07fb143ccb824dfc4c5c595c78Anders Carlssonvoid CodeGenModule::EmitCXXConstructors(const CXXConstructorDecl *D) {
190d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // The constructor used for constructing this as a complete class;
191d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // constucts the virtual bases, then calls the base constructor.
19292ac9ffecd236a6be0d6ab30cef56100e56b171cJohn McCall  EmitGlobal(GlobalDecl(D, Ctor_Complete));
193d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
194d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // The constructor used for constructing this as a base class;
195d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // ignores virtual bases.
1968e51a1f5da6ef4a1a168d14116c6eed3a578a263John McCall  EmitGlobal(GlobalDecl(D, Ctor_Base));
19795d4e5d2f87a0f07fb143ccb824dfc4c5c595c78Anders Carlsson}
198363c184139e26ea38223b477ad64ee67b22bb9a7Anders Carlsson
1991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid CodeGenModule::EmitCXXConstructor(const CXXConstructorDecl *D,
20027ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson                                       CXXCtorType Type) {
201d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // The complete constructor is equivalent to the base constructor
202d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // for classes with no virtual bases.  Try to emit it as an alias.
203d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  if (Type == Ctor_Complete &&
204d46f98573ba104eda102dd3224b2dca69f1c6336John McCall      !D->getParent()->getNumVBases() &&
205d46f98573ba104eda102dd3224b2dca69f1c6336John McCall      !TryEmitDefinitionAsAlias(GlobalDecl(D, Ctor_Complete),
206d46f98573ba104eda102dd3224b2dca69f1c6336John McCall                                GlobalDecl(D, Ctor_Base)))
207d46f98573ba104eda102dd3224b2dca69f1c6336John McCall    return;
2081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
209d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  llvm::Function *Fn = cast<llvm::Function>(GetAddrOfCXXConstructor(D, Type));
2108b2423361648c39a7d8a3c5e8129e12006deac32John McCall  setFunctionLinkage(D, Fn);
2111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2120ff8bafde95f6fa51ccea70738c1b99db870bddcAnders Carlsson  CodeGenFunction(*this).GenerateCode(GlobalDecl(D, Type), Fn);
2131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
21427ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson  SetFunctionDefinitionAttributes(D, Fn);
21527ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson  SetLLVMFunctionAttributesForDefinition(D, Fn);
21627ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson}
21727ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson
218d46f98573ba104eda102dd3224b2dca69f1c6336John McCallllvm::GlobalValue *
2191eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpCodeGenModule::GetAddrOfCXXConstructor(const CXXConstructorDecl *D,
220363c184139e26ea38223b477ad64ee67b22bb9a7Anders Carlsson                                       CXXCtorType Type) {
221f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCall  MangleBuffer Name;
222f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCall  getMangledCXXCtorName(Name, D, Type);
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());
230b4880bab7fc1b61267cfd9a0ad52188e7a828cb3Chris Lattner  return cast<llvm::Function>(
231b4880bab7fc1b61267cfd9a0ad52188e7a828cb3Chris Lattner                      GetOrCreateLLVMFunction(Name, FTy, GlobalDecl(D, Type)));
232363c184139e26ea38223b477ad64ee67b22bb9a7Anders Carlsson}
23327ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson
23435415f5132f70ad5097a3514ab84251e10db3664Douglas Gregorvoid CodeGenModule::getMangledName(MangleBuffer &Buffer, const BlockDecl *BD) {
23535415f5132f70ad5097a3514ab84251e10db3664Douglas Gregor  getMangleContext().mangleBlock(BD, Buffer.getBuffer());
23635415f5132f70ad5097a3514ab84251e10db3664Douglas Gregor}
23735415f5132f70ad5097a3514ab84251e10db3664Douglas Gregor
238f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCallvoid CodeGenModule::getMangledCXXCtorName(MangleBuffer &Name,
239f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCall                                          const CXXConstructorDecl *D,
240f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCall                                          CXXCtorType Type) {
241f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCall  getMangleContext().mangleCXXCtor(D, Type, Name.getBuffer());
24227ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson}
24327ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson
24427ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlssonvoid CodeGenModule::EmitCXXDestructors(const CXXDestructorDecl *D) {
245d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // The destructor in a virtual table is always a 'deleting'
246d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // destructor, which calls the complete destructor and then uses the
247d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // appropriate operator delete.
248ea9a20834cf9311fdf758cfbd73b8daa8e655f15Eli Friedman  if (D->isVirtual())
249624c7d704dc9f1dbb5dd3e5a0ef7eacfb3b699e2Eli Friedman    EmitGlobal(GlobalDecl(D, Dtor_Deleting));
250d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
251d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // The destructor used for destructing this as a most-derived class;
252d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // call the base destructor and then destructs any virtual bases.
2538e51a1f5da6ef4a1a168d14116c6eed3a578a263John McCall  EmitGlobal(GlobalDecl(D, Dtor_Complete));
254d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
255d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // The destructor used for destructing this as a base class; ignores
256d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // virtual bases.
2578e51a1f5da6ef4a1a168d14116c6eed3a578a263John McCall  EmitGlobal(GlobalDecl(D, Dtor_Base));
25827ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson}
25927ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson
2601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid CodeGenModule::EmitCXXDestructor(const CXXDestructorDecl *D,
26127ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson                                      CXXDtorType Type) {
262d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // The complete destructor is equivalent to the base destructor for
263d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  // classes with no virtual bases, so try to emit it as an alias.
264d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  if (Type == Dtor_Complete &&
265d46f98573ba104eda102dd3224b2dca69f1c6336John McCall      !D->getParent()->getNumVBases() &&
266d46f98573ba104eda102dd3224b2dca69f1c6336John McCall      !TryEmitDefinitionAsAlias(GlobalDecl(D, Dtor_Complete),
267d46f98573ba104eda102dd3224b2dca69f1c6336John McCall                                GlobalDecl(D, Dtor_Base)))
268d46f98573ba104eda102dd3224b2dca69f1c6336John McCall    return;
269d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
270c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // The base destructor is equivalent to the base destructor of its
271c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // base class if there is exactly one non-virtual base class with a
272c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // non-trivial destructor, there are no fields with a non-trivial
273c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  // destructor, and the body of the destructor is trivial.
274c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall  if (Type == Dtor_Base && !TryEmitBaseDestructorAsAlias(D))
275c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall    return;
276c0bf462cf35fe050bddbd8bff967298e4a67e79dJohn McCall
277d46f98573ba104eda102dd3224b2dca69f1c6336John McCall  llvm::Function *Fn = cast<llvm::Function>(GetAddrOfCXXDestructor(D, Type));
2788b2423361648c39a7d8a3c5e8129e12006deac32John McCall  setFunctionLinkage(D, Fn);
2791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2800ff8bafde95f6fa51ccea70738c1b99db870bddcAnders Carlsson  CodeGenFunction(*this).GenerateCode(GlobalDecl(D, Type), Fn);
2811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
28227ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson  SetFunctionDefinitionAttributes(D, Fn);
28327ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson  SetLLVMFunctionAttributesForDefinition(D, Fn);
28427ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson}
28527ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson
286d46f98573ba104eda102dd3224b2dca69f1c6336John McCallllvm::GlobalValue *
2871eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpCodeGenModule::GetAddrOfCXXDestructor(const CXXDestructorDecl *D,
28827ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson                                      CXXDtorType Type) {
289f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCall  MangleBuffer Name;
290f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCall  getMangledCXXDtorName(Name, D, Type);
291f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCall  if (llvm::GlobalValue *V = GetGlobalValue(Name))
292d46f98573ba104eda102dd3224b2dca69f1c6336John McCall    return V;
293d46f98573ba104eda102dd3224b2dca69f1c6336John McCall
29427ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson  const llvm::FunctionType *FTy =
295f6c56e2323c3f973253805a2f35629f3253ebed4Anders Carlsson    getTypes().GetFunctionType(getTypes().getFunctionInfo(D, Type), false);
2961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
297b4880bab7fc1b61267cfd9a0ad52188e7a828cb3Chris Lattner  return cast<llvm::Function>(
298b4880bab7fc1b61267cfd9a0ad52188e7a828cb3Chris Lattner                      GetOrCreateLLVMFunction(Name, FTy, GlobalDecl(D, Type)));
29927ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson}
30027ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson
301f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCallvoid CodeGenModule::getMangledCXXDtorName(MangleBuffer &Name,
302f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCall                                          const CXXDestructorDecl *D,
303f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCall                                          CXXDtorType Type) {
304f746aa6a8f538be914173a4aef2d9a2fd9f99d17John McCall  getMangleContext().mangleCXXDtor(D, Type, Name.getBuffer());
30527ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5Anders Carlsson}
306e7d346b6d5cee14b75e34928b3fd423f21d8d80dFariborz Jahanian
307c00129a08c829bb34f22dc13727043c994c85644Eli Friedmanllvm::Constant *
308c00129a08c829bb34f22dc13727043c994c85644Eli FriedmanCodeGenModule::GetCXXMemberFunctionPointerValue(const CXXMethodDecl *MD) {
309c00129a08c829bb34f22dc13727043c994c85644Eli Friedman  assert(MD->isInstance() && "Member function must not be static!");
310c00129a08c829bb34f22dc13727043c994c85644Eli Friedman
311c00129a08c829bb34f22dc13727043c994c85644Eli Friedman  MD = MD->getCanonicalDecl();
312c00129a08c829bb34f22dc13727043c994c85644Eli Friedman
313c00129a08c829bb34f22dc13727043c994c85644Eli Friedman  const llvm::Type *PtrDiffTy = Types.ConvertType(Context.getPointerDiffType());
314c00129a08c829bb34f22dc13727043c994c85644Eli Friedman
315c00129a08c829bb34f22dc13727043c994c85644Eli Friedman  // Get the function pointer (or index if this is a virtual function).
316c00129a08c829bb34f22dc13727043c994c85644Eli Friedman  if (MD->isVirtual()) {
317c00129a08c829bb34f22dc13727043c994c85644Eli Friedman    uint64_t Index = VTables.getMethodVTableIndex(MD);
318c00129a08c829bb34f22dc13727043c994c85644Eli Friedman
319c00129a08c829bb34f22dc13727043c994c85644Eli Friedman    // FIXME: We shouldn't use / 8 here.
320c00129a08c829bb34f22dc13727043c994c85644Eli Friedman    uint64_t PointerWidthInBytes = Context.Target.getPointerWidth(0) / 8;
321c00129a08c829bb34f22dc13727043c994c85644Eli Friedman
322c00129a08c829bb34f22dc13727043c994c85644Eli Friedman    // Itanium C++ ABI 2.3:
323c00129a08c829bb34f22dc13727043c994c85644Eli Friedman    //   For a non-virtual function, this field is a simple function pointer.
324c00129a08c829bb34f22dc13727043c994c85644Eli Friedman    //   For a virtual function, it is 1 plus the virtual table offset
325c00129a08c829bb34f22dc13727043c994c85644Eli Friedman    //   (in bytes) of the function, represented as a ptrdiff_t.
326c00129a08c829bb34f22dc13727043c994c85644Eli Friedman    return llvm::ConstantInt::get(PtrDiffTy, (Index * PointerWidthInBytes) + 1);
327c00129a08c829bb34f22dc13727043c994c85644Eli Friedman  }
328c00129a08c829bb34f22dc13727043c994c85644Eli Friedman
329c00129a08c829bb34f22dc13727043c994c85644Eli Friedman  const FunctionProtoType *FPT = MD->getType()->getAs<FunctionProtoType>();
330c00129a08c829bb34f22dc13727043c994c85644Eli Friedman  const llvm::Type *Ty;
331c00129a08c829bb34f22dc13727043c994c85644Eli Friedman  // Check whether the function has a computable LLVM signature.
332c00129a08c829bb34f22dc13727043c994c85644Eli Friedman  if (!CodeGenTypes::VerifyFuncTypeComplete(FPT)) {
333c00129a08c829bb34f22dc13727043c994c85644Eli Friedman    // The function has a computable LLVM signature; use the correct type.
334c00129a08c829bb34f22dc13727043c994c85644Eli Friedman    Ty = Types.GetFunctionType(Types.getFunctionInfo(MD), FPT->isVariadic());
335c00129a08c829bb34f22dc13727043c994c85644Eli Friedman  } else {
336c00129a08c829bb34f22dc13727043c994c85644Eli Friedman    // Use an arbitrary non-function type to tell GetAddrOfFunction that the
337c00129a08c829bb34f22dc13727043c994c85644Eli Friedman    // function type is incomplete.
338c00129a08c829bb34f22dc13727043c994c85644Eli Friedman    Ty = PtrDiffTy;
339c00129a08c829bb34f22dc13727043c994c85644Eli Friedman  }
340c00129a08c829bb34f22dc13727043c994c85644Eli Friedman
341c00129a08c829bb34f22dc13727043c994c85644Eli Friedman  llvm::Constant *FuncPtr = GetAddrOfFunction(MD, Ty);
342c00129a08c829bb34f22dc13727043c994c85644Eli Friedman  return llvm::ConstantExpr::getPtrToInt(FuncPtr, PtrDiffTy);
343c00129a08c829bb34f22dc13727043c994c85644Eli Friedman}
344c00129a08c829bb34f22dc13727043c994c85644Eli Friedman
345046c294a43024874ff35656c6e785b64e72f1f36Anders Carlssonstatic llvm::Value *BuildVirtualCall(CodeGenFunction &CGF, uint64_t VTableIndex,
346566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson                                     llvm::Value *This, const llvm::Type *Ty) {
347566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson  Ty = Ty->getPointerTo()->getPointerTo()->getPointerTo();
348566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson
349046c294a43024874ff35656c6e785b64e72f1f36Anders Carlsson  llvm::Value *VTable = CGF.Builder.CreateBitCast(This, Ty);
350046c294a43024874ff35656c6e785b64e72f1f36Anders Carlsson  VTable = CGF.Builder.CreateLoad(VTable);
351566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson
352566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson  llvm::Value *VFuncPtr =
353046c294a43024874ff35656c6e785b64e72f1f36Anders Carlsson    CGF.Builder.CreateConstInBoundsGEP1_64(VTable, VTableIndex, "vfn");
354566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson  return CGF.Builder.CreateLoad(VFuncPtr);
355566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson}
356566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson
3572f1986b557fa671c4f8c9dd0d071398edfc073d5Anders Carlssonllvm::Value *
358566abee1e9828a7700b51e4d17ea08234fde3bb4Anders CarlssonCodeGenFunction::BuildVirtualCall(const CXXMethodDecl *MD, llvm::Value *This,
359f0070dbae9535836ad41711081465dec2259786bMike Stump                                  const llvm::Type *Ty) {
360566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson  MD = MD->getCanonicalDecl();
361046c294a43024874ff35656c6e785b64e72f1f36Anders Carlsson  uint64_t VTableIndex = CGM.getVTables().getMethodVTableIndex(MD);
3622b3583573ba6b26b605aacaad9a50492fb3d6fe6Anders Carlsson
363af4403545a50a60d208e6fcae057308d576a92e0Anders Carlsson  return ::BuildVirtualCall(*this, VTableIndex, This, Ty);
364566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson}
365566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson
366566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlssonllvm::Value *
367566abee1e9828a7700b51e4d17ea08234fde3bb4Anders CarlssonCodeGenFunction::BuildVirtualCall(const CXXDestructorDecl *DD, CXXDtorType Type,
368566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson                                  llvm::Value *&This, const llvm::Type *Ty) {
369566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson  DD = cast<CXXDestructorDecl>(DD->getCanonicalDecl());
370af4403545a50a60d208e6fcae057308d576a92e0Anders Carlsson  uint64_t VTableIndex =
371046c294a43024874ff35656c6e785b64e72f1f36Anders Carlsson    CGM.getVTables().getMethodVTableIndex(GlobalDecl(DD, Type));
372566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson
373af4403545a50a60d208e6fcae057308d576a92e0Anders Carlsson  return ::BuildVirtualCall(*this, VTableIndex, This, Ty);
374f0070dbae9535836ad41711081465dec2259786bMike Stump}
3753a811f1f4286ee3fd0c563c1cfe623956f3caa24Charles Davis
3763a811f1f4286ee3fd0c563c1cfe623956f3caa24Charles DavisCXXABI::~CXXABI() {}
377