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