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