1 //===--- CGVTables.cpp - Emit LLVM Code for C++ vtables -------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This contains code dealing with C++ code generation of virtual tables.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "CodeGenFunction.h"
15 #include "CGCXXABI.h"
16 #include "CodeGenModule.h"
17 #include "clang/AST/CXXInheritance.h"
18 #include "clang/AST/RecordLayout.h"
19 #include "clang/CodeGen/CGFunctionInfo.h"
20 #include "clang/Frontend/CodeGenOptions.h"
21 #include "llvm/ADT/DenseSet.h"
22 #include "llvm/ADT/SetVector.h"
23 #include "llvm/Support/Compiler.h"
24 #include "llvm/Support/Format.h"
25 #include "llvm/Transforms/Utils/Cloning.h"
26 #include <algorithm>
27 #include <cstdio>
28 
29 using namespace clang;
30 using namespace CodeGen;
31 
32 CodeGenVTables::CodeGenVTables(CodeGenModule &CGM)
33   : CGM(CGM), VTContext(CGM.getContext()) {
34   if (CGM.getTarget().getCXXABI().isMicrosoft()) {
35     // FIXME: Eventually, we should only have one of V*TContexts available.
36     // Today we use both in the Microsoft ABI as MicrosoftVFTableContext
37     // is not completely supported in CodeGen yet.
38     VFTContext.reset(new MicrosoftVFTableContext(CGM.getContext()));
39   }
40 }
41 
42 llvm::Constant *CodeGenModule::GetAddrOfThunk(GlobalDecl GD,
43                                               const ThunkInfo &Thunk) {
44   const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl());
45 
46   // Compute the mangled name.
47   SmallString<256> Name;
48   llvm::raw_svector_ostream Out(Name);
49   if (const CXXDestructorDecl* DD = dyn_cast<CXXDestructorDecl>(MD))
50     getCXXABI().getMangleContext().mangleCXXDtorThunk(DD, GD.getDtorType(),
51                                                       Thunk.This, Out);
52   else
53     getCXXABI().getMangleContext().mangleThunk(MD, Thunk, Out);
54   Out.flush();
55 
56   llvm::Type *Ty = getTypes().GetFunctionTypeForVTable(GD);
57   return GetOrCreateLLVMFunction(Name, Ty, GD, /*ForVTable=*/true);
58 }
59 
60 static void setThunkVisibility(CodeGenModule &CGM, const CXXMethodDecl *MD,
61                                const ThunkInfo &Thunk, llvm::Function *Fn) {
62   CGM.setGlobalVisibility(Fn, MD);
63 
64   if (!CGM.getCodeGenOpts().HiddenWeakVTables)
65     return;
66 
67   // If the thunk has weak/linkonce linkage, but the function must be
68   // emitted in every translation unit that references it, then we can
69   // emit its thunks with hidden visibility, since its thunks must be
70   // emitted when the function is.
71 
72   // This follows CodeGenModule::setTypeVisibility; see the comments
73   // there for explanation.
74 
75   if ((Fn->getLinkage() != llvm::GlobalVariable::LinkOnceODRLinkage &&
76        Fn->getLinkage() != llvm::GlobalVariable::WeakODRLinkage) ||
77       Fn->getVisibility() != llvm::GlobalVariable::DefaultVisibility)
78     return;
79 
80   if (MD->getExplicitVisibility(ValueDecl::VisibilityForValue))
81     return;
82 
83   switch (MD->getTemplateSpecializationKind()) {
84   case TSK_ExplicitInstantiationDefinition:
85   case TSK_ExplicitInstantiationDeclaration:
86     return;
87 
88   case TSK_Undeclared:
89     break;
90 
91   case TSK_ExplicitSpecialization:
92   case TSK_ImplicitInstantiation:
93     return;
94     break;
95   }
96 
97   // If there's an explicit definition, and that definition is
98   // out-of-line, then we can't assume that all users will have a
99   // definition to emit.
100   const FunctionDecl *Def = 0;
101   if (MD->hasBody(Def) && Def->isOutOfLine())
102     return;
103 
104   Fn->setVisibility(llvm::GlobalValue::HiddenVisibility);
105 }
106 
107 #ifndef NDEBUG
108 static bool similar(const ABIArgInfo &infoL, CanQualType typeL,
109                     const ABIArgInfo &infoR, CanQualType typeR) {
110   return (infoL.getKind() == infoR.getKind() &&
111           (typeL == typeR ||
112            (isa<PointerType>(typeL) && isa<PointerType>(typeR)) ||
113            (isa<ReferenceType>(typeL) && isa<ReferenceType>(typeR))));
114 }
115 #endif
116 
117 static RValue PerformReturnAdjustment(CodeGenFunction &CGF,
118                                       QualType ResultType, RValue RV,
119                                       const ThunkInfo &Thunk) {
120   // Emit the return adjustment.
121   bool NullCheckValue = !ResultType->isReferenceType();
122 
123   llvm::BasicBlock *AdjustNull = 0;
124   llvm::BasicBlock *AdjustNotNull = 0;
125   llvm::BasicBlock *AdjustEnd = 0;
126 
127   llvm::Value *ReturnValue = RV.getScalarVal();
128 
129   if (NullCheckValue) {
130     AdjustNull = CGF.createBasicBlock("adjust.null");
131     AdjustNotNull = CGF.createBasicBlock("adjust.notnull");
132     AdjustEnd = CGF.createBasicBlock("adjust.end");
133 
134     llvm::Value *IsNull = CGF.Builder.CreateIsNull(ReturnValue);
135     CGF.Builder.CreateCondBr(IsNull, AdjustNull, AdjustNotNull);
136     CGF.EmitBlock(AdjustNotNull);
137   }
138 
139   ReturnValue = CGF.CGM.getCXXABI().performReturnAdjustment(CGF, ReturnValue,
140                                                             Thunk.Return);
141 
142   if (NullCheckValue) {
143     CGF.Builder.CreateBr(AdjustEnd);
144     CGF.EmitBlock(AdjustNull);
145     CGF.Builder.CreateBr(AdjustEnd);
146     CGF.EmitBlock(AdjustEnd);
147 
148     llvm::PHINode *PHI = CGF.Builder.CreatePHI(ReturnValue->getType(), 2);
149     PHI->addIncoming(ReturnValue, AdjustNotNull);
150     PHI->addIncoming(llvm::Constant::getNullValue(ReturnValue->getType()),
151                      AdjustNull);
152     ReturnValue = PHI;
153   }
154 
155   return RValue::get(ReturnValue);
156 }
157 
158 // This function does roughly the same thing as GenerateThunk, but in a
159 // very different way, so that va_start and va_end work correctly.
160 // FIXME: This function assumes "this" is the first non-sret LLVM argument of
161 //        a function, and that there is an alloca built in the entry block
162 //        for all accesses to "this".
163 // FIXME: This function assumes there is only one "ret" statement per function.
164 // FIXME: Cloning isn't correct in the presence of indirect goto!
165 // FIXME: This implementation of thunks bloats codesize by duplicating the
166 //        function definition.  There are alternatives:
167 //        1. Add some sort of stub support to LLVM for cases where we can
168 //           do a this adjustment, then a sibcall.
169 //        2. We could transform the definition to take a va_list instead of an
170 //           actual variable argument list, then have the thunks (including a
171 //           no-op thunk for the regular definition) call va_start/va_end.
172 //           There's a bit of per-call overhead for this solution, but it's
173 //           better for codesize if the definition is long.
174 void CodeGenFunction::GenerateVarArgsThunk(
175                                       llvm::Function *Fn,
176                                       const CGFunctionInfo &FnInfo,
177                                       GlobalDecl GD, const ThunkInfo &Thunk) {
178   const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl());
179   const FunctionProtoType *FPT = MD->getType()->getAs<FunctionProtoType>();
180   QualType ResultType = FPT->getResultType();
181 
182   // Get the original function
183   assert(FnInfo.isVariadic());
184   llvm::Type *Ty = CGM.getTypes().GetFunctionType(FnInfo);
185   llvm::Value *Callee = CGM.GetAddrOfFunction(GD, Ty, /*ForVTable=*/true);
186   llvm::Function *BaseFn = cast<llvm::Function>(Callee);
187 
188   // Clone to thunk.
189   llvm::ValueToValueMapTy VMap;
190   llvm::Function *NewFn = llvm::CloneFunction(BaseFn, VMap,
191                                               /*ModuleLevelChanges=*/false);
192   CGM.getModule().getFunctionList().push_back(NewFn);
193   Fn->replaceAllUsesWith(NewFn);
194   NewFn->takeName(Fn);
195   Fn->eraseFromParent();
196   Fn = NewFn;
197 
198   // "Initialize" CGF (minimally).
199   CurFn = Fn;
200 
201   // Get the "this" value
202   llvm::Function::arg_iterator AI = Fn->arg_begin();
203   if (CGM.ReturnTypeUsesSRet(FnInfo))
204     ++AI;
205 
206   // Find the first store of "this", which will be to the alloca associated
207   // with "this".
208   llvm::Value *ThisPtr = &*AI;
209   llvm::BasicBlock *EntryBB = Fn->begin();
210   llvm::Instruction *ThisStore = 0;
211   for (llvm::BasicBlock::iterator I = EntryBB->begin(), E = EntryBB->end();
212        I != E; I++) {
213     if (isa<llvm::StoreInst>(I) && I->getOperand(0) == ThisPtr) {
214       ThisStore = cast<llvm::StoreInst>(I);
215       break;
216     }
217   }
218   assert(ThisStore && "Store of this should be in entry block?");
219   // Adjust "this", if necessary.
220   Builder.SetInsertPoint(ThisStore);
221   llvm::Value *AdjustedThisPtr =
222       CGM.getCXXABI().performThisAdjustment(*this, ThisPtr, Thunk.This);
223   ThisStore->setOperand(0, AdjustedThisPtr);
224 
225   if (!Thunk.Return.isEmpty()) {
226     // Fix up the returned value, if necessary.
227     for (llvm::Function::iterator I = Fn->begin(), E = Fn->end(); I != E; I++) {
228       llvm::Instruction *T = I->getTerminator();
229       if (isa<llvm::ReturnInst>(T)) {
230         RValue RV = RValue::get(T->getOperand(0));
231         T->eraseFromParent();
232         Builder.SetInsertPoint(&*I);
233         RV = PerformReturnAdjustment(*this, ResultType, RV, Thunk);
234         Builder.CreateRet(RV.getScalarVal());
235         break;
236       }
237     }
238   }
239 }
240 
241 void CodeGenFunction::GenerateThunk(llvm::Function *Fn,
242                                     const CGFunctionInfo &FnInfo,
243                                     GlobalDecl GD, const ThunkInfo &Thunk) {
244   const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl());
245   const FunctionProtoType *FPT = MD->getType()->getAs<FunctionProtoType>();
246   QualType ThisType = MD->getThisType(getContext());
247   QualType ResultType =
248     CGM.getCXXABI().HasThisReturn(GD) ? ThisType : FPT->getResultType();
249 
250   FunctionArgList FunctionArgs;
251 
252   // FIXME: It would be nice if more of this code could be shared with
253   // CodeGenFunction::GenerateCode.
254 
255   // Create the implicit 'this' parameter declaration.
256   CurGD = GD;
257   CGM.getCXXABI().BuildInstanceFunctionParams(*this, ResultType, FunctionArgs);
258 
259   // Add the rest of the parameters.
260   for (FunctionDecl::param_const_iterator I = MD->param_begin(),
261        E = MD->param_end(); I != E; ++I) {
262     ParmVarDecl *Param = *I;
263 
264     FunctionArgs.push_back(Param);
265   }
266 
267   StartFunction(GlobalDecl(), ResultType, Fn, FnInfo, FunctionArgs,
268                 SourceLocation());
269 
270   CGM.getCXXABI().EmitInstanceFunctionProlog(*this);
271   CXXThisValue = CXXABIThisValue;
272 
273   // Adjust the 'this' pointer if necessary.
274   llvm::Value *AdjustedThisPtr =
275       CGM.getCXXABI().performThisAdjustment(*this, LoadCXXThis(), Thunk.This);
276 
277   CallArgList CallArgs;
278 
279   // Add our adjusted 'this' pointer.
280   CallArgs.add(RValue::get(AdjustedThisPtr), ThisType);
281 
282   if (isa<CXXDestructorDecl>(MD))
283     CGM.getCXXABI().adjustCallArgsForDestructorThunk(*this, GD, CallArgs);
284 
285   // Add the rest of the parameters.
286   for (FunctionDecl::param_const_iterator I = MD->param_begin(),
287        E = MD->param_end(); I != E; ++I) {
288     ParmVarDecl *param = *I;
289     EmitDelegateCallArg(CallArgs, param, param->getLocStart());
290   }
291 
292   // Get our callee.
293   llvm::Type *Ty =
294     CGM.getTypes().GetFunctionType(CGM.getTypes().arrangeGlobalDeclaration(GD));
295   llvm::Value *Callee = CGM.GetAddrOfFunction(GD, Ty, /*ForVTable=*/true);
296 
297 #ifndef NDEBUG
298   const CGFunctionInfo &CallFnInfo =
299     CGM.getTypes().arrangeCXXMethodCall(CallArgs, FPT,
300                                        RequiredArgs::forPrototypePlus(FPT, 1));
301   assert(CallFnInfo.getRegParm() == FnInfo.getRegParm() &&
302          CallFnInfo.isNoReturn() == FnInfo.isNoReturn() &&
303          CallFnInfo.getCallingConvention() == FnInfo.getCallingConvention());
304   assert(isa<CXXDestructorDecl>(MD) || // ignore dtor return types
305          similar(CallFnInfo.getReturnInfo(), CallFnInfo.getReturnType(),
306                  FnInfo.getReturnInfo(), FnInfo.getReturnType()));
307   assert(CallFnInfo.arg_size() == FnInfo.arg_size());
308   for (unsigned i = 0, e = FnInfo.arg_size(); i != e; ++i)
309     assert(similar(CallFnInfo.arg_begin()[i].info,
310                    CallFnInfo.arg_begin()[i].type,
311                    FnInfo.arg_begin()[i].info, FnInfo.arg_begin()[i].type));
312 #endif
313 
314   // Determine whether we have a return value slot to use.
315   ReturnValueSlot Slot;
316   if (!ResultType->isVoidType() &&
317       FnInfo.getReturnInfo().getKind() == ABIArgInfo::Indirect &&
318       !hasScalarEvaluationKind(CurFnInfo->getReturnType()))
319     Slot = ReturnValueSlot(ReturnValue, ResultType.isVolatileQualified());
320 
321   // Now emit our call.
322   RValue RV = EmitCall(FnInfo, Callee, Slot, CallArgs, MD);
323 
324   if (!Thunk.Return.isEmpty())
325     RV = PerformReturnAdjustment(*this, ResultType, RV, Thunk);
326 
327   if (!ResultType->isVoidType() && Slot.isNull())
328     CGM.getCXXABI().EmitReturnFromThunk(*this, RV, ResultType);
329 
330   // Disable the final ARC autorelease.
331   AutoreleaseResult = false;
332 
333   FinishFunction();
334 
335   // Set the right linkage.
336   CGM.setFunctionLinkage(GD, Fn);
337 
338   // Set the right visibility.
339   setThunkVisibility(CGM, MD, Thunk, Fn);
340 }
341 
342 void CodeGenVTables::emitThunk(GlobalDecl GD, const ThunkInfo &Thunk,
343                                bool ForVTable) {
344   const CGFunctionInfo &FnInfo = CGM.getTypes().arrangeGlobalDeclaration(GD);
345 
346   // FIXME: re-use FnInfo in this computation.
347   llvm::Constant *Entry = CGM.GetAddrOfThunk(GD, Thunk);
348 
349   // Strip off a bitcast if we got one back.
350   if (llvm::ConstantExpr *CE = dyn_cast<llvm::ConstantExpr>(Entry)) {
351     assert(CE->getOpcode() == llvm::Instruction::BitCast);
352     Entry = CE->getOperand(0);
353   }
354 
355   // There's already a declaration with the same name, check if it has the same
356   // type or if we need to replace it.
357   if (cast<llvm::GlobalValue>(Entry)->getType()->getElementType() !=
358       CGM.getTypes().GetFunctionTypeForVTable(GD)) {
359     llvm::GlobalValue *OldThunkFn = cast<llvm::GlobalValue>(Entry);
360 
361     // If the types mismatch then we have to rewrite the definition.
362     assert(OldThunkFn->isDeclaration() &&
363            "Shouldn't replace non-declaration");
364 
365     // Remove the name from the old thunk function and get a new thunk.
366     OldThunkFn->setName(StringRef());
367     Entry = CGM.GetAddrOfThunk(GD, Thunk);
368 
369     // If needed, replace the old thunk with a bitcast.
370     if (!OldThunkFn->use_empty()) {
371       llvm::Constant *NewPtrForOldDecl =
372         llvm::ConstantExpr::getBitCast(Entry, OldThunkFn->getType());
373       OldThunkFn->replaceAllUsesWith(NewPtrForOldDecl);
374     }
375 
376     // Remove the old thunk.
377     OldThunkFn->eraseFromParent();
378   }
379 
380   llvm::Function *ThunkFn = cast<llvm::Function>(Entry);
381   bool ABIHasKeyFunctions = CGM.getTarget().getCXXABI().hasKeyFunctions();
382   bool UseAvailableExternallyLinkage = ForVTable && ABIHasKeyFunctions;
383 
384   if (!ThunkFn->isDeclaration()) {
385     if (!ABIHasKeyFunctions || UseAvailableExternallyLinkage) {
386       // There is already a thunk emitted for this function, do nothing.
387       return;
388     }
389 
390     // If a function has a body, it should have available_externally linkage.
391     assert(ThunkFn->hasAvailableExternallyLinkage() &&
392            "Function should have available_externally linkage!");
393 
394     // Change the linkage.
395     CGM.setFunctionLinkage(GD, ThunkFn);
396     return;
397   }
398 
399   CGM.SetLLVMFunctionAttributesForDefinition(GD.getDecl(), ThunkFn);
400 
401   if (ThunkFn->isVarArg()) {
402     // Varargs thunks are special; we can't just generate a call because
403     // we can't copy the varargs.  Our implementation is rather
404     // expensive/sucky at the moment, so don't generate the thunk unless
405     // we have to.
406     // FIXME: Do something better here; GenerateVarArgsThunk is extremely ugly.
407     if (!UseAvailableExternallyLinkage)
408       CodeGenFunction(CGM).GenerateVarArgsThunk(ThunkFn, FnInfo, GD, Thunk);
409   } else {
410     // Normal thunk body generation.
411     CodeGenFunction(CGM).GenerateThunk(ThunkFn, FnInfo, GD, Thunk);
412   }
413 
414   CGM.getCXXABI().setThunkLinkage(ThunkFn, ForVTable);
415 }
416 
417 void CodeGenVTables::maybeEmitThunkForVTable(GlobalDecl GD,
418                                              const ThunkInfo &Thunk) {
419   // If the ABI has key functions, only the TU with the key function should emit
420   // the thunk. However, we can allow inlining of thunks if we emit them with
421   // available_externally linkage together with vtables when optimizations are
422   // enabled.
423   if (CGM.getTarget().getCXXABI().hasKeyFunctions() &&
424       !CGM.getCodeGenOpts().OptimizationLevel)
425     return;
426 
427   // We can't emit thunks for member functions with incomplete types.
428   const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl());
429   if (!CGM.getTypes().isFuncTypeConvertible(
430            MD->getType()->castAs<FunctionType>()))
431     return;
432 
433   emitThunk(GD, Thunk, /*ForVTable=*/true);
434 }
435 
436 void CodeGenVTables::EmitThunks(GlobalDecl GD)
437 {
438   const CXXMethodDecl *MD =
439     cast<CXXMethodDecl>(GD.getDecl())->getCanonicalDecl();
440 
441   // We don't need to generate thunks for the base destructor.
442   if (isa<CXXDestructorDecl>(MD) && GD.getDtorType() == Dtor_Base)
443     return;
444 
445   const VTableContextBase::ThunkInfoVectorTy *ThunkInfoVector;
446   if (VFTContext.isValid()) {
447     ThunkInfoVector = VFTContext->getThunkInfo(GD);
448   } else {
449     ThunkInfoVector = VTContext.getThunkInfo(GD);
450   }
451 
452   if (!ThunkInfoVector)
453     return;
454 
455   for (unsigned I = 0, E = ThunkInfoVector->size(); I != E; ++I)
456     emitThunk(GD, (*ThunkInfoVector)[I], /*ForVTable=*/false);
457 }
458 
459 llvm::Constant *
460 CodeGenVTables::CreateVTableInitializer(const CXXRecordDecl *RD,
461                                         const VTableComponent *Components,
462                                         unsigned NumComponents,
463                                 const VTableLayout::VTableThunkTy *VTableThunks,
464                                         unsigned NumVTableThunks) {
465   SmallVector<llvm::Constant *, 64> Inits;
466 
467   llvm::Type *Int8PtrTy = CGM.Int8PtrTy;
468 
469   llvm::Type *PtrDiffTy =
470     CGM.getTypes().ConvertType(CGM.getContext().getPointerDiffType());
471 
472   QualType ClassType = CGM.getContext().getTagDeclType(RD);
473   llvm::Constant *RTTI = CGM.GetAddrOfRTTIDescriptor(ClassType);
474 
475   unsigned NextVTableThunkIndex = 0;
476 
477   llvm::Constant *PureVirtualFn = 0, *DeletedVirtualFn = 0;
478 
479   for (unsigned I = 0; I != NumComponents; ++I) {
480     VTableComponent Component = Components[I];
481 
482     llvm::Constant *Init = 0;
483 
484     switch (Component.getKind()) {
485     case VTableComponent::CK_VCallOffset:
486       Init = llvm::ConstantInt::get(PtrDiffTy,
487                                     Component.getVCallOffset().getQuantity());
488       Init = llvm::ConstantExpr::getIntToPtr(Init, Int8PtrTy);
489       break;
490     case VTableComponent::CK_VBaseOffset:
491       Init = llvm::ConstantInt::get(PtrDiffTy,
492                                     Component.getVBaseOffset().getQuantity());
493       Init = llvm::ConstantExpr::getIntToPtr(Init, Int8PtrTy);
494       break;
495     case VTableComponent::CK_OffsetToTop:
496       Init = llvm::ConstantInt::get(PtrDiffTy,
497                                     Component.getOffsetToTop().getQuantity());
498       Init = llvm::ConstantExpr::getIntToPtr(Init, Int8PtrTy);
499       break;
500     case VTableComponent::CK_RTTI:
501       Init = llvm::ConstantExpr::getBitCast(RTTI, Int8PtrTy);
502       break;
503     case VTableComponent::CK_FunctionPointer:
504     case VTableComponent::CK_CompleteDtorPointer:
505     case VTableComponent::CK_DeletingDtorPointer: {
506       GlobalDecl GD;
507 
508       // Get the right global decl.
509       switch (Component.getKind()) {
510       default:
511         llvm_unreachable("Unexpected vtable component kind");
512       case VTableComponent::CK_FunctionPointer:
513         GD = Component.getFunctionDecl();
514         break;
515       case VTableComponent::CK_CompleteDtorPointer:
516         GD = GlobalDecl(Component.getDestructorDecl(), Dtor_Complete);
517         break;
518       case VTableComponent::CK_DeletingDtorPointer:
519         GD = GlobalDecl(Component.getDestructorDecl(), Dtor_Deleting);
520         break;
521       }
522 
523       if (cast<CXXMethodDecl>(GD.getDecl())->isPure()) {
524         // We have a pure virtual member function.
525         if (!PureVirtualFn) {
526           llvm::FunctionType *Ty =
527             llvm::FunctionType::get(CGM.VoidTy, /*isVarArg=*/false);
528           StringRef PureCallName = CGM.getCXXABI().GetPureVirtualCallName();
529           PureVirtualFn = CGM.CreateRuntimeFunction(Ty, PureCallName);
530           PureVirtualFn = llvm::ConstantExpr::getBitCast(PureVirtualFn,
531                                                          CGM.Int8PtrTy);
532         }
533         Init = PureVirtualFn;
534       } else if (cast<CXXMethodDecl>(GD.getDecl())->isDeleted()) {
535         if (!DeletedVirtualFn) {
536           llvm::FunctionType *Ty =
537             llvm::FunctionType::get(CGM.VoidTy, /*isVarArg=*/false);
538           StringRef DeletedCallName =
539             CGM.getCXXABI().GetDeletedVirtualCallName();
540           DeletedVirtualFn = CGM.CreateRuntimeFunction(Ty, DeletedCallName);
541           DeletedVirtualFn = llvm::ConstantExpr::getBitCast(DeletedVirtualFn,
542                                                          CGM.Int8PtrTy);
543         }
544         Init = DeletedVirtualFn;
545       } else {
546         // Check if we should use a thunk.
547         if (NextVTableThunkIndex < NumVTableThunks &&
548             VTableThunks[NextVTableThunkIndex].first == I) {
549           const ThunkInfo &Thunk = VTableThunks[NextVTableThunkIndex].second;
550 
551           maybeEmitThunkForVTable(GD, Thunk);
552           Init = CGM.GetAddrOfThunk(GD, Thunk);
553 
554           NextVTableThunkIndex++;
555         } else {
556           llvm::Type *Ty = CGM.getTypes().GetFunctionTypeForVTable(GD);
557 
558           Init = CGM.GetAddrOfFunction(GD, Ty, /*ForVTable=*/true);
559         }
560 
561         Init = llvm::ConstantExpr::getBitCast(Init, Int8PtrTy);
562       }
563       break;
564     }
565 
566     case VTableComponent::CK_UnusedFunctionPointer:
567       Init = llvm::ConstantExpr::getNullValue(Int8PtrTy);
568       break;
569     };
570 
571     Inits.push_back(Init);
572   }
573 
574   llvm::ArrayType *ArrayType = llvm::ArrayType::get(Int8PtrTy, NumComponents);
575   return llvm::ConstantArray::get(ArrayType, Inits);
576 }
577 
578 llvm::GlobalVariable *
579 CodeGenVTables::GenerateConstructionVTable(const CXXRecordDecl *RD,
580                                       const BaseSubobject &Base,
581                                       bool BaseIsVirtual,
582                                    llvm::GlobalVariable::LinkageTypes Linkage,
583                                       VTableAddressPointsMapTy& AddressPoints) {
584   if (CGDebugInfo *DI = CGM.getModuleDebugInfo())
585     DI->completeClassData(Base.getBase());
586 
587   OwningPtr<VTableLayout> VTLayout(
588     VTContext.createConstructionVTableLayout(Base.getBase(),
589                                              Base.getBaseOffset(),
590                                              BaseIsVirtual, RD));
591 
592   // Add the address points.
593   AddressPoints = VTLayout->getAddressPoints();
594 
595   // Get the mangled construction vtable name.
596   SmallString<256> OutName;
597   llvm::raw_svector_ostream Out(OutName);
598   cast<ItaniumMangleContext>(CGM.getCXXABI().getMangleContext())
599       .mangleCXXCtorVTable(RD, Base.getBaseOffset().getQuantity(),
600                            Base.getBase(), Out);
601   Out.flush();
602   StringRef Name = OutName.str();
603 
604   llvm::ArrayType *ArrayType =
605     llvm::ArrayType::get(CGM.Int8PtrTy, VTLayout->getNumVTableComponents());
606 
607   // Construction vtable symbols are not part of the Itanium ABI, so we cannot
608   // guarantee that they actually will be available externally. Instead, when
609   // emitting an available_externally VTT, we provide references to an internal
610   // linkage construction vtable. The ABI only requires complete-object vtables
611   // to be the same for all instances of a type, not construction vtables.
612   if (Linkage == llvm::GlobalVariable::AvailableExternallyLinkage)
613     Linkage = llvm::GlobalVariable::InternalLinkage;
614 
615   // Create the variable that will hold the construction vtable.
616   llvm::GlobalVariable *VTable =
617     CGM.CreateOrReplaceCXXRuntimeVariable(Name, ArrayType, Linkage);
618   CGM.setTypeVisibility(VTable, RD, CodeGenModule::TVK_ForConstructionVTable);
619 
620   // V-tables are always unnamed_addr.
621   VTable->setUnnamedAddr(true);
622 
623   // Create and set the initializer.
624   llvm::Constant *Init =
625     CreateVTableInitializer(Base.getBase(),
626                             VTLayout->vtable_component_begin(),
627                             VTLayout->getNumVTableComponents(),
628                             VTLayout->vtable_thunk_begin(),
629                             VTLayout->getNumVTableThunks());
630   VTable->setInitializer(Init);
631 
632   return VTable;
633 }
634 
635 /// Compute the required linkage of the v-table for the given class.
636 ///
637 /// Note that we only call this at the end of the translation unit.
638 llvm::GlobalVariable::LinkageTypes
639 CodeGenModule::getVTableLinkage(const CXXRecordDecl *RD) {
640   if (!RD->isExternallyVisible())
641     return llvm::GlobalVariable::InternalLinkage;
642 
643   // We're at the end of the translation unit, so the current key
644   // function is fully correct.
645   if (const CXXMethodDecl *keyFunction = Context.getCurrentKeyFunction(RD)) {
646     // If this class has a key function, use that to determine the
647     // linkage of the vtable.
648     const FunctionDecl *def = 0;
649     if (keyFunction->hasBody(def))
650       keyFunction = cast<CXXMethodDecl>(def);
651 
652     switch (keyFunction->getTemplateSpecializationKind()) {
653       case TSK_Undeclared:
654       case TSK_ExplicitSpecialization:
655         assert(def && "Should not have been asked to emit this");
656         if (keyFunction->isInlined())
657           return !Context.getLangOpts().AppleKext ?
658                    llvm::GlobalVariable::LinkOnceODRLinkage :
659                    llvm::Function::InternalLinkage;
660 
661         return llvm::GlobalVariable::ExternalLinkage;
662 
663       case TSK_ImplicitInstantiation:
664         return !Context.getLangOpts().AppleKext ?
665                  llvm::GlobalVariable::LinkOnceODRLinkage :
666                  llvm::Function::InternalLinkage;
667 
668       case TSK_ExplicitInstantiationDefinition:
669         return !Context.getLangOpts().AppleKext ?
670                  llvm::GlobalVariable::WeakODRLinkage :
671                  llvm::Function::InternalLinkage;
672 
673       case TSK_ExplicitInstantiationDeclaration:
674         llvm_unreachable("Should not have been asked to emit this");
675     }
676   }
677 
678   // -fapple-kext mode does not support weak linkage, so we must use
679   // internal linkage.
680   if (Context.getLangOpts().AppleKext)
681     return llvm::Function::InternalLinkage;
682 
683   switch (RD->getTemplateSpecializationKind()) {
684   case TSK_Undeclared:
685   case TSK_ExplicitSpecialization:
686   case TSK_ImplicitInstantiation:
687     return llvm::GlobalVariable::LinkOnceODRLinkage;
688 
689   case TSK_ExplicitInstantiationDeclaration:
690     llvm_unreachable("Should not have been asked to emit this");
691 
692   case TSK_ExplicitInstantiationDefinition:
693       return llvm::GlobalVariable::WeakODRLinkage;
694   }
695 
696   llvm_unreachable("Invalid TemplateSpecializationKind!");
697 }
698 
699 /// This is a callback from Sema to tell us that it believes that a
700 /// particular v-table is required to be emitted in this translation
701 /// unit.
702 ///
703 /// The reason we don't simply trust this callback is because Sema
704 /// will happily report that something is used even when it's used
705 /// only in code that we don't actually have to emit.
706 ///
707 /// \param isRequired - if true, the v-table is mandatory, e.g.
708 ///   because the translation unit defines the key function
709 void CodeGenModule::EmitVTable(CXXRecordDecl *theClass, bool isRequired) {
710   if (!isRequired) return;
711 
712   VTables.GenerateClassData(theClass);
713 }
714 
715 void
716 CodeGenVTables::GenerateClassData(const CXXRecordDecl *RD) {
717   if (CGDebugInfo *DI = CGM.getModuleDebugInfo())
718     DI->completeClassData(RD);
719 
720   if (RD->getNumVBases())
721     CGM.getCXXABI().emitVirtualInheritanceTables(RD);
722 
723   CGM.getCXXABI().emitVTableDefinitions(*this, RD);
724 }
725 
726 /// At this point in the translation unit, does it appear that can we
727 /// rely on the vtable being defined elsewhere in the program?
728 ///
729 /// The response is really only definitive when called at the end of
730 /// the translation unit.
731 ///
732 /// The only semantic restriction here is that the object file should
733 /// not contain a v-table definition when that v-table is defined
734 /// strongly elsewhere.  Otherwise, we'd just like to avoid emitting
735 /// v-tables when unnecessary.
736 bool CodeGenVTables::isVTableExternal(const CXXRecordDecl *RD) {
737   assert(RD->isDynamicClass() && "Non dynamic classes have no VTable.");
738 
739   // If we have an explicit instantiation declaration (and not a
740   // definition), the v-table is defined elsewhere.
741   TemplateSpecializationKind TSK = RD->getTemplateSpecializationKind();
742   if (TSK == TSK_ExplicitInstantiationDeclaration)
743     return true;
744 
745   // Otherwise, if the class is an instantiated template, the
746   // v-table must be defined here.
747   if (TSK == TSK_ImplicitInstantiation ||
748       TSK == TSK_ExplicitInstantiationDefinition)
749     return false;
750 
751   // Otherwise, if the class doesn't have a key function (possibly
752   // anymore), the v-table must be defined here.
753   const CXXMethodDecl *keyFunction = CGM.getContext().getCurrentKeyFunction(RD);
754   if (!keyFunction)
755     return false;
756 
757   // Otherwise, if we don't have a definition of the key function, the
758   // v-table must be defined somewhere else.
759   return !keyFunction->hasBody();
760 }
761 
762 /// Given that we're currently at the end of the translation unit, and
763 /// we've emitted a reference to the v-table for this class, should
764 /// we define that v-table?
765 static bool shouldEmitVTableAtEndOfTranslationUnit(CodeGenModule &CGM,
766                                                    const CXXRecordDecl *RD) {
767   return !CGM.getVTables().isVTableExternal(RD);
768 }
769 
770 /// Given that at some point we emitted a reference to one or more
771 /// v-tables, and that we are now at the end of the translation unit,
772 /// decide whether we should emit them.
773 void CodeGenModule::EmitDeferredVTables() {
774 #ifndef NDEBUG
775   // Remember the size of DeferredVTables, because we're going to assume
776   // that this entire operation doesn't modify it.
777   size_t savedSize = DeferredVTables.size();
778 #endif
779 
780   typedef std::vector<const CXXRecordDecl *>::const_iterator const_iterator;
781   for (const_iterator i = DeferredVTables.begin(),
782                       e = DeferredVTables.end(); i != e; ++i) {
783     const CXXRecordDecl *RD = *i;
784     if (shouldEmitVTableAtEndOfTranslationUnit(*this, RD))
785       VTables.GenerateClassData(RD);
786   }
787 
788   assert(savedSize == DeferredVTables.size() &&
789          "deferred extra v-tables during v-table emission?");
790   DeferredVTables.clear();
791 }
792