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