CGCXX.cpp revision 043fb9a1fc0609285f60f0f87e5a18195408f34c
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" 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" 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); 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. 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()); 230dc709a8aea1072f11080f3a9519fd253582bf973Anders Carlsson 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 287dc709a8aea1072f11080f3a9519fd253582bf973Anders Carlsson 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 309566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlssonllvm::Value * 310566abee1e9828a7700b51e4d17ea08234fde3bb4Anders CarlssonCodeGenFunction::BuildVirtualCall(const CXXDestructorDecl *DD, CXXDtorType Type, 311566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson llvm::Value *&This, const llvm::Type *Ty) { 312566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson DD = cast<CXXDestructorDecl>(DD->getCanonicalDecl()); 313af4403545a50a60d208e6fcae057308d576a92e0Anders Carlsson uint64_t VTableIndex = 314046c294a43024874ff35656c6e785b64e72f1f36Anders Carlsson CGM.getVTables().getMethodVTableIndex(GlobalDecl(DD, Type)); 315566abee1e9828a7700b51e4d17ea08234fde3bb4Anders Carlsson 316af4403545a50a60d208e6fcae057308d576a92e0Anders Carlsson return ::BuildVirtualCall(*this, VTableIndex, This, Ty); 317f0070dbae9535836ad41711081465dec2259786bMike Stump} 3183a811f1f4286ee3fd0c563c1cfe623956f3caa24Charles Davis 3190bab0cdab751248ca389a5592bcb70eac5d39260John McCall/// Implementation for CGCXXABI. Possibly this should be moved into 3200bab0cdab751248ca389a5592bcb70eac5d39260John McCall/// the incomplete ABI implementations? 3210bab0cdab751248ca389a5592bcb70eac5d39260John McCall 3225cd91b513455fd7753e8815b54f0a49bbca6602dJohn McCallvoid CGCXXABI::_anchor() {} 32393d557bc1867b7d7b102f87290194b4be7932c92John McCall 3243023def6bea3af6dbb51eea51f8cb8ea892d26cfJohn McCallstatic void ErrorUnsupportedABI(CodeGenFunction &CGF, 3253023def6bea3af6dbb51eea51f8cb8ea892d26cfJohn McCall llvm::StringRef S) { 3263023def6bea3af6dbb51eea51f8cb8ea892d26cfJohn McCall Diagnostic &Diags = CGF.CGM.getDiags(); 3273023def6bea3af6dbb51eea51f8cb8ea892d26cfJohn McCall unsigned DiagID = Diags.getCustomDiagID(Diagnostic::Error, 3281e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall "cannot yet compile %1 in this ABI"); 3293023def6bea3af6dbb51eea51f8cb8ea892d26cfJohn McCall Diags.Report(CGF.getContext().getFullLoc(CGF.CurCodeDecl->getLocation()), 3303023def6bea3af6dbb51eea51f8cb8ea892d26cfJohn McCall DiagID) 3313023def6bea3af6dbb51eea51f8cb8ea892d26cfJohn McCall << S; 3323023def6bea3af6dbb51eea51f8cb8ea892d26cfJohn McCall} 3333023def6bea3af6dbb51eea51f8cb8ea892d26cfJohn McCall 334d608cdb7c044365cf4e8764ade1e11e99c176078John McCallstatic llvm::Constant *GetBogusMemberPointer(CodeGenModule &CGM, 335d608cdb7c044365cf4e8764ade1e11e99c176078John McCall QualType T) { 336d608cdb7c044365cf4e8764ade1e11e99c176078John McCall return llvm::Constant::getNullValue(CGM.getTypes().ConvertType(T)); 337d608cdb7c044365cf4e8764ade1e11e99c176078John McCall} 338d608cdb7c044365cf4e8764ade1e11e99c176078John McCall 3390bab0cdab751248ca389a5592bcb70eac5d39260John McCallconst llvm::Type * 3400bab0cdab751248ca389a5592bcb70eac5d39260John McCallCGCXXABI::ConvertMemberPointerType(const MemberPointerType *MPT) { 3410bab0cdab751248ca389a5592bcb70eac5d39260John McCall return CGM.getTypes().ConvertType(CGM.getContext().getPointerDiffType()); 3420bab0cdab751248ca389a5592bcb70eac5d39260John McCall} 3430bab0cdab751248ca389a5592bcb70eac5d39260John McCall 34493d557bc1867b7d7b102f87290194b4be7932c92John McCallllvm::Value *CGCXXABI::EmitLoadOfMemberFunctionPointer(CodeGenFunction &CGF, 34593d557bc1867b7d7b102f87290194b4be7932c92John McCall llvm::Value *&This, 34693d557bc1867b7d7b102f87290194b4be7932c92John McCall llvm::Value *MemPtr, 34793d557bc1867b7d7b102f87290194b4be7932c92John McCall const MemberPointerType *MPT) { 3483023def6bea3af6dbb51eea51f8cb8ea892d26cfJohn McCall ErrorUnsupportedABI(CGF, "calls through member pointers"); 34993d557bc1867b7d7b102f87290194b4be7932c92John McCall 35093d557bc1867b7d7b102f87290194b4be7932c92John McCall const FunctionProtoType *FPT = 35193d557bc1867b7d7b102f87290194b4be7932c92John McCall MPT->getPointeeType()->getAs<FunctionProtoType>(); 35293d557bc1867b7d7b102f87290194b4be7932c92John McCall const CXXRecordDecl *RD = 35393d557bc1867b7d7b102f87290194b4be7932c92John McCall cast<CXXRecordDecl>(MPT->getClass()->getAs<RecordType>()->getDecl()); 35493d557bc1867b7d7b102f87290194b4be7932c92John McCall const llvm::FunctionType *FTy = 355d608cdb7c044365cf4e8764ade1e11e99c176078John McCall CGM.getTypes().GetFunctionType(CGM.getTypes().getFunctionInfo(RD, FPT), 356d608cdb7c044365cf4e8764ade1e11e99c176078John McCall FPT->isVariadic()); 35793d557bc1867b7d7b102f87290194b4be7932c92John McCall return llvm::Constant::getNullValue(FTy->getPointerTo()); 35893d557bc1867b7d7b102f87290194b4be7932c92John McCall} 3593023def6bea3af6dbb51eea51f8cb8ea892d26cfJohn McCall 3606c2ab1d578c6cc1f3ddcc948532cd625f1092ef2John McCallllvm::Value *CGCXXABI::EmitMemberDataPointerAddress(CodeGenFunction &CGF, 3616c2ab1d578c6cc1f3ddcc948532cd625f1092ef2John McCall llvm::Value *Base, 3626c2ab1d578c6cc1f3ddcc948532cd625f1092ef2John McCall llvm::Value *MemPtr, 3636c2ab1d578c6cc1f3ddcc948532cd625f1092ef2John McCall const MemberPointerType *MPT) { 3646c2ab1d578c6cc1f3ddcc948532cd625f1092ef2John McCall ErrorUnsupportedABI(CGF, "loads of member pointers"); 3656c2ab1d578c6cc1f3ddcc948532cd625f1092ef2John McCall const llvm::Type *Ty = CGF.ConvertType(MPT->getPointeeType())->getPointerTo(); 3666c2ab1d578c6cc1f3ddcc948532cd625f1092ef2John McCall return llvm::Constant::getNullValue(Ty); 3676c2ab1d578c6cc1f3ddcc948532cd625f1092ef2John McCall} 3686c2ab1d578c6cc1f3ddcc948532cd625f1092ef2John McCall 3690bab0cdab751248ca389a5592bcb70eac5d39260John McCallllvm::Value *CGCXXABI::EmitMemberPointerConversion(CodeGenFunction &CGF, 3700bab0cdab751248ca389a5592bcb70eac5d39260John McCall const CastExpr *E, 3710bab0cdab751248ca389a5592bcb70eac5d39260John McCall llvm::Value *Src) { 372cf2c85e76fdafe7e634810a292321a6c8322483dJohn McCall ErrorUnsupportedABI(CGF, "member function pointer conversions"); 373d608cdb7c044365cf4e8764ade1e11e99c176078John McCall return GetBogusMemberPointer(CGM, E->getType()); 374875ab10245d3bf37252dd822aa1616bb0a391095John McCall} 375875ab10245d3bf37252dd822aa1616bb0a391095John McCall 376e9fd7eb6c67676dc27e84eac429aec4f3be51f26John McCallllvm::Value * 3770bab0cdab751248ca389a5592bcb70eac5d39260John McCallCGCXXABI::EmitMemberPointerComparison(CodeGenFunction &CGF, 3780bab0cdab751248ca389a5592bcb70eac5d39260John McCall llvm::Value *L, 3790bab0cdab751248ca389a5592bcb70eac5d39260John McCall llvm::Value *R, 3800bab0cdab751248ca389a5592bcb70eac5d39260John McCall const MemberPointerType *MPT, 3810bab0cdab751248ca389a5592bcb70eac5d39260John McCall bool Inequality) { 382e9fd7eb6c67676dc27e84eac429aec4f3be51f26John McCall ErrorUnsupportedABI(CGF, "member function pointer comparison"); 383e9fd7eb6c67676dc27e84eac429aec4f3be51f26John McCall return CGF.Builder.getFalse(); 384e9fd7eb6c67676dc27e84eac429aec4f3be51f26John McCall} 385e9fd7eb6c67676dc27e84eac429aec4f3be51f26John McCall 386e9fd7eb6c67676dc27e84eac429aec4f3be51f26John McCallllvm::Value * 3870bab0cdab751248ca389a5592bcb70eac5d39260John McCallCGCXXABI::EmitMemberPointerIsNotNull(CodeGenFunction &CGF, 3880bab0cdab751248ca389a5592bcb70eac5d39260John McCall llvm::Value *MemPtr, 3890bab0cdab751248ca389a5592bcb70eac5d39260John McCall const MemberPointerType *MPT) { 390e9fd7eb6c67676dc27e84eac429aec4f3be51f26John McCall ErrorUnsupportedABI(CGF, "member function pointer null testing"); 391e9fd7eb6c67676dc27e84eac429aec4f3be51f26John McCall return CGF.Builder.getFalse(); 392e9fd7eb6c67676dc27e84eac429aec4f3be51f26John McCall} 393e9fd7eb6c67676dc27e84eac429aec4f3be51f26John McCall 394cf2c85e76fdafe7e634810a292321a6c8322483dJohn McCallllvm::Constant * 3950bab0cdab751248ca389a5592bcb70eac5d39260John McCallCGCXXABI::EmitMemberPointerConversion(llvm::Constant *C, const CastExpr *E) { 396d608cdb7c044365cf4e8764ade1e11e99c176078John McCall return GetBogusMemberPointer(CGM, E->getType()); 397cf2c85e76fdafe7e634810a292321a6c8322483dJohn McCall} 398cf2c85e76fdafe7e634810a292321a6c8322483dJohn McCall 399cf2c85e76fdafe7e634810a292321a6c8322483dJohn McCallllvm::Constant * 4000bab0cdab751248ca389a5592bcb70eac5d39260John McCallCGCXXABI::EmitNullMemberPointer(const MemberPointerType *MPT) { 401d608cdb7c044365cf4e8764ade1e11e99c176078John McCall return GetBogusMemberPointer(CGM, QualType(MPT, 0)); 402cf2c85e76fdafe7e634810a292321a6c8322483dJohn McCall} 403cf2c85e76fdafe7e634810a292321a6c8322483dJohn McCall 4040bab0cdab751248ca389a5592bcb70eac5d39260John McCallllvm::Constant *CGCXXABI::EmitMemberPointer(const CXXMethodDecl *MD) { 405d608cdb7c044365cf4e8764ade1e11e99c176078John McCall return GetBogusMemberPointer(CGM, 406d608cdb7c044365cf4e8764ade1e11e99c176078John McCall CGM.getContext().getMemberPointerType(MD->getType(), 407d608cdb7c044365cf4e8764ade1e11e99c176078John McCall MD->getParent()->getTypeForDecl())); 408875ab10245d3bf37252dd822aa1616bb0a391095John McCall} 409875ab10245d3bf37252dd822aa1616bb0a391095John McCall 4100bab0cdab751248ca389a5592bcb70eac5d39260John McCallllvm::Constant *CGCXXABI::EmitMemberPointer(const FieldDecl *FD) { 4110bab0cdab751248ca389a5592bcb70eac5d39260John McCall return GetBogusMemberPointer(CGM, 4120bab0cdab751248ca389a5592bcb70eac5d39260John McCall CGM.getContext().getMemberPointerType(FD->getType(), 4130bab0cdab751248ca389a5592bcb70eac5d39260John McCall FD->getParent()->getTypeForDecl())); 4140bab0cdab751248ca389a5592bcb70eac5d39260John McCall} 4150bab0cdab751248ca389a5592bcb70eac5d39260John McCall 416f16aa103d3afd42fbca2ab346f191bf745cec092John McCallbool CGCXXABI::isZeroInitializable(const MemberPointerType *MPT) { 417f16aa103d3afd42fbca2ab346f191bf745cec092John McCall // Fake answer. 418f16aa103d3afd42fbca2ab346f191bf745cec092John McCall return true; 4193023def6bea3af6dbb51eea51f8cb8ea892d26cfJohn McCall} 4204c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall 4214c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCallvoid CGCXXABI::BuildThisParam(CodeGenFunction &CGF, FunctionArgList &Params) { 4224c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall const CXXMethodDecl *MD = cast<CXXMethodDecl>(CGF.CurGD.getDecl()); 4234c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall 4244c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall // FIXME: I'm not entirely sure I like using a fake decl just for code 4254c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall // generation. Maybe we can come up with a better way? 4264c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall ImplicitParamDecl *ThisDecl 4274c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall = ImplicitParamDecl::Create(CGM.getContext(), 0, MD->getLocation(), 4284c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall &CGM.getContext().Idents.get("this"), 4294c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall MD->getThisType(CGM.getContext())); 4304c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall Params.push_back(std::make_pair(ThisDecl, ThisDecl->getType())); 4314c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall getThisDecl(CGF) = ThisDecl; 4324c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall} 4334c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall 4344c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCallvoid CGCXXABI::EmitThisParam(CodeGenFunction &CGF) { 4354c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall /// Initialize the 'this' slot. 4364c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall assert(getThisDecl(CGF) && "no 'this' variable for function"); 4374c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall getThisValue(CGF) 4384c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall = CGF.Builder.CreateLoad(CGF.GetAddrOfLocalVar(getThisDecl(CGF)), 4394c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall "this"); 4404c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall} 4414c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall 4424c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCallvoid CGCXXABI::EmitReturnFromThunk(CodeGenFunction &CGF, 4434c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall RValue RV, QualType ResultType) { 4444c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall CGF.EmitReturnOfRValue(RV, ResultType); 4454c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall} 4461e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall 4471e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCallCharUnits CGCXXABI::GetArrayCookieSize(QualType ElementType) { 4481e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall return CharUnits::Zero(); 4491e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall} 4501e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall 4511e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCallllvm::Value *CGCXXABI::InitializeArrayCookie(CodeGenFunction &CGF, 4521e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall llvm::Value *NewPtr, 4531e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall llvm::Value *NumElements, 4541e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall QualType ElementType) { 4551e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall // Should never be called. 4561e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall ErrorUnsupportedABI(CGF, "array cookie initialization"); 4571e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall return 0; 4581e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall} 4591e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall 4601e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCallvoid CGCXXABI::ReadArrayCookie(CodeGenFunction &CGF, llvm::Value *Ptr, 4611e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall QualType ElementType, llvm::Value *&NumElements, 4621e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall llvm::Value *&AllocPtr, CharUnits &CookieSize) { 4631e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall ErrorUnsupportedABI(CGF, "array cookie reading"); 4641e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall 4651e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall // This should be enough to avoid assertions. 4661e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall NumElements = 0; 4671e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall AllocPtr = llvm::Constant::getNullValue(CGF.Builder.getInt8PtrTy()); 4681e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall CookieSize = CharUnits::Zero(); 4691e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall} 4705cd91b513455fd7753e8815b54f0a49bbca6602dJohn McCall 4715cd91b513455fd7753e8815b54f0a49bbca6602dJohn McCallvoid CGCXXABI::EmitStaticLocalInit(CodeGenFunction &CGF, 4725cd91b513455fd7753e8815b54f0a49bbca6602dJohn McCall const VarDecl &D, 4735cd91b513455fd7753e8815b54f0a49bbca6602dJohn McCall llvm::GlobalVariable *GV) { 4745cd91b513455fd7753e8815b54f0a49bbca6602dJohn McCall ErrorUnsupportedABI(CGF, "static local variable initialization"); 4755cd91b513455fd7753e8815b54f0a49bbca6602dJohn McCall} 476