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 "CGVTables.h"
19 #include "CodeGenModule.h"
20 #include "CodeGenTypes.h"
21 #include "TargetInfo.h"
22 #include "clang/AST/Decl.h"
23 #include "clang/AST/DeclCXX.h"
24 #include "clang/AST/StmtCXX.h"
25 #include "clang/AST/VTableBuilder.h"
26 #include "llvm/ADT/StringExtras.h"
27 #include "llvm/ADT/StringSet.h"
28 #include "llvm/IR/CallSite.h"
29 #include "llvm/IR/Intrinsics.h"
30 
31 using namespace clang;
32 using namespace CodeGen;
33 
34 namespace {
35 
36 /// Holds all the vbtable globals for a given class.
37 struct VBTableGlobals {
38   const VPtrInfoVector *VBTables;
39   SmallVector<llvm::GlobalVariable *, 2> Globals;
40 };
41 
42 class MicrosoftCXXABI : public CGCXXABI {
43 public:
44   MicrosoftCXXABI(CodeGenModule &CGM)
45       : CGCXXABI(CGM), BaseClassDescriptorType(nullptr),
46         ClassHierarchyDescriptorType(nullptr),
47         CompleteObjectLocatorType(nullptr), CatchableTypeType(nullptr),
48         ThrowInfoType(nullptr), CatchHandlerTypeType(nullptr) {}
49 
50   bool HasThisReturn(GlobalDecl GD) const override;
51   bool hasMostDerivedReturn(GlobalDecl GD) const override;
52 
53   bool classifyReturnType(CGFunctionInfo &FI) const override;
54 
55   RecordArgABI getRecordArgABI(const CXXRecordDecl *RD) const override;
56 
57   bool isSRetParameterAfterThis() const override { return true; }
58 
59   size_t getSrcArgforCopyCtor(const CXXConstructorDecl *CD,
60                               FunctionArgList &Args) const override {
61     assert(Args.size() >= 2 &&
62            "expected the arglist to have at least two args!");
63     // The 'most_derived' parameter goes second if the ctor is variadic and
64     // has v-bases.
65     if (CD->getParent()->getNumVBases() > 0 &&
66         CD->getType()->castAs<FunctionProtoType>()->isVariadic())
67       return 2;
68     return 1;
69   }
70 
71   StringRef GetPureVirtualCallName() override { return "_purecall"; }
72   StringRef GetDeletedVirtualCallName() override { return "_purecall"; }
73 
74   void emitVirtualObjectDelete(CodeGenFunction &CGF, const CXXDeleteExpr *DE,
75                                llvm::Value *Ptr, QualType ElementType,
76                                const CXXDestructorDecl *Dtor) override;
77 
78   void emitRethrow(CodeGenFunction &CGF, bool isNoReturn) override;
79   void emitThrow(CodeGenFunction &CGF, const CXXThrowExpr *E) override;
80 
81   void emitBeginCatch(CodeGenFunction &CGF, const CXXCatchStmt *C) override;
82 
83   llvm::GlobalVariable *getMSCompleteObjectLocator(const CXXRecordDecl *RD,
84                                                    const VPtrInfo *Info);
85 
86   llvm::Constant *getAddrOfRTTIDescriptor(QualType Ty) override;
87   llvm::Constant *
88   getAddrOfCXXCatchHandlerType(QualType Ty, QualType CatchHandlerType) override;
89 
90   bool shouldTypeidBeNullChecked(bool IsDeref, QualType SrcRecordTy) override;
91   void EmitBadTypeidCall(CodeGenFunction &CGF) override;
92   llvm::Value *EmitTypeid(CodeGenFunction &CGF, QualType SrcRecordTy,
93                           llvm::Value *ThisPtr,
94                           llvm::Type *StdTypeInfoPtrTy) override;
95 
96   bool shouldDynamicCastCallBeNullChecked(bool SrcIsPtr,
97                                           QualType SrcRecordTy) override;
98 
99   llvm::Value *EmitDynamicCastCall(CodeGenFunction &CGF, llvm::Value *Value,
100                                    QualType SrcRecordTy, QualType DestTy,
101                                    QualType DestRecordTy,
102                                    llvm::BasicBlock *CastEnd) override;
103 
104   llvm::Value *EmitDynamicCastToVoid(CodeGenFunction &CGF, llvm::Value *Value,
105                                      QualType SrcRecordTy,
106                                      QualType DestTy) override;
107 
108   bool EmitBadCastCall(CodeGenFunction &CGF) override;
109 
110   llvm::Value *
111   GetVirtualBaseClassOffset(CodeGenFunction &CGF, llvm::Value *This,
112                             const CXXRecordDecl *ClassDecl,
113                             const CXXRecordDecl *BaseClassDecl) override;
114 
115   llvm::BasicBlock *
116   EmitCtorCompleteObjectHandler(CodeGenFunction &CGF,
117                                 const CXXRecordDecl *RD) override;
118 
119   void initializeHiddenVirtualInheritanceMembers(CodeGenFunction &CGF,
120                                               const CXXRecordDecl *RD) override;
121 
122   void EmitCXXConstructors(const CXXConstructorDecl *D) override;
123 
124   // Background on MSVC destructors
125   // ==============================
126   //
127   // Both Itanium and MSVC ABIs have destructor variants.  The variant names
128   // roughly correspond in the following way:
129   //   Itanium       Microsoft
130   //   Base       -> no name, just ~Class
131   //   Complete   -> vbase destructor
132   //   Deleting   -> scalar deleting destructor
133   //                 vector deleting destructor
134   //
135   // The base and complete destructors are the same as in Itanium, although the
136   // complete destructor does not accept a VTT parameter when there are virtual
137   // bases.  A separate mechanism involving vtordisps is used to ensure that
138   // virtual methods of destroyed subobjects are not called.
139   //
140   // The deleting destructors accept an i32 bitfield as a second parameter.  Bit
141   // 1 indicates if the memory should be deleted.  Bit 2 indicates if the this
142   // pointer points to an array.  The scalar deleting destructor assumes that
143   // bit 2 is zero, and therefore does not contain a loop.
144   //
145   // For virtual destructors, only one entry is reserved in the vftable, and it
146   // always points to the vector deleting destructor.  The vector deleting
147   // destructor is the most general, so it can be used to destroy objects in
148   // place, delete single heap objects, or delete arrays.
149   //
150   // A TU defining a non-inline destructor is only guaranteed to emit a base
151   // destructor, and all of the other variants are emitted on an as-needed basis
152   // in COMDATs.  Because a non-base destructor can be emitted in a TU that
153   // lacks a definition for the destructor, non-base destructors must always
154   // delegate to or alias the base destructor.
155 
156   void buildStructorSignature(const CXXMethodDecl *MD, StructorType T,
157                               SmallVectorImpl<CanQualType> &ArgTys) override;
158 
159   /// Non-base dtors should be emitted as delegating thunks in this ABI.
160   bool useThunkForDtorVariant(const CXXDestructorDecl *Dtor,
161                               CXXDtorType DT) const override {
162     return DT != Dtor_Base;
163   }
164 
165   void EmitCXXDestructors(const CXXDestructorDecl *D) override;
166 
167   const CXXRecordDecl *
168   getThisArgumentTypeForMethod(const CXXMethodDecl *MD) override {
169     MD = MD->getCanonicalDecl();
170     if (MD->isVirtual() && !isa<CXXDestructorDecl>(MD)) {
171       MicrosoftVTableContext::MethodVFTableLocation ML =
172           CGM.getMicrosoftVTableContext().getMethodVFTableLocation(MD);
173       // The vbases might be ordered differently in the final overrider object
174       // and the complete object, so the "this" argument may sometimes point to
175       // memory that has no particular type (e.g. past the complete object).
176       // In this case, we just use a generic pointer type.
177       // FIXME: might want to have a more precise type in the non-virtual
178       // multiple inheritance case.
179       if (ML.VBase || !ML.VFPtrOffset.isZero())
180         return nullptr;
181     }
182     return MD->getParent();
183   }
184 
185   llvm::Value *
186   adjustThisArgumentForVirtualFunctionCall(CodeGenFunction &CGF, GlobalDecl GD,
187                                            llvm::Value *This,
188                                            bool VirtualCall) override;
189 
190   void addImplicitStructorParams(CodeGenFunction &CGF, QualType &ResTy,
191                                  FunctionArgList &Params) override;
192 
193   llvm::Value *adjustThisParameterInVirtualFunctionPrologue(
194       CodeGenFunction &CGF, GlobalDecl GD, llvm::Value *This) override;
195 
196   void EmitInstanceFunctionProlog(CodeGenFunction &CGF) override;
197 
198   unsigned addImplicitConstructorArgs(CodeGenFunction &CGF,
199                                       const CXXConstructorDecl *D,
200                                       CXXCtorType Type, bool ForVirtualBase,
201                                       bool Delegating,
202                                       CallArgList &Args) override;
203 
204   void EmitDestructorCall(CodeGenFunction &CGF, const CXXDestructorDecl *DD,
205                           CXXDtorType Type, bool ForVirtualBase,
206                           bool Delegating, llvm::Value *This) override;
207 
208   void emitVTableBitSetEntries(VPtrInfo *Info, const CXXRecordDecl *RD,
209                                llvm::GlobalVariable *VTable);
210 
211   void emitVTableDefinitions(CodeGenVTables &CGVT,
212                              const CXXRecordDecl *RD) override;
213 
214   llvm::Value *getVTableAddressPointInStructor(
215       CodeGenFunction &CGF, const CXXRecordDecl *VTableClass,
216       BaseSubobject Base, const CXXRecordDecl *NearestVBase,
217       bool &NeedsVirtualOffset) override;
218 
219   llvm::Constant *
220   getVTableAddressPointForConstExpr(BaseSubobject Base,
221                                     const CXXRecordDecl *VTableClass) override;
222 
223   llvm::GlobalVariable *getAddrOfVTable(const CXXRecordDecl *RD,
224                                         CharUnits VPtrOffset) override;
225 
226   llvm::Value *getVirtualFunctionPointer(CodeGenFunction &CGF, GlobalDecl GD,
227                                          llvm::Value *This, llvm::Type *Ty,
228                                          SourceLocation Loc) override;
229 
230   llvm::Value *EmitVirtualDestructorCall(CodeGenFunction &CGF,
231                                          const CXXDestructorDecl *Dtor,
232                                          CXXDtorType DtorType,
233                                          llvm::Value *This,
234                                          const CXXMemberCallExpr *CE) override;
235 
236   void adjustCallArgsForDestructorThunk(CodeGenFunction &CGF, GlobalDecl GD,
237                                         CallArgList &CallArgs) override {
238     assert(GD.getDtorType() == Dtor_Deleting &&
239            "Only deleting destructor thunks are available in this ABI");
240     CallArgs.add(RValue::get(getStructorImplicitParamValue(CGF)),
241                  getContext().IntTy);
242   }
243 
244   void emitVirtualInheritanceTables(const CXXRecordDecl *RD) override;
245 
246   llvm::GlobalVariable *
247   getAddrOfVBTable(const VPtrInfo &VBT, const CXXRecordDecl *RD,
248                    llvm::GlobalVariable::LinkageTypes Linkage);
249 
250   void emitVBTableDefinition(const VPtrInfo &VBT, const CXXRecordDecl *RD,
251                              llvm::GlobalVariable *GV) const;
252 
253   void setThunkLinkage(llvm::Function *Thunk, bool ForVTable,
254                        GlobalDecl GD, bool ReturnAdjustment) override {
255     // Never dllimport/dllexport thunks.
256     Thunk->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
257 
258     GVALinkage Linkage =
259         getContext().GetGVALinkageForFunction(cast<FunctionDecl>(GD.getDecl()));
260 
261     if (Linkage == GVA_Internal)
262       Thunk->setLinkage(llvm::GlobalValue::InternalLinkage);
263     else if (ReturnAdjustment)
264       Thunk->setLinkage(llvm::GlobalValue::WeakODRLinkage);
265     else
266       Thunk->setLinkage(llvm::GlobalValue::LinkOnceODRLinkage);
267   }
268 
269   llvm::Value *performThisAdjustment(CodeGenFunction &CGF, llvm::Value *This,
270                                      const ThisAdjustment &TA) override;
271 
272   llvm::Value *performReturnAdjustment(CodeGenFunction &CGF, llvm::Value *Ret,
273                                        const ReturnAdjustment &RA) override;
274 
275   void EmitThreadLocalInitFuncs(
276       CodeGenModule &CGM,
277       ArrayRef<std::pair<const VarDecl *, llvm::GlobalVariable *>>
278           CXXThreadLocals,
279       ArrayRef<llvm::Function *> CXXThreadLocalInits,
280       ArrayRef<llvm::GlobalVariable *> CXXThreadLocalInitVars) override;
281 
282   bool usesThreadWrapperFunction() const override { return false; }
283   LValue EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF, const VarDecl *VD,
284                                       QualType LValType) override;
285 
286   void EmitGuardedInit(CodeGenFunction &CGF, const VarDecl &D,
287                        llvm::GlobalVariable *DeclPtr,
288                        bool PerformInit) override;
289   void registerGlobalDtor(CodeGenFunction &CGF, const VarDecl &D,
290                           llvm::Constant *Dtor, llvm::Constant *Addr) override;
291 
292   // ==== Notes on array cookies =========
293   //
294   // MSVC seems to only use cookies when the class has a destructor; a
295   // two-argument usual array deallocation function isn't sufficient.
296   //
297   // For example, this code prints "100" and "1":
298   //   struct A {
299   //     char x;
300   //     void *operator new[](size_t sz) {
301   //       printf("%u\n", sz);
302   //       return malloc(sz);
303   //     }
304   //     void operator delete[](void *p, size_t sz) {
305   //       printf("%u\n", sz);
306   //       free(p);
307   //     }
308   //   };
309   //   int main() {
310   //     A *p = new A[100];
311   //     delete[] p;
312   //   }
313   // Whereas it prints "104" and "104" if you give A a destructor.
314 
315   bool requiresArrayCookie(const CXXDeleteExpr *expr,
316                            QualType elementType) override;
317   bool requiresArrayCookie(const CXXNewExpr *expr) override;
318   CharUnits getArrayCookieSizeImpl(QualType type) override;
319   llvm::Value *InitializeArrayCookie(CodeGenFunction &CGF,
320                                      llvm::Value *NewPtr,
321                                      llvm::Value *NumElements,
322                                      const CXXNewExpr *expr,
323                                      QualType ElementType) override;
324   llvm::Value *readArrayCookieImpl(CodeGenFunction &CGF,
325                                    llvm::Value *allocPtr,
326                                    CharUnits cookieSize) override;
327 
328   friend struct MSRTTIBuilder;
329 
330   bool isImageRelative() const {
331     return CGM.getTarget().getPointerWidth(/*AddressSpace=*/0) == 64;
332   }
333 
334   // 5 routines for constructing the llvm types for MS RTTI structs.
335   llvm::StructType *getTypeDescriptorType(StringRef TypeInfoString) {
336     llvm::SmallString<32> TDTypeName("rtti.TypeDescriptor");
337     TDTypeName += llvm::utostr(TypeInfoString.size());
338     llvm::StructType *&TypeDescriptorType =
339         TypeDescriptorTypeMap[TypeInfoString.size()];
340     if (TypeDescriptorType)
341       return TypeDescriptorType;
342     llvm::Type *FieldTypes[] = {
343         CGM.Int8PtrPtrTy,
344         CGM.Int8PtrTy,
345         llvm::ArrayType::get(CGM.Int8Ty, TypeInfoString.size() + 1)};
346     TypeDescriptorType =
347         llvm::StructType::create(CGM.getLLVMContext(), FieldTypes, TDTypeName);
348     return TypeDescriptorType;
349   }
350 
351   llvm::Type *getImageRelativeType(llvm::Type *PtrType) {
352     if (!isImageRelative())
353       return PtrType;
354     return CGM.IntTy;
355   }
356 
357   llvm::StructType *getBaseClassDescriptorType() {
358     if (BaseClassDescriptorType)
359       return BaseClassDescriptorType;
360     llvm::Type *FieldTypes[] = {
361         getImageRelativeType(CGM.Int8PtrTy),
362         CGM.IntTy,
363         CGM.IntTy,
364         CGM.IntTy,
365         CGM.IntTy,
366         CGM.IntTy,
367         getImageRelativeType(getClassHierarchyDescriptorType()->getPointerTo()),
368     };
369     BaseClassDescriptorType = llvm::StructType::create(
370         CGM.getLLVMContext(), FieldTypes, "rtti.BaseClassDescriptor");
371     return BaseClassDescriptorType;
372   }
373 
374   llvm::StructType *getClassHierarchyDescriptorType() {
375     if (ClassHierarchyDescriptorType)
376       return ClassHierarchyDescriptorType;
377     // Forward-declare RTTIClassHierarchyDescriptor to break a cycle.
378     ClassHierarchyDescriptorType = llvm::StructType::create(
379         CGM.getLLVMContext(), "rtti.ClassHierarchyDescriptor");
380     llvm::Type *FieldTypes[] = {
381         CGM.IntTy,
382         CGM.IntTy,
383         CGM.IntTy,
384         getImageRelativeType(
385             getBaseClassDescriptorType()->getPointerTo()->getPointerTo()),
386     };
387     ClassHierarchyDescriptorType->setBody(FieldTypes);
388     return ClassHierarchyDescriptorType;
389   }
390 
391   llvm::StructType *getCompleteObjectLocatorType() {
392     if (CompleteObjectLocatorType)
393       return CompleteObjectLocatorType;
394     CompleteObjectLocatorType = llvm::StructType::create(
395         CGM.getLLVMContext(), "rtti.CompleteObjectLocator");
396     llvm::Type *FieldTypes[] = {
397         CGM.IntTy,
398         CGM.IntTy,
399         CGM.IntTy,
400         getImageRelativeType(CGM.Int8PtrTy),
401         getImageRelativeType(getClassHierarchyDescriptorType()->getPointerTo()),
402         getImageRelativeType(CompleteObjectLocatorType),
403     };
404     llvm::ArrayRef<llvm::Type *> FieldTypesRef(FieldTypes);
405     if (!isImageRelative())
406       FieldTypesRef = FieldTypesRef.drop_back();
407     CompleteObjectLocatorType->setBody(FieldTypesRef);
408     return CompleteObjectLocatorType;
409   }
410 
411   llvm::GlobalVariable *getImageBase() {
412     StringRef Name = "__ImageBase";
413     if (llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(Name))
414       return GV;
415 
416     return new llvm::GlobalVariable(CGM.getModule(), CGM.Int8Ty,
417                                     /*isConstant=*/true,
418                                     llvm::GlobalValue::ExternalLinkage,
419                                     /*Initializer=*/nullptr, Name);
420   }
421 
422   llvm::Constant *getImageRelativeConstant(llvm::Constant *PtrVal) {
423     if (!isImageRelative())
424       return PtrVal;
425 
426     if (PtrVal->isNullValue())
427       return llvm::Constant::getNullValue(CGM.IntTy);
428 
429     llvm::Constant *ImageBaseAsInt =
430         llvm::ConstantExpr::getPtrToInt(getImageBase(), CGM.IntPtrTy);
431     llvm::Constant *PtrValAsInt =
432         llvm::ConstantExpr::getPtrToInt(PtrVal, CGM.IntPtrTy);
433     llvm::Constant *Diff =
434         llvm::ConstantExpr::getSub(PtrValAsInt, ImageBaseAsInt,
435                                    /*HasNUW=*/true, /*HasNSW=*/true);
436     return llvm::ConstantExpr::getTrunc(Diff, CGM.IntTy);
437   }
438 
439 private:
440   MicrosoftMangleContext &getMangleContext() {
441     return cast<MicrosoftMangleContext>(CodeGen::CGCXXABI::getMangleContext());
442   }
443 
444   llvm::Constant *getZeroInt() {
445     return llvm::ConstantInt::get(CGM.IntTy, 0);
446   }
447 
448   llvm::Constant *getAllOnesInt() {
449     return  llvm::Constant::getAllOnesValue(CGM.IntTy);
450   }
451 
452   llvm::Constant *getConstantOrZeroInt(llvm::Constant *C) {
453     return C ? C : getZeroInt();
454   }
455 
456   llvm::Value *getValueOrZeroInt(llvm::Value *C) {
457     return C ? C : getZeroInt();
458   }
459 
460   CharUnits getVirtualFunctionPrologueThisAdjustment(GlobalDecl GD);
461 
462   void
463   GetNullMemberPointerFields(const MemberPointerType *MPT,
464                              llvm::SmallVectorImpl<llvm::Constant *> &fields);
465 
466   /// \brief Shared code for virtual base adjustment.  Returns the offset from
467   /// the vbptr to the virtual base.  Optionally returns the address of the
468   /// vbptr itself.
469   llvm::Value *GetVBaseOffsetFromVBPtr(CodeGenFunction &CGF,
470                                        llvm::Value *Base,
471                                        llvm::Value *VBPtrOffset,
472                                        llvm::Value *VBTableOffset,
473                                        llvm::Value **VBPtr = nullptr);
474 
475   llvm::Value *GetVBaseOffsetFromVBPtr(CodeGenFunction &CGF,
476                                        llvm::Value *Base,
477                                        int32_t VBPtrOffset,
478                                        int32_t VBTableOffset,
479                                        llvm::Value **VBPtr = nullptr) {
480     assert(VBTableOffset % 4 == 0 && "should be byte offset into table of i32s");
481     llvm::Value *VBPOffset = llvm::ConstantInt::get(CGM.IntTy, VBPtrOffset),
482                 *VBTOffset = llvm::ConstantInt::get(CGM.IntTy, VBTableOffset);
483     return GetVBaseOffsetFromVBPtr(CGF, Base, VBPOffset, VBTOffset, VBPtr);
484   }
485 
486   std::pair<llvm::Value *, llvm::Value *>
487   performBaseAdjustment(CodeGenFunction &CGF, llvm::Value *Value,
488                         QualType SrcRecordTy);
489 
490   /// \brief Performs a full virtual base adjustment.  Used to dereference
491   /// pointers to members of virtual bases.
492   llvm::Value *AdjustVirtualBase(CodeGenFunction &CGF, const Expr *E,
493                                  const CXXRecordDecl *RD, llvm::Value *Base,
494                                  llvm::Value *VirtualBaseAdjustmentOffset,
495                                  llvm::Value *VBPtrOffset /* optional */);
496 
497   /// \brief Emits a full member pointer with the fields common to data and
498   /// function member pointers.
499   llvm::Constant *EmitFullMemberPointer(llvm::Constant *FirstField,
500                                         bool IsMemberFunction,
501                                         const CXXRecordDecl *RD,
502                                         CharUnits NonVirtualBaseAdjustment,
503                                         unsigned VBTableIndex);
504 
505   llvm::Constant *BuildMemberPointer(const CXXRecordDecl *RD,
506                                      const CXXMethodDecl *MD,
507                                      CharUnits NonVirtualBaseAdjustment);
508 
509   bool MemberPointerConstantIsNull(const MemberPointerType *MPT,
510                                    llvm::Constant *MP);
511 
512   /// \brief - Initialize all vbptrs of 'this' with RD as the complete type.
513   void EmitVBPtrStores(CodeGenFunction &CGF, const CXXRecordDecl *RD);
514 
515   /// \brief Caching wrapper around VBTableBuilder::enumerateVBTables().
516   const VBTableGlobals &enumerateVBTables(const CXXRecordDecl *RD);
517 
518   /// \brief Generate a thunk for calling a virtual member function MD.
519   llvm::Function *EmitVirtualMemPtrThunk(
520       const CXXMethodDecl *MD,
521       const MicrosoftVTableContext::MethodVFTableLocation &ML);
522 
523 public:
524   llvm::Type *ConvertMemberPointerType(const MemberPointerType *MPT) override;
525 
526   bool isZeroInitializable(const MemberPointerType *MPT) override;
527 
528   bool isMemberPointerConvertible(const MemberPointerType *MPT) const override {
529     const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl();
530     return RD->hasAttr<MSInheritanceAttr>();
531   }
532 
533   bool isTypeInfoCalculable(QualType Ty) const override {
534     if (!CGCXXABI::isTypeInfoCalculable(Ty))
535       return false;
536     if (const auto *MPT = Ty->getAs<MemberPointerType>()) {
537       const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl();
538       if (!RD->hasAttr<MSInheritanceAttr>())
539         return false;
540     }
541     return true;
542   }
543 
544   llvm::Constant *EmitNullMemberPointer(const MemberPointerType *MPT) override;
545 
546   llvm::Constant *EmitMemberDataPointer(const MemberPointerType *MPT,
547                                         CharUnits offset) override;
548   llvm::Constant *EmitMemberPointer(const CXXMethodDecl *MD) override;
549   llvm::Constant *EmitMemberPointer(const APValue &MP, QualType MPT) override;
550 
551   llvm::Value *EmitMemberPointerComparison(CodeGenFunction &CGF,
552                                            llvm::Value *L,
553                                            llvm::Value *R,
554                                            const MemberPointerType *MPT,
555                                            bool Inequality) override;
556 
557   llvm::Value *EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
558                                           llvm::Value *MemPtr,
559                                           const MemberPointerType *MPT) override;
560 
561   llvm::Value *
562   EmitMemberDataPointerAddress(CodeGenFunction &CGF, const Expr *E,
563                                llvm::Value *Base, llvm::Value *MemPtr,
564                                const MemberPointerType *MPT) override;
565 
566   llvm::Value *EmitMemberPointerConversion(CodeGenFunction &CGF,
567                                            const CastExpr *E,
568                                            llvm::Value *Src) override;
569 
570   llvm::Constant *EmitMemberPointerConversion(const CastExpr *E,
571                                               llvm::Constant *Src) override;
572 
573   llvm::Value *
574   EmitLoadOfMemberFunctionPointer(CodeGenFunction &CGF, const Expr *E,
575                                   llvm::Value *&This, llvm::Value *MemPtr,
576                                   const MemberPointerType *MPT) override;
577 
578   void emitCXXStructor(const CXXMethodDecl *MD, StructorType Type) override;
579 
580   llvm::StructType *getCatchHandlerTypeType() {
581     if (!CatchHandlerTypeType) {
582       llvm::Type *FieldTypes[] = {
583           CGM.IntTy,     // Flags
584           CGM.Int8PtrTy, // TypeDescriptor
585       };
586       CatchHandlerTypeType = llvm::StructType::create(
587           CGM.getLLVMContext(), FieldTypes, "eh.CatchHandlerType");
588     }
589     return CatchHandlerTypeType;
590   }
591 
592   llvm::StructType *getCatchableTypeType() {
593     if (CatchableTypeType)
594       return CatchableTypeType;
595     llvm::Type *FieldTypes[] = {
596         CGM.IntTy,                           // Flags
597         getImageRelativeType(CGM.Int8PtrTy), // TypeDescriptor
598         CGM.IntTy,                           // NonVirtualAdjustment
599         CGM.IntTy,                           // OffsetToVBPtr
600         CGM.IntTy,                           // VBTableIndex
601         CGM.IntTy,                           // Size
602         getImageRelativeType(CGM.Int8PtrTy)  // CopyCtor
603     };
604     CatchableTypeType = llvm::StructType::create(
605         CGM.getLLVMContext(), FieldTypes, "eh.CatchableType");
606     return CatchableTypeType;
607   }
608 
609   llvm::StructType *getCatchableTypeArrayType(uint32_t NumEntries) {
610     llvm::StructType *&CatchableTypeArrayType =
611         CatchableTypeArrayTypeMap[NumEntries];
612     if (CatchableTypeArrayType)
613       return CatchableTypeArrayType;
614 
615     llvm::SmallString<23> CTATypeName("eh.CatchableTypeArray.");
616     CTATypeName += llvm::utostr(NumEntries);
617     llvm::Type *CTType =
618         getImageRelativeType(getCatchableTypeType()->getPointerTo());
619     llvm::Type *FieldTypes[] = {
620         CGM.IntTy,                               // NumEntries
621         llvm::ArrayType::get(CTType, NumEntries) // CatchableTypes
622     };
623     CatchableTypeArrayType =
624         llvm::StructType::create(CGM.getLLVMContext(), FieldTypes, CTATypeName);
625     return CatchableTypeArrayType;
626   }
627 
628   llvm::StructType *getThrowInfoType() {
629     if (ThrowInfoType)
630       return ThrowInfoType;
631     llvm::Type *FieldTypes[] = {
632         CGM.IntTy,                           // Flags
633         getImageRelativeType(CGM.Int8PtrTy), // CleanupFn
634         getImageRelativeType(CGM.Int8PtrTy), // ForwardCompat
635         getImageRelativeType(CGM.Int8PtrTy)  // CatchableTypeArray
636     };
637     ThrowInfoType = llvm::StructType::create(CGM.getLLVMContext(), FieldTypes,
638                                              "eh.ThrowInfo");
639     return ThrowInfoType;
640   }
641 
642   llvm::Constant *getThrowFn() {
643     // _CxxThrowException is passed an exception object and a ThrowInfo object
644     // which describes the exception.
645     llvm::Type *Args[] = {CGM.Int8PtrTy, getThrowInfoType()->getPointerTo()};
646     llvm::FunctionType *FTy =
647         llvm::FunctionType::get(CGM.VoidTy, Args, /*IsVarArgs=*/false);
648     auto *Fn = cast<llvm::Function>(
649         CGM.CreateRuntimeFunction(FTy, "_CxxThrowException"));
650     // _CxxThrowException is stdcall on 32-bit x86 platforms.
651     if (CGM.getTarget().getTriple().getArch() == llvm::Triple::x86)
652       Fn->setCallingConv(llvm::CallingConv::X86_StdCall);
653     return Fn;
654   }
655 
656   llvm::Function *getAddrOfCXXCtorClosure(const CXXConstructorDecl *CD,
657                                           CXXCtorType CT);
658 
659   llvm::Constant *getCatchableType(QualType T,
660                                    uint32_t NVOffset = 0,
661                                    int32_t VBPtrOffset = -1,
662                                    uint32_t VBIndex = 0);
663 
664   llvm::GlobalVariable *getCatchableTypeArray(QualType T);
665 
666   llvm::GlobalVariable *getThrowInfo(QualType T) override;
667 
668 private:
669   typedef std::pair<const CXXRecordDecl *, CharUnits> VFTableIdTy;
670   typedef llvm::DenseMap<VFTableIdTy, llvm::GlobalVariable *> VTablesMapTy;
671   typedef llvm::DenseMap<VFTableIdTy, llvm::GlobalValue *> VFTablesMapTy;
672   /// \brief All the vftables that have been referenced.
673   VFTablesMapTy VFTablesMap;
674   VTablesMapTy VTablesMap;
675 
676   /// \brief This set holds the record decls we've deferred vtable emission for.
677   llvm::SmallPtrSet<const CXXRecordDecl *, 4> DeferredVFTables;
678 
679 
680   /// \brief All the vbtables which have been referenced.
681   llvm::DenseMap<const CXXRecordDecl *, VBTableGlobals> VBTablesMap;
682 
683   /// Info on the global variable used to guard initialization of static locals.
684   /// The BitIndex field is only used for externally invisible declarations.
685   struct GuardInfo {
686     GuardInfo() : Guard(nullptr), BitIndex(0) {}
687     llvm::GlobalVariable *Guard;
688     unsigned BitIndex;
689   };
690 
691   /// Map from DeclContext to the current guard variable.  We assume that the
692   /// AST is visited in source code order.
693   llvm::DenseMap<const DeclContext *, GuardInfo> GuardVariableMap;
694   llvm::DenseMap<const DeclContext *, GuardInfo> ThreadLocalGuardVariableMap;
695   llvm::DenseMap<const DeclContext *, unsigned> ThreadSafeGuardNumMap;
696 
697   llvm::DenseMap<size_t, llvm::StructType *> TypeDescriptorTypeMap;
698   llvm::StructType *BaseClassDescriptorType;
699   llvm::StructType *ClassHierarchyDescriptorType;
700   llvm::StructType *CompleteObjectLocatorType;
701 
702   llvm::DenseMap<QualType, llvm::GlobalVariable *> CatchableTypeArrays;
703 
704   llvm::StructType *CatchableTypeType;
705   llvm::DenseMap<uint32_t, llvm::StructType *> CatchableTypeArrayTypeMap;
706   llvm::StructType *ThrowInfoType;
707   llvm::StructType *CatchHandlerTypeType;
708 };
709 
710 } // namespace
711 
712 CGCXXABI::RecordArgABI
713 MicrosoftCXXABI::getRecordArgABI(const CXXRecordDecl *RD) const {
714   switch (CGM.getTarget().getTriple().getArch()) {
715   default:
716     // FIXME: Implement for other architectures.
717     return RAA_Default;
718 
719   case llvm::Triple::x86:
720     // All record arguments are passed in memory on x86.  Decide whether to
721     // construct the object directly in argument memory, or to construct the
722     // argument elsewhere and copy the bytes during the call.
723 
724     // If C++ prohibits us from making a copy, construct the arguments directly
725     // into argument memory.
726     if (!canCopyArgument(RD))
727       return RAA_DirectInMemory;
728 
729     // Otherwise, construct the argument into a temporary and copy the bytes
730     // into the outgoing argument memory.
731     return RAA_Default;
732 
733   case llvm::Triple::x86_64:
734     // Win64 passes objects with non-trivial copy ctors indirectly.
735     if (RD->hasNonTrivialCopyConstructor())
736       return RAA_Indirect;
737 
738     // If an object has a destructor, we'd really like to pass it indirectly
739     // because it allows us to elide copies.  Unfortunately, MSVC makes that
740     // impossible for small types, which it will pass in a single register or
741     // stack slot. Most objects with dtors are large-ish, so handle that early.
742     // We can't call out all large objects as being indirect because there are
743     // multiple x64 calling conventions and the C++ ABI code shouldn't dictate
744     // how we pass large POD types.
745     if (RD->hasNonTrivialDestructor() &&
746         getContext().getTypeSize(RD->getTypeForDecl()) > 64)
747       return RAA_Indirect;
748 
749     // We have a trivial copy constructor or no copy constructors, but we have
750     // to make sure it isn't deleted.
751     bool CopyDeleted = false;
752     for (const CXXConstructorDecl *CD : RD->ctors()) {
753       if (CD->isCopyConstructor()) {
754         assert(CD->isTrivial());
755         // We had at least one undeleted trivial copy ctor.  Return directly.
756         if (!CD->isDeleted())
757           return RAA_Default;
758         CopyDeleted = true;
759       }
760     }
761 
762     // The trivial copy constructor was deleted.  Return indirectly.
763     if (CopyDeleted)
764       return RAA_Indirect;
765 
766     // There were no copy ctors.  Return in RAX.
767     return RAA_Default;
768   }
769 
770   llvm_unreachable("invalid enum");
771 }
772 
773 void MicrosoftCXXABI::emitVirtualObjectDelete(CodeGenFunction &CGF,
774                                               const CXXDeleteExpr *DE,
775                                               llvm::Value *Ptr,
776                                               QualType ElementType,
777                                               const CXXDestructorDecl *Dtor) {
778   // FIXME: Provide a source location here even though there's no
779   // CXXMemberCallExpr for dtor call.
780   bool UseGlobalDelete = DE->isGlobalDelete();
781   CXXDtorType DtorType = UseGlobalDelete ? Dtor_Complete : Dtor_Deleting;
782   llvm::Value *MDThis =
783       EmitVirtualDestructorCall(CGF, Dtor, DtorType, Ptr, /*CE=*/nullptr);
784   if (UseGlobalDelete)
785     CGF.EmitDeleteCall(DE->getOperatorDelete(), MDThis, ElementType);
786 }
787 
788 void MicrosoftCXXABI::emitRethrow(CodeGenFunction &CGF, bool isNoReturn) {
789   llvm::Value *Args[] = {
790       llvm::ConstantPointerNull::get(CGM.Int8PtrTy),
791       llvm::ConstantPointerNull::get(getThrowInfoType()->getPointerTo())};
792   auto *Fn = getThrowFn();
793   if (isNoReturn)
794     CGF.EmitNoreturnRuntimeCallOrInvoke(Fn, Args);
795   else
796     CGF.EmitRuntimeCallOrInvoke(Fn, Args);
797 }
798 
799 namespace {
800 struct CallEndCatchMSVC : EHScopeStack::Cleanup {
801   CallEndCatchMSVC() {}
802   void Emit(CodeGenFunction &CGF, Flags flags) override {
803     CGF.EmitNounwindRuntimeCall(
804         CGF.CGM.getIntrinsic(llvm::Intrinsic::eh_endcatch));
805   }
806 };
807 }
808 
809 void MicrosoftCXXABI::emitBeginCatch(CodeGenFunction &CGF,
810                                      const CXXCatchStmt *S) {
811   // In the MS ABI, the runtime handles the copy, and the catch handler is
812   // responsible for destruction.
813   VarDecl *CatchParam = S->getExceptionDecl();
814   llvm::Value *Exn = CGF.getExceptionFromSlot();
815   llvm::Function *BeginCatch =
816       CGF.CGM.getIntrinsic(llvm::Intrinsic::eh_begincatch);
817 
818   // If this is a catch-all or the catch parameter is unnamed, we don't need to
819   // emit an alloca to the object.
820   if (!CatchParam || !CatchParam->getDeclName()) {
821     llvm::Value *Args[2] = {Exn, llvm::Constant::getNullValue(CGF.Int8PtrTy)};
822     CGF.EmitNounwindRuntimeCall(BeginCatch, Args);
823     CGF.EHStack.pushCleanup<CallEndCatchMSVC>(NormalCleanup);
824     return;
825   }
826 
827   CodeGenFunction::AutoVarEmission var = CGF.EmitAutoVarAlloca(*CatchParam);
828   llvm::Value *ParamAddr =
829       CGF.Builder.CreateBitCast(var.getObjectAddress(CGF), CGF.Int8PtrTy);
830   llvm::Value *Args[2] = {Exn, ParamAddr};
831   CGF.EmitNounwindRuntimeCall(BeginCatch, Args);
832   CGF.EHStack.pushCleanup<CallEndCatchMSVC>(NormalCleanup);
833   CGF.EmitAutoVarCleanups(var);
834 }
835 
836 std::pair<llvm::Value *, llvm::Value *>
837 MicrosoftCXXABI::performBaseAdjustment(CodeGenFunction &CGF, llvm::Value *Value,
838                                        QualType SrcRecordTy) {
839   Value = CGF.Builder.CreateBitCast(Value, CGF.Int8PtrTy);
840   const CXXRecordDecl *SrcDecl = SrcRecordTy->getAsCXXRecordDecl();
841   const ASTContext &Context = getContext();
842 
843   if (Context.getASTRecordLayout(SrcDecl).hasExtendableVFPtr())
844     return std::make_pair(Value, llvm::ConstantInt::get(CGF.Int32Ty, 0));
845 
846   // Perform a base adjustment.
847   const CXXBaseSpecifier *PolymorphicBase = std::find_if(
848       SrcDecl->vbases_begin(), SrcDecl->vbases_end(),
849       [&](const CXXBaseSpecifier &Base) {
850         const CXXRecordDecl *BaseDecl = Base.getType()->getAsCXXRecordDecl();
851         return Context.getASTRecordLayout(BaseDecl).hasExtendableVFPtr();
852       });
853   llvm::Value *Offset = GetVirtualBaseClassOffset(
854       CGF, Value, SrcDecl, PolymorphicBase->getType()->getAsCXXRecordDecl());
855   Value = CGF.Builder.CreateInBoundsGEP(Value, Offset);
856   Offset = CGF.Builder.CreateTrunc(Offset, CGF.Int32Ty);
857   return std::make_pair(Value, Offset);
858 }
859 
860 bool MicrosoftCXXABI::shouldTypeidBeNullChecked(bool IsDeref,
861                                                 QualType SrcRecordTy) {
862   const CXXRecordDecl *SrcDecl = SrcRecordTy->getAsCXXRecordDecl();
863   return IsDeref &&
864          !getContext().getASTRecordLayout(SrcDecl).hasExtendableVFPtr();
865 }
866 
867 static llvm::CallSite emitRTtypeidCall(CodeGenFunction &CGF,
868                                        llvm::Value *Argument) {
869   llvm::Type *ArgTypes[] = {CGF.Int8PtrTy};
870   llvm::FunctionType *FTy =
871       llvm::FunctionType::get(CGF.Int8PtrTy, ArgTypes, false);
872   llvm::Value *Args[] = {Argument};
873   llvm::Constant *Fn = CGF.CGM.CreateRuntimeFunction(FTy, "__RTtypeid");
874   return CGF.EmitRuntimeCallOrInvoke(Fn, Args);
875 }
876 
877 void MicrosoftCXXABI::EmitBadTypeidCall(CodeGenFunction &CGF) {
878   llvm::CallSite Call =
879       emitRTtypeidCall(CGF, llvm::Constant::getNullValue(CGM.VoidPtrTy));
880   Call.setDoesNotReturn();
881   CGF.Builder.CreateUnreachable();
882 }
883 
884 llvm::Value *MicrosoftCXXABI::EmitTypeid(CodeGenFunction &CGF,
885                                          QualType SrcRecordTy,
886                                          llvm::Value *ThisPtr,
887                                          llvm::Type *StdTypeInfoPtrTy) {
888   llvm::Value *Offset;
889   std::tie(ThisPtr, Offset) = performBaseAdjustment(CGF, ThisPtr, SrcRecordTy);
890   return CGF.Builder.CreateBitCast(
891       emitRTtypeidCall(CGF, ThisPtr).getInstruction(), StdTypeInfoPtrTy);
892 }
893 
894 bool MicrosoftCXXABI::shouldDynamicCastCallBeNullChecked(bool SrcIsPtr,
895                                                          QualType SrcRecordTy) {
896   const CXXRecordDecl *SrcDecl = SrcRecordTy->getAsCXXRecordDecl();
897   return SrcIsPtr &&
898          !getContext().getASTRecordLayout(SrcDecl).hasExtendableVFPtr();
899 }
900 
901 llvm::Value *MicrosoftCXXABI::EmitDynamicCastCall(
902     CodeGenFunction &CGF, llvm::Value *Value, QualType SrcRecordTy,
903     QualType DestTy, QualType DestRecordTy, llvm::BasicBlock *CastEnd) {
904   llvm::Type *DestLTy = CGF.ConvertType(DestTy);
905 
906   llvm::Value *SrcRTTI =
907       CGF.CGM.GetAddrOfRTTIDescriptor(SrcRecordTy.getUnqualifiedType());
908   llvm::Value *DestRTTI =
909       CGF.CGM.GetAddrOfRTTIDescriptor(DestRecordTy.getUnqualifiedType());
910 
911   llvm::Value *Offset;
912   std::tie(Value, Offset) = performBaseAdjustment(CGF, Value, SrcRecordTy);
913 
914   // PVOID __RTDynamicCast(
915   //   PVOID inptr,
916   //   LONG VfDelta,
917   //   PVOID SrcType,
918   //   PVOID TargetType,
919   //   BOOL isReference)
920   llvm::Type *ArgTypes[] = {CGF.Int8PtrTy, CGF.Int32Ty, CGF.Int8PtrTy,
921                             CGF.Int8PtrTy, CGF.Int32Ty};
922   llvm::Constant *Function = CGF.CGM.CreateRuntimeFunction(
923       llvm::FunctionType::get(CGF.Int8PtrTy, ArgTypes, false),
924       "__RTDynamicCast");
925   llvm::Value *Args[] = {
926       Value, Offset, SrcRTTI, DestRTTI,
927       llvm::ConstantInt::get(CGF.Int32Ty, DestTy->isReferenceType())};
928   Value = CGF.EmitRuntimeCallOrInvoke(Function, Args).getInstruction();
929   return CGF.Builder.CreateBitCast(Value, DestLTy);
930 }
931 
932 llvm::Value *
933 MicrosoftCXXABI::EmitDynamicCastToVoid(CodeGenFunction &CGF, llvm::Value *Value,
934                                        QualType SrcRecordTy,
935                                        QualType DestTy) {
936   llvm::Value *Offset;
937   std::tie(Value, Offset) = performBaseAdjustment(CGF, Value, SrcRecordTy);
938 
939   // PVOID __RTCastToVoid(
940   //   PVOID inptr)
941   llvm::Type *ArgTypes[] = {CGF.Int8PtrTy};
942   llvm::Constant *Function = CGF.CGM.CreateRuntimeFunction(
943       llvm::FunctionType::get(CGF.Int8PtrTy, ArgTypes, false),
944       "__RTCastToVoid");
945   llvm::Value *Args[] = {Value};
946   return CGF.EmitRuntimeCall(Function, Args);
947 }
948 
949 bool MicrosoftCXXABI::EmitBadCastCall(CodeGenFunction &CGF) {
950   return false;
951 }
952 
953 llvm::Value *MicrosoftCXXABI::GetVirtualBaseClassOffset(
954     CodeGenFunction &CGF, llvm::Value *This, const CXXRecordDecl *ClassDecl,
955     const CXXRecordDecl *BaseClassDecl) {
956   const ASTContext &Context = getContext();
957   int64_t VBPtrChars =
958       Context.getASTRecordLayout(ClassDecl).getVBPtrOffset().getQuantity();
959   llvm::Value *VBPtrOffset = llvm::ConstantInt::get(CGM.PtrDiffTy, VBPtrChars);
960   CharUnits IntSize = Context.getTypeSizeInChars(Context.IntTy);
961   CharUnits VBTableChars =
962       IntSize *
963       CGM.getMicrosoftVTableContext().getVBTableIndex(ClassDecl, BaseClassDecl);
964   llvm::Value *VBTableOffset =
965       llvm::ConstantInt::get(CGM.IntTy, VBTableChars.getQuantity());
966 
967   llvm::Value *VBPtrToNewBase =
968       GetVBaseOffsetFromVBPtr(CGF, This, VBPtrOffset, VBTableOffset);
969   VBPtrToNewBase =
970       CGF.Builder.CreateSExtOrBitCast(VBPtrToNewBase, CGM.PtrDiffTy);
971   return CGF.Builder.CreateNSWAdd(VBPtrOffset, VBPtrToNewBase);
972 }
973 
974 bool MicrosoftCXXABI::HasThisReturn(GlobalDecl GD) const {
975   return isa<CXXConstructorDecl>(GD.getDecl());
976 }
977 
978 static bool isDeletingDtor(GlobalDecl GD) {
979   return isa<CXXDestructorDecl>(GD.getDecl()) &&
980          GD.getDtorType() == Dtor_Deleting;
981 }
982 
983 bool MicrosoftCXXABI::hasMostDerivedReturn(GlobalDecl GD) const {
984   return isDeletingDtor(GD);
985 }
986 
987 bool MicrosoftCXXABI::classifyReturnType(CGFunctionInfo &FI) const {
988   const CXXRecordDecl *RD = FI.getReturnType()->getAsCXXRecordDecl();
989   if (!RD)
990     return false;
991 
992   if (FI.isInstanceMethod()) {
993     // If it's an instance method, aggregates are always returned indirectly via
994     // the second parameter.
995     FI.getReturnInfo() = ABIArgInfo::getIndirect(0, /*ByVal=*/false);
996     FI.getReturnInfo().setSRetAfterThis(FI.isInstanceMethod());
997     return true;
998   } else if (!RD->isPOD()) {
999     // If it's a free function, non-POD types are returned indirectly.
1000     FI.getReturnInfo() = ABIArgInfo::getIndirect(0, /*ByVal=*/false);
1001     return true;
1002   }
1003 
1004   // Otherwise, use the C ABI rules.
1005   return false;
1006 }
1007 
1008 llvm::BasicBlock *
1009 MicrosoftCXXABI::EmitCtorCompleteObjectHandler(CodeGenFunction &CGF,
1010                                                const CXXRecordDecl *RD) {
1011   llvm::Value *IsMostDerivedClass = getStructorImplicitParamValue(CGF);
1012   assert(IsMostDerivedClass &&
1013          "ctor for a class with virtual bases must have an implicit parameter");
1014   llvm::Value *IsCompleteObject =
1015     CGF.Builder.CreateIsNotNull(IsMostDerivedClass, "is_complete_object");
1016 
1017   llvm::BasicBlock *CallVbaseCtorsBB = CGF.createBasicBlock("ctor.init_vbases");
1018   llvm::BasicBlock *SkipVbaseCtorsBB = CGF.createBasicBlock("ctor.skip_vbases");
1019   CGF.Builder.CreateCondBr(IsCompleteObject,
1020                            CallVbaseCtorsBB, SkipVbaseCtorsBB);
1021 
1022   CGF.EmitBlock(CallVbaseCtorsBB);
1023 
1024   // Fill in the vbtable pointers here.
1025   EmitVBPtrStores(CGF, RD);
1026 
1027   // CGF will put the base ctor calls in this basic block for us later.
1028 
1029   return SkipVbaseCtorsBB;
1030 }
1031 
1032 void MicrosoftCXXABI::initializeHiddenVirtualInheritanceMembers(
1033     CodeGenFunction &CGF, const CXXRecordDecl *RD) {
1034   // In most cases, an override for a vbase virtual method can adjust
1035   // the "this" parameter by applying a constant offset.
1036   // However, this is not enough while a constructor or a destructor of some
1037   // class X is being executed if all the following conditions are met:
1038   //  - X has virtual bases, (1)
1039   //  - X overrides a virtual method M of a vbase Y, (2)
1040   //  - X itself is a vbase of the most derived class.
1041   //
1042   // If (1) and (2) are true, the vtorDisp for vbase Y is a hidden member of X
1043   // which holds the extra amount of "this" adjustment we must do when we use
1044   // the X vftables (i.e. during X ctor or dtor).
1045   // Outside the ctors and dtors, the values of vtorDisps are zero.
1046 
1047   const ASTRecordLayout &Layout = getContext().getASTRecordLayout(RD);
1048   typedef ASTRecordLayout::VBaseOffsetsMapTy VBOffsets;
1049   const VBOffsets &VBaseMap = Layout.getVBaseOffsetsMap();
1050   CGBuilderTy &Builder = CGF.Builder;
1051 
1052   unsigned AS =
1053       cast<llvm::PointerType>(getThisValue(CGF)->getType())->getAddressSpace();
1054   llvm::Value *Int8This = nullptr;  // Initialize lazily.
1055 
1056   for (VBOffsets::const_iterator I = VBaseMap.begin(), E = VBaseMap.end();
1057         I != E; ++I) {
1058     if (!I->second.hasVtorDisp())
1059       continue;
1060 
1061     llvm::Value *VBaseOffset =
1062         GetVirtualBaseClassOffset(CGF, getThisValue(CGF), RD, I->first);
1063     // FIXME: it doesn't look right that we SExt in GetVirtualBaseClassOffset()
1064     // just to Trunc back immediately.
1065     VBaseOffset = Builder.CreateTruncOrBitCast(VBaseOffset, CGF.Int32Ty);
1066     uint64_t ConstantVBaseOffset =
1067         Layout.getVBaseClassOffset(I->first).getQuantity();
1068 
1069     // vtorDisp_for_vbase = vbptr[vbase_idx] - offsetof(RD, vbase).
1070     llvm::Value *VtorDispValue = Builder.CreateSub(
1071         VBaseOffset, llvm::ConstantInt::get(CGM.Int32Ty, ConstantVBaseOffset),
1072         "vtordisp.value");
1073 
1074     if (!Int8This)
1075       Int8This = Builder.CreateBitCast(getThisValue(CGF),
1076                                        CGF.Int8Ty->getPointerTo(AS));
1077     llvm::Value *VtorDispPtr = Builder.CreateInBoundsGEP(Int8This, VBaseOffset);
1078     // vtorDisp is always the 32-bits before the vbase in the class layout.
1079     VtorDispPtr = Builder.CreateConstGEP1_32(VtorDispPtr, -4);
1080     VtorDispPtr = Builder.CreateBitCast(
1081         VtorDispPtr, CGF.Int32Ty->getPointerTo(AS), "vtordisp.ptr");
1082 
1083     Builder.CreateStore(VtorDispValue, VtorDispPtr);
1084   }
1085 }
1086 
1087 static bool hasDefaultCXXMethodCC(ASTContext &Context,
1088                                   const CXXMethodDecl *MD) {
1089   CallingConv ExpectedCallingConv = Context.getDefaultCallingConvention(
1090       /*IsVariadic=*/false, /*IsCXXMethod=*/true);
1091   CallingConv ActualCallingConv =
1092       MD->getType()->getAs<FunctionProtoType>()->getCallConv();
1093   return ExpectedCallingConv == ActualCallingConv;
1094 }
1095 
1096 void MicrosoftCXXABI::EmitCXXConstructors(const CXXConstructorDecl *D) {
1097   // There's only one constructor type in this ABI.
1098   CGM.EmitGlobal(GlobalDecl(D, Ctor_Complete));
1099 
1100   // Exported default constructors either have a simple call-site where they use
1101   // the typical calling convention and have a single 'this' pointer for an
1102   // argument -or- they get a wrapper function which appropriately thunks to the
1103   // real default constructor.  This thunk is the default constructor closure.
1104   if (D->hasAttr<DLLExportAttr>() && D->isDefaultConstructor())
1105     if (!hasDefaultCXXMethodCC(getContext(), D) || D->getNumParams() != 0) {
1106       llvm::Function *Fn = getAddrOfCXXCtorClosure(D, Ctor_DefaultClosure);
1107       Fn->setLinkage(llvm::GlobalValue::WeakODRLinkage);
1108       Fn->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
1109     }
1110 }
1111 
1112 void MicrosoftCXXABI::EmitVBPtrStores(CodeGenFunction &CGF,
1113                                       const CXXRecordDecl *RD) {
1114   llvm::Value *ThisInt8Ptr =
1115     CGF.Builder.CreateBitCast(getThisValue(CGF), CGM.Int8PtrTy, "this.int8");
1116   const ASTContext &Context = getContext();
1117   const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
1118 
1119   const VBTableGlobals &VBGlobals = enumerateVBTables(RD);
1120   for (unsigned I = 0, E = VBGlobals.VBTables->size(); I != E; ++I) {
1121     const VPtrInfo *VBT = (*VBGlobals.VBTables)[I];
1122     llvm::GlobalVariable *GV = VBGlobals.Globals[I];
1123     const ASTRecordLayout &SubobjectLayout =
1124         Context.getASTRecordLayout(VBT->BaseWithVPtr);
1125     CharUnits Offs = VBT->NonVirtualOffset;
1126     Offs += SubobjectLayout.getVBPtrOffset();
1127     if (VBT->getVBaseWithVPtr())
1128       Offs += Layout.getVBaseClassOffset(VBT->getVBaseWithVPtr());
1129     llvm::Value *VBPtr =
1130         CGF.Builder.CreateConstInBoundsGEP1_64(ThisInt8Ptr, Offs.getQuantity());
1131     llvm::Value *GVPtr =
1132         CGF.Builder.CreateConstInBoundsGEP2_32(GV->getValueType(), GV, 0, 0);
1133     VBPtr = CGF.Builder.CreateBitCast(VBPtr, GVPtr->getType()->getPointerTo(0),
1134                                       "vbptr." + VBT->ReusingBase->getName());
1135     CGF.Builder.CreateStore(GVPtr, VBPtr);
1136   }
1137 }
1138 
1139 void
1140 MicrosoftCXXABI::buildStructorSignature(const CXXMethodDecl *MD, StructorType T,
1141                                         SmallVectorImpl<CanQualType> &ArgTys) {
1142   // TODO: 'for base' flag
1143   if (T == StructorType::Deleting) {
1144     // The scalar deleting destructor takes an implicit int parameter.
1145     ArgTys.push_back(getContext().IntTy);
1146   }
1147   auto *CD = dyn_cast<CXXConstructorDecl>(MD);
1148   if (!CD)
1149     return;
1150 
1151   // All parameters are already in place except is_most_derived, which goes
1152   // after 'this' if it's variadic and last if it's not.
1153 
1154   const CXXRecordDecl *Class = CD->getParent();
1155   const FunctionProtoType *FPT = CD->getType()->castAs<FunctionProtoType>();
1156   if (Class->getNumVBases()) {
1157     if (FPT->isVariadic())
1158       ArgTys.insert(ArgTys.begin() + 1, getContext().IntTy);
1159     else
1160       ArgTys.push_back(getContext().IntTy);
1161   }
1162 }
1163 
1164 void MicrosoftCXXABI::EmitCXXDestructors(const CXXDestructorDecl *D) {
1165   // The TU defining a dtor is only guaranteed to emit a base destructor.  All
1166   // other destructor variants are delegating thunks.
1167   CGM.EmitGlobal(GlobalDecl(D, Dtor_Base));
1168 }
1169 
1170 CharUnits
1171 MicrosoftCXXABI::getVirtualFunctionPrologueThisAdjustment(GlobalDecl GD) {
1172   GD = GD.getCanonicalDecl();
1173   const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl());
1174 
1175   GlobalDecl LookupGD = GD;
1176   if (const CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(MD)) {
1177     // Complete destructors take a pointer to the complete object as a
1178     // parameter, thus don't need this adjustment.
1179     if (GD.getDtorType() == Dtor_Complete)
1180       return CharUnits();
1181 
1182     // There's no Dtor_Base in vftable but it shares the this adjustment with
1183     // the deleting one, so look it up instead.
1184     LookupGD = GlobalDecl(DD, Dtor_Deleting);
1185   }
1186 
1187   MicrosoftVTableContext::MethodVFTableLocation ML =
1188       CGM.getMicrosoftVTableContext().getMethodVFTableLocation(LookupGD);
1189   CharUnits Adjustment = ML.VFPtrOffset;
1190 
1191   // Normal virtual instance methods need to adjust from the vfptr that first
1192   // defined the virtual method to the virtual base subobject, but destructors
1193   // do not.  The vector deleting destructor thunk applies this adjustment for
1194   // us if necessary.
1195   if (isa<CXXDestructorDecl>(MD))
1196     Adjustment = CharUnits::Zero();
1197 
1198   if (ML.VBase) {
1199     const ASTRecordLayout &DerivedLayout =
1200         getContext().getASTRecordLayout(MD->getParent());
1201     Adjustment += DerivedLayout.getVBaseClassOffset(ML.VBase);
1202   }
1203 
1204   return Adjustment;
1205 }
1206 
1207 llvm::Value *MicrosoftCXXABI::adjustThisArgumentForVirtualFunctionCall(
1208     CodeGenFunction &CGF, GlobalDecl GD, llvm::Value *This, bool VirtualCall) {
1209   if (!VirtualCall) {
1210     // If the call of a virtual function is not virtual, we just have to
1211     // compensate for the adjustment the virtual function does in its prologue.
1212     CharUnits Adjustment = getVirtualFunctionPrologueThisAdjustment(GD);
1213     if (Adjustment.isZero())
1214       return This;
1215 
1216     unsigned AS = cast<llvm::PointerType>(This->getType())->getAddressSpace();
1217     llvm::Type *charPtrTy = CGF.Int8Ty->getPointerTo(AS);
1218     This = CGF.Builder.CreateBitCast(This, charPtrTy);
1219     assert(Adjustment.isPositive());
1220     return CGF.Builder.CreateConstGEP1_32(This, Adjustment.getQuantity());
1221   }
1222 
1223   GD = GD.getCanonicalDecl();
1224   const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl());
1225 
1226   GlobalDecl LookupGD = GD;
1227   if (const CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(MD)) {
1228     // Complete dtors take a pointer to the complete object,
1229     // thus don't need adjustment.
1230     if (GD.getDtorType() == Dtor_Complete)
1231       return This;
1232 
1233     // There's only Dtor_Deleting in vftable but it shares the this adjustment
1234     // with the base one, so look up the deleting one instead.
1235     LookupGD = GlobalDecl(DD, Dtor_Deleting);
1236   }
1237   MicrosoftVTableContext::MethodVFTableLocation ML =
1238       CGM.getMicrosoftVTableContext().getMethodVFTableLocation(LookupGD);
1239 
1240   unsigned AS = cast<llvm::PointerType>(This->getType())->getAddressSpace();
1241   llvm::Type *charPtrTy = CGF.Int8Ty->getPointerTo(AS);
1242   CharUnits StaticOffset = ML.VFPtrOffset;
1243 
1244   // Base destructors expect 'this' to point to the beginning of the base
1245   // subobject, not the first vfptr that happens to contain the virtual dtor.
1246   // However, we still need to apply the virtual base adjustment.
1247   if (isa<CXXDestructorDecl>(MD) && GD.getDtorType() == Dtor_Base)
1248     StaticOffset = CharUnits::Zero();
1249 
1250   if (ML.VBase) {
1251     This = CGF.Builder.CreateBitCast(This, charPtrTy);
1252     llvm::Value *VBaseOffset =
1253         GetVirtualBaseClassOffset(CGF, This, MD->getParent(), ML.VBase);
1254     This = CGF.Builder.CreateInBoundsGEP(This, VBaseOffset);
1255   }
1256   if (!StaticOffset.isZero()) {
1257     assert(StaticOffset.isPositive());
1258     This = CGF.Builder.CreateBitCast(This, charPtrTy);
1259     if (ML.VBase) {
1260       // Non-virtual adjustment might result in a pointer outside the allocated
1261       // object, e.g. if the final overrider class is laid out after the virtual
1262       // base that declares a method in the most derived class.
1263       // FIXME: Update the code that emits this adjustment in thunks prologues.
1264       This = CGF.Builder.CreateConstGEP1_32(This, StaticOffset.getQuantity());
1265     } else {
1266       This = CGF.Builder.CreateConstInBoundsGEP1_32(CGF.Int8Ty, This,
1267                                                     StaticOffset.getQuantity());
1268     }
1269   }
1270   return This;
1271 }
1272 
1273 void MicrosoftCXXABI::addImplicitStructorParams(CodeGenFunction &CGF,
1274                                                 QualType &ResTy,
1275                                                 FunctionArgList &Params) {
1276   ASTContext &Context = getContext();
1277   const CXXMethodDecl *MD = cast<CXXMethodDecl>(CGF.CurGD.getDecl());
1278   assert(isa<CXXConstructorDecl>(MD) || isa<CXXDestructorDecl>(MD));
1279   if (isa<CXXConstructorDecl>(MD) && MD->getParent()->getNumVBases()) {
1280     ImplicitParamDecl *IsMostDerived
1281       = ImplicitParamDecl::Create(Context, nullptr,
1282                                   CGF.CurGD.getDecl()->getLocation(),
1283                                   &Context.Idents.get("is_most_derived"),
1284                                   Context.IntTy);
1285     // The 'most_derived' parameter goes second if the ctor is variadic and last
1286     // if it's not.  Dtors can't be variadic.
1287     const FunctionProtoType *FPT = MD->getType()->castAs<FunctionProtoType>();
1288     if (FPT->isVariadic())
1289       Params.insert(Params.begin() + 1, IsMostDerived);
1290     else
1291       Params.push_back(IsMostDerived);
1292     getStructorImplicitParamDecl(CGF) = IsMostDerived;
1293   } else if (isDeletingDtor(CGF.CurGD)) {
1294     ImplicitParamDecl *ShouldDelete
1295       = ImplicitParamDecl::Create(Context, nullptr,
1296                                   CGF.CurGD.getDecl()->getLocation(),
1297                                   &Context.Idents.get("should_call_delete"),
1298                                   Context.IntTy);
1299     Params.push_back(ShouldDelete);
1300     getStructorImplicitParamDecl(CGF) = ShouldDelete;
1301   }
1302 }
1303 
1304 llvm::Value *MicrosoftCXXABI::adjustThisParameterInVirtualFunctionPrologue(
1305     CodeGenFunction &CGF, GlobalDecl GD, llvm::Value *This) {
1306   // In this ABI, every virtual function takes a pointer to one of the
1307   // subobjects that first defines it as the 'this' parameter, rather than a
1308   // pointer to the final overrider subobject. Thus, we need to adjust it back
1309   // to the final overrider subobject before use.
1310   // See comments in the MicrosoftVFTableContext implementation for the details.
1311   CharUnits Adjustment = getVirtualFunctionPrologueThisAdjustment(GD);
1312   if (Adjustment.isZero())
1313     return This;
1314 
1315   unsigned AS = cast<llvm::PointerType>(This->getType())->getAddressSpace();
1316   llvm::Type *charPtrTy = CGF.Int8Ty->getPointerTo(AS),
1317              *thisTy = This->getType();
1318 
1319   This = CGF.Builder.CreateBitCast(This, charPtrTy);
1320   assert(Adjustment.isPositive());
1321   This = CGF.Builder.CreateConstInBoundsGEP1_32(CGF.Int8Ty, This,
1322                                                 -Adjustment.getQuantity());
1323   return CGF.Builder.CreateBitCast(This, thisTy);
1324 }
1325 
1326 void MicrosoftCXXABI::EmitInstanceFunctionProlog(CodeGenFunction &CGF) {
1327   EmitThisParam(CGF);
1328 
1329   /// If this is a function that the ABI specifies returns 'this', initialize
1330   /// the return slot to 'this' at the start of the function.
1331   ///
1332   /// Unlike the setting of return types, this is done within the ABI
1333   /// implementation instead of by clients of CGCXXABI because:
1334   /// 1) getThisValue is currently protected
1335   /// 2) in theory, an ABI could implement 'this' returns some other way;
1336   ///    HasThisReturn only specifies a contract, not the implementation
1337   if (HasThisReturn(CGF.CurGD))
1338     CGF.Builder.CreateStore(getThisValue(CGF), CGF.ReturnValue);
1339   else if (hasMostDerivedReturn(CGF.CurGD))
1340     CGF.Builder.CreateStore(CGF.EmitCastToVoidPtr(getThisValue(CGF)),
1341                             CGF.ReturnValue);
1342 
1343   const CXXMethodDecl *MD = cast<CXXMethodDecl>(CGF.CurGD.getDecl());
1344   if (isa<CXXConstructorDecl>(MD) && MD->getParent()->getNumVBases()) {
1345     assert(getStructorImplicitParamDecl(CGF) &&
1346            "no implicit parameter for a constructor with virtual bases?");
1347     getStructorImplicitParamValue(CGF)
1348       = CGF.Builder.CreateLoad(
1349           CGF.GetAddrOfLocalVar(getStructorImplicitParamDecl(CGF)),
1350           "is_most_derived");
1351   }
1352 
1353   if (isDeletingDtor(CGF.CurGD)) {
1354     assert(getStructorImplicitParamDecl(CGF) &&
1355            "no implicit parameter for a deleting destructor?");
1356     getStructorImplicitParamValue(CGF)
1357       = CGF.Builder.CreateLoad(
1358           CGF.GetAddrOfLocalVar(getStructorImplicitParamDecl(CGF)),
1359           "should_call_delete");
1360   }
1361 }
1362 
1363 unsigned MicrosoftCXXABI::addImplicitConstructorArgs(
1364     CodeGenFunction &CGF, const CXXConstructorDecl *D, CXXCtorType Type,
1365     bool ForVirtualBase, bool Delegating, CallArgList &Args) {
1366   assert(Type == Ctor_Complete || Type == Ctor_Base);
1367 
1368   // Check if we need a 'most_derived' parameter.
1369   if (!D->getParent()->getNumVBases())
1370     return 0;
1371 
1372   // Add the 'most_derived' argument second if we are variadic or last if not.
1373   const FunctionProtoType *FPT = D->getType()->castAs<FunctionProtoType>();
1374   llvm::Value *MostDerivedArg =
1375       llvm::ConstantInt::get(CGM.Int32Ty, Type == Ctor_Complete);
1376   RValue RV = RValue::get(MostDerivedArg);
1377   if (MostDerivedArg) {
1378     if (FPT->isVariadic())
1379       Args.insert(Args.begin() + 1,
1380                   CallArg(RV, getContext().IntTy, /*needscopy=*/false));
1381     else
1382       Args.add(RV, getContext().IntTy);
1383   }
1384 
1385   return 1;  // Added one arg.
1386 }
1387 
1388 void MicrosoftCXXABI::EmitDestructorCall(CodeGenFunction &CGF,
1389                                          const CXXDestructorDecl *DD,
1390                                          CXXDtorType Type, bool ForVirtualBase,
1391                                          bool Delegating, llvm::Value *This) {
1392   llvm::Value *Callee = CGM.getAddrOfCXXStructor(DD, getFromDtorType(Type));
1393 
1394   if (DD->isVirtual()) {
1395     assert(Type != CXXDtorType::Dtor_Deleting &&
1396            "The deleting destructor should only be called via a virtual call");
1397     This = adjustThisArgumentForVirtualFunctionCall(CGF, GlobalDecl(DD, Type),
1398                                                     This, false);
1399   }
1400 
1401   CGF.EmitCXXStructorCall(DD, Callee, ReturnValueSlot(), This,
1402                           /*ImplicitParam=*/nullptr,
1403                           /*ImplicitParamTy=*/QualType(), nullptr,
1404                           getFromDtorType(Type));
1405 }
1406 
1407 void MicrosoftCXXABI::emitVTableBitSetEntries(VPtrInfo *Info,
1408                                               const CXXRecordDecl *RD,
1409                                               llvm::GlobalVariable *VTable) {
1410   if (!getContext().getLangOpts().Sanitize.has(SanitizerKind::CFIVCall) &&
1411       !getContext().getLangOpts().Sanitize.has(SanitizerKind::CFINVCall) &&
1412       !getContext().getLangOpts().Sanitize.has(SanitizerKind::CFIDerivedCast) &&
1413       !getContext().getLangOpts().Sanitize.has(SanitizerKind::CFIUnrelatedCast))
1414     return;
1415 
1416   llvm::NamedMDNode *BitsetsMD =
1417       CGM.getModule().getOrInsertNamedMetadata("llvm.bitsets");
1418   CharUnits PointerWidth = getContext().toCharUnitsFromBits(
1419       getContext().getTargetInfo().getPointerWidth(0));
1420 
1421   // FIXME: Add blacklisting scheme.
1422 
1423   if (Info->PathToBaseWithVPtr.empty()) {
1424     BitsetsMD->addOperand(
1425         CGM.CreateVTableBitSetEntry(VTable, PointerWidth, RD));
1426     return;
1427   }
1428 
1429   // Add a bitset entry for the least derived base belonging to this vftable.
1430   BitsetsMD->addOperand(CGM.CreateVTableBitSetEntry(
1431       VTable, PointerWidth, Info->PathToBaseWithVPtr.back()));
1432 
1433   // Add a bitset entry for each derived class that is laid out at the same
1434   // offset as the least derived base.
1435   for (unsigned I = Info->PathToBaseWithVPtr.size() - 1; I != 0; --I) {
1436     const CXXRecordDecl *DerivedRD = Info->PathToBaseWithVPtr[I - 1];
1437     const CXXRecordDecl *BaseRD = Info->PathToBaseWithVPtr[I];
1438 
1439     const ASTRecordLayout &Layout =
1440         getContext().getASTRecordLayout(DerivedRD);
1441     CharUnits Offset;
1442     auto VBI = Layout.getVBaseOffsetsMap().find(BaseRD);
1443     if (VBI == Layout.getVBaseOffsetsMap().end())
1444       Offset = Layout.getBaseClassOffset(BaseRD);
1445     else
1446       Offset = VBI->second.VBaseOffset;
1447     if (!Offset.isZero())
1448       return;
1449     BitsetsMD->addOperand(
1450         CGM.CreateVTableBitSetEntry(VTable, PointerWidth, DerivedRD));
1451   }
1452 
1453   // Finally do the same for the most derived class.
1454   if (Info->FullOffsetInMDC.isZero())
1455     BitsetsMD->addOperand(
1456         CGM.CreateVTableBitSetEntry(VTable, PointerWidth, RD));
1457 }
1458 
1459 void MicrosoftCXXABI::emitVTableDefinitions(CodeGenVTables &CGVT,
1460                                             const CXXRecordDecl *RD) {
1461   MicrosoftVTableContext &VFTContext = CGM.getMicrosoftVTableContext();
1462   const VPtrInfoVector &VFPtrs = VFTContext.getVFPtrOffsets(RD);
1463 
1464   for (VPtrInfo *Info : VFPtrs) {
1465     llvm::GlobalVariable *VTable = getAddrOfVTable(RD, Info->FullOffsetInMDC);
1466     if (VTable->hasInitializer())
1467       continue;
1468 
1469     llvm::Constant *RTTI = getContext().getLangOpts().RTTIData
1470                                ? getMSCompleteObjectLocator(RD, Info)
1471                                : nullptr;
1472 
1473     const VTableLayout &VTLayout =
1474       VFTContext.getVFTableLayout(RD, Info->FullOffsetInMDC);
1475     llvm::Constant *Init = CGVT.CreateVTableInitializer(
1476         RD, VTLayout.vtable_component_begin(),
1477         VTLayout.getNumVTableComponents(), VTLayout.vtable_thunk_begin(),
1478         VTLayout.getNumVTableThunks(), RTTI);
1479 
1480     VTable->setInitializer(Init);
1481 
1482     emitVTableBitSetEntries(Info, RD, VTable);
1483   }
1484 }
1485 
1486 llvm::Value *MicrosoftCXXABI::getVTableAddressPointInStructor(
1487     CodeGenFunction &CGF, const CXXRecordDecl *VTableClass, BaseSubobject Base,
1488     const CXXRecordDecl *NearestVBase, bool &NeedsVirtualOffset) {
1489   NeedsVirtualOffset = (NearestVBase != nullptr);
1490 
1491   (void)getAddrOfVTable(VTableClass, Base.getBaseOffset());
1492   VFTableIdTy ID(VTableClass, Base.getBaseOffset());
1493   llvm::GlobalValue *VTableAddressPoint = VFTablesMap[ID];
1494   if (!VTableAddressPoint) {
1495     assert(Base.getBase()->getNumVBases() &&
1496            !getContext().getASTRecordLayout(Base.getBase()).hasOwnVFPtr());
1497   }
1498   return VTableAddressPoint;
1499 }
1500 
1501 static void mangleVFTableName(MicrosoftMangleContext &MangleContext,
1502                               const CXXRecordDecl *RD, const VPtrInfo *VFPtr,
1503                               SmallString<256> &Name) {
1504   llvm::raw_svector_ostream Out(Name);
1505   MangleContext.mangleCXXVFTable(RD, VFPtr->MangledPath, Out);
1506 }
1507 
1508 llvm::Constant *MicrosoftCXXABI::getVTableAddressPointForConstExpr(
1509     BaseSubobject Base, const CXXRecordDecl *VTableClass) {
1510   (void)getAddrOfVTable(VTableClass, Base.getBaseOffset());
1511   VFTableIdTy ID(VTableClass, Base.getBaseOffset());
1512   llvm::GlobalValue *VFTable = VFTablesMap[ID];
1513   assert(VFTable && "Couldn't find a vftable for the given base?");
1514   return VFTable;
1515 }
1516 
1517 llvm::GlobalVariable *MicrosoftCXXABI::getAddrOfVTable(const CXXRecordDecl *RD,
1518                                                        CharUnits VPtrOffset) {
1519   // getAddrOfVTable may return 0 if asked to get an address of a vtable which
1520   // shouldn't be used in the given record type. We want to cache this result in
1521   // VFTablesMap, thus a simple zero check is not sufficient.
1522   VFTableIdTy ID(RD, VPtrOffset);
1523   VTablesMapTy::iterator I;
1524   bool Inserted;
1525   std::tie(I, Inserted) = VTablesMap.insert(std::make_pair(ID, nullptr));
1526   if (!Inserted)
1527     return I->second;
1528 
1529   llvm::GlobalVariable *&VTable = I->second;
1530 
1531   MicrosoftVTableContext &VTContext = CGM.getMicrosoftVTableContext();
1532   const VPtrInfoVector &VFPtrs = VTContext.getVFPtrOffsets(RD);
1533 
1534   if (DeferredVFTables.insert(RD).second) {
1535     // We haven't processed this record type before.
1536     // Queue up this v-table for possible deferred emission.
1537     CGM.addDeferredVTable(RD);
1538 
1539 #ifndef NDEBUG
1540     // Create all the vftables at once in order to make sure each vftable has
1541     // a unique mangled name.
1542     llvm::StringSet<> ObservedMangledNames;
1543     for (size_t J = 0, F = VFPtrs.size(); J != F; ++J) {
1544       SmallString<256> Name;
1545       mangleVFTableName(getMangleContext(), RD, VFPtrs[J], Name);
1546       if (!ObservedMangledNames.insert(Name.str()).second)
1547         llvm_unreachable("Already saw this mangling before?");
1548     }
1549 #endif
1550   }
1551 
1552   VPtrInfo *const *VFPtrI =
1553       std::find_if(VFPtrs.begin(), VFPtrs.end(), [&](VPtrInfo *VPI) {
1554         return VPI->FullOffsetInMDC == VPtrOffset;
1555       });
1556   if (VFPtrI == VFPtrs.end()) {
1557     VFTablesMap[ID] = nullptr;
1558     return nullptr;
1559   }
1560   VPtrInfo *VFPtr = *VFPtrI;
1561 
1562   SmallString<256> VFTableName;
1563   mangleVFTableName(getMangleContext(), RD, VFPtr, VFTableName);
1564 
1565   llvm::GlobalValue::LinkageTypes VFTableLinkage = CGM.getVTableLinkage(RD);
1566   bool VFTableComesFromAnotherTU =
1567       llvm::GlobalValue::isAvailableExternallyLinkage(VFTableLinkage) ||
1568       llvm::GlobalValue::isExternalLinkage(VFTableLinkage);
1569   bool VTableAliasIsRequred =
1570       !VFTableComesFromAnotherTU && getContext().getLangOpts().RTTIData;
1571 
1572   if (llvm::GlobalValue *VFTable =
1573           CGM.getModule().getNamedGlobal(VFTableName)) {
1574     VFTablesMap[ID] = VFTable;
1575     return VTableAliasIsRequred
1576                ? cast<llvm::GlobalVariable>(
1577                      cast<llvm::GlobalAlias>(VFTable)->getBaseObject())
1578                : cast<llvm::GlobalVariable>(VFTable);
1579   }
1580 
1581   uint64_t NumVTableSlots =
1582       VTContext.getVFTableLayout(RD, VFPtr->FullOffsetInMDC)
1583           .getNumVTableComponents();
1584   llvm::GlobalValue::LinkageTypes VTableLinkage =
1585       VTableAliasIsRequred ? llvm::GlobalValue::PrivateLinkage : VFTableLinkage;
1586 
1587   StringRef VTableName = VTableAliasIsRequred ? StringRef() : VFTableName.str();
1588 
1589   llvm::ArrayType *VTableType =
1590       llvm::ArrayType::get(CGM.Int8PtrTy, NumVTableSlots);
1591 
1592   // Create a backing variable for the contents of VTable.  The VTable may
1593   // or may not include space for a pointer to RTTI data.
1594   llvm::GlobalValue *VFTable;
1595   VTable = new llvm::GlobalVariable(CGM.getModule(), VTableType,
1596                                     /*isConstant=*/true, VTableLinkage,
1597                                     /*Initializer=*/nullptr, VTableName);
1598   VTable->setUnnamedAddr(true);
1599 
1600   llvm::Comdat *C = nullptr;
1601   if (!VFTableComesFromAnotherTU &&
1602       (llvm::GlobalValue::isWeakForLinker(VFTableLinkage) ||
1603        (llvm::GlobalValue::isLocalLinkage(VFTableLinkage) &&
1604         VTableAliasIsRequred)))
1605     C = CGM.getModule().getOrInsertComdat(VFTableName.str());
1606 
1607   // Only insert a pointer into the VFTable for RTTI data if we are not
1608   // importing it.  We never reference the RTTI data directly so there is no
1609   // need to make room for it.
1610   if (VTableAliasIsRequred) {
1611     llvm::Value *GEPIndices[] = {llvm::ConstantInt::get(CGM.IntTy, 0),
1612                                  llvm::ConstantInt::get(CGM.IntTy, 1)};
1613     // Create a GEP which points just after the first entry in the VFTable,
1614     // this should be the location of the first virtual method.
1615     llvm::Constant *VTableGEP = llvm::ConstantExpr::getInBoundsGetElementPtr(
1616         VTable->getValueType(), VTable, GEPIndices);
1617     if (llvm::GlobalValue::isWeakForLinker(VFTableLinkage)) {
1618       VFTableLinkage = llvm::GlobalValue::ExternalLinkage;
1619       if (C)
1620         C->setSelectionKind(llvm::Comdat::Largest);
1621     }
1622     VFTable = llvm::GlobalAlias::create(
1623         cast<llvm::PointerType>(VTableGEP->getType()), VFTableLinkage,
1624         VFTableName.str(), VTableGEP, &CGM.getModule());
1625     VFTable->setUnnamedAddr(true);
1626   } else {
1627     // We don't need a GlobalAlias to be a symbol for the VTable if we won't
1628     // be referencing any RTTI data.
1629     // The GlobalVariable will end up being an appropriate definition of the
1630     // VFTable.
1631     VFTable = VTable;
1632   }
1633   if (C)
1634     VTable->setComdat(C);
1635 
1636   if (RD->hasAttr<DLLImportAttr>())
1637     VFTable->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
1638   else if (RD->hasAttr<DLLExportAttr>())
1639     VFTable->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
1640 
1641   VFTablesMap[ID] = VFTable;
1642   return VTable;
1643 }
1644 
1645 // Compute the identity of the most derived class whose virtual table is located
1646 // at the given offset into RD.
1647 static const CXXRecordDecl *getClassAtVTableLocation(ASTContext &Ctx,
1648                                                      const CXXRecordDecl *RD,
1649                                                      CharUnits Offset) {
1650   if (Offset.isZero())
1651     return RD;
1652 
1653   const ASTRecordLayout &Layout = Ctx.getASTRecordLayout(RD);
1654   const CXXRecordDecl *MaxBase = nullptr;
1655   CharUnits MaxBaseOffset;
1656   for (auto &&B : RD->bases()) {
1657     const CXXRecordDecl *Base = B.getType()->getAsCXXRecordDecl();
1658     CharUnits BaseOffset = Layout.getBaseClassOffset(Base);
1659     if (BaseOffset <= Offset && BaseOffset > MaxBaseOffset) {
1660       MaxBase = Base;
1661       MaxBaseOffset = BaseOffset;
1662     }
1663   }
1664   for (auto &&B : RD->vbases()) {
1665     const CXXRecordDecl *Base = B.getType()->getAsCXXRecordDecl();
1666     CharUnits BaseOffset = Layout.getVBaseClassOffset(Base);
1667     if (BaseOffset <= Offset && BaseOffset > MaxBaseOffset) {
1668       MaxBase = Base;
1669       MaxBaseOffset = BaseOffset;
1670     }
1671   }
1672   assert(MaxBase);
1673   return getClassAtVTableLocation(Ctx, MaxBase, Offset - MaxBaseOffset);
1674 }
1675 
1676 // Compute the identity of the most derived class whose virtual table is located
1677 // at the MethodVFTableLocation ML.
1678 static const CXXRecordDecl *
1679 getClassAtVTableLocation(ASTContext &Ctx, GlobalDecl GD,
1680                          MicrosoftVTableContext::MethodVFTableLocation &ML) {
1681   const CXXRecordDecl *RD = ML.VBase;
1682   if (!RD)
1683     RD = cast<CXXMethodDecl>(GD.getDecl())->getParent();
1684 
1685   return getClassAtVTableLocation(Ctx, RD, ML.VFPtrOffset);
1686 }
1687 
1688 llvm::Value *MicrosoftCXXABI::getVirtualFunctionPointer(CodeGenFunction &CGF,
1689                                                         GlobalDecl GD,
1690                                                         llvm::Value *This,
1691                                                         llvm::Type *Ty,
1692                                                         SourceLocation Loc) {
1693   GD = GD.getCanonicalDecl();
1694   CGBuilderTy &Builder = CGF.Builder;
1695 
1696   Ty = Ty->getPointerTo()->getPointerTo();
1697   llvm::Value *VPtr =
1698       adjustThisArgumentForVirtualFunctionCall(CGF, GD, This, true);
1699   llvm::Value *VTable = CGF.GetVTablePtr(VPtr, Ty);
1700 
1701   MicrosoftVTableContext::MethodVFTableLocation ML =
1702       CGM.getMicrosoftVTableContext().getMethodVFTableLocation(GD);
1703   if (CGF.SanOpts.has(SanitizerKind::CFIVCall))
1704     CGF.EmitVTablePtrCheck(getClassAtVTableLocation(getContext(), GD, ML),
1705                            VTable, CodeGenFunction::CFITCK_VCall, Loc);
1706 
1707   llvm::Value *VFuncPtr =
1708       Builder.CreateConstInBoundsGEP1_64(VTable, ML.Index, "vfn");
1709   return Builder.CreateLoad(VFuncPtr);
1710 }
1711 
1712 llvm::Value *MicrosoftCXXABI::EmitVirtualDestructorCall(
1713     CodeGenFunction &CGF, const CXXDestructorDecl *Dtor, CXXDtorType DtorType,
1714     llvm::Value *This, const CXXMemberCallExpr *CE) {
1715   assert(CE == nullptr || CE->arg_begin() == CE->arg_end());
1716   assert(DtorType == Dtor_Deleting || DtorType == Dtor_Complete);
1717 
1718   // We have only one destructor in the vftable but can get both behaviors
1719   // by passing an implicit int parameter.
1720   GlobalDecl GD(Dtor, Dtor_Deleting);
1721   const CGFunctionInfo *FInfo = &CGM.getTypes().arrangeCXXStructorDeclaration(
1722       Dtor, StructorType::Deleting);
1723   llvm::Type *Ty = CGF.CGM.getTypes().GetFunctionType(*FInfo);
1724   llvm::Value *Callee = getVirtualFunctionPointer(
1725       CGF, GD, This, Ty, CE ? CE->getLocStart() : SourceLocation());
1726 
1727   ASTContext &Context = getContext();
1728   llvm::Value *ImplicitParam = llvm::ConstantInt::get(
1729       llvm::IntegerType::getInt32Ty(CGF.getLLVMContext()),
1730       DtorType == Dtor_Deleting);
1731 
1732   This = adjustThisArgumentForVirtualFunctionCall(CGF, GD, This, true);
1733   RValue RV = CGF.EmitCXXStructorCall(Dtor, Callee, ReturnValueSlot(), This,
1734                                       ImplicitParam, Context.IntTy, CE,
1735                                       StructorType::Deleting);
1736   return RV.getScalarVal();
1737 }
1738 
1739 const VBTableGlobals &
1740 MicrosoftCXXABI::enumerateVBTables(const CXXRecordDecl *RD) {
1741   // At this layer, we can key the cache off of a single class, which is much
1742   // easier than caching each vbtable individually.
1743   llvm::DenseMap<const CXXRecordDecl*, VBTableGlobals>::iterator Entry;
1744   bool Added;
1745   std::tie(Entry, Added) =
1746       VBTablesMap.insert(std::make_pair(RD, VBTableGlobals()));
1747   VBTableGlobals &VBGlobals = Entry->second;
1748   if (!Added)
1749     return VBGlobals;
1750 
1751   MicrosoftVTableContext &Context = CGM.getMicrosoftVTableContext();
1752   VBGlobals.VBTables = &Context.enumerateVBTables(RD);
1753 
1754   // Cache the globals for all vbtables so we don't have to recompute the
1755   // mangled names.
1756   llvm::GlobalVariable::LinkageTypes Linkage = CGM.getVTableLinkage(RD);
1757   for (VPtrInfoVector::const_iterator I = VBGlobals.VBTables->begin(),
1758                                       E = VBGlobals.VBTables->end();
1759        I != E; ++I) {
1760     VBGlobals.Globals.push_back(getAddrOfVBTable(**I, RD, Linkage));
1761   }
1762 
1763   return VBGlobals;
1764 }
1765 
1766 llvm::Function *MicrosoftCXXABI::EmitVirtualMemPtrThunk(
1767     const CXXMethodDecl *MD,
1768     const MicrosoftVTableContext::MethodVFTableLocation &ML) {
1769   assert(!isa<CXXConstructorDecl>(MD) && !isa<CXXDestructorDecl>(MD) &&
1770          "can't form pointers to ctors or virtual dtors");
1771 
1772   // Calculate the mangled name.
1773   SmallString<256> ThunkName;
1774   llvm::raw_svector_ostream Out(ThunkName);
1775   getMangleContext().mangleVirtualMemPtrThunk(MD, Out);
1776   Out.flush();
1777 
1778   // If the thunk has been generated previously, just return it.
1779   if (llvm::GlobalValue *GV = CGM.getModule().getNamedValue(ThunkName))
1780     return cast<llvm::Function>(GV);
1781 
1782   // Create the llvm::Function.
1783   const CGFunctionInfo &FnInfo = CGM.getTypes().arrangeMSMemberPointerThunk(MD);
1784   llvm::FunctionType *ThunkTy = CGM.getTypes().GetFunctionType(FnInfo);
1785   llvm::Function *ThunkFn =
1786       llvm::Function::Create(ThunkTy, llvm::Function::ExternalLinkage,
1787                              ThunkName.str(), &CGM.getModule());
1788   assert(ThunkFn->getName() == ThunkName && "name was uniqued!");
1789 
1790   ThunkFn->setLinkage(MD->isExternallyVisible()
1791                           ? llvm::GlobalValue::LinkOnceODRLinkage
1792                           : llvm::GlobalValue::InternalLinkage);
1793   if (MD->isExternallyVisible())
1794     ThunkFn->setComdat(CGM.getModule().getOrInsertComdat(ThunkFn->getName()));
1795 
1796   CGM.SetLLVMFunctionAttributes(MD, FnInfo, ThunkFn);
1797   CGM.SetLLVMFunctionAttributesForDefinition(MD, ThunkFn);
1798 
1799   // Add the "thunk" attribute so that LLVM knows that the return type is
1800   // meaningless. These thunks can be used to call functions with differing
1801   // return types, and the caller is required to cast the prototype
1802   // appropriately to extract the correct value.
1803   ThunkFn->addFnAttr("thunk");
1804 
1805   // These thunks can be compared, so they are not unnamed.
1806   ThunkFn->setUnnamedAddr(false);
1807 
1808   // Start codegen.
1809   CodeGenFunction CGF(CGM);
1810   CGF.CurGD = GlobalDecl(MD);
1811   CGF.CurFuncIsThunk = true;
1812 
1813   // Build FunctionArgs, but only include the implicit 'this' parameter
1814   // declaration.
1815   FunctionArgList FunctionArgs;
1816   buildThisParam(CGF, FunctionArgs);
1817 
1818   // Start defining the function.
1819   CGF.StartFunction(GlobalDecl(), FnInfo.getReturnType(), ThunkFn, FnInfo,
1820                     FunctionArgs, MD->getLocation(), SourceLocation());
1821   EmitThisParam(CGF);
1822 
1823   // Load the vfptr and then callee from the vftable.  The callee should have
1824   // adjusted 'this' so that the vfptr is at offset zero.
1825   llvm::Value *VTable = CGF.GetVTablePtr(
1826       getThisValue(CGF), ThunkTy->getPointerTo()->getPointerTo());
1827   llvm::Value *VFuncPtr =
1828       CGF.Builder.CreateConstInBoundsGEP1_64(VTable, ML.Index, "vfn");
1829   llvm::Value *Callee = CGF.Builder.CreateLoad(VFuncPtr);
1830 
1831   CGF.EmitMustTailThunk(MD, getThisValue(CGF), Callee);
1832 
1833   return ThunkFn;
1834 }
1835 
1836 void MicrosoftCXXABI::emitVirtualInheritanceTables(const CXXRecordDecl *RD) {
1837   const VBTableGlobals &VBGlobals = enumerateVBTables(RD);
1838   for (unsigned I = 0, E = VBGlobals.VBTables->size(); I != E; ++I) {
1839     const VPtrInfo *VBT = (*VBGlobals.VBTables)[I];
1840     llvm::GlobalVariable *GV = VBGlobals.Globals[I];
1841     if (GV->isDeclaration())
1842       emitVBTableDefinition(*VBT, RD, GV);
1843   }
1844 }
1845 
1846 llvm::GlobalVariable *
1847 MicrosoftCXXABI::getAddrOfVBTable(const VPtrInfo &VBT, const CXXRecordDecl *RD,
1848                                   llvm::GlobalVariable::LinkageTypes Linkage) {
1849   SmallString<256> OutName;
1850   llvm::raw_svector_ostream Out(OutName);
1851   getMangleContext().mangleCXXVBTable(RD, VBT.MangledPath, Out);
1852   Out.flush();
1853   StringRef Name = OutName.str();
1854 
1855   llvm::ArrayType *VBTableType =
1856       llvm::ArrayType::get(CGM.IntTy, 1 + VBT.ReusingBase->getNumVBases());
1857 
1858   assert(!CGM.getModule().getNamedGlobal(Name) &&
1859          "vbtable with this name already exists: mangling bug?");
1860   llvm::GlobalVariable *GV =
1861       CGM.CreateOrReplaceCXXRuntimeVariable(Name, VBTableType, Linkage);
1862   GV->setUnnamedAddr(true);
1863 
1864   if (RD->hasAttr<DLLImportAttr>())
1865     GV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
1866   else if (RD->hasAttr<DLLExportAttr>())
1867     GV->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
1868 
1869   if (!GV->hasExternalLinkage())
1870     emitVBTableDefinition(VBT, RD, GV);
1871 
1872   return GV;
1873 }
1874 
1875 void MicrosoftCXXABI::emitVBTableDefinition(const VPtrInfo &VBT,
1876                                             const CXXRecordDecl *RD,
1877                                             llvm::GlobalVariable *GV) const {
1878   const CXXRecordDecl *ReusingBase = VBT.ReusingBase;
1879 
1880   assert(RD->getNumVBases() && ReusingBase->getNumVBases() &&
1881          "should only emit vbtables for classes with vbtables");
1882 
1883   const ASTRecordLayout &BaseLayout =
1884       getContext().getASTRecordLayout(VBT.BaseWithVPtr);
1885   const ASTRecordLayout &DerivedLayout = getContext().getASTRecordLayout(RD);
1886 
1887   SmallVector<llvm::Constant *, 4> Offsets(1 + ReusingBase->getNumVBases(),
1888                                            nullptr);
1889 
1890   // The offset from ReusingBase's vbptr to itself always leads.
1891   CharUnits VBPtrOffset = BaseLayout.getVBPtrOffset();
1892   Offsets[0] = llvm::ConstantInt::get(CGM.IntTy, -VBPtrOffset.getQuantity());
1893 
1894   MicrosoftVTableContext &Context = CGM.getMicrosoftVTableContext();
1895   for (const auto &I : ReusingBase->vbases()) {
1896     const CXXRecordDecl *VBase = I.getType()->getAsCXXRecordDecl();
1897     CharUnits Offset = DerivedLayout.getVBaseClassOffset(VBase);
1898     assert(!Offset.isNegative());
1899 
1900     // Make it relative to the subobject vbptr.
1901     CharUnits CompleteVBPtrOffset = VBT.NonVirtualOffset + VBPtrOffset;
1902     if (VBT.getVBaseWithVPtr())
1903       CompleteVBPtrOffset +=
1904           DerivedLayout.getVBaseClassOffset(VBT.getVBaseWithVPtr());
1905     Offset -= CompleteVBPtrOffset;
1906 
1907     unsigned VBIndex = Context.getVBTableIndex(ReusingBase, VBase);
1908     assert(Offsets[VBIndex] == nullptr && "The same vbindex seen twice?");
1909     Offsets[VBIndex] = llvm::ConstantInt::get(CGM.IntTy, Offset.getQuantity());
1910   }
1911 
1912   assert(Offsets.size() ==
1913          cast<llvm::ArrayType>(cast<llvm::PointerType>(GV->getType())
1914                                ->getElementType())->getNumElements());
1915   llvm::ArrayType *VBTableType =
1916     llvm::ArrayType::get(CGM.IntTy, Offsets.size());
1917   llvm::Constant *Init = llvm::ConstantArray::get(VBTableType, Offsets);
1918   GV->setInitializer(Init);
1919 }
1920 
1921 llvm::Value *MicrosoftCXXABI::performThisAdjustment(CodeGenFunction &CGF,
1922                                                     llvm::Value *This,
1923                                                     const ThisAdjustment &TA) {
1924   if (TA.isEmpty())
1925     return This;
1926 
1927   llvm::Value *V = CGF.Builder.CreateBitCast(This, CGF.Int8PtrTy);
1928 
1929   if (!TA.Virtual.isEmpty()) {
1930     assert(TA.Virtual.Microsoft.VtordispOffset < 0);
1931     // Adjust the this argument based on the vtordisp value.
1932     llvm::Value *VtorDispPtr =
1933         CGF.Builder.CreateConstGEP1_32(V, TA.Virtual.Microsoft.VtordispOffset);
1934     VtorDispPtr =
1935         CGF.Builder.CreateBitCast(VtorDispPtr, CGF.Int32Ty->getPointerTo());
1936     llvm::Value *VtorDisp = CGF.Builder.CreateLoad(VtorDispPtr, "vtordisp");
1937     V = CGF.Builder.CreateGEP(V, CGF.Builder.CreateNeg(VtorDisp));
1938 
1939     if (TA.Virtual.Microsoft.VBPtrOffset) {
1940       // If the final overrider is defined in a virtual base other than the one
1941       // that holds the vfptr, we have to use a vtordispex thunk which looks up
1942       // the vbtable of the derived class.
1943       assert(TA.Virtual.Microsoft.VBPtrOffset > 0);
1944       assert(TA.Virtual.Microsoft.VBOffsetOffset >= 0);
1945       llvm::Value *VBPtr;
1946       llvm::Value *VBaseOffset =
1947           GetVBaseOffsetFromVBPtr(CGF, V, -TA.Virtual.Microsoft.VBPtrOffset,
1948                                   TA.Virtual.Microsoft.VBOffsetOffset, &VBPtr);
1949       V = CGF.Builder.CreateInBoundsGEP(VBPtr, VBaseOffset);
1950     }
1951   }
1952 
1953   if (TA.NonVirtual) {
1954     // Non-virtual adjustment might result in a pointer outside the allocated
1955     // object, e.g. if the final overrider class is laid out after the virtual
1956     // base that declares a method in the most derived class.
1957     V = CGF.Builder.CreateConstGEP1_32(V, TA.NonVirtual);
1958   }
1959 
1960   // Don't need to bitcast back, the call CodeGen will handle this.
1961   return V;
1962 }
1963 
1964 llvm::Value *
1965 MicrosoftCXXABI::performReturnAdjustment(CodeGenFunction &CGF, llvm::Value *Ret,
1966                                          const ReturnAdjustment &RA) {
1967   if (RA.isEmpty())
1968     return Ret;
1969 
1970   llvm::Value *V = CGF.Builder.CreateBitCast(Ret, CGF.Int8PtrTy);
1971 
1972   if (RA.Virtual.Microsoft.VBIndex) {
1973     assert(RA.Virtual.Microsoft.VBIndex > 0);
1974     const ASTContext &Context = getContext();
1975     int32_t IntSize = Context.getTypeSizeInChars(Context.IntTy).getQuantity();
1976     llvm::Value *VBPtr;
1977     llvm::Value *VBaseOffset =
1978         GetVBaseOffsetFromVBPtr(CGF, V, RA.Virtual.Microsoft.VBPtrOffset,
1979                                 IntSize * RA.Virtual.Microsoft.VBIndex, &VBPtr);
1980     V = CGF.Builder.CreateInBoundsGEP(VBPtr, VBaseOffset);
1981   }
1982 
1983   if (RA.NonVirtual)
1984     V = CGF.Builder.CreateConstInBoundsGEP1_32(CGF.Int8Ty, V, RA.NonVirtual);
1985 
1986   // Cast back to the original type.
1987   return CGF.Builder.CreateBitCast(V, Ret->getType());
1988 }
1989 
1990 bool MicrosoftCXXABI::requiresArrayCookie(const CXXDeleteExpr *expr,
1991                                    QualType elementType) {
1992   // Microsoft seems to completely ignore the possibility of a
1993   // two-argument usual deallocation function.
1994   return elementType.isDestructedType();
1995 }
1996 
1997 bool MicrosoftCXXABI::requiresArrayCookie(const CXXNewExpr *expr) {
1998   // Microsoft seems to completely ignore the possibility of a
1999   // two-argument usual deallocation function.
2000   return expr->getAllocatedType().isDestructedType();
2001 }
2002 
2003 CharUnits MicrosoftCXXABI::getArrayCookieSizeImpl(QualType type) {
2004   // The array cookie is always a size_t; we then pad that out to the
2005   // alignment of the element type.
2006   ASTContext &Ctx = getContext();
2007   return std::max(Ctx.getTypeSizeInChars(Ctx.getSizeType()),
2008                   Ctx.getTypeAlignInChars(type));
2009 }
2010 
2011 llvm::Value *MicrosoftCXXABI::readArrayCookieImpl(CodeGenFunction &CGF,
2012                                                   llvm::Value *allocPtr,
2013                                                   CharUnits cookieSize) {
2014   unsigned AS = allocPtr->getType()->getPointerAddressSpace();
2015   llvm::Value *numElementsPtr =
2016     CGF.Builder.CreateBitCast(allocPtr, CGF.SizeTy->getPointerTo(AS));
2017   return CGF.Builder.CreateLoad(numElementsPtr);
2018 }
2019 
2020 llvm::Value* MicrosoftCXXABI::InitializeArrayCookie(CodeGenFunction &CGF,
2021                                                     llvm::Value *newPtr,
2022                                                     llvm::Value *numElements,
2023                                                     const CXXNewExpr *expr,
2024                                                     QualType elementType) {
2025   assert(requiresArrayCookie(expr));
2026 
2027   // The size of the cookie.
2028   CharUnits cookieSize = getArrayCookieSizeImpl(elementType);
2029 
2030   // Compute an offset to the cookie.
2031   llvm::Value *cookiePtr = newPtr;
2032 
2033   // Write the number of elements into the appropriate slot.
2034   unsigned AS = newPtr->getType()->getPointerAddressSpace();
2035   llvm::Value *numElementsPtr
2036     = CGF.Builder.CreateBitCast(cookiePtr, CGF.SizeTy->getPointerTo(AS));
2037   CGF.Builder.CreateStore(numElements, numElementsPtr);
2038 
2039   // Finally, compute a pointer to the actual data buffer by skipping
2040   // over the cookie completely.
2041   return CGF.Builder.CreateConstInBoundsGEP1_64(newPtr,
2042                                                 cookieSize.getQuantity());
2043 }
2044 
2045 static void emitGlobalDtorWithTLRegDtor(CodeGenFunction &CGF, const VarDecl &VD,
2046                                         llvm::Constant *Dtor,
2047                                         llvm::Constant *Addr) {
2048   // Create a function which calls the destructor.
2049   llvm::Constant *DtorStub = CGF.createAtExitStub(VD, Dtor, Addr);
2050 
2051   // extern "C" int __tlregdtor(void (*f)(void));
2052   llvm::FunctionType *TLRegDtorTy = llvm::FunctionType::get(
2053       CGF.IntTy, DtorStub->getType(), /*IsVarArg=*/false);
2054 
2055   llvm::Constant *TLRegDtor =
2056       CGF.CGM.CreateRuntimeFunction(TLRegDtorTy, "__tlregdtor");
2057   if (llvm::Function *TLRegDtorFn = dyn_cast<llvm::Function>(TLRegDtor))
2058     TLRegDtorFn->setDoesNotThrow();
2059 
2060   CGF.EmitNounwindRuntimeCall(TLRegDtor, DtorStub);
2061 }
2062 
2063 void MicrosoftCXXABI::registerGlobalDtor(CodeGenFunction &CGF, const VarDecl &D,
2064                                          llvm::Constant *Dtor,
2065                                          llvm::Constant *Addr) {
2066   if (D.getTLSKind())
2067     return emitGlobalDtorWithTLRegDtor(CGF, D, Dtor, Addr);
2068 
2069   // The default behavior is to use atexit.
2070   CGF.registerGlobalDtorWithAtExit(D, Dtor, Addr);
2071 }
2072 
2073 void MicrosoftCXXABI::EmitThreadLocalInitFuncs(
2074     CodeGenModule &CGM,
2075     ArrayRef<std::pair<const VarDecl *, llvm::GlobalVariable *>>
2076         CXXThreadLocals,
2077     ArrayRef<llvm::Function *> CXXThreadLocalInits,
2078     ArrayRef<llvm::GlobalVariable *> CXXThreadLocalInitVars) {
2079   // This will create a GV in the .CRT$XDU section.  It will point to our
2080   // initialization function.  The CRT will call all of these function
2081   // pointers at start-up time and, eventually, at thread-creation time.
2082   auto AddToXDU = [&CGM](llvm::Function *InitFunc) {
2083     llvm::GlobalVariable *InitFuncPtr = new llvm::GlobalVariable(
2084         CGM.getModule(), InitFunc->getType(), /*IsConstant=*/true,
2085         llvm::GlobalVariable::InternalLinkage, InitFunc,
2086         Twine(InitFunc->getName(), "$initializer$"));
2087     InitFuncPtr->setSection(".CRT$XDU");
2088     // This variable has discardable linkage, we have to add it to @llvm.used to
2089     // ensure it won't get discarded.
2090     CGM.addUsedGlobal(InitFuncPtr);
2091     return InitFuncPtr;
2092   };
2093 
2094   std::vector<llvm::Function *> NonComdatInits;
2095   for (size_t I = 0, E = CXXThreadLocalInitVars.size(); I != E; ++I) {
2096     llvm::GlobalVariable *GV = CXXThreadLocalInitVars[I];
2097     llvm::Function *F = CXXThreadLocalInits[I];
2098 
2099     // If the GV is already in a comdat group, then we have to join it.
2100     if (llvm::Comdat *C = GV->getComdat())
2101       AddToXDU(F)->setComdat(C);
2102     else
2103       NonComdatInits.push_back(F);
2104   }
2105 
2106   if (!NonComdatInits.empty()) {
2107     llvm::FunctionType *FTy =
2108         llvm::FunctionType::get(CGM.VoidTy, /*isVarArg=*/false);
2109     llvm::Function *InitFunc = CGM.CreateGlobalInitOrDestructFunction(
2110         FTy, "__tls_init", SourceLocation(),
2111         /*TLS=*/true);
2112     CodeGenFunction(CGM).GenerateCXXGlobalInitFunc(InitFunc, NonComdatInits);
2113 
2114     AddToXDU(InitFunc);
2115   }
2116 }
2117 
2118 LValue MicrosoftCXXABI::EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF,
2119                                                      const VarDecl *VD,
2120                                                      QualType LValType) {
2121   CGF.CGM.ErrorUnsupported(VD, "thread wrappers");
2122   return LValue();
2123 }
2124 
2125 static llvm::GlobalVariable *getInitThreadEpochPtr(CodeGenModule &CGM) {
2126   StringRef VarName("_Init_thread_epoch");
2127   if (auto *GV = CGM.getModule().getNamedGlobal(VarName))
2128     return GV;
2129   auto *GV = new llvm::GlobalVariable(
2130       CGM.getModule(), CGM.IntTy,
2131       /*Constant=*/false, llvm::GlobalVariable::ExternalLinkage,
2132       /*Initializer=*/nullptr, VarName,
2133       /*InsertBefore=*/nullptr, llvm::GlobalVariable::GeneralDynamicTLSModel);
2134   GV->setAlignment(CGM.getTarget().getIntAlign() / 8);
2135   return GV;
2136 }
2137 
2138 static llvm::Constant *getInitThreadHeaderFn(CodeGenModule &CGM) {
2139   llvm::FunctionType *FTy =
2140       llvm::FunctionType::get(llvm::Type::getVoidTy(CGM.getLLVMContext()),
2141                               CGM.IntTy->getPointerTo(), /*isVarArg=*/false);
2142   return CGM.CreateRuntimeFunction(
2143       FTy, "_Init_thread_header",
2144       llvm::AttributeSet::get(CGM.getLLVMContext(),
2145                               llvm::AttributeSet::FunctionIndex,
2146                               llvm::Attribute::NoUnwind));
2147 }
2148 
2149 static llvm::Constant *getInitThreadFooterFn(CodeGenModule &CGM) {
2150   llvm::FunctionType *FTy =
2151       llvm::FunctionType::get(llvm::Type::getVoidTy(CGM.getLLVMContext()),
2152                               CGM.IntTy->getPointerTo(), /*isVarArg=*/false);
2153   return CGM.CreateRuntimeFunction(
2154       FTy, "_Init_thread_footer",
2155       llvm::AttributeSet::get(CGM.getLLVMContext(),
2156                               llvm::AttributeSet::FunctionIndex,
2157                               llvm::Attribute::NoUnwind));
2158 }
2159 
2160 static llvm::Constant *getInitThreadAbortFn(CodeGenModule &CGM) {
2161   llvm::FunctionType *FTy =
2162       llvm::FunctionType::get(llvm::Type::getVoidTy(CGM.getLLVMContext()),
2163                               CGM.IntTy->getPointerTo(), /*isVarArg=*/false);
2164   return CGM.CreateRuntimeFunction(
2165       FTy, "_Init_thread_abort",
2166       llvm::AttributeSet::get(CGM.getLLVMContext(),
2167                               llvm::AttributeSet::FunctionIndex,
2168                               llvm::Attribute::NoUnwind));
2169 }
2170 
2171 namespace {
2172 struct ResetGuardBit : EHScopeStack::Cleanup {
2173   llvm::GlobalVariable *Guard;
2174   unsigned GuardNum;
2175   ResetGuardBit(llvm::GlobalVariable *Guard, unsigned GuardNum)
2176       : Guard(Guard), GuardNum(GuardNum) {}
2177 
2178   void Emit(CodeGenFunction &CGF, Flags flags) override {
2179     // Reset the bit in the mask so that the static variable may be
2180     // reinitialized.
2181     CGBuilderTy &Builder = CGF.Builder;
2182     llvm::LoadInst *LI = Builder.CreateLoad(Guard);
2183     llvm::ConstantInt *Mask =
2184         llvm::ConstantInt::get(CGF.IntTy, ~(1U << GuardNum));
2185     Builder.CreateStore(Builder.CreateAnd(LI, Mask), Guard);
2186   }
2187 };
2188 
2189 struct CallInitThreadAbort : EHScopeStack::Cleanup {
2190   llvm::GlobalVariable *Guard;
2191   CallInitThreadAbort(llvm::GlobalVariable *Guard) : Guard(Guard) {}
2192 
2193   void Emit(CodeGenFunction &CGF, Flags flags) override {
2194     // Calling _Init_thread_abort will reset the guard's state.
2195     CGF.EmitNounwindRuntimeCall(getInitThreadAbortFn(CGF.CGM), Guard);
2196   }
2197 };
2198 } // namespace
2199 
2200 void MicrosoftCXXABI::EmitGuardedInit(CodeGenFunction &CGF, const VarDecl &D,
2201                                       llvm::GlobalVariable *GV,
2202                                       bool PerformInit) {
2203   // MSVC only uses guards for static locals.
2204   if (!D.isStaticLocal()) {
2205     assert(GV->hasWeakLinkage() || GV->hasLinkOnceLinkage());
2206     // GlobalOpt is allowed to discard the initializer, so use linkonce_odr.
2207     llvm::Function *F = CGF.CurFn;
2208     F->setLinkage(llvm::GlobalValue::LinkOnceODRLinkage);
2209     F->setComdat(CGM.getModule().getOrInsertComdat(F->getName()));
2210     CGF.EmitCXXGlobalVarDeclInit(D, GV, PerformInit);
2211     return;
2212   }
2213 
2214   bool ThreadlocalStatic = D.getTLSKind();
2215   bool ThreadsafeStatic = getContext().getLangOpts().ThreadsafeStatics;
2216 
2217   // Thread-safe static variables which aren't thread-specific have a
2218   // per-variable guard.
2219   bool HasPerVariableGuard = ThreadsafeStatic && !ThreadlocalStatic;
2220 
2221   CGBuilderTy &Builder = CGF.Builder;
2222   llvm::IntegerType *GuardTy = CGF.Int32Ty;
2223   llvm::ConstantInt *Zero = llvm::ConstantInt::get(GuardTy, 0);
2224 
2225   // Get the guard variable for this function if we have one already.
2226   GuardInfo *GI = nullptr;
2227   if (ThreadlocalStatic)
2228     GI = &ThreadLocalGuardVariableMap[D.getDeclContext()];
2229   else if (!ThreadsafeStatic)
2230     GI = &GuardVariableMap[D.getDeclContext()];
2231 
2232   llvm::GlobalVariable *GuardVar = GI ? GI->Guard : nullptr;
2233   unsigned GuardNum;
2234   if (D.isExternallyVisible()) {
2235     // Externally visible variables have to be numbered in Sema to properly
2236     // handle unreachable VarDecls.
2237     GuardNum = getContext().getStaticLocalNumber(&D);
2238     assert(GuardNum > 0);
2239     GuardNum--;
2240   } else if (HasPerVariableGuard) {
2241     GuardNum = ThreadSafeGuardNumMap[D.getDeclContext()]++;
2242   } else {
2243     // Non-externally visible variables are numbered here in CodeGen.
2244     GuardNum = GI->BitIndex++;
2245   }
2246 
2247   if (!HasPerVariableGuard && GuardNum >= 32) {
2248     if (D.isExternallyVisible())
2249       ErrorUnsupportedABI(CGF, "more than 32 guarded initializations");
2250     GuardNum %= 32;
2251     GuardVar = nullptr;
2252   }
2253 
2254   if (!GuardVar) {
2255     // Mangle the name for the guard.
2256     SmallString<256> GuardName;
2257     {
2258       llvm::raw_svector_ostream Out(GuardName);
2259       if (HasPerVariableGuard)
2260         getMangleContext().mangleThreadSafeStaticGuardVariable(&D, GuardNum,
2261                                                                Out);
2262       else
2263         getMangleContext().mangleStaticGuardVariable(&D, Out);
2264       Out.flush();
2265     }
2266 
2267     // Create the guard variable with a zero-initializer. Just absorb linkage,
2268     // visibility and dll storage class from the guarded variable.
2269     GuardVar =
2270         new llvm::GlobalVariable(CGM.getModule(), GuardTy, /*isConstant=*/false,
2271                                  GV->getLinkage(), Zero, GuardName.str());
2272     GuardVar->setVisibility(GV->getVisibility());
2273     GuardVar->setDLLStorageClass(GV->getDLLStorageClass());
2274     if (GuardVar->isWeakForLinker())
2275       GuardVar->setComdat(
2276           CGM.getModule().getOrInsertComdat(GuardVar->getName()));
2277     if (D.getTLSKind())
2278       GuardVar->setThreadLocal(true);
2279     if (GI && !HasPerVariableGuard)
2280       GI->Guard = GuardVar;
2281   }
2282 
2283   assert(GuardVar->getLinkage() == GV->getLinkage() &&
2284          "static local from the same function had different linkage");
2285 
2286   if (!HasPerVariableGuard) {
2287     // Pseudo code for the test:
2288     // if (!(GuardVar & MyGuardBit)) {
2289     //   GuardVar |= MyGuardBit;
2290     //   ... initialize the object ...;
2291     // }
2292 
2293     // Test our bit from the guard variable.
2294     llvm::ConstantInt *Bit = llvm::ConstantInt::get(GuardTy, 1U << GuardNum);
2295     llvm::LoadInst *LI = Builder.CreateLoad(GuardVar);
2296     llvm::Value *IsInitialized =
2297         Builder.CreateICmpNE(Builder.CreateAnd(LI, Bit), Zero);
2298     llvm::BasicBlock *InitBlock = CGF.createBasicBlock("init");
2299     llvm::BasicBlock *EndBlock = CGF.createBasicBlock("init.end");
2300     Builder.CreateCondBr(IsInitialized, EndBlock, InitBlock);
2301 
2302     // Set our bit in the guard variable and emit the initializer and add a global
2303     // destructor if appropriate.
2304     CGF.EmitBlock(InitBlock);
2305     Builder.CreateStore(Builder.CreateOr(LI, Bit), GuardVar);
2306     CGF.EHStack.pushCleanup<ResetGuardBit>(EHCleanup, GuardVar, GuardNum);
2307     CGF.EmitCXXGlobalVarDeclInit(D, GV, PerformInit);
2308     CGF.PopCleanupBlock();
2309     Builder.CreateBr(EndBlock);
2310 
2311     // Continue.
2312     CGF.EmitBlock(EndBlock);
2313   } else {
2314     // Pseudo code for the test:
2315     // if (TSS > _Init_thread_epoch) {
2316     //   _Init_thread_header(&TSS);
2317     //   if (TSS == -1) {
2318     //     ... initialize the object ...;
2319     //     _Init_thread_footer(&TSS);
2320     //   }
2321     // }
2322     //
2323     // The algorithm is almost identical to what can be found in the appendix
2324     // found in N2325.
2325 
2326     unsigned IntAlign = CGM.getTarget().getIntAlign() / 8;
2327 
2328     // This BasicBLock determines whether or not we have any work to do.
2329     llvm::LoadInst *FirstGuardLoad =
2330         Builder.CreateAlignedLoad(GuardVar, IntAlign);
2331     FirstGuardLoad->setOrdering(llvm::AtomicOrdering::Unordered);
2332     llvm::LoadInst *InitThreadEpoch =
2333         Builder.CreateLoad(getInitThreadEpochPtr(CGM));
2334     llvm::Value *IsUninitialized =
2335         Builder.CreateICmpSGT(FirstGuardLoad, InitThreadEpoch);
2336     llvm::BasicBlock *AttemptInitBlock = CGF.createBasicBlock("init.attempt");
2337     llvm::BasicBlock *EndBlock = CGF.createBasicBlock("init.end");
2338     Builder.CreateCondBr(IsUninitialized, AttemptInitBlock, EndBlock);
2339 
2340     // This BasicBlock attempts to determine whether or not this thread is
2341     // responsible for doing the initialization.
2342     CGF.EmitBlock(AttemptInitBlock);
2343     CGF.EmitNounwindRuntimeCall(getInitThreadHeaderFn(CGM), GuardVar);
2344     llvm::LoadInst *SecondGuardLoad =
2345         Builder.CreateAlignedLoad(GuardVar, IntAlign);
2346     SecondGuardLoad->setOrdering(llvm::AtomicOrdering::Unordered);
2347     llvm::Value *ShouldDoInit =
2348         Builder.CreateICmpEQ(SecondGuardLoad, getAllOnesInt());
2349     llvm::BasicBlock *InitBlock = CGF.createBasicBlock("init");
2350     Builder.CreateCondBr(ShouldDoInit, InitBlock, EndBlock);
2351 
2352     // Ok, we ended up getting selected as the initializing thread.
2353     CGF.EmitBlock(InitBlock);
2354     CGF.EHStack.pushCleanup<CallInitThreadAbort>(EHCleanup, GuardVar);
2355     CGF.EmitCXXGlobalVarDeclInit(D, GV, PerformInit);
2356     CGF.PopCleanupBlock();
2357     CGF.EmitNounwindRuntimeCall(getInitThreadFooterFn(CGM), GuardVar);
2358     Builder.CreateBr(EndBlock);
2359 
2360     CGF.EmitBlock(EndBlock);
2361   }
2362 }
2363 
2364 bool MicrosoftCXXABI::isZeroInitializable(const MemberPointerType *MPT) {
2365   // Null-ness for function memptrs only depends on the first field, which is
2366   // the function pointer.  The rest don't matter, so we can zero initialize.
2367   if (MPT->isMemberFunctionPointer())
2368     return true;
2369 
2370   // The virtual base adjustment field is always -1 for null, so if we have one
2371   // we can't zero initialize.  The field offset is sometimes also -1 if 0 is a
2372   // valid field offset.
2373   const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl();
2374   MSInheritanceAttr::Spelling Inheritance = RD->getMSInheritanceModel();
2375   return (!MSInheritanceAttr::hasVBTableOffsetField(Inheritance) &&
2376           RD->nullFieldOffsetIsZero());
2377 }
2378 
2379 llvm::Type *
2380 MicrosoftCXXABI::ConvertMemberPointerType(const MemberPointerType *MPT) {
2381   const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl();
2382   MSInheritanceAttr::Spelling Inheritance = RD->getMSInheritanceModel();
2383   llvm::SmallVector<llvm::Type *, 4> fields;
2384   if (MPT->isMemberFunctionPointer())
2385     fields.push_back(CGM.VoidPtrTy);  // FunctionPointerOrVirtualThunk
2386   else
2387     fields.push_back(CGM.IntTy);  // FieldOffset
2388 
2389   if (MSInheritanceAttr::hasNVOffsetField(MPT->isMemberFunctionPointer(),
2390                                           Inheritance))
2391     fields.push_back(CGM.IntTy);
2392   if (MSInheritanceAttr::hasVBPtrOffsetField(Inheritance))
2393     fields.push_back(CGM.IntTy);
2394   if (MSInheritanceAttr::hasVBTableOffsetField(Inheritance))
2395     fields.push_back(CGM.IntTy);  // VirtualBaseAdjustmentOffset
2396 
2397   if (fields.size() == 1)
2398     return fields[0];
2399   return llvm::StructType::get(CGM.getLLVMContext(), fields);
2400 }
2401 
2402 void MicrosoftCXXABI::
2403 GetNullMemberPointerFields(const MemberPointerType *MPT,
2404                            llvm::SmallVectorImpl<llvm::Constant *> &fields) {
2405   assert(fields.empty());
2406   const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl();
2407   MSInheritanceAttr::Spelling Inheritance = RD->getMSInheritanceModel();
2408   if (MPT->isMemberFunctionPointer()) {
2409     // FunctionPointerOrVirtualThunk
2410     fields.push_back(llvm::Constant::getNullValue(CGM.VoidPtrTy));
2411   } else {
2412     if (RD->nullFieldOffsetIsZero())
2413       fields.push_back(getZeroInt());  // FieldOffset
2414     else
2415       fields.push_back(getAllOnesInt());  // FieldOffset
2416   }
2417 
2418   if (MSInheritanceAttr::hasNVOffsetField(MPT->isMemberFunctionPointer(),
2419                                           Inheritance))
2420     fields.push_back(getZeroInt());
2421   if (MSInheritanceAttr::hasVBPtrOffsetField(Inheritance))
2422     fields.push_back(getZeroInt());
2423   if (MSInheritanceAttr::hasVBTableOffsetField(Inheritance))
2424     fields.push_back(getAllOnesInt());
2425 }
2426 
2427 llvm::Constant *
2428 MicrosoftCXXABI::EmitNullMemberPointer(const MemberPointerType *MPT) {
2429   llvm::SmallVector<llvm::Constant *, 4> fields;
2430   GetNullMemberPointerFields(MPT, fields);
2431   if (fields.size() == 1)
2432     return fields[0];
2433   llvm::Constant *Res = llvm::ConstantStruct::getAnon(fields);
2434   assert(Res->getType() == ConvertMemberPointerType(MPT));
2435   return Res;
2436 }
2437 
2438 llvm::Constant *
2439 MicrosoftCXXABI::EmitFullMemberPointer(llvm::Constant *FirstField,
2440                                        bool IsMemberFunction,
2441                                        const CXXRecordDecl *RD,
2442                                        CharUnits NonVirtualBaseAdjustment,
2443                                        unsigned VBTableIndex) {
2444   MSInheritanceAttr::Spelling Inheritance = RD->getMSInheritanceModel();
2445 
2446   // Single inheritance class member pointer are represented as scalars instead
2447   // of aggregates.
2448   if (MSInheritanceAttr::hasOnlyOneField(IsMemberFunction, Inheritance))
2449     return FirstField;
2450 
2451   llvm::SmallVector<llvm::Constant *, 4> fields;
2452   fields.push_back(FirstField);
2453 
2454   if (MSInheritanceAttr::hasNVOffsetField(IsMemberFunction, Inheritance))
2455     fields.push_back(llvm::ConstantInt::get(
2456       CGM.IntTy, NonVirtualBaseAdjustment.getQuantity()));
2457 
2458   if (MSInheritanceAttr::hasVBPtrOffsetField(Inheritance)) {
2459     CharUnits Offs = CharUnits::Zero();
2460     if (VBTableIndex && RD->getNumVBases())
2461       Offs = getContext().getASTRecordLayout(RD).getVBPtrOffset();
2462     fields.push_back(llvm::ConstantInt::get(CGM.IntTy, Offs.getQuantity()));
2463   }
2464 
2465   // The rest of the fields are adjusted by conversions to a more derived class.
2466   if (MSInheritanceAttr::hasVBTableOffsetField(Inheritance))
2467     fields.push_back(llvm::ConstantInt::get(CGM.IntTy, VBTableIndex));
2468 
2469   return llvm::ConstantStruct::getAnon(fields);
2470 }
2471 
2472 llvm::Constant *
2473 MicrosoftCXXABI::EmitMemberDataPointer(const MemberPointerType *MPT,
2474                                        CharUnits offset) {
2475   const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl();
2476   llvm::Constant *FirstField =
2477     llvm::ConstantInt::get(CGM.IntTy, offset.getQuantity());
2478   return EmitFullMemberPointer(FirstField, /*IsMemberFunction=*/false, RD,
2479                                CharUnits::Zero(), /*VBTableIndex=*/0);
2480 }
2481 
2482 llvm::Constant *MicrosoftCXXABI::EmitMemberPointer(const CXXMethodDecl *MD) {
2483   return BuildMemberPointer(MD->getParent(), MD, CharUnits::Zero());
2484 }
2485 
2486 llvm::Constant *MicrosoftCXXABI::EmitMemberPointer(const APValue &MP,
2487                                                    QualType MPType) {
2488   const MemberPointerType *MPT = MPType->castAs<MemberPointerType>();
2489   const ValueDecl *MPD = MP.getMemberPointerDecl();
2490   if (!MPD)
2491     return EmitNullMemberPointer(MPT);
2492 
2493   CharUnits ThisAdjustment = getMemberPointerPathAdjustment(MP);
2494 
2495   // FIXME PR15713: Support virtual inheritance paths.
2496 
2497   if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(MPD))
2498     return BuildMemberPointer(MPT->getMostRecentCXXRecordDecl(), MD,
2499                               ThisAdjustment);
2500 
2501   CharUnits FieldOffset =
2502     getContext().toCharUnitsFromBits(getContext().getFieldOffset(MPD));
2503   return EmitMemberDataPointer(MPT, ThisAdjustment + FieldOffset);
2504 }
2505 
2506 llvm::Constant *
2507 MicrosoftCXXABI::BuildMemberPointer(const CXXRecordDecl *RD,
2508                                     const CXXMethodDecl *MD,
2509                                     CharUnits NonVirtualBaseAdjustment) {
2510   assert(MD->isInstance() && "Member function must not be static!");
2511   MD = MD->getCanonicalDecl();
2512   RD = RD->getMostRecentDecl();
2513   CodeGenTypes &Types = CGM.getTypes();
2514 
2515   unsigned VBTableIndex = 0;
2516   llvm::Constant *FirstField;
2517   const FunctionProtoType *FPT = MD->getType()->castAs<FunctionProtoType>();
2518   if (!MD->isVirtual()) {
2519     llvm::Type *Ty;
2520     // Check whether the function has a computable LLVM signature.
2521     if (Types.isFuncTypeConvertible(FPT)) {
2522       // The function has a computable LLVM signature; use the correct type.
2523       Ty = Types.GetFunctionType(Types.arrangeCXXMethodDeclaration(MD));
2524     } else {
2525       // Use an arbitrary non-function type to tell GetAddrOfFunction that the
2526       // function type is incomplete.
2527       Ty = CGM.PtrDiffTy;
2528     }
2529     FirstField = CGM.GetAddrOfFunction(MD, Ty);
2530     FirstField = llvm::ConstantExpr::getBitCast(FirstField, CGM.VoidPtrTy);
2531   } else {
2532     auto &VTableContext = CGM.getMicrosoftVTableContext();
2533     MicrosoftVTableContext::MethodVFTableLocation ML =
2534         VTableContext.getMethodVFTableLocation(MD);
2535     llvm::Function *Thunk = EmitVirtualMemPtrThunk(MD, ML);
2536     FirstField = llvm::ConstantExpr::getBitCast(Thunk, CGM.VoidPtrTy);
2537     // Include the vfptr adjustment if the method is in a non-primary vftable.
2538     NonVirtualBaseAdjustment += ML.VFPtrOffset;
2539     if (ML.VBase)
2540       VBTableIndex = VTableContext.getVBTableIndex(RD, ML.VBase) * 4;
2541   }
2542 
2543   // The rest of the fields are common with data member pointers.
2544   return EmitFullMemberPointer(FirstField, /*IsMemberFunction=*/true, RD,
2545                                NonVirtualBaseAdjustment, VBTableIndex);
2546 }
2547 
2548 /// Member pointers are the same if they're either bitwise identical *or* both
2549 /// null.  Null-ness for function members is determined by the first field,
2550 /// while for data member pointers we must compare all fields.
2551 llvm::Value *
2552 MicrosoftCXXABI::EmitMemberPointerComparison(CodeGenFunction &CGF,
2553                                              llvm::Value *L,
2554                                              llvm::Value *R,
2555                                              const MemberPointerType *MPT,
2556                                              bool Inequality) {
2557   CGBuilderTy &Builder = CGF.Builder;
2558 
2559   // Handle != comparisons by switching the sense of all boolean operations.
2560   llvm::ICmpInst::Predicate Eq;
2561   llvm::Instruction::BinaryOps And, Or;
2562   if (Inequality) {
2563     Eq = llvm::ICmpInst::ICMP_NE;
2564     And = llvm::Instruction::Or;
2565     Or = llvm::Instruction::And;
2566   } else {
2567     Eq = llvm::ICmpInst::ICMP_EQ;
2568     And = llvm::Instruction::And;
2569     Or = llvm::Instruction::Or;
2570   }
2571 
2572   // If this is a single field member pointer (single inheritance), this is a
2573   // single icmp.
2574   const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl();
2575   MSInheritanceAttr::Spelling Inheritance = RD->getMSInheritanceModel();
2576   if (MSInheritanceAttr::hasOnlyOneField(MPT->isMemberFunctionPointer(),
2577                                          Inheritance))
2578     return Builder.CreateICmp(Eq, L, R);
2579 
2580   // Compare the first field.
2581   llvm::Value *L0 = Builder.CreateExtractValue(L, 0, "lhs.0");
2582   llvm::Value *R0 = Builder.CreateExtractValue(R, 0, "rhs.0");
2583   llvm::Value *Cmp0 = Builder.CreateICmp(Eq, L0, R0, "memptr.cmp.first");
2584 
2585   // Compare everything other than the first field.
2586   llvm::Value *Res = nullptr;
2587   llvm::StructType *LType = cast<llvm::StructType>(L->getType());
2588   for (unsigned I = 1, E = LType->getNumElements(); I != E; ++I) {
2589     llvm::Value *LF = Builder.CreateExtractValue(L, I);
2590     llvm::Value *RF = Builder.CreateExtractValue(R, I);
2591     llvm::Value *Cmp = Builder.CreateICmp(Eq, LF, RF, "memptr.cmp.rest");
2592     if (Res)
2593       Res = Builder.CreateBinOp(And, Res, Cmp);
2594     else
2595       Res = Cmp;
2596   }
2597 
2598   // Check if the first field is 0 if this is a function pointer.
2599   if (MPT->isMemberFunctionPointer()) {
2600     // (l1 == r1 && ...) || l0 == 0
2601     llvm::Value *Zero = llvm::Constant::getNullValue(L0->getType());
2602     llvm::Value *IsZero = Builder.CreateICmp(Eq, L0, Zero, "memptr.cmp.iszero");
2603     Res = Builder.CreateBinOp(Or, Res, IsZero);
2604   }
2605 
2606   // Combine the comparison of the first field, which must always be true for
2607   // this comparison to succeeed.
2608   return Builder.CreateBinOp(And, Res, Cmp0, "memptr.cmp");
2609 }
2610 
2611 llvm::Value *
2612 MicrosoftCXXABI::EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
2613                                             llvm::Value *MemPtr,
2614                                             const MemberPointerType *MPT) {
2615   CGBuilderTy &Builder = CGF.Builder;
2616   llvm::SmallVector<llvm::Constant *, 4> fields;
2617   // We only need one field for member functions.
2618   if (MPT->isMemberFunctionPointer())
2619     fields.push_back(llvm::Constant::getNullValue(CGM.VoidPtrTy));
2620   else
2621     GetNullMemberPointerFields(MPT, fields);
2622   assert(!fields.empty());
2623   llvm::Value *FirstField = MemPtr;
2624   if (MemPtr->getType()->isStructTy())
2625     FirstField = Builder.CreateExtractValue(MemPtr, 0);
2626   llvm::Value *Res = Builder.CreateICmpNE(FirstField, fields[0], "memptr.cmp0");
2627 
2628   // For function member pointers, we only need to test the function pointer
2629   // field.  The other fields if any can be garbage.
2630   if (MPT->isMemberFunctionPointer())
2631     return Res;
2632 
2633   // Otherwise, emit a series of compares and combine the results.
2634   for (int I = 1, E = fields.size(); I < E; ++I) {
2635     llvm::Value *Field = Builder.CreateExtractValue(MemPtr, I);
2636     llvm::Value *Next = Builder.CreateICmpNE(Field, fields[I], "memptr.cmp");
2637     Res = Builder.CreateOr(Res, Next, "memptr.tobool");
2638   }
2639   return Res;
2640 }
2641 
2642 bool MicrosoftCXXABI::MemberPointerConstantIsNull(const MemberPointerType *MPT,
2643                                                   llvm::Constant *Val) {
2644   // Function pointers are null if the pointer in the first field is null.
2645   if (MPT->isMemberFunctionPointer()) {
2646     llvm::Constant *FirstField = Val->getType()->isStructTy() ?
2647       Val->getAggregateElement(0U) : Val;
2648     return FirstField->isNullValue();
2649   }
2650 
2651   // If it's not a function pointer and it's zero initializable, we can easily
2652   // check zero.
2653   if (isZeroInitializable(MPT) && Val->isNullValue())
2654     return true;
2655 
2656   // Otherwise, break down all the fields for comparison.  Hopefully these
2657   // little Constants are reused, while a big null struct might not be.
2658   llvm::SmallVector<llvm::Constant *, 4> Fields;
2659   GetNullMemberPointerFields(MPT, Fields);
2660   if (Fields.size() == 1) {
2661     assert(Val->getType()->isIntegerTy());
2662     return Val == Fields[0];
2663   }
2664 
2665   unsigned I, E;
2666   for (I = 0, E = Fields.size(); I != E; ++I) {
2667     if (Val->getAggregateElement(I) != Fields[I])
2668       break;
2669   }
2670   return I == E;
2671 }
2672 
2673 llvm::Value *
2674 MicrosoftCXXABI::GetVBaseOffsetFromVBPtr(CodeGenFunction &CGF,
2675                                          llvm::Value *This,
2676                                          llvm::Value *VBPtrOffset,
2677                                          llvm::Value *VBTableOffset,
2678                                          llvm::Value **VBPtrOut) {
2679   CGBuilderTy &Builder = CGF.Builder;
2680   // Load the vbtable pointer from the vbptr in the instance.
2681   This = Builder.CreateBitCast(This, CGM.Int8PtrTy);
2682   llvm::Value *VBPtr =
2683     Builder.CreateInBoundsGEP(This, VBPtrOffset, "vbptr");
2684   if (VBPtrOut) *VBPtrOut = VBPtr;
2685   VBPtr = Builder.CreateBitCast(VBPtr,
2686                                 CGM.Int32Ty->getPointerTo(0)->getPointerTo(0));
2687   llvm::Value *VBTable = Builder.CreateLoad(VBPtr, "vbtable");
2688 
2689   // Translate from byte offset to table index. It improves analyzability.
2690   llvm::Value *VBTableIndex = Builder.CreateAShr(
2691       VBTableOffset, llvm::ConstantInt::get(VBTableOffset->getType(), 2),
2692       "vbtindex", /*isExact=*/true);
2693 
2694   // Load an i32 offset from the vb-table.
2695   llvm::Value *VBaseOffs = Builder.CreateInBoundsGEP(VBTable, VBTableIndex);
2696   VBaseOffs = Builder.CreateBitCast(VBaseOffs, CGM.Int32Ty->getPointerTo(0));
2697   return Builder.CreateLoad(VBaseOffs, "vbase_offs");
2698 }
2699 
2700 // Returns an adjusted base cast to i8*, since we do more address arithmetic on
2701 // it.
2702 llvm::Value *MicrosoftCXXABI::AdjustVirtualBase(
2703     CodeGenFunction &CGF, const Expr *E, const CXXRecordDecl *RD,
2704     llvm::Value *Base, llvm::Value *VBTableOffset, llvm::Value *VBPtrOffset) {
2705   CGBuilderTy &Builder = CGF.Builder;
2706   Base = Builder.CreateBitCast(Base, CGM.Int8PtrTy);
2707   llvm::BasicBlock *OriginalBB = nullptr;
2708   llvm::BasicBlock *SkipAdjustBB = nullptr;
2709   llvm::BasicBlock *VBaseAdjustBB = nullptr;
2710 
2711   // In the unspecified inheritance model, there might not be a vbtable at all,
2712   // in which case we need to skip the virtual base lookup.  If there is a
2713   // vbtable, the first entry is a no-op entry that gives back the original
2714   // base, so look for a virtual base adjustment offset of zero.
2715   if (VBPtrOffset) {
2716     OriginalBB = Builder.GetInsertBlock();
2717     VBaseAdjustBB = CGF.createBasicBlock("memptr.vadjust");
2718     SkipAdjustBB = CGF.createBasicBlock("memptr.skip_vadjust");
2719     llvm::Value *IsVirtual =
2720       Builder.CreateICmpNE(VBTableOffset, getZeroInt(),
2721                            "memptr.is_vbase");
2722     Builder.CreateCondBr(IsVirtual, VBaseAdjustBB, SkipAdjustBB);
2723     CGF.EmitBlock(VBaseAdjustBB);
2724   }
2725 
2726   // If we weren't given a dynamic vbptr offset, RD should be complete and we'll
2727   // know the vbptr offset.
2728   if (!VBPtrOffset) {
2729     CharUnits offs = CharUnits::Zero();
2730     if (!RD->hasDefinition()) {
2731       DiagnosticsEngine &Diags = CGF.CGM.getDiags();
2732       unsigned DiagID = Diags.getCustomDiagID(
2733           DiagnosticsEngine::Error,
2734           "member pointer representation requires a "
2735           "complete class type for %0 to perform this expression");
2736       Diags.Report(E->getExprLoc(), DiagID) << RD << E->getSourceRange();
2737     } else if (RD->getNumVBases())
2738       offs = getContext().getASTRecordLayout(RD).getVBPtrOffset();
2739     VBPtrOffset = llvm::ConstantInt::get(CGM.IntTy, offs.getQuantity());
2740   }
2741   llvm::Value *VBPtr = nullptr;
2742   llvm::Value *VBaseOffs =
2743     GetVBaseOffsetFromVBPtr(CGF, Base, VBPtrOffset, VBTableOffset, &VBPtr);
2744   llvm::Value *AdjustedBase = Builder.CreateInBoundsGEP(VBPtr, VBaseOffs);
2745 
2746   // Merge control flow with the case where we didn't have to adjust.
2747   if (VBaseAdjustBB) {
2748     Builder.CreateBr(SkipAdjustBB);
2749     CGF.EmitBlock(SkipAdjustBB);
2750     llvm::PHINode *Phi = Builder.CreatePHI(CGM.Int8PtrTy, 2, "memptr.base");
2751     Phi->addIncoming(Base, OriginalBB);
2752     Phi->addIncoming(AdjustedBase, VBaseAdjustBB);
2753     return Phi;
2754   }
2755   return AdjustedBase;
2756 }
2757 
2758 llvm::Value *MicrosoftCXXABI::EmitMemberDataPointerAddress(
2759     CodeGenFunction &CGF, const Expr *E, llvm::Value *Base, llvm::Value *MemPtr,
2760     const MemberPointerType *MPT) {
2761   assert(MPT->isMemberDataPointer());
2762   unsigned AS = Base->getType()->getPointerAddressSpace();
2763   llvm::Type *PType =
2764       CGF.ConvertTypeForMem(MPT->getPointeeType())->getPointerTo(AS);
2765   CGBuilderTy &Builder = CGF.Builder;
2766   const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl();
2767   MSInheritanceAttr::Spelling Inheritance = RD->getMSInheritanceModel();
2768 
2769   // Extract the fields we need, regardless of model.  We'll apply them if we
2770   // have them.
2771   llvm::Value *FieldOffset = MemPtr;
2772   llvm::Value *VirtualBaseAdjustmentOffset = nullptr;
2773   llvm::Value *VBPtrOffset = nullptr;
2774   if (MemPtr->getType()->isStructTy()) {
2775     // We need to extract values.
2776     unsigned I = 0;
2777     FieldOffset = Builder.CreateExtractValue(MemPtr, I++);
2778     if (MSInheritanceAttr::hasVBPtrOffsetField(Inheritance))
2779       VBPtrOffset = Builder.CreateExtractValue(MemPtr, I++);
2780     if (MSInheritanceAttr::hasVBTableOffsetField(Inheritance))
2781       VirtualBaseAdjustmentOffset = Builder.CreateExtractValue(MemPtr, I++);
2782   }
2783 
2784   if (VirtualBaseAdjustmentOffset) {
2785     Base = AdjustVirtualBase(CGF, E, RD, Base, VirtualBaseAdjustmentOffset,
2786                              VBPtrOffset);
2787   }
2788 
2789   // Cast to char*.
2790   Base = Builder.CreateBitCast(Base, Builder.getInt8Ty()->getPointerTo(AS));
2791 
2792   // Apply the offset, which we assume is non-null.
2793   llvm::Value *Addr =
2794     Builder.CreateInBoundsGEP(Base, FieldOffset, "memptr.offset");
2795 
2796   // Cast the address to the appropriate pointer type, adopting the address
2797   // space of the base pointer.
2798   return Builder.CreateBitCast(Addr, PType);
2799 }
2800 
2801 static MSInheritanceAttr::Spelling
2802 getInheritanceFromMemptr(const MemberPointerType *MPT) {
2803   return MPT->getMostRecentCXXRecordDecl()->getMSInheritanceModel();
2804 }
2805 
2806 llvm::Value *
2807 MicrosoftCXXABI::EmitMemberPointerConversion(CodeGenFunction &CGF,
2808                                              const CastExpr *E,
2809                                              llvm::Value *Src) {
2810   assert(E->getCastKind() == CK_DerivedToBaseMemberPointer ||
2811          E->getCastKind() == CK_BaseToDerivedMemberPointer ||
2812          E->getCastKind() == CK_ReinterpretMemberPointer);
2813 
2814   // Use constant emission if we can.
2815   if (isa<llvm::Constant>(Src))
2816     return EmitMemberPointerConversion(E, cast<llvm::Constant>(Src));
2817 
2818   // We may be adding or dropping fields from the member pointer, so we need
2819   // both types and the inheritance models of both records.
2820   const MemberPointerType *SrcTy =
2821     E->getSubExpr()->getType()->castAs<MemberPointerType>();
2822   const MemberPointerType *DstTy = E->getType()->castAs<MemberPointerType>();
2823   bool IsFunc = SrcTy->isMemberFunctionPointer();
2824 
2825   // If the classes use the same null representation, reinterpret_cast is a nop.
2826   bool IsReinterpret = E->getCastKind() == CK_ReinterpretMemberPointer;
2827   if (IsReinterpret && IsFunc)
2828     return Src;
2829 
2830   CXXRecordDecl *SrcRD = SrcTy->getMostRecentCXXRecordDecl();
2831   CXXRecordDecl *DstRD = DstTy->getMostRecentCXXRecordDecl();
2832   if (IsReinterpret &&
2833       SrcRD->nullFieldOffsetIsZero() == DstRD->nullFieldOffsetIsZero())
2834     return Src;
2835 
2836   CGBuilderTy &Builder = CGF.Builder;
2837 
2838   // Branch past the conversion if Src is null.
2839   llvm::Value *IsNotNull = EmitMemberPointerIsNotNull(CGF, Src, SrcTy);
2840   llvm::Constant *DstNull = EmitNullMemberPointer(DstTy);
2841 
2842   // C++ 5.2.10p9: The null member pointer value is converted to the null member
2843   //   pointer value of the destination type.
2844   if (IsReinterpret) {
2845     // For reinterpret casts, sema ensures that src and dst are both functions
2846     // or data and have the same size, which means the LLVM types should match.
2847     assert(Src->getType() == DstNull->getType());
2848     return Builder.CreateSelect(IsNotNull, Src, DstNull);
2849   }
2850 
2851   llvm::BasicBlock *OriginalBB = Builder.GetInsertBlock();
2852   llvm::BasicBlock *ConvertBB = CGF.createBasicBlock("memptr.convert");
2853   llvm::BasicBlock *ContinueBB = CGF.createBasicBlock("memptr.converted");
2854   Builder.CreateCondBr(IsNotNull, ConvertBB, ContinueBB);
2855   CGF.EmitBlock(ConvertBB);
2856 
2857   // Decompose src.
2858   llvm::Value *FirstField = Src;
2859   llvm::Value *NonVirtualBaseAdjustment = nullptr;
2860   llvm::Value *VirtualBaseAdjustmentOffset = nullptr;
2861   llvm::Value *VBPtrOffset = nullptr;
2862   MSInheritanceAttr::Spelling SrcInheritance = SrcRD->getMSInheritanceModel();
2863   if (!MSInheritanceAttr::hasOnlyOneField(IsFunc, SrcInheritance)) {
2864     // We need to extract values.
2865     unsigned I = 0;
2866     FirstField = Builder.CreateExtractValue(Src, I++);
2867     if (MSInheritanceAttr::hasNVOffsetField(IsFunc, SrcInheritance))
2868       NonVirtualBaseAdjustment = Builder.CreateExtractValue(Src, I++);
2869     if (MSInheritanceAttr::hasVBPtrOffsetField(SrcInheritance))
2870       VBPtrOffset = Builder.CreateExtractValue(Src, I++);
2871     if (MSInheritanceAttr::hasVBTableOffsetField(SrcInheritance))
2872       VirtualBaseAdjustmentOffset = Builder.CreateExtractValue(Src, I++);
2873   }
2874 
2875   // For data pointers, we adjust the field offset directly.  For functions, we
2876   // have a separate field.
2877   llvm::Constant *Adj = getMemberPointerAdjustment(E);
2878   if (Adj) {
2879     Adj = llvm::ConstantExpr::getTruncOrBitCast(Adj, CGM.IntTy);
2880     llvm::Value *&NVAdjustField = IsFunc ? NonVirtualBaseAdjustment : FirstField;
2881     bool isDerivedToBase = (E->getCastKind() == CK_DerivedToBaseMemberPointer);
2882     if (!NVAdjustField)  // If this field didn't exist in src, it's zero.
2883       NVAdjustField = getZeroInt();
2884     if (isDerivedToBase)
2885       NVAdjustField = Builder.CreateNSWSub(NVAdjustField, Adj, "adj");
2886     else
2887       NVAdjustField = Builder.CreateNSWAdd(NVAdjustField, Adj, "adj");
2888   }
2889 
2890   // FIXME PR15713: Support conversions through virtually derived classes.
2891 
2892   // Recompose dst from the null struct and the adjusted fields from src.
2893   MSInheritanceAttr::Spelling DstInheritance = DstRD->getMSInheritanceModel();
2894   llvm::Value *Dst;
2895   if (MSInheritanceAttr::hasOnlyOneField(IsFunc, DstInheritance)) {
2896     Dst = FirstField;
2897   } else {
2898     Dst = llvm::UndefValue::get(DstNull->getType());
2899     unsigned Idx = 0;
2900     Dst = Builder.CreateInsertValue(Dst, FirstField, Idx++);
2901     if (MSInheritanceAttr::hasNVOffsetField(IsFunc, DstInheritance))
2902       Dst = Builder.CreateInsertValue(
2903         Dst, getValueOrZeroInt(NonVirtualBaseAdjustment), Idx++);
2904     if (MSInheritanceAttr::hasVBPtrOffsetField(DstInheritance))
2905       Dst = Builder.CreateInsertValue(
2906         Dst, getValueOrZeroInt(VBPtrOffset), Idx++);
2907     if (MSInheritanceAttr::hasVBTableOffsetField(DstInheritance))
2908       Dst = Builder.CreateInsertValue(
2909         Dst, getValueOrZeroInt(VirtualBaseAdjustmentOffset), Idx++);
2910   }
2911   Builder.CreateBr(ContinueBB);
2912 
2913   // In the continuation, choose between DstNull and Dst.
2914   CGF.EmitBlock(ContinueBB);
2915   llvm::PHINode *Phi = Builder.CreatePHI(DstNull->getType(), 2, "memptr.converted");
2916   Phi->addIncoming(DstNull, OriginalBB);
2917   Phi->addIncoming(Dst, ConvertBB);
2918   return Phi;
2919 }
2920 
2921 llvm::Constant *
2922 MicrosoftCXXABI::EmitMemberPointerConversion(const CastExpr *E,
2923                                              llvm::Constant *Src) {
2924   const MemberPointerType *SrcTy =
2925     E->getSubExpr()->getType()->castAs<MemberPointerType>();
2926   const MemberPointerType *DstTy = E->getType()->castAs<MemberPointerType>();
2927 
2928   // If src is null, emit a new null for dst.  We can't return src because dst
2929   // might have a new representation.
2930   if (MemberPointerConstantIsNull(SrcTy, Src))
2931     return EmitNullMemberPointer(DstTy);
2932 
2933   // We don't need to do anything for reinterpret_casts of non-null member
2934   // pointers.  We should only get here when the two type representations have
2935   // the same size.
2936   if (E->getCastKind() == CK_ReinterpretMemberPointer)
2937     return Src;
2938 
2939   MSInheritanceAttr::Spelling SrcInheritance = getInheritanceFromMemptr(SrcTy);
2940   MSInheritanceAttr::Spelling DstInheritance = getInheritanceFromMemptr(DstTy);
2941 
2942   // Decompose src.
2943   llvm::Constant *FirstField = Src;
2944   llvm::Constant *NonVirtualBaseAdjustment = nullptr;
2945   llvm::Constant *VirtualBaseAdjustmentOffset = nullptr;
2946   llvm::Constant *VBPtrOffset = nullptr;
2947   bool IsFunc = SrcTy->isMemberFunctionPointer();
2948   if (!MSInheritanceAttr::hasOnlyOneField(IsFunc, SrcInheritance)) {
2949     // We need to extract values.
2950     unsigned I = 0;
2951     FirstField = Src->getAggregateElement(I++);
2952     if (MSInheritanceAttr::hasNVOffsetField(IsFunc, SrcInheritance))
2953       NonVirtualBaseAdjustment = Src->getAggregateElement(I++);
2954     if (MSInheritanceAttr::hasVBPtrOffsetField(SrcInheritance))
2955       VBPtrOffset = Src->getAggregateElement(I++);
2956     if (MSInheritanceAttr::hasVBTableOffsetField(SrcInheritance))
2957       VirtualBaseAdjustmentOffset = Src->getAggregateElement(I++);
2958   }
2959 
2960   // For data pointers, we adjust the field offset directly.  For functions, we
2961   // have a separate field.
2962   llvm::Constant *Adj = getMemberPointerAdjustment(E);
2963   if (Adj) {
2964     Adj = llvm::ConstantExpr::getTruncOrBitCast(Adj, CGM.IntTy);
2965     llvm::Constant *&NVAdjustField =
2966       IsFunc ? NonVirtualBaseAdjustment : FirstField;
2967     bool IsDerivedToBase = (E->getCastKind() == CK_DerivedToBaseMemberPointer);
2968     if (!NVAdjustField)  // If this field didn't exist in src, it's zero.
2969       NVAdjustField = getZeroInt();
2970     if (IsDerivedToBase)
2971       NVAdjustField = llvm::ConstantExpr::getNSWSub(NVAdjustField, Adj);
2972     else
2973       NVAdjustField = llvm::ConstantExpr::getNSWAdd(NVAdjustField, Adj);
2974   }
2975 
2976   // FIXME PR15713: Support conversions through virtually derived classes.
2977 
2978   // Recompose dst from the null struct and the adjusted fields from src.
2979   if (MSInheritanceAttr::hasOnlyOneField(IsFunc, DstInheritance))
2980     return FirstField;
2981 
2982   llvm::SmallVector<llvm::Constant *, 4> Fields;
2983   Fields.push_back(FirstField);
2984   if (MSInheritanceAttr::hasNVOffsetField(IsFunc, DstInheritance))
2985     Fields.push_back(getConstantOrZeroInt(NonVirtualBaseAdjustment));
2986   if (MSInheritanceAttr::hasVBPtrOffsetField(DstInheritance))
2987     Fields.push_back(getConstantOrZeroInt(VBPtrOffset));
2988   if (MSInheritanceAttr::hasVBTableOffsetField(DstInheritance))
2989     Fields.push_back(getConstantOrZeroInt(VirtualBaseAdjustmentOffset));
2990   return llvm::ConstantStruct::getAnon(Fields);
2991 }
2992 
2993 llvm::Value *MicrosoftCXXABI::EmitLoadOfMemberFunctionPointer(
2994     CodeGenFunction &CGF, const Expr *E, llvm::Value *&This,
2995     llvm::Value *MemPtr, const MemberPointerType *MPT) {
2996   assert(MPT->isMemberFunctionPointer());
2997   const FunctionProtoType *FPT =
2998     MPT->getPointeeType()->castAs<FunctionProtoType>();
2999   const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl();
3000   llvm::FunctionType *FTy =
3001     CGM.getTypes().GetFunctionType(
3002       CGM.getTypes().arrangeCXXMethodType(RD, FPT));
3003   CGBuilderTy &Builder = CGF.Builder;
3004 
3005   MSInheritanceAttr::Spelling Inheritance = RD->getMSInheritanceModel();
3006 
3007   // Extract the fields we need, regardless of model.  We'll apply them if we
3008   // have them.
3009   llvm::Value *FunctionPointer = MemPtr;
3010   llvm::Value *NonVirtualBaseAdjustment = nullptr;
3011   llvm::Value *VirtualBaseAdjustmentOffset = nullptr;
3012   llvm::Value *VBPtrOffset = nullptr;
3013   if (MemPtr->getType()->isStructTy()) {
3014     // We need to extract values.
3015     unsigned I = 0;
3016     FunctionPointer = Builder.CreateExtractValue(MemPtr, I++);
3017     if (MSInheritanceAttr::hasNVOffsetField(MPT, Inheritance))
3018       NonVirtualBaseAdjustment = Builder.CreateExtractValue(MemPtr, I++);
3019     if (MSInheritanceAttr::hasVBPtrOffsetField(Inheritance))
3020       VBPtrOffset = Builder.CreateExtractValue(MemPtr, I++);
3021     if (MSInheritanceAttr::hasVBTableOffsetField(Inheritance))
3022       VirtualBaseAdjustmentOffset = Builder.CreateExtractValue(MemPtr, I++);
3023   }
3024 
3025   if (VirtualBaseAdjustmentOffset) {
3026     This = AdjustVirtualBase(CGF, E, RD, This, VirtualBaseAdjustmentOffset,
3027                              VBPtrOffset);
3028   }
3029 
3030   if (NonVirtualBaseAdjustment) {
3031     // Apply the adjustment and cast back to the original struct type.
3032     llvm::Value *Ptr = Builder.CreateBitCast(This, Builder.getInt8PtrTy());
3033     Ptr = Builder.CreateInBoundsGEP(Ptr, NonVirtualBaseAdjustment);
3034     This = Builder.CreateBitCast(Ptr, This->getType(), "this.adjusted");
3035   }
3036 
3037   return Builder.CreateBitCast(FunctionPointer, FTy->getPointerTo());
3038 }
3039 
3040 CGCXXABI *clang::CodeGen::CreateMicrosoftCXXABI(CodeGenModule &CGM) {
3041   return new MicrosoftCXXABI(CGM);
3042 }
3043 
3044 // MS RTTI Overview:
3045 // The run time type information emitted by cl.exe contains 5 distinct types of
3046 // structures.  Many of them reference each other.
3047 //
3048 // TypeInfo:  Static classes that are returned by typeid.
3049 //
3050 // CompleteObjectLocator:  Referenced by vftables.  They contain information
3051 //   required for dynamic casting, including OffsetFromTop.  They also contain
3052 //   a reference to the TypeInfo for the type and a reference to the
3053 //   CompleteHierarchyDescriptor for the type.
3054 //
3055 // ClassHieararchyDescriptor: Contains information about a class hierarchy.
3056 //   Used during dynamic_cast to walk a class hierarchy.  References a base
3057 //   class array and the size of said array.
3058 //
3059 // BaseClassArray: Contains a list of classes in a hierarchy.  BaseClassArray is
3060 //   somewhat of a misnomer because the most derived class is also in the list
3061 //   as well as multiple copies of virtual bases (if they occur multiple times
3062 //   in the hiearchy.)  The BaseClassArray contains one BaseClassDescriptor for
3063 //   every path in the hierarchy, in pre-order depth first order.  Note, we do
3064 //   not declare a specific llvm type for BaseClassArray, it's merely an array
3065 //   of BaseClassDescriptor pointers.
3066 //
3067 // BaseClassDescriptor: Contains information about a class in a class hierarchy.
3068 //   BaseClassDescriptor is also somewhat of a misnomer for the same reason that
3069 //   BaseClassArray is.  It contains information about a class within a
3070 //   hierarchy such as: is this base is ambiguous and what is its offset in the
3071 //   vbtable.  The names of the BaseClassDescriptors have all of their fields
3072 //   mangled into them so they can be aggressively deduplicated by the linker.
3073 
3074 static llvm::GlobalVariable *getTypeInfoVTable(CodeGenModule &CGM) {
3075   StringRef MangledName("\01??_7type_info@@6B@");
3076   if (auto VTable = CGM.getModule().getNamedGlobal(MangledName))
3077     return VTable;
3078   return new llvm::GlobalVariable(CGM.getModule(), CGM.Int8PtrTy,
3079                                   /*Constant=*/true,
3080                                   llvm::GlobalVariable::ExternalLinkage,
3081                                   /*Initializer=*/nullptr, MangledName);
3082 }
3083 
3084 namespace {
3085 
3086 /// \brief A Helper struct that stores information about a class in a class
3087 /// hierarchy.  The information stored in these structs struct is used during
3088 /// the generation of ClassHierarchyDescriptors and BaseClassDescriptors.
3089 // During RTTI creation, MSRTTIClasses are stored in a contiguous array with
3090 // implicit depth first pre-order tree connectivity.  getFirstChild and
3091 // getNextSibling allow us to walk the tree efficiently.
3092 struct MSRTTIClass {
3093   enum {
3094     IsPrivateOnPath = 1 | 8,
3095     IsAmbiguous = 2,
3096     IsPrivate = 4,
3097     IsVirtual = 16,
3098     HasHierarchyDescriptor = 64
3099   };
3100   MSRTTIClass(const CXXRecordDecl *RD) : RD(RD) {}
3101   uint32_t initialize(const MSRTTIClass *Parent,
3102                       const CXXBaseSpecifier *Specifier);
3103 
3104   MSRTTIClass *getFirstChild() { return this + 1; }
3105   static MSRTTIClass *getNextChild(MSRTTIClass *Child) {
3106     return Child + 1 + Child->NumBases;
3107   }
3108 
3109   const CXXRecordDecl *RD, *VirtualRoot;
3110   uint32_t Flags, NumBases, OffsetInVBase;
3111 };
3112 
3113 /// \brief Recursively initialize the base class array.
3114 uint32_t MSRTTIClass::initialize(const MSRTTIClass *Parent,
3115                                  const CXXBaseSpecifier *Specifier) {
3116   Flags = HasHierarchyDescriptor;
3117   if (!Parent) {
3118     VirtualRoot = nullptr;
3119     OffsetInVBase = 0;
3120   } else {
3121     if (Specifier->getAccessSpecifier() != AS_public)
3122       Flags |= IsPrivate | IsPrivateOnPath;
3123     if (Specifier->isVirtual()) {
3124       Flags |= IsVirtual;
3125       VirtualRoot = RD;
3126       OffsetInVBase = 0;
3127     } else {
3128       if (Parent->Flags & IsPrivateOnPath)
3129         Flags |= IsPrivateOnPath;
3130       VirtualRoot = Parent->VirtualRoot;
3131       OffsetInVBase = Parent->OffsetInVBase + RD->getASTContext()
3132           .getASTRecordLayout(Parent->RD).getBaseClassOffset(RD).getQuantity();
3133     }
3134   }
3135   NumBases = 0;
3136   MSRTTIClass *Child = getFirstChild();
3137   for (const CXXBaseSpecifier &Base : RD->bases()) {
3138     NumBases += Child->initialize(this, &Base) + 1;
3139     Child = getNextChild(Child);
3140   }
3141   return NumBases;
3142 }
3143 
3144 static llvm::GlobalValue::LinkageTypes getLinkageForRTTI(QualType Ty) {
3145   switch (Ty->getLinkage()) {
3146   case NoLinkage:
3147   case InternalLinkage:
3148   case UniqueExternalLinkage:
3149     return llvm::GlobalValue::InternalLinkage;
3150 
3151   case VisibleNoLinkage:
3152   case ExternalLinkage:
3153     return llvm::GlobalValue::LinkOnceODRLinkage;
3154   }
3155   llvm_unreachable("Invalid linkage!");
3156 }
3157 
3158 /// \brief An ephemeral helper class for building MS RTTI types.  It caches some
3159 /// calls to the module and information about the most derived class in a
3160 /// hierarchy.
3161 struct MSRTTIBuilder {
3162   enum {
3163     HasBranchingHierarchy = 1,
3164     HasVirtualBranchingHierarchy = 2,
3165     HasAmbiguousBases = 4
3166   };
3167 
3168   MSRTTIBuilder(MicrosoftCXXABI &ABI, const CXXRecordDecl *RD)
3169       : CGM(ABI.CGM), Context(CGM.getContext()),
3170         VMContext(CGM.getLLVMContext()), Module(CGM.getModule()), RD(RD),
3171         Linkage(getLinkageForRTTI(CGM.getContext().getTagDeclType(RD))),
3172         ABI(ABI) {}
3173 
3174   llvm::GlobalVariable *getBaseClassDescriptor(const MSRTTIClass &Classes);
3175   llvm::GlobalVariable *
3176   getBaseClassArray(SmallVectorImpl<MSRTTIClass> &Classes);
3177   llvm::GlobalVariable *getClassHierarchyDescriptor();
3178   llvm::GlobalVariable *getCompleteObjectLocator(const VPtrInfo *Info);
3179 
3180   CodeGenModule &CGM;
3181   ASTContext &Context;
3182   llvm::LLVMContext &VMContext;
3183   llvm::Module &Module;
3184   const CXXRecordDecl *RD;
3185   llvm::GlobalVariable::LinkageTypes Linkage;
3186   MicrosoftCXXABI &ABI;
3187 };
3188 
3189 } // namespace
3190 
3191 /// \brief Recursively serializes a class hierarchy in pre-order depth first
3192 /// order.
3193 static void serializeClassHierarchy(SmallVectorImpl<MSRTTIClass> &Classes,
3194                                     const CXXRecordDecl *RD) {
3195   Classes.push_back(MSRTTIClass(RD));
3196   for (const CXXBaseSpecifier &Base : RD->bases())
3197     serializeClassHierarchy(Classes, Base.getType()->getAsCXXRecordDecl());
3198 }
3199 
3200 /// \brief Find ambiguity among base classes.
3201 static void
3202 detectAmbiguousBases(SmallVectorImpl<MSRTTIClass> &Classes) {
3203   llvm::SmallPtrSet<const CXXRecordDecl *, 8> VirtualBases;
3204   llvm::SmallPtrSet<const CXXRecordDecl *, 8> UniqueBases;
3205   llvm::SmallPtrSet<const CXXRecordDecl *, 8> AmbiguousBases;
3206   for (MSRTTIClass *Class = &Classes.front(); Class <= &Classes.back();) {
3207     if ((Class->Flags & MSRTTIClass::IsVirtual) &&
3208         !VirtualBases.insert(Class->RD).second) {
3209       Class = MSRTTIClass::getNextChild(Class);
3210       continue;
3211     }
3212     if (!UniqueBases.insert(Class->RD).second)
3213       AmbiguousBases.insert(Class->RD);
3214     Class++;
3215   }
3216   if (AmbiguousBases.empty())
3217     return;
3218   for (MSRTTIClass &Class : Classes)
3219     if (AmbiguousBases.count(Class.RD))
3220       Class.Flags |= MSRTTIClass::IsAmbiguous;
3221 }
3222 
3223 llvm::GlobalVariable *MSRTTIBuilder::getClassHierarchyDescriptor() {
3224   SmallString<256> MangledName;
3225   {
3226     llvm::raw_svector_ostream Out(MangledName);
3227     ABI.getMangleContext().mangleCXXRTTIClassHierarchyDescriptor(RD, Out);
3228   }
3229 
3230   // Check to see if we've already declared this ClassHierarchyDescriptor.
3231   if (auto CHD = Module.getNamedGlobal(MangledName))
3232     return CHD;
3233 
3234   // Serialize the class hierarchy and initialize the CHD Fields.
3235   SmallVector<MSRTTIClass, 8> Classes;
3236   serializeClassHierarchy(Classes, RD);
3237   Classes.front().initialize(/*Parent=*/nullptr, /*Specifier=*/nullptr);
3238   detectAmbiguousBases(Classes);
3239   int Flags = 0;
3240   for (auto Class : Classes) {
3241     if (Class.RD->getNumBases() > 1)
3242       Flags |= HasBranchingHierarchy;
3243     // Note: cl.exe does not calculate "HasAmbiguousBases" correctly.  We
3244     // believe the field isn't actually used.
3245     if (Class.Flags & MSRTTIClass::IsAmbiguous)
3246       Flags |= HasAmbiguousBases;
3247   }
3248   if ((Flags & HasBranchingHierarchy) && RD->getNumVBases() != 0)
3249     Flags |= HasVirtualBranchingHierarchy;
3250   // These gep indices are used to get the address of the first element of the
3251   // base class array.
3252   llvm::Value *GEPIndices[] = {llvm::ConstantInt::get(CGM.IntTy, 0),
3253                                llvm::ConstantInt::get(CGM.IntTy, 0)};
3254 
3255   // Forward-declare the class hierarchy descriptor
3256   auto Type = ABI.getClassHierarchyDescriptorType();
3257   auto CHD = new llvm::GlobalVariable(Module, Type, /*Constant=*/true, Linkage,
3258                                       /*Initializer=*/nullptr,
3259                                       StringRef(MangledName));
3260   if (CHD->isWeakForLinker())
3261     CHD->setComdat(CGM.getModule().getOrInsertComdat(CHD->getName()));
3262 
3263   auto *Bases = getBaseClassArray(Classes);
3264 
3265   // Initialize the base class ClassHierarchyDescriptor.
3266   llvm::Constant *Fields[] = {
3267       llvm::ConstantInt::get(CGM.IntTy, 0), // Unknown
3268       llvm::ConstantInt::get(CGM.IntTy, Flags),
3269       llvm::ConstantInt::get(CGM.IntTy, Classes.size()),
3270       ABI.getImageRelativeConstant(llvm::ConstantExpr::getInBoundsGetElementPtr(
3271           Bases->getValueType(), Bases,
3272           llvm::ArrayRef<llvm::Value *>(GEPIndices))),
3273   };
3274   CHD->setInitializer(llvm::ConstantStruct::get(Type, Fields));
3275   return CHD;
3276 }
3277 
3278 llvm::GlobalVariable *
3279 MSRTTIBuilder::getBaseClassArray(SmallVectorImpl<MSRTTIClass> &Classes) {
3280   SmallString<256> MangledName;
3281   {
3282     llvm::raw_svector_ostream Out(MangledName);
3283     ABI.getMangleContext().mangleCXXRTTIBaseClassArray(RD, Out);
3284   }
3285 
3286   // Forward-declare the base class array.
3287   // cl.exe pads the base class array with 1 (in 32 bit mode) or 4 (in 64 bit
3288   // mode) bytes of padding.  We provide a pointer sized amount of padding by
3289   // adding +1 to Classes.size().  The sections have pointer alignment and are
3290   // marked pick-any so it shouldn't matter.
3291   llvm::Type *PtrType = ABI.getImageRelativeType(
3292       ABI.getBaseClassDescriptorType()->getPointerTo());
3293   auto *ArrType = llvm::ArrayType::get(PtrType, Classes.size() + 1);
3294   auto *BCA =
3295       new llvm::GlobalVariable(Module, ArrType,
3296                                /*Constant=*/true, Linkage,
3297                                /*Initializer=*/nullptr, StringRef(MangledName));
3298   if (BCA->isWeakForLinker())
3299     BCA->setComdat(CGM.getModule().getOrInsertComdat(BCA->getName()));
3300 
3301   // Initialize the BaseClassArray.
3302   SmallVector<llvm::Constant *, 8> BaseClassArrayData;
3303   for (MSRTTIClass &Class : Classes)
3304     BaseClassArrayData.push_back(
3305         ABI.getImageRelativeConstant(getBaseClassDescriptor(Class)));
3306   BaseClassArrayData.push_back(llvm::Constant::getNullValue(PtrType));
3307   BCA->setInitializer(llvm::ConstantArray::get(ArrType, BaseClassArrayData));
3308   return BCA;
3309 }
3310 
3311 llvm::GlobalVariable *
3312 MSRTTIBuilder::getBaseClassDescriptor(const MSRTTIClass &Class) {
3313   // Compute the fields for the BaseClassDescriptor.  They are computed up front
3314   // because they are mangled into the name of the object.
3315   uint32_t OffsetInVBTable = 0;
3316   int32_t VBPtrOffset = -1;
3317   if (Class.VirtualRoot) {
3318     auto &VTableContext = CGM.getMicrosoftVTableContext();
3319     OffsetInVBTable = VTableContext.getVBTableIndex(RD, Class.VirtualRoot) * 4;
3320     VBPtrOffset = Context.getASTRecordLayout(RD).getVBPtrOffset().getQuantity();
3321   }
3322 
3323   SmallString<256> MangledName;
3324   {
3325     llvm::raw_svector_ostream Out(MangledName);
3326     ABI.getMangleContext().mangleCXXRTTIBaseClassDescriptor(
3327         Class.RD, Class.OffsetInVBase, VBPtrOffset, OffsetInVBTable,
3328         Class.Flags, Out);
3329   }
3330 
3331   // Check to see if we've already declared this object.
3332   if (auto BCD = Module.getNamedGlobal(MangledName))
3333     return BCD;
3334 
3335   // Forward-declare the base class descriptor.
3336   auto Type = ABI.getBaseClassDescriptorType();
3337   auto BCD =
3338       new llvm::GlobalVariable(Module, Type, /*Constant=*/true, Linkage,
3339                                /*Initializer=*/nullptr, StringRef(MangledName));
3340   if (BCD->isWeakForLinker())
3341     BCD->setComdat(CGM.getModule().getOrInsertComdat(BCD->getName()));
3342 
3343   // Initialize the BaseClassDescriptor.
3344   llvm::Constant *Fields[] = {
3345       ABI.getImageRelativeConstant(
3346           ABI.getAddrOfRTTIDescriptor(Context.getTypeDeclType(Class.RD))),
3347       llvm::ConstantInt::get(CGM.IntTy, Class.NumBases),
3348       llvm::ConstantInt::get(CGM.IntTy, Class.OffsetInVBase),
3349       llvm::ConstantInt::get(CGM.IntTy, VBPtrOffset),
3350       llvm::ConstantInt::get(CGM.IntTy, OffsetInVBTable),
3351       llvm::ConstantInt::get(CGM.IntTy, Class.Flags),
3352       ABI.getImageRelativeConstant(
3353           MSRTTIBuilder(ABI, Class.RD).getClassHierarchyDescriptor()),
3354   };
3355   BCD->setInitializer(llvm::ConstantStruct::get(Type, Fields));
3356   return BCD;
3357 }
3358 
3359 llvm::GlobalVariable *
3360 MSRTTIBuilder::getCompleteObjectLocator(const VPtrInfo *Info) {
3361   SmallString<256> MangledName;
3362   {
3363     llvm::raw_svector_ostream Out(MangledName);
3364     ABI.getMangleContext().mangleCXXRTTICompleteObjectLocator(RD, Info->MangledPath, Out);
3365   }
3366 
3367   // Check to see if we've already computed this complete object locator.
3368   if (auto COL = Module.getNamedGlobal(MangledName))
3369     return COL;
3370 
3371   // Compute the fields of the complete object locator.
3372   int OffsetToTop = Info->FullOffsetInMDC.getQuantity();
3373   int VFPtrOffset = 0;
3374   // The offset includes the vtordisp if one exists.
3375   if (const CXXRecordDecl *VBase = Info->getVBaseWithVPtr())
3376     if (Context.getASTRecordLayout(RD)
3377       .getVBaseOffsetsMap()
3378       .find(VBase)
3379       ->second.hasVtorDisp())
3380       VFPtrOffset = Info->NonVirtualOffset.getQuantity() + 4;
3381 
3382   // Forward-declare the complete object locator.
3383   llvm::StructType *Type = ABI.getCompleteObjectLocatorType();
3384   auto COL = new llvm::GlobalVariable(Module, Type, /*Constant=*/true, Linkage,
3385     /*Initializer=*/nullptr, StringRef(MangledName));
3386 
3387   // Initialize the CompleteObjectLocator.
3388   llvm::Constant *Fields[] = {
3389       llvm::ConstantInt::get(CGM.IntTy, ABI.isImageRelative()),
3390       llvm::ConstantInt::get(CGM.IntTy, OffsetToTop),
3391       llvm::ConstantInt::get(CGM.IntTy, VFPtrOffset),
3392       ABI.getImageRelativeConstant(
3393           CGM.GetAddrOfRTTIDescriptor(Context.getTypeDeclType(RD))),
3394       ABI.getImageRelativeConstant(getClassHierarchyDescriptor()),
3395       ABI.getImageRelativeConstant(COL),
3396   };
3397   llvm::ArrayRef<llvm::Constant *> FieldsRef(Fields);
3398   if (!ABI.isImageRelative())
3399     FieldsRef = FieldsRef.drop_back();
3400   COL->setInitializer(llvm::ConstantStruct::get(Type, FieldsRef));
3401   if (COL->isWeakForLinker())
3402     COL->setComdat(CGM.getModule().getOrInsertComdat(COL->getName()));
3403   return COL;
3404 }
3405 
3406 static QualType decomposeTypeForEH(ASTContext &Context, QualType T,
3407                                    bool &IsConst, bool &IsVolatile) {
3408   T = Context.getExceptionObjectType(T);
3409 
3410   // C++14 [except.handle]p3:
3411   //   A handler is a match for an exception object of type E if [...]
3412   //     - the handler is of type cv T or const T& where T is a pointer type and
3413   //       E is a pointer type that can be converted to T by [...]
3414   //         - a qualification conversion
3415   IsConst = false;
3416   IsVolatile = false;
3417   QualType PointeeType = T->getPointeeType();
3418   if (!PointeeType.isNull()) {
3419     IsConst = PointeeType.isConstQualified();
3420     IsVolatile = PointeeType.isVolatileQualified();
3421   }
3422 
3423   // Member pointer types like "const int A::*" are represented by having RTTI
3424   // for "int A::*" and separately storing the const qualifier.
3425   if (const auto *MPTy = T->getAs<MemberPointerType>())
3426     T = Context.getMemberPointerType(PointeeType.getUnqualifiedType(),
3427                                      MPTy->getClass());
3428 
3429   // Pointer types like "const int * const *" are represented by having RTTI
3430   // for "const int **" and separately storing the const qualifier.
3431   if (T->isPointerType())
3432     T = Context.getPointerType(PointeeType.getUnqualifiedType());
3433 
3434   return T;
3435 }
3436 
3437 llvm::Constant *
3438 MicrosoftCXXABI::getAddrOfCXXCatchHandlerType(QualType Type,
3439                                               QualType CatchHandlerType) {
3440   // TypeDescriptors for exceptions never have qualified pointer types,
3441   // qualifiers are stored seperately in order to support qualification
3442   // conversions.
3443   bool IsConst, IsVolatile;
3444   Type = decomposeTypeForEH(getContext(), Type, IsConst, IsVolatile);
3445 
3446   bool IsReference = CatchHandlerType->isReferenceType();
3447 
3448   uint32_t Flags = 0;
3449   if (IsConst)
3450     Flags |= 1;
3451   if (IsVolatile)
3452     Flags |= 2;
3453   if (IsReference)
3454     Flags |= 8;
3455 
3456   SmallString<256> MangledName;
3457   {
3458     llvm::raw_svector_ostream Out(MangledName);
3459     getMangleContext().mangleCXXCatchHandlerType(Type, Flags, Out);
3460   }
3461 
3462   if (llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(MangledName))
3463     return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy);
3464 
3465   llvm::Constant *Fields[] = {
3466       llvm::ConstantInt::get(CGM.IntTy, Flags), // Flags
3467       getAddrOfRTTIDescriptor(Type),            // TypeDescriptor
3468   };
3469   llvm::StructType *CatchHandlerTypeType = getCatchHandlerTypeType();
3470   auto *Var = new llvm::GlobalVariable(
3471       CGM.getModule(), CatchHandlerTypeType, /*Constant=*/true,
3472       llvm::GlobalValue::PrivateLinkage,
3473       llvm::ConstantStruct::get(CatchHandlerTypeType, Fields),
3474       StringRef(MangledName));
3475   Var->setUnnamedAddr(true);
3476   Var->setSection("llvm.metadata");
3477   return Var;
3478 }
3479 
3480 /// \brief Gets a TypeDescriptor.  Returns a llvm::Constant * rather than a
3481 /// llvm::GlobalVariable * because different type descriptors have different
3482 /// types, and need to be abstracted.  They are abstracting by casting the
3483 /// address to an Int8PtrTy.
3484 llvm::Constant *MicrosoftCXXABI::getAddrOfRTTIDescriptor(QualType Type) {
3485   SmallString<256> MangledName;
3486   {
3487     llvm::raw_svector_ostream Out(MangledName);
3488     getMangleContext().mangleCXXRTTI(Type, Out);
3489   }
3490 
3491   // Check to see if we've already declared this TypeDescriptor.
3492   if (llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(MangledName))
3493     return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy);
3494 
3495   // Compute the fields for the TypeDescriptor.
3496   SmallString<256> TypeInfoString;
3497   {
3498     llvm::raw_svector_ostream Out(TypeInfoString);
3499     getMangleContext().mangleCXXRTTIName(Type, Out);
3500   }
3501 
3502   // Declare and initialize the TypeDescriptor.
3503   llvm::Constant *Fields[] = {
3504     getTypeInfoVTable(CGM),                        // VFPtr
3505     llvm::ConstantPointerNull::get(CGM.Int8PtrTy), // Runtime data
3506     llvm::ConstantDataArray::getString(CGM.getLLVMContext(), TypeInfoString)};
3507   llvm::StructType *TypeDescriptorType =
3508       getTypeDescriptorType(TypeInfoString);
3509   auto *Var = new llvm::GlobalVariable(
3510       CGM.getModule(), TypeDescriptorType, /*Constant=*/false,
3511       getLinkageForRTTI(Type),
3512       llvm::ConstantStruct::get(TypeDescriptorType, Fields),
3513       StringRef(MangledName));
3514   if (Var->isWeakForLinker())
3515     Var->setComdat(CGM.getModule().getOrInsertComdat(Var->getName()));
3516   return llvm::ConstantExpr::getBitCast(Var, CGM.Int8PtrTy);
3517 }
3518 
3519 /// \brief Gets or a creates a Microsoft CompleteObjectLocator.
3520 llvm::GlobalVariable *
3521 MicrosoftCXXABI::getMSCompleteObjectLocator(const CXXRecordDecl *RD,
3522                                             const VPtrInfo *Info) {
3523   return MSRTTIBuilder(*this, RD).getCompleteObjectLocator(Info);
3524 }
3525 
3526 static void emitCXXConstructor(CodeGenModule &CGM,
3527                                const CXXConstructorDecl *ctor,
3528                                StructorType ctorType) {
3529   // There are no constructor variants, always emit the complete destructor.
3530   llvm::Function *Fn = CGM.codegenCXXStructor(ctor, StructorType::Complete);
3531   CGM.maybeSetTrivialComdat(*ctor, *Fn);
3532 }
3533 
3534 static void emitCXXDestructor(CodeGenModule &CGM, const CXXDestructorDecl *dtor,
3535                               StructorType dtorType) {
3536   // The complete destructor is equivalent to the base destructor for
3537   // classes with no virtual bases, so try to emit it as an alias.
3538   if (!dtor->getParent()->getNumVBases() &&
3539       (dtorType == StructorType::Complete || dtorType == StructorType::Base)) {
3540     bool ProducedAlias = !CGM.TryEmitDefinitionAsAlias(
3541         GlobalDecl(dtor, Dtor_Complete), GlobalDecl(dtor, Dtor_Base), true);
3542     if (ProducedAlias) {
3543       if (dtorType == StructorType::Complete)
3544         return;
3545       if (dtor->isVirtual())
3546         CGM.getVTables().EmitThunks(GlobalDecl(dtor, Dtor_Complete));
3547     }
3548   }
3549 
3550   // The base destructor is equivalent to the base destructor of its
3551   // base class if there is exactly one non-virtual base class with a
3552   // non-trivial destructor, there are no fields with a non-trivial
3553   // destructor, and the body of the destructor is trivial.
3554   if (dtorType == StructorType::Base && !CGM.TryEmitBaseDestructorAsAlias(dtor))
3555     return;
3556 
3557   llvm::Function *Fn = CGM.codegenCXXStructor(dtor, dtorType);
3558   if (Fn->isWeakForLinker())
3559     Fn->setComdat(CGM.getModule().getOrInsertComdat(Fn->getName()));
3560 }
3561 
3562 void MicrosoftCXXABI::emitCXXStructor(const CXXMethodDecl *MD,
3563                                       StructorType Type) {
3564   if (auto *CD = dyn_cast<CXXConstructorDecl>(MD)) {
3565     emitCXXConstructor(CGM, CD, Type);
3566     return;
3567   }
3568   emitCXXDestructor(CGM, cast<CXXDestructorDecl>(MD), Type);
3569 }
3570 
3571 llvm::Function *
3572 MicrosoftCXXABI::getAddrOfCXXCtorClosure(const CXXConstructorDecl *CD,
3573                                          CXXCtorType CT) {
3574   assert(CT == Ctor_CopyingClosure || CT == Ctor_DefaultClosure);
3575 
3576   // Calculate the mangled name.
3577   SmallString<256> ThunkName;
3578   llvm::raw_svector_ostream Out(ThunkName);
3579   getMangleContext().mangleCXXCtor(CD, CT, Out);
3580   Out.flush();
3581 
3582   // If the thunk has been generated previously, just return it.
3583   if (llvm::GlobalValue *GV = CGM.getModule().getNamedValue(ThunkName))
3584     return cast<llvm::Function>(GV);
3585 
3586   // Create the llvm::Function.
3587   const CGFunctionInfo &FnInfo = CGM.getTypes().arrangeMSCtorClosure(CD, CT);
3588   llvm::FunctionType *ThunkTy = CGM.getTypes().GetFunctionType(FnInfo);
3589   const CXXRecordDecl *RD = CD->getParent();
3590   QualType RecordTy = getContext().getRecordType(RD);
3591   llvm::Function *ThunkFn = llvm::Function::Create(
3592       ThunkTy, getLinkageForRTTI(RecordTy), ThunkName.str(), &CGM.getModule());
3593   ThunkFn->setCallingConv(static_cast<llvm::CallingConv::ID>(
3594       FnInfo.getEffectiveCallingConvention()));
3595   bool IsCopy = CT == Ctor_CopyingClosure;
3596 
3597   // Start codegen.
3598   CodeGenFunction CGF(CGM);
3599   CGF.CurGD = GlobalDecl(CD, Ctor_Complete);
3600 
3601   // Build FunctionArgs.
3602   FunctionArgList FunctionArgs;
3603 
3604   // A constructor always starts with a 'this' pointer as its first argument.
3605   buildThisParam(CGF, FunctionArgs);
3606 
3607   // Following the 'this' pointer is a reference to the source object that we
3608   // are copying from.
3609   ImplicitParamDecl SrcParam(
3610       getContext(), nullptr, SourceLocation(), &getContext().Idents.get("src"),
3611       getContext().getLValueReferenceType(RecordTy,
3612                                           /*SpelledAsLValue=*/true));
3613   if (IsCopy)
3614     FunctionArgs.push_back(&SrcParam);
3615 
3616   // Constructors for classes which utilize virtual bases have an additional
3617   // parameter which indicates whether or not it is being delegated to by a more
3618   // derived constructor.
3619   ImplicitParamDecl IsMostDerived(getContext(), nullptr, SourceLocation(),
3620                                   &getContext().Idents.get("is_most_derived"),
3621                                   getContext().IntTy);
3622   // Only add the parameter to the list if thie class has virtual bases.
3623   if (RD->getNumVBases() > 0)
3624     FunctionArgs.push_back(&IsMostDerived);
3625 
3626   // Start defining the function.
3627   CGF.StartFunction(GlobalDecl(), FnInfo.getReturnType(), ThunkFn, FnInfo,
3628                     FunctionArgs, CD->getLocation(), SourceLocation());
3629   EmitThisParam(CGF);
3630   llvm::Value *This = getThisValue(CGF);
3631 
3632   llvm::Value *SrcVal =
3633       IsCopy ? CGF.Builder.CreateLoad(CGF.GetAddrOfLocalVar(&SrcParam), "src")
3634              : nullptr;
3635 
3636   CallArgList Args;
3637 
3638   // Push the this ptr.
3639   Args.add(RValue::get(This), CD->getThisType(getContext()));
3640 
3641   // Push the src ptr.
3642   if (SrcVal)
3643     Args.add(RValue::get(SrcVal), SrcParam.getType());
3644 
3645   // Add the rest of the default arguments.
3646   std::vector<Stmt *> ArgVec;
3647   for (unsigned I = IsCopy ? 1 : 0, E = CD->getNumParams(); I != E; ++I) {
3648     Stmt *DefaultArg = getContext().getDefaultArgExprForConstructor(CD, I);
3649     assert(DefaultArg && "sema forgot to instantiate default args");
3650     ArgVec.push_back(DefaultArg);
3651   }
3652 
3653   CodeGenFunction::RunCleanupsScope Cleanups(CGF);
3654 
3655   const auto *FPT = CD->getType()->castAs<FunctionProtoType>();
3656   ConstExprIterator ArgBegin(ArgVec.data()),
3657       ArgEnd(ArgVec.data() + ArgVec.size());
3658   CGF.EmitCallArgs(Args, FPT, ArgBegin, ArgEnd, CD, IsCopy ? 1 : 0);
3659 
3660   // Insert any ABI-specific implicit constructor arguments.
3661   unsigned ExtraArgs = addImplicitConstructorArgs(CGF, CD, Ctor_Complete,
3662                                                   /*ForVirtualBase=*/false,
3663                                                   /*Delegating=*/false, Args);
3664 
3665   // Call the destructor with our arguments.
3666   llvm::Value *CalleeFn = CGM.getAddrOfCXXStructor(CD, StructorType::Complete);
3667   const CGFunctionInfo &CalleeInfo = CGM.getTypes().arrangeCXXConstructorCall(
3668       Args, CD, Ctor_Complete, ExtraArgs);
3669   CGF.EmitCall(CalleeInfo, CalleeFn, ReturnValueSlot(), Args, CD);
3670 
3671   Cleanups.ForceCleanup();
3672 
3673   // Emit the ret instruction, remove any temporary instructions created for the
3674   // aid of CodeGen.
3675   CGF.FinishFunction(SourceLocation());
3676 
3677   return ThunkFn;
3678 }
3679 
3680 llvm::Constant *MicrosoftCXXABI::getCatchableType(QualType T,
3681                                                   uint32_t NVOffset,
3682                                                   int32_t VBPtrOffset,
3683                                                   uint32_t VBIndex) {
3684   assert(!T->isReferenceType());
3685 
3686   CXXRecordDecl *RD = T->getAsCXXRecordDecl();
3687   const CXXConstructorDecl *CD =
3688       RD ? CGM.getContext().getCopyConstructorForExceptionObject(RD) : nullptr;
3689   CXXCtorType CT = Ctor_Complete;
3690   if (CD)
3691     if (!hasDefaultCXXMethodCC(getContext(), CD) || CD->getNumParams() != 1)
3692       CT = Ctor_CopyingClosure;
3693 
3694   uint32_t Size = getContext().getTypeSizeInChars(T).getQuantity();
3695   SmallString<256> MangledName;
3696   {
3697     llvm::raw_svector_ostream Out(MangledName);
3698     getMangleContext().mangleCXXCatchableType(T, CD, CT, Size, NVOffset,
3699                                               VBPtrOffset, VBIndex, Out);
3700   }
3701   if (llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(MangledName))
3702     return getImageRelativeConstant(GV);
3703 
3704   // The TypeDescriptor is used by the runtime to determine if a catch handler
3705   // is appropriate for the exception object.
3706   llvm::Constant *TD = getImageRelativeConstant(getAddrOfRTTIDescriptor(T));
3707 
3708   // The runtime is responsible for calling the copy constructor if the
3709   // exception is caught by value.
3710   llvm::Constant *CopyCtor;
3711   if (CD) {
3712     if (CT == Ctor_CopyingClosure)
3713       CopyCtor = getAddrOfCXXCtorClosure(CD, Ctor_CopyingClosure);
3714     else
3715       CopyCtor = CGM.getAddrOfCXXStructor(CD, StructorType::Complete);
3716 
3717     CopyCtor = llvm::ConstantExpr::getBitCast(CopyCtor, CGM.Int8PtrTy);
3718   } else {
3719     CopyCtor = llvm::Constant::getNullValue(CGM.Int8PtrTy);
3720   }
3721   CopyCtor = getImageRelativeConstant(CopyCtor);
3722 
3723   bool IsScalar = !RD;
3724   bool HasVirtualBases = false;
3725   bool IsStdBadAlloc = false; // std::bad_alloc is special for some reason.
3726   QualType PointeeType = T;
3727   if (T->isPointerType())
3728     PointeeType = T->getPointeeType();
3729   if (const CXXRecordDecl *RD = PointeeType->getAsCXXRecordDecl()) {
3730     HasVirtualBases = RD->getNumVBases() > 0;
3731     if (IdentifierInfo *II = RD->getIdentifier())
3732       IsStdBadAlloc = II->isStr("bad_alloc") && RD->isInStdNamespace();
3733   }
3734 
3735   // Encode the relevant CatchableType properties into the Flags bitfield.
3736   // FIXME: Figure out how bits 2 or 8 can get set.
3737   uint32_t Flags = 0;
3738   if (IsScalar)
3739     Flags |= 1;
3740   if (HasVirtualBases)
3741     Flags |= 4;
3742   if (IsStdBadAlloc)
3743     Flags |= 16;
3744 
3745   llvm::Constant *Fields[] = {
3746       llvm::ConstantInt::get(CGM.IntTy, Flags),       // Flags
3747       TD,                                             // TypeDescriptor
3748       llvm::ConstantInt::get(CGM.IntTy, NVOffset),    // NonVirtualAdjustment
3749       llvm::ConstantInt::get(CGM.IntTy, VBPtrOffset), // OffsetToVBPtr
3750       llvm::ConstantInt::get(CGM.IntTy, VBIndex),     // VBTableIndex
3751       llvm::ConstantInt::get(CGM.IntTy, Size),        // Size
3752       CopyCtor                                        // CopyCtor
3753   };
3754   llvm::StructType *CTType = getCatchableTypeType();
3755   auto *GV = new llvm::GlobalVariable(
3756       CGM.getModule(), CTType, /*Constant=*/true, getLinkageForRTTI(T),
3757       llvm::ConstantStruct::get(CTType, Fields), StringRef(MangledName));
3758   GV->setUnnamedAddr(true);
3759   GV->setSection(".xdata");
3760   if (GV->isWeakForLinker())
3761     GV->setComdat(CGM.getModule().getOrInsertComdat(GV->getName()));
3762   return getImageRelativeConstant(GV);
3763 }
3764 
3765 llvm::GlobalVariable *MicrosoftCXXABI::getCatchableTypeArray(QualType T) {
3766   assert(!T->isReferenceType());
3767 
3768   // See if we've already generated a CatchableTypeArray for this type before.
3769   llvm::GlobalVariable *&CTA = CatchableTypeArrays[T];
3770   if (CTA)
3771     return CTA;
3772 
3773   // Ensure that we don't have duplicate entries in our CatchableTypeArray by
3774   // using a SmallSetVector.  Duplicates may arise due to virtual bases
3775   // occurring more than once in the hierarchy.
3776   llvm::SmallSetVector<llvm::Constant *, 2> CatchableTypes;
3777 
3778   // C++14 [except.handle]p3:
3779   //   A handler is a match for an exception object of type E if [...]
3780   //     - the handler is of type cv T or cv T& and T is an unambiguous public
3781   //       base class of E, or
3782   //     - the handler is of type cv T or const T& where T is a pointer type and
3783   //       E is a pointer type that can be converted to T by [...]
3784   //         - a standard pointer conversion (4.10) not involving conversions to
3785   //           pointers to private or protected or ambiguous classes
3786   const CXXRecordDecl *MostDerivedClass = nullptr;
3787   bool IsPointer = T->isPointerType();
3788   if (IsPointer)
3789     MostDerivedClass = T->getPointeeType()->getAsCXXRecordDecl();
3790   else
3791     MostDerivedClass = T->getAsCXXRecordDecl();
3792 
3793   // Collect all the unambiguous public bases of the MostDerivedClass.
3794   if (MostDerivedClass) {
3795     const ASTContext &Context = getContext();
3796     const ASTRecordLayout &MostDerivedLayout =
3797         Context.getASTRecordLayout(MostDerivedClass);
3798     MicrosoftVTableContext &VTableContext = CGM.getMicrosoftVTableContext();
3799     SmallVector<MSRTTIClass, 8> Classes;
3800     serializeClassHierarchy(Classes, MostDerivedClass);
3801     Classes.front().initialize(/*Parent=*/nullptr, /*Specifier=*/nullptr);
3802     detectAmbiguousBases(Classes);
3803     for (const MSRTTIClass &Class : Classes) {
3804       // Skip any ambiguous or private bases.
3805       if (Class.Flags &
3806           (MSRTTIClass::IsPrivateOnPath | MSRTTIClass::IsAmbiguous))
3807         continue;
3808       // Write down how to convert from a derived pointer to a base pointer.
3809       uint32_t OffsetInVBTable = 0;
3810       int32_t VBPtrOffset = -1;
3811       if (Class.VirtualRoot) {
3812         OffsetInVBTable =
3813           VTableContext.getVBTableIndex(MostDerivedClass, Class.VirtualRoot)*4;
3814         VBPtrOffset = MostDerivedLayout.getVBPtrOffset().getQuantity();
3815       }
3816 
3817       // Turn our record back into a pointer if the exception object is a
3818       // pointer.
3819       QualType RTTITy = QualType(Class.RD->getTypeForDecl(), 0);
3820       if (IsPointer)
3821         RTTITy = Context.getPointerType(RTTITy);
3822       CatchableTypes.insert(getCatchableType(RTTITy, Class.OffsetInVBase,
3823                                              VBPtrOffset, OffsetInVBTable));
3824     }
3825   }
3826 
3827   // C++14 [except.handle]p3:
3828   //   A handler is a match for an exception object of type E if
3829   //     - The handler is of type cv T or cv T& and E and T are the same type
3830   //       (ignoring the top-level cv-qualifiers)
3831   CatchableTypes.insert(getCatchableType(T));
3832 
3833   // C++14 [except.handle]p3:
3834   //   A handler is a match for an exception object of type E if
3835   //     - the handler is of type cv T or const T& where T is a pointer type and
3836   //       E is a pointer type that can be converted to T by [...]
3837   //         - a standard pointer conversion (4.10) not involving conversions to
3838   //           pointers to private or protected or ambiguous classes
3839   //
3840   // C++14 [conv.ptr]p2:
3841   //   A prvalue of type "pointer to cv T," where T is an object type, can be
3842   //   converted to a prvalue of type "pointer to cv void".
3843   if (IsPointer && T->getPointeeType()->isObjectType())
3844     CatchableTypes.insert(getCatchableType(getContext().VoidPtrTy));
3845 
3846   // C++14 [except.handle]p3:
3847   //   A handler is a match for an exception object of type E if [...]
3848   //     - the handler is of type cv T or const T& where T is a pointer or
3849   //       pointer to member type and E is std::nullptr_t.
3850   //
3851   // We cannot possibly list all possible pointer types here, making this
3852   // implementation incompatible with the standard.  However, MSVC includes an
3853   // entry for pointer-to-void in this case.  Let's do the same.
3854   if (T->isNullPtrType())
3855     CatchableTypes.insert(getCatchableType(getContext().VoidPtrTy));
3856 
3857   uint32_t NumEntries = CatchableTypes.size();
3858   llvm::Type *CTType =
3859       getImageRelativeType(getCatchableTypeType()->getPointerTo());
3860   llvm::ArrayType *AT = llvm::ArrayType::get(CTType, NumEntries);
3861   llvm::StructType *CTAType = getCatchableTypeArrayType(NumEntries);
3862   llvm::Constant *Fields[] = {
3863       llvm::ConstantInt::get(CGM.IntTy, NumEntries),    // NumEntries
3864       llvm::ConstantArray::get(
3865           AT, llvm::makeArrayRef(CatchableTypes.begin(),
3866                                  CatchableTypes.end())) // CatchableTypes
3867   };
3868   SmallString<256> MangledName;
3869   {
3870     llvm::raw_svector_ostream Out(MangledName);
3871     getMangleContext().mangleCXXCatchableTypeArray(T, NumEntries, Out);
3872   }
3873   CTA = new llvm::GlobalVariable(
3874       CGM.getModule(), CTAType, /*Constant=*/true, getLinkageForRTTI(T),
3875       llvm::ConstantStruct::get(CTAType, Fields), StringRef(MangledName));
3876   CTA->setUnnamedAddr(true);
3877   CTA->setSection(".xdata");
3878   if (CTA->isWeakForLinker())
3879     CTA->setComdat(CGM.getModule().getOrInsertComdat(CTA->getName()));
3880   return CTA;
3881 }
3882 
3883 llvm::GlobalVariable *MicrosoftCXXABI::getThrowInfo(QualType T) {
3884   bool IsConst, IsVolatile;
3885   T = decomposeTypeForEH(getContext(), T, IsConst, IsVolatile);
3886 
3887   // The CatchableTypeArray enumerates the various (CV-unqualified) types that
3888   // the exception object may be caught as.
3889   llvm::GlobalVariable *CTA = getCatchableTypeArray(T);
3890   // The first field in a CatchableTypeArray is the number of CatchableTypes.
3891   // This is used as a component of the mangled name which means that we need to
3892   // know what it is in order to see if we have previously generated the
3893   // ThrowInfo.
3894   uint32_t NumEntries =
3895       cast<llvm::ConstantInt>(CTA->getInitializer()->getAggregateElement(0U))
3896           ->getLimitedValue();
3897 
3898   SmallString<256> MangledName;
3899   {
3900     llvm::raw_svector_ostream Out(MangledName);
3901     getMangleContext().mangleCXXThrowInfo(T, IsConst, IsVolatile, NumEntries,
3902                                           Out);
3903   }
3904 
3905   // Reuse a previously generated ThrowInfo if we have generated an appropriate
3906   // one before.
3907   if (llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(MangledName))
3908     return GV;
3909 
3910   // The RTTI TypeDescriptor uses an unqualified type but catch clauses must
3911   // be at least as CV qualified.  Encode this requirement into the Flags
3912   // bitfield.
3913   uint32_t Flags = 0;
3914   if (IsConst)
3915     Flags |= 1;
3916   if (IsVolatile)
3917     Flags |= 2;
3918 
3919   // The cleanup-function (a destructor) must be called when the exception
3920   // object's lifetime ends.
3921   llvm::Constant *CleanupFn = llvm::Constant::getNullValue(CGM.Int8PtrTy);
3922   if (const CXXRecordDecl *RD = T->getAsCXXRecordDecl())
3923     if (CXXDestructorDecl *DtorD = RD->getDestructor())
3924       if (!DtorD->isTrivial())
3925         CleanupFn = llvm::ConstantExpr::getBitCast(
3926             CGM.getAddrOfCXXStructor(DtorD, StructorType::Complete),
3927             CGM.Int8PtrTy);
3928   // This is unused as far as we can tell, initialize it to null.
3929   llvm::Constant *ForwardCompat =
3930       getImageRelativeConstant(llvm::Constant::getNullValue(CGM.Int8PtrTy));
3931   llvm::Constant *PointerToCatchableTypes = getImageRelativeConstant(
3932       llvm::ConstantExpr::getBitCast(CTA, CGM.Int8PtrTy));
3933   llvm::StructType *TIType = getThrowInfoType();
3934   llvm::Constant *Fields[] = {
3935       llvm::ConstantInt::get(CGM.IntTy, Flags), // Flags
3936       getImageRelativeConstant(CleanupFn),      // CleanupFn
3937       ForwardCompat,                            // ForwardCompat
3938       PointerToCatchableTypes                   // CatchableTypeArray
3939   };
3940   auto *GV = new llvm::GlobalVariable(
3941       CGM.getModule(), TIType, /*Constant=*/true, getLinkageForRTTI(T),
3942       llvm::ConstantStruct::get(TIType, Fields), StringRef(MangledName));
3943   GV->setUnnamedAddr(true);
3944   GV->setSection(".xdata");
3945   if (GV->isWeakForLinker())
3946     GV->setComdat(CGM.getModule().getOrInsertComdat(GV->getName()));
3947   return GV;
3948 }
3949 
3950 void MicrosoftCXXABI::emitThrow(CodeGenFunction &CGF, const CXXThrowExpr *E) {
3951   const Expr *SubExpr = E->getSubExpr();
3952   QualType ThrowType = SubExpr->getType();
3953   // The exception object lives on the stack and it's address is passed to the
3954   // runtime function.
3955   llvm::AllocaInst *AI = CGF.CreateMemTemp(ThrowType);
3956   CGF.EmitAnyExprToMem(SubExpr, AI, ThrowType.getQualifiers(),
3957                        /*IsInit=*/true);
3958 
3959   // The so-called ThrowInfo is used to describe how the exception object may be
3960   // caught.
3961   llvm::GlobalVariable *TI = getThrowInfo(ThrowType);
3962 
3963   // Call into the runtime to throw the exception.
3964   llvm::Value *Args[] = {CGF.Builder.CreateBitCast(AI, CGM.Int8PtrTy), TI};
3965   CGF.EmitNoreturnRuntimeCallOrInvoke(getThrowFn(), Args);
3966 }
3967