xref: /freebsd/contrib/llvm-project/clang/lib/CodeGen/ItaniumCXXABI.cpp (revision 7ef62cebc2f965b0f640263e179276928885e33d)
1 //===------- ItaniumCXXABI.cpp - Emit LLVM Code from ASTs for a Module ----===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This provides C++ code generation targeting the Itanium C++ ABI.  The class
10 // in this file generates structures that follow the Itanium C++ ABI, which is
11 // documented at:
12 //  https://itanium-cxx-abi.github.io/cxx-abi/abi.html
13 //  https://itanium-cxx-abi.github.io/cxx-abi/abi-eh.html
14 //
15 // It also supports the closely-related ARM ABI, documented at:
16 // https://developer.arm.com/documentation/ihi0041/g/
17 //
18 //===----------------------------------------------------------------------===//
19 
20 #include "CGCXXABI.h"
21 #include "CGCleanup.h"
22 #include "CGRecordLayout.h"
23 #include "CGVTables.h"
24 #include "CodeGenFunction.h"
25 #include "CodeGenModule.h"
26 #include "TargetInfo.h"
27 #include "clang/AST/Attr.h"
28 #include "clang/AST/Mangle.h"
29 #include "clang/AST/StmtCXX.h"
30 #include "clang/AST/Type.h"
31 #include "clang/CodeGen/ConstantInitBuilder.h"
32 #include "llvm/IR/DataLayout.h"
33 #include "llvm/IR/GlobalValue.h"
34 #include "llvm/IR/Instructions.h"
35 #include "llvm/IR/Intrinsics.h"
36 #include "llvm/IR/Value.h"
37 #include "llvm/Support/ScopedPrinter.h"
38 
39 using namespace clang;
40 using namespace CodeGen;
41 
42 namespace {
43 class ItaniumCXXABI : public CodeGen::CGCXXABI {
44   /// VTables - All the vtables which have been defined.
45   llvm::DenseMap<const CXXRecordDecl *, llvm::GlobalVariable *> VTables;
46 
47   /// All the thread wrapper functions that have been used.
48   llvm::SmallVector<std::pair<const VarDecl *, llvm::Function *>, 8>
49       ThreadWrappers;
50 
51 protected:
52   bool UseARMMethodPtrABI;
53   bool UseARMGuardVarABI;
54   bool Use32BitVTableOffsetABI;
55 
56   ItaniumMangleContext &getMangleContext() {
57     return cast<ItaniumMangleContext>(CodeGen::CGCXXABI::getMangleContext());
58   }
59 
60 public:
61   ItaniumCXXABI(CodeGen::CodeGenModule &CGM,
62                 bool UseARMMethodPtrABI = false,
63                 bool UseARMGuardVarABI = false) :
64     CGCXXABI(CGM), UseARMMethodPtrABI(UseARMMethodPtrABI),
65     UseARMGuardVarABI(UseARMGuardVarABI),
66     Use32BitVTableOffsetABI(false) { }
67 
68   bool classifyReturnType(CGFunctionInfo &FI) const override;
69 
70   RecordArgABI getRecordArgABI(const CXXRecordDecl *RD) const override {
71     // If C++ prohibits us from making a copy, pass by address.
72     if (!RD->canPassInRegisters())
73       return RAA_Indirect;
74     return RAA_Default;
75   }
76 
77   bool isThisCompleteObject(GlobalDecl GD) const override {
78     // The Itanium ABI has separate complete-object vs.  base-object
79     // variants of both constructors and destructors.
80     if (isa<CXXDestructorDecl>(GD.getDecl())) {
81       switch (GD.getDtorType()) {
82       case Dtor_Complete:
83       case Dtor_Deleting:
84         return true;
85 
86       case Dtor_Base:
87         return false;
88 
89       case Dtor_Comdat:
90         llvm_unreachable("emitting dtor comdat as function?");
91       }
92       llvm_unreachable("bad dtor kind");
93     }
94     if (isa<CXXConstructorDecl>(GD.getDecl())) {
95       switch (GD.getCtorType()) {
96       case Ctor_Complete:
97         return true;
98 
99       case Ctor_Base:
100         return false;
101 
102       case Ctor_CopyingClosure:
103       case Ctor_DefaultClosure:
104         llvm_unreachable("closure ctors in Itanium ABI?");
105 
106       case Ctor_Comdat:
107         llvm_unreachable("emitting ctor comdat as function?");
108       }
109       llvm_unreachable("bad dtor kind");
110     }
111 
112     // No other kinds.
113     return false;
114   }
115 
116   bool isZeroInitializable(const MemberPointerType *MPT) override;
117 
118   llvm::Type *ConvertMemberPointerType(const MemberPointerType *MPT) override;
119 
120   CGCallee
121     EmitLoadOfMemberFunctionPointer(CodeGenFunction &CGF,
122                                     const Expr *E,
123                                     Address This,
124                                     llvm::Value *&ThisPtrForCall,
125                                     llvm::Value *MemFnPtr,
126                                     const MemberPointerType *MPT) override;
127 
128   llvm::Value *
129     EmitMemberDataPointerAddress(CodeGenFunction &CGF, const Expr *E,
130                                  Address Base,
131                                  llvm::Value *MemPtr,
132                                  const MemberPointerType *MPT) override;
133 
134   llvm::Value *EmitMemberPointerConversion(CodeGenFunction &CGF,
135                                            const CastExpr *E,
136                                            llvm::Value *Src) override;
137   llvm::Constant *EmitMemberPointerConversion(const CastExpr *E,
138                                               llvm::Constant *Src) override;
139 
140   llvm::Constant *EmitNullMemberPointer(const MemberPointerType *MPT) override;
141 
142   llvm::Constant *EmitMemberFunctionPointer(const CXXMethodDecl *MD) override;
143   llvm::Constant *EmitMemberDataPointer(const MemberPointerType *MPT,
144                                         CharUnits offset) override;
145   llvm::Constant *EmitMemberPointer(const APValue &MP, QualType MPT) override;
146   llvm::Constant *BuildMemberPointer(const CXXMethodDecl *MD,
147                                      CharUnits ThisAdjustment);
148 
149   llvm::Value *EmitMemberPointerComparison(CodeGenFunction &CGF,
150                                            llvm::Value *L, llvm::Value *R,
151                                            const MemberPointerType *MPT,
152                                            bool Inequality) override;
153 
154   llvm::Value *EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
155                                          llvm::Value *Addr,
156                                          const MemberPointerType *MPT) override;
157 
158   void emitVirtualObjectDelete(CodeGenFunction &CGF, const CXXDeleteExpr *DE,
159                                Address Ptr, QualType ElementType,
160                                const CXXDestructorDecl *Dtor) override;
161 
162   void emitRethrow(CodeGenFunction &CGF, bool isNoReturn) override;
163   void emitThrow(CodeGenFunction &CGF, const CXXThrowExpr *E) override;
164 
165   void emitBeginCatch(CodeGenFunction &CGF, const CXXCatchStmt *C) override;
166 
167   llvm::CallInst *
168   emitTerminateForUnexpectedException(CodeGenFunction &CGF,
169                                       llvm::Value *Exn) override;
170 
171   void EmitFundamentalRTTIDescriptors(const CXXRecordDecl *RD);
172   llvm::Constant *getAddrOfRTTIDescriptor(QualType Ty) override;
173   CatchTypeInfo
174   getAddrOfCXXCatchHandlerType(QualType Ty,
175                                QualType CatchHandlerType) override {
176     return CatchTypeInfo{getAddrOfRTTIDescriptor(Ty), 0};
177   }
178 
179   bool shouldTypeidBeNullChecked(bool IsDeref, QualType SrcRecordTy) override;
180   void EmitBadTypeidCall(CodeGenFunction &CGF) override;
181   llvm::Value *EmitTypeid(CodeGenFunction &CGF, QualType SrcRecordTy,
182                           Address ThisPtr,
183                           llvm::Type *StdTypeInfoPtrTy) override;
184 
185   bool shouldDynamicCastCallBeNullChecked(bool SrcIsPtr,
186                                           QualType SrcRecordTy) override;
187 
188   llvm::Value *EmitDynamicCastCall(CodeGenFunction &CGF, Address Value,
189                                    QualType SrcRecordTy, QualType DestTy,
190                                    QualType DestRecordTy,
191                                    llvm::BasicBlock *CastEnd) override;
192 
193   llvm::Value *EmitDynamicCastToVoid(CodeGenFunction &CGF, Address Value,
194                                      QualType SrcRecordTy,
195                                      QualType DestTy) override;
196 
197   bool EmitBadCastCall(CodeGenFunction &CGF) override;
198 
199   llvm::Value *
200     GetVirtualBaseClassOffset(CodeGenFunction &CGF, Address This,
201                               const CXXRecordDecl *ClassDecl,
202                               const CXXRecordDecl *BaseClassDecl) override;
203 
204   void EmitCXXConstructors(const CXXConstructorDecl *D) override;
205 
206   AddedStructorArgCounts
207   buildStructorSignature(GlobalDecl GD,
208                          SmallVectorImpl<CanQualType> &ArgTys) override;
209 
210   bool useThunkForDtorVariant(const CXXDestructorDecl *Dtor,
211                               CXXDtorType DT) const override {
212     // Itanium does not emit any destructor variant as an inline thunk.
213     // Delegating may occur as an optimization, but all variants are either
214     // emitted with external linkage or as linkonce if they are inline and used.
215     return false;
216   }
217 
218   void EmitCXXDestructors(const CXXDestructorDecl *D) override;
219 
220   void addImplicitStructorParams(CodeGenFunction &CGF, QualType &ResTy,
221                                  FunctionArgList &Params) override;
222 
223   void EmitInstanceFunctionProlog(CodeGenFunction &CGF) override;
224 
225   AddedStructorArgs getImplicitConstructorArgs(CodeGenFunction &CGF,
226                                                const CXXConstructorDecl *D,
227                                                CXXCtorType Type,
228                                                bool ForVirtualBase,
229                                                bool Delegating) override;
230 
231   llvm::Value *getCXXDestructorImplicitParam(CodeGenFunction &CGF,
232                                              const CXXDestructorDecl *DD,
233                                              CXXDtorType Type,
234                                              bool ForVirtualBase,
235                                              bool Delegating) override;
236 
237   void EmitDestructorCall(CodeGenFunction &CGF, const CXXDestructorDecl *DD,
238                           CXXDtorType Type, bool ForVirtualBase,
239                           bool Delegating, Address This,
240                           QualType ThisTy) override;
241 
242   void emitVTableDefinitions(CodeGenVTables &CGVT,
243                              const CXXRecordDecl *RD) override;
244 
245   bool isVirtualOffsetNeededForVTableField(CodeGenFunction &CGF,
246                                            CodeGenFunction::VPtr Vptr) override;
247 
248   bool doStructorsInitializeVPtrs(const CXXRecordDecl *VTableClass) override {
249     return true;
250   }
251 
252   llvm::Constant *
253   getVTableAddressPoint(BaseSubobject Base,
254                         const CXXRecordDecl *VTableClass) override;
255 
256   llvm::Value *getVTableAddressPointInStructor(
257       CodeGenFunction &CGF, const CXXRecordDecl *VTableClass,
258       BaseSubobject Base, const CXXRecordDecl *NearestVBase) override;
259 
260   llvm::Value *getVTableAddressPointInStructorWithVTT(
261       CodeGenFunction &CGF, const CXXRecordDecl *VTableClass,
262       BaseSubobject Base, const CXXRecordDecl *NearestVBase);
263 
264   llvm::Constant *
265   getVTableAddressPointForConstExpr(BaseSubobject Base,
266                                     const CXXRecordDecl *VTableClass) override;
267 
268   llvm::GlobalVariable *getAddrOfVTable(const CXXRecordDecl *RD,
269                                         CharUnits VPtrOffset) override;
270 
271   CGCallee getVirtualFunctionPointer(CodeGenFunction &CGF, GlobalDecl GD,
272                                      Address This, llvm::Type *Ty,
273                                      SourceLocation Loc) override;
274 
275   llvm::Value *EmitVirtualDestructorCall(CodeGenFunction &CGF,
276                                          const CXXDestructorDecl *Dtor,
277                                          CXXDtorType DtorType, Address This,
278                                          DeleteOrMemberCallExpr E) override;
279 
280   void emitVirtualInheritanceTables(const CXXRecordDecl *RD) override;
281 
282   bool canSpeculativelyEmitVTable(const CXXRecordDecl *RD) const override;
283   bool canSpeculativelyEmitVTableAsBaseClass(const CXXRecordDecl *RD) const;
284 
285   void setThunkLinkage(llvm::Function *Thunk, bool ForVTable, GlobalDecl GD,
286                        bool ReturnAdjustment) override {
287     // Allow inlining of thunks by emitting them with available_externally
288     // linkage together with vtables when needed.
289     if (ForVTable && !Thunk->hasLocalLinkage())
290       Thunk->setLinkage(llvm::GlobalValue::AvailableExternallyLinkage);
291     CGM.setGVProperties(Thunk, GD);
292   }
293 
294   bool exportThunk() override { return true; }
295 
296   llvm::Value *performThisAdjustment(CodeGenFunction &CGF, Address This,
297                                      const ThisAdjustment &TA) override;
298 
299   llvm::Value *performReturnAdjustment(CodeGenFunction &CGF, Address Ret,
300                                        const ReturnAdjustment &RA) override;
301 
302   size_t getSrcArgforCopyCtor(const CXXConstructorDecl *,
303                               FunctionArgList &Args) const override {
304     assert(!Args.empty() && "expected the arglist to not be empty!");
305     return Args.size() - 1;
306   }
307 
308   StringRef GetPureVirtualCallName() override { return "__cxa_pure_virtual"; }
309   StringRef GetDeletedVirtualCallName() override
310     { return "__cxa_deleted_virtual"; }
311 
312   CharUnits getArrayCookieSizeImpl(QualType elementType) override;
313   Address InitializeArrayCookie(CodeGenFunction &CGF,
314                                 Address NewPtr,
315                                 llvm::Value *NumElements,
316                                 const CXXNewExpr *expr,
317                                 QualType ElementType) override;
318   llvm::Value *readArrayCookieImpl(CodeGenFunction &CGF,
319                                    Address allocPtr,
320                                    CharUnits cookieSize) override;
321 
322   void EmitGuardedInit(CodeGenFunction &CGF, const VarDecl &D,
323                        llvm::GlobalVariable *DeclPtr,
324                        bool PerformInit) override;
325   void registerGlobalDtor(CodeGenFunction &CGF, const VarDecl &D,
326                           llvm::FunctionCallee dtor,
327                           llvm::Constant *addr) override;
328 
329   llvm::Function *getOrCreateThreadLocalWrapper(const VarDecl *VD,
330                                                 llvm::Value *Val);
331   void EmitThreadLocalInitFuncs(
332       CodeGenModule &CGM,
333       ArrayRef<const VarDecl *> CXXThreadLocals,
334       ArrayRef<llvm::Function *> CXXThreadLocalInits,
335       ArrayRef<const VarDecl *> CXXThreadLocalInitVars) override;
336 
337   bool usesThreadWrapperFunction(const VarDecl *VD) const override {
338     return !isEmittedWithConstantInitializer(VD) ||
339            mayNeedDestruction(VD);
340   }
341   LValue EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF, const VarDecl *VD,
342                                       QualType LValType) override;
343 
344   bool NeedsVTTParameter(GlobalDecl GD) override;
345 
346   /**************************** RTTI Uniqueness ******************************/
347 
348 protected:
349   /// Returns true if the ABI requires RTTI type_info objects to be unique
350   /// across a program.
351   virtual bool shouldRTTIBeUnique() const { return true; }
352 
353 public:
354   /// What sort of unique-RTTI behavior should we use?
355   enum RTTIUniquenessKind {
356     /// We are guaranteeing, or need to guarantee, that the RTTI string
357     /// is unique.
358     RUK_Unique,
359 
360     /// We are not guaranteeing uniqueness for the RTTI string, so we
361     /// can demote to hidden visibility but must use string comparisons.
362     RUK_NonUniqueHidden,
363 
364     /// We are not guaranteeing uniqueness for the RTTI string, so we
365     /// have to use string comparisons, but we also have to emit it with
366     /// non-hidden visibility.
367     RUK_NonUniqueVisible
368   };
369 
370   /// Return the required visibility status for the given type and linkage in
371   /// the current ABI.
372   RTTIUniquenessKind
373   classifyRTTIUniqueness(QualType CanTy,
374                          llvm::GlobalValue::LinkageTypes Linkage) const;
375   friend class ItaniumRTTIBuilder;
376 
377   void emitCXXStructor(GlobalDecl GD) override;
378 
379   std::pair<llvm::Value *, const CXXRecordDecl *>
380   LoadVTablePtr(CodeGenFunction &CGF, Address This,
381                 const CXXRecordDecl *RD) override;
382 
383  private:
384    bool hasAnyUnusedVirtualInlineFunction(const CXXRecordDecl *RD) const {
385      const auto &VtableLayout =
386          CGM.getItaniumVTableContext().getVTableLayout(RD);
387 
388      for (const auto &VtableComponent : VtableLayout.vtable_components()) {
389        // Skip empty slot.
390        if (!VtableComponent.isUsedFunctionPointerKind())
391          continue;
392 
393        const CXXMethodDecl *Method = VtableComponent.getFunctionDecl();
394        if (!Method->getCanonicalDecl()->isInlined())
395          continue;
396 
397        StringRef Name = CGM.getMangledName(VtableComponent.getGlobalDecl());
398        auto *Entry = CGM.GetGlobalValue(Name);
399        // This checks if virtual inline function has already been emitted.
400        // Note that it is possible that this inline function would be emitted
401        // after trying to emit vtable speculatively. Because of this we do
402        // an extra pass after emitting all deferred vtables to find and emit
403        // these vtables opportunistically.
404        if (!Entry || Entry->isDeclaration())
405          return true;
406      }
407      return false;
408   }
409 
410   bool isVTableHidden(const CXXRecordDecl *RD) const {
411     const auto &VtableLayout =
412             CGM.getItaniumVTableContext().getVTableLayout(RD);
413 
414     for (const auto &VtableComponent : VtableLayout.vtable_components()) {
415       if (VtableComponent.isRTTIKind()) {
416         const CXXRecordDecl *RTTIDecl = VtableComponent.getRTTIDecl();
417         if (RTTIDecl->getVisibility() == Visibility::HiddenVisibility)
418           return true;
419       } else if (VtableComponent.isUsedFunctionPointerKind()) {
420         const CXXMethodDecl *Method = VtableComponent.getFunctionDecl();
421         if (Method->getVisibility() == Visibility::HiddenVisibility &&
422             !Method->isDefined())
423           return true;
424       }
425     }
426     return false;
427   }
428 };
429 
430 class ARMCXXABI : public ItaniumCXXABI {
431 public:
432   ARMCXXABI(CodeGen::CodeGenModule &CGM) :
433     ItaniumCXXABI(CGM, /*UseARMMethodPtrABI=*/true,
434                   /*UseARMGuardVarABI=*/true) {}
435 
436   bool constructorsAndDestructorsReturnThis() const override { return true; }
437 
438   void EmitReturnFromThunk(CodeGenFunction &CGF, RValue RV,
439                            QualType ResTy) override;
440 
441   CharUnits getArrayCookieSizeImpl(QualType elementType) override;
442   Address InitializeArrayCookie(CodeGenFunction &CGF,
443                                 Address NewPtr,
444                                 llvm::Value *NumElements,
445                                 const CXXNewExpr *expr,
446                                 QualType ElementType) override;
447   llvm::Value *readArrayCookieImpl(CodeGenFunction &CGF, Address allocPtr,
448                                    CharUnits cookieSize) override;
449 };
450 
451 class AppleARM64CXXABI : public ARMCXXABI {
452 public:
453   AppleARM64CXXABI(CodeGen::CodeGenModule &CGM) : ARMCXXABI(CGM) {
454     Use32BitVTableOffsetABI = true;
455   }
456 
457   // ARM64 libraries are prepared for non-unique RTTI.
458   bool shouldRTTIBeUnique() const override { return false; }
459 };
460 
461 class FuchsiaCXXABI final : public ItaniumCXXABI {
462 public:
463   explicit FuchsiaCXXABI(CodeGen::CodeGenModule &CGM)
464       : ItaniumCXXABI(CGM) {}
465 
466 private:
467   bool constructorsAndDestructorsReturnThis() const override { return true; }
468 };
469 
470 class WebAssemblyCXXABI final : public ItaniumCXXABI {
471 public:
472   explicit WebAssemblyCXXABI(CodeGen::CodeGenModule &CGM)
473       : ItaniumCXXABI(CGM, /*UseARMMethodPtrABI=*/true,
474                       /*UseARMGuardVarABI=*/true) {}
475   void emitBeginCatch(CodeGenFunction &CGF, const CXXCatchStmt *C) override;
476   llvm::CallInst *
477   emitTerminateForUnexpectedException(CodeGenFunction &CGF,
478                                       llvm::Value *Exn) override;
479 
480 private:
481   bool constructorsAndDestructorsReturnThis() const override { return true; }
482   bool canCallMismatchedFunctionType() const override { return false; }
483 };
484 
485 class XLCXXABI final : public ItaniumCXXABI {
486 public:
487   explicit XLCXXABI(CodeGen::CodeGenModule &CGM)
488       : ItaniumCXXABI(CGM) {}
489 
490   void registerGlobalDtor(CodeGenFunction &CGF, const VarDecl &D,
491                           llvm::FunctionCallee dtor,
492                           llvm::Constant *addr) override;
493 
494   bool useSinitAndSterm() const override { return true; }
495 
496 private:
497   void emitCXXStermFinalizer(const VarDecl &D, llvm::Function *dtorStub,
498                              llvm::Constant *addr);
499 };
500 }
501 
502 CodeGen::CGCXXABI *CodeGen::CreateItaniumCXXABI(CodeGenModule &CGM) {
503   switch (CGM.getContext().getCXXABIKind()) {
504   // For IR-generation purposes, there's no significant difference
505   // between the ARM and iOS ABIs.
506   case TargetCXXABI::GenericARM:
507   case TargetCXXABI::iOS:
508   case TargetCXXABI::WatchOS:
509     return new ARMCXXABI(CGM);
510 
511   case TargetCXXABI::AppleARM64:
512     return new AppleARM64CXXABI(CGM);
513 
514   case TargetCXXABI::Fuchsia:
515     return new FuchsiaCXXABI(CGM);
516 
517   // Note that AArch64 uses the generic ItaniumCXXABI class since it doesn't
518   // include the other 32-bit ARM oddities: constructor/destructor return values
519   // and array cookies.
520   case TargetCXXABI::GenericAArch64:
521     return new ItaniumCXXABI(CGM, /*UseARMMethodPtrABI=*/true,
522                              /*UseARMGuardVarABI=*/true);
523 
524   case TargetCXXABI::GenericMIPS:
525     return new ItaniumCXXABI(CGM, /*UseARMMethodPtrABI=*/true);
526 
527   case TargetCXXABI::WebAssembly:
528     return new WebAssemblyCXXABI(CGM);
529 
530   case TargetCXXABI::XL:
531     return new XLCXXABI(CGM);
532 
533   case TargetCXXABI::GenericItanium:
534     if (CGM.getContext().getTargetInfo().getTriple().getArch()
535         == llvm::Triple::le32) {
536       // For PNaCl, use ARM-style method pointers so that PNaCl code
537       // does not assume anything about the alignment of function
538       // pointers.
539       return new ItaniumCXXABI(CGM, /*UseARMMethodPtrABI=*/true);
540     }
541     return new ItaniumCXXABI(CGM);
542 
543   case TargetCXXABI::Microsoft:
544     llvm_unreachable("Microsoft ABI is not Itanium-based");
545   }
546   llvm_unreachable("bad ABI kind");
547 }
548 
549 llvm::Type *
550 ItaniumCXXABI::ConvertMemberPointerType(const MemberPointerType *MPT) {
551   if (MPT->isMemberDataPointer())
552     return CGM.PtrDiffTy;
553   return llvm::StructType::get(CGM.PtrDiffTy, CGM.PtrDiffTy);
554 }
555 
556 /// In the Itanium and ARM ABIs, method pointers have the form:
557 ///   struct { ptrdiff_t ptr; ptrdiff_t adj; } memptr;
558 ///
559 /// In the Itanium ABI:
560 ///  - method pointers are virtual if (memptr.ptr & 1) is nonzero
561 ///  - the this-adjustment is (memptr.adj)
562 ///  - the virtual offset is (memptr.ptr - 1)
563 ///
564 /// In the ARM ABI:
565 ///  - method pointers are virtual if (memptr.adj & 1) is nonzero
566 ///  - the this-adjustment is (memptr.adj >> 1)
567 ///  - the virtual offset is (memptr.ptr)
568 /// ARM uses 'adj' for the virtual flag because Thumb functions
569 /// may be only single-byte aligned.
570 ///
571 /// If the member is virtual, the adjusted 'this' pointer points
572 /// to a vtable pointer from which the virtual offset is applied.
573 ///
574 /// If the member is non-virtual, memptr.ptr is the address of
575 /// the function to call.
576 CGCallee ItaniumCXXABI::EmitLoadOfMemberFunctionPointer(
577     CodeGenFunction &CGF, const Expr *E, Address ThisAddr,
578     llvm::Value *&ThisPtrForCall,
579     llvm::Value *MemFnPtr, const MemberPointerType *MPT) {
580   CGBuilderTy &Builder = CGF.Builder;
581 
582   const FunctionProtoType *FPT =
583     MPT->getPointeeType()->getAs<FunctionProtoType>();
584   auto *RD =
585       cast<CXXRecordDecl>(MPT->getClass()->castAs<RecordType>()->getDecl());
586 
587   llvm::FunctionType *FTy = CGM.getTypes().GetFunctionType(
588       CGM.getTypes().arrangeCXXMethodType(RD, FPT, /*FD=*/nullptr));
589 
590   llvm::Constant *ptrdiff_1 = llvm::ConstantInt::get(CGM.PtrDiffTy, 1);
591 
592   llvm::BasicBlock *FnVirtual = CGF.createBasicBlock("memptr.virtual");
593   llvm::BasicBlock *FnNonVirtual = CGF.createBasicBlock("memptr.nonvirtual");
594   llvm::BasicBlock *FnEnd = CGF.createBasicBlock("memptr.end");
595 
596   // Extract memptr.adj, which is in the second field.
597   llvm::Value *RawAdj = Builder.CreateExtractValue(MemFnPtr, 1, "memptr.adj");
598 
599   // Compute the true adjustment.
600   llvm::Value *Adj = RawAdj;
601   if (UseARMMethodPtrABI)
602     Adj = Builder.CreateAShr(Adj, ptrdiff_1, "memptr.adj.shifted");
603 
604   // Apply the adjustment and cast back to the original struct type
605   // for consistency.
606   llvm::Value *This = ThisAddr.getPointer();
607   llvm::Value *Ptr = Builder.CreateBitCast(This, Builder.getInt8PtrTy());
608   Ptr = Builder.CreateInBoundsGEP(Builder.getInt8Ty(), Ptr, Adj);
609   This = Builder.CreateBitCast(Ptr, This->getType(), "this.adjusted");
610   ThisPtrForCall = This;
611 
612   // Load the function pointer.
613   llvm::Value *FnAsInt = Builder.CreateExtractValue(MemFnPtr, 0, "memptr.ptr");
614 
615   // If the LSB in the function pointer is 1, the function pointer points to
616   // a virtual function.
617   llvm::Value *IsVirtual;
618   if (UseARMMethodPtrABI)
619     IsVirtual = Builder.CreateAnd(RawAdj, ptrdiff_1);
620   else
621     IsVirtual = Builder.CreateAnd(FnAsInt, ptrdiff_1);
622   IsVirtual = Builder.CreateIsNotNull(IsVirtual, "memptr.isvirtual");
623   Builder.CreateCondBr(IsVirtual, FnVirtual, FnNonVirtual);
624 
625   // In the virtual path, the adjustment left 'This' pointing to the
626   // vtable of the correct base subobject.  The "function pointer" is an
627   // offset within the vtable (+1 for the virtual flag on non-ARM).
628   CGF.EmitBlock(FnVirtual);
629 
630   // Cast the adjusted this to a pointer to vtable pointer and load.
631   llvm::Type *VTableTy = Builder.getInt8PtrTy();
632   CharUnits VTablePtrAlign =
633     CGF.CGM.getDynamicOffsetAlignment(ThisAddr.getAlignment(), RD,
634                                       CGF.getPointerAlign());
635   llvm::Value *VTable = CGF.GetVTablePtr(
636       Address(This, ThisAddr.getElementType(), VTablePtrAlign), VTableTy, RD);
637 
638   // Apply the offset.
639   // On ARM64, to reserve extra space in virtual member function pointers,
640   // we only pay attention to the low 32 bits of the offset.
641   llvm::Value *VTableOffset = FnAsInt;
642   if (!UseARMMethodPtrABI)
643     VTableOffset = Builder.CreateSub(VTableOffset, ptrdiff_1);
644   if (Use32BitVTableOffsetABI) {
645     VTableOffset = Builder.CreateTrunc(VTableOffset, CGF.Int32Ty);
646     VTableOffset = Builder.CreateZExt(VTableOffset, CGM.PtrDiffTy);
647   }
648 
649   // Check the address of the function pointer if CFI on member function
650   // pointers is enabled.
651   llvm::Constant *CheckSourceLocation;
652   llvm::Constant *CheckTypeDesc;
653   bool ShouldEmitCFICheck = CGF.SanOpts.has(SanitizerKind::CFIMFCall) &&
654                             CGM.HasHiddenLTOVisibility(RD);
655   bool ShouldEmitVFEInfo = CGM.getCodeGenOpts().VirtualFunctionElimination &&
656                            CGM.HasHiddenLTOVisibility(RD);
657   bool ShouldEmitWPDInfo =
658       CGM.getCodeGenOpts().WholeProgramVTables &&
659       // Don't insert type tests if we are forcing public visibility.
660       !CGM.AlwaysHasLTOVisibilityPublic(RD);
661   llvm::Value *VirtualFn = nullptr;
662 
663   {
664     CodeGenFunction::SanitizerScope SanScope(&CGF);
665     llvm::Value *TypeId = nullptr;
666     llvm::Value *CheckResult = nullptr;
667 
668     if (ShouldEmitCFICheck || ShouldEmitVFEInfo || ShouldEmitWPDInfo) {
669       // If doing CFI, VFE or WPD, we will need the metadata node to check
670       // against.
671       llvm::Metadata *MD =
672           CGM.CreateMetadataIdentifierForVirtualMemPtrType(QualType(MPT, 0));
673       TypeId = llvm::MetadataAsValue::get(CGF.getLLVMContext(), MD);
674     }
675 
676     if (ShouldEmitVFEInfo) {
677       llvm::Value *VFPAddr =
678           Builder.CreateGEP(CGF.Int8Ty, VTable, VTableOffset);
679 
680       // If doing VFE, load from the vtable with a type.checked.load intrinsic
681       // call. Note that we use the GEP to calculate the address to load from
682       // and pass 0 as the offset to the intrinsic. This is because every
683       // vtable slot of the correct type is marked with matching metadata, and
684       // we know that the load must be from one of these slots.
685       llvm::Value *CheckedLoad = Builder.CreateCall(
686           CGM.getIntrinsic(llvm::Intrinsic::type_checked_load),
687           {VFPAddr, llvm::ConstantInt::get(CGM.Int32Ty, 0), TypeId});
688       CheckResult = Builder.CreateExtractValue(CheckedLoad, 1);
689       VirtualFn = Builder.CreateExtractValue(CheckedLoad, 0);
690       VirtualFn = Builder.CreateBitCast(VirtualFn, FTy->getPointerTo(),
691                                         "memptr.virtualfn");
692     } else {
693       // When not doing VFE, emit a normal load, as it allows more
694       // optimisations than type.checked.load.
695       if (ShouldEmitCFICheck || ShouldEmitWPDInfo) {
696         llvm::Value *VFPAddr =
697             Builder.CreateGEP(CGF.Int8Ty, VTable, VTableOffset);
698         llvm::Intrinsic::ID IID = CGM.HasHiddenLTOVisibility(RD)
699                                       ? llvm::Intrinsic::type_test
700                                       : llvm::Intrinsic::public_type_test;
701 
702         CheckResult = Builder.CreateCall(
703             CGM.getIntrinsic(IID),
704             {Builder.CreateBitCast(VFPAddr, CGF.Int8PtrTy), TypeId});
705       }
706 
707       if (CGM.getItaniumVTableContext().isRelativeLayout()) {
708         VirtualFn = CGF.Builder.CreateCall(
709             CGM.getIntrinsic(llvm::Intrinsic::load_relative,
710                              {VTableOffset->getType()}),
711             {VTable, VTableOffset});
712         VirtualFn = CGF.Builder.CreateBitCast(VirtualFn, FTy->getPointerTo());
713       } else {
714         llvm::Value *VFPAddr =
715             CGF.Builder.CreateGEP(CGF.Int8Ty, VTable, VTableOffset);
716         VFPAddr = CGF.Builder.CreateBitCast(
717             VFPAddr, FTy->getPointerTo()->getPointerTo());
718         VirtualFn = CGF.Builder.CreateAlignedLoad(
719             FTy->getPointerTo(), VFPAddr, CGF.getPointerAlign(),
720             "memptr.virtualfn");
721       }
722     }
723     assert(VirtualFn && "Virtual fuction pointer not created!");
724     assert((!ShouldEmitCFICheck || !ShouldEmitVFEInfo || !ShouldEmitWPDInfo ||
725             CheckResult) &&
726            "Check result required but not created!");
727 
728     if (ShouldEmitCFICheck) {
729       // If doing CFI, emit the check.
730       CheckSourceLocation = CGF.EmitCheckSourceLocation(E->getBeginLoc());
731       CheckTypeDesc = CGF.EmitCheckTypeDescriptor(QualType(MPT, 0));
732       llvm::Constant *StaticData[] = {
733           llvm::ConstantInt::get(CGF.Int8Ty, CodeGenFunction::CFITCK_VMFCall),
734           CheckSourceLocation,
735           CheckTypeDesc,
736       };
737 
738       if (CGM.getCodeGenOpts().SanitizeTrap.has(SanitizerKind::CFIMFCall)) {
739         CGF.EmitTrapCheck(CheckResult, SanitizerHandler::CFICheckFail);
740       } else {
741         llvm::Value *AllVtables = llvm::MetadataAsValue::get(
742             CGM.getLLVMContext(),
743             llvm::MDString::get(CGM.getLLVMContext(), "all-vtables"));
744         llvm::Value *ValidVtable = Builder.CreateCall(
745             CGM.getIntrinsic(llvm::Intrinsic::type_test), {VTable, AllVtables});
746         CGF.EmitCheck(std::make_pair(CheckResult, SanitizerKind::CFIMFCall),
747                       SanitizerHandler::CFICheckFail, StaticData,
748                       {VTable, ValidVtable});
749       }
750 
751       FnVirtual = Builder.GetInsertBlock();
752     }
753   } // End of sanitizer scope
754 
755   CGF.EmitBranch(FnEnd);
756 
757   // In the non-virtual path, the function pointer is actually a
758   // function pointer.
759   CGF.EmitBlock(FnNonVirtual);
760   llvm::Value *NonVirtualFn =
761     Builder.CreateIntToPtr(FnAsInt, FTy->getPointerTo(), "memptr.nonvirtualfn");
762 
763   // Check the function pointer if CFI on member function pointers is enabled.
764   if (ShouldEmitCFICheck) {
765     CXXRecordDecl *RD = MPT->getClass()->getAsCXXRecordDecl();
766     if (RD->hasDefinition()) {
767       CodeGenFunction::SanitizerScope SanScope(&CGF);
768 
769       llvm::Constant *StaticData[] = {
770           llvm::ConstantInt::get(CGF.Int8Ty, CodeGenFunction::CFITCK_NVMFCall),
771           CheckSourceLocation,
772           CheckTypeDesc,
773       };
774 
775       llvm::Value *Bit = Builder.getFalse();
776       llvm::Value *CastedNonVirtualFn =
777           Builder.CreateBitCast(NonVirtualFn, CGF.Int8PtrTy);
778       for (const CXXRecordDecl *Base : CGM.getMostBaseClasses(RD)) {
779         llvm::Metadata *MD = CGM.CreateMetadataIdentifierForType(
780             getContext().getMemberPointerType(
781                 MPT->getPointeeType(),
782                 getContext().getRecordType(Base).getTypePtr()));
783         llvm::Value *TypeId =
784             llvm::MetadataAsValue::get(CGF.getLLVMContext(), MD);
785 
786         llvm::Value *TypeTest =
787             Builder.CreateCall(CGM.getIntrinsic(llvm::Intrinsic::type_test),
788                                {CastedNonVirtualFn, TypeId});
789         Bit = Builder.CreateOr(Bit, TypeTest);
790       }
791 
792       CGF.EmitCheck(std::make_pair(Bit, SanitizerKind::CFIMFCall),
793                     SanitizerHandler::CFICheckFail, StaticData,
794                     {CastedNonVirtualFn, llvm::UndefValue::get(CGF.IntPtrTy)});
795 
796       FnNonVirtual = Builder.GetInsertBlock();
797     }
798   }
799 
800   // We're done.
801   CGF.EmitBlock(FnEnd);
802   llvm::PHINode *CalleePtr = Builder.CreatePHI(FTy->getPointerTo(), 2);
803   CalleePtr->addIncoming(VirtualFn, FnVirtual);
804   CalleePtr->addIncoming(NonVirtualFn, FnNonVirtual);
805 
806   CGCallee Callee(FPT, CalleePtr);
807   return Callee;
808 }
809 
810 /// Compute an l-value by applying the given pointer-to-member to a
811 /// base object.
812 llvm::Value *ItaniumCXXABI::EmitMemberDataPointerAddress(
813     CodeGenFunction &CGF, const Expr *E, Address Base, llvm::Value *MemPtr,
814     const MemberPointerType *MPT) {
815   assert(MemPtr->getType() == CGM.PtrDiffTy);
816 
817   CGBuilderTy &Builder = CGF.Builder;
818 
819   // Cast to char*.
820   Base = Builder.CreateElementBitCast(Base, CGF.Int8Ty);
821 
822   // Apply the offset, which we assume is non-null.
823   llvm::Value *Addr = Builder.CreateInBoundsGEP(
824       Base.getElementType(), Base.getPointer(), MemPtr, "memptr.offset");
825 
826   // Cast the address to the appropriate pointer type, adopting the
827   // address space of the base pointer.
828   llvm::Type *PType = CGF.ConvertTypeForMem(MPT->getPointeeType())
829                             ->getPointerTo(Base.getAddressSpace());
830   return Builder.CreateBitCast(Addr, PType);
831 }
832 
833 /// Perform a bitcast, derived-to-base, or base-to-derived member pointer
834 /// conversion.
835 ///
836 /// Bitcast conversions are always a no-op under Itanium.
837 ///
838 /// Obligatory offset/adjustment diagram:
839 ///         <-- offset -->          <-- adjustment -->
840 ///   |--------------------------|----------------------|--------------------|
841 ///   ^Derived address point     ^Base address point    ^Member address point
842 ///
843 /// So when converting a base member pointer to a derived member pointer,
844 /// we add the offset to the adjustment because the address point has
845 /// decreased;  and conversely, when converting a derived MP to a base MP
846 /// we subtract the offset from the adjustment because the address point
847 /// has increased.
848 ///
849 /// The standard forbids (at compile time) conversion to and from
850 /// virtual bases, which is why we don't have to consider them here.
851 ///
852 /// The standard forbids (at run time) casting a derived MP to a base
853 /// MP when the derived MP does not point to a member of the base.
854 /// This is why -1 is a reasonable choice for null data member
855 /// pointers.
856 llvm::Value *
857 ItaniumCXXABI::EmitMemberPointerConversion(CodeGenFunction &CGF,
858                                            const CastExpr *E,
859                                            llvm::Value *src) {
860   assert(E->getCastKind() == CK_DerivedToBaseMemberPointer ||
861          E->getCastKind() == CK_BaseToDerivedMemberPointer ||
862          E->getCastKind() == CK_ReinterpretMemberPointer);
863 
864   // Under Itanium, reinterprets don't require any additional processing.
865   if (E->getCastKind() == CK_ReinterpretMemberPointer) return src;
866 
867   // Use constant emission if we can.
868   if (isa<llvm::Constant>(src))
869     return EmitMemberPointerConversion(E, cast<llvm::Constant>(src));
870 
871   llvm::Constant *adj = getMemberPointerAdjustment(E);
872   if (!adj) return src;
873 
874   CGBuilderTy &Builder = CGF.Builder;
875   bool isDerivedToBase = (E->getCastKind() == CK_DerivedToBaseMemberPointer);
876 
877   const MemberPointerType *destTy =
878     E->getType()->castAs<MemberPointerType>();
879 
880   // For member data pointers, this is just a matter of adding the
881   // offset if the source is non-null.
882   if (destTy->isMemberDataPointer()) {
883     llvm::Value *dst;
884     if (isDerivedToBase)
885       dst = Builder.CreateNSWSub(src, adj, "adj");
886     else
887       dst = Builder.CreateNSWAdd(src, adj, "adj");
888 
889     // Null check.
890     llvm::Value *null = llvm::Constant::getAllOnesValue(src->getType());
891     llvm::Value *isNull = Builder.CreateICmpEQ(src, null, "memptr.isnull");
892     return Builder.CreateSelect(isNull, src, dst);
893   }
894 
895   // The this-adjustment is left-shifted by 1 on ARM.
896   if (UseARMMethodPtrABI) {
897     uint64_t offset = cast<llvm::ConstantInt>(adj)->getZExtValue();
898     offset <<= 1;
899     adj = llvm::ConstantInt::get(adj->getType(), offset);
900   }
901 
902   llvm::Value *srcAdj = Builder.CreateExtractValue(src, 1, "src.adj");
903   llvm::Value *dstAdj;
904   if (isDerivedToBase)
905     dstAdj = Builder.CreateNSWSub(srcAdj, adj, "adj");
906   else
907     dstAdj = Builder.CreateNSWAdd(srcAdj, adj, "adj");
908 
909   return Builder.CreateInsertValue(src, dstAdj, 1);
910 }
911 
912 llvm::Constant *
913 ItaniumCXXABI::EmitMemberPointerConversion(const CastExpr *E,
914                                            llvm::Constant *src) {
915   assert(E->getCastKind() == CK_DerivedToBaseMemberPointer ||
916          E->getCastKind() == CK_BaseToDerivedMemberPointer ||
917          E->getCastKind() == CK_ReinterpretMemberPointer);
918 
919   // Under Itanium, reinterprets don't require any additional processing.
920   if (E->getCastKind() == CK_ReinterpretMemberPointer) return src;
921 
922   // If the adjustment is trivial, we don't need to do anything.
923   llvm::Constant *adj = getMemberPointerAdjustment(E);
924   if (!adj) return src;
925 
926   bool isDerivedToBase = (E->getCastKind() == CK_DerivedToBaseMemberPointer);
927 
928   const MemberPointerType *destTy =
929     E->getType()->castAs<MemberPointerType>();
930 
931   // For member data pointers, this is just a matter of adding the
932   // offset if the source is non-null.
933   if (destTy->isMemberDataPointer()) {
934     // null maps to null.
935     if (src->isAllOnesValue()) return src;
936 
937     if (isDerivedToBase)
938       return llvm::ConstantExpr::getNSWSub(src, adj);
939     else
940       return llvm::ConstantExpr::getNSWAdd(src, adj);
941   }
942 
943   // The this-adjustment is left-shifted by 1 on ARM.
944   if (UseARMMethodPtrABI) {
945     uint64_t offset = cast<llvm::ConstantInt>(adj)->getZExtValue();
946     offset <<= 1;
947     adj = llvm::ConstantInt::get(adj->getType(), offset);
948   }
949 
950   llvm::Constant *srcAdj = src->getAggregateElement(1);
951   llvm::Constant *dstAdj;
952   if (isDerivedToBase)
953     dstAdj = llvm::ConstantExpr::getNSWSub(srcAdj, adj);
954   else
955     dstAdj = llvm::ConstantExpr::getNSWAdd(srcAdj, adj);
956 
957   llvm::Constant *res = ConstantFoldInsertValueInstruction(src, dstAdj, 1);
958   assert(res != nullptr && "Folding must succeed");
959   return res;
960 }
961 
962 llvm::Constant *
963 ItaniumCXXABI::EmitNullMemberPointer(const MemberPointerType *MPT) {
964   // Itanium C++ ABI 2.3:
965   //   A NULL pointer is represented as -1.
966   if (MPT->isMemberDataPointer())
967     return llvm::ConstantInt::get(CGM.PtrDiffTy, -1ULL, /*isSigned=*/true);
968 
969   llvm::Constant *Zero = llvm::ConstantInt::get(CGM.PtrDiffTy, 0);
970   llvm::Constant *Values[2] = { Zero, Zero };
971   return llvm::ConstantStruct::getAnon(Values);
972 }
973 
974 llvm::Constant *
975 ItaniumCXXABI::EmitMemberDataPointer(const MemberPointerType *MPT,
976                                      CharUnits offset) {
977   // Itanium C++ ABI 2.3:
978   //   A pointer to data member is an offset from the base address of
979   //   the class object containing it, represented as a ptrdiff_t
980   return llvm::ConstantInt::get(CGM.PtrDiffTy, offset.getQuantity());
981 }
982 
983 llvm::Constant *
984 ItaniumCXXABI::EmitMemberFunctionPointer(const CXXMethodDecl *MD) {
985   return BuildMemberPointer(MD, CharUnits::Zero());
986 }
987 
988 llvm::Constant *ItaniumCXXABI::BuildMemberPointer(const CXXMethodDecl *MD,
989                                                   CharUnits ThisAdjustment) {
990   assert(MD->isInstance() && "Member function must not be static!");
991 
992   CodeGenTypes &Types = CGM.getTypes();
993 
994   // Get the function pointer (or index if this is a virtual function).
995   llvm::Constant *MemPtr[2];
996   if (MD->isVirtual()) {
997     uint64_t Index = CGM.getItaniumVTableContext().getMethodVTableIndex(MD);
998     uint64_t VTableOffset;
999     if (CGM.getItaniumVTableContext().isRelativeLayout()) {
1000       // Multiply by 4-byte relative offsets.
1001       VTableOffset = Index * 4;
1002     } else {
1003       const ASTContext &Context = getContext();
1004       CharUnits PointerWidth = Context.toCharUnitsFromBits(
1005           Context.getTargetInfo().getPointerWidth(LangAS::Default));
1006       VTableOffset = Index * PointerWidth.getQuantity();
1007     }
1008 
1009     if (UseARMMethodPtrABI) {
1010       // ARM C++ ABI 3.2.1:
1011       //   This ABI specifies that adj contains twice the this
1012       //   adjustment, plus 1 if the member function is virtual. The
1013       //   least significant bit of adj then makes exactly the same
1014       //   discrimination as the least significant bit of ptr does for
1015       //   Itanium.
1016       MemPtr[0] = llvm::ConstantInt::get(CGM.PtrDiffTy, VTableOffset);
1017       MemPtr[1] = llvm::ConstantInt::get(CGM.PtrDiffTy,
1018                                          2 * ThisAdjustment.getQuantity() + 1);
1019     } else {
1020       // Itanium C++ ABI 2.3:
1021       //   For a virtual function, [the pointer field] is 1 plus the
1022       //   virtual table offset (in bytes) of the function,
1023       //   represented as a ptrdiff_t.
1024       MemPtr[0] = llvm::ConstantInt::get(CGM.PtrDiffTy, VTableOffset + 1);
1025       MemPtr[1] = llvm::ConstantInt::get(CGM.PtrDiffTy,
1026                                          ThisAdjustment.getQuantity());
1027     }
1028   } else {
1029     const FunctionProtoType *FPT = MD->getType()->castAs<FunctionProtoType>();
1030     llvm::Type *Ty;
1031     // Check whether the function has a computable LLVM signature.
1032     if (Types.isFuncTypeConvertible(FPT)) {
1033       // The function has a computable LLVM signature; use the correct type.
1034       Ty = Types.GetFunctionType(Types.arrangeCXXMethodDeclaration(MD));
1035     } else {
1036       // Use an arbitrary non-function type to tell GetAddrOfFunction that the
1037       // function type is incomplete.
1038       Ty = CGM.PtrDiffTy;
1039     }
1040     llvm::Constant *addr = CGM.GetAddrOfFunction(MD, Ty);
1041 
1042     MemPtr[0] = llvm::ConstantExpr::getPtrToInt(addr, CGM.PtrDiffTy);
1043     MemPtr[1] = llvm::ConstantInt::get(CGM.PtrDiffTy,
1044                                        (UseARMMethodPtrABI ? 2 : 1) *
1045                                        ThisAdjustment.getQuantity());
1046   }
1047 
1048   return llvm::ConstantStruct::getAnon(MemPtr);
1049 }
1050 
1051 llvm::Constant *ItaniumCXXABI::EmitMemberPointer(const APValue &MP,
1052                                                  QualType MPType) {
1053   const MemberPointerType *MPT = MPType->castAs<MemberPointerType>();
1054   const ValueDecl *MPD = MP.getMemberPointerDecl();
1055   if (!MPD)
1056     return EmitNullMemberPointer(MPT);
1057 
1058   CharUnits ThisAdjustment = getContext().getMemberPointerPathAdjustment(MP);
1059 
1060   if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(MPD))
1061     return BuildMemberPointer(MD, ThisAdjustment);
1062 
1063   CharUnits FieldOffset =
1064     getContext().toCharUnitsFromBits(getContext().getFieldOffset(MPD));
1065   return EmitMemberDataPointer(MPT, ThisAdjustment + FieldOffset);
1066 }
1067 
1068 /// The comparison algorithm is pretty easy: the member pointers are
1069 /// the same if they're either bitwise identical *or* both null.
1070 ///
1071 /// ARM is different here only because null-ness is more complicated.
1072 llvm::Value *
1073 ItaniumCXXABI::EmitMemberPointerComparison(CodeGenFunction &CGF,
1074                                            llvm::Value *L,
1075                                            llvm::Value *R,
1076                                            const MemberPointerType *MPT,
1077                                            bool Inequality) {
1078   CGBuilderTy &Builder = CGF.Builder;
1079 
1080   llvm::ICmpInst::Predicate Eq;
1081   llvm::Instruction::BinaryOps And, Or;
1082   if (Inequality) {
1083     Eq = llvm::ICmpInst::ICMP_NE;
1084     And = llvm::Instruction::Or;
1085     Or = llvm::Instruction::And;
1086   } else {
1087     Eq = llvm::ICmpInst::ICMP_EQ;
1088     And = llvm::Instruction::And;
1089     Or = llvm::Instruction::Or;
1090   }
1091 
1092   // Member data pointers are easy because there's a unique null
1093   // value, so it just comes down to bitwise equality.
1094   if (MPT->isMemberDataPointer())
1095     return Builder.CreateICmp(Eq, L, R);
1096 
1097   // For member function pointers, the tautologies are more complex.
1098   // The Itanium tautology is:
1099   //   (L == R) <==> (L.ptr == R.ptr && (L.ptr == 0 || L.adj == R.adj))
1100   // The ARM tautology is:
1101   //   (L == R) <==> (L.ptr == R.ptr &&
1102   //                  (L.adj == R.adj ||
1103   //                   (L.ptr == 0 && ((L.adj|R.adj) & 1) == 0)))
1104   // The inequality tautologies have exactly the same structure, except
1105   // applying De Morgan's laws.
1106 
1107   llvm::Value *LPtr = Builder.CreateExtractValue(L, 0, "lhs.memptr.ptr");
1108   llvm::Value *RPtr = Builder.CreateExtractValue(R, 0, "rhs.memptr.ptr");
1109 
1110   // This condition tests whether L.ptr == R.ptr.  This must always be
1111   // true for equality to hold.
1112   llvm::Value *PtrEq = Builder.CreateICmp(Eq, LPtr, RPtr, "cmp.ptr");
1113 
1114   // This condition, together with the assumption that L.ptr == R.ptr,
1115   // tests whether the pointers are both null.  ARM imposes an extra
1116   // condition.
1117   llvm::Value *Zero = llvm::Constant::getNullValue(LPtr->getType());
1118   llvm::Value *EqZero = Builder.CreateICmp(Eq, LPtr, Zero, "cmp.ptr.null");
1119 
1120   // This condition tests whether L.adj == R.adj.  If this isn't
1121   // true, the pointers are unequal unless they're both null.
1122   llvm::Value *LAdj = Builder.CreateExtractValue(L, 1, "lhs.memptr.adj");
1123   llvm::Value *RAdj = Builder.CreateExtractValue(R, 1, "rhs.memptr.adj");
1124   llvm::Value *AdjEq = Builder.CreateICmp(Eq, LAdj, RAdj, "cmp.adj");
1125 
1126   // Null member function pointers on ARM clear the low bit of Adj,
1127   // so the zero condition has to check that neither low bit is set.
1128   if (UseARMMethodPtrABI) {
1129     llvm::Value *One = llvm::ConstantInt::get(LPtr->getType(), 1);
1130 
1131     // Compute (l.adj | r.adj) & 1 and test it against zero.
1132     llvm::Value *OrAdj = Builder.CreateOr(LAdj, RAdj, "or.adj");
1133     llvm::Value *OrAdjAnd1 = Builder.CreateAnd(OrAdj, One);
1134     llvm::Value *OrAdjAnd1EqZero = Builder.CreateICmp(Eq, OrAdjAnd1, Zero,
1135                                                       "cmp.or.adj");
1136     EqZero = Builder.CreateBinOp(And, EqZero, OrAdjAnd1EqZero);
1137   }
1138 
1139   // Tie together all our conditions.
1140   llvm::Value *Result = Builder.CreateBinOp(Or, EqZero, AdjEq);
1141   Result = Builder.CreateBinOp(And, PtrEq, Result,
1142                                Inequality ? "memptr.ne" : "memptr.eq");
1143   return Result;
1144 }
1145 
1146 llvm::Value *
1147 ItaniumCXXABI::EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
1148                                           llvm::Value *MemPtr,
1149                                           const MemberPointerType *MPT) {
1150   CGBuilderTy &Builder = CGF.Builder;
1151 
1152   /// For member data pointers, this is just a check against -1.
1153   if (MPT->isMemberDataPointer()) {
1154     assert(MemPtr->getType() == CGM.PtrDiffTy);
1155     llvm::Value *NegativeOne =
1156       llvm::Constant::getAllOnesValue(MemPtr->getType());
1157     return Builder.CreateICmpNE(MemPtr, NegativeOne, "memptr.tobool");
1158   }
1159 
1160   // In Itanium, a member function pointer is not null if 'ptr' is not null.
1161   llvm::Value *Ptr = Builder.CreateExtractValue(MemPtr, 0, "memptr.ptr");
1162 
1163   llvm::Constant *Zero = llvm::ConstantInt::get(Ptr->getType(), 0);
1164   llvm::Value *Result = Builder.CreateICmpNE(Ptr, Zero, "memptr.tobool");
1165 
1166   // On ARM, a member function pointer is also non-null if the low bit of 'adj'
1167   // (the virtual bit) is set.
1168   if (UseARMMethodPtrABI) {
1169     llvm::Constant *One = llvm::ConstantInt::get(Ptr->getType(), 1);
1170     llvm::Value *Adj = Builder.CreateExtractValue(MemPtr, 1, "memptr.adj");
1171     llvm::Value *VirtualBit = Builder.CreateAnd(Adj, One, "memptr.virtualbit");
1172     llvm::Value *IsVirtual = Builder.CreateICmpNE(VirtualBit, Zero,
1173                                                   "memptr.isvirtual");
1174     Result = Builder.CreateOr(Result, IsVirtual);
1175   }
1176 
1177   return Result;
1178 }
1179 
1180 bool ItaniumCXXABI::classifyReturnType(CGFunctionInfo &FI) const {
1181   const CXXRecordDecl *RD = FI.getReturnType()->getAsCXXRecordDecl();
1182   if (!RD)
1183     return false;
1184 
1185   // If C++ prohibits us from making a copy, return by address.
1186   if (!RD->canPassInRegisters()) {
1187     auto Align = CGM.getContext().getTypeAlignInChars(FI.getReturnType());
1188     FI.getReturnInfo() = ABIArgInfo::getIndirect(Align, /*ByVal=*/false);
1189     return true;
1190   }
1191   return false;
1192 }
1193 
1194 /// The Itanium ABI requires non-zero initialization only for data
1195 /// member pointers, for which '0' is a valid offset.
1196 bool ItaniumCXXABI::isZeroInitializable(const MemberPointerType *MPT) {
1197   return MPT->isMemberFunctionPointer();
1198 }
1199 
1200 /// The Itanium ABI always places an offset to the complete object
1201 /// at entry -2 in the vtable.
1202 void ItaniumCXXABI::emitVirtualObjectDelete(CodeGenFunction &CGF,
1203                                             const CXXDeleteExpr *DE,
1204                                             Address Ptr,
1205                                             QualType ElementType,
1206                                             const CXXDestructorDecl *Dtor) {
1207   bool UseGlobalDelete = DE->isGlobalDelete();
1208   if (UseGlobalDelete) {
1209     // Derive the complete-object pointer, which is what we need
1210     // to pass to the deallocation function.
1211 
1212     // Grab the vtable pointer as an intptr_t*.
1213     auto *ClassDecl =
1214         cast<CXXRecordDecl>(ElementType->castAs<RecordType>()->getDecl());
1215     llvm::Value *VTable =
1216         CGF.GetVTablePtr(Ptr, CGF.IntPtrTy->getPointerTo(), ClassDecl);
1217 
1218     // Track back to entry -2 and pull out the offset there.
1219     llvm::Value *OffsetPtr = CGF.Builder.CreateConstInBoundsGEP1_64(
1220         CGF.IntPtrTy, VTable, -2, "complete-offset.ptr");
1221     llvm::Value *Offset = CGF.Builder.CreateAlignedLoad(CGF.IntPtrTy, OffsetPtr,                                                        CGF.getPointerAlign());
1222 
1223     // Apply the offset.
1224     llvm::Value *CompletePtr =
1225       CGF.Builder.CreateBitCast(Ptr.getPointer(), CGF.Int8PtrTy);
1226     CompletePtr =
1227         CGF.Builder.CreateInBoundsGEP(CGF.Int8Ty, CompletePtr, Offset);
1228 
1229     // If we're supposed to call the global delete, make sure we do so
1230     // even if the destructor throws.
1231     CGF.pushCallObjectDeleteCleanup(DE->getOperatorDelete(), CompletePtr,
1232                                     ElementType);
1233   }
1234 
1235   // FIXME: Provide a source location here even though there's no
1236   // CXXMemberCallExpr for dtor call.
1237   CXXDtorType DtorType = UseGlobalDelete ? Dtor_Complete : Dtor_Deleting;
1238   EmitVirtualDestructorCall(CGF, Dtor, DtorType, Ptr, DE);
1239 
1240   if (UseGlobalDelete)
1241     CGF.PopCleanupBlock();
1242 }
1243 
1244 void ItaniumCXXABI::emitRethrow(CodeGenFunction &CGF, bool isNoReturn) {
1245   // void __cxa_rethrow();
1246 
1247   llvm::FunctionType *FTy =
1248     llvm::FunctionType::get(CGM.VoidTy, /*isVarArg=*/false);
1249 
1250   llvm::FunctionCallee Fn = CGM.CreateRuntimeFunction(FTy, "__cxa_rethrow");
1251 
1252   if (isNoReturn)
1253     CGF.EmitNoreturnRuntimeCallOrInvoke(Fn, std::nullopt);
1254   else
1255     CGF.EmitRuntimeCallOrInvoke(Fn);
1256 }
1257 
1258 static llvm::FunctionCallee getAllocateExceptionFn(CodeGenModule &CGM) {
1259   // void *__cxa_allocate_exception(size_t thrown_size);
1260 
1261   llvm::FunctionType *FTy =
1262     llvm::FunctionType::get(CGM.Int8PtrTy, CGM.SizeTy, /*isVarArg=*/false);
1263 
1264   return CGM.CreateRuntimeFunction(FTy, "__cxa_allocate_exception");
1265 }
1266 
1267 static llvm::FunctionCallee getThrowFn(CodeGenModule &CGM) {
1268   // void __cxa_throw(void *thrown_exception, std::type_info *tinfo,
1269   //                  void (*dest) (void *));
1270 
1271   llvm::Type *Args[3] = { CGM.Int8PtrTy, CGM.Int8PtrTy, CGM.Int8PtrTy };
1272   llvm::FunctionType *FTy =
1273     llvm::FunctionType::get(CGM.VoidTy, Args, /*isVarArg=*/false);
1274 
1275   return CGM.CreateRuntimeFunction(FTy, "__cxa_throw");
1276 }
1277 
1278 void ItaniumCXXABI::emitThrow(CodeGenFunction &CGF, const CXXThrowExpr *E) {
1279   QualType ThrowType = E->getSubExpr()->getType();
1280   // Now allocate the exception object.
1281   llvm::Type *SizeTy = CGF.ConvertType(getContext().getSizeType());
1282   uint64_t TypeSize = getContext().getTypeSizeInChars(ThrowType).getQuantity();
1283 
1284   llvm::FunctionCallee AllocExceptionFn = getAllocateExceptionFn(CGM);
1285   llvm::CallInst *ExceptionPtr = CGF.EmitNounwindRuntimeCall(
1286       AllocExceptionFn, llvm::ConstantInt::get(SizeTy, TypeSize), "exception");
1287 
1288   CharUnits ExnAlign = CGF.getContext().getExnObjectAlignment();
1289   CGF.EmitAnyExprToExn(
1290       E->getSubExpr(), Address(ExceptionPtr, CGM.Int8Ty, ExnAlign));
1291 
1292   // Now throw the exception.
1293   llvm::Constant *TypeInfo = CGM.GetAddrOfRTTIDescriptor(ThrowType,
1294                                                          /*ForEH=*/true);
1295 
1296   // The address of the destructor.  If the exception type has a
1297   // trivial destructor (or isn't a record), we just pass null.
1298   llvm::Constant *Dtor = nullptr;
1299   if (const RecordType *RecordTy = ThrowType->getAs<RecordType>()) {
1300     CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordTy->getDecl());
1301     if (!Record->hasTrivialDestructor()) {
1302       CXXDestructorDecl *DtorD = Record->getDestructor();
1303       Dtor = CGM.getAddrOfCXXStructor(GlobalDecl(DtorD, Dtor_Complete));
1304       Dtor = llvm::ConstantExpr::getBitCast(Dtor, CGM.Int8PtrTy);
1305     }
1306   }
1307   if (!Dtor) Dtor = llvm::Constant::getNullValue(CGM.Int8PtrTy);
1308 
1309   llvm::Value *args[] = { ExceptionPtr, TypeInfo, Dtor };
1310   CGF.EmitNoreturnRuntimeCallOrInvoke(getThrowFn(CGM), args);
1311 }
1312 
1313 static llvm::FunctionCallee getItaniumDynamicCastFn(CodeGenFunction &CGF) {
1314   // void *__dynamic_cast(const void *sub,
1315   //                      const abi::__class_type_info *src,
1316   //                      const abi::__class_type_info *dst,
1317   //                      std::ptrdiff_t src2dst_offset);
1318 
1319   llvm::Type *Int8PtrTy = CGF.Int8PtrTy;
1320   llvm::Type *PtrDiffTy =
1321     CGF.ConvertType(CGF.getContext().getPointerDiffType());
1322 
1323   llvm::Type *Args[4] = { Int8PtrTy, Int8PtrTy, Int8PtrTy, PtrDiffTy };
1324 
1325   llvm::FunctionType *FTy = llvm::FunctionType::get(Int8PtrTy, Args, false);
1326 
1327   // Mark the function as nounwind readonly.
1328   llvm::AttrBuilder FuncAttrs(CGF.getLLVMContext());
1329   FuncAttrs.addAttribute(llvm::Attribute::NoUnwind);
1330   FuncAttrs.addMemoryAttr(llvm::MemoryEffects::readOnly());
1331   llvm::AttributeList Attrs = llvm::AttributeList::get(
1332       CGF.getLLVMContext(), llvm::AttributeList::FunctionIndex, FuncAttrs);
1333 
1334   return CGF.CGM.CreateRuntimeFunction(FTy, "__dynamic_cast", Attrs);
1335 }
1336 
1337 static llvm::FunctionCallee getBadCastFn(CodeGenFunction &CGF) {
1338   // void __cxa_bad_cast();
1339   llvm::FunctionType *FTy = llvm::FunctionType::get(CGF.VoidTy, false);
1340   return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_bad_cast");
1341 }
1342 
1343 /// Compute the src2dst_offset hint as described in the
1344 /// Itanium C++ ABI [2.9.7]
1345 static CharUnits computeOffsetHint(ASTContext &Context,
1346                                    const CXXRecordDecl *Src,
1347                                    const CXXRecordDecl *Dst) {
1348   CXXBasePaths Paths(/*FindAmbiguities=*/true, /*RecordPaths=*/true,
1349                      /*DetectVirtual=*/false);
1350 
1351   // If Dst is not derived from Src we can skip the whole computation below and
1352   // return that Src is not a public base of Dst.  Record all inheritance paths.
1353   if (!Dst->isDerivedFrom(Src, Paths))
1354     return CharUnits::fromQuantity(-2ULL);
1355 
1356   unsigned NumPublicPaths = 0;
1357   CharUnits Offset;
1358 
1359   // Now walk all possible inheritance paths.
1360   for (const CXXBasePath &Path : Paths) {
1361     if (Path.Access != AS_public)  // Ignore non-public inheritance.
1362       continue;
1363 
1364     ++NumPublicPaths;
1365 
1366     for (const CXXBasePathElement &PathElement : Path) {
1367       // If the path contains a virtual base class we can't give any hint.
1368       // -1: no hint.
1369       if (PathElement.Base->isVirtual())
1370         return CharUnits::fromQuantity(-1ULL);
1371 
1372       if (NumPublicPaths > 1) // Won't use offsets, skip computation.
1373         continue;
1374 
1375       // Accumulate the base class offsets.
1376       const ASTRecordLayout &L = Context.getASTRecordLayout(PathElement.Class);
1377       Offset += L.getBaseClassOffset(
1378           PathElement.Base->getType()->getAsCXXRecordDecl());
1379     }
1380   }
1381 
1382   // -2: Src is not a public base of Dst.
1383   if (NumPublicPaths == 0)
1384     return CharUnits::fromQuantity(-2ULL);
1385 
1386   // -3: Src is a multiple public base type but never a virtual base type.
1387   if (NumPublicPaths > 1)
1388     return CharUnits::fromQuantity(-3ULL);
1389 
1390   // Otherwise, the Src type is a unique public nonvirtual base type of Dst.
1391   // Return the offset of Src from the origin of Dst.
1392   return Offset;
1393 }
1394 
1395 static llvm::FunctionCallee getBadTypeidFn(CodeGenFunction &CGF) {
1396   // void __cxa_bad_typeid();
1397   llvm::FunctionType *FTy = llvm::FunctionType::get(CGF.VoidTy, false);
1398 
1399   return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_bad_typeid");
1400 }
1401 
1402 bool ItaniumCXXABI::shouldTypeidBeNullChecked(bool IsDeref,
1403                                               QualType SrcRecordTy) {
1404   return IsDeref;
1405 }
1406 
1407 void ItaniumCXXABI::EmitBadTypeidCall(CodeGenFunction &CGF) {
1408   llvm::FunctionCallee Fn = getBadTypeidFn(CGF);
1409   llvm::CallBase *Call = CGF.EmitRuntimeCallOrInvoke(Fn);
1410   Call->setDoesNotReturn();
1411   CGF.Builder.CreateUnreachable();
1412 }
1413 
1414 llvm::Value *ItaniumCXXABI::EmitTypeid(CodeGenFunction &CGF,
1415                                        QualType SrcRecordTy,
1416                                        Address ThisPtr,
1417                                        llvm::Type *StdTypeInfoPtrTy) {
1418   auto *ClassDecl =
1419       cast<CXXRecordDecl>(SrcRecordTy->castAs<RecordType>()->getDecl());
1420   llvm::Value *Value =
1421       CGF.GetVTablePtr(ThisPtr, StdTypeInfoPtrTy->getPointerTo(), ClassDecl);
1422 
1423   if (CGM.getItaniumVTableContext().isRelativeLayout()) {
1424     // Load the type info.
1425     Value = CGF.Builder.CreateBitCast(Value, CGM.Int8PtrTy);
1426     Value = CGF.Builder.CreateCall(
1427         CGM.getIntrinsic(llvm::Intrinsic::load_relative, {CGM.Int32Ty}),
1428         {Value, llvm::ConstantInt::get(CGM.Int32Ty, -4)});
1429 
1430     // Setup to dereference again since this is a proxy we accessed.
1431     Value = CGF.Builder.CreateBitCast(Value, StdTypeInfoPtrTy->getPointerTo());
1432   } else {
1433     // Load the type info.
1434     Value =
1435         CGF.Builder.CreateConstInBoundsGEP1_64(StdTypeInfoPtrTy, Value, -1ULL);
1436   }
1437   return CGF.Builder.CreateAlignedLoad(StdTypeInfoPtrTy, Value,
1438                                        CGF.getPointerAlign());
1439 }
1440 
1441 bool ItaniumCXXABI::shouldDynamicCastCallBeNullChecked(bool SrcIsPtr,
1442                                                        QualType SrcRecordTy) {
1443   return SrcIsPtr;
1444 }
1445 
1446 llvm::Value *ItaniumCXXABI::EmitDynamicCastCall(
1447     CodeGenFunction &CGF, Address ThisAddr, QualType SrcRecordTy,
1448     QualType DestTy, QualType DestRecordTy, llvm::BasicBlock *CastEnd) {
1449   llvm::Type *PtrDiffLTy =
1450       CGF.ConvertType(CGF.getContext().getPointerDiffType());
1451   llvm::Type *DestLTy = CGF.ConvertType(DestTy);
1452 
1453   llvm::Value *SrcRTTI =
1454       CGF.CGM.GetAddrOfRTTIDescriptor(SrcRecordTy.getUnqualifiedType());
1455   llvm::Value *DestRTTI =
1456       CGF.CGM.GetAddrOfRTTIDescriptor(DestRecordTy.getUnqualifiedType());
1457 
1458   // Compute the offset hint.
1459   const CXXRecordDecl *SrcDecl = SrcRecordTy->getAsCXXRecordDecl();
1460   const CXXRecordDecl *DestDecl = DestRecordTy->getAsCXXRecordDecl();
1461   llvm::Value *OffsetHint = llvm::ConstantInt::get(
1462       PtrDiffLTy,
1463       computeOffsetHint(CGF.getContext(), SrcDecl, DestDecl).getQuantity());
1464 
1465   // Emit the call to __dynamic_cast.
1466   llvm::Value *Value = ThisAddr.getPointer();
1467   Value = CGF.EmitCastToVoidPtr(Value);
1468 
1469   llvm::Value *args[] = {Value, SrcRTTI, DestRTTI, OffsetHint};
1470   Value = CGF.EmitNounwindRuntimeCall(getItaniumDynamicCastFn(CGF), args);
1471   Value = CGF.Builder.CreateBitCast(Value, DestLTy);
1472 
1473   /// C++ [expr.dynamic.cast]p9:
1474   ///   A failed cast to reference type throws std::bad_cast
1475   if (DestTy->isReferenceType()) {
1476     llvm::BasicBlock *BadCastBlock =
1477         CGF.createBasicBlock("dynamic_cast.bad_cast");
1478 
1479     llvm::Value *IsNull = CGF.Builder.CreateIsNull(Value);
1480     CGF.Builder.CreateCondBr(IsNull, BadCastBlock, CastEnd);
1481 
1482     CGF.EmitBlock(BadCastBlock);
1483     EmitBadCastCall(CGF);
1484   }
1485 
1486   return Value;
1487 }
1488 
1489 llvm::Value *ItaniumCXXABI::EmitDynamicCastToVoid(CodeGenFunction &CGF,
1490                                                   Address ThisAddr,
1491                                                   QualType SrcRecordTy,
1492                                                   QualType DestTy) {
1493   llvm::Type *DestLTy = CGF.ConvertType(DestTy);
1494   auto *ClassDecl =
1495       cast<CXXRecordDecl>(SrcRecordTy->castAs<RecordType>()->getDecl());
1496   llvm::Value *OffsetToTop;
1497   if (CGM.getItaniumVTableContext().isRelativeLayout()) {
1498     // Get the vtable pointer.
1499     llvm::Value *VTable =
1500         CGF.GetVTablePtr(ThisAddr, CGM.Int32Ty->getPointerTo(), ClassDecl);
1501 
1502     // Get the offset-to-top from the vtable.
1503     OffsetToTop =
1504         CGF.Builder.CreateConstInBoundsGEP1_32(CGM.Int32Ty, VTable, -2U);
1505     OffsetToTop = CGF.Builder.CreateAlignedLoad(
1506         CGM.Int32Ty, OffsetToTop, CharUnits::fromQuantity(4), "offset.to.top");
1507   } else {
1508     llvm::Type *PtrDiffLTy =
1509         CGF.ConvertType(CGF.getContext().getPointerDiffType());
1510 
1511     // Get the vtable pointer.
1512     llvm::Value *VTable =
1513         CGF.GetVTablePtr(ThisAddr, PtrDiffLTy->getPointerTo(), ClassDecl);
1514 
1515     // Get the offset-to-top from the vtable.
1516     OffsetToTop =
1517         CGF.Builder.CreateConstInBoundsGEP1_64(PtrDiffLTy, VTable, -2ULL);
1518     OffsetToTop = CGF.Builder.CreateAlignedLoad(
1519         PtrDiffLTy, OffsetToTop, CGF.getPointerAlign(), "offset.to.top");
1520   }
1521   // Finally, add the offset to the pointer.
1522   llvm::Value *Value = ThisAddr.getPointer();
1523   Value = CGF.EmitCastToVoidPtr(Value);
1524   Value = CGF.Builder.CreateInBoundsGEP(CGF.Int8Ty, Value, OffsetToTop);
1525   return CGF.Builder.CreateBitCast(Value, DestLTy);
1526 }
1527 
1528 bool ItaniumCXXABI::EmitBadCastCall(CodeGenFunction &CGF) {
1529   llvm::FunctionCallee Fn = getBadCastFn(CGF);
1530   llvm::CallBase *Call = CGF.EmitRuntimeCallOrInvoke(Fn);
1531   Call->setDoesNotReturn();
1532   CGF.Builder.CreateUnreachable();
1533   return true;
1534 }
1535 
1536 llvm::Value *
1537 ItaniumCXXABI::GetVirtualBaseClassOffset(CodeGenFunction &CGF,
1538                                          Address This,
1539                                          const CXXRecordDecl *ClassDecl,
1540                                          const CXXRecordDecl *BaseClassDecl) {
1541   llvm::Value *VTablePtr = CGF.GetVTablePtr(This, CGM.Int8PtrTy, ClassDecl);
1542   CharUnits VBaseOffsetOffset =
1543       CGM.getItaniumVTableContext().getVirtualBaseOffsetOffset(ClassDecl,
1544                                                                BaseClassDecl);
1545   llvm::Value *VBaseOffsetPtr =
1546     CGF.Builder.CreateConstGEP1_64(
1547         CGF.Int8Ty, VTablePtr, VBaseOffsetOffset.getQuantity(),
1548         "vbase.offset.ptr");
1549 
1550   llvm::Value *VBaseOffset;
1551   if (CGM.getItaniumVTableContext().isRelativeLayout()) {
1552     VBaseOffsetPtr =
1553         CGF.Builder.CreateBitCast(VBaseOffsetPtr, CGF.Int32Ty->getPointerTo());
1554     VBaseOffset = CGF.Builder.CreateAlignedLoad(
1555         CGF.Int32Ty, VBaseOffsetPtr, CharUnits::fromQuantity(4),
1556         "vbase.offset");
1557   } else {
1558     VBaseOffsetPtr = CGF.Builder.CreateBitCast(VBaseOffsetPtr,
1559                                                CGM.PtrDiffTy->getPointerTo());
1560     VBaseOffset = CGF.Builder.CreateAlignedLoad(
1561         CGM.PtrDiffTy, VBaseOffsetPtr, CGF.getPointerAlign(), "vbase.offset");
1562   }
1563   return VBaseOffset;
1564 }
1565 
1566 void ItaniumCXXABI::EmitCXXConstructors(const CXXConstructorDecl *D) {
1567   // Just make sure we're in sync with TargetCXXABI.
1568   assert(CGM.getTarget().getCXXABI().hasConstructorVariants());
1569 
1570   // The constructor used for constructing this as a base class;
1571   // ignores virtual bases.
1572   CGM.EmitGlobal(GlobalDecl(D, Ctor_Base));
1573 
1574   // The constructor used for constructing this as a complete class;
1575   // constructs the virtual bases, then calls the base constructor.
1576   if (!D->getParent()->isAbstract()) {
1577     // We don't need to emit the complete ctor if the class is abstract.
1578     CGM.EmitGlobal(GlobalDecl(D, Ctor_Complete));
1579   }
1580 }
1581 
1582 CGCXXABI::AddedStructorArgCounts
1583 ItaniumCXXABI::buildStructorSignature(GlobalDecl GD,
1584                                       SmallVectorImpl<CanQualType> &ArgTys) {
1585   ASTContext &Context = getContext();
1586 
1587   // All parameters are already in place except VTT, which goes after 'this'.
1588   // These are Clang types, so we don't need to worry about sret yet.
1589 
1590   // Check if we need to add a VTT parameter (which has type void **).
1591   if ((isa<CXXConstructorDecl>(GD.getDecl()) ? GD.getCtorType() == Ctor_Base
1592                                              : GD.getDtorType() == Dtor_Base) &&
1593       cast<CXXMethodDecl>(GD.getDecl())->getParent()->getNumVBases() != 0) {
1594     ArgTys.insert(ArgTys.begin() + 1,
1595                   Context.getPointerType(Context.VoidPtrTy));
1596     return AddedStructorArgCounts::prefix(1);
1597   }
1598   return AddedStructorArgCounts{};
1599 }
1600 
1601 void ItaniumCXXABI::EmitCXXDestructors(const CXXDestructorDecl *D) {
1602   // The destructor used for destructing this as a base class; ignores
1603   // virtual bases.
1604   CGM.EmitGlobal(GlobalDecl(D, Dtor_Base));
1605 
1606   // The destructor used for destructing this as a most-derived class;
1607   // call the base destructor and then destructs any virtual bases.
1608   CGM.EmitGlobal(GlobalDecl(D, Dtor_Complete));
1609 
1610   // The destructor in a virtual table is always a 'deleting'
1611   // destructor, which calls the complete destructor and then uses the
1612   // appropriate operator delete.
1613   if (D->isVirtual())
1614     CGM.EmitGlobal(GlobalDecl(D, Dtor_Deleting));
1615 }
1616 
1617 void ItaniumCXXABI::addImplicitStructorParams(CodeGenFunction &CGF,
1618                                               QualType &ResTy,
1619                                               FunctionArgList &Params) {
1620   const CXXMethodDecl *MD = cast<CXXMethodDecl>(CGF.CurGD.getDecl());
1621   assert(isa<CXXConstructorDecl>(MD) || isa<CXXDestructorDecl>(MD));
1622 
1623   // Check if we need a VTT parameter as well.
1624   if (NeedsVTTParameter(CGF.CurGD)) {
1625     ASTContext &Context = getContext();
1626 
1627     // FIXME: avoid the fake decl
1628     QualType T = Context.getPointerType(Context.VoidPtrTy);
1629     auto *VTTDecl = ImplicitParamDecl::Create(
1630         Context, /*DC=*/nullptr, MD->getLocation(), &Context.Idents.get("vtt"),
1631         T, ImplicitParamDecl::CXXVTT);
1632     Params.insert(Params.begin() + 1, VTTDecl);
1633     getStructorImplicitParamDecl(CGF) = VTTDecl;
1634   }
1635 }
1636 
1637 void ItaniumCXXABI::EmitInstanceFunctionProlog(CodeGenFunction &CGF) {
1638   // Naked functions have no prolog.
1639   if (CGF.CurFuncDecl && CGF.CurFuncDecl->hasAttr<NakedAttr>())
1640     return;
1641 
1642   /// Initialize the 'this' slot. In the Itanium C++ ABI, no prologue
1643   /// adjustments are required, because they are all handled by thunks.
1644   setCXXABIThisValue(CGF, loadIncomingCXXThis(CGF));
1645 
1646   /// Initialize the 'vtt' slot if needed.
1647   if (getStructorImplicitParamDecl(CGF)) {
1648     getStructorImplicitParamValue(CGF) = CGF.Builder.CreateLoad(
1649         CGF.GetAddrOfLocalVar(getStructorImplicitParamDecl(CGF)), "vtt");
1650   }
1651 
1652   /// If this is a function that the ABI specifies returns 'this', initialize
1653   /// the return slot to 'this' at the start of the function.
1654   ///
1655   /// Unlike the setting of return types, this is done within the ABI
1656   /// implementation instead of by clients of CGCXXABI because:
1657   /// 1) getThisValue is currently protected
1658   /// 2) in theory, an ABI could implement 'this' returns some other way;
1659   ///    HasThisReturn only specifies a contract, not the implementation
1660   if (HasThisReturn(CGF.CurGD))
1661     CGF.Builder.CreateStore(getThisValue(CGF), CGF.ReturnValue);
1662 }
1663 
1664 CGCXXABI::AddedStructorArgs ItaniumCXXABI::getImplicitConstructorArgs(
1665     CodeGenFunction &CGF, const CXXConstructorDecl *D, CXXCtorType Type,
1666     bool ForVirtualBase, bool Delegating) {
1667   if (!NeedsVTTParameter(GlobalDecl(D, Type)))
1668     return AddedStructorArgs{};
1669 
1670   // Insert the implicit 'vtt' argument as the second argument.
1671   llvm::Value *VTT =
1672       CGF.GetVTTParameter(GlobalDecl(D, Type), ForVirtualBase, Delegating);
1673   QualType VTTTy = getContext().getPointerType(getContext().VoidPtrTy);
1674   return AddedStructorArgs::prefix({{VTT, VTTTy}});
1675 }
1676 
1677 llvm::Value *ItaniumCXXABI::getCXXDestructorImplicitParam(
1678     CodeGenFunction &CGF, const CXXDestructorDecl *DD, CXXDtorType Type,
1679     bool ForVirtualBase, bool Delegating) {
1680   GlobalDecl GD(DD, Type);
1681   return CGF.GetVTTParameter(GD, ForVirtualBase, Delegating);
1682 }
1683 
1684 void ItaniumCXXABI::EmitDestructorCall(CodeGenFunction &CGF,
1685                                        const CXXDestructorDecl *DD,
1686                                        CXXDtorType Type, bool ForVirtualBase,
1687                                        bool Delegating, Address This,
1688                                        QualType ThisTy) {
1689   GlobalDecl GD(DD, Type);
1690   llvm::Value *VTT =
1691       getCXXDestructorImplicitParam(CGF, DD, Type, ForVirtualBase, Delegating);
1692   QualType VTTTy = getContext().getPointerType(getContext().VoidPtrTy);
1693 
1694   CGCallee Callee;
1695   if (getContext().getLangOpts().AppleKext &&
1696       Type != Dtor_Base && DD->isVirtual())
1697     Callee = CGF.BuildAppleKextVirtualDestructorCall(DD, Type, DD->getParent());
1698   else
1699     Callee = CGCallee::forDirect(CGM.getAddrOfCXXStructor(GD), GD);
1700 
1701   CGF.EmitCXXDestructorCall(GD, Callee, This.getPointer(), ThisTy, VTT, VTTTy,
1702                             nullptr);
1703 }
1704 
1705 void ItaniumCXXABI::emitVTableDefinitions(CodeGenVTables &CGVT,
1706                                           const CXXRecordDecl *RD) {
1707   llvm::GlobalVariable *VTable = getAddrOfVTable(RD, CharUnits());
1708   if (VTable->hasInitializer())
1709     return;
1710 
1711   ItaniumVTableContext &VTContext = CGM.getItaniumVTableContext();
1712   const VTableLayout &VTLayout = VTContext.getVTableLayout(RD);
1713   llvm::GlobalVariable::LinkageTypes Linkage = CGM.getVTableLinkage(RD);
1714   llvm::Constant *RTTI =
1715       CGM.GetAddrOfRTTIDescriptor(CGM.getContext().getTagDeclType(RD));
1716 
1717   // Create and set the initializer.
1718   ConstantInitBuilder builder(CGM);
1719   auto components = builder.beginStruct();
1720   CGVT.createVTableInitializer(components, VTLayout, RTTI,
1721                                llvm::GlobalValue::isLocalLinkage(Linkage));
1722   components.finishAndSetAsInitializer(VTable);
1723 
1724   // Set the correct linkage.
1725   VTable->setLinkage(Linkage);
1726 
1727   if (CGM.supportsCOMDAT() && VTable->isWeakForLinker())
1728     VTable->setComdat(CGM.getModule().getOrInsertComdat(VTable->getName()));
1729 
1730   // Set the right visibility.
1731   CGM.setGVProperties(VTable, RD);
1732 
1733   // If this is the magic class __cxxabiv1::__fundamental_type_info,
1734   // we will emit the typeinfo for the fundamental types. This is the
1735   // same behaviour as GCC.
1736   const DeclContext *DC = RD->getDeclContext();
1737   if (RD->getIdentifier() &&
1738       RD->getIdentifier()->isStr("__fundamental_type_info") &&
1739       isa<NamespaceDecl>(DC) && cast<NamespaceDecl>(DC)->getIdentifier() &&
1740       cast<NamespaceDecl>(DC)->getIdentifier()->isStr("__cxxabiv1") &&
1741       DC->getParent()->isTranslationUnit())
1742     EmitFundamentalRTTIDescriptors(RD);
1743 
1744   // Always emit type metadata on non-available_externally definitions, and on
1745   // available_externally definitions if we are performing whole program
1746   // devirtualization. For WPD we need the type metadata on all vtable
1747   // definitions to ensure we associate derived classes with base classes
1748   // defined in headers but with a strong definition only in a shared library.
1749   if (!VTable->isDeclarationForLinker() ||
1750       CGM.getCodeGenOpts().WholeProgramVTables) {
1751     CGM.EmitVTableTypeMetadata(RD, VTable, VTLayout);
1752     // For available_externally definitions, add the vtable to
1753     // @llvm.compiler.used so that it isn't deleted before whole program
1754     // analysis.
1755     if (VTable->isDeclarationForLinker()) {
1756       assert(CGM.getCodeGenOpts().WholeProgramVTables);
1757       CGM.addCompilerUsedGlobal(VTable);
1758     }
1759   }
1760 
1761   if (VTContext.isRelativeLayout()) {
1762     CGVT.RemoveHwasanMetadata(VTable);
1763     if (!VTable->isDSOLocal())
1764       CGVT.GenerateRelativeVTableAlias(VTable, VTable->getName());
1765   }
1766 }
1767 
1768 bool ItaniumCXXABI::isVirtualOffsetNeededForVTableField(
1769     CodeGenFunction &CGF, CodeGenFunction::VPtr Vptr) {
1770   if (Vptr.NearestVBase == nullptr)
1771     return false;
1772   return NeedsVTTParameter(CGF.CurGD);
1773 }
1774 
1775 llvm::Value *ItaniumCXXABI::getVTableAddressPointInStructor(
1776     CodeGenFunction &CGF, const CXXRecordDecl *VTableClass, BaseSubobject Base,
1777     const CXXRecordDecl *NearestVBase) {
1778 
1779   if ((Base.getBase()->getNumVBases() || NearestVBase != nullptr) &&
1780       NeedsVTTParameter(CGF.CurGD)) {
1781     return getVTableAddressPointInStructorWithVTT(CGF, VTableClass, Base,
1782                                                   NearestVBase);
1783   }
1784   return getVTableAddressPoint(Base, VTableClass);
1785 }
1786 
1787 llvm::Constant *
1788 ItaniumCXXABI::getVTableAddressPoint(BaseSubobject Base,
1789                                      const CXXRecordDecl *VTableClass) {
1790   llvm::GlobalValue *VTable = getAddrOfVTable(VTableClass, CharUnits());
1791 
1792   // Find the appropriate vtable within the vtable group, and the address point
1793   // within that vtable.
1794   VTableLayout::AddressPointLocation AddressPoint =
1795       CGM.getItaniumVTableContext()
1796           .getVTableLayout(VTableClass)
1797           .getAddressPoint(Base);
1798   llvm::Value *Indices[] = {
1799     llvm::ConstantInt::get(CGM.Int32Ty, 0),
1800     llvm::ConstantInt::get(CGM.Int32Ty, AddressPoint.VTableIndex),
1801     llvm::ConstantInt::get(CGM.Int32Ty, AddressPoint.AddressPointIndex),
1802   };
1803 
1804   return llvm::ConstantExpr::getGetElementPtr(VTable->getValueType(), VTable,
1805                                               Indices, /*InBounds=*/true,
1806                                               /*InRangeIndex=*/1);
1807 }
1808 
1809 // Check whether all the non-inline virtual methods for the class have the
1810 // specified attribute.
1811 template <typename T>
1812 static bool CXXRecordAllNonInlineVirtualsHaveAttr(const CXXRecordDecl *RD) {
1813   bool FoundNonInlineVirtualMethodWithAttr = false;
1814   for (const auto *D : RD->noload_decls()) {
1815     if (const auto *FD = dyn_cast<FunctionDecl>(D)) {
1816       if (!FD->isVirtualAsWritten() || FD->isInlineSpecified() ||
1817           FD->doesThisDeclarationHaveABody())
1818         continue;
1819       if (!D->hasAttr<T>())
1820         return false;
1821       FoundNonInlineVirtualMethodWithAttr = true;
1822     }
1823   }
1824 
1825   // We didn't find any non-inline virtual methods missing the attribute.  We
1826   // will return true when we found at least one non-inline virtual with the
1827   // attribute.  (This lets our caller know that the attribute needs to be
1828   // propagated up to the vtable.)
1829   return FoundNonInlineVirtualMethodWithAttr;
1830 }
1831 
1832 llvm::Value *ItaniumCXXABI::getVTableAddressPointInStructorWithVTT(
1833     CodeGenFunction &CGF, const CXXRecordDecl *VTableClass, BaseSubobject Base,
1834     const CXXRecordDecl *NearestVBase) {
1835   assert((Base.getBase()->getNumVBases() || NearestVBase != nullptr) &&
1836          NeedsVTTParameter(CGF.CurGD) && "This class doesn't have VTT");
1837 
1838   // Get the secondary vpointer index.
1839   uint64_t VirtualPointerIndex =
1840       CGM.getVTables().getSecondaryVirtualPointerIndex(VTableClass, Base);
1841 
1842   /// Load the VTT.
1843   llvm::Value *VTT = CGF.LoadCXXVTT();
1844   if (VirtualPointerIndex)
1845     VTT = CGF.Builder.CreateConstInBoundsGEP1_64(
1846         CGF.VoidPtrTy, VTT, VirtualPointerIndex);
1847 
1848   // And load the address point from the VTT.
1849   return CGF.Builder.CreateAlignedLoad(CGF.VoidPtrTy, VTT,
1850                                        CGF.getPointerAlign());
1851 }
1852 
1853 llvm::Constant *ItaniumCXXABI::getVTableAddressPointForConstExpr(
1854     BaseSubobject Base, const CXXRecordDecl *VTableClass) {
1855   return getVTableAddressPoint(Base, VTableClass);
1856 }
1857 
1858 llvm::GlobalVariable *ItaniumCXXABI::getAddrOfVTable(const CXXRecordDecl *RD,
1859                                                      CharUnits VPtrOffset) {
1860   assert(VPtrOffset.isZero() && "Itanium ABI only supports zero vptr offsets");
1861 
1862   llvm::GlobalVariable *&VTable = VTables[RD];
1863   if (VTable)
1864     return VTable;
1865 
1866   // Queue up this vtable for possible deferred emission.
1867   CGM.addDeferredVTable(RD);
1868 
1869   SmallString<256> Name;
1870   llvm::raw_svector_ostream Out(Name);
1871   getMangleContext().mangleCXXVTable(RD, Out);
1872 
1873   const VTableLayout &VTLayout =
1874       CGM.getItaniumVTableContext().getVTableLayout(RD);
1875   llvm::Type *VTableType = CGM.getVTables().getVTableType(VTLayout);
1876 
1877   // Use pointer alignment for the vtable. Otherwise we would align them based
1878   // on the size of the initializer which doesn't make sense as only single
1879   // values are read.
1880   unsigned PAlign = CGM.getItaniumVTableContext().isRelativeLayout()
1881                         ? 32
1882                         : CGM.getTarget().getPointerAlign(LangAS::Default);
1883 
1884   VTable = CGM.CreateOrReplaceCXXRuntimeVariable(
1885       Name, VTableType, llvm::GlobalValue::ExternalLinkage,
1886       getContext().toCharUnitsFromBits(PAlign).getAsAlign());
1887   VTable->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
1888 
1889   // In MS C++ if you have a class with virtual functions in which you are using
1890   // selective member import/export, then all virtual functions must be exported
1891   // unless they are inline, otherwise a link error will result. To match this
1892   // behavior, for such classes, we dllimport the vtable if it is defined
1893   // externally and all the non-inline virtual methods are marked dllimport, and
1894   // we dllexport the vtable if it is defined in this TU and all the non-inline
1895   // virtual methods are marked dllexport.
1896   if (CGM.getTarget().hasPS4DLLImportExport()) {
1897     if ((!RD->hasAttr<DLLImportAttr>()) && (!RD->hasAttr<DLLExportAttr>())) {
1898       if (CGM.getVTables().isVTableExternal(RD)) {
1899         if (CXXRecordAllNonInlineVirtualsHaveAttr<DLLImportAttr>(RD))
1900           VTable->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
1901       } else {
1902         if (CXXRecordAllNonInlineVirtualsHaveAttr<DLLExportAttr>(RD))
1903           VTable->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
1904       }
1905     }
1906   }
1907   CGM.setGVProperties(VTable, RD);
1908 
1909   return VTable;
1910 }
1911 
1912 CGCallee ItaniumCXXABI::getVirtualFunctionPointer(CodeGenFunction &CGF,
1913                                                   GlobalDecl GD,
1914                                                   Address This,
1915                                                   llvm::Type *Ty,
1916                                                   SourceLocation Loc) {
1917   llvm::Type *TyPtr = Ty->getPointerTo();
1918   auto *MethodDecl = cast<CXXMethodDecl>(GD.getDecl());
1919   llvm::Value *VTable = CGF.GetVTablePtr(
1920       This, TyPtr->getPointerTo(), MethodDecl->getParent());
1921 
1922   uint64_t VTableIndex = CGM.getItaniumVTableContext().getMethodVTableIndex(GD);
1923   llvm::Value *VFunc;
1924   if (CGF.ShouldEmitVTableTypeCheckedLoad(MethodDecl->getParent())) {
1925     VFunc = CGF.EmitVTableTypeCheckedLoad(
1926         MethodDecl->getParent(), VTable, TyPtr,
1927         VTableIndex *
1928             CGM.getContext().getTargetInfo().getPointerWidth(LangAS::Default) /
1929             8);
1930   } else {
1931     CGF.EmitTypeMetadataCodeForVCall(MethodDecl->getParent(), VTable, Loc);
1932 
1933     llvm::Value *VFuncLoad;
1934     if (CGM.getItaniumVTableContext().isRelativeLayout()) {
1935       VTable = CGF.Builder.CreateBitCast(VTable, CGM.Int8PtrTy);
1936       llvm::Value *Load = CGF.Builder.CreateCall(
1937           CGM.getIntrinsic(llvm::Intrinsic::load_relative, {CGM.Int32Ty}),
1938           {VTable, llvm::ConstantInt::get(CGM.Int32Ty, 4 * VTableIndex)});
1939       VFuncLoad = CGF.Builder.CreateBitCast(Load, TyPtr);
1940     } else {
1941       VTable =
1942           CGF.Builder.CreateBitCast(VTable, TyPtr->getPointerTo());
1943       llvm::Value *VTableSlotPtr = CGF.Builder.CreateConstInBoundsGEP1_64(
1944           TyPtr, VTable, VTableIndex, "vfn");
1945       VFuncLoad =
1946           CGF.Builder.CreateAlignedLoad(TyPtr, VTableSlotPtr,
1947                                         CGF.getPointerAlign());
1948     }
1949 
1950     // Add !invariant.load md to virtual function load to indicate that
1951     // function didn't change inside vtable.
1952     // It's safe to add it without -fstrict-vtable-pointers, but it would not
1953     // help in devirtualization because it will only matter if we will have 2
1954     // the same virtual function loads from the same vtable load, which won't
1955     // happen without enabled devirtualization with -fstrict-vtable-pointers.
1956     if (CGM.getCodeGenOpts().OptimizationLevel > 0 &&
1957         CGM.getCodeGenOpts().StrictVTablePointers) {
1958       if (auto *VFuncLoadInstr = dyn_cast<llvm::Instruction>(VFuncLoad)) {
1959         VFuncLoadInstr->setMetadata(
1960             llvm::LLVMContext::MD_invariant_load,
1961             llvm::MDNode::get(CGM.getLLVMContext(),
1962                               llvm::ArrayRef<llvm::Metadata *>()));
1963       }
1964     }
1965     VFunc = VFuncLoad;
1966   }
1967 
1968   CGCallee Callee(GD, VFunc);
1969   return Callee;
1970 }
1971 
1972 llvm::Value *ItaniumCXXABI::EmitVirtualDestructorCall(
1973     CodeGenFunction &CGF, const CXXDestructorDecl *Dtor, CXXDtorType DtorType,
1974     Address This, DeleteOrMemberCallExpr E) {
1975   auto *CE = E.dyn_cast<const CXXMemberCallExpr *>();
1976   auto *D = E.dyn_cast<const CXXDeleteExpr *>();
1977   assert((CE != nullptr) ^ (D != nullptr));
1978   assert(CE == nullptr || CE->arg_begin() == CE->arg_end());
1979   assert(DtorType == Dtor_Deleting || DtorType == Dtor_Complete);
1980 
1981   GlobalDecl GD(Dtor, DtorType);
1982   const CGFunctionInfo *FInfo =
1983       &CGM.getTypes().arrangeCXXStructorDeclaration(GD);
1984   llvm::FunctionType *Ty = CGF.CGM.getTypes().GetFunctionType(*FInfo);
1985   CGCallee Callee = CGCallee::forVirtual(CE, GD, This, Ty);
1986 
1987   QualType ThisTy;
1988   if (CE) {
1989     ThisTy = CE->getObjectType();
1990   } else {
1991     ThisTy = D->getDestroyedType();
1992   }
1993 
1994   CGF.EmitCXXDestructorCall(GD, Callee, This.getPointer(), ThisTy, nullptr,
1995                             QualType(), nullptr);
1996   return nullptr;
1997 }
1998 
1999 void ItaniumCXXABI::emitVirtualInheritanceTables(const CXXRecordDecl *RD) {
2000   CodeGenVTables &VTables = CGM.getVTables();
2001   llvm::GlobalVariable *VTT = VTables.GetAddrOfVTT(RD);
2002   VTables.EmitVTTDefinition(VTT, CGM.getVTableLinkage(RD), RD);
2003 }
2004 
2005 bool ItaniumCXXABI::canSpeculativelyEmitVTableAsBaseClass(
2006     const CXXRecordDecl *RD) const {
2007   // We don't emit available_externally vtables if we are in -fapple-kext mode
2008   // because kext mode does not permit devirtualization.
2009   if (CGM.getLangOpts().AppleKext)
2010     return false;
2011 
2012   // If the vtable is hidden then it is not safe to emit an available_externally
2013   // copy of vtable.
2014   if (isVTableHidden(RD))
2015     return false;
2016 
2017   if (CGM.getCodeGenOpts().ForceEmitVTables)
2018     return true;
2019 
2020   // If we don't have any not emitted inline virtual function then we are safe
2021   // to emit an available_externally copy of vtable.
2022   // FIXME we can still emit a copy of the vtable if we
2023   // can emit definition of the inline functions.
2024   if (hasAnyUnusedVirtualInlineFunction(RD))
2025     return false;
2026 
2027   // For a class with virtual bases, we must also be able to speculatively
2028   // emit the VTT, because CodeGen doesn't have separate notions of "can emit
2029   // the vtable" and "can emit the VTT". For a base subobject, this means we
2030   // need to be able to emit non-virtual base vtables.
2031   if (RD->getNumVBases()) {
2032     for (const auto &B : RD->bases()) {
2033       auto *BRD = B.getType()->getAsCXXRecordDecl();
2034       assert(BRD && "no class for base specifier");
2035       if (B.isVirtual() || !BRD->isDynamicClass())
2036         continue;
2037       if (!canSpeculativelyEmitVTableAsBaseClass(BRD))
2038         return false;
2039     }
2040   }
2041 
2042   return true;
2043 }
2044 
2045 bool ItaniumCXXABI::canSpeculativelyEmitVTable(const CXXRecordDecl *RD) const {
2046   if (!canSpeculativelyEmitVTableAsBaseClass(RD))
2047     return false;
2048 
2049   // For a complete-object vtable (or more specifically, for the VTT), we need
2050   // to be able to speculatively emit the vtables of all dynamic virtual bases.
2051   for (const auto &B : RD->vbases()) {
2052     auto *BRD = B.getType()->getAsCXXRecordDecl();
2053     assert(BRD && "no class for base specifier");
2054     if (!BRD->isDynamicClass())
2055       continue;
2056     if (!canSpeculativelyEmitVTableAsBaseClass(BRD))
2057       return false;
2058   }
2059 
2060   return true;
2061 }
2062 static llvm::Value *performTypeAdjustment(CodeGenFunction &CGF,
2063                                           Address InitialPtr,
2064                                           int64_t NonVirtualAdjustment,
2065                                           int64_t VirtualAdjustment,
2066                                           bool IsReturnAdjustment) {
2067   if (!NonVirtualAdjustment && !VirtualAdjustment)
2068     return InitialPtr.getPointer();
2069 
2070   Address V = CGF.Builder.CreateElementBitCast(InitialPtr, CGF.Int8Ty);
2071 
2072   // In a base-to-derived cast, the non-virtual adjustment is applied first.
2073   if (NonVirtualAdjustment && !IsReturnAdjustment) {
2074     V = CGF.Builder.CreateConstInBoundsByteGEP(V,
2075                               CharUnits::fromQuantity(NonVirtualAdjustment));
2076   }
2077 
2078   // Perform the virtual adjustment if we have one.
2079   llvm::Value *ResultPtr;
2080   if (VirtualAdjustment) {
2081     Address VTablePtrPtr = CGF.Builder.CreateElementBitCast(V, CGF.Int8PtrTy);
2082     llvm::Value *VTablePtr = CGF.Builder.CreateLoad(VTablePtrPtr);
2083 
2084     llvm::Value *Offset;
2085     llvm::Value *OffsetPtr = CGF.Builder.CreateConstInBoundsGEP1_64(
2086         CGF.Int8Ty, VTablePtr, VirtualAdjustment);
2087     if (CGF.CGM.getItaniumVTableContext().isRelativeLayout()) {
2088       // Load the adjustment offset from the vtable as a 32-bit int.
2089       OffsetPtr =
2090           CGF.Builder.CreateBitCast(OffsetPtr, CGF.Int32Ty->getPointerTo());
2091       Offset =
2092           CGF.Builder.CreateAlignedLoad(CGF.Int32Ty, OffsetPtr,
2093                                         CharUnits::fromQuantity(4));
2094     } else {
2095       llvm::Type *PtrDiffTy =
2096           CGF.ConvertType(CGF.getContext().getPointerDiffType());
2097 
2098       OffsetPtr =
2099           CGF.Builder.CreateBitCast(OffsetPtr, PtrDiffTy->getPointerTo());
2100 
2101       // Load the adjustment offset from the vtable.
2102       Offset = CGF.Builder.CreateAlignedLoad(PtrDiffTy, OffsetPtr,
2103                                              CGF.getPointerAlign());
2104     }
2105     // Adjust our pointer.
2106     ResultPtr = CGF.Builder.CreateInBoundsGEP(
2107         V.getElementType(), V.getPointer(), Offset);
2108   } else {
2109     ResultPtr = V.getPointer();
2110   }
2111 
2112   // In a derived-to-base conversion, the non-virtual adjustment is
2113   // applied second.
2114   if (NonVirtualAdjustment && IsReturnAdjustment) {
2115     ResultPtr = CGF.Builder.CreateConstInBoundsGEP1_64(CGF.Int8Ty, ResultPtr,
2116                                                        NonVirtualAdjustment);
2117   }
2118 
2119   // Cast back to the original type.
2120   return CGF.Builder.CreateBitCast(ResultPtr, InitialPtr.getType());
2121 }
2122 
2123 llvm::Value *ItaniumCXXABI::performThisAdjustment(CodeGenFunction &CGF,
2124                                                   Address This,
2125                                                   const ThisAdjustment &TA) {
2126   return performTypeAdjustment(CGF, This, TA.NonVirtual,
2127                                TA.Virtual.Itanium.VCallOffsetOffset,
2128                                /*IsReturnAdjustment=*/false);
2129 }
2130 
2131 llvm::Value *
2132 ItaniumCXXABI::performReturnAdjustment(CodeGenFunction &CGF, Address Ret,
2133                                        const ReturnAdjustment &RA) {
2134   return performTypeAdjustment(CGF, Ret, RA.NonVirtual,
2135                                RA.Virtual.Itanium.VBaseOffsetOffset,
2136                                /*IsReturnAdjustment=*/true);
2137 }
2138 
2139 void ARMCXXABI::EmitReturnFromThunk(CodeGenFunction &CGF,
2140                                     RValue RV, QualType ResultType) {
2141   if (!isa<CXXDestructorDecl>(CGF.CurGD.getDecl()))
2142     return ItaniumCXXABI::EmitReturnFromThunk(CGF, RV, ResultType);
2143 
2144   // Destructor thunks in the ARM ABI have indeterminate results.
2145   llvm::Type *T = CGF.ReturnValue.getElementType();
2146   RValue Undef = RValue::get(llvm::UndefValue::get(T));
2147   return ItaniumCXXABI::EmitReturnFromThunk(CGF, Undef, ResultType);
2148 }
2149 
2150 /************************** Array allocation cookies **************************/
2151 
2152 CharUnits ItaniumCXXABI::getArrayCookieSizeImpl(QualType elementType) {
2153   // The array cookie is a size_t; pad that up to the element alignment.
2154   // The cookie is actually right-justified in that space.
2155   return std::max(CharUnits::fromQuantity(CGM.SizeSizeInBytes),
2156                   CGM.getContext().getPreferredTypeAlignInChars(elementType));
2157 }
2158 
2159 Address ItaniumCXXABI::InitializeArrayCookie(CodeGenFunction &CGF,
2160                                              Address NewPtr,
2161                                              llvm::Value *NumElements,
2162                                              const CXXNewExpr *expr,
2163                                              QualType ElementType) {
2164   assert(requiresArrayCookie(expr));
2165 
2166   unsigned AS = NewPtr.getAddressSpace();
2167 
2168   ASTContext &Ctx = getContext();
2169   CharUnits SizeSize = CGF.getSizeSize();
2170 
2171   // The size of the cookie.
2172   CharUnits CookieSize =
2173       std::max(SizeSize, Ctx.getPreferredTypeAlignInChars(ElementType));
2174   assert(CookieSize == getArrayCookieSizeImpl(ElementType));
2175 
2176   // Compute an offset to the cookie.
2177   Address CookiePtr = NewPtr;
2178   CharUnits CookieOffset = CookieSize - SizeSize;
2179   if (!CookieOffset.isZero())
2180     CookiePtr = CGF.Builder.CreateConstInBoundsByteGEP(CookiePtr, CookieOffset);
2181 
2182   // Write the number of elements into the appropriate slot.
2183   Address NumElementsPtr =
2184       CGF.Builder.CreateElementBitCast(CookiePtr, CGF.SizeTy);
2185   llvm::Instruction *SI = CGF.Builder.CreateStore(NumElements, NumElementsPtr);
2186 
2187   // Handle the array cookie specially in ASan.
2188   if (CGM.getLangOpts().Sanitize.has(SanitizerKind::Address) && AS == 0 &&
2189       (expr->getOperatorNew()->isReplaceableGlobalAllocationFunction() ||
2190        CGM.getCodeGenOpts().SanitizeAddressPoisonCustomArrayCookie)) {
2191     // The store to the CookiePtr does not need to be instrumented.
2192     CGM.getSanitizerMetadata()->disableSanitizerForInstruction(SI);
2193     llvm::FunctionType *FTy =
2194         llvm::FunctionType::get(CGM.VoidTy, NumElementsPtr.getType(), false);
2195     llvm::FunctionCallee F =
2196         CGM.CreateRuntimeFunction(FTy, "__asan_poison_cxx_array_cookie");
2197     CGF.Builder.CreateCall(F, NumElementsPtr.getPointer());
2198   }
2199 
2200   // Finally, compute a pointer to the actual data buffer by skipping
2201   // over the cookie completely.
2202   return CGF.Builder.CreateConstInBoundsByteGEP(NewPtr, CookieSize);
2203 }
2204 
2205 llvm::Value *ItaniumCXXABI::readArrayCookieImpl(CodeGenFunction &CGF,
2206                                                 Address allocPtr,
2207                                                 CharUnits cookieSize) {
2208   // The element size is right-justified in the cookie.
2209   Address numElementsPtr = allocPtr;
2210   CharUnits numElementsOffset = cookieSize - CGF.getSizeSize();
2211   if (!numElementsOffset.isZero())
2212     numElementsPtr =
2213       CGF.Builder.CreateConstInBoundsByteGEP(numElementsPtr, numElementsOffset);
2214 
2215   unsigned AS = allocPtr.getAddressSpace();
2216   numElementsPtr = CGF.Builder.CreateElementBitCast(numElementsPtr, CGF.SizeTy);
2217   if (!CGM.getLangOpts().Sanitize.has(SanitizerKind::Address) || AS != 0)
2218     return CGF.Builder.CreateLoad(numElementsPtr);
2219   // In asan mode emit a function call instead of a regular load and let the
2220   // run-time deal with it: if the shadow is properly poisoned return the
2221   // cookie, otherwise return 0 to avoid an infinite loop calling DTORs.
2222   // We can't simply ignore this load using nosanitize metadata because
2223   // the metadata may be lost.
2224   llvm::FunctionType *FTy =
2225       llvm::FunctionType::get(CGF.SizeTy, CGF.SizeTy->getPointerTo(0), false);
2226   llvm::FunctionCallee F =
2227       CGM.CreateRuntimeFunction(FTy, "__asan_load_cxx_array_cookie");
2228   return CGF.Builder.CreateCall(F, numElementsPtr.getPointer());
2229 }
2230 
2231 CharUnits ARMCXXABI::getArrayCookieSizeImpl(QualType elementType) {
2232   // ARM says that the cookie is always:
2233   //   struct array_cookie {
2234   //     std::size_t element_size; // element_size != 0
2235   //     std::size_t element_count;
2236   //   };
2237   // But the base ABI doesn't give anything an alignment greater than
2238   // 8, so we can dismiss this as typical ABI-author blindness to
2239   // actual language complexity and round up to the element alignment.
2240   return std::max(CharUnits::fromQuantity(2 * CGM.SizeSizeInBytes),
2241                   CGM.getContext().getTypeAlignInChars(elementType));
2242 }
2243 
2244 Address ARMCXXABI::InitializeArrayCookie(CodeGenFunction &CGF,
2245                                          Address newPtr,
2246                                          llvm::Value *numElements,
2247                                          const CXXNewExpr *expr,
2248                                          QualType elementType) {
2249   assert(requiresArrayCookie(expr));
2250 
2251   // The cookie is always at the start of the buffer.
2252   Address cookie = newPtr;
2253 
2254   // The first element is the element size.
2255   cookie = CGF.Builder.CreateElementBitCast(cookie, CGF.SizeTy);
2256   llvm::Value *elementSize = llvm::ConstantInt::get(CGF.SizeTy,
2257                  getContext().getTypeSizeInChars(elementType).getQuantity());
2258   CGF.Builder.CreateStore(elementSize, cookie);
2259 
2260   // The second element is the element count.
2261   cookie = CGF.Builder.CreateConstInBoundsGEP(cookie, 1);
2262   CGF.Builder.CreateStore(numElements, cookie);
2263 
2264   // Finally, compute a pointer to the actual data buffer by skipping
2265   // over the cookie completely.
2266   CharUnits cookieSize = ARMCXXABI::getArrayCookieSizeImpl(elementType);
2267   return CGF.Builder.CreateConstInBoundsByteGEP(newPtr, cookieSize);
2268 }
2269 
2270 llvm::Value *ARMCXXABI::readArrayCookieImpl(CodeGenFunction &CGF,
2271                                             Address allocPtr,
2272                                             CharUnits cookieSize) {
2273   // The number of elements is at offset sizeof(size_t) relative to
2274   // the allocated pointer.
2275   Address numElementsPtr
2276     = CGF.Builder.CreateConstInBoundsByteGEP(allocPtr, CGF.getSizeSize());
2277 
2278   numElementsPtr = CGF.Builder.CreateElementBitCast(numElementsPtr, CGF.SizeTy);
2279   return CGF.Builder.CreateLoad(numElementsPtr);
2280 }
2281 
2282 /*********************** Static local initialization **************************/
2283 
2284 static llvm::FunctionCallee getGuardAcquireFn(CodeGenModule &CGM,
2285                                               llvm::PointerType *GuardPtrTy) {
2286   // int __cxa_guard_acquire(__guard *guard_object);
2287   llvm::FunctionType *FTy =
2288     llvm::FunctionType::get(CGM.getTypes().ConvertType(CGM.getContext().IntTy),
2289                             GuardPtrTy, /*isVarArg=*/false);
2290   return CGM.CreateRuntimeFunction(
2291       FTy, "__cxa_guard_acquire",
2292       llvm::AttributeList::get(CGM.getLLVMContext(),
2293                                llvm::AttributeList::FunctionIndex,
2294                                llvm::Attribute::NoUnwind));
2295 }
2296 
2297 static llvm::FunctionCallee getGuardReleaseFn(CodeGenModule &CGM,
2298                                               llvm::PointerType *GuardPtrTy) {
2299   // void __cxa_guard_release(__guard *guard_object);
2300   llvm::FunctionType *FTy =
2301     llvm::FunctionType::get(CGM.VoidTy, GuardPtrTy, /*isVarArg=*/false);
2302   return CGM.CreateRuntimeFunction(
2303       FTy, "__cxa_guard_release",
2304       llvm::AttributeList::get(CGM.getLLVMContext(),
2305                                llvm::AttributeList::FunctionIndex,
2306                                llvm::Attribute::NoUnwind));
2307 }
2308 
2309 static llvm::FunctionCallee getGuardAbortFn(CodeGenModule &CGM,
2310                                             llvm::PointerType *GuardPtrTy) {
2311   // void __cxa_guard_abort(__guard *guard_object);
2312   llvm::FunctionType *FTy =
2313     llvm::FunctionType::get(CGM.VoidTy, GuardPtrTy, /*isVarArg=*/false);
2314   return CGM.CreateRuntimeFunction(
2315       FTy, "__cxa_guard_abort",
2316       llvm::AttributeList::get(CGM.getLLVMContext(),
2317                                llvm::AttributeList::FunctionIndex,
2318                                llvm::Attribute::NoUnwind));
2319 }
2320 
2321 namespace {
2322   struct CallGuardAbort final : EHScopeStack::Cleanup {
2323     llvm::GlobalVariable *Guard;
2324     CallGuardAbort(llvm::GlobalVariable *Guard) : Guard(Guard) {}
2325 
2326     void Emit(CodeGenFunction &CGF, Flags flags) override {
2327       CGF.EmitNounwindRuntimeCall(getGuardAbortFn(CGF.CGM, Guard->getType()),
2328                                   Guard);
2329     }
2330   };
2331 }
2332 
2333 /// The ARM code here follows the Itanium code closely enough that we
2334 /// just special-case it at particular places.
2335 void ItaniumCXXABI::EmitGuardedInit(CodeGenFunction &CGF,
2336                                     const VarDecl &D,
2337                                     llvm::GlobalVariable *var,
2338                                     bool shouldPerformInit) {
2339   CGBuilderTy &Builder = CGF.Builder;
2340 
2341   // Inline variables that weren't instantiated from variable templates have
2342   // partially-ordered initialization within their translation unit.
2343   bool NonTemplateInline =
2344       D.isInline() &&
2345       !isTemplateInstantiation(D.getTemplateSpecializationKind());
2346 
2347   // We only need to use thread-safe statics for local non-TLS variables and
2348   // inline variables; other global initialization is always single-threaded
2349   // or (through lazy dynamic loading in multiple threads) unsequenced.
2350   bool threadsafe = getContext().getLangOpts().ThreadsafeStatics &&
2351                     (D.isLocalVarDecl() || NonTemplateInline) &&
2352                     !D.getTLSKind();
2353 
2354   // If we have a global variable with internal linkage and thread-safe statics
2355   // are disabled, we can just let the guard variable be of type i8.
2356   bool useInt8GuardVariable = !threadsafe && var->hasInternalLinkage();
2357 
2358   llvm::IntegerType *guardTy;
2359   CharUnits guardAlignment;
2360   if (useInt8GuardVariable) {
2361     guardTy = CGF.Int8Ty;
2362     guardAlignment = CharUnits::One();
2363   } else {
2364     // Guard variables are 64 bits in the generic ABI and size width on ARM
2365     // (i.e. 32-bit on AArch32, 64-bit on AArch64).
2366     if (UseARMGuardVarABI) {
2367       guardTy = CGF.SizeTy;
2368       guardAlignment = CGF.getSizeAlign();
2369     } else {
2370       guardTy = CGF.Int64Ty;
2371       guardAlignment =
2372           CharUnits::fromQuantity(CGM.getDataLayout().getABITypeAlign(guardTy));
2373     }
2374   }
2375   llvm::PointerType *guardPtrTy = guardTy->getPointerTo(
2376       CGF.CGM.getDataLayout().getDefaultGlobalsAddressSpace());
2377 
2378   // Create the guard variable if we don't already have it (as we
2379   // might if we're double-emitting this function body).
2380   llvm::GlobalVariable *guard = CGM.getStaticLocalDeclGuardAddress(&D);
2381   if (!guard) {
2382     // Mangle the name for the guard.
2383     SmallString<256> guardName;
2384     {
2385       llvm::raw_svector_ostream out(guardName);
2386       getMangleContext().mangleStaticGuardVariable(&D, out);
2387     }
2388 
2389     // Create the guard variable with a zero-initializer.
2390     // Just absorb linkage, visibility and dll storage class  from the guarded
2391     // variable.
2392     guard = new llvm::GlobalVariable(CGM.getModule(), guardTy,
2393                                      false, var->getLinkage(),
2394                                      llvm::ConstantInt::get(guardTy, 0),
2395                                      guardName.str());
2396     guard->setDSOLocal(var->isDSOLocal());
2397     guard->setVisibility(var->getVisibility());
2398     guard->setDLLStorageClass(var->getDLLStorageClass());
2399     // If the variable is thread-local, so is its guard variable.
2400     guard->setThreadLocalMode(var->getThreadLocalMode());
2401     guard->setAlignment(guardAlignment.getAsAlign());
2402 
2403     // The ABI says: "It is suggested that it be emitted in the same COMDAT
2404     // group as the associated data object." In practice, this doesn't work for
2405     // non-ELF and non-Wasm object formats, so only do it for ELF and Wasm.
2406     llvm::Comdat *C = var->getComdat();
2407     if (!D.isLocalVarDecl() && C &&
2408         (CGM.getTarget().getTriple().isOSBinFormatELF() ||
2409          CGM.getTarget().getTriple().isOSBinFormatWasm())) {
2410       guard->setComdat(C);
2411     } else if (CGM.supportsCOMDAT() && guard->isWeakForLinker()) {
2412       guard->setComdat(CGM.getModule().getOrInsertComdat(guard->getName()));
2413     }
2414 
2415     CGM.setStaticLocalDeclGuardAddress(&D, guard);
2416   }
2417 
2418   Address guardAddr = Address(guard, guard->getValueType(), guardAlignment);
2419 
2420   // Test whether the variable has completed initialization.
2421   //
2422   // Itanium C++ ABI 3.3.2:
2423   //   The following is pseudo-code showing how these functions can be used:
2424   //     if (obj_guard.first_byte == 0) {
2425   //       if ( __cxa_guard_acquire (&obj_guard) ) {
2426   //         try {
2427   //           ... initialize the object ...;
2428   //         } catch (...) {
2429   //            __cxa_guard_abort (&obj_guard);
2430   //            throw;
2431   //         }
2432   //         ... queue object destructor with __cxa_atexit() ...;
2433   //         __cxa_guard_release (&obj_guard);
2434   //       }
2435   //     }
2436   //
2437   // If threadsafe statics are enabled, but we don't have inline atomics, just
2438   // call __cxa_guard_acquire unconditionally.  The "inline" check isn't
2439   // actually inline, and the user might not expect calls to __atomic libcalls.
2440 
2441   unsigned MaxInlineWidthInBits = CGF.getTarget().getMaxAtomicInlineWidth();
2442   llvm::BasicBlock *EndBlock = CGF.createBasicBlock("init.end");
2443   if (!threadsafe || MaxInlineWidthInBits) {
2444     // Load the first byte of the guard variable.
2445     llvm::LoadInst *LI =
2446         Builder.CreateLoad(Builder.CreateElementBitCast(guardAddr, CGM.Int8Ty));
2447 
2448     // Itanium ABI:
2449     //   An implementation supporting thread-safety on multiprocessor
2450     //   systems must also guarantee that references to the initialized
2451     //   object do not occur before the load of the initialization flag.
2452     //
2453     // In LLVM, we do this by marking the load Acquire.
2454     if (threadsafe)
2455       LI->setAtomic(llvm::AtomicOrdering::Acquire);
2456 
2457     // For ARM, we should only check the first bit, rather than the entire byte:
2458     //
2459     // ARM C++ ABI 3.2.3.1:
2460     //   To support the potential use of initialization guard variables
2461     //   as semaphores that are the target of ARM SWP and LDREX/STREX
2462     //   synchronizing instructions we define a static initialization
2463     //   guard variable to be a 4-byte aligned, 4-byte word with the
2464     //   following inline access protocol.
2465     //     #define INITIALIZED 1
2466     //     if ((obj_guard & INITIALIZED) != INITIALIZED) {
2467     //       if (__cxa_guard_acquire(&obj_guard))
2468     //         ...
2469     //     }
2470     //
2471     // and similarly for ARM64:
2472     //
2473     // ARM64 C++ ABI 3.2.2:
2474     //   This ABI instead only specifies the value bit 0 of the static guard
2475     //   variable; all other bits are platform defined. Bit 0 shall be 0 when the
2476     //   variable is not initialized and 1 when it is.
2477     llvm::Value *V =
2478         (UseARMGuardVarABI && !useInt8GuardVariable)
2479             ? Builder.CreateAnd(LI, llvm::ConstantInt::get(CGM.Int8Ty, 1))
2480             : LI;
2481     llvm::Value *NeedsInit = Builder.CreateIsNull(V, "guard.uninitialized");
2482 
2483     llvm::BasicBlock *InitCheckBlock = CGF.createBasicBlock("init.check");
2484 
2485     // Check if the first byte of the guard variable is zero.
2486     CGF.EmitCXXGuardedInitBranch(NeedsInit, InitCheckBlock, EndBlock,
2487                                  CodeGenFunction::GuardKind::VariableGuard, &D);
2488 
2489     CGF.EmitBlock(InitCheckBlock);
2490   }
2491 
2492   // The semantics of dynamic initialization of variables with static or thread
2493   // storage duration depends on whether they are declared at block-scope. The
2494   // initialization of such variables at block-scope can be aborted with an
2495   // exception and later retried (per C++20 [stmt.dcl]p4), and recursive entry
2496   // to their initialization has undefined behavior (also per C++20
2497   // [stmt.dcl]p4). For such variables declared at non-block scope, exceptions
2498   // lead to termination (per C++20 [except.terminate]p1), and recursive
2499   // references to the variables are governed only by the lifetime rules (per
2500   // C++20 [class.cdtor]p2), which means such references are perfectly fine as
2501   // long as they avoid touching memory. As a result, block-scope variables must
2502   // not be marked as initialized until after initialization completes (unless
2503   // the mark is reverted following an exception), but non-block-scope variables
2504   // must be marked prior to initialization so that recursive accesses during
2505   // initialization do not restart initialization.
2506 
2507   // Variables used when coping with thread-safe statics and exceptions.
2508   if (threadsafe) {
2509     // Call __cxa_guard_acquire.
2510     llvm::Value *V
2511       = CGF.EmitNounwindRuntimeCall(getGuardAcquireFn(CGM, guardPtrTy), guard);
2512 
2513     llvm::BasicBlock *InitBlock = CGF.createBasicBlock("init");
2514 
2515     Builder.CreateCondBr(Builder.CreateIsNotNull(V, "tobool"),
2516                          InitBlock, EndBlock);
2517 
2518     // Call __cxa_guard_abort along the exceptional edge.
2519     CGF.EHStack.pushCleanup<CallGuardAbort>(EHCleanup, guard);
2520 
2521     CGF.EmitBlock(InitBlock);
2522   } else if (!D.isLocalVarDecl()) {
2523     // For non-local variables, store 1 into the first byte of the guard
2524     // variable before the object initialization begins so that references
2525     // to the variable during initialization don't restart initialization.
2526     Builder.CreateStore(llvm::ConstantInt::get(CGM.Int8Ty, 1),
2527                         Builder.CreateElementBitCast(guardAddr, CGM.Int8Ty));
2528   }
2529 
2530   // Emit the initializer and add a global destructor if appropriate.
2531   CGF.EmitCXXGlobalVarDeclInit(D, var, shouldPerformInit);
2532 
2533   if (threadsafe) {
2534     // Pop the guard-abort cleanup if we pushed one.
2535     CGF.PopCleanupBlock();
2536 
2537     // Call __cxa_guard_release.  This cannot throw.
2538     CGF.EmitNounwindRuntimeCall(getGuardReleaseFn(CGM, guardPtrTy),
2539                                 guardAddr.getPointer());
2540   } else if (D.isLocalVarDecl()) {
2541     // For local variables, store 1 into the first byte of the guard variable
2542     // after the object initialization completes so that initialization is
2543     // retried if initialization is interrupted by an exception.
2544     Builder.CreateStore(llvm::ConstantInt::get(CGM.Int8Ty, 1),
2545                         Builder.CreateElementBitCast(guardAddr, CGM.Int8Ty));
2546   }
2547 
2548   CGF.EmitBlock(EndBlock);
2549 }
2550 
2551 /// Register a global destructor using __cxa_atexit.
2552 static void emitGlobalDtorWithCXAAtExit(CodeGenFunction &CGF,
2553                                         llvm::FunctionCallee dtor,
2554                                         llvm::Constant *addr, bool TLS) {
2555   assert(!CGF.getTarget().getTriple().isOSAIX() &&
2556          "unexpected call to emitGlobalDtorWithCXAAtExit");
2557   assert((TLS || CGF.getTypes().getCodeGenOpts().CXAAtExit) &&
2558          "__cxa_atexit is disabled");
2559   const char *Name = "__cxa_atexit";
2560   if (TLS) {
2561     const llvm::Triple &T = CGF.getTarget().getTriple();
2562     Name = T.isOSDarwin() ?  "_tlv_atexit" : "__cxa_thread_atexit";
2563   }
2564 
2565   // We're assuming that the destructor function is something we can
2566   // reasonably call with the default CC.  Go ahead and cast it to the
2567   // right prototype.
2568   llvm::Type *dtorTy =
2569     llvm::FunctionType::get(CGF.VoidTy, CGF.Int8PtrTy, false)->getPointerTo();
2570 
2571   // Preserve address space of addr.
2572   auto AddrAS = addr ? addr->getType()->getPointerAddressSpace() : 0;
2573   auto AddrInt8PtrTy =
2574       AddrAS ? CGF.Int8Ty->getPointerTo(AddrAS) : CGF.Int8PtrTy;
2575 
2576   // Create a variable that binds the atexit to this shared object.
2577   llvm::Constant *handle =
2578       CGF.CGM.CreateRuntimeVariable(CGF.Int8Ty, "__dso_handle");
2579   auto *GV = cast<llvm::GlobalValue>(handle->stripPointerCasts());
2580   GV->setVisibility(llvm::GlobalValue::HiddenVisibility);
2581 
2582   // extern "C" int __cxa_atexit(void (*f)(void *), void *p, void *d);
2583   llvm::Type *paramTys[] = {dtorTy, AddrInt8PtrTy, handle->getType()};
2584   llvm::FunctionType *atexitTy =
2585     llvm::FunctionType::get(CGF.IntTy, paramTys, false);
2586 
2587   // Fetch the actual function.
2588   llvm::FunctionCallee atexit = CGF.CGM.CreateRuntimeFunction(atexitTy, Name);
2589   if (llvm::Function *fn = dyn_cast<llvm::Function>(atexit.getCallee()))
2590     fn->setDoesNotThrow();
2591 
2592   if (!addr)
2593     // addr is null when we are trying to register a dtor annotated with
2594     // __attribute__((destructor)) in a constructor function. Using null here is
2595     // okay because this argument is just passed back to the destructor
2596     // function.
2597     addr = llvm::Constant::getNullValue(CGF.Int8PtrTy);
2598 
2599   llvm::Value *args[] = {llvm::ConstantExpr::getBitCast(
2600                              cast<llvm::Constant>(dtor.getCallee()), dtorTy),
2601                          llvm::ConstantExpr::getBitCast(addr, AddrInt8PtrTy),
2602                          handle};
2603   CGF.EmitNounwindRuntimeCall(atexit, args);
2604 }
2605 
2606 static llvm::Function *createGlobalInitOrCleanupFn(CodeGen::CodeGenModule &CGM,
2607                                                    StringRef FnName) {
2608   // Create a function that registers/unregisters destructors that have the same
2609   // priority.
2610   llvm::FunctionType *FTy = llvm::FunctionType::get(CGM.VoidTy, false);
2611   llvm::Function *GlobalInitOrCleanupFn = CGM.CreateGlobalInitOrCleanUpFunction(
2612       FTy, FnName, CGM.getTypes().arrangeNullaryFunction(), SourceLocation());
2613 
2614   return GlobalInitOrCleanupFn;
2615 }
2616 
2617 void CodeGenModule::unregisterGlobalDtorsWithUnAtExit() {
2618   for (const auto &I : DtorsUsingAtExit) {
2619     int Priority = I.first;
2620     std::string GlobalCleanupFnName =
2621         std::string("__GLOBAL_cleanup_") + llvm::to_string(Priority);
2622 
2623     llvm::Function *GlobalCleanupFn =
2624         createGlobalInitOrCleanupFn(*this, GlobalCleanupFnName);
2625 
2626     CodeGenFunction CGF(*this);
2627     CGF.StartFunction(GlobalDecl(), getContext().VoidTy, GlobalCleanupFn,
2628                       getTypes().arrangeNullaryFunction(), FunctionArgList(),
2629                       SourceLocation(), SourceLocation());
2630     auto AL = ApplyDebugLocation::CreateArtificial(CGF);
2631 
2632     // Get the destructor function type, void(*)(void).
2633     llvm::FunctionType *dtorFuncTy = llvm::FunctionType::get(CGF.VoidTy, false);
2634     llvm::Type *dtorTy = dtorFuncTy->getPointerTo();
2635 
2636     // Destructor functions are run/unregistered in non-ascending
2637     // order of their priorities.
2638     const llvm::TinyPtrVector<llvm::Function *> &Dtors = I.second;
2639     auto itv = Dtors.rbegin();
2640     while (itv != Dtors.rend()) {
2641       llvm::Function *Dtor = *itv;
2642 
2643       // We're assuming that the destructor function is something we can
2644       // reasonably call with the correct CC.  Go ahead and cast it to the
2645       // right prototype.
2646       llvm::Constant *dtor = llvm::ConstantExpr::getBitCast(Dtor, dtorTy);
2647       llvm::Value *V = CGF.unregisterGlobalDtorWithUnAtExit(dtor);
2648       llvm::Value *NeedsDestruct =
2649           CGF.Builder.CreateIsNull(V, "needs_destruct");
2650 
2651       llvm::BasicBlock *DestructCallBlock =
2652           CGF.createBasicBlock("destruct.call");
2653       llvm::BasicBlock *EndBlock = CGF.createBasicBlock(
2654           (itv + 1) != Dtors.rend() ? "unatexit.call" : "destruct.end");
2655       // Check if unatexit returns a value of 0. If it does, jump to
2656       // DestructCallBlock, otherwise jump to EndBlock directly.
2657       CGF.Builder.CreateCondBr(NeedsDestruct, DestructCallBlock, EndBlock);
2658 
2659       CGF.EmitBlock(DestructCallBlock);
2660 
2661       // Emit the call to casted Dtor.
2662       llvm::CallInst *CI = CGF.Builder.CreateCall(dtorFuncTy, dtor);
2663       // Make sure the call and the callee agree on calling convention.
2664       CI->setCallingConv(Dtor->getCallingConv());
2665 
2666       CGF.EmitBlock(EndBlock);
2667 
2668       itv++;
2669     }
2670 
2671     CGF.FinishFunction();
2672     AddGlobalDtor(GlobalCleanupFn, Priority);
2673   }
2674 }
2675 
2676 void CodeGenModule::registerGlobalDtorsWithAtExit() {
2677   for (const auto &I : DtorsUsingAtExit) {
2678     int Priority = I.first;
2679     std::string GlobalInitFnName =
2680         std::string("__GLOBAL_init_") + llvm::to_string(Priority);
2681     llvm::Function *GlobalInitFn =
2682         createGlobalInitOrCleanupFn(*this, GlobalInitFnName);
2683 
2684     CodeGenFunction CGF(*this);
2685     CGF.StartFunction(GlobalDecl(), getContext().VoidTy, GlobalInitFn,
2686                       getTypes().arrangeNullaryFunction(), FunctionArgList(),
2687                       SourceLocation(), SourceLocation());
2688     auto AL = ApplyDebugLocation::CreateArtificial(CGF);
2689 
2690     // Since constructor functions are run in non-descending order of their
2691     // priorities, destructors are registered in non-descending order of their
2692     // priorities, and since destructor functions are run in the reverse order
2693     // of their registration, destructor functions are run in non-ascending
2694     // order of their priorities.
2695     const llvm::TinyPtrVector<llvm::Function *> &Dtors = I.second;
2696     for (auto *Dtor : Dtors) {
2697       // Register the destructor function calling __cxa_atexit if it is
2698       // available. Otherwise fall back on calling atexit.
2699       if (getCodeGenOpts().CXAAtExit) {
2700         emitGlobalDtorWithCXAAtExit(CGF, Dtor, nullptr, false);
2701       } else {
2702         // Get the destructor function type, void(*)(void).
2703         llvm::Type *dtorTy =
2704             llvm::FunctionType::get(CGF.VoidTy, false)->getPointerTo();
2705 
2706         // We're assuming that the destructor function is something we can
2707         // reasonably call with the correct CC.  Go ahead and cast it to the
2708         // right prototype.
2709         CGF.registerGlobalDtorWithAtExit(
2710             llvm::ConstantExpr::getBitCast(Dtor, dtorTy));
2711       }
2712     }
2713 
2714     CGF.FinishFunction();
2715     AddGlobalCtor(GlobalInitFn, Priority);
2716   }
2717 
2718   if (getCXXABI().useSinitAndSterm())
2719     unregisterGlobalDtorsWithUnAtExit();
2720 }
2721 
2722 /// Register a global destructor as best as we know how.
2723 void ItaniumCXXABI::registerGlobalDtor(CodeGenFunction &CGF, const VarDecl &D,
2724                                        llvm::FunctionCallee dtor,
2725                                        llvm::Constant *addr) {
2726   if (D.isNoDestroy(CGM.getContext()))
2727     return;
2728 
2729   // emitGlobalDtorWithCXAAtExit will emit a call to either __cxa_thread_atexit
2730   // or __cxa_atexit depending on whether this VarDecl is a thread-local storage
2731   // or not. CXAAtExit controls only __cxa_atexit, so use it if it is enabled.
2732   // We can always use __cxa_thread_atexit.
2733   if (CGM.getCodeGenOpts().CXAAtExit || D.getTLSKind())
2734     return emitGlobalDtorWithCXAAtExit(CGF, dtor, addr, D.getTLSKind());
2735 
2736   // In Apple kexts, we want to add a global destructor entry.
2737   // FIXME: shouldn't this be guarded by some variable?
2738   if (CGM.getLangOpts().AppleKext) {
2739     // Generate a global destructor entry.
2740     return CGM.AddCXXDtorEntry(dtor, addr);
2741   }
2742 
2743   CGF.registerGlobalDtorWithAtExit(D, dtor, addr);
2744 }
2745 
2746 static bool isThreadWrapperReplaceable(const VarDecl *VD,
2747                                        CodeGen::CodeGenModule &CGM) {
2748   assert(!VD->isStaticLocal() && "static local VarDecls don't need wrappers!");
2749   // Darwin prefers to have references to thread local variables to go through
2750   // the thread wrapper instead of directly referencing the backing variable.
2751   return VD->getTLSKind() == VarDecl::TLS_Dynamic &&
2752          CGM.getTarget().getTriple().isOSDarwin();
2753 }
2754 
2755 /// Get the appropriate linkage for the wrapper function. This is essentially
2756 /// the weak form of the variable's linkage; every translation unit which needs
2757 /// the wrapper emits a copy, and we want the linker to merge them.
2758 static llvm::GlobalValue::LinkageTypes
2759 getThreadLocalWrapperLinkage(const VarDecl *VD, CodeGen::CodeGenModule &CGM) {
2760   llvm::GlobalValue::LinkageTypes VarLinkage =
2761       CGM.getLLVMLinkageVarDefinition(VD, /*IsConstant=*/false);
2762 
2763   // For internal linkage variables, we don't need an external or weak wrapper.
2764   if (llvm::GlobalValue::isLocalLinkage(VarLinkage))
2765     return VarLinkage;
2766 
2767   // If the thread wrapper is replaceable, give it appropriate linkage.
2768   if (isThreadWrapperReplaceable(VD, CGM))
2769     if (!llvm::GlobalVariable::isLinkOnceLinkage(VarLinkage) &&
2770         !llvm::GlobalVariable::isWeakODRLinkage(VarLinkage))
2771       return VarLinkage;
2772   return llvm::GlobalValue::WeakODRLinkage;
2773 }
2774 
2775 llvm::Function *
2776 ItaniumCXXABI::getOrCreateThreadLocalWrapper(const VarDecl *VD,
2777                                              llvm::Value *Val) {
2778   // Mangle the name for the thread_local wrapper function.
2779   SmallString<256> WrapperName;
2780   {
2781     llvm::raw_svector_ostream Out(WrapperName);
2782     getMangleContext().mangleItaniumThreadLocalWrapper(VD, Out);
2783   }
2784 
2785   // FIXME: If VD is a definition, we should regenerate the function attributes
2786   // before returning.
2787   if (llvm::Value *V = CGM.getModule().getNamedValue(WrapperName))
2788     return cast<llvm::Function>(V);
2789 
2790   QualType RetQT = VD->getType();
2791   if (RetQT->isReferenceType())
2792     RetQT = RetQT.getNonReferenceType();
2793 
2794   const CGFunctionInfo &FI = CGM.getTypes().arrangeBuiltinFunctionDeclaration(
2795       getContext().getPointerType(RetQT), FunctionArgList());
2796 
2797   llvm::FunctionType *FnTy = CGM.getTypes().GetFunctionType(FI);
2798   llvm::Function *Wrapper =
2799       llvm::Function::Create(FnTy, getThreadLocalWrapperLinkage(VD, CGM),
2800                              WrapperName.str(), &CGM.getModule());
2801 
2802   if (CGM.supportsCOMDAT() && Wrapper->isWeakForLinker())
2803     Wrapper->setComdat(CGM.getModule().getOrInsertComdat(Wrapper->getName()));
2804 
2805   CGM.SetLLVMFunctionAttributes(GlobalDecl(), FI, Wrapper, /*IsThunk=*/false);
2806 
2807   // Always resolve references to the wrapper at link time.
2808   if (!Wrapper->hasLocalLinkage())
2809     if (!isThreadWrapperReplaceable(VD, CGM) ||
2810         llvm::GlobalVariable::isLinkOnceLinkage(Wrapper->getLinkage()) ||
2811         llvm::GlobalVariable::isWeakODRLinkage(Wrapper->getLinkage()) ||
2812         VD->getVisibility() == HiddenVisibility)
2813       Wrapper->setVisibility(llvm::GlobalValue::HiddenVisibility);
2814 
2815   if (isThreadWrapperReplaceable(VD, CGM)) {
2816     Wrapper->setCallingConv(llvm::CallingConv::CXX_FAST_TLS);
2817     Wrapper->addFnAttr(llvm::Attribute::NoUnwind);
2818   }
2819 
2820   ThreadWrappers.push_back({VD, Wrapper});
2821   return Wrapper;
2822 }
2823 
2824 void ItaniumCXXABI::EmitThreadLocalInitFuncs(
2825     CodeGenModule &CGM, ArrayRef<const VarDecl *> CXXThreadLocals,
2826     ArrayRef<llvm::Function *> CXXThreadLocalInits,
2827     ArrayRef<const VarDecl *> CXXThreadLocalInitVars) {
2828   llvm::Function *InitFunc = nullptr;
2829 
2830   // Separate initializers into those with ordered (or partially-ordered)
2831   // initialization and those with unordered initialization.
2832   llvm::SmallVector<llvm::Function *, 8> OrderedInits;
2833   llvm::SmallDenseMap<const VarDecl *, llvm::Function *> UnorderedInits;
2834   for (unsigned I = 0; I != CXXThreadLocalInits.size(); ++I) {
2835     if (isTemplateInstantiation(
2836             CXXThreadLocalInitVars[I]->getTemplateSpecializationKind()))
2837       UnorderedInits[CXXThreadLocalInitVars[I]->getCanonicalDecl()] =
2838           CXXThreadLocalInits[I];
2839     else
2840       OrderedInits.push_back(CXXThreadLocalInits[I]);
2841   }
2842 
2843   if (!OrderedInits.empty()) {
2844     // Generate a guarded initialization function.
2845     llvm::FunctionType *FTy =
2846         llvm::FunctionType::get(CGM.VoidTy, /*isVarArg=*/false);
2847     const CGFunctionInfo &FI = CGM.getTypes().arrangeNullaryFunction();
2848     InitFunc = CGM.CreateGlobalInitOrCleanUpFunction(FTy, "__tls_init", FI,
2849                                                      SourceLocation(),
2850                                                      /*TLS=*/true);
2851     llvm::GlobalVariable *Guard = new llvm::GlobalVariable(
2852         CGM.getModule(), CGM.Int8Ty, /*isConstant=*/false,
2853         llvm::GlobalVariable::InternalLinkage,
2854         llvm::ConstantInt::get(CGM.Int8Ty, 0), "__tls_guard");
2855     Guard->setThreadLocal(true);
2856     Guard->setThreadLocalMode(CGM.GetDefaultLLVMTLSModel());
2857 
2858     CharUnits GuardAlign = CharUnits::One();
2859     Guard->setAlignment(GuardAlign.getAsAlign());
2860 
2861     CodeGenFunction(CGM).GenerateCXXGlobalInitFunc(
2862         InitFunc, OrderedInits, ConstantAddress(Guard, CGM.Int8Ty, GuardAlign));
2863     // On Darwin platforms, use CXX_FAST_TLS calling convention.
2864     if (CGM.getTarget().getTriple().isOSDarwin()) {
2865       InitFunc->setCallingConv(llvm::CallingConv::CXX_FAST_TLS);
2866       InitFunc->addFnAttr(llvm::Attribute::NoUnwind);
2867     }
2868   }
2869 
2870   // Create declarations for thread wrappers for all thread-local variables
2871   // with non-discardable definitions in this translation unit.
2872   for (const VarDecl *VD : CXXThreadLocals) {
2873     if (VD->hasDefinition() &&
2874         !isDiscardableGVALinkage(getContext().GetGVALinkageForVariable(VD))) {
2875       llvm::GlobalValue *GV = CGM.GetGlobalValue(CGM.getMangledName(VD));
2876       getOrCreateThreadLocalWrapper(VD, GV);
2877     }
2878   }
2879 
2880   // Emit all referenced thread wrappers.
2881   for (auto VDAndWrapper : ThreadWrappers) {
2882     const VarDecl *VD = VDAndWrapper.first;
2883     llvm::GlobalVariable *Var =
2884         cast<llvm::GlobalVariable>(CGM.GetGlobalValue(CGM.getMangledName(VD)));
2885     llvm::Function *Wrapper = VDAndWrapper.second;
2886 
2887     // Some targets require that all access to thread local variables go through
2888     // the thread wrapper.  This means that we cannot attempt to create a thread
2889     // wrapper or a thread helper.
2890     if (!VD->hasDefinition()) {
2891       if (isThreadWrapperReplaceable(VD, CGM)) {
2892         Wrapper->setLinkage(llvm::Function::ExternalLinkage);
2893         continue;
2894       }
2895 
2896       // If this isn't a TU in which this variable is defined, the thread
2897       // wrapper is discardable.
2898       if (Wrapper->getLinkage() == llvm::Function::WeakODRLinkage)
2899         Wrapper->setLinkage(llvm::Function::LinkOnceODRLinkage);
2900     }
2901 
2902     CGM.SetLLVMFunctionAttributesForDefinition(nullptr, Wrapper);
2903 
2904     // Mangle the name for the thread_local initialization function.
2905     SmallString<256> InitFnName;
2906     {
2907       llvm::raw_svector_ostream Out(InitFnName);
2908       getMangleContext().mangleItaniumThreadLocalInit(VD, Out);
2909     }
2910 
2911     llvm::FunctionType *InitFnTy = llvm::FunctionType::get(CGM.VoidTy, false);
2912 
2913     // If we have a definition for the variable, emit the initialization
2914     // function as an alias to the global Init function (if any). Otherwise,
2915     // produce a declaration of the initialization function.
2916     llvm::GlobalValue *Init = nullptr;
2917     bool InitIsInitFunc = false;
2918     bool HasConstantInitialization = false;
2919     if (!usesThreadWrapperFunction(VD)) {
2920       HasConstantInitialization = true;
2921     } else if (VD->hasDefinition()) {
2922       InitIsInitFunc = true;
2923       llvm::Function *InitFuncToUse = InitFunc;
2924       if (isTemplateInstantiation(VD->getTemplateSpecializationKind()))
2925         InitFuncToUse = UnorderedInits.lookup(VD->getCanonicalDecl());
2926       if (InitFuncToUse)
2927         Init = llvm::GlobalAlias::create(Var->getLinkage(), InitFnName.str(),
2928                                          InitFuncToUse);
2929     } else {
2930       // Emit a weak global function referring to the initialization function.
2931       // This function will not exist if the TU defining the thread_local
2932       // variable in question does not need any dynamic initialization for
2933       // its thread_local variables.
2934       Init = llvm::Function::Create(InitFnTy,
2935                                     llvm::GlobalVariable::ExternalWeakLinkage,
2936                                     InitFnName.str(), &CGM.getModule());
2937       const CGFunctionInfo &FI = CGM.getTypes().arrangeNullaryFunction();
2938       CGM.SetLLVMFunctionAttributes(
2939           GlobalDecl(), FI, cast<llvm::Function>(Init), /*IsThunk=*/false);
2940     }
2941 
2942     if (Init) {
2943       Init->setVisibility(Var->getVisibility());
2944       // Don't mark an extern_weak function DSO local on windows.
2945       if (!CGM.getTriple().isOSWindows() || !Init->hasExternalWeakLinkage())
2946         Init->setDSOLocal(Var->isDSOLocal());
2947     }
2948 
2949     llvm::LLVMContext &Context = CGM.getModule().getContext();
2950 
2951     // The linker on AIX is not happy with missing weak symbols.  However,
2952     // other TUs will not know whether the initialization routine exists
2953     // so create an empty, init function to satisfy the linker.
2954     // This is needed whenever a thread wrapper function is not used, and
2955     // also when the symbol is weak.
2956     if (CGM.getTriple().isOSAIX() && VD->hasDefinition() &&
2957         isEmittedWithConstantInitializer(VD, true) &&
2958         !mayNeedDestruction(VD)) {
2959       // Init should be null.  If it were non-null, then the logic above would
2960       // either be defining the function to be an alias or declaring the
2961       // function with the expectation that the definition of the variable
2962       // is elsewhere.
2963       assert(Init == nullptr && "Expected Init to be null.");
2964 
2965       llvm::Function *Func = llvm::Function::Create(
2966           InitFnTy, Var->getLinkage(), InitFnName.str(), &CGM.getModule());
2967       const CGFunctionInfo &FI = CGM.getTypes().arrangeNullaryFunction();
2968       CGM.SetLLVMFunctionAttributes(GlobalDecl(), FI,
2969                                     cast<llvm::Function>(Func),
2970                                     /*IsThunk=*/false);
2971       // Create a function body that just returns
2972       llvm::BasicBlock *Entry = llvm::BasicBlock::Create(Context, "", Func);
2973       CGBuilderTy Builder(CGM, Entry);
2974       Builder.CreateRetVoid();
2975     }
2976 
2977     llvm::BasicBlock *Entry = llvm::BasicBlock::Create(Context, "", Wrapper);
2978     CGBuilderTy Builder(CGM, Entry);
2979     if (HasConstantInitialization) {
2980       // No dynamic initialization to invoke.
2981     } else if (InitIsInitFunc) {
2982       if (Init) {
2983         llvm::CallInst *CallVal = Builder.CreateCall(InitFnTy, Init);
2984         if (isThreadWrapperReplaceable(VD, CGM)) {
2985           CallVal->setCallingConv(llvm::CallingConv::CXX_FAST_TLS);
2986           llvm::Function *Fn =
2987               cast<llvm::Function>(cast<llvm::GlobalAlias>(Init)->getAliasee());
2988           Fn->setCallingConv(llvm::CallingConv::CXX_FAST_TLS);
2989         }
2990       }
2991     } else if (CGM.getTriple().isOSAIX()) {
2992       // On AIX, except if constinit and also neither of class type or of
2993       // (possibly multi-dimensional) array of class type, thread_local vars
2994       // will have init routines regardless of whether they are
2995       // const-initialized.  Since the routine is guaranteed to exist, we can
2996       // unconditionally call it without testing for its existance.  This
2997       // avoids potentially unresolved weak symbols which the AIX linker
2998       // isn't happy with.
2999       Builder.CreateCall(InitFnTy, Init);
3000     } else {
3001       // Don't know whether we have an init function. Call it if it exists.
3002       llvm::Value *Have = Builder.CreateIsNotNull(Init);
3003       llvm::BasicBlock *InitBB = llvm::BasicBlock::Create(Context, "", Wrapper);
3004       llvm::BasicBlock *ExitBB = llvm::BasicBlock::Create(Context, "", Wrapper);
3005       Builder.CreateCondBr(Have, InitBB, ExitBB);
3006 
3007       Builder.SetInsertPoint(InitBB);
3008       Builder.CreateCall(InitFnTy, Init);
3009       Builder.CreateBr(ExitBB);
3010 
3011       Builder.SetInsertPoint(ExitBB);
3012     }
3013 
3014     // For a reference, the result of the wrapper function is a pointer to
3015     // the referenced object.
3016     llvm::Value *Val = Builder.CreateThreadLocalAddress(Var);
3017 
3018     if (VD->getType()->isReferenceType()) {
3019       CharUnits Align = CGM.getContext().getDeclAlign(VD);
3020       Val = Builder.CreateAlignedLoad(Var->getValueType(), Val, Align);
3021     }
3022     if (Val->getType() != Wrapper->getReturnType())
3023       Val = Builder.CreatePointerBitCastOrAddrSpaceCast(
3024           Val, Wrapper->getReturnType(), "");
3025 
3026     Builder.CreateRet(Val);
3027   }
3028 }
3029 
3030 LValue ItaniumCXXABI::EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF,
3031                                                    const VarDecl *VD,
3032                                                    QualType LValType) {
3033   llvm::Value *Val = CGF.CGM.GetAddrOfGlobalVar(VD);
3034   llvm::Function *Wrapper = getOrCreateThreadLocalWrapper(VD, Val);
3035 
3036   llvm::CallInst *CallVal = CGF.Builder.CreateCall(Wrapper);
3037   CallVal->setCallingConv(Wrapper->getCallingConv());
3038 
3039   LValue LV;
3040   if (VD->getType()->isReferenceType())
3041     LV = CGF.MakeNaturalAlignAddrLValue(CallVal, LValType);
3042   else
3043     LV = CGF.MakeAddrLValue(CallVal, LValType,
3044                             CGF.getContext().getDeclAlign(VD));
3045   // FIXME: need setObjCGCLValueClass?
3046   return LV;
3047 }
3048 
3049 /// Return whether the given global decl needs a VTT parameter, which it does
3050 /// if it's a base constructor or destructor with virtual bases.
3051 bool ItaniumCXXABI::NeedsVTTParameter(GlobalDecl GD) {
3052   const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl());
3053 
3054   // We don't have any virtual bases, just return early.
3055   if (!MD->getParent()->getNumVBases())
3056     return false;
3057 
3058   // Check if we have a base constructor.
3059   if (isa<CXXConstructorDecl>(MD) && GD.getCtorType() == Ctor_Base)
3060     return true;
3061 
3062   // Check if we have a base destructor.
3063   if (isa<CXXDestructorDecl>(MD) && GD.getDtorType() == Dtor_Base)
3064     return true;
3065 
3066   return false;
3067 }
3068 
3069 namespace {
3070 class ItaniumRTTIBuilder {
3071   CodeGenModule &CGM;  // Per-module state.
3072   llvm::LLVMContext &VMContext;
3073   const ItaniumCXXABI &CXXABI;  // Per-module state.
3074 
3075   /// Fields - The fields of the RTTI descriptor currently being built.
3076   SmallVector<llvm::Constant *, 16> Fields;
3077 
3078   /// GetAddrOfTypeName - Returns the mangled type name of the given type.
3079   llvm::GlobalVariable *
3080   GetAddrOfTypeName(QualType Ty, llvm::GlobalVariable::LinkageTypes Linkage);
3081 
3082   /// GetAddrOfExternalRTTIDescriptor - Returns the constant for the RTTI
3083   /// descriptor of the given type.
3084   llvm::Constant *GetAddrOfExternalRTTIDescriptor(QualType Ty);
3085 
3086   /// BuildVTablePointer - Build the vtable pointer for the given type.
3087   void BuildVTablePointer(const Type *Ty);
3088 
3089   /// BuildSIClassTypeInfo - Build an abi::__si_class_type_info, used for single
3090   /// inheritance, according to the Itanium C++ ABI, 2.9.5p6b.
3091   void BuildSIClassTypeInfo(const CXXRecordDecl *RD);
3092 
3093   /// BuildVMIClassTypeInfo - Build an abi::__vmi_class_type_info, used for
3094   /// classes with bases that do not satisfy the abi::__si_class_type_info
3095   /// constraints, according ti the Itanium C++ ABI, 2.9.5p5c.
3096   void BuildVMIClassTypeInfo(const CXXRecordDecl *RD);
3097 
3098   /// BuildPointerTypeInfo - Build an abi::__pointer_type_info struct, used
3099   /// for pointer types.
3100   void BuildPointerTypeInfo(QualType PointeeTy);
3101 
3102   /// BuildObjCObjectTypeInfo - Build the appropriate kind of
3103   /// type_info for an object type.
3104   void BuildObjCObjectTypeInfo(const ObjCObjectType *Ty);
3105 
3106   /// BuildPointerToMemberTypeInfo - Build an abi::__pointer_to_member_type_info
3107   /// struct, used for member pointer types.
3108   void BuildPointerToMemberTypeInfo(const MemberPointerType *Ty);
3109 
3110 public:
3111   ItaniumRTTIBuilder(const ItaniumCXXABI &ABI)
3112       : CGM(ABI.CGM), VMContext(CGM.getModule().getContext()), CXXABI(ABI) {}
3113 
3114   // Pointer type info flags.
3115   enum {
3116     /// PTI_Const - Type has const qualifier.
3117     PTI_Const = 0x1,
3118 
3119     /// PTI_Volatile - Type has volatile qualifier.
3120     PTI_Volatile = 0x2,
3121 
3122     /// PTI_Restrict - Type has restrict qualifier.
3123     PTI_Restrict = 0x4,
3124 
3125     /// PTI_Incomplete - Type is incomplete.
3126     PTI_Incomplete = 0x8,
3127 
3128     /// PTI_ContainingClassIncomplete - Containing class is incomplete.
3129     /// (in pointer to member).
3130     PTI_ContainingClassIncomplete = 0x10,
3131 
3132     /// PTI_TransactionSafe - Pointee is transaction_safe function (C++ TM TS).
3133     //PTI_TransactionSafe = 0x20,
3134 
3135     /// PTI_Noexcept - Pointee is noexcept function (C++1z).
3136     PTI_Noexcept = 0x40,
3137   };
3138 
3139   // VMI type info flags.
3140   enum {
3141     /// VMI_NonDiamondRepeat - Class has non-diamond repeated inheritance.
3142     VMI_NonDiamondRepeat = 0x1,
3143 
3144     /// VMI_DiamondShaped - Class is diamond shaped.
3145     VMI_DiamondShaped = 0x2
3146   };
3147 
3148   // Base class type info flags.
3149   enum {
3150     /// BCTI_Virtual - Base class is virtual.
3151     BCTI_Virtual = 0x1,
3152 
3153     /// BCTI_Public - Base class is public.
3154     BCTI_Public = 0x2
3155   };
3156 
3157   /// BuildTypeInfo - Build the RTTI type info struct for the given type, or
3158   /// link to an existing RTTI descriptor if one already exists.
3159   llvm::Constant *BuildTypeInfo(QualType Ty);
3160 
3161   /// BuildTypeInfo - Build the RTTI type info struct for the given type.
3162   llvm::Constant *BuildTypeInfo(
3163       QualType Ty,
3164       llvm::GlobalVariable::LinkageTypes Linkage,
3165       llvm::GlobalValue::VisibilityTypes Visibility,
3166       llvm::GlobalValue::DLLStorageClassTypes DLLStorageClass);
3167 };
3168 }
3169 
3170 llvm::GlobalVariable *ItaniumRTTIBuilder::GetAddrOfTypeName(
3171     QualType Ty, llvm::GlobalVariable::LinkageTypes Linkage) {
3172   SmallString<256> Name;
3173   llvm::raw_svector_ostream Out(Name);
3174   CGM.getCXXABI().getMangleContext().mangleCXXRTTIName(Ty, Out);
3175 
3176   // We know that the mangled name of the type starts at index 4 of the
3177   // mangled name of the typename, so we can just index into it in order to
3178   // get the mangled name of the type.
3179   llvm::Constant *Init = llvm::ConstantDataArray::getString(VMContext,
3180                                                             Name.substr(4));
3181   auto Align = CGM.getContext().getTypeAlignInChars(CGM.getContext().CharTy);
3182 
3183   llvm::GlobalVariable *GV = CGM.CreateOrReplaceCXXRuntimeVariable(
3184       Name, Init->getType(), Linkage, Align.getAsAlign());
3185 
3186   GV->setInitializer(Init);
3187 
3188   return GV;
3189 }
3190 
3191 llvm::Constant *
3192 ItaniumRTTIBuilder::GetAddrOfExternalRTTIDescriptor(QualType Ty) {
3193   // Mangle the RTTI name.
3194   SmallString<256> Name;
3195   llvm::raw_svector_ostream Out(Name);
3196   CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out);
3197 
3198   // Look for an existing global.
3199   llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(Name);
3200 
3201   if (!GV) {
3202     // Create a new global variable.
3203     // Note for the future: If we would ever like to do deferred emission of
3204     // RTTI, check if emitting vtables opportunistically need any adjustment.
3205 
3206     GV = new llvm::GlobalVariable(CGM.getModule(), CGM.Int8PtrTy,
3207                                   /*isConstant=*/true,
3208                                   llvm::GlobalValue::ExternalLinkage, nullptr,
3209                                   Name);
3210     const CXXRecordDecl *RD = Ty->getAsCXXRecordDecl();
3211     CGM.setGVProperties(GV, RD);
3212     // Import the typeinfo symbol when all non-inline virtual methods are
3213     // imported.
3214     if (CGM.getTarget().hasPS4DLLImportExport()) {
3215       if (RD && CXXRecordAllNonInlineVirtualsHaveAttr<DLLImportAttr>(RD)) {
3216         GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
3217         CGM.setDSOLocal(GV);
3218       }
3219     }
3220   }
3221 
3222   return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy);
3223 }
3224 
3225 /// TypeInfoIsInStandardLibrary - Given a builtin type, returns whether the type
3226 /// info for that type is defined in the standard library.
3227 static bool TypeInfoIsInStandardLibrary(const BuiltinType *Ty) {
3228   // Itanium C++ ABI 2.9.2:
3229   //   Basic type information (e.g. for "int", "bool", etc.) will be kept in
3230   //   the run-time support library. Specifically, the run-time support
3231   //   library should contain type_info objects for the types X, X* and
3232   //   X const*, for every X in: void, std::nullptr_t, bool, wchar_t, char,
3233   //   unsigned char, signed char, short, unsigned short, int, unsigned int,
3234   //   long, unsigned long, long long, unsigned long long, float, double,
3235   //   long double, char16_t, char32_t, and the IEEE 754r decimal and
3236   //   half-precision floating point types.
3237   //
3238   // GCC also emits RTTI for __int128.
3239   // FIXME: We do not emit RTTI information for decimal types here.
3240 
3241   // Types added here must also be added to EmitFundamentalRTTIDescriptors.
3242   switch (Ty->getKind()) {
3243     case BuiltinType::Void:
3244     case BuiltinType::NullPtr:
3245     case BuiltinType::Bool:
3246     case BuiltinType::WChar_S:
3247     case BuiltinType::WChar_U:
3248     case BuiltinType::Char_U:
3249     case BuiltinType::Char_S:
3250     case BuiltinType::UChar:
3251     case BuiltinType::SChar:
3252     case BuiltinType::Short:
3253     case BuiltinType::UShort:
3254     case BuiltinType::Int:
3255     case BuiltinType::UInt:
3256     case BuiltinType::Long:
3257     case BuiltinType::ULong:
3258     case BuiltinType::LongLong:
3259     case BuiltinType::ULongLong:
3260     case BuiltinType::Half:
3261     case BuiltinType::Float:
3262     case BuiltinType::Double:
3263     case BuiltinType::LongDouble:
3264     case BuiltinType::Float16:
3265     case BuiltinType::Float128:
3266     case BuiltinType::Ibm128:
3267     case BuiltinType::Char8:
3268     case BuiltinType::Char16:
3269     case BuiltinType::Char32:
3270     case BuiltinType::Int128:
3271     case BuiltinType::UInt128:
3272       return true;
3273 
3274 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
3275     case BuiltinType::Id:
3276 #include "clang/Basic/OpenCLImageTypes.def"
3277 #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
3278     case BuiltinType::Id:
3279 #include "clang/Basic/OpenCLExtensionTypes.def"
3280     case BuiltinType::OCLSampler:
3281     case BuiltinType::OCLEvent:
3282     case BuiltinType::OCLClkEvent:
3283     case BuiltinType::OCLQueue:
3284     case BuiltinType::OCLReserveID:
3285 #define SVE_TYPE(Name, Id, SingletonId) \
3286     case BuiltinType::Id:
3287 #include "clang/Basic/AArch64SVEACLETypes.def"
3288 #define PPC_VECTOR_TYPE(Name, Id, Size) \
3289     case BuiltinType::Id:
3290 #include "clang/Basic/PPCTypes.def"
3291 #define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
3292 #include "clang/Basic/RISCVVTypes.def"
3293     case BuiltinType::ShortAccum:
3294     case BuiltinType::Accum:
3295     case BuiltinType::LongAccum:
3296     case BuiltinType::UShortAccum:
3297     case BuiltinType::UAccum:
3298     case BuiltinType::ULongAccum:
3299     case BuiltinType::ShortFract:
3300     case BuiltinType::Fract:
3301     case BuiltinType::LongFract:
3302     case BuiltinType::UShortFract:
3303     case BuiltinType::UFract:
3304     case BuiltinType::ULongFract:
3305     case BuiltinType::SatShortAccum:
3306     case BuiltinType::SatAccum:
3307     case BuiltinType::SatLongAccum:
3308     case BuiltinType::SatUShortAccum:
3309     case BuiltinType::SatUAccum:
3310     case BuiltinType::SatULongAccum:
3311     case BuiltinType::SatShortFract:
3312     case BuiltinType::SatFract:
3313     case BuiltinType::SatLongFract:
3314     case BuiltinType::SatUShortFract:
3315     case BuiltinType::SatUFract:
3316     case BuiltinType::SatULongFract:
3317     case BuiltinType::BFloat16:
3318       return false;
3319 
3320     case BuiltinType::Dependent:
3321 #define BUILTIN_TYPE(Id, SingletonId)
3322 #define PLACEHOLDER_TYPE(Id, SingletonId) \
3323     case BuiltinType::Id:
3324 #include "clang/AST/BuiltinTypes.def"
3325       llvm_unreachable("asking for RRTI for a placeholder type!");
3326 
3327     case BuiltinType::ObjCId:
3328     case BuiltinType::ObjCClass:
3329     case BuiltinType::ObjCSel:
3330       llvm_unreachable("FIXME: Objective-C types are unsupported!");
3331   }
3332 
3333   llvm_unreachable("Invalid BuiltinType Kind!");
3334 }
3335 
3336 static bool TypeInfoIsInStandardLibrary(const PointerType *PointerTy) {
3337   QualType PointeeTy = PointerTy->getPointeeType();
3338   const BuiltinType *BuiltinTy = dyn_cast<BuiltinType>(PointeeTy);
3339   if (!BuiltinTy)
3340     return false;
3341 
3342   // Check the qualifiers.
3343   Qualifiers Quals = PointeeTy.getQualifiers();
3344   Quals.removeConst();
3345 
3346   if (!Quals.empty())
3347     return false;
3348 
3349   return TypeInfoIsInStandardLibrary(BuiltinTy);
3350 }
3351 
3352 /// IsStandardLibraryRTTIDescriptor - Returns whether the type
3353 /// information for the given type exists in the standard library.
3354 static bool IsStandardLibraryRTTIDescriptor(QualType Ty) {
3355   // Type info for builtin types is defined in the standard library.
3356   if (const BuiltinType *BuiltinTy = dyn_cast<BuiltinType>(Ty))
3357     return TypeInfoIsInStandardLibrary(BuiltinTy);
3358 
3359   // Type info for some pointer types to builtin types is defined in the
3360   // standard library.
3361   if (const PointerType *PointerTy = dyn_cast<PointerType>(Ty))
3362     return TypeInfoIsInStandardLibrary(PointerTy);
3363 
3364   return false;
3365 }
3366 
3367 /// ShouldUseExternalRTTIDescriptor - Returns whether the type information for
3368 /// the given type exists somewhere else, and that we should not emit the type
3369 /// information in this translation unit.  Assumes that it is not a
3370 /// standard-library type.
3371 static bool ShouldUseExternalRTTIDescriptor(CodeGenModule &CGM,
3372                                             QualType Ty) {
3373   ASTContext &Context = CGM.getContext();
3374 
3375   // If RTTI is disabled, assume it might be disabled in the
3376   // translation unit that defines any potential key function, too.
3377   if (!Context.getLangOpts().RTTI) return false;
3378 
3379   if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) {
3380     const CXXRecordDecl *RD = cast<CXXRecordDecl>(RecordTy->getDecl());
3381     if (!RD->hasDefinition())
3382       return false;
3383 
3384     if (!RD->isDynamicClass())
3385       return false;
3386 
3387     // FIXME: this may need to be reconsidered if the key function
3388     // changes.
3389     // N.B. We must always emit the RTTI data ourselves if there exists a key
3390     // function.
3391     bool IsDLLImport = RD->hasAttr<DLLImportAttr>();
3392 
3393     // Don't import the RTTI but emit it locally.
3394     if (CGM.getTriple().isWindowsGNUEnvironment())
3395       return false;
3396 
3397     if (CGM.getVTables().isVTableExternal(RD)) {
3398       if (CGM.getTarget().hasPS4DLLImportExport())
3399         return true;
3400 
3401       return IsDLLImport && !CGM.getTriple().isWindowsItaniumEnvironment()
3402                  ? false
3403                  : true;
3404     }
3405     if (IsDLLImport)
3406       return true;
3407   }
3408 
3409   return false;
3410 }
3411 
3412 /// IsIncompleteClassType - Returns whether the given record type is incomplete.
3413 static bool IsIncompleteClassType(const RecordType *RecordTy) {
3414   return !RecordTy->getDecl()->isCompleteDefinition();
3415 }
3416 
3417 /// ContainsIncompleteClassType - Returns whether the given type contains an
3418 /// incomplete class type. This is true if
3419 ///
3420 ///   * The given type is an incomplete class type.
3421 ///   * The given type is a pointer type whose pointee type contains an
3422 ///     incomplete class type.
3423 ///   * The given type is a member pointer type whose class is an incomplete
3424 ///     class type.
3425 ///   * The given type is a member pointer type whoise pointee type contains an
3426 ///     incomplete class type.
3427 /// is an indirect or direct pointer to an incomplete class type.
3428 static bool ContainsIncompleteClassType(QualType Ty) {
3429   if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) {
3430     if (IsIncompleteClassType(RecordTy))
3431       return true;
3432   }
3433 
3434   if (const PointerType *PointerTy = dyn_cast<PointerType>(Ty))
3435     return ContainsIncompleteClassType(PointerTy->getPointeeType());
3436 
3437   if (const MemberPointerType *MemberPointerTy =
3438       dyn_cast<MemberPointerType>(Ty)) {
3439     // Check if the class type is incomplete.
3440     const RecordType *ClassType = cast<RecordType>(MemberPointerTy->getClass());
3441     if (IsIncompleteClassType(ClassType))
3442       return true;
3443 
3444     return ContainsIncompleteClassType(MemberPointerTy->getPointeeType());
3445   }
3446 
3447   return false;
3448 }
3449 
3450 // CanUseSingleInheritance - Return whether the given record decl has a "single,
3451 // public, non-virtual base at offset zero (i.e. the derived class is dynamic
3452 // iff the base is)", according to Itanium C++ ABI, 2.95p6b.
3453 static bool CanUseSingleInheritance(const CXXRecordDecl *RD) {
3454   // Check the number of bases.
3455   if (RD->getNumBases() != 1)
3456     return false;
3457 
3458   // Get the base.
3459   CXXRecordDecl::base_class_const_iterator Base = RD->bases_begin();
3460 
3461   // Check that the base is not virtual.
3462   if (Base->isVirtual())
3463     return false;
3464 
3465   // Check that the base is public.
3466   if (Base->getAccessSpecifier() != AS_public)
3467     return false;
3468 
3469   // Check that the class is dynamic iff the base is.
3470   auto *BaseDecl =
3471       cast<CXXRecordDecl>(Base->getType()->castAs<RecordType>()->getDecl());
3472   if (!BaseDecl->isEmpty() &&
3473       BaseDecl->isDynamicClass() != RD->isDynamicClass())
3474     return false;
3475 
3476   return true;
3477 }
3478 
3479 void ItaniumRTTIBuilder::BuildVTablePointer(const Type *Ty) {
3480   // abi::__class_type_info.
3481   static const char * const ClassTypeInfo =
3482     "_ZTVN10__cxxabiv117__class_type_infoE";
3483   // abi::__si_class_type_info.
3484   static const char * const SIClassTypeInfo =
3485     "_ZTVN10__cxxabiv120__si_class_type_infoE";
3486   // abi::__vmi_class_type_info.
3487   static const char * const VMIClassTypeInfo =
3488     "_ZTVN10__cxxabiv121__vmi_class_type_infoE";
3489 
3490   const char *VTableName = nullptr;
3491 
3492   switch (Ty->getTypeClass()) {
3493 #define TYPE(Class, Base)
3494 #define ABSTRACT_TYPE(Class, Base)
3495 #define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
3496 #define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
3497 #define DEPENDENT_TYPE(Class, Base) case Type::Class:
3498 #include "clang/AST/TypeNodes.inc"
3499     llvm_unreachable("Non-canonical and dependent types shouldn't get here");
3500 
3501   case Type::LValueReference:
3502   case Type::RValueReference:
3503     llvm_unreachable("References shouldn't get here");
3504 
3505   case Type::Auto:
3506   case Type::DeducedTemplateSpecialization:
3507     llvm_unreachable("Undeduced type shouldn't get here");
3508 
3509   case Type::Pipe:
3510     llvm_unreachable("Pipe types shouldn't get here");
3511 
3512   case Type::Builtin:
3513   case Type::BitInt:
3514   // GCC treats vector and complex types as fundamental types.
3515   case Type::Vector:
3516   case Type::ExtVector:
3517   case Type::ConstantMatrix:
3518   case Type::Complex:
3519   case Type::Atomic:
3520   // FIXME: GCC treats block pointers as fundamental types?!
3521   case Type::BlockPointer:
3522     // abi::__fundamental_type_info.
3523     VTableName = "_ZTVN10__cxxabiv123__fundamental_type_infoE";
3524     break;
3525 
3526   case Type::ConstantArray:
3527   case Type::IncompleteArray:
3528   case Type::VariableArray:
3529     // abi::__array_type_info.
3530     VTableName = "_ZTVN10__cxxabiv117__array_type_infoE";
3531     break;
3532 
3533   case Type::FunctionNoProto:
3534   case Type::FunctionProto:
3535     // abi::__function_type_info.
3536     VTableName = "_ZTVN10__cxxabiv120__function_type_infoE";
3537     break;
3538 
3539   case Type::Enum:
3540     // abi::__enum_type_info.
3541     VTableName = "_ZTVN10__cxxabiv116__enum_type_infoE";
3542     break;
3543 
3544   case Type::Record: {
3545     const CXXRecordDecl *RD =
3546       cast<CXXRecordDecl>(cast<RecordType>(Ty)->getDecl());
3547 
3548     if (!RD->hasDefinition() || !RD->getNumBases()) {
3549       VTableName = ClassTypeInfo;
3550     } else if (CanUseSingleInheritance(RD)) {
3551       VTableName = SIClassTypeInfo;
3552     } else {
3553       VTableName = VMIClassTypeInfo;
3554     }
3555 
3556     break;
3557   }
3558 
3559   case Type::ObjCObject:
3560     // Ignore protocol qualifiers.
3561     Ty = cast<ObjCObjectType>(Ty)->getBaseType().getTypePtr();
3562 
3563     // Handle id and Class.
3564     if (isa<BuiltinType>(Ty)) {
3565       VTableName = ClassTypeInfo;
3566       break;
3567     }
3568 
3569     assert(isa<ObjCInterfaceType>(Ty));
3570     [[fallthrough]];
3571 
3572   case Type::ObjCInterface:
3573     if (cast<ObjCInterfaceType>(Ty)->getDecl()->getSuperClass()) {
3574       VTableName = SIClassTypeInfo;
3575     } else {
3576       VTableName = ClassTypeInfo;
3577     }
3578     break;
3579 
3580   case Type::ObjCObjectPointer:
3581   case Type::Pointer:
3582     // abi::__pointer_type_info.
3583     VTableName = "_ZTVN10__cxxabiv119__pointer_type_infoE";
3584     break;
3585 
3586   case Type::MemberPointer:
3587     // abi::__pointer_to_member_type_info.
3588     VTableName = "_ZTVN10__cxxabiv129__pointer_to_member_type_infoE";
3589     break;
3590   }
3591 
3592   llvm::Constant *VTable = nullptr;
3593 
3594   // Check if the alias exists. If it doesn't, then get or create the global.
3595   if (CGM.getItaniumVTableContext().isRelativeLayout())
3596     VTable = CGM.getModule().getNamedAlias(VTableName);
3597   if (!VTable)
3598     VTable = CGM.getModule().getOrInsertGlobal(VTableName, CGM.Int8PtrTy);
3599 
3600   CGM.setDSOLocal(cast<llvm::GlobalValue>(VTable->stripPointerCasts()));
3601 
3602   llvm::Type *PtrDiffTy =
3603       CGM.getTypes().ConvertType(CGM.getContext().getPointerDiffType());
3604 
3605   // The vtable address point is 2.
3606   if (CGM.getItaniumVTableContext().isRelativeLayout()) {
3607     // The vtable address point is 8 bytes after its start:
3608     // 4 for the offset to top + 4 for the relative offset to rtti.
3609     llvm::Constant *Eight = llvm::ConstantInt::get(CGM.Int32Ty, 8);
3610     VTable = llvm::ConstantExpr::getBitCast(VTable, CGM.Int8PtrTy);
3611     VTable =
3612         llvm::ConstantExpr::getInBoundsGetElementPtr(CGM.Int8Ty, VTable, Eight);
3613   } else {
3614     llvm::Constant *Two = llvm::ConstantInt::get(PtrDiffTy, 2);
3615     VTable = llvm::ConstantExpr::getInBoundsGetElementPtr(CGM.Int8PtrTy, VTable,
3616                                                           Two);
3617   }
3618   VTable = llvm::ConstantExpr::getBitCast(VTable, CGM.Int8PtrTy);
3619 
3620   Fields.push_back(VTable);
3621 }
3622 
3623 /// Return the linkage that the type info and type info name constants
3624 /// should have for the given type.
3625 static llvm::GlobalVariable::LinkageTypes getTypeInfoLinkage(CodeGenModule &CGM,
3626                                                              QualType Ty) {
3627   // Itanium C++ ABI 2.9.5p7:
3628   //   In addition, it and all of the intermediate abi::__pointer_type_info
3629   //   structs in the chain down to the abi::__class_type_info for the
3630   //   incomplete class type must be prevented from resolving to the
3631   //   corresponding type_info structs for the complete class type, possibly
3632   //   by making them local static objects. Finally, a dummy class RTTI is
3633   //   generated for the incomplete type that will not resolve to the final
3634   //   complete class RTTI (because the latter need not exist), possibly by
3635   //   making it a local static object.
3636   if (ContainsIncompleteClassType(Ty))
3637     return llvm::GlobalValue::InternalLinkage;
3638 
3639   switch (Ty->getLinkage()) {
3640   case NoLinkage:
3641   case InternalLinkage:
3642   case UniqueExternalLinkage:
3643     return llvm::GlobalValue::InternalLinkage;
3644 
3645   case VisibleNoLinkage:
3646   case ModuleInternalLinkage:
3647   case ModuleLinkage:
3648   case ExternalLinkage:
3649     // RTTI is not enabled, which means that this type info struct is going
3650     // to be used for exception handling. Give it linkonce_odr linkage.
3651     if (!CGM.getLangOpts().RTTI)
3652       return llvm::GlobalValue::LinkOnceODRLinkage;
3653 
3654     if (const RecordType *Record = dyn_cast<RecordType>(Ty)) {
3655       const CXXRecordDecl *RD = cast<CXXRecordDecl>(Record->getDecl());
3656       if (RD->hasAttr<WeakAttr>())
3657         return llvm::GlobalValue::WeakODRLinkage;
3658       if (CGM.getTriple().isWindowsItaniumEnvironment())
3659         if (RD->hasAttr<DLLImportAttr>() &&
3660             ShouldUseExternalRTTIDescriptor(CGM, Ty))
3661           return llvm::GlobalValue::ExternalLinkage;
3662       // MinGW always uses LinkOnceODRLinkage for type info.
3663       if (RD->isDynamicClass() &&
3664           !CGM.getContext()
3665                .getTargetInfo()
3666                .getTriple()
3667                .isWindowsGNUEnvironment())
3668         return CGM.getVTableLinkage(RD);
3669     }
3670 
3671     return llvm::GlobalValue::LinkOnceODRLinkage;
3672   }
3673 
3674   llvm_unreachable("Invalid linkage!");
3675 }
3676 
3677 llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo(QualType Ty) {
3678   // We want to operate on the canonical type.
3679   Ty = Ty.getCanonicalType();
3680 
3681   // Check if we've already emitted an RTTI descriptor for this type.
3682   SmallString<256> Name;
3683   llvm::raw_svector_ostream Out(Name);
3684   CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out);
3685 
3686   llvm::GlobalVariable *OldGV = CGM.getModule().getNamedGlobal(Name);
3687   if (OldGV && !OldGV->isDeclaration()) {
3688     assert(!OldGV->hasAvailableExternallyLinkage() &&
3689            "available_externally typeinfos not yet implemented");
3690 
3691     return llvm::ConstantExpr::getBitCast(OldGV, CGM.Int8PtrTy);
3692   }
3693 
3694   // Check if there is already an external RTTI descriptor for this type.
3695   if (IsStandardLibraryRTTIDescriptor(Ty) ||
3696       ShouldUseExternalRTTIDescriptor(CGM, Ty))
3697     return GetAddrOfExternalRTTIDescriptor(Ty);
3698 
3699   // Emit the standard library with external linkage.
3700   llvm::GlobalVariable::LinkageTypes Linkage = getTypeInfoLinkage(CGM, Ty);
3701 
3702   // Give the type_info object and name the formal visibility of the
3703   // type itself.
3704   llvm::GlobalValue::VisibilityTypes llvmVisibility;
3705   if (llvm::GlobalValue::isLocalLinkage(Linkage))
3706     // If the linkage is local, only default visibility makes sense.
3707     llvmVisibility = llvm::GlobalValue::DefaultVisibility;
3708   else if (CXXABI.classifyRTTIUniqueness(Ty, Linkage) ==
3709            ItaniumCXXABI::RUK_NonUniqueHidden)
3710     llvmVisibility = llvm::GlobalValue::HiddenVisibility;
3711   else
3712     llvmVisibility = CodeGenModule::GetLLVMVisibility(Ty->getVisibility());
3713 
3714   llvm::GlobalValue::DLLStorageClassTypes DLLStorageClass =
3715       llvm::GlobalValue::DefaultStorageClass;
3716   if (auto RD = Ty->getAsCXXRecordDecl()) {
3717     if ((CGM.getTriple().isWindowsItaniumEnvironment() &&
3718          RD->hasAttr<DLLExportAttr>()) ||
3719         (CGM.shouldMapVisibilityToDLLExport(RD) &&
3720          !llvm::GlobalValue::isLocalLinkage(Linkage) &&
3721          llvmVisibility == llvm::GlobalValue::DefaultVisibility))
3722       DLLStorageClass = llvm::GlobalValue::DLLExportStorageClass;
3723   }
3724   return BuildTypeInfo(Ty, Linkage, llvmVisibility, DLLStorageClass);
3725 }
3726 
3727 llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo(
3728       QualType Ty,
3729       llvm::GlobalVariable::LinkageTypes Linkage,
3730       llvm::GlobalValue::VisibilityTypes Visibility,
3731       llvm::GlobalValue::DLLStorageClassTypes DLLStorageClass) {
3732   // Add the vtable pointer.
3733   BuildVTablePointer(cast<Type>(Ty));
3734 
3735   // And the name.
3736   llvm::GlobalVariable *TypeName = GetAddrOfTypeName(Ty, Linkage);
3737   llvm::Constant *TypeNameField;
3738 
3739   // If we're supposed to demote the visibility, be sure to set a flag
3740   // to use a string comparison for type_info comparisons.
3741   ItaniumCXXABI::RTTIUniquenessKind RTTIUniqueness =
3742       CXXABI.classifyRTTIUniqueness(Ty, Linkage);
3743   if (RTTIUniqueness != ItaniumCXXABI::RUK_Unique) {
3744     // The flag is the sign bit, which on ARM64 is defined to be clear
3745     // for global pointers.  This is very ARM64-specific.
3746     TypeNameField = llvm::ConstantExpr::getPtrToInt(TypeName, CGM.Int64Ty);
3747     llvm::Constant *flag =
3748         llvm::ConstantInt::get(CGM.Int64Ty, ((uint64_t)1) << 63);
3749     TypeNameField = llvm::ConstantExpr::getAdd(TypeNameField, flag);
3750     TypeNameField =
3751         llvm::ConstantExpr::getIntToPtr(TypeNameField, CGM.Int8PtrTy);
3752   } else {
3753     TypeNameField = llvm::ConstantExpr::getBitCast(TypeName, CGM.Int8PtrTy);
3754   }
3755   Fields.push_back(TypeNameField);
3756 
3757   switch (Ty->getTypeClass()) {
3758 #define TYPE(Class, Base)
3759 #define ABSTRACT_TYPE(Class, Base)
3760 #define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
3761 #define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
3762 #define DEPENDENT_TYPE(Class, Base) case Type::Class:
3763 #include "clang/AST/TypeNodes.inc"
3764     llvm_unreachable("Non-canonical and dependent types shouldn't get here");
3765 
3766   // GCC treats vector types as fundamental types.
3767   case Type::Builtin:
3768   case Type::Vector:
3769   case Type::ExtVector:
3770   case Type::ConstantMatrix:
3771   case Type::Complex:
3772   case Type::BlockPointer:
3773     // Itanium C++ ABI 2.9.5p4:
3774     // abi::__fundamental_type_info adds no data members to std::type_info.
3775     break;
3776 
3777   case Type::LValueReference:
3778   case Type::RValueReference:
3779     llvm_unreachable("References shouldn't get here");
3780 
3781   case Type::Auto:
3782   case Type::DeducedTemplateSpecialization:
3783     llvm_unreachable("Undeduced type shouldn't get here");
3784 
3785   case Type::Pipe:
3786     break;
3787 
3788   case Type::BitInt:
3789     break;
3790 
3791   case Type::ConstantArray:
3792   case Type::IncompleteArray:
3793   case Type::VariableArray:
3794     // Itanium C++ ABI 2.9.5p5:
3795     // abi::__array_type_info adds no data members to std::type_info.
3796     break;
3797 
3798   case Type::FunctionNoProto:
3799   case Type::FunctionProto:
3800     // Itanium C++ ABI 2.9.5p5:
3801     // abi::__function_type_info adds no data members to std::type_info.
3802     break;
3803 
3804   case Type::Enum:
3805     // Itanium C++ ABI 2.9.5p5:
3806     // abi::__enum_type_info adds no data members to std::type_info.
3807     break;
3808 
3809   case Type::Record: {
3810     const CXXRecordDecl *RD =
3811       cast<CXXRecordDecl>(cast<RecordType>(Ty)->getDecl());
3812     if (!RD->hasDefinition() || !RD->getNumBases()) {
3813       // We don't need to emit any fields.
3814       break;
3815     }
3816 
3817     if (CanUseSingleInheritance(RD))
3818       BuildSIClassTypeInfo(RD);
3819     else
3820       BuildVMIClassTypeInfo(RD);
3821 
3822     break;
3823   }
3824 
3825   case Type::ObjCObject:
3826   case Type::ObjCInterface:
3827     BuildObjCObjectTypeInfo(cast<ObjCObjectType>(Ty));
3828     break;
3829 
3830   case Type::ObjCObjectPointer:
3831     BuildPointerTypeInfo(cast<ObjCObjectPointerType>(Ty)->getPointeeType());
3832     break;
3833 
3834   case Type::Pointer:
3835     BuildPointerTypeInfo(cast<PointerType>(Ty)->getPointeeType());
3836     break;
3837 
3838   case Type::MemberPointer:
3839     BuildPointerToMemberTypeInfo(cast<MemberPointerType>(Ty));
3840     break;
3841 
3842   case Type::Atomic:
3843     // No fields, at least for the moment.
3844     break;
3845   }
3846 
3847   llvm::Constant *Init = llvm::ConstantStruct::getAnon(Fields);
3848 
3849   SmallString<256> Name;
3850   llvm::raw_svector_ostream Out(Name);
3851   CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out);
3852   llvm::Module &M = CGM.getModule();
3853   llvm::GlobalVariable *OldGV = M.getNamedGlobal(Name);
3854   llvm::GlobalVariable *GV =
3855       new llvm::GlobalVariable(M, Init->getType(),
3856                                /*isConstant=*/true, Linkage, Init, Name);
3857 
3858   // Export the typeinfo in the same circumstances as the vtable is exported.
3859   auto GVDLLStorageClass = DLLStorageClass;
3860   if (CGM.getTarget().hasPS4DLLImportExport()) {
3861     if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) {
3862       const CXXRecordDecl *RD = cast<CXXRecordDecl>(RecordTy->getDecl());
3863       if (RD->hasAttr<DLLExportAttr>() ||
3864           CXXRecordAllNonInlineVirtualsHaveAttr<DLLExportAttr>(RD)) {
3865         GVDLLStorageClass = llvm::GlobalVariable::DLLExportStorageClass;
3866       }
3867     }
3868   }
3869 
3870   // If there's already an old global variable, replace it with the new one.
3871   if (OldGV) {
3872     GV->takeName(OldGV);
3873     llvm::Constant *NewPtr =
3874       llvm::ConstantExpr::getBitCast(GV, OldGV->getType());
3875     OldGV->replaceAllUsesWith(NewPtr);
3876     OldGV->eraseFromParent();
3877   }
3878 
3879   if (CGM.supportsCOMDAT() && GV->isWeakForLinker())
3880     GV->setComdat(M.getOrInsertComdat(GV->getName()));
3881 
3882   CharUnits Align = CGM.getContext().toCharUnitsFromBits(
3883       CGM.getTarget().getPointerAlign(LangAS::Default));
3884   GV->setAlignment(Align.getAsAlign());
3885 
3886   // The Itanium ABI specifies that type_info objects must be globally
3887   // unique, with one exception: if the type is an incomplete class
3888   // type or a (possibly indirect) pointer to one.  That exception
3889   // affects the general case of comparing type_info objects produced
3890   // by the typeid operator, which is why the comparison operators on
3891   // std::type_info generally use the type_info name pointers instead
3892   // of the object addresses.  However, the language's built-in uses
3893   // of RTTI generally require class types to be complete, even when
3894   // manipulating pointers to those class types.  This allows the
3895   // implementation of dynamic_cast to rely on address equality tests,
3896   // which is much faster.
3897 
3898   // All of this is to say that it's important that both the type_info
3899   // object and the type_info name be uniqued when weakly emitted.
3900 
3901   TypeName->setVisibility(Visibility);
3902   CGM.setDSOLocal(TypeName);
3903 
3904   GV->setVisibility(Visibility);
3905   CGM.setDSOLocal(GV);
3906 
3907   TypeName->setDLLStorageClass(DLLStorageClass);
3908   GV->setDLLStorageClass(CGM.getTarget().hasPS4DLLImportExport()
3909                              ? GVDLLStorageClass
3910                              : DLLStorageClass);
3911 
3912   TypeName->setPartition(CGM.getCodeGenOpts().SymbolPartition);
3913   GV->setPartition(CGM.getCodeGenOpts().SymbolPartition);
3914 
3915   return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy);
3916 }
3917 
3918 /// BuildObjCObjectTypeInfo - Build the appropriate kind of type_info
3919 /// for the given Objective-C object type.
3920 void ItaniumRTTIBuilder::BuildObjCObjectTypeInfo(const ObjCObjectType *OT) {
3921   // Drop qualifiers.
3922   const Type *T = OT->getBaseType().getTypePtr();
3923   assert(isa<BuiltinType>(T) || isa<ObjCInterfaceType>(T));
3924 
3925   // The builtin types are abi::__class_type_infos and don't require
3926   // extra fields.
3927   if (isa<BuiltinType>(T)) return;
3928 
3929   ObjCInterfaceDecl *Class = cast<ObjCInterfaceType>(T)->getDecl();
3930   ObjCInterfaceDecl *Super = Class->getSuperClass();
3931 
3932   // Root classes are also __class_type_info.
3933   if (!Super) return;
3934 
3935   QualType SuperTy = CGM.getContext().getObjCInterfaceType(Super);
3936 
3937   // Everything else is single inheritance.
3938   llvm::Constant *BaseTypeInfo =
3939       ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(SuperTy);
3940   Fields.push_back(BaseTypeInfo);
3941 }
3942 
3943 /// BuildSIClassTypeInfo - Build an abi::__si_class_type_info, used for single
3944 /// inheritance, according to the Itanium C++ ABI, 2.95p6b.
3945 void ItaniumRTTIBuilder::BuildSIClassTypeInfo(const CXXRecordDecl *RD) {
3946   // Itanium C++ ABI 2.9.5p6b:
3947   // It adds to abi::__class_type_info a single member pointing to the
3948   // type_info structure for the base type,
3949   llvm::Constant *BaseTypeInfo =
3950     ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(RD->bases_begin()->getType());
3951   Fields.push_back(BaseTypeInfo);
3952 }
3953 
3954 namespace {
3955   /// SeenBases - Contains virtual and non-virtual bases seen when traversing
3956   /// a class hierarchy.
3957   struct SeenBases {
3958     llvm::SmallPtrSet<const CXXRecordDecl *, 16> NonVirtualBases;
3959     llvm::SmallPtrSet<const CXXRecordDecl *, 16> VirtualBases;
3960   };
3961 }
3962 
3963 /// ComputeVMIClassTypeInfoFlags - Compute the value of the flags member in
3964 /// abi::__vmi_class_type_info.
3965 ///
3966 static unsigned ComputeVMIClassTypeInfoFlags(const CXXBaseSpecifier *Base,
3967                                              SeenBases &Bases) {
3968 
3969   unsigned Flags = 0;
3970 
3971   auto *BaseDecl =
3972       cast<CXXRecordDecl>(Base->getType()->castAs<RecordType>()->getDecl());
3973 
3974   if (Base->isVirtual()) {
3975     // Mark the virtual base as seen.
3976     if (!Bases.VirtualBases.insert(BaseDecl).second) {
3977       // If this virtual base has been seen before, then the class is diamond
3978       // shaped.
3979       Flags |= ItaniumRTTIBuilder::VMI_DiamondShaped;
3980     } else {
3981       if (Bases.NonVirtualBases.count(BaseDecl))
3982         Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat;
3983     }
3984   } else {
3985     // Mark the non-virtual base as seen.
3986     if (!Bases.NonVirtualBases.insert(BaseDecl).second) {
3987       // If this non-virtual base has been seen before, then the class has non-
3988       // diamond shaped repeated inheritance.
3989       Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat;
3990     } else {
3991       if (Bases.VirtualBases.count(BaseDecl))
3992         Flags |= ItaniumRTTIBuilder::VMI_NonDiamondRepeat;
3993     }
3994   }
3995 
3996   // Walk all bases.
3997   for (const auto &I : BaseDecl->bases())
3998     Flags |= ComputeVMIClassTypeInfoFlags(&I, Bases);
3999 
4000   return Flags;
4001 }
4002 
4003 static unsigned ComputeVMIClassTypeInfoFlags(const CXXRecordDecl *RD) {
4004   unsigned Flags = 0;
4005   SeenBases Bases;
4006 
4007   // Walk all bases.
4008   for (const auto &I : RD->bases())
4009     Flags |= ComputeVMIClassTypeInfoFlags(&I, Bases);
4010 
4011   return Flags;
4012 }
4013 
4014 /// BuildVMIClassTypeInfo - Build an abi::__vmi_class_type_info, used for
4015 /// classes with bases that do not satisfy the abi::__si_class_type_info
4016 /// constraints, according ti the Itanium C++ ABI, 2.9.5p5c.
4017 void ItaniumRTTIBuilder::BuildVMIClassTypeInfo(const CXXRecordDecl *RD) {
4018   llvm::Type *UnsignedIntLTy =
4019     CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy);
4020 
4021   // Itanium C++ ABI 2.9.5p6c:
4022   //   __flags is a word with flags describing details about the class
4023   //   structure, which may be referenced by using the __flags_masks
4024   //   enumeration. These flags refer to both direct and indirect bases.
4025   unsigned Flags = ComputeVMIClassTypeInfoFlags(RD);
4026   Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags));
4027 
4028   // Itanium C++ ABI 2.9.5p6c:
4029   //   __base_count is a word with the number of direct proper base class
4030   //   descriptions that follow.
4031   Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, RD->getNumBases()));
4032 
4033   if (!RD->getNumBases())
4034     return;
4035 
4036   // Now add the base class descriptions.
4037 
4038   // Itanium C++ ABI 2.9.5p6c:
4039   //   __base_info[] is an array of base class descriptions -- one for every
4040   //   direct proper base. Each description is of the type:
4041   //
4042   //   struct abi::__base_class_type_info {
4043   //   public:
4044   //     const __class_type_info *__base_type;
4045   //     long __offset_flags;
4046   //
4047   //     enum __offset_flags_masks {
4048   //       __virtual_mask = 0x1,
4049   //       __public_mask = 0x2,
4050   //       __offset_shift = 8
4051   //     };
4052   //   };
4053 
4054   // If we're in mingw and 'long' isn't wide enough for a pointer, use 'long
4055   // long' instead of 'long' for __offset_flags. libstdc++abi uses long long on
4056   // LLP64 platforms.
4057   // FIXME: Consider updating libc++abi to match, and extend this logic to all
4058   // LLP64 platforms.
4059   QualType OffsetFlagsTy = CGM.getContext().LongTy;
4060   const TargetInfo &TI = CGM.getContext().getTargetInfo();
4061   if (TI.getTriple().isOSCygMing() &&
4062       TI.getPointerWidth(LangAS::Default) > TI.getLongWidth())
4063     OffsetFlagsTy = CGM.getContext().LongLongTy;
4064   llvm::Type *OffsetFlagsLTy =
4065       CGM.getTypes().ConvertType(OffsetFlagsTy);
4066 
4067   for (const auto &Base : RD->bases()) {
4068     // The __base_type member points to the RTTI for the base type.
4069     Fields.push_back(ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(Base.getType()));
4070 
4071     auto *BaseDecl =
4072         cast<CXXRecordDecl>(Base.getType()->castAs<RecordType>()->getDecl());
4073 
4074     int64_t OffsetFlags = 0;
4075 
4076     // All but the lower 8 bits of __offset_flags are a signed offset.
4077     // For a non-virtual base, this is the offset in the object of the base
4078     // subobject. For a virtual base, this is the offset in the virtual table of
4079     // the virtual base offset for the virtual base referenced (negative).
4080     CharUnits Offset;
4081     if (Base.isVirtual())
4082       Offset =
4083         CGM.getItaniumVTableContext().getVirtualBaseOffsetOffset(RD, BaseDecl);
4084     else {
4085       const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD);
4086       Offset = Layout.getBaseClassOffset(BaseDecl);
4087     };
4088 
4089     OffsetFlags = uint64_t(Offset.getQuantity()) << 8;
4090 
4091     // The low-order byte of __offset_flags contains flags, as given by the
4092     // masks from the enumeration __offset_flags_masks.
4093     if (Base.isVirtual())
4094       OffsetFlags |= BCTI_Virtual;
4095     if (Base.getAccessSpecifier() == AS_public)
4096       OffsetFlags |= BCTI_Public;
4097 
4098     Fields.push_back(llvm::ConstantInt::get(OffsetFlagsLTy, OffsetFlags));
4099   }
4100 }
4101 
4102 /// Compute the flags for a __pbase_type_info, and remove the corresponding
4103 /// pieces from \p Type.
4104 static unsigned extractPBaseFlags(ASTContext &Ctx, QualType &Type) {
4105   unsigned Flags = 0;
4106 
4107   if (Type.isConstQualified())
4108     Flags |= ItaniumRTTIBuilder::PTI_Const;
4109   if (Type.isVolatileQualified())
4110     Flags |= ItaniumRTTIBuilder::PTI_Volatile;
4111   if (Type.isRestrictQualified())
4112     Flags |= ItaniumRTTIBuilder::PTI_Restrict;
4113   Type = Type.getUnqualifiedType();
4114 
4115   // Itanium C++ ABI 2.9.5p7:
4116   //   When the abi::__pbase_type_info is for a direct or indirect pointer to an
4117   //   incomplete class type, the incomplete target type flag is set.
4118   if (ContainsIncompleteClassType(Type))
4119     Flags |= ItaniumRTTIBuilder::PTI_Incomplete;
4120 
4121   if (auto *Proto = Type->getAs<FunctionProtoType>()) {
4122     if (Proto->isNothrow()) {
4123       Flags |= ItaniumRTTIBuilder::PTI_Noexcept;
4124       Type = Ctx.getFunctionTypeWithExceptionSpec(Type, EST_None);
4125     }
4126   }
4127 
4128   return Flags;
4129 }
4130 
4131 /// BuildPointerTypeInfo - Build an abi::__pointer_type_info struct,
4132 /// used for pointer types.
4133 void ItaniumRTTIBuilder::BuildPointerTypeInfo(QualType PointeeTy) {
4134   // Itanium C++ ABI 2.9.5p7:
4135   //   __flags is a flag word describing the cv-qualification and other
4136   //   attributes of the type pointed to
4137   unsigned Flags = extractPBaseFlags(CGM.getContext(), PointeeTy);
4138 
4139   llvm::Type *UnsignedIntLTy =
4140     CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy);
4141   Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags));
4142 
4143   // Itanium C++ ABI 2.9.5p7:
4144   //  __pointee is a pointer to the std::type_info derivation for the
4145   //  unqualified type being pointed to.
4146   llvm::Constant *PointeeTypeInfo =
4147       ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(PointeeTy);
4148   Fields.push_back(PointeeTypeInfo);
4149 }
4150 
4151 /// BuildPointerToMemberTypeInfo - Build an abi::__pointer_to_member_type_info
4152 /// struct, used for member pointer types.
4153 void
4154 ItaniumRTTIBuilder::BuildPointerToMemberTypeInfo(const MemberPointerType *Ty) {
4155   QualType PointeeTy = Ty->getPointeeType();
4156 
4157   // Itanium C++ ABI 2.9.5p7:
4158   //   __flags is a flag word describing the cv-qualification and other
4159   //   attributes of the type pointed to.
4160   unsigned Flags = extractPBaseFlags(CGM.getContext(), PointeeTy);
4161 
4162   const RecordType *ClassType = cast<RecordType>(Ty->getClass());
4163   if (IsIncompleteClassType(ClassType))
4164     Flags |= PTI_ContainingClassIncomplete;
4165 
4166   llvm::Type *UnsignedIntLTy =
4167     CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy);
4168   Fields.push_back(llvm::ConstantInt::get(UnsignedIntLTy, Flags));
4169 
4170   // Itanium C++ ABI 2.9.5p7:
4171   //   __pointee is a pointer to the std::type_info derivation for the
4172   //   unqualified type being pointed to.
4173   llvm::Constant *PointeeTypeInfo =
4174       ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(PointeeTy);
4175   Fields.push_back(PointeeTypeInfo);
4176 
4177   // Itanium C++ ABI 2.9.5p9:
4178   //   __context is a pointer to an abi::__class_type_info corresponding to the
4179   //   class type containing the member pointed to
4180   //   (e.g., the "A" in "int A::*").
4181   Fields.push_back(
4182       ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(QualType(ClassType, 0)));
4183 }
4184 
4185 llvm::Constant *ItaniumCXXABI::getAddrOfRTTIDescriptor(QualType Ty) {
4186   return ItaniumRTTIBuilder(*this).BuildTypeInfo(Ty);
4187 }
4188 
4189 void ItaniumCXXABI::EmitFundamentalRTTIDescriptors(const CXXRecordDecl *RD) {
4190   // Types added here must also be added to TypeInfoIsInStandardLibrary.
4191   QualType FundamentalTypes[] = {
4192       getContext().VoidTy,             getContext().NullPtrTy,
4193       getContext().BoolTy,             getContext().WCharTy,
4194       getContext().CharTy,             getContext().UnsignedCharTy,
4195       getContext().SignedCharTy,       getContext().ShortTy,
4196       getContext().UnsignedShortTy,    getContext().IntTy,
4197       getContext().UnsignedIntTy,      getContext().LongTy,
4198       getContext().UnsignedLongTy,     getContext().LongLongTy,
4199       getContext().UnsignedLongLongTy, getContext().Int128Ty,
4200       getContext().UnsignedInt128Ty,   getContext().HalfTy,
4201       getContext().FloatTy,            getContext().DoubleTy,
4202       getContext().LongDoubleTy,       getContext().Float128Ty,
4203       getContext().Char8Ty,            getContext().Char16Ty,
4204       getContext().Char32Ty
4205   };
4206   llvm::GlobalValue::DLLStorageClassTypes DLLStorageClass =
4207       RD->hasAttr<DLLExportAttr>() || CGM.shouldMapVisibilityToDLLExport(RD)
4208           ? llvm::GlobalValue::DLLExportStorageClass
4209           : llvm::GlobalValue::DefaultStorageClass;
4210   llvm::GlobalValue::VisibilityTypes Visibility =
4211       CodeGenModule::GetLLVMVisibility(RD->getVisibility());
4212   for (const QualType &FundamentalType : FundamentalTypes) {
4213     QualType PointerType = getContext().getPointerType(FundamentalType);
4214     QualType PointerTypeConst = getContext().getPointerType(
4215         FundamentalType.withConst());
4216     for (QualType Type : {FundamentalType, PointerType, PointerTypeConst})
4217       ItaniumRTTIBuilder(*this).BuildTypeInfo(
4218           Type, llvm::GlobalValue::ExternalLinkage,
4219           Visibility, DLLStorageClass);
4220   }
4221 }
4222 
4223 /// What sort of uniqueness rules should we use for the RTTI for the
4224 /// given type?
4225 ItaniumCXXABI::RTTIUniquenessKind ItaniumCXXABI::classifyRTTIUniqueness(
4226     QualType CanTy, llvm::GlobalValue::LinkageTypes Linkage) const {
4227   if (shouldRTTIBeUnique())
4228     return RUK_Unique;
4229 
4230   // It's only necessary for linkonce_odr or weak_odr linkage.
4231   if (Linkage != llvm::GlobalValue::LinkOnceODRLinkage &&
4232       Linkage != llvm::GlobalValue::WeakODRLinkage)
4233     return RUK_Unique;
4234 
4235   // It's only necessary with default visibility.
4236   if (CanTy->getVisibility() != DefaultVisibility)
4237     return RUK_Unique;
4238 
4239   // If we're not required to publish this symbol, hide it.
4240   if (Linkage == llvm::GlobalValue::LinkOnceODRLinkage)
4241     return RUK_NonUniqueHidden;
4242 
4243   // If we're required to publish this symbol, as we might be under an
4244   // explicit instantiation, leave it with default visibility but
4245   // enable string-comparisons.
4246   assert(Linkage == llvm::GlobalValue::WeakODRLinkage);
4247   return RUK_NonUniqueVisible;
4248 }
4249 
4250 // Find out how to codegen the complete destructor and constructor
4251 namespace {
4252 enum class StructorCodegen { Emit, RAUW, Alias, COMDAT };
4253 }
4254 static StructorCodegen getCodegenToUse(CodeGenModule &CGM,
4255                                        const CXXMethodDecl *MD) {
4256   if (!CGM.getCodeGenOpts().CXXCtorDtorAliases)
4257     return StructorCodegen::Emit;
4258 
4259   // The complete and base structors are not equivalent if there are any virtual
4260   // bases, so emit separate functions.
4261   if (MD->getParent()->getNumVBases())
4262     return StructorCodegen::Emit;
4263 
4264   GlobalDecl AliasDecl;
4265   if (const auto *DD = dyn_cast<CXXDestructorDecl>(MD)) {
4266     AliasDecl = GlobalDecl(DD, Dtor_Complete);
4267   } else {
4268     const auto *CD = cast<CXXConstructorDecl>(MD);
4269     AliasDecl = GlobalDecl(CD, Ctor_Complete);
4270   }
4271   llvm::GlobalValue::LinkageTypes Linkage = CGM.getFunctionLinkage(AliasDecl);
4272 
4273   if (llvm::GlobalValue::isDiscardableIfUnused(Linkage))
4274     return StructorCodegen::RAUW;
4275 
4276   // FIXME: Should we allow available_externally aliases?
4277   if (!llvm::GlobalAlias::isValidLinkage(Linkage))
4278     return StructorCodegen::RAUW;
4279 
4280   if (llvm::GlobalValue::isWeakForLinker(Linkage)) {
4281     // Only ELF and wasm support COMDATs with arbitrary names (C5/D5).
4282     if (CGM.getTarget().getTriple().isOSBinFormatELF() ||
4283         CGM.getTarget().getTriple().isOSBinFormatWasm())
4284       return StructorCodegen::COMDAT;
4285     return StructorCodegen::Emit;
4286   }
4287 
4288   return StructorCodegen::Alias;
4289 }
4290 
4291 static void emitConstructorDestructorAlias(CodeGenModule &CGM,
4292                                            GlobalDecl AliasDecl,
4293                                            GlobalDecl TargetDecl) {
4294   llvm::GlobalValue::LinkageTypes Linkage = CGM.getFunctionLinkage(AliasDecl);
4295 
4296   StringRef MangledName = CGM.getMangledName(AliasDecl);
4297   llvm::GlobalValue *Entry = CGM.GetGlobalValue(MangledName);
4298   if (Entry && !Entry->isDeclaration())
4299     return;
4300 
4301   auto *Aliasee = cast<llvm::GlobalValue>(CGM.GetAddrOfGlobal(TargetDecl));
4302 
4303   // Create the alias with no name.
4304   auto *Alias = llvm::GlobalAlias::create(Linkage, "", Aliasee);
4305 
4306   // Constructors and destructors are always unnamed_addr.
4307   Alias->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4308 
4309   // Switch any previous uses to the alias.
4310   if (Entry) {
4311     assert(Entry->getType() == Aliasee->getType() &&
4312            "declaration exists with different type");
4313     Alias->takeName(Entry);
4314     Entry->replaceAllUsesWith(Alias);
4315     Entry->eraseFromParent();
4316   } else {
4317     Alias->setName(MangledName);
4318   }
4319 
4320   // Finally, set up the alias with its proper name and attributes.
4321   CGM.SetCommonAttributes(AliasDecl, Alias);
4322 }
4323 
4324 void ItaniumCXXABI::emitCXXStructor(GlobalDecl GD) {
4325   auto *MD = cast<CXXMethodDecl>(GD.getDecl());
4326   auto *CD = dyn_cast<CXXConstructorDecl>(MD);
4327   const CXXDestructorDecl *DD = CD ? nullptr : cast<CXXDestructorDecl>(MD);
4328 
4329   StructorCodegen CGType = getCodegenToUse(CGM, MD);
4330 
4331   if (CD ? GD.getCtorType() == Ctor_Complete
4332          : GD.getDtorType() == Dtor_Complete) {
4333     GlobalDecl BaseDecl;
4334     if (CD)
4335       BaseDecl = GD.getWithCtorType(Ctor_Base);
4336     else
4337       BaseDecl = GD.getWithDtorType(Dtor_Base);
4338 
4339     if (CGType == StructorCodegen::Alias || CGType == StructorCodegen::COMDAT) {
4340       emitConstructorDestructorAlias(CGM, GD, BaseDecl);
4341       return;
4342     }
4343 
4344     if (CGType == StructorCodegen::RAUW) {
4345       StringRef MangledName = CGM.getMangledName(GD);
4346       auto *Aliasee = CGM.GetAddrOfGlobal(BaseDecl);
4347       CGM.addReplacement(MangledName, Aliasee);
4348       return;
4349     }
4350   }
4351 
4352   // The base destructor is equivalent to the base destructor of its
4353   // base class if there is exactly one non-virtual base class with a
4354   // non-trivial destructor, there are no fields with a non-trivial
4355   // destructor, and the body of the destructor is trivial.
4356   if (DD && GD.getDtorType() == Dtor_Base &&
4357       CGType != StructorCodegen::COMDAT &&
4358       !CGM.TryEmitBaseDestructorAsAlias(DD))
4359     return;
4360 
4361   // FIXME: The deleting destructor is equivalent to the selected operator
4362   // delete if:
4363   //  * either the delete is a destroying operator delete or the destructor
4364   //    would be trivial if it weren't virtual,
4365   //  * the conversion from the 'this' parameter to the first parameter of the
4366   //    destructor is equivalent to a bitcast,
4367   //  * the destructor does not have an implicit "this" return, and
4368   //  * the operator delete has the same calling convention and IR function type
4369   //    as the destructor.
4370   // In such cases we should try to emit the deleting dtor as an alias to the
4371   // selected 'operator delete'.
4372 
4373   llvm::Function *Fn = CGM.codegenCXXStructor(GD);
4374 
4375   if (CGType == StructorCodegen::COMDAT) {
4376     SmallString<256> Buffer;
4377     llvm::raw_svector_ostream Out(Buffer);
4378     if (DD)
4379       getMangleContext().mangleCXXDtorComdat(DD, Out);
4380     else
4381       getMangleContext().mangleCXXCtorComdat(CD, Out);
4382     llvm::Comdat *C = CGM.getModule().getOrInsertComdat(Out.str());
4383     Fn->setComdat(C);
4384   } else {
4385     CGM.maybeSetTrivialComdat(*MD, *Fn);
4386   }
4387 }
4388 
4389 static llvm::FunctionCallee getBeginCatchFn(CodeGenModule &CGM) {
4390   // void *__cxa_begin_catch(void*);
4391   llvm::FunctionType *FTy = llvm::FunctionType::get(
4392       CGM.Int8PtrTy, CGM.Int8PtrTy, /*isVarArg=*/false);
4393 
4394   return CGM.CreateRuntimeFunction(FTy, "__cxa_begin_catch");
4395 }
4396 
4397 static llvm::FunctionCallee getEndCatchFn(CodeGenModule &CGM) {
4398   // void __cxa_end_catch();
4399   llvm::FunctionType *FTy =
4400       llvm::FunctionType::get(CGM.VoidTy, /*isVarArg=*/false);
4401 
4402   return CGM.CreateRuntimeFunction(FTy, "__cxa_end_catch");
4403 }
4404 
4405 static llvm::FunctionCallee getGetExceptionPtrFn(CodeGenModule &CGM) {
4406   // void *__cxa_get_exception_ptr(void*);
4407   llvm::FunctionType *FTy = llvm::FunctionType::get(
4408       CGM.Int8PtrTy, CGM.Int8PtrTy, /*isVarArg=*/false);
4409 
4410   return CGM.CreateRuntimeFunction(FTy, "__cxa_get_exception_ptr");
4411 }
4412 
4413 namespace {
4414   /// A cleanup to call __cxa_end_catch.  In many cases, the caught
4415   /// exception type lets us state definitively that the thrown exception
4416   /// type does not have a destructor.  In particular:
4417   ///   - Catch-alls tell us nothing, so we have to conservatively
4418   ///     assume that the thrown exception might have a destructor.
4419   ///   - Catches by reference behave according to their base types.
4420   ///   - Catches of non-record types will only trigger for exceptions
4421   ///     of non-record types, which never have destructors.
4422   ///   - Catches of record types can trigger for arbitrary subclasses
4423   ///     of the caught type, so we have to assume the actual thrown
4424   ///     exception type might have a throwing destructor, even if the
4425   ///     caught type's destructor is trivial or nothrow.
4426   struct CallEndCatch final : EHScopeStack::Cleanup {
4427     CallEndCatch(bool MightThrow) : MightThrow(MightThrow) {}
4428     bool MightThrow;
4429 
4430     void Emit(CodeGenFunction &CGF, Flags flags) override {
4431       if (!MightThrow) {
4432         CGF.EmitNounwindRuntimeCall(getEndCatchFn(CGF.CGM));
4433         return;
4434       }
4435 
4436       CGF.EmitRuntimeCallOrInvoke(getEndCatchFn(CGF.CGM));
4437     }
4438   };
4439 }
4440 
4441 /// Emits a call to __cxa_begin_catch and enters a cleanup to call
4442 /// __cxa_end_catch.
4443 ///
4444 /// \param EndMightThrow - true if __cxa_end_catch might throw
4445 static llvm::Value *CallBeginCatch(CodeGenFunction &CGF,
4446                                    llvm::Value *Exn,
4447                                    bool EndMightThrow) {
4448   llvm::CallInst *call =
4449     CGF.EmitNounwindRuntimeCall(getBeginCatchFn(CGF.CGM), Exn);
4450 
4451   CGF.EHStack.pushCleanup<CallEndCatch>(NormalAndEHCleanup, EndMightThrow);
4452 
4453   return call;
4454 }
4455 
4456 /// A "special initializer" callback for initializing a catch
4457 /// parameter during catch initialization.
4458 static void InitCatchParam(CodeGenFunction &CGF,
4459                            const VarDecl &CatchParam,
4460                            Address ParamAddr,
4461                            SourceLocation Loc) {
4462   // Load the exception from where the landing pad saved it.
4463   llvm::Value *Exn = CGF.getExceptionFromSlot();
4464 
4465   CanQualType CatchType =
4466     CGF.CGM.getContext().getCanonicalType(CatchParam.getType());
4467   llvm::Type *LLVMCatchTy = CGF.ConvertTypeForMem(CatchType);
4468 
4469   // If we're catching by reference, we can just cast the object
4470   // pointer to the appropriate pointer.
4471   if (isa<ReferenceType>(CatchType)) {
4472     QualType CaughtType = cast<ReferenceType>(CatchType)->getPointeeType();
4473     bool EndCatchMightThrow = CaughtType->isRecordType();
4474 
4475     // __cxa_begin_catch returns the adjusted object pointer.
4476     llvm::Value *AdjustedExn = CallBeginCatch(CGF, Exn, EndCatchMightThrow);
4477 
4478     // We have no way to tell the personality function that we're
4479     // catching by reference, so if we're catching a pointer,
4480     // __cxa_begin_catch will actually return that pointer by value.
4481     if (const PointerType *PT = dyn_cast<PointerType>(CaughtType)) {
4482       QualType PointeeType = PT->getPointeeType();
4483 
4484       // When catching by reference, generally we should just ignore
4485       // this by-value pointer and use the exception object instead.
4486       if (!PointeeType->isRecordType()) {
4487 
4488         // Exn points to the struct _Unwind_Exception header, which
4489         // we have to skip past in order to reach the exception data.
4490         unsigned HeaderSize =
4491           CGF.CGM.getTargetCodeGenInfo().getSizeOfUnwindException();
4492         AdjustedExn =
4493             CGF.Builder.CreateConstGEP1_32(CGF.Int8Ty, Exn, HeaderSize);
4494 
4495       // However, if we're catching a pointer-to-record type that won't
4496       // work, because the personality function might have adjusted
4497       // the pointer.  There's actually no way for us to fully satisfy
4498       // the language/ABI contract here:  we can't use Exn because it
4499       // might have the wrong adjustment, but we can't use the by-value
4500       // pointer because it's off by a level of abstraction.
4501       //
4502       // The current solution is to dump the adjusted pointer into an
4503       // alloca, which breaks language semantics (because changing the
4504       // pointer doesn't change the exception) but at least works.
4505       // The better solution would be to filter out non-exact matches
4506       // and rethrow them, but this is tricky because the rethrow
4507       // really needs to be catchable by other sites at this landing
4508       // pad.  The best solution is to fix the personality function.
4509       } else {
4510         // Pull the pointer for the reference type off.
4511         llvm::Type *PtrTy = CGF.ConvertTypeForMem(CaughtType);
4512 
4513         // Create the temporary and write the adjusted pointer into it.
4514         Address ExnPtrTmp =
4515           CGF.CreateTempAlloca(PtrTy, CGF.getPointerAlign(), "exn.byref.tmp");
4516         llvm::Value *Casted = CGF.Builder.CreateBitCast(AdjustedExn, PtrTy);
4517         CGF.Builder.CreateStore(Casted, ExnPtrTmp);
4518 
4519         // Bind the reference to the temporary.
4520         AdjustedExn = ExnPtrTmp.getPointer();
4521       }
4522     }
4523 
4524     llvm::Value *ExnCast =
4525       CGF.Builder.CreateBitCast(AdjustedExn, LLVMCatchTy, "exn.byref");
4526     CGF.Builder.CreateStore(ExnCast, ParamAddr);
4527     return;
4528   }
4529 
4530   // Scalars and complexes.
4531   TypeEvaluationKind TEK = CGF.getEvaluationKind(CatchType);
4532   if (TEK != TEK_Aggregate) {
4533     llvm::Value *AdjustedExn = CallBeginCatch(CGF, Exn, false);
4534 
4535     // If the catch type is a pointer type, __cxa_begin_catch returns
4536     // the pointer by value.
4537     if (CatchType->hasPointerRepresentation()) {
4538       llvm::Value *CastExn =
4539         CGF.Builder.CreateBitCast(AdjustedExn, LLVMCatchTy, "exn.casted");
4540 
4541       switch (CatchType.getQualifiers().getObjCLifetime()) {
4542       case Qualifiers::OCL_Strong:
4543         CastExn = CGF.EmitARCRetainNonBlock(CastExn);
4544         [[fallthrough]];
4545 
4546       case Qualifiers::OCL_None:
4547       case Qualifiers::OCL_ExplicitNone:
4548       case Qualifiers::OCL_Autoreleasing:
4549         CGF.Builder.CreateStore(CastExn, ParamAddr);
4550         return;
4551 
4552       case Qualifiers::OCL_Weak:
4553         CGF.EmitARCInitWeak(ParamAddr, CastExn);
4554         return;
4555       }
4556       llvm_unreachable("bad ownership qualifier!");
4557     }
4558 
4559     // Otherwise, it returns a pointer into the exception object.
4560 
4561     llvm::Type *PtrTy = LLVMCatchTy->getPointerTo(0); // addrspace 0 ok
4562     llvm::Value *Cast = CGF.Builder.CreateBitCast(AdjustedExn, PtrTy);
4563 
4564     LValue srcLV = CGF.MakeNaturalAlignAddrLValue(Cast, CatchType);
4565     LValue destLV = CGF.MakeAddrLValue(ParamAddr, CatchType);
4566     switch (TEK) {
4567     case TEK_Complex:
4568       CGF.EmitStoreOfComplex(CGF.EmitLoadOfComplex(srcLV, Loc), destLV,
4569                              /*init*/ true);
4570       return;
4571     case TEK_Scalar: {
4572       llvm::Value *ExnLoad = CGF.EmitLoadOfScalar(srcLV, Loc);
4573       CGF.EmitStoreOfScalar(ExnLoad, destLV, /*init*/ true);
4574       return;
4575     }
4576     case TEK_Aggregate:
4577       llvm_unreachable("evaluation kind filtered out!");
4578     }
4579     llvm_unreachable("bad evaluation kind");
4580   }
4581 
4582   assert(isa<RecordType>(CatchType) && "unexpected catch type!");
4583   auto catchRD = CatchType->getAsCXXRecordDecl();
4584   CharUnits caughtExnAlignment = CGF.CGM.getClassPointerAlignment(catchRD);
4585 
4586   llvm::Type *PtrTy = LLVMCatchTy->getPointerTo(0); // addrspace 0 ok
4587 
4588   // Check for a copy expression.  If we don't have a copy expression,
4589   // that means a trivial copy is okay.
4590   const Expr *copyExpr = CatchParam.getInit();
4591   if (!copyExpr) {
4592     llvm::Value *rawAdjustedExn = CallBeginCatch(CGF, Exn, true);
4593     Address adjustedExn(CGF.Builder.CreateBitCast(rawAdjustedExn, PtrTy),
4594                         LLVMCatchTy, caughtExnAlignment);
4595     LValue Dest = CGF.MakeAddrLValue(ParamAddr, CatchType);
4596     LValue Src = CGF.MakeAddrLValue(adjustedExn, CatchType);
4597     CGF.EmitAggregateCopy(Dest, Src, CatchType, AggValueSlot::DoesNotOverlap);
4598     return;
4599   }
4600 
4601   // We have to call __cxa_get_exception_ptr to get the adjusted
4602   // pointer before copying.
4603   llvm::CallInst *rawAdjustedExn =
4604     CGF.EmitNounwindRuntimeCall(getGetExceptionPtrFn(CGF.CGM), Exn);
4605 
4606   // Cast that to the appropriate type.
4607   Address adjustedExn(CGF.Builder.CreateBitCast(rawAdjustedExn, PtrTy),
4608                       LLVMCatchTy, caughtExnAlignment);
4609 
4610   // The copy expression is defined in terms of an OpaqueValueExpr.
4611   // Find it and map it to the adjusted expression.
4612   CodeGenFunction::OpaqueValueMapping
4613     opaque(CGF, OpaqueValueExpr::findInCopyConstruct(copyExpr),
4614            CGF.MakeAddrLValue(adjustedExn, CatchParam.getType()));
4615 
4616   // Call the copy ctor in a terminate scope.
4617   CGF.EHStack.pushTerminate();
4618 
4619   // Perform the copy construction.
4620   CGF.EmitAggExpr(copyExpr,
4621                   AggValueSlot::forAddr(ParamAddr, Qualifiers(),
4622                                         AggValueSlot::IsNotDestructed,
4623                                         AggValueSlot::DoesNotNeedGCBarriers,
4624                                         AggValueSlot::IsNotAliased,
4625                                         AggValueSlot::DoesNotOverlap));
4626 
4627   // Leave the terminate scope.
4628   CGF.EHStack.popTerminate();
4629 
4630   // Undo the opaque value mapping.
4631   opaque.pop();
4632 
4633   // Finally we can call __cxa_begin_catch.
4634   CallBeginCatch(CGF, Exn, true);
4635 }
4636 
4637 /// Begins a catch statement by initializing the catch variable and
4638 /// calling __cxa_begin_catch.
4639 void ItaniumCXXABI::emitBeginCatch(CodeGenFunction &CGF,
4640                                    const CXXCatchStmt *S) {
4641   // We have to be very careful with the ordering of cleanups here:
4642   //   C++ [except.throw]p4:
4643   //     The destruction [of the exception temporary] occurs
4644   //     immediately after the destruction of the object declared in
4645   //     the exception-declaration in the handler.
4646   //
4647   // So the precise ordering is:
4648   //   1.  Construct catch variable.
4649   //   2.  __cxa_begin_catch
4650   //   3.  Enter __cxa_end_catch cleanup
4651   //   4.  Enter dtor cleanup
4652   //
4653   // We do this by using a slightly abnormal initialization process.
4654   // Delegation sequence:
4655   //   - ExitCXXTryStmt opens a RunCleanupsScope
4656   //     - EmitAutoVarAlloca creates the variable and debug info
4657   //       - InitCatchParam initializes the variable from the exception
4658   //       - CallBeginCatch calls __cxa_begin_catch
4659   //       - CallBeginCatch enters the __cxa_end_catch cleanup
4660   //     - EmitAutoVarCleanups enters the variable destructor cleanup
4661   //   - EmitCXXTryStmt emits the code for the catch body
4662   //   - EmitCXXTryStmt close the RunCleanupsScope
4663 
4664   VarDecl *CatchParam = S->getExceptionDecl();
4665   if (!CatchParam) {
4666     llvm::Value *Exn = CGF.getExceptionFromSlot();
4667     CallBeginCatch(CGF, Exn, true);
4668     return;
4669   }
4670 
4671   // Emit the local.
4672   CodeGenFunction::AutoVarEmission var = CGF.EmitAutoVarAlloca(*CatchParam);
4673   InitCatchParam(CGF, *CatchParam, var.getObjectAddress(CGF), S->getBeginLoc());
4674   CGF.EmitAutoVarCleanups(var);
4675 }
4676 
4677 /// Get or define the following function:
4678 ///   void @__clang_call_terminate(i8* %exn) nounwind noreturn
4679 /// This code is used only in C++.
4680 static llvm::FunctionCallee getClangCallTerminateFn(CodeGenModule &CGM) {
4681   ASTContext &C = CGM.getContext();
4682   const CGFunctionInfo &FI = CGM.getTypes().arrangeBuiltinFunctionDeclaration(
4683       C.VoidTy, {C.getPointerType(C.CharTy)});
4684   llvm::FunctionType *fnTy = CGM.getTypes().GetFunctionType(FI);
4685   llvm::FunctionCallee fnRef = CGM.CreateRuntimeFunction(
4686       fnTy, "__clang_call_terminate", llvm::AttributeList(), /*Local=*/true);
4687   llvm::Function *fn =
4688       cast<llvm::Function>(fnRef.getCallee()->stripPointerCasts());
4689   if (fn->empty()) {
4690     CGM.SetLLVMFunctionAttributes(GlobalDecl(), FI, fn, /*IsThunk=*/false);
4691     fn->setDoesNotThrow();
4692     fn->setDoesNotReturn();
4693 
4694     // What we really want is to massively penalize inlining without
4695     // forbidding it completely.  The difference between that and
4696     // 'noinline' is negligible.
4697     fn->addFnAttr(llvm::Attribute::NoInline);
4698 
4699     // Allow this function to be shared across translation units, but
4700     // we don't want it to turn into an exported symbol.
4701     fn->setLinkage(llvm::Function::LinkOnceODRLinkage);
4702     fn->setVisibility(llvm::Function::HiddenVisibility);
4703     if (CGM.supportsCOMDAT())
4704       fn->setComdat(CGM.getModule().getOrInsertComdat(fn->getName()));
4705 
4706     // Set up the function.
4707     llvm::BasicBlock *entry =
4708         llvm::BasicBlock::Create(CGM.getLLVMContext(), "", fn);
4709     CGBuilderTy builder(CGM, entry);
4710 
4711     // Pull the exception pointer out of the parameter list.
4712     llvm::Value *exn = &*fn->arg_begin();
4713 
4714     // Call __cxa_begin_catch(exn).
4715     llvm::CallInst *catchCall = builder.CreateCall(getBeginCatchFn(CGM), exn);
4716     catchCall->setDoesNotThrow();
4717     catchCall->setCallingConv(CGM.getRuntimeCC());
4718 
4719     // Call std::terminate().
4720     llvm::CallInst *termCall = builder.CreateCall(CGM.getTerminateFn());
4721     termCall->setDoesNotThrow();
4722     termCall->setDoesNotReturn();
4723     termCall->setCallingConv(CGM.getRuntimeCC());
4724 
4725     // std::terminate cannot return.
4726     builder.CreateUnreachable();
4727   }
4728   return fnRef;
4729 }
4730 
4731 llvm::CallInst *
4732 ItaniumCXXABI::emitTerminateForUnexpectedException(CodeGenFunction &CGF,
4733                                                    llvm::Value *Exn) {
4734   // In C++, we want to call __cxa_begin_catch() before terminating.
4735   if (Exn) {
4736     assert(CGF.CGM.getLangOpts().CPlusPlus);
4737     return CGF.EmitNounwindRuntimeCall(getClangCallTerminateFn(CGF.CGM), Exn);
4738   }
4739   return CGF.EmitNounwindRuntimeCall(CGF.CGM.getTerminateFn());
4740 }
4741 
4742 std::pair<llvm::Value *, const CXXRecordDecl *>
4743 ItaniumCXXABI::LoadVTablePtr(CodeGenFunction &CGF, Address This,
4744                              const CXXRecordDecl *RD) {
4745   return {CGF.GetVTablePtr(This, CGM.Int8PtrTy, RD), RD};
4746 }
4747 
4748 void WebAssemblyCXXABI::emitBeginCatch(CodeGenFunction &CGF,
4749                                        const CXXCatchStmt *C) {
4750   if (CGF.getTarget().hasFeature("exception-handling"))
4751     CGF.EHStack.pushCleanup<CatchRetScope>(
4752         NormalCleanup, cast<llvm::CatchPadInst>(CGF.CurrentFuncletPad));
4753   ItaniumCXXABI::emitBeginCatch(CGF, C);
4754 }
4755 
4756 llvm::CallInst *
4757 WebAssemblyCXXABI::emitTerminateForUnexpectedException(CodeGenFunction &CGF,
4758                                                        llvm::Value *Exn) {
4759   // Itanium ABI calls __clang_call_terminate(), which __cxa_begin_catch() on
4760   // the violating exception to mark it handled, but it is currently hard to do
4761   // with wasm EH instruction structure with catch/catch_all, we just call
4762   // std::terminate and ignore the violating exception as in CGCXXABI.
4763   // TODO Consider code transformation that makes calling __clang_call_terminate
4764   // possible.
4765   return CGCXXABI::emitTerminateForUnexpectedException(CGF, Exn);
4766 }
4767 
4768 /// Register a global destructor as best as we know how.
4769 void XLCXXABI::registerGlobalDtor(CodeGenFunction &CGF, const VarDecl &D,
4770                                   llvm::FunctionCallee Dtor,
4771                                   llvm::Constant *Addr) {
4772   if (D.getTLSKind() != VarDecl::TLS_None) {
4773     // atexit routine expects "int(*)(int,...)"
4774     llvm::FunctionType *FTy =
4775         llvm::FunctionType::get(CGM.IntTy, CGM.IntTy, true);
4776     llvm::PointerType *FpTy = FTy->getPointerTo();
4777 
4778     // extern "C" int __pt_atexit_np(int flags, int(*)(int,...), ...);
4779     llvm::FunctionType *AtExitTy =
4780         llvm::FunctionType::get(CGM.IntTy, {CGM.IntTy, FpTy}, true);
4781 
4782     // Fetch the actual function.
4783     llvm::FunctionCallee AtExit =
4784         CGM.CreateRuntimeFunction(AtExitTy, "__pt_atexit_np");
4785 
4786     // Create __dtor function for the var decl.
4787     llvm::Function *DtorStub = CGF.createTLSAtExitStub(D, Dtor, Addr, AtExit);
4788 
4789     // Register above __dtor with atexit().
4790     // First param is flags and must be 0, second param is function ptr
4791     llvm::Value *NV = llvm::Constant::getNullValue(CGM.IntTy);
4792     CGF.EmitNounwindRuntimeCall(AtExit, {NV, DtorStub});
4793 
4794     // Cannot unregister TLS __dtor so done
4795     return;
4796   }
4797 
4798   // Create __dtor function for the var decl.
4799   llvm::Function *DtorStub = CGF.createAtExitStub(D, Dtor, Addr);
4800 
4801   // Register above __dtor with atexit().
4802   CGF.registerGlobalDtorWithAtExit(DtorStub);
4803 
4804   // Emit __finalize function to unregister __dtor and (as appropriate) call
4805   // __dtor.
4806   emitCXXStermFinalizer(D, DtorStub, Addr);
4807 }
4808 
4809 void XLCXXABI::emitCXXStermFinalizer(const VarDecl &D, llvm::Function *dtorStub,
4810                                      llvm::Constant *addr) {
4811   llvm::FunctionType *FTy = llvm::FunctionType::get(CGM.VoidTy, false);
4812   SmallString<256> FnName;
4813   {
4814     llvm::raw_svector_ostream Out(FnName);
4815     getMangleContext().mangleDynamicStermFinalizer(&D, Out);
4816   }
4817 
4818   // Create the finalization action associated with a variable.
4819   const CGFunctionInfo &FI = CGM.getTypes().arrangeNullaryFunction();
4820   llvm::Function *StermFinalizer = CGM.CreateGlobalInitOrCleanUpFunction(
4821       FTy, FnName.str(), FI, D.getLocation());
4822 
4823   CodeGenFunction CGF(CGM);
4824 
4825   CGF.StartFunction(GlobalDecl(), CGM.getContext().VoidTy, StermFinalizer, FI,
4826                     FunctionArgList(), D.getLocation(),
4827                     D.getInit()->getExprLoc());
4828 
4829   // The unatexit subroutine unregisters __dtor functions that were previously
4830   // registered by the atexit subroutine. If the referenced function is found,
4831   // the unatexit returns a value of 0, meaning that the cleanup is still
4832   // pending (and we should call the __dtor function).
4833   llvm::Value *V = CGF.unregisterGlobalDtorWithUnAtExit(dtorStub);
4834 
4835   llvm::Value *NeedsDestruct = CGF.Builder.CreateIsNull(V, "needs_destruct");
4836 
4837   llvm::BasicBlock *DestructCallBlock = CGF.createBasicBlock("destruct.call");
4838   llvm::BasicBlock *EndBlock = CGF.createBasicBlock("destruct.end");
4839 
4840   // Check if unatexit returns a value of 0. If it does, jump to
4841   // DestructCallBlock, otherwise jump to EndBlock directly.
4842   CGF.Builder.CreateCondBr(NeedsDestruct, DestructCallBlock, EndBlock);
4843 
4844   CGF.EmitBlock(DestructCallBlock);
4845 
4846   // Emit the call to dtorStub.
4847   llvm::CallInst *CI = CGF.Builder.CreateCall(dtorStub);
4848 
4849   // Make sure the call and the callee agree on calling convention.
4850   CI->setCallingConv(dtorStub->getCallingConv());
4851 
4852   CGF.EmitBlock(EndBlock);
4853 
4854   CGF.FinishFunction();
4855 
4856   if (auto *IPA = D.getAttr<InitPriorityAttr>()) {
4857     CGM.AddCXXPrioritizedStermFinalizerEntry(StermFinalizer,
4858                                              IPA->getPriority());
4859   } else if (isTemplateInstantiation(D.getTemplateSpecializationKind()) ||
4860              getContext().GetGVALinkageForVariable(&D) == GVA_DiscardableODR) {
4861     // According to C++ [basic.start.init]p2, class template static data
4862     // members (i.e., implicitly or explicitly instantiated specializations)
4863     // have unordered initialization. As a consequence, we can put them into
4864     // their own llvm.global_dtors entry.
4865     CGM.AddCXXStermFinalizerToGlobalDtor(StermFinalizer, 65535);
4866   } else {
4867     CGM.AddCXXStermFinalizerEntry(StermFinalizer);
4868   }
4869 }
4870