1 //===--- MicrosoftCXXABI.cpp - Emit LLVM Code from ASTs for a Module ------===//
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 provides C++ code generation targeting the Microsoft Visual C++ ABI.
11 // The class in this file generates structures that follow the Microsoft
12 // Visual C++ ABI, which is actually not very well documented at all outside
13 // of Microsoft.
14 //
15 //===----------------------------------------------------------------------===//
16 
17 #include "CGCXXABI.h"
18 #include "CodeGenModule.h"
19 #include "CGVTables.h"
20 #include "MicrosoftVBTables.h"
21 #include "clang/AST/Decl.h"
22 #include "clang/AST/DeclCXX.h"
23 
24 using namespace clang;
25 using namespace CodeGen;
26 
27 namespace {
28 
29 class MicrosoftCXXABI : public CGCXXABI {
30 public:
31   MicrosoftCXXABI(CodeGenModule &CGM) : CGCXXABI(CGM) {}
32 
33   bool isReturnTypeIndirect(const CXXRecordDecl *RD) const {
34     // Structures that are not C++03 PODs are always indirect.
35     return !RD->isPOD();
36   }
37 
38   RecordArgABI getRecordArgABI(const CXXRecordDecl *RD) const {
39     if (RD->hasNonTrivialCopyConstructor())
40       return RAA_DirectInMemory;
41     return RAA_Default;
42   }
43 
44   StringRef GetPureVirtualCallName() { return "_purecall"; }
45   // No known support for deleted functions in MSVC yet, so this choice is
46   // arbitrary.
47   StringRef GetDeletedVirtualCallName() { return "_purecall"; }
48 
49   llvm::Value *adjustToCompleteObject(CodeGenFunction &CGF,
50                                       llvm::Value *ptr,
51                                       QualType type);
52 
53   llvm::Value *GetVirtualBaseClassOffset(CodeGenFunction &CGF,
54                                          llvm::Value *This,
55                                          const CXXRecordDecl *ClassDecl,
56                                          const CXXRecordDecl *BaseClassDecl);
57 
58   void BuildConstructorSignature(const CXXConstructorDecl *Ctor,
59                                  CXXCtorType Type,
60                                  CanQualType &ResTy,
61                                  SmallVectorImpl<CanQualType> &ArgTys);
62 
63   llvm::BasicBlock *EmitCtorCompleteObjectHandler(CodeGenFunction &CGF,
64                                                   const CXXRecordDecl *RD);
65 
66   void BuildDestructorSignature(const CXXDestructorDecl *Ctor,
67                                 CXXDtorType Type,
68                                 CanQualType &ResTy,
69                                 SmallVectorImpl<CanQualType> &ArgTys);
70 
71   void BuildInstanceFunctionParams(CodeGenFunction &CGF,
72                                    QualType &ResTy,
73                                    FunctionArgList &Params);
74 
75   void EmitInstanceFunctionProlog(CodeGenFunction &CGF);
76 
77   llvm::Value *EmitConstructorCall(CodeGenFunction &CGF,
78                            const CXXConstructorDecl *D,
79                            CXXCtorType Type, bool ForVirtualBase,
80                            bool Delegating,
81                            llvm::Value *This,
82                            CallExpr::const_arg_iterator ArgBeg,
83                            CallExpr::const_arg_iterator ArgEnd);
84 
85   RValue EmitVirtualDestructorCall(CodeGenFunction &CGF,
86                                    const CXXDestructorDecl *Dtor,
87                                    CXXDtorType DtorType,
88                                    SourceLocation CallLoc,
89                                    ReturnValueSlot ReturnValue,
90                                    llvm::Value *This);
91 
92   void EmitVirtualInheritanceTables(llvm::GlobalVariable::LinkageTypes Linkage,
93                                     const CXXRecordDecl *RD);
94 
95   void EmitGuardedInit(CodeGenFunction &CGF, const VarDecl &D,
96                        llvm::GlobalVariable *DeclPtr,
97                        bool PerformInit);
98 
99   // ==== Notes on array cookies =========
100   //
101   // MSVC seems to only use cookies when the class has a destructor; a
102   // two-argument usual array deallocation function isn't sufficient.
103   //
104   // For example, this code prints "100" and "1":
105   //   struct A {
106   //     char x;
107   //     void *operator new[](size_t sz) {
108   //       printf("%u\n", sz);
109   //       return malloc(sz);
110   //     }
111   //     void operator delete[](void *p, size_t sz) {
112   //       printf("%u\n", sz);
113   //       free(p);
114   //     }
115   //   };
116   //   int main() {
117   //     A *p = new A[100];
118   //     delete[] p;
119   //   }
120   // Whereas it prints "104" and "104" if you give A a destructor.
121 
122   bool requiresArrayCookie(const CXXDeleteExpr *expr, QualType elementType);
123   bool requiresArrayCookie(const CXXNewExpr *expr);
124   CharUnits getArrayCookieSizeImpl(QualType type);
125   llvm::Value *InitializeArrayCookie(CodeGenFunction &CGF,
126                                      llvm::Value *NewPtr,
127                                      llvm::Value *NumElements,
128                                      const CXXNewExpr *expr,
129                                      QualType ElementType);
130   llvm::Value *readArrayCookieImpl(CodeGenFunction &CGF,
131                                    llvm::Value *allocPtr,
132                                    CharUnits cookieSize);
133   static bool needThisReturn(GlobalDecl GD);
134 
135 private:
136   llvm::Constant *getZeroInt() {
137     return llvm::ConstantInt::get(CGM.IntTy, 0);
138   }
139 
140   llvm::Constant *getAllOnesInt() {
141     return  llvm::Constant::getAllOnesValue(CGM.IntTy);
142   }
143 
144   llvm::Constant *getConstantOrZeroInt(llvm::Constant *C) {
145     return C ? C : getZeroInt();
146   }
147 
148   llvm::Value *getValueOrZeroInt(llvm::Value *C) {
149     return C ? C : getZeroInt();
150   }
151 
152   void
153   GetNullMemberPointerFields(const MemberPointerType *MPT,
154                              llvm::SmallVectorImpl<llvm::Constant *> &fields);
155 
156   /// \brief Finds the offset from the base of RD to the vbptr it uses, even if
157   /// it is reusing a vbptr from a non-virtual base.  RD must have morally
158   /// virtual bases.
159   CharUnits GetVBPtrOffsetFromBases(const CXXRecordDecl *RD);
160 
161   /// \brief Shared code for virtual base adjustment.  Returns the offset from
162   /// the vbptr to the virtual base.  Optionally returns the address of the
163   /// vbptr itself.
164   llvm::Value *GetVBaseOffsetFromVBPtr(CodeGenFunction &CGF,
165                                        llvm::Value *Base,
166                                        llvm::Value *VBPtrOffset,
167                                        llvm::Value *VBTableOffset,
168                                        llvm::Value **VBPtr = 0);
169 
170   /// \brief Performs a full virtual base adjustment.  Used to dereference
171   /// pointers to members of virtual bases.
172   llvm::Value *AdjustVirtualBase(CodeGenFunction &CGF, const CXXRecordDecl *RD,
173                                  llvm::Value *Base,
174                                  llvm::Value *VirtualBaseAdjustmentOffset,
175                                  llvm::Value *VBPtrOffset /* optional */);
176 
177   /// \brief Emits a full member pointer with the fields common to data and
178   /// function member pointers.
179   llvm::Constant *EmitFullMemberPointer(llvm::Constant *FirstField,
180                                         bool IsMemberFunction,
181                                         const CXXRecordDecl *RD,
182                                         CharUnits NonVirtualBaseAdjustment);
183 
184   llvm::Constant *BuildMemberPointer(const CXXRecordDecl *RD,
185                                      const CXXMethodDecl *MD,
186                                      CharUnits NonVirtualBaseAdjustment);
187 
188   bool MemberPointerConstantIsNull(const MemberPointerType *MPT,
189                                    llvm::Constant *MP);
190 
191   /// \brief - Initialize all vbptrs of 'this' with RD as the complete type.
192   void EmitVBPtrStores(CodeGenFunction &CGF, const CXXRecordDecl *RD);
193 
194   /// \brief Caching wrapper around VBTableBuilder::enumerateVBTables().
195   const VBTableVector &EnumerateVBTables(const CXXRecordDecl *RD);
196 
197 public:
198   virtual llvm::Type *ConvertMemberPointerType(const MemberPointerType *MPT);
199 
200   virtual bool isZeroInitializable(const MemberPointerType *MPT);
201 
202   virtual llvm::Constant *EmitNullMemberPointer(const MemberPointerType *MPT);
203 
204   virtual llvm::Constant *EmitMemberDataPointer(const MemberPointerType *MPT,
205                                                 CharUnits offset);
206   virtual llvm::Constant *EmitMemberPointer(const CXXMethodDecl *MD);
207   virtual llvm::Constant *EmitMemberPointer(const APValue &MP, QualType MPT);
208 
209   virtual llvm::Value *EmitMemberPointerComparison(CodeGenFunction &CGF,
210                                                    llvm::Value *L,
211                                                    llvm::Value *R,
212                                                    const MemberPointerType *MPT,
213                                                    bool Inequality);
214 
215   virtual llvm::Value *EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
216                                                   llvm::Value *MemPtr,
217                                                   const MemberPointerType *MPT);
218 
219   virtual llvm::Value *EmitMemberDataPointerAddress(CodeGenFunction &CGF,
220                                                     llvm::Value *Base,
221                                                     llvm::Value *MemPtr,
222                                                   const MemberPointerType *MPT);
223 
224   virtual llvm::Value *EmitMemberPointerConversion(CodeGenFunction &CGF,
225                                                    const CastExpr *E,
226                                                    llvm::Value *Src);
227 
228   virtual llvm::Constant *EmitMemberPointerConversion(const CastExpr *E,
229                                                       llvm::Constant *Src);
230 
231   virtual llvm::Value *
232   EmitLoadOfMemberFunctionPointer(CodeGenFunction &CGF,
233                                   llvm::Value *&This,
234                                   llvm::Value *MemPtr,
235                                   const MemberPointerType *MPT);
236 
237 private:
238   /// VBTables - All the vbtables which have been referenced.
239   llvm::DenseMap<const CXXRecordDecl *, VBTableVector> VBTablesMap;
240 };
241 
242 }
243 
244 llvm::Value *MicrosoftCXXABI::adjustToCompleteObject(CodeGenFunction &CGF,
245                                                      llvm::Value *ptr,
246                                                      QualType type) {
247   // FIXME: implement
248   return ptr;
249 }
250 
251 /// \brief Finds the first non-virtual base of RD that has virtual bases.  If RD
252 /// doesn't have a vbptr, it will reuse the vbptr of the returned class.
253 static const CXXRecordDecl *FindFirstNVBaseWithVBases(const CXXRecordDecl *RD) {
254   for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(),
255        E = RD->bases_end(); I != E; ++I) {
256     const CXXRecordDecl *Base = I->getType()->getAsCXXRecordDecl();
257     if (!I->isVirtual() && Base->getNumVBases() > 0)
258       return Base;
259   }
260   llvm_unreachable("RD must have an nv base with vbases");
261 }
262 
263 CharUnits MicrosoftCXXABI::GetVBPtrOffsetFromBases(const CXXRecordDecl *RD) {
264   assert(RD->getNumVBases());
265   CharUnits Total = CharUnits::Zero();
266   while (RD) {
267     const ASTRecordLayout &RDLayout = getContext().getASTRecordLayout(RD);
268     CharUnits VBPtrOffset = RDLayout.getVBPtrOffset();
269     // -1 is the sentinel for no vbptr.
270     if (VBPtrOffset != CharUnits::fromQuantity(-1)) {
271       Total += VBPtrOffset;
272       break;
273     }
274     RD = FindFirstNVBaseWithVBases(RD);
275     Total += RDLayout.getBaseClassOffset(RD);
276   }
277   return Total;
278 }
279 
280 /// \brief Computes the index of BaseClassDecl in the vbtable of ClassDecl.
281 /// BaseClassDecl must be a morally virtual base of ClassDecl.  The vbtable is
282 /// an array of i32 offsets.  The first entry is a self entry, and the rest are
283 /// offsets from the vbptr to virtual bases.  The bases are ordered the same way
284 /// our vbases are ordered: as they appear in a left-to-right depth-first search
285 /// of the hierarchy.
286 static unsigned GetVBTableIndex(const CXXRecordDecl *ClassDecl,
287                                 const CXXRecordDecl *BaseClassDecl) {
288   unsigned VBTableIndex = 1;  // Start with one to skip the self entry.
289   for (CXXRecordDecl::base_class_const_iterator I = ClassDecl->vbases_begin(),
290        E = ClassDecl->vbases_end(); I != E; ++I) {
291     if (I->getType()->getAsCXXRecordDecl() == BaseClassDecl)
292       return VBTableIndex;
293     VBTableIndex++;
294   }
295   llvm_unreachable("BaseClassDecl must be a vbase of ClassDecl");
296 }
297 
298 llvm::Value *
299 MicrosoftCXXABI::GetVirtualBaseClassOffset(CodeGenFunction &CGF,
300                                            llvm::Value *This,
301                                            const CXXRecordDecl *ClassDecl,
302                                            const CXXRecordDecl *BaseClassDecl) {
303   int64_t VBPtrChars = GetVBPtrOffsetFromBases(ClassDecl).getQuantity();
304   llvm::Value *VBPtrOffset = llvm::ConstantInt::get(CGM.PtrDiffTy, VBPtrChars);
305   CharUnits IntSize = getContext().getTypeSizeInChars(getContext().IntTy);
306   CharUnits VBTableChars = IntSize * GetVBTableIndex(ClassDecl, BaseClassDecl);
307   llvm::Value *VBTableOffset =
308     llvm::ConstantInt::get(CGM.IntTy, VBTableChars.getQuantity());
309 
310   llvm::Value *VBPtrToNewBase =
311     GetVBaseOffsetFromVBPtr(CGF, This, VBTableOffset, VBPtrOffset);
312   VBPtrToNewBase =
313     CGF.Builder.CreateSExtOrBitCast(VBPtrToNewBase, CGM.PtrDiffTy);
314   return CGF.Builder.CreateNSWAdd(VBPtrOffset, VBPtrToNewBase);
315 }
316 
317 bool MicrosoftCXXABI::needThisReturn(GlobalDecl GD) {
318   const CXXMethodDecl* MD = cast<CXXMethodDecl>(GD.getDecl());
319   return isa<CXXConstructorDecl>(MD);
320 }
321 
322 void MicrosoftCXXABI::BuildConstructorSignature(const CXXConstructorDecl *Ctor,
323                                  CXXCtorType Type,
324                                  CanQualType &ResTy,
325                                  SmallVectorImpl<CanQualType> &ArgTys) {
326   // 'this' is already in place
327 
328   // Ctor returns this ptr
329   ResTy = ArgTys[0];
330 
331   const CXXRecordDecl *Class = Ctor->getParent();
332   if (Class->getNumVBases()) {
333     // Constructors of classes with virtual bases take an implicit parameter.
334     ArgTys.push_back(CGM.getContext().IntTy);
335   }
336 }
337 
338 llvm::BasicBlock *
339 MicrosoftCXXABI::EmitCtorCompleteObjectHandler(CodeGenFunction &CGF,
340                                                const CXXRecordDecl *RD) {
341   llvm::Value *IsMostDerivedClass = getStructorImplicitParamValue(CGF);
342   assert(IsMostDerivedClass &&
343          "ctor for a class with virtual bases must have an implicit parameter");
344   llvm::Value *IsCompleteObject =
345     CGF.Builder.CreateIsNotNull(IsMostDerivedClass, "is_complete_object");
346 
347   llvm::BasicBlock *CallVbaseCtorsBB = CGF.createBasicBlock("ctor.init_vbases");
348   llvm::BasicBlock *SkipVbaseCtorsBB = CGF.createBasicBlock("ctor.skip_vbases");
349   CGF.Builder.CreateCondBr(IsCompleteObject,
350                            CallVbaseCtorsBB, SkipVbaseCtorsBB);
351 
352   CGF.EmitBlock(CallVbaseCtorsBB);
353 
354   // Fill in the vbtable pointers here.
355   EmitVBPtrStores(CGF, RD);
356 
357   // CGF will put the base ctor calls in this basic block for us later.
358 
359   return SkipVbaseCtorsBB;
360 }
361 
362 void MicrosoftCXXABI::EmitVBPtrStores(CodeGenFunction &CGF,
363                                       const CXXRecordDecl *RD) {
364   llvm::Value *ThisInt8Ptr =
365     CGF.Builder.CreateBitCast(getThisValue(CGF), CGM.Int8PtrTy, "this.int8");
366 
367   const VBTableVector &VBTables = EnumerateVBTables(RD);
368   for (VBTableVector::const_iterator I = VBTables.begin(), E = VBTables.end();
369        I != E; ++I) {
370     const ASTRecordLayout &SubobjectLayout =
371       CGM.getContext().getASTRecordLayout(I->VBPtrSubobject.getBase());
372     uint64_t Offs = (I->VBPtrSubobject.getBaseOffset() +
373                      SubobjectLayout.getVBPtrOffset()).getQuantity();
374     llvm::Value *VBPtr =
375         CGF.Builder.CreateConstInBoundsGEP1_64(ThisInt8Ptr, Offs);
376     VBPtr = CGF.Builder.CreateBitCast(VBPtr, I->GV->getType()->getPointerTo(0),
377                                       "vbptr." + I->ReusingBase->getName());
378     CGF.Builder.CreateStore(I->GV, VBPtr);
379   }
380 }
381 
382 void MicrosoftCXXABI::BuildDestructorSignature(const CXXDestructorDecl *Dtor,
383                                                CXXDtorType Type,
384                                                CanQualType &ResTy,
385                                         SmallVectorImpl<CanQualType> &ArgTys) {
386   // 'this' is already in place
387   // TODO: 'for base' flag
388 
389   if (Type == Dtor_Deleting) {
390     // The scalar deleting destructor takes an implicit bool parameter.
391     ArgTys.push_back(CGM.getContext().BoolTy);
392   }
393 }
394 
395 static bool IsDeletingDtor(GlobalDecl GD) {
396   const CXXMethodDecl* MD = cast<CXXMethodDecl>(GD.getDecl());
397   if (isa<CXXDestructorDecl>(MD)) {
398     return GD.getDtorType() == Dtor_Deleting;
399   }
400   return false;
401 }
402 
403 void MicrosoftCXXABI::BuildInstanceFunctionParams(CodeGenFunction &CGF,
404                                                   QualType &ResTy,
405                                                   FunctionArgList &Params) {
406   BuildThisParam(CGF, Params);
407   if (needThisReturn(CGF.CurGD)) {
408     ResTy = Params[0]->getType();
409   }
410 
411   ASTContext &Context = getContext();
412   const CXXMethodDecl *MD = cast<CXXMethodDecl>(CGF.CurGD.getDecl());
413   if (isa<CXXConstructorDecl>(MD) && MD->getParent()->getNumVBases()) {
414     ImplicitParamDecl *IsMostDerived
415       = ImplicitParamDecl::Create(Context, 0,
416                                   CGF.CurGD.getDecl()->getLocation(),
417                                   &Context.Idents.get("is_most_derived"),
418                                   Context.IntTy);
419     Params.push_back(IsMostDerived);
420     getStructorImplicitParamDecl(CGF) = IsMostDerived;
421   } else if (IsDeletingDtor(CGF.CurGD)) {
422     ImplicitParamDecl *ShouldDelete
423       = ImplicitParamDecl::Create(Context, 0,
424                                   CGF.CurGD.getDecl()->getLocation(),
425                                   &Context.Idents.get("should_call_delete"),
426                                   Context.BoolTy);
427     Params.push_back(ShouldDelete);
428     getStructorImplicitParamDecl(CGF) = ShouldDelete;
429   }
430 }
431 
432 void MicrosoftCXXABI::EmitInstanceFunctionProlog(CodeGenFunction &CGF) {
433   EmitThisParam(CGF);
434   if (needThisReturn(CGF.CurGD)) {
435     CGF.Builder.CreateStore(getThisValue(CGF), CGF.ReturnValue);
436   }
437 
438   const CXXMethodDecl *MD = cast<CXXMethodDecl>(CGF.CurGD.getDecl());
439   if (isa<CXXConstructorDecl>(MD) && MD->getParent()->getNumVBases()) {
440     assert(getStructorImplicitParamDecl(CGF) &&
441            "no implicit parameter for a constructor with virtual bases?");
442     getStructorImplicitParamValue(CGF)
443       = CGF.Builder.CreateLoad(
444           CGF.GetAddrOfLocalVar(getStructorImplicitParamDecl(CGF)),
445           "is_most_derived");
446   }
447 
448   if (IsDeletingDtor(CGF.CurGD)) {
449     assert(getStructorImplicitParamDecl(CGF) &&
450            "no implicit parameter for a deleting destructor?");
451     getStructorImplicitParamValue(CGF)
452       = CGF.Builder.CreateLoad(
453           CGF.GetAddrOfLocalVar(getStructorImplicitParamDecl(CGF)),
454           "should_call_delete");
455   }
456 }
457 
458 llvm::Value *MicrosoftCXXABI::EmitConstructorCall(CodeGenFunction &CGF,
459                                           const CXXConstructorDecl *D,
460                                           CXXCtorType Type, bool ForVirtualBase,
461                                           bool Delegating,
462                                           llvm::Value *This,
463                                           CallExpr::const_arg_iterator ArgBeg,
464                                           CallExpr::const_arg_iterator ArgEnd) {
465   assert(Type == Ctor_Complete || Type == Ctor_Base);
466   llvm::Value *Callee = CGM.GetAddrOfCXXConstructor(D, Ctor_Complete);
467 
468   llvm::Value *ImplicitParam = 0;
469   QualType ImplicitParamTy;
470   if (D->getParent()->getNumVBases()) {
471     ImplicitParam = llvm::ConstantInt::get(CGM.Int32Ty, Type == Ctor_Complete);
472     ImplicitParamTy = getContext().IntTy;
473   }
474 
475   // FIXME: Provide a source location here.
476   CGF.EmitCXXMemberCall(D, SourceLocation(), Callee, ReturnValueSlot(), This,
477                         ImplicitParam, ImplicitParamTy,
478                         ArgBeg, ArgEnd);
479   return Callee;
480 }
481 
482 RValue MicrosoftCXXABI::EmitVirtualDestructorCall(CodeGenFunction &CGF,
483                                                   const CXXDestructorDecl *Dtor,
484                                                   CXXDtorType DtorType,
485                                                   SourceLocation CallLoc,
486                                                   ReturnValueSlot ReturnValue,
487                                                   llvm::Value *This) {
488   assert(DtorType == Dtor_Deleting || DtorType == Dtor_Complete);
489 
490   // We have only one destructor in the vftable but can get both behaviors
491   // by passing an implicit bool parameter.
492   const CGFunctionInfo *FInfo
493       = &CGM.getTypes().arrangeCXXDestructor(Dtor, Dtor_Deleting);
494   llvm::Type *Ty = CGF.CGM.getTypes().GetFunctionType(*FInfo);
495   llvm::Value *Callee = CGF.BuildVirtualCall(Dtor, Dtor_Deleting, This, Ty);
496 
497   ASTContext &Context = CGF.getContext();
498   llvm::Value *ImplicitParam
499     = llvm::ConstantInt::get(llvm::IntegerType::getInt1Ty(CGF.getLLVMContext()),
500                              DtorType == Dtor_Deleting);
501 
502   return CGF.EmitCXXMemberCall(Dtor, CallLoc, Callee, ReturnValue, This,
503                                ImplicitParam, Context.BoolTy, 0, 0);
504 }
505 
506 const VBTableVector &
507 MicrosoftCXXABI::EnumerateVBTables(const CXXRecordDecl *RD) {
508   // At this layer, we can key the cache off of a single class, which is much
509   // easier than caching at the GlobalVariable layer.
510   llvm::DenseMap<const CXXRecordDecl*, VBTableVector>::iterator I;
511   bool added;
512   llvm::tie(I, added) = VBTablesMap.insert(std::make_pair(RD, VBTableVector()));
513   VBTableVector &VBTables = I->second;
514   if (!added)
515     return VBTables;
516 
517   VBTableBuilder(CGM, RD).enumerateVBTables(VBTables);
518 
519   return VBTables;
520 }
521 
522 void MicrosoftCXXABI::EmitVirtualInheritanceTables(
523     llvm::GlobalVariable::LinkageTypes Linkage, const CXXRecordDecl *RD) {
524   const VBTableVector &VBTables = EnumerateVBTables(RD);
525   for (VBTableVector::const_iterator I = VBTables.begin(), E = VBTables.end();
526        I != E; ++I) {
527     I->EmitVBTableDefinition(CGM, RD, Linkage);
528   }
529 }
530 
531 bool MicrosoftCXXABI::requiresArrayCookie(const CXXDeleteExpr *expr,
532                                    QualType elementType) {
533   // Microsoft seems to completely ignore the possibility of a
534   // two-argument usual deallocation function.
535   return elementType.isDestructedType();
536 }
537 
538 bool MicrosoftCXXABI::requiresArrayCookie(const CXXNewExpr *expr) {
539   // Microsoft seems to completely ignore the possibility of a
540   // two-argument usual deallocation function.
541   return expr->getAllocatedType().isDestructedType();
542 }
543 
544 CharUnits MicrosoftCXXABI::getArrayCookieSizeImpl(QualType type) {
545   // The array cookie is always a size_t; we then pad that out to the
546   // alignment of the element type.
547   ASTContext &Ctx = getContext();
548   return std::max(Ctx.getTypeSizeInChars(Ctx.getSizeType()),
549                   Ctx.getTypeAlignInChars(type));
550 }
551 
552 llvm::Value *MicrosoftCXXABI::readArrayCookieImpl(CodeGenFunction &CGF,
553                                                   llvm::Value *allocPtr,
554                                                   CharUnits cookieSize) {
555   unsigned AS = allocPtr->getType()->getPointerAddressSpace();
556   llvm::Value *numElementsPtr =
557     CGF.Builder.CreateBitCast(allocPtr, CGF.SizeTy->getPointerTo(AS));
558   return CGF.Builder.CreateLoad(numElementsPtr);
559 }
560 
561 llvm::Value* MicrosoftCXXABI::InitializeArrayCookie(CodeGenFunction &CGF,
562                                                     llvm::Value *newPtr,
563                                                     llvm::Value *numElements,
564                                                     const CXXNewExpr *expr,
565                                                     QualType elementType) {
566   assert(requiresArrayCookie(expr));
567 
568   // The size of the cookie.
569   CharUnits cookieSize = getArrayCookieSizeImpl(elementType);
570 
571   // Compute an offset to the cookie.
572   llvm::Value *cookiePtr = newPtr;
573 
574   // Write the number of elements into the appropriate slot.
575   unsigned AS = newPtr->getType()->getPointerAddressSpace();
576   llvm::Value *numElementsPtr
577     = CGF.Builder.CreateBitCast(cookiePtr, CGF.SizeTy->getPointerTo(AS));
578   CGF.Builder.CreateStore(numElements, numElementsPtr);
579 
580   // Finally, compute a pointer to the actual data buffer by skipping
581   // over the cookie completely.
582   return CGF.Builder.CreateConstInBoundsGEP1_64(newPtr,
583                                                 cookieSize.getQuantity());
584 }
585 
586 void MicrosoftCXXABI::EmitGuardedInit(CodeGenFunction &CGF, const VarDecl &D,
587                                       llvm::GlobalVariable *DeclPtr,
588                                       bool PerformInit) {
589   // FIXME: this code was only tested for global initialization.
590   // Not sure whether we want thread-safe static local variables as VS
591   // doesn't make them thread-safe.
592 
593   if (D.getTLSKind())
594     CGM.ErrorUnsupported(&D, "dynamic TLS initialization");
595 
596   // Emit the initializer and add a global destructor if appropriate.
597   CGF.EmitCXXGlobalVarDeclInit(D, DeclPtr, PerformInit);
598 }
599 
600 // Member pointer helpers.
601 static bool hasVBPtrOffsetField(MSInheritanceModel Inheritance) {
602   return Inheritance == MSIM_Unspecified;
603 }
604 
605 static bool hasOnlyOneField(bool IsMemberFunction,
606                             MSInheritanceModel Inheritance) {
607   return Inheritance <= MSIM_SinglePolymorphic ||
608       (!IsMemberFunction && Inheritance <= MSIM_MultiplePolymorphic);
609 }
610 
611 // Only member pointers to functions need a this adjustment, since it can be
612 // combined with the field offset for data pointers.
613 static bool hasNonVirtualBaseAdjustmentField(bool IsMemberFunction,
614                                              MSInheritanceModel Inheritance) {
615   return (IsMemberFunction && Inheritance >= MSIM_Multiple);
616 }
617 
618 static bool hasVirtualBaseAdjustmentField(MSInheritanceModel Inheritance) {
619   return Inheritance >= MSIM_Virtual;
620 }
621 
622 // Use zero for the field offset of a null data member pointer if we can
623 // guarantee that zero is not a valid field offset, or if the member pointer has
624 // multiple fields.  Polymorphic classes have a vfptr at offset zero, so we can
625 // use zero for null.  If there are multiple fields, we can use zero even if it
626 // is a valid field offset because null-ness testing will check the other
627 // fields.
628 static bool nullFieldOffsetIsZero(MSInheritanceModel Inheritance) {
629   return Inheritance != MSIM_Multiple && Inheritance != MSIM_Single;
630 }
631 
632 bool MicrosoftCXXABI::isZeroInitializable(const MemberPointerType *MPT) {
633   // Null-ness for function memptrs only depends on the first field, which is
634   // the function pointer.  The rest don't matter, so we can zero initialize.
635   if (MPT->isMemberFunctionPointer())
636     return true;
637 
638   // The virtual base adjustment field is always -1 for null, so if we have one
639   // we can't zero initialize.  The field offset is sometimes also -1 if 0 is a
640   // valid field offset.
641   const CXXRecordDecl *RD = MPT->getClass()->getAsCXXRecordDecl();
642   MSInheritanceModel Inheritance = RD->getMSInheritanceModel();
643   return (!hasVirtualBaseAdjustmentField(Inheritance) &&
644           nullFieldOffsetIsZero(Inheritance));
645 }
646 
647 llvm::Type *
648 MicrosoftCXXABI::ConvertMemberPointerType(const MemberPointerType *MPT) {
649   const CXXRecordDecl *RD = MPT->getClass()->getAsCXXRecordDecl();
650   MSInheritanceModel Inheritance = RD->getMSInheritanceModel();
651   llvm::SmallVector<llvm::Type *, 4> fields;
652   if (MPT->isMemberFunctionPointer())
653     fields.push_back(CGM.VoidPtrTy);  // FunctionPointerOrVirtualThunk
654   else
655     fields.push_back(CGM.IntTy);  // FieldOffset
656 
657   if (hasNonVirtualBaseAdjustmentField(MPT->isMemberFunctionPointer(),
658                                        Inheritance))
659     fields.push_back(CGM.IntTy);
660   if (hasVBPtrOffsetField(Inheritance))
661     fields.push_back(CGM.IntTy);
662   if (hasVirtualBaseAdjustmentField(Inheritance))
663     fields.push_back(CGM.IntTy);  // VirtualBaseAdjustmentOffset
664 
665   if (fields.size() == 1)
666     return fields[0];
667   return llvm::StructType::get(CGM.getLLVMContext(), fields);
668 }
669 
670 void MicrosoftCXXABI::
671 GetNullMemberPointerFields(const MemberPointerType *MPT,
672                            llvm::SmallVectorImpl<llvm::Constant *> &fields) {
673   assert(fields.empty());
674   const CXXRecordDecl *RD = MPT->getClass()->getAsCXXRecordDecl();
675   MSInheritanceModel Inheritance = RD->getMSInheritanceModel();
676   if (MPT->isMemberFunctionPointer()) {
677     // FunctionPointerOrVirtualThunk
678     fields.push_back(llvm::Constant::getNullValue(CGM.VoidPtrTy));
679   } else {
680     if (nullFieldOffsetIsZero(Inheritance))
681       fields.push_back(getZeroInt());  // FieldOffset
682     else
683       fields.push_back(getAllOnesInt());  // FieldOffset
684   }
685 
686   if (hasNonVirtualBaseAdjustmentField(MPT->isMemberFunctionPointer(),
687                                        Inheritance))
688     fields.push_back(getZeroInt());
689   if (hasVBPtrOffsetField(Inheritance))
690     fields.push_back(getZeroInt());
691   if (hasVirtualBaseAdjustmentField(Inheritance))
692     fields.push_back(getAllOnesInt());
693 }
694 
695 llvm::Constant *
696 MicrosoftCXXABI::EmitNullMemberPointer(const MemberPointerType *MPT) {
697   llvm::SmallVector<llvm::Constant *, 4> fields;
698   GetNullMemberPointerFields(MPT, fields);
699   if (fields.size() == 1)
700     return fields[0];
701   llvm::Constant *Res = llvm::ConstantStruct::getAnon(fields);
702   assert(Res->getType() == ConvertMemberPointerType(MPT));
703   return Res;
704 }
705 
706 llvm::Constant *
707 MicrosoftCXXABI::EmitFullMemberPointer(llvm::Constant *FirstField,
708                                        bool IsMemberFunction,
709                                        const CXXRecordDecl *RD,
710                                        CharUnits NonVirtualBaseAdjustment)
711 {
712   MSInheritanceModel Inheritance = RD->getMSInheritanceModel();
713 
714   // Single inheritance class member pointer are represented as scalars instead
715   // of aggregates.
716   if (hasOnlyOneField(IsMemberFunction, Inheritance))
717     return FirstField;
718 
719   llvm::SmallVector<llvm::Constant *, 4> fields;
720   fields.push_back(FirstField);
721 
722   if (hasNonVirtualBaseAdjustmentField(IsMemberFunction, Inheritance))
723     fields.push_back(llvm::ConstantInt::get(
724       CGM.IntTy, NonVirtualBaseAdjustment.getQuantity()));
725 
726   if (hasVBPtrOffsetField(Inheritance)) {
727     fields.push_back(llvm::ConstantInt::get(
728       CGM.IntTy, GetVBPtrOffsetFromBases(RD).getQuantity()));
729   }
730 
731   // The rest of the fields are adjusted by conversions to a more derived class.
732   if (hasVirtualBaseAdjustmentField(Inheritance))
733     fields.push_back(getZeroInt());
734 
735   return llvm::ConstantStruct::getAnon(fields);
736 }
737 
738 llvm::Constant *
739 MicrosoftCXXABI::EmitMemberDataPointer(const MemberPointerType *MPT,
740                                        CharUnits offset) {
741   const CXXRecordDecl *RD = MPT->getClass()->getAsCXXRecordDecl();
742   llvm::Constant *FirstField =
743     llvm::ConstantInt::get(CGM.IntTy, offset.getQuantity());
744   return EmitFullMemberPointer(FirstField, /*IsMemberFunction=*/false, RD,
745                                CharUnits::Zero());
746 }
747 
748 llvm::Constant *MicrosoftCXXABI::EmitMemberPointer(const CXXMethodDecl *MD) {
749   return BuildMemberPointer(MD->getParent(), MD, CharUnits::Zero());
750 }
751 
752 llvm::Constant *MicrosoftCXXABI::EmitMemberPointer(const APValue &MP,
753                                                    QualType MPType) {
754   const MemberPointerType *MPT = MPType->castAs<MemberPointerType>();
755   const ValueDecl *MPD = MP.getMemberPointerDecl();
756   if (!MPD)
757     return EmitNullMemberPointer(MPT);
758 
759   CharUnits ThisAdjustment = getMemberPointerPathAdjustment(MP);
760 
761   // FIXME PR15713: Support virtual inheritance paths.
762 
763   if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(MPD))
764     return BuildMemberPointer(MPT->getClass()->getAsCXXRecordDecl(),
765                               MD, ThisAdjustment);
766 
767   CharUnits FieldOffset =
768     getContext().toCharUnitsFromBits(getContext().getFieldOffset(MPD));
769   return EmitMemberDataPointer(MPT, ThisAdjustment + FieldOffset);
770 }
771 
772 llvm::Constant *
773 MicrosoftCXXABI::BuildMemberPointer(const CXXRecordDecl *RD,
774                                     const CXXMethodDecl *MD,
775                                     CharUnits NonVirtualBaseAdjustment) {
776   assert(MD->isInstance() && "Member function must not be static!");
777   MD = MD->getCanonicalDecl();
778   CodeGenTypes &Types = CGM.getTypes();
779 
780   llvm::Constant *FirstField;
781   if (MD->isVirtual()) {
782     // FIXME: We have to instantiate a thunk that loads the vftable and jumps to
783     // the right offset.
784     FirstField = llvm::Constant::getNullValue(CGM.VoidPtrTy);
785   } else {
786     const FunctionProtoType *FPT = MD->getType()->castAs<FunctionProtoType>();
787     llvm::Type *Ty;
788     // Check whether the function has a computable LLVM signature.
789     if (Types.isFuncTypeConvertible(FPT)) {
790       // The function has a computable LLVM signature; use the correct type.
791       Ty = Types.GetFunctionType(Types.arrangeCXXMethodDeclaration(MD));
792     } else {
793       // Use an arbitrary non-function type to tell GetAddrOfFunction that the
794       // function type is incomplete.
795       Ty = CGM.PtrDiffTy;
796     }
797     FirstField = CGM.GetAddrOfFunction(MD, Ty);
798     FirstField = llvm::ConstantExpr::getBitCast(FirstField, CGM.VoidPtrTy);
799   }
800 
801   // The rest of the fields are common with data member pointers.
802   return EmitFullMemberPointer(FirstField, /*IsMemberFunction=*/true, RD,
803                                NonVirtualBaseAdjustment);
804 }
805 
806 /// Member pointers are the same if they're either bitwise identical *or* both
807 /// null.  Null-ness for function members is determined by the first field,
808 /// while for data member pointers we must compare all fields.
809 llvm::Value *
810 MicrosoftCXXABI::EmitMemberPointerComparison(CodeGenFunction &CGF,
811                                              llvm::Value *L,
812                                              llvm::Value *R,
813                                              const MemberPointerType *MPT,
814                                              bool Inequality) {
815   CGBuilderTy &Builder = CGF.Builder;
816 
817   // Handle != comparisons by switching the sense of all boolean operations.
818   llvm::ICmpInst::Predicate Eq;
819   llvm::Instruction::BinaryOps And, Or;
820   if (Inequality) {
821     Eq = llvm::ICmpInst::ICMP_NE;
822     And = llvm::Instruction::Or;
823     Or = llvm::Instruction::And;
824   } else {
825     Eq = llvm::ICmpInst::ICMP_EQ;
826     And = llvm::Instruction::And;
827     Or = llvm::Instruction::Or;
828   }
829 
830   // If this is a single field member pointer (single inheritance), this is a
831   // single icmp.
832   const CXXRecordDecl *RD = MPT->getClass()->getAsCXXRecordDecl();
833   MSInheritanceModel Inheritance = RD->getMSInheritanceModel();
834   if (hasOnlyOneField(MPT->isMemberFunctionPointer(), Inheritance))
835     return Builder.CreateICmp(Eq, L, R);
836 
837   // Compare the first field.
838   llvm::Value *L0 = Builder.CreateExtractValue(L, 0, "lhs.0");
839   llvm::Value *R0 = Builder.CreateExtractValue(R, 0, "rhs.0");
840   llvm::Value *Cmp0 = Builder.CreateICmp(Eq, L0, R0, "memptr.cmp.first");
841 
842   // Compare everything other than the first field.
843   llvm::Value *Res = 0;
844   llvm::StructType *LType = cast<llvm::StructType>(L->getType());
845   for (unsigned I = 1, E = LType->getNumElements(); I != E; ++I) {
846     llvm::Value *LF = Builder.CreateExtractValue(L, I);
847     llvm::Value *RF = Builder.CreateExtractValue(R, I);
848     llvm::Value *Cmp = Builder.CreateICmp(Eq, LF, RF, "memptr.cmp.rest");
849     if (Res)
850       Res = Builder.CreateBinOp(And, Res, Cmp);
851     else
852       Res = Cmp;
853   }
854 
855   // Check if the first field is 0 if this is a function pointer.
856   if (MPT->isMemberFunctionPointer()) {
857     // (l1 == r1 && ...) || l0 == 0
858     llvm::Value *Zero = llvm::Constant::getNullValue(L0->getType());
859     llvm::Value *IsZero = Builder.CreateICmp(Eq, L0, Zero, "memptr.cmp.iszero");
860     Res = Builder.CreateBinOp(Or, Res, IsZero);
861   }
862 
863   // Combine the comparison of the first field, which must always be true for
864   // this comparison to succeeed.
865   return Builder.CreateBinOp(And, Res, Cmp0, "memptr.cmp");
866 }
867 
868 llvm::Value *
869 MicrosoftCXXABI::EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
870                                             llvm::Value *MemPtr,
871                                             const MemberPointerType *MPT) {
872   CGBuilderTy &Builder = CGF.Builder;
873   llvm::SmallVector<llvm::Constant *, 4> fields;
874   // We only need one field for member functions.
875   if (MPT->isMemberFunctionPointer())
876     fields.push_back(llvm::Constant::getNullValue(CGM.VoidPtrTy));
877   else
878     GetNullMemberPointerFields(MPT, fields);
879   assert(!fields.empty());
880   llvm::Value *FirstField = MemPtr;
881   if (MemPtr->getType()->isStructTy())
882     FirstField = Builder.CreateExtractValue(MemPtr, 0);
883   llvm::Value *Res = Builder.CreateICmpNE(FirstField, fields[0], "memptr.cmp0");
884 
885   // For function member pointers, we only need to test the function pointer
886   // field.  The other fields if any can be garbage.
887   if (MPT->isMemberFunctionPointer())
888     return Res;
889 
890   // Otherwise, emit a series of compares and combine the results.
891   for (int I = 1, E = fields.size(); I < E; ++I) {
892     llvm::Value *Field = Builder.CreateExtractValue(MemPtr, I);
893     llvm::Value *Next = Builder.CreateICmpNE(Field, fields[I], "memptr.cmp");
894     Res = Builder.CreateAnd(Res, Next, "memptr.tobool");
895   }
896   return Res;
897 }
898 
899 bool MicrosoftCXXABI::MemberPointerConstantIsNull(const MemberPointerType *MPT,
900                                                   llvm::Constant *Val) {
901   // Function pointers are null if the pointer in the first field is null.
902   if (MPT->isMemberFunctionPointer()) {
903     llvm::Constant *FirstField = Val->getType()->isStructTy() ?
904       Val->getAggregateElement(0U) : Val;
905     return FirstField->isNullValue();
906   }
907 
908   // If it's not a function pointer and it's zero initializable, we can easily
909   // check zero.
910   if (isZeroInitializable(MPT) && Val->isNullValue())
911     return true;
912 
913   // Otherwise, break down all the fields for comparison.  Hopefully these
914   // little Constants are reused, while a big null struct might not be.
915   llvm::SmallVector<llvm::Constant *, 4> Fields;
916   GetNullMemberPointerFields(MPT, Fields);
917   if (Fields.size() == 1) {
918     assert(Val->getType()->isIntegerTy());
919     return Val == Fields[0];
920   }
921 
922   unsigned I, E;
923   for (I = 0, E = Fields.size(); I != E; ++I) {
924     if (Val->getAggregateElement(I) != Fields[I])
925       break;
926   }
927   return I == E;
928 }
929 
930 llvm::Value *
931 MicrosoftCXXABI::GetVBaseOffsetFromVBPtr(CodeGenFunction &CGF,
932                                          llvm::Value *This,
933                                          llvm::Value *VBTableOffset,
934                                          llvm::Value *VBPtrOffset,
935                                          llvm::Value **VBPtrOut) {
936   CGBuilderTy &Builder = CGF.Builder;
937   // Load the vbtable pointer from the vbptr in the instance.
938   This = Builder.CreateBitCast(This, CGM.Int8PtrTy);
939   llvm::Value *VBPtr =
940     Builder.CreateInBoundsGEP(This, VBPtrOffset, "vbptr");
941   if (VBPtrOut) *VBPtrOut = VBPtr;
942   VBPtr = Builder.CreateBitCast(VBPtr, CGM.Int8PtrTy->getPointerTo(0));
943   llvm::Value *VBTable = Builder.CreateLoad(VBPtr, "vbtable");
944 
945   // Load an i32 offset from the vb-table.
946   llvm::Value *VBaseOffs = Builder.CreateInBoundsGEP(VBTable, VBTableOffset);
947   VBaseOffs = Builder.CreateBitCast(VBaseOffs, CGM.Int32Ty->getPointerTo(0));
948   return Builder.CreateLoad(VBaseOffs, "vbase_offs");
949 }
950 
951 // Returns an adjusted base cast to i8*, since we do more address arithmetic on
952 // it.
953 llvm::Value *
954 MicrosoftCXXABI::AdjustVirtualBase(CodeGenFunction &CGF,
955                                    const CXXRecordDecl *RD, llvm::Value *Base,
956                                    llvm::Value *VBTableOffset,
957                                    llvm::Value *VBPtrOffset) {
958   CGBuilderTy &Builder = CGF.Builder;
959   Base = Builder.CreateBitCast(Base, CGM.Int8PtrTy);
960   llvm::BasicBlock *OriginalBB = 0;
961   llvm::BasicBlock *SkipAdjustBB = 0;
962   llvm::BasicBlock *VBaseAdjustBB = 0;
963 
964   // In the unspecified inheritance model, there might not be a vbtable at all,
965   // in which case we need to skip the virtual base lookup.  If there is a
966   // vbtable, the first entry is a no-op entry that gives back the original
967   // base, so look for a virtual base adjustment offset of zero.
968   if (VBPtrOffset) {
969     OriginalBB = Builder.GetInsertBlock();
970     VBaseAdjustBB = CGF.createBasicBlock("memptr.vadjust");
971     SkipAdjustBB = CGF.createBasicBlock("memptr.skip_vadjust");
972     llvm::Value *IsVirtual =
973       Builder.CreateICmpNE(VBTableOffset, getZeroInt(),
974                            "memptr.is_vbase");
975     Builder.CreateCondBr(IsVirtual, VBaseAdjustBB, SkipAdjustBB);
976     CGF.EmitBlock(VBaseAdjustBB);
977   }
978 
979   // If we weren't given a dynamic vbptr offset, RD should be complete and we'll
980   // know the vbptr offset.
981   if (!VBPtrOffset) {
982     CharUnits offs = CharUnits::Zero();
983     if (RD->getNumVBases()) {
984       offs = GetVBPtrOffsetFromBases(RD);
985     }
986     VBPtrOffset = llvm::ConstantInt::get(CGM.IntTy, offs.getQuantity());
987   }
988   llvm::Value *VBPtr = 0;
989   llvm::Value *VBaseOffs =
990     GetVBaseOffsetFromVBPtr(CGF, Base, VBTableOffset, VBPtrOffset, &VBPtr);
991   llvm::Value *AdjustedBase = Builder.CreateInBoundsGEP(VBPtr, VBaseOffs);
992 
993   // Merge control flow with the case where we didn't have to adjust.
994   if (VBaseAdjustBB) {
995     Builder.CreateBr(SkipAdjustBB);
996     CGF.EmitBlock(SkipAdjustBB);
997     llvm::PHINode *Phi = Builder.CreatePHI(CGM.Int8PtrTy, 2, "memptr.base");
998     Phi->addIncoming(Base, OriginalBB);
999     Phi->addIncoming(AdjustedBase, VBaseAdjustBB);
1000     return Phi;
1001   }
1002   return AdjustedBase;
1003 }
1004 
1005 llvm::Value *
1006 MicrosoftCXXABI::EmitMemberDataPointerAddress(CodeGenFunction &CGF,
1007                                               llvm::Value *Base,
1008                                               llvm::Value *MemPtr,
1009                                               const MemberPointerType *MPT) {
1010   assert(MPT->isMemberDataPointer());
1011   unsigned AS = Base->getType()->getPointerAddressSpace();
1012   llvm::Type *PType =
1013       CGF.ConvertTypeForMem(MPT->getPointeeType())->getPointerTo(AS);
1014   CGBuilderTy &Builder = CGF.Builder;
1015   const CXXRecordDecl *RD = MPT->getClass()->getAsCXXRecordDecl();
1016   MSInheritanceModel Inheritance = RD->getMSInheritanceModel();
1017 
1018   // Extract the fields we need, regardless of model.  We'll apply them if we
1019   // have them.
1020   llvm::Value *FieldOffset = MemPtr;
1021   llvm::Value *VirtualBaseAdjustmentOffset = 0;
1022   llvm::Value *VBPtrOffset = 0;
1023   if (MemPtr->getType()->isStructTy()) {
1024     // We need to extract values.
1025     unsigned I = 0;
1026     FieldOffset = Builder.CreateExtractValue(MemPtr, I++);
1027     if (hasVBPtrOffsetField(Inheritance))
1028       VBPtrOffset = Builder.CreateExtractValue(MemPtr, I++);
1029     if (hasVirtualBaseAdjustmentField(Inheritance))
1030       VirtualBaseAdjustmentOffset = Builder.CreateExtractValue(MemPtr, I++);
1031   }
1032 
1033   if (VirtualBaseAdjustmentOffset) {
1034     Base = AdjustVirtualBase(CGF, RD, Base, VirtualBaseAdjustmentOffset,
1035                              VBPtrOffset);
1036   }
1037   llvm::Value *Addr =
1038     Builder.CreateInBoundsGEP(Base, FieldOffset, "memptr.offset");
1039 
1040   // Cast the address to the appropriate pointer type, adopting the address
1041   // space of the base pointer.
1042   return Builder.CreateBitCast(Addr, PType);
1043 }
1044 
1045 static MSInheritanceModel
1046 getInheritanceFromMemptr(const MemberPointerType *MPT) {
1047   return MPT->getClass()->getAsCXXRecordDecl()->getMSInheritanceModel();
1048 }
1049 
1050 llvm::Value *
1051 MicrosoftCXXABI::EmitMemberPointerConversion(CodeGenFunction &CGF,
1052                                              const CastExpr *E,
1053                                              llvm::Value *Src) {
1054   assert(E->getCastKind() == CK_DerivedToBaseMemberPointer ||
1055          E->getCastKind() == CK_BaseToDerivedMemberPointer ||
1056          E->getCastKind() == CK_ReinterpretMemberPointer);
1057 
1058   // Use constant emission if we can.
1059   if (isa<llvm::Constant>(Src))
1060     return EmitMemberPointerConversion(E, cast<llvm::Constant>(Src));
1061 
1062   // We may be adding or dropping fields from the member pointer, so we need
1063   // both types and the inheritance models of both records.
1064   const MemberPointerType *SrcTy =
1065     E->getSubExpr()->getType()->castAs<MemberPointerType>();
1066   const MemberPointerType *DstTy = E->getType()->castAs<MemberPointerType>();
1067   MSInheritanceModel SrcInheritance = getInheritanceFromMemptr(SrcTy);
1068   MSInheritanceModel DstInheritance = getInheritanceFromMemptr(DstTy);
1069   bool IsFunc = SrcTy->isMemberFunctionPointer();
1070 
1071   // If the classes use the same null representation, reinterpret_cast is a nop.
1072   bool IsReinterpret = E->getCastKind() == CK_ReinterpretMemberPointer;
1073   if (IsReinterpret && (IsFunc ||
1074                         nullFieldOffsetIsZero(SrcInheritance) ==
1075                         nullFieldOffsetIsZero(DstInheritance)))
1076     return Src;
1077 
1078   CGBuilderTy &Builder = CGF.Builder;
1079 
1080   // Branch past the conversion if Src is null.
1081   llvm::Value *IsNotNull = EmitMemberPointerIsNotNull(CGF, Src, SrcTy);
1082   llvm::Constant *DstNull = EmitNullMemberPointer(DstTy);
1083 
1084   // C++ 5.2.10p9: The null member pointer value is converted to the null member
1085   //   pointer value of the destination type.
1086   if (IsReinterpret) {
1087     // For reinterpret casts, sema ensures that src and dst are both functions
1088     // or data and have the same size, which means the LLVM types should match.
1089     assert(Src->getType() == DstNull->getType());
1090     return Builder.CreateSelect(IsNotNull, Src, DstNull);
1091   }
1092 
1093   llvm::BasicBlock *OriginalBB = Builder.GetInsertBlock();
1094   llvm::BasicBlock *ConvertBB = CGF.createBasicBlock("memptr.convert");
1095   llvm::BasicBlock *ContinueBB = CGF.createBasicBlock("memptr.converted");
1096   Builder.CreateCondBr(IsNotNull, ConvertBB, ContinueBB);
1097   CGF.EmitBlock(ConvertBB);
1098 
1099   // Decompose src.
1100   llvm::Value *FirstField = Src;
1101   llvm::Value *NonVirtualBaseAdjustment = 0;
1102   llvm::Value *VirtualBaseAdjustmentOffset = 0;
1103   llvm::Value *VBPtrOffset = 0;
1104   if (!hasOnlyOneField(IsFunc, SrcInheritance)) {
1105     // We need to extract values.
1106     unsigned I = 0;
1107     FirstField = Builder.CreateExtractValue(Src, I++);
1108     if (hasNonVirtualBaseAdjustmentField(IsFunc, SrcInheritance))
1109       NonVirtualBaseAdjustment = Builder.CreateExtractValue(Src, I++);
1110     if (hasVBPtrOffsetField(SrcInheritance))
1111       VBPtrOffset = Builder.CreateExtractValue(Src, I++);
1112     if (hasVirtualBaseAdjustmentField(SrcInheritance))
1113       VirtualBaseAdjustmentOffset = Builder.CreateExtractValue(Src, I++);
1114   }
1115 
1116   // For data pointers, we adjust the field offset directly.  For functions, we
1117   // have a separate field.
1118   llvm::Constant *Adj = getMemberPointerAdjustment(E);
1119   if (Adj) {
1120     Adj = llvm::ConstantExpr::getTruncOrBitCast(Adj, CGM.IntTy);
1121     llvm::Value *&NVAdjustField = IsFunc ? NonVirtualBaseAdjustment : FirstField;
1122     bool isDerivedToBase = (E->getCastKind() == CK_DerivedToBaseMemberPointer);
1123     if (!NVAdjustField)  // If this field didn't exist in src, it's zero.
1124       NVAdjustField = getZeroInt();
1125     if (isDerivedToBase)
1126       NVAdjustField = Builder.CreateNSWSub(NVAdjustField, Adj, "adj");
1127     else
1128       NVAdjustField = Builder.CreateNSWAdd(NVAdjustField, Adj, "adj");
1129   }
1130 
1131   // FIXME PR15713: Support conversions through virtually derived classes.
1132 
1133   // Recompose dst from the null struct and the adjusted fields from src.
1134   llvm::Value *Dst;
1135   if (hasOnlyOneField(IsFunc, DstInheritance)) {
1136     Dst = FirstField;
1137   } else {
1138     Dst = llvm::UndefValue::get(DstNull->getType());
1139     unsigned Idx = 0;
1140     Dst = Builder.CreateInsertValue(Dst, FirstField, Idx++);
1141     if (hasNonVirtualBaseAdjustmentField(IsFunc, DstInheritance))
1142       Dst = Builder.CreateInsertValue(
1143         Dst, getValueOrZeroInt(NonVirtualBaseAdjustment), Idx++);
1144     if (hasVBPtrOffsetField(DstInheritance))
1145       Dst = Builder.CreateInsertValue(
1146         Dst, getValueOrZeroInt(VBPtrOffset), Idx++);
1147     if (hasVirtualBaseAdjustmentField(DstInheritance))
1148       Dst = Builder.CreateInsertValue(
1149         Dst, getValueOrZeroInt(VirtualBaseAdjustmentOffset), Idx++);
1150   }
1151   Builder.CreateBr(ContinueBB);
1152 
1153   // In the continuation, choose between DstNull and Dst.
1154   CGF.EmitBlock(ContinueBB);
1155   llvm::PHINode *Phi = Builder.CreatePHI(DstNull->getType(), 2, "memptr.converted");
1156   Phi->addIncoming(DstNull, OriginalBB);
1157   Phi->addIncoming(Dst, ConvertBB);
1158   return Phi;
1159 }
1160 
1161 llvm::Constant *
1162 MicrosoftCXXABI::EmitMemberPointerConversion(const CastExpr *E,
1163                                              llvm::Constant *Src) {
1164   const MemberPointerType *SrcTy =
1165     E->getSubExpr()->getType()->castAs<MemberPointerType>();
1166   const MemberPointerType *DstTy = E->getType()->castAs<MemberPointerType>();
1167 
1168   // If src is null, emit a new null for dst.  We can't return src because dst
1169   // might have a new representation.
1170   if (MemberPointerConstantIsNull(SrcTy, Src))
1171     return EmitNullMemberPointer(DstTy);
1172 
1173   // We don't need to do anything for reinterpret_casts of non-null member
1174   // pointers.  We should only get here when the two type representations have
1175   // the same size.
1176   if (E->getCastKind() == CK_ReinterpretMemberPointer)
1177     return Src;
1178 
1179   MSInheritanceModel SrcInheritance = getInheritanceFromMemptr(SrcTy);
1180   MSInheritanceModel DstInheritance = getInheritanceFromMemptr(DstTy);
1181 
1182   // Decompose src.
1183   llvm::Constant *FirstField = Src;
1184   llvm::Constant *NonVirtualBaseAdjustment = 0;
1185   llvm::Constant *VirtualBaseAdjustmentOffset = 0;
1186   llvm::Constant *VBPtrOffset = 0;
1187   bool IsFunc = SrcTy->isMemberFunctionPointer();
1188   if (!hasOnlyOneField(IsFunc, SrcInheritance)) {
1189     // We need to extract values.
1190     unsigned I = 0;
1191     FirstField = Src->getAggregateElement(I++);
1192     if (hasNonVirtualBaseAdjustmentField(IsFunc, SrcInheritance))
1193       NonVirtualBaseAdjustment = Src->getAggregateElement(I++);
1194     if (hasVBPtrOffsetField(SrcInheritance))
1195       VBPtrOffset = Src->getAggregateElement(I++);
1196     if (hasVirtualBaseAdjustmentField(SrcInheritance))
1197       VirtualBaseAdjustmentOffset = Src->getAggregateElement(I++);
1198   }
1199 
1200   // For data pointers, we adjust the field offset directly.  For functions, we
1201   // have a separate field.
1202   llvm::Constant *Adj = getMemberPointerAdjustment(E);
1203   if (Adj) {
1204     Adj = llvm::ConstantExpr::getTruncOrBitCast(Adj, CGM.IntTy);
1205     llvm::Constant *&NVAdjustField =
1206       IsFunc ? NonVirtualBaseAdjustment : FirstField;
1207     bool IsDerivedToBase = (E->getCastKind() == CK_DerivedToBaseMemberPointer);
1208     if (!NVAdjustField)  // If this field didn't exist in src, it's zero.
1209       NVAdjustField = getZeroInt();
1210     if (IsDerivedToBase)
1211       NVAdjustField = llvm::ConstantExpr::getNSWSub(NVAdjustField, Adj);
1212     else
1213       NVAdjustField = llvm::ConstantExpr::getNSWAdd(NVAdjustField, Adj);
1214   }
1215 
1216   // FIXME PR15713: Support conversions through virtually derived classes.
1217 
1218   // Recompose dst from the null struct and the adjusted fields from src.
1219   if (hasOnlyOneField(IsFunc, DstInheritance))
1220     return FirstField;
1221 
1222   llvm::SmallVector<llvm::Constant *, 4> Fields;
1223   Fields.push_back(FirstField);
1224   if (hasNonVirtualBaseAdjustmentField(IsFunc, DstInheritance))
1225     Fields.push_back(getConstantOrZeroInt(NonVirtualBaseAdjustment));
1226   if (hasVBPtrOffsetField(DstInheritance))
1227     Fields.push_back(getConstantOrZeroInt(VBPtrOffset));
1228   if (hasVirtualBaseAdjustmentField(DstInheritance))
1229     Fields.push_back(getConstantOrZeroInt(VirtualBaseAdjustmentOffset));
1230   return llvm::ConstantStruct::getAnon(Fields);
1231 }
1232 
1233 llvm::Value *
1234 MicrosoftCXXABI::EmitLoadOfMemberFunctionPointer(CodeGenFunction &CGF,
1235                                                  llvm::Value *&This,
1236                                                  llvm::Value *MemPtr,
1237                                                  const MemberPointerType *MPT) {
1238   assert(MPT->isMemberFunctionPointer());
1239   const FunctionProtoType *FPT =
1240     MPT->getPointeeType()->castAs<FunctionProtoType>();
1241   const CXXRecordDecl *RD = MPT->getClass()->getAsCXXRecordDecl();
1242   llvm::FunctionType *FTy =
1243     CGM.getTypes().GetFunctionType(
1244       CGM.getTypes().arrangeCXXMethodType(RD, FPT));
1245   CGBuilderTy &Builder = CGF.Builder;
1246 
1247   MSInheritanceModel Inheritance = RD->getMSInheritanceModel();
1248 
1249   // Extract the fields we need, regardless of model.  We'll apply them if we
1250   // have them.
1251   llvm::Value *FunctionPointer = MemPtr;
1252   llvm::Value *NonVirtualBaseAdjustment = NULL;
1253   llvm::Value *VirtualBaseAdjustmentOffset = NULL;
1254   llvm::Value *VBPtrOffset = NULL;
1255   if (MemPtr->getType()->isStructTy()) {
1256     // We need to extract values.
1257     unsigned I = 0;
1258     FunctionPointer = Builder.CreateExtractValue(MemPtr, I++);
1259     if (hasNonVirtualBaseAdjustmentField(MPT, Inheritance))
1260       NonVirtualBaseAdjustment = Builder.CreateExtractValue(MemPtr, I++);
1261     if (hasVBPtrOffsetField(Inheritance))
1262       VBPtrOffset = Builder.CreateExtractValue(MemPtr, I++);
1263     if (hasVirtualBaseAdjustmentField(Inheritance))
1264       VirtualBaseAdjustmentOffset = Builder.CreateExtractValue(MemPtr, I++);
1265   }
1266 
1267   if (VirtualBaseAdjustmentOffset) {
1268     This = AdjustVirtualBase(CGF, RD, This, VirtualBaseAdjustmentOffset,
1269                              VBPtrOffset);
1270   }
1271 
1272   if (NonVirtualBaseAdjustment) {
1273     // Apply the adjustment and cast back to the original struct type.
1274     llvm::Value *Ptr = Builder.CreateBitCast(This, Builder.getInt8PtrTy());
1275     Ptr = Builder.CreateInBoundsGEP(Ptr, NonVirtualBaseAdjustment);
1276     This = Builder.CreateBitCast(Ptr, This->getType(), "this.adjusted");
1277   }
1278 
1279   return Builder.CreateBitCast(FunctionPointer, FTy->getPointerTo());
1280 }
1281 
1282 CGCXXABI *clang::CodeGen::CreateMicrosoftCXXABI(CodeGenModule &CGM) {
1283   return new MicrosoftCXXABI(CGM);
1284 }
1285 
1286