Home | History | Annotate | Download | only in CodeGen
      1 //===------- CGObjCMac.cpp - Interface to Apple Objective-C Runtime -------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This provides Objective-C code generation targeting the Apple runtime.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include "CGObjCRuntime.h"
     15 #include "CGBlocks.h"
     16 #include "CGCleanup.h"
     17 #include "CGRecordLayout.h"
     18 #include "CodeGenFunction.h"
     19 #include "CodeGenModule.h"
     20 #include "clang/AST/ASTContext.h"
     21 #include "clang/AST/Decl.h"
     22 #include "clang/AST/DeclObjC.h"
     23 #include "clang/AST/RecordLayout.h"
     24 #include "clang/AST/StmtObjC.h"
     25 #include "clang/Basic/LangOptions.h"
     26 #include "clang/CodeGen/CGFunctionInfo.h"
     27 #include "clang/Frontend/CodeGenOptions.h"
     28 #include "llvm/ADT/DenseSet.h"
     29 #include "llvm/ADT/SetVector.h"
     30 #include "llvm/ADT/SmallPtrSet.h"
     31 #include "llvm/ADT/SmallString.h"
     32 #include "llvm/IR/CallSite.h"
     33 #include "llvm/IR/DataLayout.h"
     34 #include "llvm/IR/InlineAsm.h"
     35 #include "llvm/IR/IntrinsicInst.h"
     36 #include "llvm/IR/LLVMContext.h"
     37 #include "llvm/IR/Module.h"
     38 #include "llvm/Support/raw_ostream.h"
     39 #include <cstdio>
     40 
     41 using namespace clang;
     42 using namespace CodeGen;
     43 
     44 namespace {
     45 
     46 // FIXME: We should find a nicer way to make the labels for metadata, string
     47 // concatenation is lame.
     48 
     49 class ObjCCommonTypesHelper {
     50 protected:
     51   llvm::LLVMContext &VMContext;
     52 
     53 private:
     54   // The types of these functions don't really matter because we
     55   // should always bitcast before calling them.
     56 
     57   /// id objc_msgSend (id, SEL, ...)
     58   ///
     59   /// The default messenger, used for sends whose ABI is unchanged from
     60   /// the all-integer/pointer case.
     61   llvm::Constant *getMessageSendFn() const {
     62     // Add the non-lazy-bind attribute, since objc_msgSend is likely to
     63     // be called a lot.
     64     llvm::Type *params[] = { ObjectPtrTy, SelectorPtrTy };
     65     return
     66       CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
     67                                                         params, true),
     68                                 "objc_msgSend",
     69                                 llvm::AttributeSet::get(CGM.getLLVMContext(),
     70                                               llvm::AttributeSet::FunctionIndex,
     71                                                  llvm::Attribute::NonLazyBind));
     72   }
     73 
     74   /// void objc_msgSend_stret (id, SEL, ...)
     75   ///
     76   /// The messenger used when the return value is an aggregate returned
     77   /// by indirect reference in the first argument, and therefore the
     78   /// self and selector parameters are shifted over by one.
     79   llvm::Constant *getMessageSendStretFn() const {
     80     llvm::Type *params[] = { ObjectPtrTy, SelectorPtrTy };
     81     return CGM.CreateRuntimeFunction(llvm::FunctionType::get(CGM.VoidTy,
     82                                                              params, true),
     83                                      "objc_msgSend_stret");
     84 
     85   }
     86 
     87   /// [double | long double] objc_msgSend_fpret(id self, SEL op, ...)
     88   ///
     89   /// The messenger used when the return value is returned on the x87
     90   /// floating-point stack; without a special entrypoint, the nil case
     91   /// would be unbalanced.
     92   llvm::Constant *getMessageSendFpretFn() const {
     93     llvm::Type *params[] = { ObjectPtrTy, SelectorPtrTy };
     94     return CGM.CreateRuntimeFunction(llvm::FunctionType::get(CGM.DoubleTy,
     95                                                              params, true),
     96                                      "objc_msgSend_fpret");
     97 
     98   }
     99 
    100   /// _Complex long double objc_msgSend_fp2ret(id self, SEL op, ...)
    101   ///
    102   /// The messenger used when the return value is returned in two values on the
    103   /// x87 floating point stack; without a special entrypoint, the nil case
    104   /// would be unbalanced. Only used on 64-bit X86.
    105   llvm::Constant *getMessageSendFp2retFn() const {
    106     llvm::Type *params[] = { ObjectPtrTy, SelectorPtrTy };
    107     llvm::Type *longDoubleType = llvm::Type::getX86_FP80Ty(VMContext);
    108     llvm::Type *resultType =
    109       llvm::StructType::get(longDoubleType, longDoubleType, nullptr);
    110 
    111     return CGM.CreateRuntimeFunction(llvm::FunctionType::get(resultType,
    112                                                              params, true),
    113                                      "objc_msgSend_fp2ret");
    114   }
    115 
    116   /// id objc_msgSendSuper(struct objc_super *super, SEL op, ...)
    117   ///
    118   /// The messenger used for super calls, which have different dispatch
    119   /// semantics.  The class passed is the superclass of the current
    120   /// class.
    121   llvm::Constant *getMessageSendSuperFn() const {
    122     llvm::Type *params[] = { SuperPtrTy, SelectorPtrTy };
    123     return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
    124                                                              params, true),
    125                                      "objc_msgSendSuper");
    126   }
    127 
    128   /// id objc_msgSendSuper2(struct objc_super *super, SEL op, ...)
    129   ///
    130   /// A slightly different messenger used for super calls.  The class
    131   /// passed is the current class.
    132   llvm::Constant *getMessageSendSuperFn2() const {
    133     llvm::Type *params[] = { SuperPtrTy, SelectorPtrTy };
    134     return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
    135                                                              params, true),
    136                                      "objc_msgSendSuper2");
    137   }
    138 
    139   /// void objc_msgSendSuper_stret(void *stretAddr, struct objc_super *super,
    140   ///                              SEL op, ...)
    141   ///
    142   /// The messenger used for super calls which return an aggregate indirectly.
    143   llvm::Constant *getMessageSendSuperStretFn() const {
    144     llvm::Type *params[] = { Int8PtrTy, SuperPtrTy, SelectorPtrTy };
    145     return CGM.CreateRuntimeFunction(
    146       llvm::FunctionType::get(CGM.VoidTy, params, true),
    147       "objc_msgSendSuper_stret");
    148   }
    149 
    150   /// void objc_msgSendSuper2_stret(void * stretAddr, struct objc_super *super,
    151   ///                               SEL op, ...)
    152   ///
    153   /// objc_msgSendSuper_stret with the super2 semantics.
    154   llvm::Constant *getMessageSendSuperStretFn2() const {
    155     llvm::Type *params[] = { Int8PtrTy, SuperPtrTy, SelectorPtrTy };
    156     return CGM.CreateRuntimeFunction(
    157       llvm::FunctionType::get(CGM.VoidTy, params, true),
    158       "objc_msgSendSuper2_stret");
    159   }
    160 
    161   llvm::Constant *getMessageSendSuperFpretFn() const {
    162     // There is no objc_msgSendSuper_fpret? How can that work?
    163     return getMessageSendSuperFn();
    164   }
    165 
    166   llvm::Constant *getMessageSendSuperFpretFn2() const {
    167     // There is no objc_msgSendSuper_fpret? How can that work?
    168     return getMessageSendSuperFn2();
    169   }
    170 
    171 protected:
    172   CodeGen::CodeGenModule &CGM;
    173 
    174 public:
    175   llvm::Type *ShortTy, *IntTy, *LongTy, *LongLongTy;
    176   llvm::Type *Int8PtrTy, *Int8PtrPtrTy;
    177   llvm::Type *IvarOffsetVarTy;
    178 
    179   /// ObjectPtrTy - LLVM type for object handles (typeof(id))
    180   llvm::Type *ObjectPtrTy;
    181 
    182   /// PtrObjectPtrTy - LLVM type for id *
    183   llvm::Type *PtrObjectPtrTy;
    184 
    185   /// SelectorPtrTy - LLVM type for selector handles (typeof(SEL))
    186   llvm::Type *SelectorPtrTy;
    187 
    188 private:
    189   /// ProtocolPtrTy - LLVM type for external protocol handles
    190   /// (typeof(Protocol))
    191   llvm::Type *ExternalProtocolPtrTy;
    192 
    193 public:
    194   llvm::Type *getExternalProtocolPtrTy() {
    195     if (!ExternalProtocolPtrTy) {
    196       // FIXME: It would be nice to unify this with the opaque type, so that the
    197       // IR comes out a bit cleaner.
    198       CodeGen::CodeGenTypes &Types = CGM.getTypes();
    199       ASTContext &Ctx = CGM.getContext();
    200       llvm::Type *T = Types.ConvertType(Ctx.getObjCProtoType());
    201       ExternalProtocolPtrTy = llvm::PointerType::getUnqual(T);
    202     }
    203 
    204     return ExternalProtocolPtrTy;
    205   }
    206 
    207   // SuperCTy - clang type for struct objc_super.
    208   QualType SuperCTy;
    209   // SuperPtrCTy - clang type for struct objc_super *.
    210   QualType SuperPtrCTy;
    211 
    212   /// SuperTy - LLVM type for struct objc_super.
    213   llvm::StructType *SuperTy;
    214   /// SuperPtrTy - LLVM type for struct objc_super *.
    215   llvm::Type *SuperPtrTy;
    216 
    217   /// PropertyTy - LLVM type for struct objc_property (struct _prop_t
    218   /// in GCC parlance).
    219   llvm::StructType *PropertyTy;
    220 
    221   /// PropertyListTy - LLVM type for struct objc_property_list
    222   /// (_prop_list_t in GCC parlance).
    223   llvm::StructType *PropertyListTy;
    224   /// PropertyListPtrTy - LLVM type for struct objc_property_list*.
    225   llvm::Type *PropertyListPtrTy;
    226 
    227   // MethodTy - LLVM type for struct objc_method.
    228   llvm::StructType *MethodTy;
    229 
    230   /// CacheTy - LLVM type for struct objc_cache.
    231   llvm::Type *CacheTy;
    232   /// CachePtrTy - LLVM type for struct objc_cache *.
    233   llvm::Type *CachePtrTy;
    234 
    235   llvm::Constant *getGetPropertyFn() {
    236     CodeGen::CodeGenTypes &Types = CGM.getTypes();
    237     ASTContext &Ctx = CGM.getContext();
    238     // id objc_getProperty (id, SEL, ptrdiff_t, bool)
    239     SmallVector<CanQualType,4> Params;
    240     CanQualType IdType = Ctx.getCanonicalParamType(Ctx.getObjCIdType());
    241     CanQualType SelType = Ctx.getCanonicalParamType(Ctx.getObjCSelType());
    242     Params.push_back(IdType);
    243     Params.push_back(SelType);
    244     Params.push_back(Ctx.getPointerDiffType()->getCanonicalTypeUnqualified());
    245     Params.push_back(Ctx.BoolTy);
    246     llvm::FunctionType *FTy =
    247         Types.GetFunctionType(Types.arrangeLLVMFunctionInfo(
    248             IdType, false, false, Params, FunctionType::ExtInfo(),
    249             RequiredArgs::All));
    250     return CGM.CreateRuntimeFunction(FTy, "objc_getProperty");
    251   }
    252 
    253   llvm::Constant *getSetPropertyFn() {
    254     CodeGen::CodeGenTypes &Types = CGM.getTypes();
    255     ASTContext &Ctx = CGM.getContext();
    256     // void objc_setProperty (id, SEL, ptrdiff_t, id, bool, bool)
    257     SmallVector<CanQualType,6> Params;
    258     CanQualType IdType = Ctx.getCanonicalParamType(Ctx.getObjCIdType());
    259     CanQualType SelType = Ctx.getCanonicalParamType(Ctx.getObjCSelType());
    260     Params.push_back(IdType);
    261     Params.push_back(SelType);
    262     Params.push_back(Ctx.getPointerDiffType()->getCanonicalTypeUnqualified());
    263     Params.push_back(IdType);
    264     Params.push_back(Ctx.BoolTy);
    265     Params.push_back(Ctx.BoolTy);
    266     llvm::FunctionType *FTy =
    267         Types.GetFunctionType(Types.arrangeLLVMFunctionInfo(
    268             Ctx.VoidTy, false, false, Params, FunctionType::ExtInfo(),
    269             RequiredArgs::All));
    270     return CGM.CreateRuntimeFunction(FTy, "objc_setProperty");
    271   }
    272 
    273   llvm::Constant *getOptimizedSetPropertyFn(bool atomic, bool copy) {
    274     CodeGen::CodeGenTypes &Types = CGM.getTypes();
    275     ASTContext &Ctx = CGM.getContext();
    276     // void objc_setProperty_atomic(id self, SEL _cmd,
    277     //                              id newValue, ptrdiff_t offset);
    278     // void objc_setProperty_nonatomic(id self, SEL _cmd,
    279     //                                 id newValue, ptrdiff_t offset);
    280     // void objc_setProperty_atomic_copy(id self, SEL _cmd,
    281     //                                   id newValue, ptrdiff_t offset);
    282     // void objc_setProperty_nonatomic_copy(id self, SEL _cmd,
    283     //                                      id newValue, ptrdiff_t offset);
    284 
    285     SmallVector<CanQualType,4> Params;
    286     CanQualType IdType = Ctx.getCanonicalParamType(Ctx.getObjCIdType());
    287     CanQualType SelType = Ctx.getCanonicalParamType(Ctx.getObjCSelType());
    288     Params.push_back(IdType);
    289     Params.push_back(SelType);
    290     Params.push_back(IdType);
    291     Params.push_back(Ctx.getPointerDiffType()->getCanonicalTypeUnqualified());
    292     llvm::FunctionType *FTy =
    293         Types.GetFunctionType(Types.arrangeLLVMFunctionInfo(
    294             Ctx.VoidTy, false, false, Params, FunctionType::ExtInfo(),
    295             RequiredArgs::All));
    296     const char *name;
    297     if (atomic && copy)
    298       name = "objc_setProperty_atomic_copy";
    299     else if (atomic && !copy)
    300       name = "objc_setProperty_atomic";
    301     else if (!atomic && copy)
    302       name = "objc_setProperty_nonatomic_copy";
    303     else
    304       name = "objc_setProperty_nonatomic";
    305 
    306     return CGM.CreateRuntimeFunction(FTy, name);
    307   }
    308 
    309   llvm::Constant *getCopyStructFn() {
    310     CodeGen::CodeGenTypes &Types = CGM.getTypes();
    311     ASTContext &Ctx = CGM.getContext();
    312     // void objc_copyStruct (void *, const void *, size_t, bool, bool)
    313     SmallVector<CanQualType,5> Params;
    314     Params.push_back(Ctx.VoidPtrTy);
    315     Params.push_back(Ctx.VoidPtrTy);
    316     Params.push_back(Ctx.LongTy);
    317     Params.push_back(Ctx.BoolTy);
    318     Params.push_back(Ctx.BoolTy);
    319     llvm::FunctionType *FTy =
    320         Types.GetFunctionType(Types.arrangeLLVMFunctionInfo(
    321             Ctx.VoidTy, false, false, Params, FunctionType::ExtInfo(),
    322             RequiredArgs::All));
    323     return CGM.CreateRuntimeFunction(FTy, "objc_copyStruct");
    324   }
    325 
    326   /// This routine declares and returns address of:
    327   /// void objc_copyCppObjectAtomic(
    328   ///         void *dest, const void *src,
    329   ///         void (*copyHelper) (void *dest, const void *source));
    330   llvm::Constant *getCppAtomicObjectFunction() {
    331     CodeGen::CodeGenTypes &Types = CGM.getTypes();
    332     ASTContext &Ctx = CGM.getContext();
    333     /// void objc_copyCppObjectAtomic(void *dest, const void *src, void *helper);
    334     SmallVector<CanQualType,3> Params;
    335     Params.push_back(Ctx.VoidPtrTy);
    336     Params.push_back(Ctx.VoidPtrTy);
    337     Params.push_back(Ctx.VoidPtrTy);
    338     llvm::FunctionType *FTy =
    339       Types.GetFunctionType(Types.arrangeLLVMFunctionInfo(Ctx.VoidTy, false, false,
    340                                                           Params,
    341                                                           FunctionType::ExtInfo(),
    342                                                           RequiredArgs::All));
    343     return CGM.CreateRuntimeFunction(FTy, "objc_copyCppObjectAtomic");
    344   }
    345 
    346   llvm::Constant *getEnumerationMutationFn() {
    347     CodeGen::CodeGenTypes &Types = CGM.getTypes();
    348     ASTContext &Ctx = CGM.getContext();
    349     // void objc_enumerationMutation (id)
    350     SmallVector<CanQualType,1> Params;
    351     Params.push_back(Ctx.getCanonicalParamType(Ctx.getObjCIdType()));
    352     llvm::FunctionType *FTy =
    353         Types.GetFunctionType(Types.arrangeLLVMFunctionInfo(
    354             Ctx.VoidTy, false, false, Params, FunctionType::ExtInfo(),
    355             RequiredArgs::All));
    356     return CGM.CreateRuntimeFunction(FTy, "objc_enumerationMutation");
    357   }
    358 
    359   /// GcReadWeakFn -- LLVM objc_read_weak (id *src) function.
    360   llvm::Constant *getGcReadWeakFn() {
    361     // id objc_read_weak (id *)
    362     llvm::Type *args[] = { ObjectPtrTy->getPointerTo() };
    363     llvm::FunctionType *FTy =
    364       llvm::FunctionType::get(ObjectPtrTy, args, false);
    365     return CGM.CreateRuntimeFunction(FTy, "objc_read_weak");
    366   }
    367 
    368   /// GcAssignWeakFn -- LLVM objc_assign_weak function.
    369   llvm::Constant *getGcAssignWeakFn() {
    370     // id objc_assign_weak (id, id *)
    371     llvm::Type *args[] = { ObjectPtrTy, ObjectPtrTy->getPointerTo() };
    372     llvm::FunctionType *FTy =
    373       llvm::FunctionType::get(ObjectPtrTy, args, false);
    374     return CGM.CreateRuntimeFunction(FTy, "objc_assign_weak");
    375   }
    376 
    377   /// GcAssignGlobalFn -- LLVM objc_assign_global function.
    378   llvm::Constant *getGcAssignGlobalFn() {
    379     // id objc_assign_global(id, id *)
    380     llvm::Type *args[] = { ObjectPtrTy, ObjectPtrTy->getPointerTo() };
    381     llvm::FunctionType *FTy =
    382       llvm::FunctionType::get(ObjectPtrTy, args, false);
    383     return CGM.CreateRuntimeFunction(FTy, "objc_assign_global");
    384   }
    385 
    386   /// GcAssignThreadLocalFn -- LLVM objc_assign_threadlocal function.
    387   llvm::Constant *getGcAssignThreadLocalFn() {
    388     // id objc_assign_threadlocal(id src, id * dest)
    389     llvm::Type *args[] = { ObjectPtrTy, ObjectPtrTy->getPointerTo() };
    390     llvm::FunctionType *FTy =
    391       llvm::FunctionType::get(ObjectPtrTy, args, false);
    392     return CGM.CreateRuntimeFunction(FTy, "objc_assign_threadlocal");
    393   }
    394 
    395   /// GcAssignIvarFn -- LLVM objc_assign_ivar function.
    396   llvm::Constant *getGcAssignIvarFn() {
    397     // id objc_assign_ivar(id, id *, ptrdiff_t)
    398     llvm::Type *args[] = { ObjectPtrTy, ObjectPtrTy->getPointerTo(),
    399                            CGM.PtrDiffTy };
    400     llvm::FunctionType *FTy =
    401       llvm::FunctionType::get(ObjectPtrTy, args, false);
    402     return CGM.CreateRuntimeFunction(FTy, "objc_assign_ivar");
    403   }
    404 
    405   /// GcMemmoveCollectableFn -- LLVM objc_memmove_collectable function.
    406   llvm::Constant *GcMemmoveCollectableFn() {
    407     // void *objc_memmove_collectable(void *dst, const void *src, size_t size)
    408     llvm::Type *args[] = { Int8PtrTy, Int8PtrTy, LongTy };
    409     llvm::FunctionType *FTy = llvm::FunctionType::get(Int8PtrTy, args, false);
    410     return CGM.CreateRuntimeFunction(FTy, "objc_memmove_collectable");
    411   }
    412 
    413   /// GcAssignStrongCastFn -- LLVM objc_assign_strongCast function.
    414   llvm::Constant *getGcAssignStrongCastFn() {
    415     // id objc_assign_strongCast(id, id *)
    416     llvm::Type *args[] = { ObjectPtrTy, ObjectPtrTy->getPointerTo() };
    417     llvm::FunctionType *FTy =
    418       llvm::FunctionType::get(ObjectPtrTy, args, false);
    419     return CGM.CreateRuntimeFunction(FTy, "objc_assign_strongCast");
    420   }
    421 
    422   /// ExceptionThrowFn - LLVM objc_exception_throw function.
    423   llvm::Constant *getExceptionThrowFn() {
    424     // void objc_exception_throw(id)
    425     llvm::Type *args[] = { ObjectPtrTy };
    426     llvm::FunctionType *FTy =
    427       llvm::FunctionType::get(CGM.VoidTy, args, false);
    428     return CGM.CreateRuntimeFunction(FTy, "objc_exception_throw");
    429   }
    430 
    431   /// ExceptionRethrowFn - LLVM objc_exception_rethrow function.
    432   llvm::Constant *getExceptionRethrowFn() {
    433     // void objc_exception_rethrow(void)
    434     llvm::FunctionType *FTy = llvm::FunctionType::get(CGM.VoidTy, false);
    435     return CGM.CreateRuntimeFunction(FTy, "objc_exception_rethrow");
    436   }
    437 
    438   /// SyncEnterFn - LLVM object_sync_enter function.
    439   llvm::Constant *getSyncEnterFn() {
    440     // int objc_sync_enter (id)
    441     llvm::Type *args[] = { ObjectPtrTy };
    442     llvm::FunctionType *FTy =
    443       llvm::FunctionType::get(CGM.IntTy, args, false);
    444     return CGM.CreateRuntimeFunction(FTy, "objc_sync_enter");
    445   }
    446 
    447   /// SyncExitFn - LLVM object_sync_exit function.
    448   llvm::Constant *getSyncExitFn() {
    449     // int objc_sync_exit (id)
    450     llvm::Type *args[] = { ObjectPtrTy };
    451     llvm::FunctionType *FTy =
    452       llvm::FunctionType::get(CGM.IntTy, args, false);
    453     return CGM.CreateRuntimeFunction(FTy, "objc_sync_exit");
    454   }
    455 
    456   llvm::Constant *getSendFn(bool IsSuper) const {
    457     return IsSuper ? getMessageSendSuperFn() : getMessageSendFn();
    458   }
    459 
    460   llvm::Constant *getSendFn2(bool IsSuper) const {
    461     return IsSuper ? getMessageSendSuperFn2() : getMessageSendFn();
    462   }
    463 
    464   llvm::Constant *getSendStretFn(bool IsSuper) const {
    465     return IsSuper ? getMessageSendSuperStretFn() : getMessageSendStretFn();
    466   }
    467 
    468   llvm::Constant *getSendStretFn2(bool IsSuper) const {
    469     return IsSuper ? getMessageSendSuperStretFn2() : getMessageSendStretFn();
    470   }
    471 
    472   llvm::Constant *getSendFpretFn(bool IsSuper) const {
    473     return IsSuper ? getMessageSendSuperFpretFn() : getMessageSendFpretFn();
    474   }
    475 
    476   llvm::Constant *getSendFpretFn2(bool IsSuper) const {
    477     return IsSuper ? getMessageSendSuperFpretFn2() : getMessageSendFpretFn();
    478   }
    479 
    480   llvm::Constant *getSendFp2retFn(bool IsSuper) const {
    481     return IsSuper ? getMessageSendSuperFn() : getMessageSendFp2retFn();
    482   }
    483 
    484   llvm::Constant *getSendFp2RetFn2(bool IsSuper) const {
    485     return IsSuper ? getMessageSendSuperFn2() : getMessageSendFp2retFn();
    486   }
    487 
    488   ObjCCommonTypesHelper(CodeGen::CodeGenModule &cgm);
    489 };
    490 
    491 /// ObjCTypesHelper - Helper class that encapsulates lazy
    492 /// construction of varies types used during ObjC generation.
    493 class ObjCTypesHelper : public ObjCCommonTypesHelper {
    494 public:
    495   /// SymtabTy - LLVM type for struct objc_symtab.
    496   llvm::StructType *SymtabTy;
    497   /// SymtabPtrTy - LLVM type for struct objc_symtab *.
    498   llvm::Type *SymtabPtrTy;
    499   /// ModuleTy - LLVM type for struct objc_module.
    500   llvm::StructType *ModuleTy;
    501 
    502   /// ProtocolTy - LLVM type for struct objc_protocol.
    503   llvm::StructType *ProtocolTy;
    504   /// ProtocolPtrTy - LLVM type for struct objc_protocol *.
    505   llvm::Type *ProtocolPtrTy;
    506   /// ProtocolExtensionTy - LLVM type for struct
    507   /// objc_protocol_extension.
    508   llvm::StructType *ProtocolExtensionTy;
    509   /// ProtocolExtensionTy - LLVM type for struct
    510   /// objc_protocol_extension *.
    511   llvm::Type *ProtocolExtensionPtrTy;
    512   /// MethodDescriptionTy - LLVM type for struct
    513   /// objc_method_description.
    514   llvm::StructType *MethodDescriptionTy;
    515   /// MethodDescriptionListTy - LLVM type for struct
    516   /// objc_method_description_list.
    517   llvm::StructType *MethodDescriptionListTy;
    518   /// MethodDescriptionListPtrTy - LLVM type for struct
    519   /// objc_method_description_list *.
    520   llvm::Type *MethodDescriptionListPtrTy;
    521   /// ProtocolListTy - LLVM type for struct objc_property_list.
    522   llvm::StructType *ProtocolListTy;
    523   /// ProtocolListPtrTy - LLVM type for struct objc_property_list*.
    524   llvm::Type *ProtocolListPtrTy;
    525   /// CategoryTy - LLVM type for struct objc_category.
    526   llvm::StructType *CategoryTy;
    527   /// ClassTy - LLVM type for struct objc_class.
    528   llvm::StructType *ClassTy;
    529   /// ClassPtrTy - LLVM type for struct objc_class *.
    530   llvm::Type *ClassPtrTy;
    531   /// ClassExtensionTy - LLVM type for struct objc_class_ext.
    532   llvm::StructType *ClassExtensionTy;
    533   /// ClassExtensionPtrTy - LLVM type for struct objc_class_ext *.
    534   llvm::Type *ClassExtensionPtrTy;
    535   // IvarTy - LLVM type for struct objc_ivar.
    536   llvm::StructType *IvarTy;
    537   /// IvarListTy - LLVM type for struct objc_ivar_list.
    538   llvm::Type *IvarListTy;
    539   /// IvarListPtrTy - LLVM type for struct objc_ivar_list *.
    540   llvm::Type *IvarListPtrTy;
    541   /// MethodListTy - LLVM type for struct objc_method_list.
    542   llvm::Type *MethodListTy;
    543   /// MethodListPtrTy - LLVM type for struct objc_method_list *.
    544   llvm::Type *MethodListPtrTy;
    545 
    546   /// ExceptionDataTy - LLVM type for struct _objc_exception_data.
    547   llvm::Type *ExceptionDataTy;
    548 
    549   /// ExceptionTryEnterFn - LLVM objc_exception_try_enter function.
    550   llvm::Constant *getExceptionTryEnterFn() {
    551     llvm::Type *params[] = { ExceptionDataTy->getPointerTo() };
    552     return CGM.CreateRuntimeFunction(
    553       llvm::FunctionType::get(CGM.VoidTy, params, false),
    554       "objc_exception_try_enter");
    555   }
    556 
    557   /// ExceptionTryExitFn - LLVM objc_exception_try_exit function.
    558   llvm::Constant *getExceptionTryExitFn() {
    559     llvm::Type *params[] = { ExceptionDataTy->getPointerTo() };
    560     return CGM.CreateRuntimeFunction(
    561       llvm::FunctionType::get(CGM.VoidTy, params, false),
    562       "objc_exception_try_exit");
    563   }
    564 
    565   /// ExceptionExtractFn - LLVM objc_exception_extract function.
    566   llvm::Constant *getExceptionExtractFn() {
    567     llvm::Type *params[] = { ExceptionDataTy->getPointerTo() };
    568     return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
    569                                                              params, false),
    570                                      "objc_exception_extract");
    571   }
    572 
    573   /// ExceptionMatchFn - LLVM objc_exception_match function.
    574   llvm::Constant *getExceptionMatchFn() {
    575     llvm::Type *params[] = { ClassPtrTy, ObjectPtrTy };
    576     return CGM.CreateRuntimeFunction(
    577       llvm::FunctionType::get(CGM.Int32Ty, params, false),
    578       "objc_exception_match");
    579 
    580   }
    581 
    582   /// SetJmpFn - LLVM _setjmp function.
    583   llvm::Constant *getSetJmpFn() {
    584     // This is specifically the prototype for x86.
    585     llvm::Type *params[] = { CGM.Int32Ty->getPointerTo() };
    586     return
    587       CGM.CreateRuntimeFunction(llvm::FunctionType::get(CGM.Int32Ty,
    588                                                         params, false),
    589                                 "_setjmp",
    590                                 llvm::AttributeSet::get(CGM.getLLVMContext(),
    591                                               llvm::AttributeSet::FunctionIndex,
    592                                                  llvm::Attribute::NonLazyBind));
    593   }
    594 
    595 public:
    596   ObjCTypesHelper(CodeGen::CodeGenModule &cgm);
    597 };
    598 
    599 /// ObjCNonFragileABITypesHelper - will have all types needed by objective-c's
    600 /// modern abi
    601 class ObjCNonFragileABITypesHelper : public ObjCCommonTypesHelper {
    602 public:
    603 
    604   // MethodListnfABITy - LLVM for struct _method_list_t
    605   llvm::StructType *MethodListnfABITy;
    606 
    607   // MethodListnfABIPtrTy - LLVM for struct _method_list_t*
    608   llvm::Type *MethodListnfABIPtrTy;
    609 
    610   // ProtocolnfABITy = LLVM for struct _protocol_t
    611   llvm::StructType *ProtocolnfABITy;
    612 
    613   // ProtocolnfABIPtrTy = LLVM for struct _protocol_t*
    614   llvm::Type *ProtocolnfABIPtrTy;
    615 
    616   // ProtocolListnfABITy - LLVM for struct _objc_protocol_list
    617   llvm::StructType *ProtocolListnfABITy;
    618 
    619   // ProtocolListnfABIPtrTy - LLVM for struct _objc_protocol_list*
    620   llvm::Type *ProtocolListnfABIPtrTy;
    621 
    622   // ClassnfABITy - LLVM for struct _class_t
    623   llvm::StructType *ClassnfABITy;
    624 
    625   // ClassnfABIPtrTy - LLVM for struct _class_t*
    626   llvm::Type *ClassnfABIPtrTy;
    627 
    628   // IvarnfABITy - LLVM for struct _ivar_t
    629   llvm::StructType *IvarnfABITy;
    630 
    631   // IvarListnfABITy - LLVM for struct _ivar_list_t
    632   llvm::StructType *IvarListnfABITy;
    633 
    634   // IvarListnfABIPtrTy = LLVM for struct _ivar_list_t*
    635   llvm::Type *IvarListnfABIPtrTy;
    636 
    637   // ClassRonfABITy - LLVM for struct _class_ro_t
    638   llvm::StructType *ClassRonfABITy;
    639 
    640   // ImpnfABITy - LLVM for id (*)(id, SEL, ...)
    641   llvm::Type *ImpnfABITy;
    642 
    643   // CategorynfABITy - LLVM for struct _category_t
    644   llvm::StructType *CategorynfABITy;
    645 
    646   // New types for nonfragile abi messaging.
    647 
    648   // MessageRefTy - LLVM for:
    649   // struct _message_ref_t {
    650   //   IMP messenger;
    651   //   SEL name;
    652   // };
    653   llvm::StructType *MessageRefTy;
    654   // MessageRefCTy - clang type for struct _message_ref_t
    655   QualType MessageRefCTy;
    656 
    657   // MessageRefPtrTy - LLVM for struct _message_ref_t*
    658   llvm::Type *MessageRefPtrTy;
    659   // MessageRefCPtrTy - clang type for struct _message_ref_t*
    660   QualType MessageRefCPtrTy;
    661 
    662   // MessengerTy - Type of the messenger (shown as IMP above)
    663   llvm::FunctionType *MessengerTy;
    664 
    665   // SuperMessageRefTy - LLVM for:
    666   // struct _super_message_ref_t {
    667   //   SUPER_IMP messenger;
    668   //   SEL name;
    669   // };
    670   llvm::StructType *SuperMessageRefTy;
    671 
    672   // SuperMessageRefPtrTy - LLVM for struct _super_message_ref_t*
    673   llvm::Type *SuperMessageRefPtrTy;
    674 
    675   llvm::Constant *getMessageSendFixupFn() {
    676     // id objc_msgSend_fixup(id, struct message_ref_t*, ...)
    677     llvm::Type *params[] = { ObjectPtrTy, MessageRefPtrTy };
    678     return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
    679                                                              params, true),
    680                                      "objc_msgSend_fixup");
    681   }
    682 
    683   llvm::Constant *getMessageSendFpretFixupFn() {
    684     // id objc_msgSend_fpret_fixup(id, struct message_ref_t*, ...)
    685     llvm::Type *params[] = { ObjectPtrTy, MessageRefPtrTy };
    686     return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
    687                                                              params, true),
    688                                      "objc_msgSend_fpret_fixup");
    689   }
    690 
    691   llvm::Constant *getMessageSendStretFixupFn() {
    692     // id objc_msgSend_stret_fixup(id, struct message_ref_t*, ...)
    693     llvm::Type *params[] = { ObjectPtrTy, MessageRefPtrTy };
    694     return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
    695                                                              params, true),
    696                                      "objc_msgSend_stret_fixup");
    697   }
    698 
    699   llvm::Constant *getMessageSendSuper2FixupFn() {
    700     // id objc_msgSendSuper2_fixup (struct objc_super *,
    701     //                              struct _super_message_ref_t*, ...)
    702     llvm::Type *params[] = { SuperPtrTy, SuperMessageRefPtrTy };
    703     return  CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
    704                                                               params, true),
    705                                       "objc_msgSendSuper2_fixup");
    706   }
    707 
    708   llvm::Constant *getMessageSendSuper2StretFixupFn() {
    709     // id objc_msgSendSuper2_stret_fixup(struct objc_super *,
    710     //                                   struct _super_message_ref_t*, ...)
    711     llvm::Type *params[] = { SuperPtrTy, SuperMessageRefPtrTy };
    712     return  CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
    713                                                               params, true),
    714                                       "objc_msgSendSuper2_stret_fixup");
    715   }
    716 
    717   llvm::Constant *getObjCEndCatchFn() {
    718     return CGM.CreateRuntimeFunction(llvm::FunctionType::get(CGM.VoidTy, false),
    719                                      "objc_end_catch");
    720 
    721   }
    722 
    723   llvm::Constant *getObjCBeginCatchFn() {
    724     llvm::Type *params[] = { Int8PtrTy };
    725     return CGM.CreateRuntimeFunction(llvm::FunctionType::get(Int8PtrTy,
    726                                                              params, false),
    727                                      "objc_begin_catch");
    728   }
    729 
    730   llvm::StructType *EHTypeTy;
    731   llvm::Type *EHTypePtrTy;
    732 
    733   ObjCNonFragileABITypesHelper(CodeGen::CodeGenModule &cgm);
    734 };
    735 
    736 class CGObjCCommonMac : public CodeGen::CGObjCRuntime {
    737 public:
    738   // FIXME - accessibility
    739   class GC_IVAR {
    740   public:
    741     unsigned ivar_bytepos;
    742     unsigned ivar_size;
    743     GC_IVAR(unsigned bytepos = 0, unsigned size = 0)
    744       : ivar_bytepos(bytepos), ivar_size(size) {}
    745 
    746     // Allow sorting based on byte pos.
    747     bool operator<(const GC_IVAR &b) const {
    748       return ivar_bytepos < b.ivar_bytepos;
    749     }
    750   };
    751 
    752   class SKIP_SCAN {
    753   public:
    754     unsigned skip;
    755     unsigned scan;
    756     SKIP_SCAN(unsigned _skip = 0, unsigned _scan = 0)
    757       : skip(_skip), scan(_scan) {}
    758   };
    759 
    760   /// opcode for captured block variables layout 'instructions'.
    761   /// In the following descriptions, 'I' is the value of the immediate field.
    762   /// (field following the opcode).
    763   ///
    764   enum BLOCK_LAYOUT_OPCODE {
    765     /// An operator which affects how the following layout should be
    766     /// interpreted.
    767     ///   I == 0: Halt interpretation and treat everything else as
    768     ///           a non-pointer.  Note that this instruction is equal
    769     ///           to '\0'.
    770     ///   I != 0: Currently unused.
    771     BLOCK_LAYOUT_OPERATOR            = 0,
    772 
    773     /// The next I+1 bytes do not contain a value of object pointer type.
    774     /// Note that this can leave the stream unaligned, meaning that
    775     /// subsequent word-size instructions do not begin at a multiple of
    776     /// the pointer size.
    777     BLOCK_LAYOUT_NON_OBJECT_BYTES    = 1,
    778 
    779     /// The next I+1 words do not contain a value of object pointer type.
    780     /// This is simply an optimized version of BLOCK_LAYOUT_BYTES for
    781     /// when the required skip quantity is a multiple of the pointer size.
    782     BLOCK_LAYOUT_NON_OBJECT_WORDS    = 2,
    783 
    784     /// The next I+1 words are __strong pointers to Objective-C
    785     /// objects or blocks.
    786     BLOCK_LAYOUT_STRONG              = 3,
    787 
    788     /// The next I+1 words are pointers to __block variables.
    789     BLOCK_LAYOUT_BYREF               = 4,
    790 
    791     /// The next I+1 words are __weak pointers to Objective-C
    792     /// objects or blocks.
    793     BLOCK_LAYOUT_WEAK                = 5,
    794 
    795     /// The next I+1 words are __unsafe_unretained pointers to
    796     /// Objective-C objects or blocks.
    797     BLOCK_LAYOUT_UNRETAINED          = 6
    798 
    799     /// The next I+1 words are block or object pointers with some
    800     /// as-yet-unspecified ownership semantics.  If we add more
    801     /// flavors of ownership semantics, values will be taken from
    802     /// this range.
    803     ///
    804     /// This is included so that older tools can at least continue
    805     /// processing the layout past such things.
    806     //BLOCK_LAYOUT_OWNERSHIP_UNKNOWN = 7..10,
    807 
    808     /// All other opcodes are reserved.  Halt interpretation and
    809     /// treat everything else as opaque.
    810   };
    811 
    812   class RUN_SKIP {
    813   public:
    814     enum BLOCK_LAYOUT_OPCODE opcode;
    815     CharUnits block_var_bytepos;
    816     CharUnits block_var_size;
    817     RUN_SKIP(enum BLOCK_LAYOUT_OPCODE Opcode = BLOCK_LAYOUT_OPERATOR,
    818              CharUnits BytePos = CharUnits::Zero(),
    819              CharUnits Size = CharUnits::Zero())
    820     : opcode(Opcode), block_var_bytepos(BytePos),  block_var_size(Size) {}
    821 
    822     // Allow sorting based on byte pos.
    823     bool operator<(const RUN_SKIP &b) const {
    824       return block_var_bytepos < b.block_var_bytepos;
    825     }
    826   };
    827 
    828 protected:
    829   llvm::LLVMContext &VMContext;
    830   // FIXME! May not be needing this after all.
    831   unsigned ObjCABI;
    832 
    833   // gc ivar layout bitmap calculation helper caches.
    834   SmallVector<GC_IVAR, 16> SkipIvars;
    835   SmallVector<GC_IVAR, 16> IvarsInfo;
    836 
    837   // arc/mrr layout of captured block literal variables.
    838   SmallVector<RUN_SKIP, 16> RunSkipBlockVars;
    839 
    840   /// LazySymbols - Symbols to generate a lazy reference for. See
    841   /// DefinedSymbols and FinishModule().
    842   llvm::SetVector<IdentifierInfo*> LazySymbols;
    843 
    844   /// DefinedSymbols - External symbols which are defined by this
    845   /// module. The symbols in this list and LazySymbols are used to add
    846   /// special linker symbols which ensure that Objective-C modules are
    847   /// linked properly.
    848   llvm::SetVector<IdentifierInfo*> DefinedSymbols;
    849 
    850   /// ClassNames - uniqued class names.
    851   llvm::StringMap<llvm::GlobalVariable*> ClassNames;
    852 
    853   /// MethodVarNames - uniqued method variable names.
    854   llvm::DenseMap<Selector, llvm::GlobalVariable*> MethodVarNames;
    855 
    856   /// DefinedCategoryNames - list of category names in form Class_Category.
    857   llvm::SetVector<std::string> DefinedCategoryNames;
    858 
    859   /// MethodVarTypes - uniqued method type signatures. We have to use
    860   /// a StringMap here because have no other unique reference.
    861   llvm::StringMap<llvm::GlobalVariable*> MethodVarTypes;
    862 
    863   /// MethodDefinitions - map of methods which have been defined in
    864   /// this translation unit.
    865   llvm::DenseMap<const ObjCMethodDecl*, llvm::Function*> MethodDefinitions;
    866 
    867   /// PropertyNames - uniqued method variable names.
    868   llvm::DenseMap<IdentifierInfo*, llvm::GlobalVariable*> PropertyNames;
    869 
    870   /// ClassReferences - uniqued class references.
    871   llvm::DenseMap<IdentifierInfo*, llvm::GlobalVariable*> ClassReferences;
    872 
    873   /// SelectorReferences - uniqued selector references.
    874   llvm::DenseMap<Selector, llvm::GlobalVariable*> SelectorReferences;
    875 
    876   /// Protocols - Protocols for which an objc_protocol structure has
    877   /// been emitted. Forward declarations are handled by creating an
    878   /// empty structure whose initializer is filled in when/if defined.
    879   llvm::DenseMap<IdentifierInfo*, llvm::GlobalVariable*> Protocols;
    880 
    881   /// DefinedProtocols - Protocols which have actually been
    882   /// defined. We should not need this, see FIXME in GenerateProtocol.
    883   llvm::DenseSet<IdentifierInfo*> DefinedProtocols;
    884 
    885   /// DefinedClasses - List of defined classes.
    886   SmallVector<llvm::GlobalValue*, 16> DefinedClasses;
    887 
    888   /// ImplementedClasses - List of @implemented classes.
    889   SmallVector<const ObjCInterfaceDecl*, 16> ImplementedClasses;
    890 
    891   /// DefinedNonLazyClasses - List of defined "non-lazy" classes.
    892   SmallVector<llvm::GlobalValue*, 16> DefinedNonLazyClasses;
    893 
    894   /// DefinedCategories - List of defined categories.
    895   SmallVector<llvm::GlobalValue*, 16> DefinedCategories;
    896 
    897   /// DefinedNonLazyCategories - List of defined "non-lazy" categories.
    898   SmallVector<llvm::GlobalValue*, 16> DefinedNonLazyCategories;
    899 
    900   /// GetNameForMethod - Return a name for the given method.
    901   /// \param[out] NameOut - The return value.
    902   void GetNameForMethod(const ObjCMethodDecl *OMD,
    903                         const ObjCContainerDecl *CD,
    904                         SmallVectorImpl<char> &NameOut);
    905 
    906   /// GetMethodVarName - Return a unique constant for the given
    907   /// selector's name. The return value has type char *.
    908   llvm::Constant *GetMethodVarName(Selector Sel);
    909   llvm::Constant *GetMethodVarName(IdentifierInfo *Ident);
    910 
    911   /// GetMethodVarType - Return a unique constant for the given
    912   /// method's type encoding string. The return value has type char *.
    913 
    914   // FIXME: This is a horrible name.
    915   llvm::Constant *GetMethodVarType(const ObjCMethodDecl *D,
    916                                    bool Extended = false);
    917   llvm::Constant *GetMethodVarType(const FieldDecl *D);
    918 
    919   /// GetPropertyName - Return a unique constant for the given
    920   /// name. The return value has type char *.
    921   llvm::Constant *GetPropertyName(IdentifierInfo *Ident);
    922 
    923   // FIXME: This can be dropped once string functions are unified.
    924   llvm::Constant *GetPropertyTypeString(const ObjCPropertyDecl *PD,
    925                                         const Decl *Container);
    926 
    927   /// GetClassName - Return a unique constant for the given selector's
    928   /// runtime name (which may change via use of objc_runtime_name attribute on
    929   /// class or protocol definition. The return value has type char *.
    930   llvm::Constant *GetClassName(StringRef RuntimeName);
    931 
    932   llvm::Function *GetMethodDefinition(const ObjCMethodDecl *MD);
    933 
    934   /// BuildIvarLayout - Builds ivar layout bitmap for the class
    935   /// implementation for the __strong or __weak case.
    936   ///
    937   llvm::Constant *BuildIvarLayout(const ObjCImplementationDecl *OI,
    938                                   bool ForStrongLayout);
    939 
    940   llvm::Constant *BuildIvarLayoutBitmap(std::string &BitMap);
    941 
    942   void BuildAggrIvarRecordLayout(const RecordType *RT,
    943                                  unsigned int BytePos, bool ForStrongLayout,
    944                                  bool &HasUnion);
    945   void BuildAggrIvarLayout(const ObjCImplementationDecl *OI,
    946                            const llvm::StructLayout *Layout,
    947                            const RecordDecl *RD,
    948                            ArrayRef<const FieldDecl*> RecFields,
    949                            unsigned int BytePos, bool ForStrongLayout,
    950                            bool &HasUnion);
    951 
    952   Qualifiers::ObjCLifetime getBlockCaptureLifetime(QualType QT, bool ByrefLayout);
    953 
    954   void UpdateRunSkipBlockVars(bool IsByref,
    955                               Qualifiers::ObjCLifetime LifeTime,
    956                               CharUnits FieldOffset,
    957                               CharUnits FieldSize);
    958 
    959   void BuildRCBlockVarRecordLayout(const RecordType *RT,
    960                                    CharUnits BytePos, bool &HasUnion,
    961                                    bool ByrefLayout=false);
    962 
    963   void BuildRCRecordLayout(const llvm::StructLayout *RecLayout,
    964                            const RecordDecl *RD,
    965                            ArrayRef<const FieldDecl*> RecFields,
    966                            CharUnits BytePos, bool &HasUnion,
    967                            bool ByrefLayout);
    968 
    969   uint64_t InlineLayoutInstruction(SmallVectorImpl<unsigned char> &Layout);
    970 
    971   llvm::Constant *getBitmapBlockLayout(bool ComputeByrefLayout);
    972 
    973 
    974   /// GetIvarLayoutName - Returns a unique constant for the given
    975   /// ivar layout bitmap.
    976   llvm::Constant *GetIvarLayoutName(IdentifierInfo *Ident,
    977                                     const ObjCCommonTypesHelper &ObjCTypes);
    978 
    979   /// EmitPropertyList - Emit the given property list. The return
    980   /// value has type PropertyListPtrTy.
    981   llvm::Constant *EmitPropertyList(Twine Name,
    982                                    const Decl *Container,
    983                                    const ObjCContainerDecl *OCD,
    984                                    const ObjCCommonTypesHelper &ObjCTypes);
    985 
    986   /// EmitProtocolMethodTypes - Generate the array of extended method type
    987   /// strings. The return value has type Int8PtrPtrTy.
    988   llvm::Constant *EmitProtocolMethodTypes(Twine Name,
    989                                           ArrayRef<llvm::Constant*> MethodTypes,
    990                                        const ObjCCommonTypesHelper &ObjCTypes);
    991 
    992   /// PushProtocolProperties - Push protocol's property on the input stack.
    993   void PushProtocolProperties(
    994     llvm::SmallPtrSet<const IdentifierInfo*, 16> &PropertySet,
    995     SmallVectorImpl<llvm::Constant*> &Properties,
    996     const Decl *Container,
    997     const ObjCProtocolDecl *Proto,
    998     const ObjCCommonTypesHelper &ObjCTypes);
    999 
   1000   /// GetProtocolRef - Return a reference to the internal protocol
   1001   /// description, creating an empty one if it has not been
   1002   /// defined. The return value has type ProtocolPtrTy.
   1003   llvm::Constant *GetProtocolRef(const ObjCProtocolDecl *PD);
   1004 
   1005   /// CreateMetadataVar - Create a global variable with internal
   1006   /// linkage for use by the Objective-C runtime.
   1007   ///
   1008   /// This is a convenience wrapper which not only creates the
   1009   /// variable, but also sets the section and alignment and adds the
   1010   /// global to the "llvm.used" list.
   1011   ///
   1012   /// \param Name - The variable name.
   1013   /// \param Init - The variable initializer; this is also used to
   1014   /// define the type of the variable.
   1015   /// \param Section - The section the variable should go into, or empty.
   1016   /// \param Align - The alignment for the variable, or 0.
   1017   /// \param AddToUsed - Whether the variable should be added to
   1018   /// "llvm.used".
   1019   llvm::GlobalVariable *CreateMetadataVar(Twine Name, llvm::Constant *Init,
   1020                                           StringRef Section, unsigned Align,
   1021                                           bool AddToUsed);
   1022 
   1023   CodeGen::RValue EmitMessageSend(CodeGen::CodeGenFunction &CGF,
   1024                                   ReturnValueSlot Return,
   1025                                   QualType ResultType,
   1026                                   llvm::Value *Sel,
   1027                                   llvm::Value *Arg0,
   1028                                   QualType Arg0Ty,
   1029                                   bool IsSuper,
   1030                                   const CallArgList &CallArgs,
   1031                                   const ObjCMethodDecl *OMD,
   1032                                   const ObjCCommonTypesHelper &ObjCTypes);
   1033 
   1034   /// EmitImageInfo - Emit the image info marker used to encode some module
   1035   /// level information.
   1036   void EmitImageInfo();
   1037 
   1038 public:
   1039   CGObjCCommonMac(CodeGen::CodeGenModule &cgm) :
   1040     CGObjCRuntime(cgm), VMContext(cgm.getLLVMContext()) { }
   1041 
   1042   llvm::Constant *GenerateConstantString(const StringLiteral *SL) override;
   1043 
   1044   llvm::Function *GenerateMethod(const ObjCMethodDecl *OMD,
   1045                                  const ObjCContainerDecl *CD=nullptr) override;
   1046 
   1047   void GenerateProtocol(const ObjCProtocolDecl *PD) override;
   1048 
   1049   /// GetOrEmitProtocol - Get the protocol object for the given
   1050   /// declaration, emitting it if necessary. The return value has type
   1051   /// ProtocolPtrTy.
   1052   virtual llvm::Constant *GetOrEmitProtocol(const ObjCProtocolDecl *PD)=0;
   1053 
   1054   /// GetOrEmitProtocolRef - Get a forward reference to the protocol
   1055   /// object for the given declaration, emitting it if needed. These
   1056   /// forward references will be filled in with empty bodies if no
   1057   /// definition is seen. The return value has type ProtocolPtrTy.
   1058   virtual llvm::Constant *GetOrEmitProtocolRef(const ObjCProtocolDecl *PD)=0;
   1059   llvm::Constant *BuildGCBlockLayout(CodeGen::CodeGenModule &CGM,
   1060                                      const CGBlockInfo &blockInfo) override;
   1061   llvm::Constant *BuildRCBlockLayout(CodeGen::CodeGenModule &CGM,
   1062                                      const CGBlockInfo &blockInfo) override;
   1063 
   1064   llvm::Constant *BuildByrefLayout(CodeGen::CodeGenModule &CGM,
   1065                                    QualType T) override;
   1066 };
   1067 
   1068 class CGObjCMac : public CGObjCCommonMac {
   1069 private:
   1070   ObjCTypesHelper ObjCTypes;
   1071 
   1072   /// EmitModuleInfo - Another marker encoding module level
   1073   /// information.
   1074   void EmitModuleInfo();
   1075 
   1076   /// EmitModuleSymols - Emit module symbols, the list of defined
   1077   /// classes and categories. The result has type SymtabPtrTy.
   1078   llvm::Constant *EmitModuleSymbols();
   1079 
   1080   /// FinishModule - Write out global data structures at the end of
   1081   /// processing a translation unit.
   1082   void FinishModule();
   1083 
   1084   /// EmitClassExtension - Generate the class extension structure used
   1085   /// to store the weak ivar layout and properties. The return value
   1086   /// has type ClassExtensionPtrTy.
   1087   llvm::Constant *EmitClassExtension(const ObjCImplementationDecl *ID);
   1088 
   1089   /// EmitClassRef - Return a Value*, of type ObjCTypes.ClassPtrTy,
   1090   /// for the given class.
   1091   llvm::Value *EmitClassRef(CodeGenFunction &CGF,
   1092                             const ObjCInterfaceDecl *ID);
   1093 
   1094   llvm::Value *EmitClassRefFromId(CodeGenFunction &CGF,
   1095                                   IdentifierInfo *II);
   1096 
   1097   llvm::Value *EmitNSAutoreleasePoolClassRef(CodeGenFunction &CGF) override;
   1098 
   1099   /// EmitSuperClassRef - Emits reference to class's main metadata class.
   1100   llvm::Value *EmitSuperClassRef(const ObjCInterfaceDecl *ID);
   1101 
   1102   /// EmitIvarList - Emit the ivar list for the given
   1103   /// implementation. If ForClass is true the list of class ivars
   1104   /// (i.e. metaclass ivars) is emitted, otherwise the list of
   1105   /// interface ivars will be emitted. The return value has type
   1106   /// IvarListPtrTy.
   1107   llvm::Constant *EmitIvarList(const ObjCImplementationDecl *ID,
   1108                                bool ForClass);
   1109 
   1110   /// EmitMetaClass - Emit a forward reference to the class structure
   1111   /// for the metaclass of the given interface. The return value has
   1112   /// type ClassPtrTy.
   1113   llvm::Constant *EmitMetaClassRef(const ObjCInterfaceDecl *ID);
   1114 
   1115   /// EmitMetaClass - Emit a class structure for the metaclass of the
   1116   /// given implementation. The return value has type ClassPtrTy.
   1117   llvm::Constant *EmitMetaClass(const ObjCImplementationDecl *ID,
   1118                                 llvm::Constant *Protocols,
   1119                                 ArrayRef<llvm::Constant*> Methods);
   1120 
   1121   llvm::Constant *GetMethodConstant(const ObjCMethodDecl *MD);
   1122 
   1123   llvm::Constant *GetMethodDescriptionConstant(const ObjCMethodDecl *MD);
   1124 
   1125   /// EmitMethodList - Emit the method list for the given
   1126   /// implementation. The return value has type MethodListPtrTy.
   1127   llvm::Constant *EmitMethodList(Twine Name,
   1128                                  const char *Section,
   1129                                  ArrayRef<llvm::Constant*> Methods);
   1130 
   1131   /// EmitMethodDescList - Emit a method description list for a list of
   1132   /// method declarations.
   1133   ///  - TypeName: The name for the type containing the methods.
   1134   ///  - IsProtocol: True iff these methods are for a protocol.
   1135   ///  - ClassMethds: True iff these are class methods.
   1136   ///  - Required: When true, only "required" methods are
   1137   ///    listed. Similarly, when false only "optional" methods are
   1138   ///    listed. For classes this should always be true.
   1139   ///  - begin, end: The method list to output.
   1140   ///
   1141   /// The return value has type MethodDescriptionListPtrTy.
   1142   llvm::Constant *EmitMethodDescList(Twine Name,
   1143                                      const char *Section,
   1144                                      ArrayRef<llvm::Constant*> Methods);
   1145 
   1146   /// GetOrEmitProtocol - Get the protocol object for the given
   1147   /// declaration, emitting it if necessary. The return value has type
   1148   /// ProtocolPtrTy.
   1149   llvm::Constant *GetOrEmitProtocol(const ObjCProtocolDecl *PD) override;
   1150 
   1151   /// GetOrEmitProtocolRef - Get a forward reference to the protocol
   1152   /// object for the given declaration, emitting it if needed. These
   1153   /// forward references will be filled in with empty bodies if no
   1154   /// definition is seen. The return value has type ProtocolPtrTy.
   1155   llvm::Constant *GetOrEmitProtocolRef(const ObjCProtocolDecl *PD) override;
   1156 
   1157   /// EmitProtocolExtension - Generate the protocol extension
   1158   /// structure used to store optional instance and class methods, and
   1159   /// protocol properties. The return value has type
   1160   /// ProtocolExtensionPtrTy.
   1161   llvm::Constant *
   1162   EmitProtocolExtension(const ObjCProtocolDecl *PD,
   1163                         ArrayRef<llvm::Constant*> OptInstanceMethods,
   1164                         ArrayRef<llvm::Constant*> OptClassMethods,
   1165                         ArrayRef<llvm::Constant*> MethodTypesExt);
   1166 
   1167   /// EmitProtocolList - Generate the list of referenced
   1168   /// protocols. The return value has type ProtocolListPtrTy.
   1169   llvm::Constant *EmitProtocolList(Twine Name,
   1170                                    ObjCProtocolDecl::protocol_iterator begin,
   1171                                    ObjCProtocolDecl::protocol_iterator end);
   1172 
   1173   /// EmitSelector - Return a Value*, of type ObjCTypes.SelectorPtrTy,
   1174   /// for the given selector.
   1175   llvm::Value *EmitSelector(CodeGenFunction &CGF, Selector Sel,
   1176                             bool lval=false);
   1177 
   1178 public:
   1179   CGObjCMac(CodeGen::CodeGenModule &cgm);
   1180 
   1181   llvm::Function *ModuleInitFunction() override;
   1182 
   1183   CodeGen::RValue GenerateMessageSend(CodeGen::CodeGenFunction &CGF,
   1184                                       ReturnValueSlot Return,
   1185                                       QualType ResultType,
   1186                                       Selector Sel, llvm::Value *Receiver,
   1187                                       const CallArgList &CallArgs,
   1188                                       const ObjCInterfaceDecl *Class,
   1189                                       const ObjCMethodDecl *Method) override;
   1190 
   1191   CodeGen::RValue
   1192   GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF,
   1193                            ReturnValueSlot Return, QualType ResultType,
   1194                            Selector Sel, const ObjCInterfaceDecl *Class,
   1195                            bool isCategoryImpl, llvm::Value *Receiver,
   1196                            bool IsClassMessage, const CallArgList &CallArgs,
   1197                            const ObjCMethodDecl *Method) override;
   1198 
   1199   llvm::Value *GetClass(CodeGenFunction &CGF,
   1200                         const ObjCInterfaceDecl *ID) override;
   1201 
   1202   llvm::Value *GetSelector(CodeGenFunction &CGF, Selector Sel,
   1203                            bool lval = false) override;
   1204 
   1205   /// The NeXT/Apple runtimes do not support typed selectors; just emit an
   1206   /// untyped one.
   1207   llvm::Value *GetSelector(CodeGenFunction &CGF,
   1208                            const ObjCMethodDecl *Method) override;
   1209 
   1210   llvm::Constant *GetEHType(QualType T) override;
   1211 
   1212   void GenerateCategory(const ObjCCategoryImplDecl *CMD) override;
   1213 
   1214   void GenerateClass(const ObjCImplementationDecl *ClassDecl) override;
   1215 
   1216   void RegisterAlias(const ObjCCompatibleAliasDecl *OAD) override {}
   1217 
   1218   llvm::Value *GenerateProtocolRef(CodeGenFunction &CGF,
   1219                                    const ObjCProtocolDecl *PD) override;
   1220 
   1221   llvm::Constant *GetPropertyGetFunction() override;
   1222   llvm::Constant *GetPropertySetFunction() override;
   1223   llvm::Constant *GetOptimizedPropertySetFunction(bool atomic,
   1224                                                   bool copy) override;
   1225   llvm::Constant *GetGetStructFunction() override;
   1226   llvm::Constant *GetSetStructFunction() override;
   1227   llvm::Constant *GetCppAtomicObjectGetFunction() override;
   1228   llvm::Constant *GetCppAtomicObjectSetFunction() override;
   1229   llvm::Constant *EnumerationMutationFunction() override;
   1230 
   1231   void EmitTryStmt(CodeGen::CodeGenFunction &CGF,
   1232                    const ObjCAtTryStmt &S) override;
   1233   void EmitSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
   1234                             const ObjCAtSynchronizedStmt &S) override;
   1235   void EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF, const Stmt &S);
   1236   void EmitThrowStmt(CodeGen::CodeGenFunction &CGF, const ObjCAtThrowStmt &S,
   1237                      bool ClearInsertionPoint=true) override;
   1238   llvm::Value * EmitObjCWeakRead(CodeGen::CodeGenFunction &CGF,
   1239                                  llvm::Value *AddrWeakObj) override;
   1240   void EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF,
   1241                           llvm::Value *src, llvm::Value *dst) override;
   1242   void EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF,
   1243                             llvm::Value *src, llvm::Value *dest,
   1244                             bool threadlocal = false) override;
   1245   void EmitObjCIvarAssign(CodeGen::CodeGenFunction &CGF,
   1246                           llvm::Value *src, llvm::Value *dest,
   1247                           llvm::Value *ivarOffset) override;
   1248   void EmitObjCStrongCastAssign(CodeGen::CodeGenFunction &CGF,
   1249                                 llvm::Value *src, llvm::Value *dest) override;
   1250   void EmitGCMemmoveCollectable(CodeGen::CodeGenFunction &CGF,
   1251                                 llvm::Value *dest, llvm::Value *src,
   1252                                 llvm::Value *size) override;
   1253 
   1254   LValue EmitObjCValueForIvar(CodeGen::CodeGenFunction &CGF, QualType ObjectTy,
   1255                               llvm::Value *BaseValue, const ObjCIvarDecl *Ivar,
   1256                               unsigned CVRQualifiers) override;
   1257   llvm::Value *EmitIvarOffset(CodeGen::CodeGenFunction &CGF,
   1258                               const ObjCInterfaceDecl *Interface,
   1259                               const ObjCIvarDecl *Ivar) override;
   1260 
   1261   /// GetClassGlobal - Return the global variable for the Objective-C
   1262   /// class of the given name.
   1263   llvm::GlobalVariable *GetClassGlobal(const std::string &Name,
   1264                                        bool Weak = false) override {
   1265     llvm_unreachable("CGObjCMac::GetClassGlobal");
   1266   }
   1267 };
   1268 
   1269 class CGObjCNonFragileABIMac : public CGObjCCommonMac {
   1270 private:
   1271   ObjCNonFragileABITypesHelper ObjCTypes;
   1272   llvm::GlobalVariable* ObjCEmptyCacheVar;
   1273   llvm::GlobalVariable* ObjCEmptyVtableVar;
   1274 
   1275   /// SuperClassReferences - uniqued super class references.
   1276   llvm::DenseMap<IdentifierInfo*, llvm::GlobalVariable*> SuperClassReferences;
   1277 
   1278   /// MetaClassReferences - uniqued meta class references.
   1279   llvm::DenseMap<IdentifierInfo*, llvm::GlobalVariable*> MetaClassReferences;
   1280 
   1281   /// EHTypeReferences - uniqued class ehtype references.
   1282   llvm::DenseMap<IdentifierInfo*, llvm::GlobalVariable*> EHTypeReferences;
   1283 
   1284   /// VTableDispatchMethods - List of methods for which we generate
   1285   /// vtable-based message dispatch.
   1286   llvm::DenseSet<Selector> VTableDispatchMethods;
   1287 
   1288   /// DefinedMetaClasses - List of defined meta-classes.
   1289   std::vector<llvm::GlobalValue*> DefinedMetaClasses;
   1290 
   1291   /// isVTableDispatchedSelector - Returns true if SEL is a
   1292   /// vtable-based selector.
   1293   bool isVTableDispatchedSelector(Selector Sel);
   1294 
   1295   /// FinishNonFragileABIModule - Write out global data structures at the end of
   1296   /// processing a translation unit.
   1297   void FinishNonFragileABIModule();
   1298 
   1299   /// AddModuleClassList - Add the given list of class pointers to the
   1300   /// module with the provided symbol and section names.
   1301   void AddModuleClassList(ArrayRef<llvm::GlobalValue*> Container,
   1302                           const char *SymbolName,
   1303                           const char *SectionName);
   1304 
   1305   llvm::GlobalVariable * BuildClassRoTInitializer(unsigned flags,
   1306                                               unsigned InstanceStart,
   1307                                               unsigned InstanceSize,
   1308                                               const ObjCImplementationDecl *ID);
   1309   llvm::GlobalVariable * BuildClassMetaData(const std::string &ClassName,
   1310                                             llvm::Constant *IsAGV,
   1311                                             llvm::Constant *SuperClassGV,
   1312                                             llvm::Constant *ClassRoGV,
   1313                                             bool HiddenVisibility,
   1314                                             bool Weak);
   1315 
   1316   llvm::Constant *GetMethodConstant(const ObjCMethodDecl *MD);
   1317 
   1318   llvm::Constant *GetMethodDescriptionConstant(const ObjCMethodDecl *MD);
   1319 
   1320   /// EmitMethodList - Emit the method list for the given
   1321   /// implementation. The return value has type MethodListnfABITy.
   1322   llvm::Constant *EmitMethodList(Twine Name,
   1323                                  const char *Section,
   1324                                  ArrayRef<llvm::Constant*> Methods);
   1325   /// EmitIvarList - Emit the ivar list for the given
   1326   /// implementation. If ForClass is true the list of class ivars
   1327   /// (i.e. metaclass ivars) is emitted, otherwise the list of
   1328   /// interface ivars will be emitted. The return value has type
   1329   /// IvarListnfABIPtrTy.
   1330   llvm::Constant *EmitIvarList(const ObjCImplementationDecl *ID);
   1331 
   1332   llvm::Constant *EmitIvarOffsetVar(const ObjCInterfaceDecl *ID,
   1333                                     const ObjCIvarDecl *Ivar,
   1334                                     unsigned long int offset);
   1335 
   1336   /// GetOrEmitProtocol - Get the protocol object for the given
   1337   /// declaration, emitting it if necessary. The return value has type
   1338   /// ProtocolPtrTy.
   1339   llvm::Constant *GetOrEmitProtocol(const ObjCProtocolDecl *PD) override;
   1340 
   1341   /// GetOrEmitProtocolRef - Get a forward reference to the protocol
   1342   /// object for the given declaration, emitting it if needed. These
   1343   /// forward references will be filled in with empty bodies if no
   1344   /// definition is seen. The return value has type ProtocolPtrTy.
   1345   llvm::Constant *GetOrEmitProtocolRef(const ObjCProtocolDecl *PD) override;
   1346 
   1347   /// EmitProtocolList - Generate the list of referenced
   1348   /// protocols. The return value has type ProtocolListPtrTy.
   1349   llvm::Constant *EmitProtocolList(Twine Name,
   1350                                    ObjCProtocolDecl::protocol_iterator begin,
   1351                                    ObjCProtocolDecl::protocol_iterator end);
   1352 
   1353   CodeGen::RValue EmitVTableMessageSend(CodeGen::CodeGenFunction &CGF,
   1354                                         ReturnValueSlot Return,
   1355                                         QualType ResultType,
   1356                                         Selector Sel,
   1357                                         llvm::Value *Receiver,
   1358                                         QualType Arg0Ty,
   1359                                         bool IsSuper,
   1360                                         const CallArgList &CallArgs,
   1361                                         const ObjCMethodDecl *Method);
   1362 
   1363   /// GetClassGlobal - Return the global variable for the Objective-C
   1364   /// class of the given name.
   1365   llvm::GlobalVariable *GetClassGlobal(const std::string &Name,
   1366                                        bool Weak = false) override;
   1367 
   1368   /// EmitClassRef - Return a Value*, of type ObjCTypes.ClassPtrTy,
   1369   /// for the given class reference.
   1370   llvm::Value *EmitClassRef(CodeGenFunction &CGF,
   1371                             const ObjCInterfaceDecl *ID);
   1372 
   1373   llvm::Value *EmitClassRefFromId(CodeGenFunction &CGF,
   1374                                   IdentifierInfo *II, bool Weak,
   1375                                   const ObjCInterfaceDecl *ID);
   1376 
   1377   llvm::Value *EmitNSAutoreleasePoolClassRef(CodeGenFunction &CGF) override;
   1378 
   1379   /// EmitSuperClassRef - Return a Value*, of type ObjCTypes.ClassPtrTy,
   1380   /// for the given super class reference.
   1381   llvm::Value *EmitSuperClassRef(CodeGenFunction &CGF,
   1382                                  const ObjCInterfaceDecl *ID);
   1383 
   1384   /// EmitMetaClassRef - Return a Value * of the address of _class_t
   1385   /// meta-data
   1386   llvm::Value *EmitMetaClassRef(CodeGenFunction &CGF,
   1387                                 const ObjCInterfaceDecl *ID, bool Weak);
   1388 
   1389   /// ObjCIvarOffsetVariable - Returns the ivar offset variable for
   1390   /// the given ivar.
   1391   ///
   1392   llvm::GlobalVariable * ObjCIvarOffsetVariable(
   1393     const ObjCInterfaceDecl *ID,
   1394     const ObjCIvarDecl *Ivar);
   1395 
   1396   /// EmitSelector - Return a Value*, of type ObjCTypes.SelectorPtrTy,
   1397   /// for the given selector.
   1398   llvm::Value *EmitSelector(CodeGenFunction &CGF, Selector Sel,
   1399                             bool lval=false);
   1400 
   1401   /// GetInterfaceEHType - Get the cached ehtype for the given Objective-C
   1402   /// interface. The return value has type EHTypePtrTy.
   1403   llvm::Constant *GetInterfaceEHType(const ObjCInterfaceDecl *ID,
   1404                                   bool ForDefinition);
   1405 
   1406   const char *getMetaclassSymbolPrefix() const {
   1407     return "OBJC_METACLASS_$_";
   1408   }
   1409 
   1410   const char *getClassSymbolPrefix() const {
   1411     return "OBJC_CLASS_$_";
   1412   }
   1413 
   1414   void GetClassSizeInfo(const ObjCImplementationDecl *OID,
   1415                         uint32_t &InstanceStart,
   1416                         uint32_t &InstanceSize);
   1417 
   1418   // Shamelessly stolen from Analysis/CFRefCount.cpp
   1419   Selector GetNullarySelector(const char* name) const {
   1420     IdentifierInfo* II = &CGM.getContext().Idents.get(name);
   1421     return CGM.getContext().Selectors.getSelector(0, &II);
   1422   }
   1423 
   1424   Selector GetUnarySelector(const char* name) const {
   1425     IdentifierInfo* II = &CGM.getContext().Idents.get(name);
   1426     return CGM.getContext().Selectors.getSelector(1, &II);
   1427   }
   1428 
   1429   /// ImplementationIsNonLazy - Check whether the given category or
   1430   /// class implementation is "non-lazy".
   1431   bool ImplementationIsNonLazy(const ObjCImplDecl *OD) const;
   1432 
   1433   bool IsIvarOffsetKnownIdempotent(const CodeGen::CodeGenFunction &CGF,
   1434                                    const ObjCIvarDecl *IV) {
   1435     // Annotate the load as an invariant load iff inside an instance method
   1436     // and ivar belongs to instance method's class and one of its super class.
   1437     // This check is needed because the ivar offset is a lazily
   1438     // initialised value that may depend on objc_msgSend to perform a fixup on
   1439     // the first message dispatch.
   1440     //
   1441     // An additional opportunity to mark the load as invariant arises when the
   1442     // base of the ivar access is a parameter to an Objective C method.
   1443     // However, because the parameters are not available in the current
   1444     // interface, we cannot perform this check.
   1445     if (const ObjCMethodDecl *MD =
   1446           dyn_cast_or_null<ObjCMethodDecl>(CGF.CurFuncDecl))
   1447       if (MD->isInstanceMethod())
   1448         if (const ObjCInterfaceDecl *ID = MD->getClassInterface())
   1449           return IV->getContainingInterface()->isSuperClassOf(ID);
   1450     return false;
   1451   }
   1452 
   1453 public:
   1454   CGObjCNonFragileABIMac(CodeGen::CodeGenModule &cgm);
   1455   // FIXME. All stubs for now!
   1456   llvm::Function *ModuleInitFunction() override;
   1457 
   1458   CodeGen::RValue GenerateMessageSend(CodeGen::CodeGenFunction &CGF,
   1459                                       ReturnValueSlot Return,
   1460                                       QualType ResultType, Selector Sel,
   1461                                       llvm::Value *Receiver,
   1462                                       const CallArgList &CallArgs,
   1463                                       const ObjCInterfaceDecl *Class,
   1464                                       const ObjCMethodDecl *Method) override;
   1465 
   1466   CodeGen::RValue
   1467   GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF,
   1468                            ReturnValueSlot Return, QualType ResultType,
   1469                            Selector Sel, const ObjCInterfaceDecl *Class,
   1470                            bool isCategoryImpl, llvm::Value *Receiver,
   1471                            bool IsClassMessage, const CallArgList &CallArgs,
   1472                            const ObjCMethodDecl *Method) override;
   1473 
   1474   llvm::Value *GetClass(CodeGenFunction &CGF,
   1475                         const ObjCInterfaceDecl *ID) override;
   1476 
   1477   llvm::Value *GetSelector(CodeGenFunction &CGF, Selector Sel,
   1478                            bool lvalue = false) override
   1479     { return EmitSelector(CGF, Sel, lvalue); }
   1480 
   1481   /// The NeXT/Apple runtimes do not support typed selectors; just emit an
   1482   /// untyped one.
   1483   llvm::Value *GetSelector(CodeGenFunction &CGF,
   1484                            const ObjCMethodDecl *Method) override
   1485     { return EmitSelector(CGF, Method->getSelector()); }
   1486 
   1487   void GenerateCategory(const ObjCCategoryImplDecl *CMD) override;
   1488 
   1489   void GenerateClass(const ObjCImplementationDecl *ClassDecl) override;
   1490 
   1491   void RegisterAlias(const ObjCCompatibleAliasDecl *OAD) override {}
   1492 
   1493   llvm::Value *GenerateProtocolRef(CodeGenFunction &CGF,
   1494                                    const ObjCProtocolDecl *PD) override;
   1495 
   1496   llvm::Constant *GetEHType(QualType T) override;
   1497 
   1498   llvm::Constant *GetPropertyGetFunction() override {
   1499     return ObjCTypes.getGetPropertyFn();
   1500   }
   1501   llvm::Constant *GetPropertySetFunction() override {
   1502     return ObjCTypes.getSetPropertyFn();
   1503   }
   1504 
   1505   llvm::Constant *GetOptimizedPropertySetFunction(bool atomic,
   1506                                                   bool copy) override {
   1507     return ObjCTypes.getOptimizedSetPropertyFn(atomic, copy);
   1508   }
   1509 
   1510   llvm::Constant *GetSetStructFunction() override {
   1511     return ObjCTypes.getCopyStructFn();
   1512   }
   1513   llvm::Constant *GetGetStructFunction() override {
   1514     return ObjCTypes.getCopyStructFn();
   1515   }
   1516   llvm::Constant *GetCppAtomicObjectSetFunction() override {
   1517     return ObjCTypes.getCppAtomicObjectFunction();
   1518   }
   1519   llvm::Constant *GetCppAtomicObjectGetFunction() override {
   1520     return ObjCTypes.getCppAtomicObjectFunction();
   1521   }
   1522 
   1523   llvm::Constant *EnumerationMutationFunction() override {
   1524     return ObjCTypes.getEnumerationMutationFn();
   1525   }
   1526 
   1527   void EmitTryStmt(CodeGen::CodeGenFunction &CGF,
   1528                    const ObjCAtTryStmt &S) override;
   1529   void EmitSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
   1530                             const ObjCAtSynchronizedStmt &S) override;
   1531   void EmitThrowStmt(CodeGen::CodeGenFunction &CGF, const ObjCAtThrowStmt &S,
   1532                      bool ClearInsertionPoint=true) override;
   1533   llvm::Value * EmitObjCWeakRead(CodeGen::CodeGenFunction &CGF,
   1534                                  llvm::Value *AddrWeakObj) override;
   1535   void EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF,
   1536                           llvm::Value *src, llvm::Value *dst) override;
   1537   void EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF,
   1538                             llvm::Value *src, llvm::Value *dest,
   1539                             bool threadlocal = false) override;
   1540   void EmitObjCIvarAssign(CodeGen::CodeGenFunction &CGF,
   1541                           llvm::Value *src, llvm::Value *dest,
   1542                           llvm::Value *ivarOffset) override;
   1543   void EmitObjCStrongCastAssign(CodeGen::CodeGenFunction &CGF,
   1544                                 llvm::Value *src, llvm::Value *dest) override;
   1545   void EmitGCMemmoveCollectable(CodeGen::CodeGenFunction &CGF,
   1546                                 llvm::Value *dest, llvm::Value *src,
   1547                                 llvm::Value *size) override;
   1548   LValue EmitObjCValueForIvar(CodeGen::CodeGenFunction &CGF, QualType ObjectTy,
   1549                               llvm::Value *BaseValue, const ObjCIvarDecl *Ivar,
   1550                               unsigned CVRQualifiers) override;
   1551   llvm::Value *EmitIvarOffset(CodeGen::CodeGenFunction &CGF,
   1552                               const ObjCInterfaceDecl *Interface,
   1553                               const ObjCIvarDecl *Ivar) override;
   1554 };
   1555 
   1556 /// A helper class for performing the null-initialization of a return
   1557 /// value.
   1558 struct NullReturnState {
   1559   llvm::BasicBlock *NullBB;
   1560   NullReturnState() : NullBB(nullptr) {}
   1561 
   1562   /// Perform a null-check of the given receiver.
   1563   void init(CodeGenFunction &CGF, llvm::Value *receiver) {
   1564     // Make blocks for the null-receiver and call edges.
   1565     NullBB = CGF.createBasicBlock("msgSend.null-receiver");
   1566     llvm::BasicBlock *callBB = CGF.createBasicBlock("msgSend.call");
   1567 
   1568     // Check for a null receiver and, if there is one, jump to the
   1569     // null-receiver block.  There's no point in trying to avoid it:
   1570     // we're always going to put *something* there, because otherwise
   1571     // we shouldn't have done this null-check in the first place.
   1572     llvm::Value *isNull = CGF.Builder.CreateIsNull(receiver);
   1573     CGF.Builder.CreateCondBr(isNull, NullBB, callBB);
   1574 
   1575     // Otherwise, start performing the call.
   1576     CGF.EmitBlock(callBB);
   1577   }
   1578 
   1579   /// Complete the null-return operation.  It is valid to call this
   1580   /// regardless of whether 'init' has been called.
   1581   RValue complete(CodeGenFunction &CGF, RValue result, QualType resultType,
   1582                   const CallArgList &CallArgs,
   1583                   const ObjCMethodDecl *Method) {
   1584     // If we never had to do a null-check, just use the raw result.
   1585     if (!NullBB) return result;
   1586 
   1587     // The continuation block.  This will be left null if we don't have an
   1588     // IP, which can happen if the method we're calling is marked noreturn.
   1589     llvm::BasicBlock *contBB = nullptr;
   1590 
   1591     // Finish the call path.
   1592     llvm::BasicBlock *callBB = CGF.Builder.GetInsertBlock();
   1593     if (callBB) {
   1594       contBB = CGF.createBasicBlock("msgSend.cont");
   1595       CGF.Builder.CreateBr(contBB);
   1596     }
   1597 
   1598     // Okay, start emitting the null-receiver block.
   1599     CGF.EmitBlock(NullBB);
   1600 
   1601     // Release any consumed arguments we've got.
   1602     if (Method) {
   1603       CallArgList::const_iterator I = CallArgs.begin();
   1604       for (ObjCMethodDecl::param_const_iterator i = Method->param_begin(),
   1605            e = Method->param_end(); i != e; ++i, ++I) {
   1606         const ParmVarDecl *ParamDecl = (*i);
   1607         if (ParamDecl->hasAttr<NSConsumedAttr>()) {
   1608           RValue RV = I->RV;
   1609           assert(RV.isScalar() &&
   1610                  "NullReturnState::complete - arg not on object");
   1611           CGF.EmitARCRelease(RV.getScalarVal(), ARCImpreciseLifetime);
   1612         }
   1613       }
   1614     }
   1615 
   1616     // The phi code below assumes that we haven't needed any control flow yet.
   1617     assert(CGF.Builder.GetInsertBlock() == NullBB);
   1618 
   1619     // If we've got a void return, just jump to the continuation block.
   1620     if (result.isScalar() && resultType->isVoidType()) {
   1621       // No jumps required if the message-send was noreturn.
   1622       if (contBB) CGF.EmitBlock(contBB);
   1623       return result;
   1624     }
   1625 
   1626     // If we've got a scalar return, build a phi.
   1627     if (result.isScalar()) {
   1628       // Derive the null-initialization value.
   1629       llvm::Constant *null = CGF.CGM.EmitNullConstant(resultType);
   1630 
   1631       // If no join is necessary, just flow out.
   1632       if (!contBB) return RValue::get(null);
   1633 
   1634       // Otherwise, build a phi.
   1635       CGF.EmitBlock(contBB);
   1636       llvm::PHINode *phi = CGF.Builder.CreatePHI(null->getType(), 2);
   1637       phi->addIncoming(result.getScalarVal(), callBB);
   1638       phi->addIncoming(null, NullBB);
   1639       return RValue::get(phi);
   1640     }
   1641 
   1642     // If we've got an aggregate return, null the buffer out.
   1643     // FIXME: maybe we should be doing things differently for all the
   1644     // cases where the ABI has us returning (1) non-agg values in
   1645     // memory or (2) agg values in registers.
   1646     if (result.isAggregate()) {
   1647       assert(result.isAggregate() && "null init of non-aggregate result?");
   1648       CGF.EmitNullInitialization(result.getAggregateAddr(), resultType);
   1649       if (contBB) CGF.EmitBlock(contBB);
   1650       return result;
   1651     }
   1652 
   1653     // Complex types.
   1654     CGF.EmitBlock(contBB);
   1655     CodeGenFunction::ComplexPairTy callResult = result.getComplexVal();
   1656 
   1657     // Find the scalar type and its zero value.
   1658     llvm::Type *scalarTy = callResult.first->getType();
   1659     llvm::Constant *scalarZero = llvm::Constant::getNullValue(scalarTy);
   1660 
   1661     // Build phis for both coordinates.
   1662     llvm::PHINode *real = CGF.Builder.CreatePHI(scalarTy, 2);
   1663     real->addIncoming(callResult.first, callBB);
   1664     real->addIncoming(scalarZero, NullBB);
   1665     llvm::PHINode *imag = CGF.Builder.CreatePHI(scalarTy, 2);
   1666     imag->addIncoming(callResult.second, callBB);
   1667     imag->addIncoming(scalarZero, NullBB);
   1668     return RValue::getComplex(real, imag);
   1669   }
   1670 };
   1671 
   1672 } // end anonymous namespace
   1673 
   1674 /* *** Helper Functions *** */
   1675 
   1676 /// getConstantGEP() - Help routine to construct simple GEPs.
   1677 static llvm::Constant *getConstantGEP(llvm::LLVMContext &VMContext,
   1678                                       llvm::GlobalVariable *C, unsigned idx0,
   1679                                       unsigned idx1) {
   1680   llvm::Value *Idxs[] = {
   1681     llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), idx0),
   1682     llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), idx1)
   1683   };
   1684   return llvm::ConstantExpr::getGetElementPtr(C->getValueType(), C, Idxs);
   1685 }
   1686 
   1687 /// hasObjCExceptionAttribute - Return true if this class or any super
   1688 /// class has the __objc_exception__ attribute.
   1689 static bool hasObjCExceptionAttribute(ASTContext &Context,
   1690                                       const ObjCInterfaceDecl *OID) {
   1691   if (OID->hasAttr<ObjCExceptionAttr>())
   1692     return true;
   1693   if (const ObjCInterfaceDecl *Super = OID->getSuperClass())
   1694     return hasObjCExceptionAttribute(Context, Super);
   1695   return false;
   1696 }
   1697 
   1698 /* *** CGObjCMac Public Interface *** */
   1699 
   1700 CGObjCMac::CGObjCMac(CodeGen::CodeGenModule &cgm) : CGObjCCommonMac(cgm),
   1701                                                     ObjCTypes(cgm) {
   1702   ObjCABI = 1;
   1703   EmitImageInfo();
   1704 }
   1705 
   1706 /// GetClass - Return a reference to the class for the given interface
   1707 /// decl.
   1708 llvm::Value *CGObjCMac::GetClass(CodeGenFunction &CGF,
   1709                                  const ObjCInterfaceDecl *ID) {
   1710   return EmitClassRef(CGF, ID);
   1711 }
   1712 
   1713 /// GetSelector - Return the pointer to the unique'd string for this selector.
   1714 llvm::Value *CGObjCMac::GetSelector(CodeGenFunction &CGF, Selector Sel,
   1715                                     bool lval) {
   1716   return EmitSelector(CGF, Sel, lval);
   1717 }
   1718 llvm::Value *CGObjCMac::GetSelector(CodeGenFunction &CGF, const ObjCMethodDecl
   1719                                     *Method) {
   1720   return EmitSelector(CGF, Method->getSelector());
   1721 }
   1722 
   1723 llvm::Constant *CGObjCMac::GetEHType(QualType T) {
   1724   if (T->isObjCIdType() ||
   1725       T->isObjCQualifiedIdType()) {
   1726     return CGM.GetAddrOfRTTIDescriptor(
   1727               CGM.getContext().getObjCIdRedefinitionType(), /*ForEH=*/true);
   1728   }
   1729   if (T->isObjCClassType() ||
   1730       T->isObjCQualifiedClassType()) {
   1731     return CGM.GetAddrOfRTTIDescriptor(
   1732              CGM.getContext().getObjCClassRedefinitionType(), /*ForEH=*/true);
   1733   }
   1734   if (T->isObjCObjectPointerType())
   1735     return CGM.GetAddrOfRTTIDescriptor(T,  /*ForEH=*/true);
   1736 
   1737   llvm_unreachable("asking for catch type for ObjC type in fragile runtime");
   1738 }
   1739 
   1740 /// Generate a constant CFString object.
   1741 /*
   1742   struct __builtin_CFString {
   1743   const int *isa; // point to __CFConstantStringClassReference
   1744   int flags;
   1745   const char *str;
   1746   long length;
   1747   };
   1748 */
   1749 
   1750 /// or Generate a constant NSString object.
   1751 /*
   1752    struct __builtin_NSString {
   1753      const int *isa; // point to __NSConstantStringClassReference
   1754      const char *str;
   1755      unsigned int length;
   1756    };
   1757 */
   1758 
   1759 llvm::Constant *CGObjCCommonMac::GenerateConstantString(
   1760   const StringLiteral *SL) {
   1761   return (CGM.getLangOpts().NoConstantCFStrings == 0 ?
   1762           CGM.GetAddrOfConstantCFString(SL) :
   1763           CGM.GetAddrOfConstantString(SL));
   1764 }
   1765 
   1766 enum {
   1767   kCFTaggedObjectID_Integer = (1 << 1) + 1
   1768 };
   1769 
   1770 /// Generates a message send where the super is the receiver.  This is
   1771 /// a message send to self with special delivery semantics indicating
   1772 /// which class's method should be called.
   1773 CodeGen::RValue
   1774 CGObjCMac::GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF,
   1775                                     ReturnValueSlot Return,
   1776                                     QualType ResultType,
   1777                                     Selector Sel,
   1778                                     const ObjCInterfaceDecl *Class,
   1779                                     bool isCategoryImpl,
   1780                                     llvm::Value *Receiver,
   1781                                     bool IsClassMessage,
   1782                                     const CodeGen::CallArgList &CallArgs,
   1783                                     const ObjCMethodDecl *Method) {
   1784   // Create and init a super structure; this is a (receiver, class)
   1785   // pair we will pass to objc_msgSendSuper.
   1786   llvm::Value *ObjCSuper =
   1787     CGF.CreateTempAlloca(ObjCTypes.SuperTy, "objc_super");
   1788   llvm::Value *ReceiverAsObject =
   1789     CGF.Builder.CreateBitCast(Receiver, ObjCTypes.ObjectPtrTy);
   1790   CGF.Builder.CreateStore(
   1791       ReceiverAsObject,
   1792       CGF.Builder.CreateStructGEP(ObjCTypes.SuperTy, ObjCSuper, 0));
   1793 
   1794   // If this is a class message the metaclass is passed as the target.
   1795   llvm::Value *Target;
   1796   if (IsClassMessage) {
   1797     if (isCategoryImpl) {
   1798       // Message sent to 'super' in a class method defined in a category
   1799       // implementation requires an odd treatment.
   1800       // If we are in a class method, we must retrieve the
   1801       // _metaclass_ for the current class, pointed at by
   1802       // the class's "isa" pointer.  The following assumes that
   1803       // isa" is the first ivar in a class (which it must be).
   1804       Target = EmitClassRef(CGF, Class->getSuperClass());
   1805       Target = CGF.Builder.CreateStructGEP(ObjCTypes.ClassTy, Target, 0);
   1806       Target = CGF.Builder.CreateLoad(Target);
   1807     } else {
   1808       llvm::Constant *MetaClassPtr = EmitMetaClassRef(Class);
   1809       llvm::Value *SuperPtr =
   1810           CGF.Builder.CreateStructGEP(ObjCTypes.ClassTy, MetaClassPtr, 1);
   1811       llvm::Value *Super = CGF.Builder.CreateLoad(SuperPtr);
   1812       Target = Super;
   1813     }
   1814   } else if (isCategoryImpl)
   1815     Target = EmitClassRef(CGF, Class->getSuperClass());
   1816   else {
   1817     llvm::Value *ClassPtr = EmitSuperClassRef(Class);
   1818     ClassPtr = CGF.Builder.CreateStructGEP(ObjCTypes.ClassTy, ClassPtr, 1);
   1819     Target = CGF.Builder.CreateLoad(ClassPtr);
   1820   }
   1821   // FIXME: We shouldn't need to do this cast, rectify the ASTContext and
   1822   // ObjCTypes types.
   1823   llvm::Type *ClassTy =
   1824     CGM.getTypes().ConvertType(CGF.getContext().getObjCClassType());
   1825   Target = CGF.Builder.CreateBitCast(Target, ClassTy);
   1826   CGF.Builder.CreateStore(
   1827       Target, CGF.Builder.CreateStructGEP(ObjCTypes.SuperTy, ObjCSuper, 1));
   1828   return EmitMessageSend(CGF, Return, ResultType,
   1829                          EmitSelector(CGF, Sel),
   1830                          ObjCSuper, ObjCTypes.SuperPtrCTy,
   1831                          true, CallArgs, Method, ObjCTypes);
   1832 }
   1833 
   1834 /// Generate code for a message send expression.
   1835 CodeGen::RValue CGObjCMac::GenerateMessageSend(CodeGen::CodeGenFunction &CGF,
   1836                                                ReturnValueSlot Return,
   1837                                                QualType ResultType,
   1838                                                Selector Sel,
   1839                                                llvm::Value *Receiver,
   1840                                                const CallArgList &CallArgs,
   1841                                                const ObjCInterfaceDecl *Class,
   1842                                                const ObjCMethodDecl *Method) {
   1843   return EmitMessageSend(CGF, Return, ResultType,
   1844                          EmitSelector(CGF, Sel),
   1845                          Receiver, CGF.getContext().getObjCIdType(),
   1846                          false, CallArgs, Method, ObjCTypes);
   1847 }
   1848 
   1849 CodeGen::RValue
   1850 CGObjCCommonMac::EmitMessageSend(CodeGen::CodeGenFunction &CGF,
   1851                                  ReturnValueSlot Return,
   1852                                  QualType ResultType,
   1853                                  llvm::Value *Sel,
   1854                                  llvm::Value *Arg0,
   1855                                  QualType Arg0Ty,
   1856                                  bool IsSuper,
   1857                                  const CallArgList &CallArgs,
   1858                                  const ObjCMethodDecl *Method,
   1859                                  const ObjCCommonTypesHelper &ObjCTypes) {
   1860   CallArgList ActualArgs;
   1861   if (!IsSuper)
   1862     Arg0 = CGF.Builder.CreateBitCast(Arg0, ObjCTypes.ObjectPtrTy);
   1863   ActualArgs.add(RValue::get(Arg0), Arg0Ty);
   1864   ActualArgs.add(RValue::get(Sel), CGF.getContext().getObjCSelType());
   1865   ActualArgs.addFrom(CallArgs);
   1866 
   1867   // If we're calling a method, use the formal signature.
   1868   MessageSendInfo MSI = getMessageSendInfo(Method, ResultType, ActualArgs);
   1869 
   1870   if (Method)
   1871     assert(CGM.getContext().getCanonicalType(Method->getReturnType()) ==
   1872                CGM.getContext().getCanonicalType(ResultType) &&
   1873            "Result type mismatch!");
   1874 
   1875   NullReturnState nullReturn;
   1876 
   1877   llvm::Constant *Fn = nullptr;
   1878   if (CGM.ReturnSlotInterferesWithArgs(MSI.CallInfo)) {
   1879     if (!IsSuper) nullReturn.init(CGF, Arg0);
   1880     Fn = (ObjCABI == 2) ?  ObjCTypes.getSendStretFn2(IsSuper)
   1881       : ObjCTypes.getSendStretFn(IsSuper);
   1882   } else if (CGM.ReturnTypeUsesFPRet(ResultType)) {
   1883     Fn = (ObjCABI == 2) ? ObjCTypes.getSendFpretFn2(IsSuper)
   1884       : ObjCTypes.getSendFpretFn(IsSuper);
   1885   } else if (CGM.ReturnTypeUsesFP2Ret(ResultType)) {
   1886     Fn = (ObjCABI == 2) ? ObjCTypes.getSendFp2RetFn2(IsSuper)
   1887       : ObjCTypes.getSendFp2retFn(IsSuper);
   1888   } else {
   1889     // arm64 uses objc_msgSend for stret methods and yet null receiver check
   1890     // must be made for it.
   1891     if (!IsSuper && CGM.ReturnTypeUsesSRet(MSI.CallInfo))
   1892       nullReturn.init(CGF, Arg0);
   1893     Fn = (ObjCABI == 2) ? ObjCTypes.getSendFn2(IsSuper)
   1894       : ObjCTypes.getSendFn(IsSuper);
   1895   }
   1896 
   1897   bool requiresnullCheck = false;
   1898   if (CGM.getLangOpts().ObjCAutoRefCount && Method)
   1899     for (const auto *ParamDecl : Method->params()) {
   1900       if (ParamDecl->hasAttr<NSConsumedAttr>()) {
   1901         if (!nullReturn.NullBB)
   1902           nullReturn.init(CGF, Arg0);
   1903         requiresnullCheck = true;
   1904         break;
   1905       }
   1906     }
   1907 
   1908   Fn = llvm::ConstantExpr::getBitCast(Fn, MSI.MessengerType);
   1909   RValue rvalue = CGF.EmitCall(MSI.CallInfo, Fn, Return, ActualArgs);
   1910   return nullReturn.complete(CGF, rvalue, ResultType, CallArgs,
   1911                              requiresnullCheck ? Method : nullptr);
   1912 }
   1913 
   1914 static Qualifiers::GC GetGCAttrTypeForType(ASTContext &Ctx, QualType FQT) {
   1915   if (FQT.isObjCGCStrong())
   1916     return Qualifiers::Strong;
   1917 
   1918   if (FQT.isObjCGCWeak() || FQT.getObjCLifetime() == Qualifiers::OCL_Weak)
   1919     return Qualifiers::Weak;
   1920 
   1921   // check for __unsafe_unretained
   1922   if (FQT.getObjCLifetime() == Qualifiers::OCL_ExplicitNone)
   1923     return Qualifiers::GCNone;
   1924 
   1925   if (FQT->isObjCObjectPointerType() || FQT->isBlockPointerType())
   1926     return Qualifiers::Strong;
   1927 
   1928   if (const PointerType *PT = FQT->getAs<PointerType>())
   1929     return GetGCAttrTypeForType(Ctx, PT->getPointeeType());
   1930 
   1931   return Qualifiers::GCNone;
   1932 }
   1933 
   1934 llvm::Constant *CGObjCCommonMac::BuildGCBlockLayout(CodeGenModule &CGM,
   1935                                                 const CGBlockInfo &blockInfo) {
   1936 
   1937   llvm::Constant *nullPtr = llvm::Constant::getNullValue(CGM.Int8PtrTy);
   1938   if (CGM.getLangOpts().getGC() == LangOptions::NonGC &&
   1939       !CGM.getLangOpts().ObjCAutoRefCount)
   1940     return nullPtr;
   1941 
   1942   bool hasUnion = false;
   1943   SkipIvars.clear();
   1944   IvarsInfo.clear();
   1945   unsigned WordSizeInBits = CGM.getTarget().getPointerWidth(0);
   1946   unsigned ByteSizeInBits = CGM.getTarget().getCharWidth();
   1947 
   1948   // __isa is the first field in block descriptor and must assume by runtime's
   1949   // convention that it is GC'able.
   1950   IvarsInfo.push_back(GC_IVAR(0, 1));
   1951 
   1952   const BlockDecl *blockDecl = blockInfo.getBlockDecl();
   1953 
   1954   // Calculate the basic layout of the block structure.
   1955   const llvm::StructLayout *layout =
   1956     CGM.getDataLayout().getStructLayout(blockInfo.StructureType);
   1957 
   1958   // Ignore the optional 'this' capture: C++ objects are not assumed
   1959   // to be GC'ed.
   1960 
   1961   // Walk the captured variables.
   1962   for (const auto &CI : blockDecl->captures()) {
   1963     const VarDecl *variable = CI.getVariable();
   1964     QualType type = variable->getType();
   1965 
   1966     const CGBlockInfo::Capture &capture = blockInfo.getCapture(variable);
   1967 
   1968     // Ignore constant captures.
   1969     if (capture.isConstant()) continue;
   1970 
   1971     uint64_t fieldOffset = layout->getElementOffset(capture.getIndex());
   1972 
   1973     // __block variables are passed by their descriptor address.
   1974     if (CI.isByRef()) {
   1975       IvarsInfo.push_back(GC_IVAR(fieldOffset, /*size in words*/ 1));
   1976       continue;
   1977     }
   1978 
   1979     assert(!type->isArrayType() && "array variable should not be caught");
   1980     if (const RecordType *record = type->getAs<RecordType>()) {
   1981       BuildAggrIvarRecordLayout(record, fieldOffset, true, hasUnion);
   1982       continue;
   1983     }
   1984 
   1985     Qualifiers::GC GCAttr = GetGCAttrTypeForType(CGM.getContext(), type);
   1986     unsigned fieldSize = CGM.getContext().getTypeSize(type);
   1987 
   1988     if (GCAttr == Qualifiers::Strong)
   1989       IvarsInfo.push_back(GC_IVAR(fieldOffset,
   1990                                   fieldSize / WordSizeInBits));
   1991     else if (GCAttr == Qualifiers::GCNone || GCAttr == Qualifiers::Weak)
   1992       SkipIvars.push_back(GC_IVAR(fieldOffset,
   1993                                   fieldSize / ByteSizeInBits));
   1994   }
   1995 
   1996   if (IvarsInfo.empty())
   1997     return nullPtr;
   1998 
   1999   // Sort on byte position; captures might not be allocated in order,
   2000   // and unions can do funny things.
   2001   llvm::array_pod_sort(IvarsInfo.begin(), IvarsInfo.end());
   2002   llvm::array_pod_sort(SkipIvars.begin(), SkipIvars.end());
   2003 
   2004   std::string BitMap;
   2005   llvm::Constant *C = BuildIvarLayoutBitmap(BitMap);
   2006   if (CGM.getLangOpts().ObjCGCBitmapPrint) {
   2007     printf("\n block variable layout for block: ");
   2008     const unsigned char *s = (const unsigned char*)BitMap.c_str();
   2009     for (unsigned i = 0, e = BitMap.size(); i < e; i++)
   2010       if (!(s[i] & 0xf0))
   2011         printf("0x0%x%s", s[i], s[i] != 0 ? ", " : "");
   2012       else
   2013         printf("0x%x%s",  s[i], s[i] != 0 ? ", " : "");
   2014     printf("\n");
   2015   }
   2016 
   2017   return C;
   2018 }
   2019 
   2020 /// getBlockCaptureLifetime - This routine returns life time of the captured
   2021 /// block variable for the purpose of block layout meta-data generation. FQT is
   2022 /// the type of the variable captured in the block.
   2023 Qualifiers::ObjCLifetime CGObjCCommonMac::getBlockCaptureLifetime(QualType FQT,
   2024                                                                   bool ByrefLayout) {
   2025   if (CGM.getLangOpts().ObjCAutoRefCount)
   2026     return FQT.getObjCLifetime();
   2027 
   2028   // MRR.
   2029   if (FQT->isObjCObjectPointerType() || FQT->isBlockPointerType())
   2030     return ByrefLayout ? Qualifiers::OCL_ExplicitNone : Qualifiers::OCL_Strong;
   2031 
   2032   return Qualifiers::OCL_None;
   2033 }
   2034 
   2035 void CGObjCCommonMac::UpdateRunSkipBlockVars(bool IsByref,
   2036                                              Qualifiers::ObjCLifetime LifeTime,
   2037                                              CharUnits FieldOffset,
   2038                                              CharUnits FieldSize) {
   2039   // __block variables are passed by their descriptor address.
   2040   if (IsByref)
   2041     RunSkipBlockVars.push_back(RUN_SKIP(BLOCK_LAYOUT_BYREF, FieldOffset,
   2042                                         FieldSize));
   2043   else if (LifeTime == Qualifiers::OCL_Strong)
   2044     RunSkipBlockVars.push_back(RUN_SKIP(BLOCK_LAYOUT_STRONG, FieldOffset,
   2045                                         FieldSize));
   2046   else if (LifeTime == Qualifiers::OCL_Weak)
   2047     RunSkipBlockVars.push_back(RUN_SKIP(BLOCK_LAYOUT_WEAK, FieldOffset,
   2048                                         FieldSize));
   2049   else if (LifeTime == Qualifiers::OCL_ExplicitNone)
   2050     RunSkipBlockVars.push_back(RUN_SKIP(BLOCK_LAYOUT_UNRETAINED, FieldOffset,
   2051                                         FieldSize));
   2052   else
   2053     RunSkipBlockVars.push_back(RUN_SKIP(BLOCK_LAYOUT_NON_OBJECT_BYTES,
   2054                                         FieldOffset,
   2055                                         FieldSize));
   2056 }
   2057 
   2058 void CGObjCCommonMac::BuildRCRecordLayout(const llvm::StructLayout *RecLayout,
   2059                                           const RecordDecl *RD,
   2060                                           ArrayRef<const FieldDecl*> RecFields,
   2061                                           CharUnits BytePos, bool &HasUnion,
   2062                                           bool ByrefLayout) {
   2063   bool IsUnion = (RD && RD->isUnion());
   2064   CharUnits MaxUnionSize = CharUnits::Zero();
   2065   const FieldDecl *MaxField = nullptr;
   2066   const FieldDecl *LastFieldBitfieldOrUnnamed = nullptr;
   2067   CharUnits MaxFieldOffset = CharUnits::Zero();
   2068   CharUnits LastBitfieldOrUnnamedOffset = CharUnits::Zero();
   2069 
   2070   if (RecFields.empty())
   2071     return;
   2072   unsigned ByteSizeInBits = CGM.getTarget().getCharWidth();
   2073 
   2074   for (unsigned i = 0, e = RecFields.size(); i != e; ++i) {
   2075     const FieldDecl *Field = RecFields[i];
   2076     // Note that 'i' here is actually the field index inside RD of Field,
   2077     // although this dependency is hidden.
   2078     const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD);
   2079     CharUnits FieldOffset =
   2080       CGM.getContext().toCharUnitsFromBits(RL.getFieldOffset(i));
   2081 
   2082     // Skip over unnamed or bitfields
   2083     if (!Field->getIdentifier() || Field->isBitField()) {
   2084       LastFieldBitfieldOrUnnamed = Field;
   2085       LastBitfieldOrUnnamedOffset = FieldOffset;
   2086       continue;
   2087     }
   2088 
   2089     LastFieldBitfieldOrUnnamed = nullptr;
   2090     QualType FQT = Field->getType();
   2091     if (FQT->isRecordType() || FQT->isUnionType()) {
   2092       if (FQT->isUnionType())
   2093         HasUnion = true;
   2094 
   2095       BuildRCBlockVarRecordLayout(FQT->getAs<RecordType>(),
   2096                                   BytePos + FieldOffset, HasUnion);
   2097       continue;
   2098     }
   2099 
   2100     if (const ArrayType *Array = CGM.getContext().getAsArrayType(FQT)) {
   2101       const ConstantArrayType *CArray =
   2102         dyn_cast_or_null<ConstantArrayType>(Array);
   2103       uint64_t ElCount = CArray->getSize().getZExtValue();
   2104       assert(CArray && "only array with known element size is supported");
   2105       FQT = CArray->getElementType();
   2106       while (const ArrayType *Array = CGM.getContext().getAsArrayType(FQT)) {
   2107         const ConstantArrayType *CArray =
   2108           dyn_cast_or_null<ConstantArrayType>(Array);
   2109         ElCount *= CArray->getSize().getZExtValue();
   2110         FQT = CArray->getElementType();
   2111       }
   2112       if (FQT->isRecordType() && ElCount) {
   2113         int OldIndex = RunSkipBlockVars.size() - 1;
   2114         const RecordType *RT = FQT->getAs<RecordType>();
   2115         BuildRCBlockVarRecordLayout(RT, BytePos + FieldOffset,
   2116                                     HasUnion);
   2117 
   2118         // Replicate layout information for each array element. Note that
   2119         // one element is already done.
   2120         uint64_t ElIx = 1;
   2121         for (int FirstIndex = RunSkipBlockVars.size() - 1 ;ElIx < ElCount; ElIx++) {
   2122           CharUnits Size = CGM.getContext().getTypeSizeInChars(RT);
   2123           for (int i = OldIndex+1; i <= FirstIndex; ++i)
   2124             RunSkipBlockVars.push_back(
   2125               RUN_SKIP(RunSkipBlockVars[i].opcode,
   2126               RunSkipBlockVars[i].block_var_bytepos + Size*ElIx,
   2127               RunSkipBlockVars[i].block_var_size));
   2128         }
   2129         continue;
   2130       }
   2131     }
   2132     CharUnits FieldSize = CGM.getContext().getTypeSizeInChars(Field->getType());
   2133     if (IsUnion) {
   2134       CharUnits UnionIvarSize = FieldSize;
   2135       if (UnionIvarSize > MaxUnionSize) {
   2136         MaxUnionSize = UnionIvarSize;
   2137         MaxField = Field;
   2138         MaxFieldOffset = FieldOffset;
   2139       }
   2140     } else {
   2141       UpdateRunSkipBlockVars(false,
   2142                              getBlockCaptureLifetime(FQT, ByrefLayout),
   2143                              BytePos + FieldOffset,
   2144                              FieldSize);
   2145     }
   2146   }
   2147 
   2148   if (LastFieldBitfieldOrUnnamed) {
   2149     if (LastFieldBitfieldOrUnnamed->isBitField()) {
   2150       // Last field was a bitfield. Must update the info.
   2151       uint64_t BitFieldSize
   2152         = LastFieldBitfieldOrUnnamed->getBitWidthValue(CGM.getContext());
   2153       unsigned UnsSize = (BitFieldSize / ByteSizeInBits) +
   2154                         ((BitFieldSize % ByteSizeInBits) != 0);
   2155       CharUnits Size = CharUnits::fromQuantity(UnsSize);
   2156       Size += LastBitfieldOrUnnamedOffset;
   2157       UpdateRunSkipBlockVars(false,
   2158                              getBlockCaptureLifetime(LastFieldBitfieldOrUnnamed->getType(),
   2159                                                      ByrefLayout),
   2160                              BytePos + LastBitfieldOrUnnamedOffset,
   2161                              Size);
   2162     } else {
   2163       assert(!LastFieldBitfieldOrUnnamed->getIdentifier() &&"Expected unnamed");
   2164       // Last field was unnamed. Must update skip info.
   2165       CharUnits FieldSize
   2166         = CGM.getContext().getTypeSizeInChars(LastFieldBitfieldOrUnnamed->getType());
   2167       UpdateRunSkipBlockVars(false,
   2168                              getBlockCaptureLifetime(LastFieldBitfieldOrUnnamed->getType(),
   2169                                                      ByrefLayout),
   2170                              BytePos + LastBitfieldOrUnnamedOffset,
   2171                              FieldSize);
   2172     }
   2173   }
   2174 
   2175   if (MaxField)
   2176     UpdateRunSkipBlockVars(false,
   2177                            getBlockCaptureLifetime(MaxField->getType(), ByrefLayout),
   2178                            BytePos + MaxFieldOffset,
   2179                            MaxUnionSize);
   2180 }
   2181 
   2182 void CGObjCCommonMac::BuildRCBlockVarRecordLayout(const RecordType *RT,
   2183                                                   CharUnits BytePos,
   2184                                                   bool &HasUnion,
   2185                                                   bool ByrefLayout) {
   2186   const RecordDecl *RD = RT->getDecl();
   2187   SmallVector<const FieldDecl*, 16> Fields(RD->fields());
   2188   llvm::Type *Ty = CGM.getTypes().ConvertType(QualType(RT, 0));
   2189   const llvm::StructLayout *RecLayout =
   2190     CGM.getDataLayout().getStructLayout(cast<llvm::StructType>(Ty));
   2191 
   2192   BuildRCRecordLayout(RecLayout, RD, Fields, BytePos, HasUnion, ByrefLayout);
   2193 }
   2194 
   2195 /// InlineLayoutInstruction - This routine produce an inline instruction for the
   2196 /// block variable layout if it can. If not, it returns 0. Rules are as follow:
   2197 /// If ((uintptr_t) layout) < (1 << 12), the layout is inline. In the 64bit world,
   2198 /// an inline layout of value 0x0000000000000xyz is interpreted as follows:
   2199 /// x captured object pointers of BLOCK_LAYOUT_STRONG. Followed by
   2200 /// y captured object of BLOCK_LAYOUT_BYREF. Followed by
   2201 /// z captured object of BLOCK_LAYOUT_WEAK. If any of the above is missing, zero
   2202 /// replaces it. For example, 0x00000x00 means x BLOCK_LAYOUT_STRONG and no
   2203 /// BLOCK_LAYOUT_BYREF and no BLOCK_LAYOUT_WEAK objects are captured.
   2204 uint64_t CGObjCCommonMac::InlineLayoutInstruction(
   2205                                     SmallVectorImpl<unsigned char> &Layout) {
   2206   uint64_t Result = 0;
   2207   if (Layout.size() <= 3) {
   2208     unsigned size = Layout.size();
   2209     unsigned strong_word_count = 0, byref_word_count=0, weak_word_count=0;
   2210     unsigned char inst;
   2211     enum BLOCK_LAYOUT_OPCODE opcode ;
   2212     switch (size) {
   2213       case 3:
   2214         inst = Layout[0];
   2215         opcode = (enum BLOCK_LAYOUT_OPCODE) (inst >> 4);
   2216         if (opcode == BLOCK_LAYOUT_STRONG)
   2217           strong_word_count = (inst & 0xF)+1;
   2218         else
   2219           return 0;
   2220         inst = Layout[1];
   2221         opcode = (enum BLOCK_LAYOUT_OPCODE) (inst >> 4);
   2222         if (opcode == BLOCK_LAYOUT_BYREF)
   2223           byref_word_count = (inst & 0xF)+1;
   2224         else
   2225           return 0;
   2226         inst = Layout[2];
   2227         opcode = (enum BLOCK_LAYOUT_OPCODE) (inst >> 4);
   2228         if (opcode == BLOCK_LAYOUT_WEAK)
   2229           weak_word_count = (inst & 0xF)+1;
   2230         else
   2231           return 0;
   2232         break;
   2233 
   2234       case 2:
   2235         inst = Layout[0];
   2236         opcode = (enum BLOCK_LAYOUT_OPCODE) (inst >> 4);
   2237         if (opcode == BLOCK_LAYOUT_STRONG) {
   2238           strong_word_count = (inst & 0xF)+1;
   2239           inst = Layout[1];
   2240           opcode = (enum BLOCK_LAYOUT_OPCODE) (inst >> 4);
   2241           if (opcode == BLOCK_LAYOUT_BYREF)
   2242             byref_word_count = (inst & 0xF)+1;
   2243           else if (opcode == BLOCK_LAYOUT_WEAK)
   2244             weak_word_count = (inst & 0xF)+1;
   2245           else
   2246             return 0;
   2247         }
   2248         else if (opcode == BLOCK_LAYOUT_BYREF) {
   2249           byref_word_count = (inst & 0xF)+1;
   2250           inst = Layout[1];
   2251           opcode = (enum BLOCK_LAYOUT_OPCODE) (inst >> 4);
   2252           if (opcode == BLOCK_LAYOUT_WEAK)
   2253             weak_word_count = (inst & 0xF)+1;
   2254           else
   2255             return 0;
   2256         }
   2257         else
   2258           return 0;
   2259         break;
   2260 
   2261       case 1:
   2262         inst = Layout[0];
   2263         opcode = (enum BLOCK_LAYOUT_OPCODE) (inst >> 4);
   2264         if (opcode == BLOCK_LAYOUT_STRONG)
   2265           strong_word_count = (inst & 0xF)+1;
   2266         else if (opcode == BLOCK_LAYOUT_BYREF)
   2267           byref_word_count = (inst & 0xF)+1;
   2268         else if (opcode == BLOCK_LAYOUT_WEAK)
   2269           weak_word_count = (inst & 0xF)+1;
   2270         else
   2271           return 0;
   2272         break;
   2273 
   2274       default:
   2275         return 0;
   2276     }
   2277 
   2278     // Cannot inline when any of the word counts is 15. Because this is one less
   2279     // than the actual work count (so 15 means 16 actual word counts),
   2280     // and we can only display 0 thru 15 word counts.
   2281     if (strong_word_count == 16 || byref_word_count == 16 || weak_word_count == 16)
   2282       return 0;
   2283 
   2284     unsigned count =
   2285       (strong_word_count != 0) + (byref_word_count != 0) + (weak_word_count != 0);
   2286 
   2287     if (size == count) {
   2288       if (strong_word_count)
   2289         Result = strong_word_count;
   2290       Result <<= 4;
   2291       if (byref_word_count)
   2292         Result += byref_word_count;
   2293       Result <<= 4;
   2294       if (weak_word_count)
   2295         Result += weak_word_count;
   2296     }
   2297   }
   2298   return Result;
   2299 }
   2300 
   2301 llvm::Constant *CGObjCCommonMac::getBitmapBlockLayout(bool ComputeByrefLayout) {
   2302   llvm::Constant *nullPtr = llvm::Constant::getNullValue(CGM.Int8PtrTy);
   2303   if (RunSkipBlockVars.empty())
   2304     return nullPtr;
   2305   unsigned WordSizeInBits = CGM.getTarget().getPointerWidth(0);
   2306   unsigned ByteSizeInBits = CGM.getTarget().getCharWidth();
   2307   unsigned WordSizeInBytes = WordSizeInBits/ByteSizeInBits;
   2308 
   2309   // Sort on byte position; captures might not be allocated in order,
   2310   // and unions can do funny things.
   2311   llvm::array_pod_sort(RunSkipBlockVars.begin(), RunSkipBlockVars.end());
   2312   SmallVector<unsigned char, 16> Layout;
   2313 
   2314   unsigned size = RunSkipBlockVars.size();
   2315   for (unsigned i = 0; i < size; i++) {
   2316     enum BLOCK_LAYOUT_OPCODE opcode = RunSkipBlockVars[i].opcode;
   2317     CharUnits start_byte_pos = RunSkipBlockVars[i].block_var_bytepos;
   2318     CharUnits end_byte_pos = start_byte_pos;
   2319     unsigned j = i+1;
   2320     while (j < size) {
   2321       if (opcode == RunSkipBlockVars[j].opcode) {
   2322         end_byte_pos = RunSkipBlockVars[j++].block_var_bytepos;
   2323         i++;
   2324       }
   2325       else
   2326         break;
   2327     }
   2328     CharUnits size_in_bytes =
   2329     end_byte_pos - start_byte_pos + RunSkipBlockVars[j-1].block_var_size;
   2330     if (j < size) {
   2331       CharUnits gap =
   2332       RunSkipBlockVars[j].block_var_bytepos -
   2333       RunSkipBlockVars[j-1].block_var_bytepos - RunSkipBlockVars[j-1].block_var_size;
   2334       size_in_bytes += gap;
   2335     }
   2336     CharUnits residue_in_bytes = CharUnits::Zero();
   2337     if (opcode == BLOCK_LAYOUT_NON_OBJECT_BYTES) {
   2338       residue_in_bytes = size_in_bytes % WordSizeInBytes;
   2339       size_in_bytes -= residue_in_bytes;
   2340       opcode = BLOCK_LAYOUT_NON_OBJECT_WORDS;
   2341     }
   2342 
   2343     unsigned size_in_words = size_in_bytes.getQuantity() / WordSizeInBytes;
   2344     while (size_in_words >= 16) {
   2345       // Note that value in imm. is one less that the actual
   2346       // value. So, 0xf means 16 words follow!
   2347       unsigned char inst = (opcode << 4) | 0xf;
   2348       Layout.push_back(inst);
   2349       size_in_words -= 16;
   2350     }
   2351     if (size_in_words > 0) {
   2352       // Note that value in imm. is one less that the actual
   2353       // value. So, we subtract 1 away!
   2354       unsigned char inst = (opcode << 4) | (size_in_words-1);
   2355       Layout.push_back(inst);
   2356     }
   2357     if (residue_in_bytes > CharUnits::Zero()) {
   2358       unsigned char inst =
   2359       (BLOCK_LAYOUT_NON_OBJECT_BYTES << 4) | (residue_in_bytes.getQuantity()-1);
   2360       Layout.push_back(inst);
   2361     }
   2362   }
   2363 
   2364   int e = Layout.size()-1;
   2365   while (e >= 0) {
   2366     unsigned char inst = Layout[e--];
   2367     enum BLOCK_LAYOUT_OPCODE opcode = (enum BLOCK_LAYOUT_OPCODE) (inst >> 4);
   2368     if (opcode == BLOCK_LAYOUT_NON_OBJECT_BYTES || opcode == BLOCK_LAYOUT_NON_OBJECT_WORDS)
   2369       Layout.pop_back();
   2370     else
   2371       break;
   2372   }
   2373 
   2374   uint64_t Result = InlineLayoutInstruction(Layout);
   2375   if (Result != 0) {
   2376     // Block variable layout instruction has been inlined.
   2377     if (CGM.getLangOpts().ObjCGCBitmapPrint) {
   2378       if (ComputeByrefLayout)
   2379         printf("\n Inline instruction for BYREF variable layout: ");
   2380       else
   2381         printf("\n Inline instruction for block variable layout: ");
   2382       printf("0x0%" PRIx64 "\n", Result);
   2383     }
   2384     if (WordSizeInBytes == 8) {
   2385       const llvm::APInt Instruction(64, Result);
   2386       return llvm::Constant::getIntegerValue(CGM.Int64Ty, Instruction);
   2387     }
   2388     else {
   2389       const llvm::APInt Instruction(32, Result);
   2390       return llvm::Constant::getIntegerValue(CGM.Int32Ty, Instruction);
   2391     }
   2392   }
   2393 
   2394   unsigned char inst = (BLOCK_LAYOUT_OPERATOR << 4) | 0;
   2395   Layout.push_back(inst);
   2396   std::string BitMap;
   2397   for (unsigned i = 0, e = Layout.size(); i != e; i++)
   2398     BitMap += Layout[i];
   2399 
   2400   if (CGM.getLangOpts().ObjCGCBitmapPrint) {
   2401     if (ComputeByrefLayout)
   2402       printf("\n BYREF variable layout: ");
   2403     else
   2404       printf("\n block variable layout: ");
   2405     for (unsigned i = 0, e = BitMap.size(); i != e; i++) {
   2406       unsigned char inst = BitMap[i];
   2407       enum BLOCK_LAYOUT_OPCODE opcode = (enum BLOCK_LAYOUT_OPCODE) (inst >> 4);
   2408       unsigned delta = 1;
   2409       switch (opcode) {
   2410         case BLOCK_LAYOUT_OPERATOR:
   2411           printf("BL_OPERATOR:");
   2412           delta = 0;
   2413           break;
   2414         case BLOCK_LAYOUT_NON_OBJECT_BYTES:
   2415           printf("BL_NON_OBJECT_BYTES:");
   2416           break;
   2417         case BLOCK_LAYOUT_NON_OBJECT_WORDS:
   2418           printf("BL_NON_OBJECT_WORD:");
   2419           break;
   2420         case BLOCK_LAYOUT_STRONG:
   2421           printf("BL_STRONG:");
   2422           break;
   2423         case BLOCK_LAYOUT_BYREF:
   2424           printf("BL_BYREF:");
   2425           break;
   2426         case BLOCK_LAYOUT_WEAK:
   2427           printf("BL_WEAK:");
   2428           break;
   2429         case BLOCK_LAYOUT_UNRETAINED:
   2430           printf("BL_UNRETAINED:");
   2431           break;
   2432       }
   2433       // Actual value of word count is one more that what is in the imm.
   2434       // field of the instruction
   2435       printf("%d", (inst & 0xf) + delta);
   2436       if (i < e-1)
   2437         printf(", ");
   2438       else
   2439         printf("\n");
   2440     }
   2441   }
   2442 
   2443   llvm::GlobalVariable *Entry = CreateMetadataVar(
   2444       "OBJC_CLASS_NAME_",
   2445       llvm::ConstantDataArray::getString(VMContext, BitMap, false),
   2446       "__TEXT,__objc_classname,cstring_literals", 1, true);
   2447   return getConstantGEP(VMContext, Entry, 0, 0);
   2448 }
   2449 
   2450 llvm::Constant *CGObjCCommonMac::BuildRCBlockLayout(CodeGenModule &CGM,
   2451                                                     const CGBlockInfo &blockInfo) {
   2452   assert(CGM.getLangOpts().getGC() == LangOptions::NonGC);
   2453 
   2454   RunSkipBlockVars.clear();
   2455   bool hasUnion = false;
   2456 
   2457   unsigned WordSizeInBits = CGM.getTarget().getPointerWidth(0);
   2458   unsigned ByteSizeInBits = CGM.getTarget().getCharWidth();
   2459   unsigned WordSizeInBytes = WordSizeInBits/ByteSizeInBits;
   2460 
   2461   const BlockDecl *blockDecl = blockInfo.getBlockDecl();
   2462 
   2463   // Calculate the basic layout of the block structure.
   2464   const llvm::StructLayout *layout =
   2465   CGM.getDataLayout().getStructLayout(blockInfo.StructureType);
   2466 
   2467   // Ignore the optional 'this' capture: C++ objects are not assumed
   2468   // to be GC'ed.
   2469   if (blockInfo.BlockHeaderForcedGapSize != CharUnits::Zero())
   2470     UpdateRunSkipBlockVars(false, Qualifiers::OCL_None,
   2471                            blockInfo.BlockHeaderForcedGapOffset,
   2472                            blockInfo.BlockHeaderForcedGapSize);
   2473   // Walk the captured variables.
   2474   for (const auto &CI : blockDecl->captures()) {
   2475     const VarDecl *variable = CI.getVariable();
   2476     QualType type = variable->getType();
   2477 
   2478     const CGBlockInfo::Capture &capture = blockInfo.getCapture(variable);
   2479 
   2480     // Ignore constant captures.
   2481     if (capture.isConstant()) continue;
   2482 
   2483     CharUnits fieldOffset =
   2484        CharUnits::fromQuantity(layout->getElementOffset(capture.getIndex()));
   2485 
   2486     assert(!type->isArrayType() && "array variable should not be caught");
   2487     if (!CI.isByRef())
   2488       if (const RecordType *record = type->getAs<RecordType>()) {
   2489         BuildRCBlockVarRecordLayout(record, fieldOffset, hasUnion);
   2490         continue;
   2491       }
   2492     CharUnits fieldSize;
   2493     if (CI.isByRef())
   2494       fieldSize = CharUnits::fromQuantity(WordSizeInBytes);
   2495     else
   2496       fieldSize = CGM.getContext().getTypeSizeInChars(type);
   2497     UpdateRunSkipBlockVars(CI.isByRef(), getBlockCaptureLifetime(type, false),
   2498                            fieldOffset, fieldSize);
   2499   }
   2500   return getBitmapBlockLayout(false);
   2501 }
   2502 
   2503 
   2504 llvm::Constant *CGObjCCommonMac::BuildByrefLayout(CodeGen::CodeGenModule &CGM,
   2505                                                   QualType T) {
   2506   assert(CGM.getLangOpts().getGC() == LangOptions::NonGC);
   2507   assert(!T->isArrayType() && "__block array variable should not be caught");
   2508   CharUnits fieldOffset;
   2509   RunSkipBlockVars.clear();
   2510   bool hasUnion = false;
   2511   if (const RecordType *record = T->getAs<RecordType>()) {
   2512     BuildRCBlockVarRecordLayout(record, fieldOffset, hasUnion, true /*ByrefLayout */);
   2513     llvm::Constant *Result = getBitmapBlockLayout(true);
   2514     return Result;
   2515   }
   2516   llvm::Constant *nullPtr = llvm::Constant::getNullValue(CGM.Int8PtrTy);
   2517   return nullPtr;
   2518 }
   2519 
   2520 llvm::Value *CGObjCMac::GenerateProtocolRef(CodeGenFunction &CGF,
   2521                                             const ObjCProtocolDecl *PD) {
   2522   // FIXME: I don't understand why gcc generates this, or where it is
   2523   // resolved. Investigate. Its also wasteful to look this up over and over.
   2524   LazySymbols.insert(&CGM.getContext().Idents.get("Protocol"));
   2525 
   2526   return llvm::ConstantExpr::getBitCast(GetProtocolRef(PD),
   2527                                         ObjCTypes.getExternalProtocolPtrTy());
   2528 }
   2529 
   2530 void CGObjCCommonMac::GenerateProtocol(const ObjCProtocolDecl *PD) {
   2531   // FIXME: We shouldn't need this, the protocol decl should contain enough
   2532   // information to tell us whether this was a declaration or a definition.
   2533   DefinedProtocols.insert(PD->getIdentifier());
   2534 
   2535   // If we have generated a forward reference to this protocol, emit
   2536   // it now. Otherwise do nothing, the protocol objects are lazily
   2537   // emitted.
   2538   if (Protocols.count(PD->getIdentifier()))
   2539     GetOrEmitProtocol(PD);
   2540 }
   2541 
   2542 llvm::Constant *CGObjCCommonMac::GetProtocolRef(const ObjCProtocolDecl *PD) {
   2543   if (DefinedProtocols.count(PD->getIdentifier()))
   2544     return GetOrEmitProtocol(PD);
   2545 
   2546   return GetOrEmitProtocolRef(PD);
   2547 }
   2548 
   2549 /*
   2550 // Objective-C 1.0 extensions
   2551 struct _objc_protocol {
   2552 struct _objc_protocol_extension *isa;
   2553 char *protocol_name;
   2554 struct _objc_protocol_list *protocol_list;
   2555 struct _objc__method_prototype_list *instance_methods;
   2556 struct _objc__method_prototype_list *class_methods
   2557 };
   2558 
   2559 See EmitProtocolExtension().
   2560 */
   2561 llvm::Constant *CGObjCMac::GetOrEmitProtocol(const ObjCProtocolDecl *PD) {
   2562   llvm::GlobalVariable *Entry = Protocols[PD->getIdentifier()];
   2563 
   2564   // Early exit if a defining object has already been generated.
   2565   if (Entry && Entry->hasInitializer())
   2566     return Entry;
   2567 
   2568   // Use the protocol definition, if there is one.
   2569   if (const ObjCProtocolDecl *Def = PD->getDefinition())
   2570     PD = Def;
   2571 
   2572   // FIXME: I don't understand why gcc generates this, or where it is
   2573   // resolved. Investigate. Its also wasteful to look this up over and over.
   2574   LazySymbols.insert(&CGM.getContext().Idents.get("Protocol"));
   2575 
   2576   // Construct method lists.
   2577   std::vector<llvm::Constant*> InstanceMethods, ClassMethods;
   2578   std::vector<llvm::Constant*> OptInstanceMethods, OptClassMethods;
   2579   std::vector<llvm::Constant*> MethodTypesExt, OptMethodTypesExt;
   2580   for (const auto *MD : PD->instance_methods()) {
   2581     llvm::Constant *C = GetMethodDescriptionConstant(MD);
   2582     if (!C)
   2583       return GetOrEmitProtocolRef(PD);
   2584 
   2585     if (MD->getImplementationControl() == ObjCMethodDecl::Optional) {
   2586       OptInstanceMethods.push_back(C);
   2587       OptMethodTypesExt.push_back(GetMethodVarType(MD, true));
   2588     } else {
   2589       InstanceMethods.push_back(C);
   2590       MethodTypesExt.push_back(GetMethodVarType(MD, true));
   2591     }
   2592   }
   2593 
   2594   for (const auto *MD : PD->class_methods()) {
   2595     llvm::Constant *C = GetMethodDescriptionConstant(MD);
   2596     if (!C)
   2597       return GetOrEmitProtocolRef(PD);
   2598 
   2599     if (MD->getImplementationControl() == ObjCMethodDecl::Optional) {
   2600       OptClassMethods.push_back(C);
   2601       OptMethodTypesExt.push_back(GetMethodVarType(MD, true));
   2602     } else {
   2603       ClassMethods.push_back(C);
   2604       MethodTypesExt.push_back(GetMethodVarType(MD, true));
   2605     }
   2606   }
   2607 
   2608   MethodTypesExt.insert(MethodTypesExt.end(),
   2609                         OptMethodTypesExt.begin(), OptMethodTypesExt.end());
   2610 
   2611   llvm::Constant *Values[] = {
   2612       EmitProtocolExtension(PD, OptInstanceMethods, OptClassMethods,
   2613                             MethodTypesExt),
   2614       GetClassName(PD->getObjCRuntimeNameAsString()),
   2615       EmitProtocolList("OBJC_PROTOCOL_REFS_" + PD->getName(),
   2616                        PD->protocol_begin(), PD->protocol_end()),
   2617       EmitMethodDescList("OBJC_PROTOCOL_INSTANCE_METHODS_" + PD->getName(),
   2618                          "__OBJC,__cat_inst_meth,regular,no_dead_strip",
   2619                          InstanceMethods),
   2620       EmitMethodDescList("OBJC_PROTOCOL_CLASS_METHODS_" + PD->getName(),
   2621                          "__OBJC,__cat_cls_meth,regular,no_dead_strip",
   2622                          ClassMethods)};
   2623   llvm::Constant *Init = llvm::ConstantStruct::get(ObjCTypes.ProtocolTy,
   2624                                                    Values);
   2625 
   2626   if (Entry) {
   2627     // Already created, update the initializer.
   2628     assert(Entry->hasPrivateLinkage());
   2629     Entry->setInitializer(Init);
   2630   } else {
   2631     Entry = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ProtocolTy,
   2632                                      false, llvm::GlobalValue::PrivateLinkage,
   2633                                      Init, "OBJC_PROTOCOL_" + PD->getName());
   2634     Entry->setSection("__OBJC,__protocol,regular,no_dead_strip");
   2635     // FIXME: Is this necessary? Why only for protocol?
   2636     Entry->setAlignment(4);
   2637 
   2638     Protocols[PD->getIdentifier()] = Entry;
   2639   }
   2640   CGM.addCompilerUsedGlobal(Entry);
   2641 
   2642   return Entry;
   2643 }
   2644 
   2645 llvm::Constant *CGObjCMac::GetOrEmitProtocolRef(const ObjCProtocolDecl *PD) {
   2646   llvm::GlobalVariable *&Entry = Protocols[PD->getIdentifier()];
   2647 
   2648   if (!Entry) {
   2649     // We use the initializer as a marker of whether this is a forward
   2650     // reference or not. At module finalization we add the empty
   2651     // contents for protocols which were referenced but never defined.
   2652     Entry = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ProtocolTy,
   2653                                      false, llvm::GlobalValue::PrivateLinkage,
   2654                                      nullptr, "OBJC_PROTOCOL_" + PD->getName());
   2655     Entry->setSection("__OBJC,__protocol,regular,no_dead_strip");
   2656     // FIXME: Is this necessary? Why only for protocol?
   2657     Entry->setAlignment(4);
   2658   }
   2659 
   2660   return Entry;
   2661 }
   2662 
   2663 /*
   2664   struct _objc_protocol_extension {
   2665   uint32_t size;
   2666   struct objc_method_description_list *optional_instance_methods;
   2667   struct objc_method_description_list *optional_class_methods;
   2668   struct objc_property_list *instance_properties;
   2669   const char ** extendedMethodTypes;
   2670   };
   2671 */
   2672 llvm::Constant *
   2673 CGObjCMac::EmitProtocolExtension(const ObjCProtocolDecl *PD,
   2674                                  ArrayRef<llvm::Constant*> OptInstanceMethods,
   2675                                  ArrayRef<llvm::Constant*> OptClassMethods,
   2676                                  ArrayRef<llvm::Constant*> MethodTypesExt) {
   2677   uint64_t Size =
   2678     CGM.getDataLayout().getTypeAllocSize(ObjCTypes.ProtocolExtensionTy);
   2679   llvm::Constant *Values[] = {
   2680       llvm::ConstantInt::get(ObjCTypes.IntTy, Size),
   2681       EmitMethodDescList("OBJC_PROTOCOL_INSTANCE_METHODS_OPT_" + PD->getName(),
   2682                          "__OBJC,__cat_inst_meth,regular,no_dead_strip",
   2683                          OptInstanceMethods),
   2684       EmitMethodDescList("OBJC_PROTOCOL_CLASS_METHODS_OPT_" + PD->getName(),
   2685                          "__OBJC,__cat_cls_meth,regular,no_dead_strip",
   2686                          OptClassMethods),
   2687       EmitPropertyList("OBJC_$_PROP_PROTO_LIST_" + PD->getName(), nullptr, PD,
   2688                        ObjCTypes),
   2689       EmitProtocolMethodTypes("OBJC_PROTOCOL_METHOD_TYPES_" + PD->getName(),
   2690                               MethodTypesExt, ObjCTypes)};
   2691 
   2692   // Return null if no extension bits are used.
   2693   if (Values[1]->isNullValue() && Values[2]->isNullValue() &&
   2694       Values[3]->isNullValue() && Values[4]->isNullValue())
   2695     return llvm::Constant::getNullValue(ObjCTypes.ProtocolExtensionPtrTy);
   2696 
   2697   llvm::Constant *Init =
   2698     llvm::ConstantStruct::get(ObjCTypes.ProtocolExtensionTy, Values);
   2699 
   2700   // No special section, but goes in llvm.used
   2701   return CreateMetadataVar("\01l_OBJC_PROTOCOLEXT_" + PD->getName(), Init,
   2702                            StringRef(), 0, true);
   2703 }
   2704 
   2705 /*
   2706   struct objc_protocol_list {
   2707     struct objc_protocol_list *next;
   2708     long count;
   2709     Protocol *list[];
   2710   };
   2711 */
   2712 llvm::Constant *
   2713 CGObjCMac::EmitProtocolList(Twine Name,
   2714                             ObjCProtocolDecl::protocol_iterator begin,
   2715                             ObjCProtocolDecl::protocol_iterator end) {
   2716   SmallVector<llvm::Constant *, 16> ProtocolRefs;
   2717 
   2718   for (; begin != end; ++begin)
   2719     ProtocolRefs.push_back(GetProtocolRef(*begin));
   2720 
   2721   // Just return null for empty protocol lists
   2722   if (ProtocolRefs.empty())
   2723     return llvm::Constant::getNullValue(ObjCTypes.ProtocolListPtrTy);
   2724 
   2725   // This list is null terminated.
   2726   ProtocolRefs.push_back(llvm::Constant::getNullValue(ObjCTypes.ProtocolPtrTy));
   2727 
   2728   llvm::Constant *Values[3];
   2729   // This field is only used by the runtime.
   2730   Values[0] = llvm::Constant::getNullValue(ObjCTypes.ProtocolListPtrTy);
   2731   Values[1] = llvm::ConstantInt::get(ObjCTypes.LongTy,
   2732                                      ProtocolRefs.size() - 1);
   2733   Values[2] =
   2734     llvm::ConstantArray::get(llvm::ArrayType::get(ObjCTypes.ProtocolPtrTy,
   2735                                                   ProtocolRefs.size()),
   2736                              ProtocolRefs);
   2737 
   2738   llvm::Constant *Init = llvm::ConstantStruct::getAnon(Values);
   2739   llvm::GlobalVariable *GV =
   2740     CreateMetadataVar(Name, Init, "__OBJC,__cat_cls_meth,regular,no_dead_strip",
   2741                       4, false);
   2742   return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.ProtocolListPtrTy);
   2743 }
   2744 
   2745 void CGObjCCommonMac::
   2746 PushProtocolProperties(llvm::SmallPtrSet<const IdentifierInfo*,16> &PropertySet,
   2747                        SmallVectorImpl<llvm::Constant *> &Properties,
   2748                        const Decl *Container,
   2749                        const ObjCProtocolDecl *Proto,
   2750                        const ObjCCommonTypesHelper &ObjCTypes) {
   2751   for (const auto *P : Proto->protocols())
   2752     PushProtocolProperties(PropertySet, Properties, Container, P, ObjCTypes);
   2753   for (const auto *PD : Proto->properties()) {
   2754     if (!PropertySet.insert(PD->getIdentifier()).second)
   2755       continue;
   2756     llvm::Constant *Prop[] = {
   2757       GetPropertyName(PD->getIdentifier()),
   2758       GetPropertyTypeString(PD, Container)
   2759     };
   2760     Properties.push_back(llvm::ConstantStruct::get(ObjCTypes.PropertyTy, Prop));
   2761   }
   2762 }
   2763 
   2764 /*
   2765   struct _objc_property {
   2766     const char * const name;
   2767     const char * const attributes;
   2768   };
   2769 
   2770   struct _objc_property_list {
   2771     uint32_t entsize; // sizeof (struct _objc_property)
   2772     uint32_t prop_count;
   2773     struct _objc_property[prop_count];
   2774   };
   2775 */
   2776 llvm::Constant *CGObjCCommonMac::EmitPropertyList(Twine Name,
   2777                                        const Decl *Container,
   2778                                        const ObjCContainerDecl *OCD,
   2779                                        const ObjCCommonTypesHelper &ObjCTypes) {
   2780   SmallVector<llvm::Constant *, 16> Properties;
   2781   llvm::SmallPtrSet<const IdentifierInfo*, 16> PropertySet;
   2782   for (const auto *PD : OCD->properties()) {
   2783     PropertySet.insert(PD->getIdentifier());
   2784     llvm::Constant *Prop[] = {
   2785       GetPropertyName(PD->getIdentifier()),
   2786       GetPropertyTypeString(PD, Container)
   2787     };
   2788     Properties.push_back(llvm::ConstantStruct::get(ObjCTypes.PropertyTy,
   2789                                                    Prop));
   2790   }
   2791   if (const ObjCInterfaceDecl *OID = dyn_cast<ObjCInterfaceDecl>(OCD)) {
   2792     for (const auto *P : OID->all_referenced_protocols())
   2793       PushProtocolProperties(PropertySet, Properties, Container, P, ObjCTypes);
   2794   }
   2795   else if (const ObjCCategoryDecl *CD = dyn_cast<ObjCCategoryDecl>(OCD)) {
   2796     for (const auto *P : CD->protocols())
   2797       PushProtocolProperties(PropertySet, Properties, Container, P, ObjCTypes);
   2798   }
   2799 
   2800   // Return null for empty list.
   2801   if (Properties.empty())
   2802     return llvm::Constant::getNullValue(ObjCTypes.PropertyListPtrTy);
   2803 
   2804   unsigned PropertySize =
   2805     CGM.getDataLayout().getTypeAllocSize(ObjCTypes.PropertyTy);
   2806   llvm::Constant *Values[3];
   2807   Values[0] = llvm::ConstantInt::get(ObjCTypes.IntTy, PropertySize);
   2808   Values[1] = llvm::ConstantInt::get(ObjCTypes.IntTy, Properties.size());
   2809   llvm::ArrayType *AT = llvm::ArrayType::get(ObjCTypes.PropertyTy,
   2810                                              Properties.size());
   2811   Values[2] = llvm::ConstantArray::get(AT, Properties);
   2812   llvm::Constant *Init = llvm::ConstantStruct::getAnon(Values);
   2813 
   2814   llvm::GlobalVariable *GV =
   2815     CreateMetadataVar(Name, Init,
   2816                       (ObjCABI == 2) ? "__DATA, __objc_const" :
   2817                       "__OBJC,__property,regular,no_dead_strip",
   2818                       (ObjCABI == 2) ? 8 : 4,
   2819                       true);
   2820   return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.PropertyListPtrTy);
   2821 }
   2822 
   2823 llvm::Constant *
   2824 CGObjCCommonMac::EmitProtocolMethodTypes(Twine Name,
   2825                                          ArrayRef<llvm::Constant*> MethodTypes,
   2826                                          const ObjCCommonTypesHelper &ObjCTypes) {
   2827   // Return null for empty list.
   2828   if (MethodTypes.empty())
   2829     return llvm::Constant::getNullValue(ObjCTypes.Int8PtrPtrTy);
   2830 
   2831   llvm::ArrayType *AT = llvm::ArrayType::get(ObjCTypes.Int8PtrTy,
   2832                                              MethodTypes.size());
   2833   llvm::Constant *Init = llvm::ConstantArray::get(AT, MethodTypes);
   2834 
   2835   llvm::GlobalVariable *GV = CreateMetadataVar(
   2836       Name, Init, (ObjCABI == 2) ? "__DATA, __objc_const" : StringRef(),
   2837       (ObjCABI == 2) ? 8 : 4, true);
   2838   return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.Int8PtrPtrTy);
   2839 }
   2840 
   2841 /*
   2842   struct objc_method_description_list {
   2843   int count;
   2844   struct objc_method_description list[];
   2845   };
   2846 */
   2847 llvm::Constant *
   2848 CGObjCMac::GetMethodDescriptionConstant(const ObjCMethodDecl *MD) {
   2849   llvm::Constant *Desc[] = {
   2850     llvm::ConstantExpr::getBitCast(GetMethodVarName(MD->getSelector()),
   2851                                    ObjCTypes.SelectorPtrTy),
   2852     GetMethodVarType(MD)
   2853   };
   2854   if (!Desc[1])
   2855     return nullptr;
   2856 
   2857   return llvm::ConstantStruct::get(ObjCTypes.MethodDescriptionTy,
   2858                                    Desc);
   2859 }
   2860 
   2861 llvm::Constant *
   2862 CGObjCMac::EmitMethodDescList(Twine Name, const char *Section,
   2863                               ArrayRef<llvm::Constant*> Methods) {
   2864   // Return null for empty list.
   2865   if (Methods.empty())
   2866     return llvm::Constant::getNullValue(ObjCTypes.MethodDescriptionListPtrTy);
   2867 
   2868   llvm::Constant *Values[2];
   2869   Values[0] = llvm::ConstantInt::get(ObjCTypes.IntTy, Methods.size());
   2870   llvm::ArrayType *AT = llvm::ArrayType::get(ObjCTypes.MethodDescriptionTy,
   2871                                              Methods.size());
   2872   Values[1] = llvm::ConstantArray::get(AT, Methods);
   2873   llvm::Constant *Init = llvm::ConstantStruct::getAnon(Values);
   2874 
   2875   llvm::GlobalVariable *GV = CreateMetadataVar(Name, Init, Section, 4, true);
   2876   return llvm::ConstantExpr::getBitCast(GV,
   2877                                         ObjCTypes.MethodDescriptionListPtrTy);
   2878 }
   2879 
   2880 /*
   2881   struct _objc_category {
   2882   char *category_name;
   2883   char *class_name;
   2884   struct _objc_method_list *instance_methods;
   2885   struct _objc_method_list *class_methods;
   2886   struct _objc_protocol_list *protocols;
   2887   uint32_t size; // <rdar://4585769>
   2888   struct _objc_property_list *instance_properties;
   2889   };
   2890 */
   2891 void CGObjCMac::GenerateCategory(const ObjCCategoryImplDecl *OCD) {
   2892   unsigned Size = CGM.getDataLayout().getTypeAllocSize(ObjCTypes.CategoryTy);
   2893 
   2894   // FIXME: This is poor design, the OCD should have a pointer to the category
   2895   // decl. Additionally, note that Category can be null for the @implementation
   2896   // w/o an @interface case. Sema should just create one for us as it does for
   2897   // @implementation so everyone else can live life under a clear blue sky.
   2898   const ObjCInterfaceDecl *Interface = OCD->getClassInterface();
   2899   const ObjCCategoryDecl *Category =
   2900     Interface->FindCategoryDeclaration(OCD->getIdentifier());
   2901 
   2902   SmallString<256> ExtName;
   2903   llvm::raw_svector_ostream(ExtName) << Interface->getName() << '_'
   2904                                      << OCD->getName();
   2905 
   2906   SmallVector<llvm::Constant *, 16> InstanceMethods, ClassMethods;
   2907   for (const auto *I : OCD->instance_methods())
   2908     // Instance methods should always be defined.
   2909     InstanceMethods.push_back(GetMethodConstant(I));
   2910 
   2911   for (const auto *I : OCD->class_methods())
   2912     // Class methods should always be defined.
   2913     ClassMethods.push_back(GetMethodConstant(I));
   2914 
   2915   llvm::Constant *Values[7];
   2916   Values[0] = GetClassName(OCD->getName());
   2917   Values[1] = GetClassName(Interface->getObjCRuntimeNameAsString());
   2918   LazySymbols.insert(Interface->getIdentifier());
   2919   Values[2] = EmitMethodList("OBJC_CATEGORY_INSTANCE_METHODS_" + ExtName.str(),
   2920                              "__OBJC,__cat_inst_meth,regular,no_dead_strip",
   2921                              InstanceMethods);
   2922   Values[3] = EmitMethodList("OBJC_CATEGORY_CLASS_METHODS_" + ExtName.str(),
   2923                              "__OBJC,__cat_cls_meth,regular,no_dead_strip",
   2924                              ClassMethods);
   2925   if (Category) {
   2926     Values[4] =
   2927         EmitProtocolList("OBJC_CATEGORY_PROTOCOLS_" + ExtName.str(),
   2928                          Category->protocol_begin(), Category->protocol_end());
   2929   } else {
   2930     Values[4] = llvm::Constant::getNullValue(ObjCTypes.ProtocolListPtrTy);
   2931   }
   2932   Values[5] = llvm::ConstantInt::get(ObjCTypes.IntTy, Size);
   2933 
   2934   // If there is no category @interface then there can be no properties.
   2935   if (Category) {
   2936     Values[6] = EmitPropertyList("\01l_OBJC_$_PROP_LIST_" + ExtName.str(),
   2937                                  OCD, Category, ObjCTypes);
   2938   } else {
   2939     Values[6] = llvm::Constant::getNullValue(ObjCTypes.PropertyListPtrTy);
   2940   }
   2941 
   2942   llvm::Constant *Init = llvm::ConstantStruct::get(ObjCTypes.CategoryTy,
   2943                                                    Values);
   2944 
   2945   llvm::GlobalVariable *GV =
   2946       CreateMetadataVar("OBJC_CATEGORY_" + ExtName.str(), Init,
   2947                         "__OBJC,__category,regular,no_dead_strip", 4, true);
   2948   DefinedCategories.push_back(GV);
   2949   DefinedCategoryNames.insert(ExtName.str());
   2950   // method definition entries must be clear for next implementation.
   2951   MethodDefinitions.clear();
   2952 }
   2953 
   2954 enum FragileClassFlags {
   2955   FragileABI_Class_Factory                 = 0x00001,
   2956   FragileABI_Class_Meta                    = 0x00002,
   2957   FragileABI_Class_HasCXXStructors         = 0x02000,
   2958   FragileABI_Class_Hidden                  = 0x20000
   2959 };
   2960 
   2961 enum NonFragileClassFlags {
   2962   /// Is a meta-class.
   2963   NonFragileABI_Class_Meta                 = 0x00001,
   2964 
   2965   /// Is a root class.
   2966   NonFragileABI_Class_Root                 = 0x00002,
   2967 
   2968   /// Has a C++ constructor and destructor.
   2969   NonFragileABI_Class_HasCXXStructors      = 0x00004,
   2970 
   2971   /// Has hidden visibility.
   2972   NonFragileABI_Class_Hidden               = 0x00010,
   2973 
   2974   /// Has the exception attribute.
   2975   NonFragileABI_Class_Exception            = 0x00020,
   2976 
   2977   /// (Obsolete) ARC-specific: this class has a .release_ivars method
   2978   NonFragileABI_Class_HasIvarReleaser      = 0x00040,
   2979 
   2980   /// Class implementation was compiled under ARC.
   2981   NonFragileABI_Class_CompiledByARC        = 0x00080,
   2982 
   2983   /// Class has non-trivial destructors, but zero-initialization is okay.
   2984   NonFragileABI_Class_HasCXXDestructorOnly = 0x00100
   2985 };
   2986 
   2987 /*
   2988   struct _objc_class {
   2989   Class isa;
   2990   Class super_class;
   2991   const char *name;
   2992   long version;
   2993   long info;
   2994   long instance_size;
   2995   struct _objc_ivar_list *ivars;
   2996   struct _objc_method_list *methods;
   2997   struct _objc_cache *cache;
   2998   struct _objc_protocol_list *protocols;
   2999   // Objective-C 1.0 extensions (<rdr://4585769>)
   3000   const char *ivar_layout;
   3001   struct _objc_class_ext *ext;
   3002   };
   3003 
   3004   See EmitClassExtension();
   3005 */
   3006 void CGObjCMac::GenerateClass(const ObjCImplementationDecl *ID) {
   3007   DefinedSymbols.insert(ID->getIdentifier());
   3008 
   3009   std::string ClassName = ID->getNameAsString();
   3010   // FIXME: Gross
   3011   ObjCInterfaceDecl *Interface =
   3012     const_cast<ObjCInterfaceDecl*>(ID->getClassInterface());
   3013   llvm::Constant *Protocols =
   3014       EmitProtocolList("OBJC_CLASS_PROTOCOLS_" + ID->getName(),
   3015                        Interface->all_referenced_protocol_begin(),
   3016                        Interface->all_referenced_protocol_end());
   3017   unsigned Flags = FragileABI_Class_Factory;
   3018   if (ID->hasNonZeroConstructors() || ID->hasDestructors())
   3019     Flags |= FragileABI_Class_HasCXXStructors;
   3020   unsigned Size =
   3021     CGM.getContext().getASTObjCImplementationLayout(ID).getSize().getQuantity();
   3022 
   3023   // FIXME: Set CXX-structors flag.
   3024   if (ID->getClassInterface()->getVisibility() == HiddenVisibility)
   3025     Flags |= FragileABI_Class_Hidden;
   3026 
   3027   SmallVector<llvm::Constant *, 16> InstanceMethods, ClassMethods;
   3028   for (const auto *I : ID->instance_methods())
   3029     // Instance methods should always be defined.
   3030     InstanceMethods.push_back(GetMethodConstant(I));
   3031 
   3032   for (const auto *I : ID->class_methods())
   3033     // Class methods should always be defined.
   3034     ClassMethods.push_back(GetMethodConstant(I));
   3035 
   3036   for (const auto *PID : ID->property_impls()) {
   3037     if (PID->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize) {
   3038       ObjCPropertyDecl *PD = PID->getPropertyDecl();
   3039 
   3040       if (ObjCMethodDecl *MD = PD->getGetterMethodDecl())
   3041         if (llvm::Constant *C = GetMethodConstant(MD))
   3042           InstanceMethods.push_back(C);
   3043       if (ObjCMethodDecl *MD = PD->getSetterMethodDecl())
   3044         if (llvm::Constant *C = GetMethodConstant(MD))
   3045           InstanceMethods.push_back(C);
   3046     }
   3047   }
   3048 
   3049   llvm::Constant *Values[12];
   3050   Values[ 0] = EmitMetaClass(ID, Protocols, ClassMethods);
   3051   if (ObjCInterfaceDecl *Super = Interface->getSuperClass()) {
   3052     // Record a reference to the super class.
   3053     LazySymbols.insert(Super->getIdentifier());
   3054 
   3055     Values[ 1] =
   3056       llvm::ConstantExpr::getBitCast(GetClassName(Super->getObjCRuntimeNameAsString()),
   3057                                      ObjCTypes.ClassPtrTy);
   3058   } else {
   3059     Values[ 1] = llvm::Constant::getNullValue(ObjCTypes.ClassPtrTy);
   3060   }
   3061   Values[ 2] = GetClassName(ID->getObjCRuntimeNameAsString());
   3062   // Version is always 0.
   3063   Values[ 3] = llvm::ConstantInt::get(ObjCTypes.LongTy, 0);
   3064   Values[ 4] = llvm::ConstantInt::get(ObjCTypes.LongTy, Flags);
   3065   Values[ 5] = llvm::ConstantInt::get(ObjCTypes.LongTy, Size);
   3066   Values[ 6] = EmitIvarList(ID, false);
   3067   Values[7] = EmitMethodList("OBJC_INSTANCE_METHODS_" + ID->getName(),
   3068                              "__OBJC,__inst_meth,regular,no_dead_strip",
   3069                              InstanceMethods);
   3070   // cache is always NULL.
   3071   Values[ 8] = llvm::Constant::getNullValue(ObjCTypes.CachePtrTy);
   3072   Values[ 9] = Protocols;
   3073   Values[10] = BuildIvarLayout(ID, true);
   3074   Values[11] = EmitClassExtension(ID);
   3075   llvm::Constant *Init = llvm::ConstantStruct::get(ObjCTypes.ClassTy,
   3076                                                    Values);
   3077   std::string Name("OBJC_CLASS_");
   3078   Name += ClassName;
   3079   const char *Section = "__OBJC,__class,regular,no_dead_strip";
   3080   // Check for a forward reference.
   3081   llvm::GlobalVariable *GV = CGM.getModule().getGlobalVariable(Name, true);
   3082   if (GV) {
   3083     assert(GV->getType()->getElementType() == ObjCTypes.ClassTy &&
   3084            "Forward metaclass reference has incorrect type.");
   3085     GV->setInitializer(Init);
   3086     GV->setSection(Section);
   3087     GV->setAlignment(4);
   3088     CGM.addCompilerUsedGlobal(GV);
   3089   } else
   3090     GV = CreateMetadataVar(Name, Init, Section, 4, true);
   3091   DefinedClasses.push_back(GV);
   3092   ImplementedClasses.push_back(Interface);
   3093   // method definition entries must be clear for next implementation.
   3094   MethodDefinitions.clear();
   3095 }
   3096 
   3097 llvm::Constant *CGObjCMac::EmitMetaClass(const ObjCImplementationDecl *ID,
   3098                                          llvm::Constant *Protocols,
   3099                                          ArrayRef<llvm::Constant*> Methods) {
   3100   unsigned Flags = FragileABI_Class_Meta;
   3101   unsigned Size = CGM.getDataLayout().getTypeAllocSize(ObjCTypes.ClassTy);
   3102 
   3103   if (ID->getClassInterface()->getVisibility() == HiddenVisibility)
   3104     Flags |= FragileABI_Class_Hidden;
   3105 
   3106   llvm::Constant *Values[12];
   3107   // The isa for the metaclass is the root of the hierarchy.
   3108   const ObjCInterfaceDecl *Root = ID->getClassInterface();
   3109   while (const ObjCInterfaceDecl *Super = Root->getSuperClass())
   3110     Root = Super;
   3111   Values[ 0] =
   3112     llvm::ConstantExpr::getBitCast(GetClassName(Root->getObjCRuntimeNameAsString()),
   3113                                    ObjCTypes.ClassPtrTy);
   3114   // The super class for the metaclass is emitted as the name of the
   3115   // super class. The runtime fixes this up to point to the
   3116   // *metaclass* for the super class.
   3117   if (ObjCInterfaceDecl *Super = ID->getClassInterface()->getSuperClass()) {
   3118     Values[ 1] =
   3119       llvm::ConstantExpr::getBitCast(GetClassName(Super->getObjCRuntimeNameAsString()),
   3120                                      ObjCTypes.ClassPtrTy);
   3121   } else {
   3122     Values[ 1] = llvm::Constant::getNullValue(ObjCTypes.ClassPtrTy);
   3123   }
   3124   Values[ 2] = GetClassName(ID->getObjCRuntimeNameAsString());
   3125   // Version is always 0.
   3126   Values[ 3] = llvm::ConstantInt::get(ObjCTypes.LongTy, 0);
   3127   Values[ 4] = llvm::ConstantInt::get(ObjCTypes.LongTy, Flags);
   3128   Values[ 5] = llvm::ConstantInt::get(ObjCTypes.LongTy, Size);
   3129   Values[ 6] = EmitIvarList(ID, true);
   3130   Values[7] =
   3131       EmitMethodList("OBJC_CLASS_METHODS_" + ID->getNameAsString(),
   3132                      "__OBJC,__cls_meth,regular,no_dead_strip", Methods);
   3133   // cache is always NULL.
   3134   Values[ 8] = llvm::Constant::getNullValue(ObjCTypes.CachePtrTy);
   3135   Values[ 9] = Protocols;
   3136   // ivar_layout for metaclass is always NULL.
   3137   Values[10] = llvm::Constant::getNullValue(ObjCTypes.Int8PtrTy);
   3138   // The class extension is always unused for metaclasses.
   3139   Values[11] = llvm::Constant::getNullValue(ObjCTypes.ClassExtensionPtrTy);
   3140   llvm::Constant *Init = llvm::ConstantStruct::get(ObjCTypes.ClassTy,
   3141                                                    Values);
   3142 
   3143   std::string Name("OBJC_METACLASS_");
   3144   Name += ID->getName();
   3145 
   3146   // Check for a forward reference.
   3147   llvm::GlobalVariable *GV = CGM.getModule().getGlobalVariable(Name, true);
   3148   if (GV) {
   3149     assert(GV->getType()->getElementType() == ObjCTypes.ClassTy &&
   3150            "Forward metaclass reference has incorrect type.");
   3151     GV->setInitializer(Init);
   3152   } else {
   3153     GV = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ClassTy, false,
   3154                                   llvm::GlobalValue::PrivateLinkage,
   3155                                   Init, Name);
   3156   }
   3157   GV->setSection("__OBJC,__meta_class,regular,no_dead_strip");
   3158   GV->setAlignment(4);
   3159   CGM.addCompilerUsedGlobal(GV);
   3160 
   3161   return GV;
   3162 }
   3163 
   3164 llvm::Constant *CGObjCMac::EmitMetaClassRef(const ObjCInterfaceDecl *ID) {
   3165   std::string Name = "OBJC_METACLASS_" + ID->getNameAsString();
   3166 
   3167   // FIXME: Should we look these up somewhere other than the module. Its a bit
   3168   // silly since we only generate these while processing an implementation, so
   3169   // exactly one pointer would work if know when we entered/exitted an
   3170   // implementation block.
   3171 
   3172   // Check for an existing forward reference.
   3173   // Previously, metaclass with internal linkage may have been defined.
   3174   // pass 'true' as 2nd argument so it is returned.
   3175   llvm::GlobalVariable *GV = CGM.getModule().getGlobalVariable(Name, true);
   3176   if (!GV)
   3177     GV = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ClassTy, false,
   3178                                   llvm::GlobalValue::PrivateLinkage, nullptr,
   3179                                   Name);
   3180 
   3181   assert(GV->getType()->getElementType() == ObjCTypes.ClassTy &&
   3182          "Forward metaclass reference has incorrect type.");
   3183   return GV;
   3184 }
   3185 
   3186 llvm::Value *CGObjCMac::EmitSuperClassRef(const ObjCInterfaceDecl *ID) {
   3187   std::string Name = "OBJC_CLASS_" + ID->getNameAsString();
   3188   llvm::GlobalVariable *GV = CGM.getModule().getGlobalVariable(Name, true);
   3189 
   3190   if (!GV)
   3191     GV = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ClassTy, false,
   3192                                   llvm::GlobalValue::PrivateLinkage, nullptr,
   3193                                   Name);
   3194 
   3195   assert(GV->getType()->getElementType() == ObjCTypes.ClassTy &&
   3196          "Forward class metadata reference has incorrect type.");
   3197   return GV;
   3198 }
   3199 
   3200 /*
   3201   struct objc_class_ext {
   3202   uint32_t size;
   3203   const char *weak_ivar_layout;
   3204   struct _objc_property_list *properties;
   3205   };
   3206 */
   3207 llvm::Constant *
   3208 CGObjCMac::EmitClassExtension(const ObjCImplementationDecl *ID) {
   3209   uint64_t Size =
   3210     CGM.getDataLayout().getTypeAllocSize(ObjCTypes.ClassExtensionTy);
   3211 
   3212   llvm::Constant *Values[3];
   3213   Values[0] = llvm::ConstantInt::get(ObjCTypes.IntTy, Size);
   3214   Values[1] = BuildIvarLayout(ID, false);
   3215   Values[2] = EmitPropertyList("\01l_OBJC_$_PROP_LIST_" + ID->getName(),
   3216                                ID, ID->getClassInterface(), ObjCTypes);
   3217 
   3218   // Return null if no extension bits are used.
   3219   if (Values[1]->isNullValue() && Values[2]->isNullValue())
   3220     return llvm::Constant::getNullValue(ObjCTypes.ClassExtensionPtrTy);
   3221 
   3222   llvm::Constant *Init =
   3223     llvm::ConstantStruct::get(ObjCTypes.ClassExtensionTy, Values);
   3224   return CreateMetadataVar("OBJC_CLASSEXT_" + ID->getName(), Init,
   3225                            "__OBJC,__class_ext,regular,no_dead_strip", 4, true);
   3226 }
   3227 
   3228 /*
   3229   struct objc_ivar {
   3230     char *ivar_name;
   3231     char *ivar_type;
   3232     int ivar_offset;
   3233   };
   3234 
   3235   struct objc_ivar_list {
   3236     int ivar_count;
   3237     struct objc_ivar list[count];
   3238   };
   3239 */
   3240 llvm::Constant *CGObjCMac::EmitIvarList(const ObjCImplementationDecl *ID,
   3241                                         bool ForClass) {
   3242   std::vector<llvm::Constant*> Ivars;
   3243 
   3244   // When emitting the root class GCC emits ivar entries for the
   3245   // actual class structure. It is not clear if we need to follow this
   3246   // behavior; for now lets try and get away with not doing it. If so,
   3247   // the cleanest solution would be to make up an ObjCInterfaceDecl
   3248   // for the class.
   3249   if (ForClass)
   3250     return llvm::Constant::getNullValue(ObjCTypes.IvarListPtrTy);
   3251 
   3252   const ObjCInterfaceDecl *OID = ID->getClassInterface();
   3253 
   3254   for (const ObjCIvarDecl *IVD = OID->all_declared_ivar_begin();
   3255        IVD; IVD = IVD->getNextIvar()) {
   3256     // Ignore unnamed bit-fields.
   3257     if (!IVD->getDeclName())
   3258       continue;
   3259     llvm::Constant *Ivar[] = {
   3260       GetMethodVarName(IVD->getIdentifier()),
   3261       GetMethodVarType(IVD),
   3262       llvm::ConstantInt::get(ObjCTypes.IntTy,
   3263                              ComputeIvarBaseOffset(CGM, OID, IVD))
   3264     };
   3265     Ivars.push_back(llvm::ConstantStruct::get(ObjCTypes.IvarTy, Ivar));
   3266   }
   3267 
   3268   // Return null for empty list.
   3269   if (Ivars.empty())
   3270     return llvm::Constant::getNullValue(ObjCTypes.IvarListPtrTy);
   3271 
   3272   llvm::Constant *Values[2];
   3273   Values[0] = llvm::ConstantInt::get(ObjCTypes.IntTy, Ivars.size());
   3274   llvm::ArrayType *AT = llvm::ArrayType::get(ObjCTypes.IvarTy,
   3275                                              Ivars.size());
   3276   Values[1] = llvm::ConstantArray::get(AT, Ivars);
   3277   llvm::Constant *Init = llvm::ConstantStruct::getAnon(Values);
   3278 
   3279   llvm::GlobalVariable *GV;
   3280   if (ForClass)
   3281     GV =
   3282         CreateMetadataVar("OBJC_CLASS_VARIABLES_" + ID->getName(), Init,
   3283                           "__OBJC,__class_vars,regular,no_dead_strip", 4, true);
   3284   else
   3285     GV = CreateMetadataVar("OBJC_INSTANCE_VARIABLES_" + ID->getName(), Init,
   3286                            "__OBJC,__instance_vars,regular,no_dead_strip", 4,
   3287                            true);
   3288   return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.IvarListPtrTy);
   3289 }
   3290 
   3291 /*
   3292   struct objc_method {
   3293   SEL method_name;
   3294   char *method_types;
   3295   void *method;
   3296   };
   3297 
   3298   struct objc_method_list {
   3299   struct objc_method_list *obsolete;
   3300   int count;
   3301   struct objc_method methods_list[count];
   3302   };
   3303 */
   3304 
   3305 /// GetMethodConstant - Return a struct objc_method constant for the
   3306 /// given method if it has been defined. The result is null if the
   3307 /// method has not been defined. The return value has type MethodPtrTy.
   3308 llvm::Constant *CGObjCMac::GetMethodConstant(const ObjCMethodDecl *MD) {
   3309   llvm::Function *Fn = GetMethodDefinition(MD);
   3310   if (!Fn)
   3311     return nullptr;
   3312 
   3313   llvm::Constant *Method[] = {
   3314     llvm::ConstantExpr::getBitCast(GetMethodVarName(MD->getSelector()),
   3315                                    ObjCTypes.SelectorPtrTy),
   3316     GetMethodVarType(MD),
   3317     llvm::ConstantExpr::getBitCast(Fn, ObjCTypes.Int8PtrTy)
   3318   };
   3319   return llvm::ConstantStruct::get(ObjCTypes.MethodTy, Method);
   3320 }
   3321 
   3322 llvm::Constant *CGObjCMac::EmitMethodList(Twine Name,
   3323                                           const char *Section,
   3324                                           ArrayRef<llvm::Constant*> Methods) {
   3325   // Return null for empty list.
   3326   if (Methods.empty())
   3327     return llvm::Constant::getNullValue(ObjCTypes.MethodListPtrTy);
   3328 
   3329   llvm::Constant *Values[3];
   3330   Values[0] = llvm::Constant::getNullValue(ObjCTypes.Int8PtrTy);
   3331   Values[1] = llvm::ConstantInt::get(ObjCTypes.IntTy, Methods.size());
   3332   llvm::ArrayType *AT = llvm::ArrayType::get(ObjCTypes.MethodTy,
   3333                                              Methods.size());
   3334   Values[2] = llvm::ConstantArray::get(AT, Methods);
   3335   llvm::Constant *Init = llvm::ConstantStruct::getAnon(Values);
   3336 
   3337   llvm::GlobalVariable *GV = CreateMetadataVar(Name, Init, Section, 4, true);
   3338   return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.MethodListPtrTy);
   3339 }
   3340 
   3341 llvm::Function *CGObjCCommonMac::GenerateMethod(const ObjCMethodDecl *OMD,
   3342                                                 const ObjCContainerDecl *CD) {
   3343   SmallString<256> Name;
   3344   GetNameForMethod(OMD, CD, Name);
   3345 
   3346   CodeGenTypes &Types = CGM.getTypes();
   3347   llvm::FunctionType *MethodTy =
   3348     Types.GetFunctionType(Types.arrangeObjCMethodDeclaration(OMD));
   3349   llvm::Function *Method =
   3350     llvm::Function::Create(MethodTy,
   3351                            llvm::GlobalValue::InternalLinkage,
   3352                            Name.str(),
   3353                            &CGM.getModule());
   3354   MethodDefinitions.insert(std::make_pair(OMD, Method));
   3355 
   3356   return Method;
   3357 }
   3358 
   3359 llvm::GlobalVariable *CGObjCCommonMac::CreateMetadataVar(Twine Name,
   3360                                                          llvm::Constant *Init,
   3361                                                          StringRef Section,
   3362                                                          unsigned Align,
   3363                                                          bool AddToUsed) {
   3364   llvm::Type *Ty = Init->getType();
   3365   llvm::GlobalVariable *GV =
   3366     new llvm::GlobalVariable(CGM.getModule(), Ty, false,
   3367                              llvm::GlobalValue::PrivateLinkage, Init, Name);
   3368   if (!Section.empty())
   3369     GV->setSection(Section);
   3370   if (Align)
   3371     GV->setAlignment(Align);
   3372   if (AddToUsed)
   3373     CGM.addCompilerUsedGlobal(GV);
   3374   return GV;
   3375 }
   3376 
   3377 llvm::Function *CGObjCMac::ModuleInitFunction() {
   3378   // Abuse this interface function as a place to finalize.
   3379   FinishModule();
   3380   return nullptr;
   3381 }
   3382 
   3383 llvm::Constant *CGObjCMac::GetPropertyGetFunction() {
   3384   return ObjCTypes.getGetPropertyFn();
   3385 }
   3386 
   3387 llvm::Constant *CGObjCMac::GetPropertySetFunction() {
   3388   return ObjCTypes.getSetPropertyFn();
   3389 }
   3390 
   3391 llvm::Constant *CGObjCMac::GetOptimizedPropertySetFunction(bool atomic,
   3392                                                            bool copy) {
   3393   return ObjCTypes.getOptimizedSetPropertyFn(atomic, copy);
   3394 }
   3395 
   3396 llvm::Constant *CGObjCMac::GetGetStructFunction() {
   3397   return ObjCTypes.getCopyStructFn();
   3398 }
   3399 llvm::Constant *CGObjCMac::GetSetStructFunction() {
   3400   return ObjCTypes.getCopyStructFn();
   3401 }
   3402 
   3403 llvm::Constant *CGObjCMac::GetCppAtomicObjectGetFunction() {
   3404   return ObjCTypes.getCppAtomicObjectFunction();
   3405 }
   3406 llvm::Constant *CGObjCMac::GetCppAtomicObjectSetFunction() {
   3407   return ObjCTypes.getCppAtomicObjectFunction();
   3408 }
   3409 
   3410 llvm::Constant *CGObjCMac::EnumerationMutationFunction() {
   3411   return ObjCTypes.getEnumerationMutationFn();
   3412 }
   3413 
   3414 void CGObjCMac::EmitTryStmt(CodeGenFunction &CGF, const ObjCAtTryStmt &S) {
   3415   return EmitTryOrSynchronizedStmt(CGF, S);
   3416 }
   3417 
   3418 void CGObjCMac::EmitSynchronizedStmt(CodeGenFunction &CGF,
   3419                                      const ObjCAtSynchronizedStmt &S) {
   3420   return EmitTryOrSynchronizedStmt(CGF, S);
   3421 }
   3422 
   3423 namespace {
   3424   struct PerformFragileFinally : EHScopeStack::Cleanup {
   3425     const Stmt &S;
   3426     llvm::Value *SyncArgSlot;
   3427     llvm::Value *CallTryExitVar;
   3428     llvm::Value *ExceptionData;
   3429     ObjCTypesHelper &ObjCTypes;
   3430     PerformFragileFinally(const Stmt *S,
   3431                           llvm::Value *SyncArgSlot,
   3432                           llvm::Value *CallTryExitVar,
   3433                           llvm::Value *ExceptionData,
   3434                           ObjCTypesHelper *ObjCTypes)
   3435       : S(*S), SyncArgSlot(SyncArgSlot), CallTryExitVar(CallTryExitVar),
   3436         ExceptionData(ExceptionData), ObjCTypes(*ObjCTypes) {}
   3437 
   3438     void Emit(CodeGenFunction &CGF, Flags flags) override {
   3439       // Check whether we need to call objc_exception_try_exit.
   3440       // In optimized code, this branch will always be folded.
   3441       llvm::BasicBlock *FinallyCallExit =
   3442         CGF.createBasicBlock("finally.call_exit");
   3443       llvm::BasicBlock *FinallyNoCallExit =
   3444         CGF.createBasicBlock("finally.no_call_exit");
   3445       CGF.Builder.CreateCondBr(CGF.Builder.CreateLoad(CallTryExitVar),
   3446                                FinallyCallExit, FinallyNoCallExit);
   3447 
   3448       CGF.EmitBlock(FinallyCallExit);
   3449       CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionTryExitFn(),
   3450                                   ExceptionData);
   3451 
   3452       CGF.EmitBlock(FinallyNoCallExit);
   3453 
   3454       if (isa<ObjCAtTryStmt>(S)) {
   3455         if (const ObjCAtFinallyStmt* FinallyStmt =
   3456               cast<ObjCAtTryStmt>(S).getFinallyStmt()) {
   3457           // Don't try to do the @finally if this is an EH cleanup.
   3458           if (flags.isForEHCleanup()) return;
   3459 
   3460           // Save the current cleanup destination in case there's
   3461           // control flow inside the finally statement.
   3462           llvm::Value *CurCleanupDest =
   3463             CGF.Builder.CreateLoad(CGF.getNormalCleanupDestSlot());
   3464 
   3465           CGF.EmitStmt(FinallyStmt->getFinallyBody());
   3466 
   3467           if (CGF.HaveInsertPoint()) {
   3468             CGF.Builder.CreateStore(CurCleanupDest,
   3469                                     CGF.getNormalCleanupDestSlot());
   3470           } else {
   3471             // Currently, the end of the cleanup must always exist.
   3472             CGF.EnsureInsertPoint();
   3473           }
   3474         }
   3475       } else {
   3476         // Emit objc_sync_exit(expr); as finally's sole statement for
   3477         // @synchronized.
   3478         llvm::Value *SyncArg = CGF.Builder.CreateLoad(SyncArgSlot);
   3479         CGF.EmitNounwindRuntimeCall(ObjCTypes.getSyncExitFn(), SyncArg);
   3480       }
   3481     }
   3482   };
   3483 
   3484   class FragileHazards {
   3485     CodeGenFunction &CGF;
   3486     SmallVector<llvm::Value*, 20> Locals;
   3487     llvm::DenseSet<llvm::BasicBlock*> BlocksBeforeTry;
   3488 
   3489     llvm::InlineAsm *ReadHazard;
   3490     llvm::InlineAsm *WriteHazard;
   3491 
   3492     llvm::FunctionType *GetAsmFnType();
   3493 
   3494     void collectLocals();
   3495     void emitReadHazard(CGBuilderTy &Builder);
   3496 
   3497   public:
   3498     FragileHazards(CodeGenFunction &CGF);
   3499 
   3500     void emitWriteHazard();
   3501     void emitHazardsInNewBlocks();
   3502   };
   3503 }
   3504 
   3505 /// Create the fragile-ABI read and write hazards based on the current
   3506 /// state of the function, which is presumed to be immediately prior
   3507 /// to a @try block.  These hazards are used to maintain correct
   3508 /// semantics in the face of optimization and the fragile ABI's
   3509 /// cavalier use of setjmp/longjmp.
   3510 FragileHazards::FragileHazards(CodeGenFunction &CGF) : CGF(CGF) {
   3511   collectLocals();
   3512 
   3513   if (Locals.empty()) return;
   3514 
   3515   // Collect all the blocks in the function.
   3516   for (llvm::Function::iterator
   3517          I = CGF.CurFn->begin(), E = CGF.CurFn->end(); I != E; ++I)
   3518     BlocksBeforeTry.insert(&*I);
   3519 
   3520   llvm::FunctionType *AsmFnTy = GetAsmFnType();
   3521 
   3522   // Create a read hazard for the allocas.  This inhibits dead-store
   3523   // optimizations and forces the values to memory.  This hazard is
   3524   // inserted before any 'throwing' calls in the protected scope to
   3525   // reflect the possibility that the variables might be read from the
   3526   // catch block if the call throws.
   3527   {
   3528     std::string Constraint;
   3529     for (unsigned I = 0, E = Locals.size(); I != E; ++I) {
   3530       if (I) Constraint += ',';
   3531       Constraint += "*m";
   3532     }
   3533 
   3534     ReadHazard = llvm::InlineAsm::get(AsmFnTy, "", Constraint, true, false);
   3535   }
   3536 
   3537   // Create a write hazard for the allocas.  This inhibits folding
   3538   // loads across the hazard.  This hazard is inserted at the
   3539   // beginning of the catch path to reflect the possibility that the
   3540   // variables might have been written within the protected scope.
   3541   {
   3542     std::string Constraint;
   3543     for (unsigned I = 0, E = Locals.size(); I != E; ++I) {
   3544       if (I) Constraint += ',';
   3545       Constraint += "=*m";
   3546     }
   3547 
   3548     WriteHazard = llvm::InlineAsm::get(AsmFnTy, "", Constraint, true, false);
   3549   }
   3550 }
   3551 
   3552 /// Emit a write hazard at the current location.
   3553 void FragileHazards::emitWriteHazard() {
   3554   if (Locals.empty()) return;
   3555 
   3556   CGF.EmitNounwindRuntimeCall(WriteHazard, Locals);
   3557 }
   3558 
   3559 void FragileHazards::emitReadHazard(CGBuilderTy &Builder) {
   3560   assert(!Locals.empty());
   3561   llvm::CallInst *call = Builder.CreateCall(ReadHazard, Locals);
   3562   call->setDoesNotThrow();
   3563   call->setCallingConv(CGF.getRuntimeCC());
   3564 }
   3565 
   3566 /// Emit read hazards in all the protected blocks, i.e. all the blocks
   3567 /// which have been inserted since the beginning of the try.
   3568 void FragileHazards::emitHazardsInNewBlocks() {
   3569   if (Locals.empty()) return;
   3570 
   3571   CGBuilderTy Builder(CGF.getLLVMContext());
   3572 
   3573   // Iterate through all blocks, skipping those prior to the try.
   3574   for (llvm::Function::iterator
   3575          FI = CGF.CurFn->begin(), FE = CGF.CurFn->end(); FI != FE; ++FI) {
   3576     llvm::BasicBlock &BB = *FI;
   3577     if (BlocksBeforeTry.count(&BB)) continue;
   3578 
   3579     // Walk through all the calls in the block.
   3580     for (llvm::BasicBlock::iterator
   3581            BI = BB.begin(), BE = BB.end(); BI != BE; ++BI) {
   3582       llvm::Instruction &I = *BI;
   3583 
   3584       // Ignore instructions that aren't non-intrinsic calls.
   3585       // These are the only calls that can possibly call longjmp.
   3586       if (!isa<llvm::CallInst>(I) && !isa<llvm::InvokeInst>(I)) continue;
   3587       if (isa<llvm::IntrinsicInst>(I))
   3588         continue;
   3589 
   3590       // Ignore call sites marked nounwind.  This may be questionable,
   3591       // since 'nounwind' doesn't necessarily mean 'does not call longjmp'.
   3592       llvm::CallSite CS(&I);
   3593       if (CS.doesNotThrow()) continue;
   3594 
   3595       // Insert a read hazard before the call.  This will ensure that
   3596       // any writes to the locals are performed before making the
   3597       // call.  If the call throws, then this is sufficient to
   3598       // guarantee correctness as long as it doesn't also write to any
   3599       // locals.
   3600       Builder.SetInsertPoint(&BB, BI);
   3601       emitReadHazard(Builder);
   3602     }
   3603   }
   3604 }
   3605 
   3606 static void addIfPresent(llvm::DenseSet<llvm::Value*> &S, llvm::Value *V) {
   3607   if (V) S.insert(V);
   3608 }
   3609 
   3610 void FragileHazards::collectLocals() {
   3611   // Compute a set of allocas to ignore.
   3612   llvm::DenseSet<llvm::Value*> AllocasToIgnore;
   3613   addIfPresent(AllocasToIgnore, CGF.ReturnValue);
   3614   addIfPresent(AllocasToIgnore, CGF.NormalCleanupDest);
   3615 
   3616   // Collect all the allocas currently in the function.  This is
   3617   // probably way too aggressive.
   3618   llvm::BasicBlock &Entry = CGF.CurFn->getEntryBlock();
   3619   for (llvm::BasicBlock::iterator
   3620          I = Entry.begin(), E = Entry.end(); I != E; ++I)
   3621     if (isa<llvm::AllocaInst>(*I) && !AllocasToIgnore.count(&*I))
   3622       Locals.push_back(&*I);
   3623 }
   3624 
   3625 llvm::FunctionType *FragileHazards::GetAsmFnType() {
   3626   SmallVector<llvm::Type *, 16> tys(Locals.size());
   3627   for (unsigned i = 0, e = Locals.size(); i != e; ++i)
   3628     tys[i] = Locals[i]->getType();
   3629   return llvm::FunctionType::get(CGF.VoidTy, tys, false);
   3630 }
   3631 
   3632 /*
   3633 
   3634   Objective-C setjmp-longjmp (sjlj) Exception Handling
   3635   --
   3636 
   3637   A catch buffer is a setjmp buffer plus:
   3638     - a pointer to the exception that was caught
   3639     - a pointer to the previous exception data buffer
   3640     - two pointers of reserved storage
   3641   Therefore catch buffers form a stack, with a pointer to the top
   3642   of the stack kept in thread-local storage.
   3643 
   3644   objc_exception_try_enter pushes a catch buffer onto the EH stack.
   3645   objc_exception_try_exit pops the given catch buffer, which is
   3646     required to be the top of the EH stack.
   3647   objc_exception_throw pops the top of the EH stack, writes the
   3648     thrown exception into the appropriate field, and longjmps
   3649     to the setjmp buffer.  It crashes the process (with a printf
   3650     and an abort()) if there are no catch buffers on the stack.
   3651   objc_exception_extract just reads the exception pointer out of the
   3652     catch buffer.
   3653 
   3654   There's no reason an implementation couldn't use a light-weight
   3655   setjmp here --- something like __builtin_setjmp, but API-compatible
   3656   with the heavyweight setjmp.  This will be more important if we ever
   3657   want to implement correct ObjC/C++ exception interactions for the
   3658   fragile ABI.
   3659 
   3660   Note that for this use of setjmp/longjmp to be correct, we may need
   3661   to mark some local variables volatile: if a non-volatile local
   3662   variable is modified between the setjmp and the longjmp, it has
   3663   indeterminate value.  For the purposes of LLVM IR, it may be
   3664   sufficient to make loads and stores within the @try (to variables
   3665   declared outside the @try) volatile.  This is necessary for
   3666   optimized correctness, but is not currently being done; this is
   3667   being tracked as rdar://problem/8160285
   3668 
   3669   The basic framework for a @try-catch-finally is as follows:
   3670   {
   3671   objc_exception_data d;
   3672   id _rethrow = null;
   3673   bool _call_try_exit = true;
   3674 
   3675   objc_exception_try_enter(&d);
   3676   if (!setjmp(d.jmp_buf)) {
   3677   ... try body ...
   3678   } else {
   3679   // exception path
   3680   id _caught = objc_exception_extract(&d);
   3681 
   3682   // enter new try scope for handlers
   3683   if (!setjmp(d.jmp_buf)) {
   3684   ... match exception and execute catch blocks ...
   3685 
   3686   // fell off end, rethrow.
   3687   _rethrow = _caught;
   3688   ... jump-through-finally to finally_rethrow ...
   3689   } else {
   3690   // exception in catch block
   3691   _rethrow = objc_exception_extract(&d);
   3692   _call_try_exit = false;
   3693   ... jump-through-finally to finally_rethrow ...
   3694   }
   3695   }
   3696   ... jump-through-finally to finally_end ...
   3697 
   3698   finally:
   3699   if (_call_try_exit)
   3700   objc_exception_try_exit(&d);
   3701 
   3702   ... finally block ....
   3703   ... dispatch to finally destination ...
   3704 
   3705   finally_rethrow:
   3706   objc_exception_throw(_rethrow);
   3707 
   3708   finally_end:
   3709   }
   3710 
   3711   This framework differs slightly from the one gcc uses, in that gcc
   3712   uses _rethrow to determine if objc_exception_try_exit should be called
   3713   and if the object should be rethrown. This breaks in the face of
   3714   throwing nil and introduces unnecessary branches.
   3715 
   3716   We specialize this framework for a few particular circumstances:
   3717 
   3718   - If there are no catch blocks, then we avoid emitting the second
   3719   exception handling context.
   3720 
   3721   - If there is a catch-all catch block (i.e. @catch(...) or @catch(id
   3722   e)) we avoid emitting the code to rethrow an uncaught exception.
   3723 
   3724   - FIXME: If there is no @finally block we can do a few more
   3725   simplifications.
   3726 
   3727   Rethrows and Jumps-Through-Finally
   3728   --
   3729 
   3730   '@throw;' is supported by pushing the currently-caught exception
   3731   onto ObjCEHStack while the @catch blocks are emitted.
   3732 
   3733   Branches through the @finally block are handled with an ordinary
   3734   normal cleanup.  We do not register an EH cleanup; fragile-ABI ObjC
   3735   exceptions are not compatible with C++ exceptions, and this is
   3736   hardly the only place where this will go wrong.
   3737 
   3738   @synchronized(expr) { stmt; } is emitted as if it were:
   3739     id synch_value = expr;
   3740     objc_sync_enter(synch_value);
   3741     @try { stmt; } @finally { objc_sync_exit(synch_value); }
   3742 */
   3743 
   3744 void CGObjCMac::EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
   3745                                           const Stmt &S) {
   3746   bool isTry = isa<ObjCAtTryStmt>(S);
   3747 
   3748   // A destination for the fall-through edges of the catch handlers to
   3749   // jump to.
   3750   CodeGenFunction::JumpDest FinallyEnd =
   3751     CGF.getJumpDestInCurrentScope("finally.end");
   3752 
   3753   // A destination for the rethrow edge of the catch handlers to jump
   3754   // to.
   3755   CodeGenFunction::JumpDest FinallyRethrow =
   3756     CGF.getJumpDestInCurrentScope("finally.rethrow");
   3757 
   3758   // For @synchronized, call objc_sync_enter(sync.expr). The
   3759   // evaluation of the expression must occur before we enter the
   3760   // @synchronized.  We can't avoid a temp here because we need the
   3761   // value to be preserved.  If the backend ever does liveness
   3762   // correctly after setjmp, this will be unnecessary.
   3763   llvm::Value *SyncArgSlot = nullptr;
   3764   if (!isTry) {
   3765     llvm::Value *SyncArg =
   3766       CGF.EmitScalarExpr(cast<ObjCAtSynchronizedStmt>(S).getSynchExpr());
   3767     SyncArg = CGF.Builder.CreateBitCast(SyncArg, ObjCTypes.ObjectPtrTy);
   3768     CGF.EmitNounwindRuntimeCall(ObjCTypes.getSyncEnterFn(), SyncArg);
   3769 
   3770     SyncArgSlot = CGF.CreateTempAlloca(SyncArg->getType(), "sync.arg");
   3771     CGF.Builder.CreateStore(SyncArg, SyncArgSlot);
   3772   }
   3773 
   3774   // Allocate memory for the setjmp buffer.  This needs to be kept
   3775   // live throughout the try and catch blocks.
   3776   llvm::Value *ExceptionData = CGF.CreateTempAlloca(ObjCTypes.ExceptionDataTy,
   3777                                                     "exceptiondata.ptr");
   3778 
   3779   // Create the fragile hazards.  Note that this will not capture any
   3780   // of the allocas required for exception processing, but will
   3781   // capture the current basic block (which extends all the way to the
   3782   // setjmp call) as "before the @try".
   3783   FragileHazards Hazards(CGF);
   3784 
   3785   // Create a flag indicating whether the cleanup needs to call
   3786   // objc_exception_try_exit.  This is true except when
   3787   //   - no catches match and we're branching through the cleanup
   3788   //     just to rethrow the exception, or
   3789   //   - a catch matched and we're falling out of the catch handler.
   3790   // The setjmp-safety rule here is that we should always store to this
   3791   // variable in a place that dominates the branch through the cleanup
   3792   // without passing through any setjmps.
   3793   llvm::Value *CallTryExitVar = CGF.CreateTempAlloca(CGF.Builder.getInt1Ty(),
   3794                                                      "_call_try_exit");
   3795 
   3796   // A slot containing the exception to rethrow.  Only needed when we
   3797   // have both a @catch and a @finally.
   3798   llvm::Value *PropagatingExnVar = nullptr;
   3799 
   3800   // Push a normal cleanup to leave the try scope.
   3801   CGF.EHStack.pushCleanup<PerformFragileFinally>(NormalAndEHCleanup, &S,
   3802                                                  SyncArgSlot,
   3803                                                  CallTryExitVar,
   3804                                                  ExceptionData,
   3805                                                  &ObjCTypes);
   3806 
   3807   // Enter a try block:
   3808   //  - Call objc_exception_try_enter to push ExceptionData on top of
   3809   //    the EH stack.
   3810   CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionTryEnterFn(),
   3811                               ExceptionData);
   3812 
   3813   //  - Call setjmp on the exception data buffer.
   3814   llvm::Constant *Zero = llvm::ConstantInt::get(CGF.Builder.getInt32Ty(), 0);
   3815   llvm::Value *GEPIndexes[] = { Zero, Zero, Zero };
   3816   llvm::Value *SetJmpBuffer = CGF.Builder.CreateGEP(
   3817       ObjCTypes.ExceptionDataTy, ExceptionData, GEPIndexes, "setjmp_buffer");
   3818   llvm::CallInst *SetJmpResult = CGF.EmitNounwindRuntimeCall(
   3819       ObjCTypes.getSetJmpFn(), SetJmpBuffer, "setjmp_result");
   3820   SetJmpResult->setCanReturnTwice();
   3821 
   3822   // If setjmp returned 0, enter the protected block; otherwise,
   3823   // branch to the handler.
   3824   llvm::BasicBlock *TryBlock = CGF.createBasicBlock("try");
   3825   llvm::BasicBlock *TryHandler = CGF.createBasicBlock("try.handler");
   3826   llvm::Value *DidCatch =
   3827     CGF.Builder.CreateIsNotNull(SetJmpResult, "did_catch_exception");
   3828   CGF.Builder.CreateCondBr(DidCatch, TryHandler, TryBlock);
   3829 
   3830   // Emit the protected block.
   3831   CGF.EmitBlock(TryBlock);
   3832   CGF.Builder.CreateStore(CGF.Builder.getTrue(), CallTryExitVar);
   3833   CGF.EmitStmt(isTry ? cast<ObjCAtTryStmt>(S).getTryBody()
   3834                      : cast<ObjCAtSynchronizedStmt>(S).getSynchBody());
   3835 
   3836   CGBuilderTy::InsertPoint TryFallthroughIP = CGF.Builder.saveAndClearIP();
   3837 
   3838   // Emit the exception handler block.
   3839   CGF.EmitBlock(TryHandler);
   3840 
   3841   // Don't optimize loads of the in-scope locals across this point.
   3842   Hazards.emitWriteHazard();
   3843 
   3844   // For a @synchronized (or a @try with no catches), just branch
   3845   // through the cleanup to the rethrow block.
   3846   if (!isTry || !cast<ObjCAtTryStmt>(S).getNumCatchStmts()) {
   3847     // Tell the cleanup not to re-pop the exit.
   3848     CGF.Builder.CreateStore(CGF.Builder.getFalse(), CallTryExitVar);
   3849     CGF.EmitBranchThroughCleanup(FinallyRethrow);
   3850 
   3851   // Otherwise, we have to match against the caught exceptions.
   3852   } else {
   3853     // Retrieve the exception object.  We may emit multiple blocks but
   3854     // nothing can cross this so the value is already in SSA form.
   3855     llvm::CallInst *Caught =
   3856       CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionExtractFn(),
   3857                                   ExceptionData, "caught");
   3858 
   3859     // Push the exception to rethrow onto the EH value stack for the
   3860     // benefit of any @throws in the handlers.
   3861     CGF.ObjCEHValueStack.push_back(Caught);
   3862 
   3863     const ObjCAtTryStmt* AtTryStmt = cast<ObjCAtTryStmt>(&S);
   3864 
   3865     bool HasFinally = (AtTryStmt->getFinallyStmt() != nullptr);
   3866 
   3867     llvm::BasicBlock *CatchBlock = nullptr;
   3868     llvm::BasicBlock *CatchHandler = nullptr;
   3869     if (HasFinally) {
   3870       // Save the currently-propagating exception before
   3871       // objc_exception_try_enter clears the exception slot.
   3872       PropagatingExnVar = CGF.CreateTempAlloca(Caught->getType(),
   3873                                                "propagating_exception");
   3874       CGF.Builder.CreateStore(Caught, PropagatingExnVar);
   3875 
   3876       // Enter a new exception try block (in case a @catch block
   3877       // throws an exception).
   3878       CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionTryEnterFn(),
   3879                                   ExceptionData);
   3880 
   3881       llvm::CallInst *SetJmpResult =
   3882         CGF.EmitNounwindRuntimeCall(ObjCTypes.getSetJmpFn(),
   3883                                     SetJmpBuffer, "setjmp.result");
   3884       SetJmpResult->setCanReturnTwice();
   3885 
   3886       llvm::Value *Threw =
   3887         CGF.Builder.CreateIsNotNull(SetJmpResult, "did_catch_exception");
   3888 
   3889       CatchBlock = CGF.createBasicBlock("catch");
   3890       CatchHandler = CGF.createBasicBlock("catch_for_catch");
   3891       CGF.Builder.CreateCondBr(Threw, CatchHandler, CatchBlock);
   3892 
   3893       CGF.EmitBlock(CatchBlock);
   3894     }
   3895 
   3896     CGF.Builder.CreateStore(CGF.Builder.getInt1(HasFinally), CallTryExitVar);
   3897 
   3898     // Handle catch list. As a special case we check if everything is
   3899     // matched and avoid generating code for falling off the end if
   3900     // so.
   3901     bool AllMatched = false;
   3902     for (unsigned I = 0, N = AtTryStmt->getNumCatchStmts(); I != N; ++I) {
   3903       const ObjCAtCatchStmt *CatchStmt = AtTryStmt->getCatchStmt(I);
   3904 
   3905       const VarDecl *CatchParam = CatchStmt->getCatchParamDecl();
   3906       const ObjCObjectPointerType *OPT = nullptr;
   3907 
   3908       // catch(...) always matches.
   3909       if (!CatchParam) {
   3910         AllMatched = true;
   3911       } else {
   3912         OPT = CatchParam->getType()->getAs<ObjCObjectPointerType>();
   3913 
   3914         // catch(id e) always matches under this ABI, since only
   3915         // ObjC exceptions end up here in the first place.
   3916         // FIXME: For the time being we also match id<X>; this should
   3917         // be rejected by Sema instead.
   3918         if (OPT && (OPT->isObjCIdType() || OPT->isObjCQualifiedIdType()))
   3919           AllMatched = true;
   3920       }
   3921 
   3922       // If this is a catch-all, we don't need to test anything.
   3923       if (AllMatched) {
   3924         CodeGenFunction::RunCleanupsScope CatchVarCleanups(CGF);
   3925 
   3926         if (CatchParam) {
   3927           CGF.EmitAutoVarDecl(*CatchParam);
   3928           assert(CGF.HaveInsertPoint() && "DeclStmt destroyed insert point?");
   3929 
   3930           // These types work out because ConvertType(id) == i8*.
   3931           CGF.Builder.CreateStore(Caught, CGF.GetAddrOfLocalVar(CatchParam));
   3932         }
   3933 
   3934         CGF.EmitStmt(CatchStmt->getCatchBody());
   3935 
   3936         // The scope of the catch variable ends right here.
   3937         CatchVarCleanups.ForceCleanup();
   3938 
   3939         CGF.EmitBranchThroughCleanup(FinallyEnd);
   3940         break;
   3941       }
   3942 
   3943       assert(OPT && "Unexpected non-object pointer type in @catch");
   3944       const ObjCObjectType *ObjTy = OPT->getObjectType();
   3945 
   3946       // FIXME: @catch (Class c) ?
   3947       ObjCInterfaceDecl *IDecl = ObjTy->getInterface();
   3948       assert(IDecl && "Catch parameter must have Objective-C type!");
   3949 
   3950       // Check if the @catch block matches the exception object.
   3951       llvm::Value *Class = EmitClassRef(CGF, IDecl);
   3952 
   3953       llvm::Value *matchArgs[] = { Class, Caught };
   3954       llvm::CallInst *Match =
   3955         CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionMatchFn(),
   3956                                     matchArgs, "match");
   3957 
   3958       llvm::BasicBlock *MatchedBlock = CGF.createBasicBlock("match");
   3959       llvm::BasicBlock *NextCatchBlock = CGF.createBasicBlock("catch.next");
   3960 
   3961       CGF.Builder.CreateCondBr(CGF.Builder.CreateIsNotNull(Match, "matched"),
   3962                                MatchedBlock, NextCatchBlock);
   3963 
   3964       // Emit the @catch block.
   3965       CGF.EmitBlock(MatchedBlock);
   3966 
   3967       // Collect any cleanups for the catch variable.  The scope lasts until
   3968       // the end of the catch body.
   3969       CodeGenFunction::RunCleanupsScope CatchVarCleanups(CGF);
   3970 
   3971       CGF.EmitAutoVarDecl(*CatchParam);
   3972       assert(CGF.HaveInsertPoint() && "DeclStmt destroyed insert point?");
   3973 
   3974       // Initialize the catch variable.
   3975       llvm::Value *Tmp =
   3976         CGF.Builder.CreateBitCast(Caught,
   3977                                   CGF.ConvertType(CatchParam->getType()));
   3978       CGF.Builder.CreateStore(Tmp, CGF.GetAddrOfLocalVar(CatchParam));
   3979 
   3980       CGF.EmitStmt(CatchStmt->getCatchBody());
   3981 
   3982       // We're done with the catch variable.
   3983       CatchVarCleanups.ForceCleanup();
   3984 
   3985       CGF.EmitBranchThroughCleanup(FinallyEnd);
   3986 
   3987       CGF.EmitBlock(NextCatchBlock);
   3988     }
   3989 
   3990     CGF.ObjCEHValueStack.pop_back();
   3991 
   3992     // If nothing wanted anything to do with the caught exception,
   3993     // kill the extract call.
   3994     if (Caught->use_empty())
   3995       Caught->eraseFromParent();
   3996 
   3997     if (!AllMatched)
   3998       CGF.EmitBranchThroughCleanup(FinallyRethrow);
   3999 
   4000     if (HasFinally) {
   4001       // Emit the exception handler for the @catch blocks.
   4002       CGF.EmitBlock(CatchHandler);
   4003 
   4004       // In theory we might now need a write hazard, but actually it's
   4005       // unnecessary because there's no local-accessing code between
   4006       // the try's write hazard and here.
   4007       //Hazards.emitWriteHazard();
   4008 
   4009       // Extract the new exception and save it to the
   4010       // propagating-exception slot.
   4011       assert(PropagatingExnVar);
   4012       llvm::CallInst *NewCaught =
   4013         CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionExtractFn(),
   4014                                     ExceptionData, "caught");
   4015       CGF.Builder.CreateStore(NewCaught, PropagatingExnVar);
   4016 
   4017       // Don't pop the catch handler; the throw already did.
   4018       CGF.Builder.CreateStore(CGF.Builder.getFalse(), CallTryExitVar);
   4019       CGF.EmitBranchThroughCleanup(FinallyRethrow);
   4020     }
   4021   }
   4022 
   4023   // Insert read hazards as required in the new blocks.
   4024   Hazards.emitHazardsInNewBlocks();
   4025 
   4026   // Pop the cleanup.
   4027   CGF.Builder.restoreIP(TryFallthroughIP);
   4028   if (CGF.HaveInsertPoint())
   4029     CGF.Builder.CreateStore(CGF.Builder.getTrue(), CallTryExitVar);
   4030   CGF.PopCleanupBlock();
   4031   CGF.EmitBlock(FinallyEnd.getBlock(), true);
   4032 
   4033   // Emit the rethrow block.
   4034   CGBuilderTy::InsertPoint SavedIP = CGF.Builder.saveAndClearIP();
   4035   CGF.EmitBlock(FinallyRethrow.getBlock(), true);
   4036   if (CGF.HaveInsertPoint()) {
   4037     // If we have a propagating-exception variable, check it.
   4038     llvm::Value *PropagatingExn;
   4039     if (PropagatingExnVar) {
   4040       PropagatingExn = CGF.Builder.CreateLoad(PropagatingExnVar);
   4041 
   4042     // Otherwise, just look in the buffer for the exception to throw.
   4043     } else {
   4044       llvm::CallInst *Caught =
   4045         CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionExtractFn(),
   4046                                     ExceptionData);
   4047       PropagatingExn = Caught;
   4048     }
   4049 
   4050     CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionThrowFn(),
   4051                                 PropagatingExn);
   4052     CGF.Builder.CreateUnreachable();
   4053   }
   4054 
   4055   CGF.Builder.restoreIP(SavedIP);
   4056 }
   4057 
   4058 void CGObjCMac::EmitThrowStmt(CodeGen::CodeGenFunction &CGF,
   4059                               const ObjCAtThrowStmt &S,
   4060                               bool ClearInsertionPoint) {
   4061   llvm::Value *ExceptionAsObject;
   4062 
   4063   if (const Expr *ThrowExpr = S.getThrowExpr()) {
   4064     llvm::Value *Exception = CGF.EmitObjCThrowOperand(ThrowExpr);
   4065     ExceptionAsObject =
   4066       CGF.Builder.CreateBitCast(Exception, ObjCTypes.ObjectPtrTy);
   4067   } else {
   4068     assert((!CGF.ObjCEHValueStack.empty() && CGF.ObjCEHValueStack.back()) &&
   4069            "Unexpected rethrow outside @catch block.");
   4070     ExceptionAsObject = CGF.ObjCEHValueStack.back();
   4071   }
   4072 
   4073   CGF.EmitRuntimeCall(ObjCTypes.getExceptionThrowFn(), ExceptionAsObject)
   4074     ->setDoesNotReturn();
   4075   CGF.Builder.CreateUnreachable();
   4076 
   4077   // Clear the insertion point to indicate we are in unreachable code.
   4078   if (ClearInsertionPoint)
   4079     CGF.Builder.ClearInsertionPoint();
   4080 }
   4081 
   4082 /// EmitObjCWeakRead - Code gen for loading value of a __weak
   4083 /// object: objc_read_weak (id *src)
   4084 ///
   4085 llvm::Value * CGObjCMac::EmitObjCWeakRead(CodeGen::CodeGenFunction &CGF,
   4086                                           llvm::Value *AddrWeakObj) {
   4087   llvm::Type* DestTy =
   4088     cast<llvm::PointerType>(AddrWeakObj->getType())->getElementType();
   4089   AddrWeakObj = CGF.Builder.CreateBitCast(AddrWeakObj,
   4090                                           ObjCTypes.PtrObjectPtrTy);
   4091   llvm::Value *read_weak =
   4092     CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcReadWeakFn(),
   4093                                 AddrWeakObj, "weakread");
   4094   read_weak = CGF.Builder.CreateBitCast(read_weak, DestTy);
   4095   return read_weak;
   4096 }
   4097 
   4098 /// EmitObjCWeakAssign - Code gen for assigning to a __weak object.
   4099 /// objc_assign_weak (id src, id *dst)
   4100 ///
   4101 void CGObjCMac::EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF,
   4102                                    llvm::Value *src, llvm::Value *dst) {
   4103   llvm::Type * SrcTy = src->getType();
   4104   if (!isa<llvm::PointerType>(SrcTy)) {
   4105     unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
   4106     assert(Size <= 8 && "does not support size > 8");
   4107     src = (Size == 4) ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy)
   4108       : CGF.Builder.CreateBitCast(src, ObjCTypes.LongLongTy);
   4109     src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
   4110   }
   4111   src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
   4112   dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
   4113   llvm::Value *args[] = { src, dst };
   4114   CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignWeakFn(),
   4115                               args, "weakassign");
   4116   return;
   4117 }
   4118 
   4119 /// EmitObjCGlobalAssign - Code gen for assigning to a __strong object.
   4120 /// objc_assign_global (id src, id *dst)
   4121 ///
   4122 void CGObjCMac::EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF,
   4123                                      llvm::Value *src, llvm::Value *dst,
   4124                                      bool threadlocal) {
   4125   llvm::Type * SrcTy = src->getType();
   4126   if (!isa<llvm::PointerType>(SrcTy)) {
   4127     unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
   4128     assert(Size <= 8 && "does not support size > 8");
   4129     src = (Size == 4) ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy)
   4130       : CGF.Builder.CreateBitCast(src, ObjCTypes.LongLongTy);
   4131     src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
   4132   }
   4133   src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
   4134   dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
   4135   llvm::Value *args[] = { src, dst };
   4136   if (!threadlocal)
   4137     CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignGlobalFn(),
   4138                                 args, "globalassign");
   4139   else
   4140     CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignThreadLocalFn(),
   4141                                 args, "threadlocalassign");
   4142   return;
   4143 }
   4144 
   4145 /// EmitObjCIvarAssign - Code gen for assigning to a __strong object.
   4146 /// objc_assign_ivar (id src, id *dst, ptrdiff_t ivaroffset)
   4147 ///
   4148 void CGObjCMac::EmitObjCIvarAssign(CodeGen::CodeGenFunction &CGF,
   4149                                    llvm::Value *src, llvm::Value *dst,
   4150                                    llvm::Value *ivarOffset) {
   4151   assert(ivarOffset && "EmitObjCIvarAssign - ivarOffset is NULL");
   4152   llvm::Type * SrcTy = src->getType();
   4153   if (!isa<llvm::PointerType>(SrcTy)) {
   4154     unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
   4155     assert(Size <= 8 && "does not support size > 8");
   4156     src = (Size == 4) ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy)
   4157       : CGF.Builder.CreateBitCast(src, ObjCTypes.LongLongTy);
   4158     src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
   4159   }
   4160   src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
   4161   dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
   4162   llvm::Value *args[] = { src, dst, ivarOffset };
   4163   CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignIvarFn(), args);
   4164   return;
   4165 }
   4166 
   4167 /// EmitObjCStrongCastAssign - Code gen for assigning to a __strong cast object.
   4168 /// objc_assign_strongCast (id src, id *dst)
   4169 ///
   4170 void CGObjCMac::EmitObjCStrongCastAssign(CodeGen::CodeGenFunction &CGF,
   4171                                          llvm::Value *src, llvm::Value *dst) {
   4172   llvm::Type * SrcTy = src->getType();
   4173   if (!isa<llvm::PointerType>(SrcTy)) {
   4174     unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
   4175     assert(Size <= 8 && "does not support size > 8");
   4176     src = (Size == 4) ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy)
   4177       : CGF.Builder.CreateBitCast(src, ObjCTypes.LongLongTy);
   4178     src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
   4179   }
   4180   src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
   4181   dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
   4182   llvm::Value *args[] = { src, dst };
   4183   CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignStrongCastFn(),
   4184                               args, "weakassign");
   4185   return;
   4186 }
   4187 
   4188 void CGObjCMac::EmitGCMemmoveCollectable(CodeGen::CodeGenFunction &CGF,
   4189                                          llvm::Value *DestPtr,
   4190                                          llvm::Value *SrcPtr,
   4191                                          llvm::Value *size) {
   4192   SrcPtr = CGF.Builder.CreateBitCast(SrcPtr, ObjCTypes.Int8PtrTy);
   4193   DestPtr = CGF.Builder.CreateBitCast(DestPtr, ObjCTypes.Int8PtrTy);
   4194   llvm::Value *args[] = { DestPtr, SrcPtr, size };
   4195   CGF.EmitNounwindRuntimeCall(ObjCTypes.GcMemmoveCollectableFn(), args);
   4196 }
   4197 
   4198 /// EmitObjCValueForIvar - Code Gen for ivar reference.
   4199 ///
   4200 LValue CGObjCMac::EmitObjCValueForIvar(CodeGen::CodeGenFunction &CGF,
   4201                                        QualType ObjectTy,
   4202                                        llvm::Value *BaseValue,
   4203                                        const ObjCIvarDecl *Ivar,
   4204                                        unsigned CVRQualifiers) {
   4205   const ObjCInterfaceDecl *ID =
   4206     ObjectTy->getAs<ObjCObjectType>()->getInterface();
   4207   return EmitValueForIvarAtOffset(CGF, ID, BaseValue, Ivar, CVRQualifiers,
   4208                                   EmitIvarOffset(CGF, ID, Ivar));
   4209 }
   4210 
   4211 llvm::Value *CGObjCMac::EmitIvarOffset(CodeGen::CodeGenFunction &CGF,
   4212                                        const ObjCInterfaceDecl *Interface,
   4213                                        const ObjCIvarDecl *Ivar) {
   4214   uint64_t Offset = ComputeIvarBaseOffset(CGM, Interface, Ivar);
   4215   return llvm::ConstantInt::get(
   4216     CGM.getTypes().ConvertType(CGM.getContext().LongTy),
   4217     Offset);
   4218 }
   4219 
   4220 /* *** Private Interface *** */
   4221 
   4222 /// EmitImageInfo - Emit the image info marker used to encode some module
   4223 /// level information.
   4224 ///
   4225 /// See: <rdr://4810609&4810587&4810587>
   4226 /// struct IMAGE_INFO {
   4227 ///   unsigned version;
   4228 ///   unsigned flags;
   4229 /// };
   4230 enum ImageInfoFlags {
   4231   eImageInfo_FixAndContinue      = (1 << 0), // This flag is no longer set by clang.
   4232   eImageInfo_GarbageCollected    = (1 << 1),
   4233   eImageInfo_GCOnly              = (1 << 2),
   4234   eImageInfo_OptimizedByDyld     = (1 << 3), // This flag is set by the dyld shared cache.
   4235 
   4236   // A flag indicating that the module has no instances of a @synthesize of a
   4237   // superclass variable. <rdar://problem/6803242>
   4238   eImageInfo_CorrectedSynthesize = (1 << 4), // This flag is no longer set by clang.
   4239   eImageInfo_ImageIsSimulated    = (1 << 5)
   4240 };
   4241 
   4242 void CGObjCCommonMac::EmitImageInfo() {
   4243   unsigned version = 0; // Version is unused?
   4244   const char *Section = (ObjCABI == 1) ?
   4245     "__OBJC, __image_info,regular" :
   4246     "__DATA, __objc_imageinfo, regular, no_dead_strip";
   4247 
   4248   // Generate module-level named metadata to convey this information to the
   4249   // linker and code-gen.
   4250   llvm::Module &Mod = CGM.getModule();
   4251 
   4252   // Add the ObjC ABI version to the module flags.
   4253   Mod.addModuleFlag(llvm::Module::Error, "Objective-C Version", ObjCABI);
   4254   Mod.addModuleFlag(llvm::Module::Error, "Objective-C Image Info Version",
   4255                     version);
   4256   Mod.addModuleFlag(llvm::Module::Error, "Objective-C Image Info Section",
   4257                     llvm::MDString::get(VMContext,Section));
   4258 
   4259   if (CGM.getLangOpts().getGC() == LangOptions::NonGC) {
   4260     // Non-GC overrides those files which specify GC.
   4261     Mod.addModuleFlag(llvm::Module::Override,
   4262                       "Objective-C Garbage Collection", (uint32_t)0);
   4263   } else {
   4264     // Add the ObjC garbage collection value.
   4265     Mod.addModuleFlag(llvm::Module::Error,
   4266                       "Objective-C Garbage Collection",
   4267                       eImageInfo_GarbageCollected);
   4268 
   4269     if (CGM.getLangOpts().getGC() == LangOptions::GCOnly) {
   4270       // Add the ObjC GC Only value.
   4271       Mod.addModuleFlag(llvm::Module::Error, "Objective-C GC Only",
   4272                         eImageInfo_GCOnly);
   4273 
   4274       // Require that GC be specified and set to eImageInfo_GarbageCollected.
   4275       llvm::Metadata *Ops[2] = {
   4276           llvm::MDString::get(VMContext, "Objective-C Garbage Collection"),
   4277           llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
   4278               llvm::Type::getInt32Ty(VMContext), eImageInfo_GarbageCollected))};
   4279       Mod.addModuleFlag(llvm::Module::Require, "Objective-C GC Only",
   4280                         llvm::MDNode::get(VMContext, Ops));
   4281     }
   4282   }
   4283 
   4284   // Indicate whether we're compiling this to run on a simulator.
   4285   const llvm::Triple &Triple = CGM.getTarget().getTriple();
   4286   if (Triple.isiOS() &&
   4287       (Triple.getArch() == llvm::Triple::x86 ||
   4288        Triple.getArch() == llvm::Triple::x86_64))
   4289     Mod.addModuleFlag(llvm::Module::Error, "Objective-C Is Simulated",
   4290                       eImageInfo_ImageIsSimulated);
   4291 }
   4292 
   4293 // struct objc_module {
   4294 //   unsigned long version;
   4295 //   unsigned long size;
   4296 //   const char *name;
   4297 //   Symtab symtab;
   4298 // };
   4299 
   4300 // FIXME: Get from somewhere
   4301 static const int ModuleVersion = 7;
   4302 
   4303 void CGObjCMac::EmitModuleInfo() {
   4304   uint64_t Size = CGM.getDataLayout().getTypeAllocSize(ObjCTypes.ModuleTy);
   4305 
   4306   llvm::Constant *Values[] = {
   4307     llvm::ConstantInt::get(ObjCTypes.LongTy, ModuleVersion),
   4308     llvm::ConstantInt::get(ObjCTypes.LongTy, Size),
   4309     // This used to be the filename, now it is unused. <rdr://4327263>
   4310     GetClassName(StringRef("")),
   4311     EmitModuleSymbols()
   4312   };
   4313   CreateMetadataVar("OBJC_MODULES",
   4314                     llvm::ConstantStruct::get(ObjCTypes.ModuleTy, Values),
   4315                     "__OBJC,__module_info,regular,no_dead_strip", 4, true);
   4316 }
   4317 
   4318 llvm::Constant *CGObjCMac::EmitModuleSymbols() {
   4319   unsigned NumClasses = DefinedClasses.size();
   4320   unsigned NumCategories = DefinedCategories.size();
   4321 
   4322   // Return null if no symbols were defined.
   4323   if (!NumClasses && !NumCategories)
   4324     return llvm::Constant::getNullValue(ObjCTypes.SymtabPtrTy);
   4325 
   4326   llvm::Constant *Values[5];
   4327   Values[0] = llvm::ConstantInt::get(ObjCTypes.LongTy, 0);
   4328   Values[1] = llvm::Constant::getNullValue(ObjCTypes.SelectorPtrTy);
   4329   Values[2] = llvm::ConstantInt::get(ObjCTypes.ShortTy, NumClasses);
   4330   Values[3] = llvm::ConstantInt::get(ObjCTypes.ShortTy, NumCategories);
   4331 
   4332   // The runtime expects exactly the list of defined classes followed
   4333   // by the list of defined categories, in a single array.
   4334   SmallVector<llvm::Constant*, 8> Symbols(NumClasses + NumCategories);
   4335   for (unsigned i=0; i<NumClasses; i++) {
   4336     const ObjCInterfaceDecl *ID = ImplementedClasses[i];
   4337     assert(ID);
   4338     if (ObjCImplementationDecl *IMP = ID->getImplementation())
   4339       // We are implementing a weak imported interface. Give it external linkage
   4340       if (ID->isWeakImported() && !IMP->isWeakImported())
   4341         DefinedClasses[i]->setLinkage(llvm::GlobalVariable::ExternalLinkage);
   4342 
   4343     Symbols[i] = llvm::ConstantExpr::getBitCast(DefinedClasses[i],
   4344                                                 ObjCTypes.Int8PtrTy);
   4345   }
   4346   for (unsigned i=0; i<NumCategories; i++)
   4347     Symbols[NumClasses + i] =
   4348       llvm::ConstantExpr::getBitCast(DefinedCategories[i],
   4349                                      ObjCTypes.Int8PtrTy);
   4350 
   4351   Values[4] =
   4352     llvm::ConstantArray::get(llvm::ArrayType::get(ObjCTypes.Int8PtrTy,
   4353                                                   Symbols.size()),
   4354                              Symbols);
   4355 
   4356   llvm::Constant *Init = llvm::ConstantStruct::getAnon(Values);
   4357 
   4358   llvm::GlobalVariable *GV = CreateMetadataVar(
   4359       "OBJC_SYMBOLS", Init, "__OBJC,__symbols,regular,no_dead_strip", 4, true);
   4360   return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.SymtabPtrTy);
   4361 }
   4362 
   4363 llvm::Value *CGObjCMac::EmitClassRefFromId(CodeGenFunction &CGF,
   4364                                            IdentifierInfo *II) {
   4365   LazySymbols.insert(II);
   4366 
   4367   llvm::GlobalVariable *&Entry = ClassReferences[II];
   4368 
   4369   if (!Entry) {
   4370     llvm::Constant *Casted =
   4371     llvm::ConstantExpr::getBitCast(GetClassName(II->getName()),
   4372                                    ObjCTypes.ClassPtrTy);
   4373     Entry = CreateMetadataVar(
   4374         "OBJC_CLASS_REFERENCES_", Casted,
   4375         "__OBJC,__cls_refs,literal_pointers,no_dead_strip", 4, true);
   4376   }
   4377 
   4378   return CGF.Builder.CreateLoad(Entry);
   4379 }
   4380 
   4381 llvm::Value *CGObjCMac::EmitClassRef(CodeGenFunction &CGF,
   4382                                      const ObjCInterfaceDecl *ID) {
   4383   return EmitClassRefFromId(CGF, ID->getIdentifier());
   4384 }
   4385 
   4386 llvm::Value *CGObjCMac::EmitNSAutoreleasePoolClassRef(CodeGenFunction &CGF) {
   4387   IdentifierInfo *II = &CGM.getContext().Idents.get("NSAutoreleasePool");
   4388   return EmitClassRefFromId(CGF, II);
   4389 }
   4390 
   4391 llvm::Value *CGObjCMac::EmitSelector(CodeGenFunction &CGF, Selector Sel,
   4392                                      bool lvalue) {
   4393   llvm::GlobalVariable *&Entry = SelectorReferences[Sel];
   4394 
   4395   if (!Entry) {
   4396     llvm::Constant *Casted =
   4397       llvm::ConstantExpr::getBitCast(GetMethodVarName(Sel),
   4398                                      ObjCTypes.SelectorPtrTy);
   4399     Entry = CreateMetadataVar(
   4400         "OBJC_SELECTOR_REFERENCES_", Casted,
   4401         "__OBJC,__message_refs,literal_pointers,no_dead_strip", 4, true);
   4402     Entry->setExternallyInitialized(true);
   4403   }
   4404 
   4405   if (lvalue)
   4406     return Entry;
   4407   return CGF.Builder.CreateLoad(Entry);
   4408 }
   4409 
   4410 llvm::Constant *CGObjCCommonMac::GetClassName(StringRef RuntimeName) {
   4411     llvm::GlobalVariable *&Entry = ClassNames[RuntimeName];
   4412     if (!Entry)
   4413       Entry = CreateMetadataVar(
   4414           "OBJC_CLASS_NAME_",
   4415           llvm::ConstantDataArray::getString(VMContext, RuntimeName),
   4416           ((ObjCABI == 2) ? "__TEXT,__objc_classname,cstring_literals"
   4417                           : "__TEXT,__cstring,cstring_literals"),
   4418           1, true);
   4419     return getConstantGEP(VMContext, Entry, 0, 0);
   4420 }
   4421 
   4422 llvm::Function *CGObjCCommonMac::GetMethodDefinition(const ObjCMethodDecl *MD) {
   4423   llvm::DenseMap<const ObjCMethodDecl*, llvm::Function*>::iterator
   4424       I = MethodDefinitions.find(MD);
   4425   if (I != MethodDefinitions.end())
   4426     return I->second;
   4427 
   4428   return nullptr;
   4429 }
   4430 
   4431 /// GetIvarLayoutName - Returns a unique constant for the given
   4432 /// ivar layout bitmap.
   4433 llvm::Constant *CGObjCCommonMac::GetIvarLayoutName(IdentifierInfo *Ident,
   4434                                        const ObjCCommonTypesHelper &ObjCTypes) {
   4435   return llvm::Constant::getNullValue(ObjCTypes.Int8PtrTy);
   4436 }
   4437 
   4438 void CGObjCCommonMac::BuildAggrIvarRecordLayout(const RecordType *RT,
   4439                                                 unsigned int BytePos,
   4440                                                 bool ForStrongLayout,
   4441                                                 bool &HasUnion) {
   4442   const RecordDecl *RD = RT->getDecl();
   4443   // FIXME - Use iterator.
   4444   SmallVector<const FieldDecl*, 16> Fields(RD->fields());
   4445   llvm::Type *Ty = CGM.getTypes().ConvertType(QualType(RT, 0));
   4446   const llvm::StructLayout *RecLayout =
   4447     CGM.getDataLayout().getStructLayout(cast<llvm::StructType>(Ty));
   4448 
   4449   BuildAggrIvarLayout(nullptr, RecLayout, RD, Fields, BytePos, ForStrongLayout,
   4450                       HasUnion);
   4451 }
   4452 
   4453 void CGObjCCommonMac::BuildAggrIvarLayout(const ObjCImplementationDecl *OI,
   4454                              const llvm::StructLayout *Layout,
   4455                              const RecordDecl *RD,
   4456                              ArrayRef<const FieldDecl*> RecFields,
   4457                              unsigned int BytePos, bool ForStrongLayout,
   4458                              bool &HasUnion) {
   4459   bool IsUnion = (RD && RD->isUnion());
   4460   uint64_t MaxUnionIvarSize = 0;
   4461   uint64_t MaxSkippedUnionIvarSize = 0;
   4462   const FieldDecl *MaxField = nullptr;
   4463   const FieldDecl *MaxSkippedField = nullptr;
   4464   const FieldDecl *LastFieldBitfieldOrUnnamed = nullptr;
   4465   uint64_t MaxFieldOffset = 0;
   4466   uint64_t MaxSkippedFieldOffset = 0;
   4467   uint64_t LastBitfieldOrUnnamedOffset = 0;
   4468   uint64_t FirstFieldDelta = 0;
   4469 
   4470   if (RecFields.empty())
   4471     return;
   4472   unsigned WordSizeInBits = CGM.getTarget().getPointerWidth(0);
   4473   unsigned ByteSizeInBits = CGM.getTarget().getCharWidth();
   4474   if (!RD && CGM.getLangOpts().ObjCAutoRefCount) {
   4475     const FieldDecl *FirstField = RecFields[0];
   4476     FirstFieldDelta =
   4477       ComputeIvarBaseOffset(CGM, OI, cast<ObjCIvarDecl>(FirstField));
   4478   }
   4479 
   4480   for (unsigned i = 0, e = RecFields.size(); i != e; ++i) {
   4481     const FieldDecl *Field = RecFields[i];
   4482     uint64_t FieldOffset;
   4483     if (RD) {
   4484       // Note that 'i' here is actually the field index inside RD of Field,
   4485       // although this dependency is hidden.
   4486       const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD);
   4487       FieldOffset = (RL.getFieldOffset(i) / ByteSizeInBits) - FirstFieldDelta;
   4488     } else
   4489       FieldOffset =
   4490         ComputeIvarBaseOffset(CGM, OI, cast<ObjCIvarDecl>(Field)) - FirstFieldDelta;
   4491 
   4492     // Skip over unnamed or bitfields
   4493     if (!Field->getIdentifier() || Field->isBitField()) {
   4494       LastFieldBitfieldOrUnnamed = Field;
   4495       LastBitfieldOrUnnamedOffset = FieldOffset;
   4496       continue;
   4497     }
   4498 
   4499     LastFieldBitfieldOrUnnamed = nullptr;
   4500     QualType FQT = Field->getType();
   4501     if (FQT->isRecordType() || FQT->isUnionType()) {
   4502       if (FQT->isUnionType())
   4503         HasUnion = true;
   4504 
   4505       BuildAggrIvarRecordLayout(FQT->getAs<RecordType>(),
   4506                                 BytePos + FieldOffset,
   4507                                 ForStrongLayout, HasUnion);
   4508       continue;
   4509     }
   4510 
   4511     if (const ArrayType *Array = CGM.getContext().getAsArrayType(FQT)) {
   4512       const ConstantArrayType *CArray =
   4513         dyn_cast_or_null<ConstantArrayType>(Array);
   4514       uint64_t ElCount = CArray->getSize().getZExtValue();
   4515       assert(CArray && "only array with known element size is supported");
   4516       FQT = CArray->getElementType();
   4517       while (const ArrayType *Array = CGM.getContext().getAsArrayType(FQT)) {
   4518         const ConstantArrayType *CArray =
   4519           dyn_cast_or_null<ConstantArrayType>(Array);
   4520         ElCount *= CArray->getSize().getZExtValue();
   4521         FQT = CArray->getElementType();
   4522       }
   4523       if (FQT->isRecordType() && ElCount) {
   4524         int OldIndex = IvarsInfo.size() - 1;
   4525         int OldSkIndex = SkipIvars.size() -1;
   4526 
   4527         const RecordType *RT = FQT->getAs<RecordType>();
   4528         BuildAggrIvarRecordLayout(RT, BytePos + FieldOffset,
   4529                                   ForStrongLayout, HasUnion);
   4530 
   4531         // Replicate layout information for each array element. Note that
   4532         // one element is already done.
   4533         uint64_t ElIx = 1;
   4534         for (int FirstIndex = IvarsInfo.size() - 1,
   4535                FirstSkIndex = SkipIvars.size() - 1 ;ElIx < ElCount; ElIx++) {
   4536           uint64_t Size = CGM.getContext().getTypeSize(RT)/ByteSizeInBits;
   4537           for (int i = OldIndex+1; i <= FirstIndex; ++i)
   4538             IvarsInfo.push_back(GC_IVAR(IvarsInfo[i].ivar_bytepos + Size*ElIx,
   4539                                         IvarsInfo[i].ivar_size));
   4540           for (int i = OldSkIndex+1; i <= FirstSkIndex; ++i)
   4541             SkipIvars.push_back(GC_IVAR(SkipIvars[i].ivar_bytepos + Size*ElIx,
   4542                                         SkipIvars[i].ivar_size));
   4543         }
   4544         continue;
   4545       }
   4546     }
   4547     // At this point, we are done with Record/Union and array there of.
   4548     // For other arrays we are down to its element type.
   4549     Qualifiers::GC GCAttr = GetGCAttrTypeForType(CGM.getContext(), FQT);
   4550 
   4551     unsigned FieldSize = CGM.getContext().getTypeSize(Field->getType());
   4552     if ((ForStrongLayout && GCAttr == Qualifiers::Strong)
   4553         || (!ForStrongLayout && GCAttr == Qualifiers::Weak)) {
   4554       if (IsUnion) {
   4555         uint64_t UnionIvarSize = FieldSize / WordSizeInBits;
   4556         if (UnionIvarSize > MaxUnionIvarSize) {
   4557           MaxUnionIvarSize = UnionIvarSize;
   4558           MaxField = Field;
   4559           MaxFieldOffset = FieldOffset;
   4560         }
   4561       } else {
   4562         IvarsInfo.push_back(GC_IVAR(BytePos + FieldOffset,
   4563                                     FieldSize / WordSizeInBits));
   4564       }
   4565     } else if ((ForStrongLayout &&
   4566                 (GCAttr == Qualifiers::GCNone || GCAttr == Qualifiers::Weak))
   4567                || (!ForStrongLayout && GCAttr != Qualifiers::Weak)) {
   4568       if (IsUnion) {
   4569         // FIXME: Why the asymmetry? We divide by word size in bits on other
   4570         // side.
   4571         uint64_t UnionIvarSize = FieldSize / ByteSizeInBits;
   4572         if (UnionIvarSize > MaxSkippedUnionIvarSize) {
   4573           MaxSkippedUnionIvarSize = UnionIvarSize;
   4574           MaxSkippedField = Field;
   4575           MaxSkippedFieldOffset = FieldOffset;
   4576         }
   4577       } else {
   4578         // FIXME: Why the asymmetry, we divide by byte size in bits here?
   4579         SkipIvars.push_back(GC_IVAR(BytePos + FieldOffset,
   4580                                     FieldSize / ByteSizeInBits));
   4581       }
   4582     }
   4583   }
   4584 
   4585   if (LastFieldBitfieldOrUnnamed) {
   4586     if (LastFieldBitfieldOrUnnamed->isBitField()) {
   4587       // Last field was a bitfield. Must update skip info.
   4588       uint64_t BitFieldSize
   4589           = LastFieldBitfieldOrUnnamed->getBitWidthValue(CGM.getContext());
   4590       GC_IVAR skivar;
   4591       skivar.ivar_bytepos = BytePos + LastBitfieldOrUnnamedOffset;
   4592       skivar.ivar_size = (BitFieldSize / ByteSizeInBits)
   4593         + ((BitFieldSize % ByteSizeInBits) != 0);
   4594       SkipIvars.push_back(skivar);
   4595     } else {
   4596       assert(!LastFieldBitfieldOrUnnamed->getIdentifier() &&"Expected unnamed");
   4597       // Last field was unnamed. Must update skip info.
   4598       unsigned FieldSize
   4599           = CGM.getContext().getTypeSize(LastFieldBitfieldOrUnnamed->getType());
   4600       SkipIvars.push_back(GC_IVAR(BytePos + LastBitfieldOrUnnamedOffset,
   4601                                   FieldSize / ByteSizeInBits));
   4602     }
   4603   }
   4604 
   4605   if (MaxField)
   4606     IvarsInfo.push_back(GC_IVAR(BytePos + MaxFieldOffset,
   4607                                 MaxUnionIvarSize));
   4608   if (MaxSkippedField)
   4609     SkipIvars.push_back(GC_IVAR(BytePos + MaxSkippedFieldOffset,
   4610                                 MaxSkippedUnionIvarSize));
   4611 }
   4612 
   4613 /// BuildIvarLayoutBitmap - This routine is the horsework for doing all
   4614 /// the computations and returning the layout bitmap (for ivar or blocks) in
   4615 /// the given argument BitMap string container. Routine reads
   4616 /// two containers, IvarsInfo and SkipIvars which are assumed to be
   4617 /// filled already by the caller.
   4618 llvm::Constant *CGObjCCommonMac::BuildIvarLayoutBitmap(std::string &BitMap) {
   4619   unsigned int WordsToScan, WordsToSkip;
   4620   llvm::Type *PtrTy = CGM.Int8PtrTy;
   4621 
   4622   // Build the string of skip/scan nibbles
   4623   SmallVector<SKIP_SCAN, 32> SkipScanIvars;
   4624   unsigned int WordSize =
   4625   CGM.getTypes().getDataLayout().getTypeAllocSize(PtrTy);
   4626   if (IvarsInfo[0].ivar_bytepos == 0) {
   4627     WordsToSkip = 0;
   4628     WordsToScan = IvarsInfo[0].ivar_size;
   4629   } else {
   4630     WordsToSkip = IvarsInfo[0].ivar_bytepos/WordSize;
   4631     WordsToScan = IvarsInfo[0].ivar_size;
   4632   }
   4633   for (unsigned int i=1, Last=IvarsInfo.size(); i != Last; i++) {
   4634     unsigned int TailPrevGCObjC =
   4635     IvarsInfo[i-1].ivar_bytepos + IvarsInfo[i-1].ivar_size * WordSize;
   4636     if (IvarsInfo[i].ivar_bytepos == TailPrevGCObjC) {
   4637       // consecutive 'scanned' object pointers.
   4638       WordsToScan += IvarsInfo[i].ivar_size;
   4639     } else {
   4640       // Skip over 'gc'able object pointer which lay over each other.
   4641       if (TailPrevGCObjC > IvarsInfo[i].ivar_bytepos)
   4642         continue;
   4643       // Must skip over 1 or more words. We save current skip/scan values
   4644       //  and start a new pair.
   4645       SKIP_SCAN SkScan;
   4646       SkScan.skip = WordsToSkip;
   4647       SkScan.scan = WordsToScan;
   4648       SkipScanIvars.push_back(SkScan);
   4649 
   4650       // Skip the hole.
   4651       SkScan.skip = (IvarsInfo[i].ivar_bytepos - TailPrevGCObjC) / WordSize;
   4652       SkScan.scan = 0;
   4653       SkipScanIvars.push_back(SkScan);
   4654       WordsToSkip = 0;
   4655       WordsToScan = IvarsInfo[i].ivar_size;
   4656     }
   4657   }
   4658   if (WordsToScan > 0) {
   4659     SKIP_SCAN SkScan;
   4660     SkScan.skip = WordsToSkip;
   4661     SkScan.scan = WordsToScan;
   4662     SkipScanIvars.push_back(SkScan);
   4663   }
   4664 
   4665   if (!SkipIvars.empty()) {
   4666     unsigned int LastIndex = SkipIvars.size()-1;
   4667     int LastByteSkipped =
   4668     SkipIvars[LastIndex].ivar_bytepos + SkipIvars[LastIndex].ivar_size;
   4669     LastIndex = IvarsInfo.size()-1;
   4670     int LastByteScanned =
   4671     IvarsInfo[LastIndex].ivar_bytepos +
   4672     IvarsInfo[LastIndex].ivar_size * WordSize;
   4673     // Compute number of bytes to skip at the tail end of the last ivar scanned.
   4674     if (LastByteSkipped > LastByteScanned) {
   4675       unsigned int TotalWords = (LastByteSkipped + (WordSize -1)) / WordSize;
   4676       SKIP_SCAN SkScan;
   4677       SkScan.skip = TotalWords - (LastByteScanned/WordSize);
   4678       SkScan.scan = 0;
   4679       SkipScanIvars.push_back(SkScan);
   4680     }
   4681   }
   4682   // Mini optimization of nibbles such that an 0xM0 followed by 0x0N is produced
   4683   // as 0xMN.
   4684   int SkipScan = SkipScanIvars.size()-1;
   4685   for (int i = 0; i <= SkipScan; i++) {
   4686     if ((i < SkipScan) && SkipScanIvars[i].skip && SkipScanIvars[i].scan == 0
   4687         && SkipScanIvars[i+1].skip == 0 && SkipScanIvars[i+1].scan) {
   4688       // 0xM0 followed by 0x0N detected.
   4689       SkipScanIvars[i].scan = SkipScanIvars[i+1].scan;
   4690       for (int j = i+1; j < SkipScan; j++)
   4691         SkipScanIvars[j] = SkipScanIvars[j+1];
   4692       --SkipScan;
   4693     }
   4694   }
   4695 
   4696   // Generate the string.
   4697   for (int i = 0; i <= SkipScan; i++) {
   4698     unsigned char byte;
   4699     unsigned int skip_small = SkipScanIvars[i].skip % 0xf;
   4700     unsigned int scan_small = SkipScanIvars[i].scan % 0xf;
   4701     unsigned int skip_big  = SkipScanIvars[i].skip / 0xf;
   4702     unsigned int scan_big  = SkipScanIvars[i].scan / 0xf;
   4703 
   4704     // first skip big.
   4705     for (unsigned int ix = 0; ix < skip_big; ix++)
   4706       BitMap += (unsigned char)(0xf0);
   4707 
   4708     // next (skip small, scan)
   4709     if (skip_small) {
   4710       byte = skip_small << 4;
   4711       if (scan_big > 0) {
   4712         byte |= 0xf;
   4713         --scan_big;
   4714       } else if (scan_small) {
   4715         byte |= scan_small;
   4716         scan_small = 0;
   4717       }
   4718       BitMap += byte;
   4719     }
   4720     // next scan big
   4721     for (unsigned int ix = 0; ix < scan_big; ix++)
   4722       BitMap += (unsigned char)(0x0f);
   4723     // last scan small
   4724     if (scan_small) {
   4725       byte = scan_small;
   4726       BitMap += byte;
   4727     }
   4728   }
   4729   // null terminate string.
   4730   unsigned char zero = 0;
   4731   BitMap += zero;
   4732 
   4733   llvm::GlobalVariable *Entry = CreateMetadataVar(
   4734       "OBJC_CLASS_NAME_",
   4735       llvm::ConstantDataArray::getString(VMContext, BitMap, false),
   4736       ((ObjCABI == 2) ? "__TEXT,__objc_classname,cstring_literals"
   4737                       : "__TEXT,__cstring,cstring_literals"),
   4738       1, true);
   4739   return getConstantGEP(VMContext, Entry, 0, 0);
   4740 }
   4741 
   4742 /// BuildIvarLayout - Builds ivar layout bitmap for the class
   4743 /// implementation for the __strong or __weak case.
   4744 /// The layout map displays which words in ivar list must be skipped
   4745 /// and which must be scanned by GC (see below). String is built of bytes.
   4746 /// Each byte is divided up in two nibbles (4-bit each). Left nibble is count
   4747 /// of words to skip and right nibble is count of words to scan. So, each
   4748 /// nibble represents up to 15 workds to skip or scan. Skipping the rest is
   4749 /// represented by a 0x00 byte which also ends the string.
   4750 /// 1. when ForStrongLayout is true, following ivars are scanned:
   4751 /// - id, Class
   4752 /// - object *
   4753 /// - __strong anything
   4754 ///
   4755 /// 2. When ForStrongLayout is false, following ivars are scanned:
   4756 /// - __weak anything
   4757 ///
   4758 llvm::Constant *CGObjCCommonMac::BuildIvarLayout(
   4759   const ObjCImplementationDecl *OMD,
   4760   bool ForStrongLayout) {
   4761   bool hasUnion = false;
   4762 
   4763   llvm::Type *PtrTy = CGM.Int8PtrTy;
   4764   if (CGM.getLangOpts().getGC() == LangOptions::NonGC &&
   4765       !CGM.getLangOpts().ObjCAutoRefCount)
   4766     return llvm::Constant::getNullValue(PtrTy);
   4767 
   4768   const ObjCInterfaceDecl *OI = OMD->getClassInterface();
   4769   SmallVector<const FieldDecl*, 32> RecFields;
   4770   if (CGM.getLangOpts().ObjCAutoRefCount) {
   4771     for (const ObjCIvarDecl *IVD = OI->all_declared_ivar_begin();
   4772          IVD; IVD = IVD->getNextIvar())
   4773       RecFields.push_back(cast<FieldDecl>(IVD));
   4774   }
   4775   else {
   4776     SmallVector<const ObjCIvarDecl*, 32> Ivars;
   4777     CGM.getContext().DeepCollectObjCIvars(OI, true, Ivars);
   4778 
   4779     // FIXME: This is not ideal; we shouldn't have to do this copy.
   4780     RecFields.append(Ivars.begin(), Ivars.end());
   4781   }
   4782 
   4783   if (RecFields.empty())
   4784     return llvm::Constant::getNullValue(PtrTy);
   4785 
   4786   SkipIvars.clear();
   4787   IvarsInfo.clear();
   4788 
   4789   BuildAggrIvarLayout(OMD, nullptr, nullptr, RecFields, 0, ForStrongLayout,
   4790                       hasUnion);
   4791   if (IvarsInfo.empty())
   4792     return llvm::Constant::getNullValue(PtrTy);
   4793   // Sort on byte position in case we encounterred a union nested in
   4794   // the ivar list.
   4795   if (hasUnion && !IvarsInfo.empty())
   4796     std::sort(IvarsInfo.begin(), IvarsInfo.end());
   4797   if (hasUnion && !SkipIvars.empty())
   4798     std::sort(SkipIvars.begin(), SkipIvars.end());
   4799 
   4800   std::string BitMap;
   4801   llvm::Constant *C = BuildIvarLayoutBitmap(BitMap);
   4802 
   4803    if (CGM.getLangOpts().ObjCGCBitmapPrint) {
   4804     printf("\n%s ivar layout for class '%s': ",
   4805            ForStrongLayout ? "strong" : "weak",
   4806            OMD->getClassInterface()->getName().str().c_str());
   4807     const unsigned char *s = (const unsigned char*)BitMap.c_str();
   4808     for (unsigned i = 0, e = BitMap.size(); i < e; i++)
   4809       if (!(s[i] & 0xf0))
   4810         printf("0x0%x%s", s[i], s[i] != 0 ? ", " : "");
   4811       else
   4812         printf("0x%x%s",  s[i], s[i] != 0 ? ", " : "");
   4813     printf("\n");
   4814   }
   4815   return C;
   4816 }
   4817 
   4818 llvm::Constant *CGObjCCommonMac::GetMethodVarName(Selector Sel) {
   4819   llvm::GlobalVariable *&Entry = MethodVarNames[Sel];
   4820 
   4821   // FIXME: Avoid std::string in "Sel.getAsString()"
   4822   if (!Entry)
   4823     Entry = CreateMetadataVar(
   4824         "OBJC_METH_VAR_NAME_",
   4825         llvm::ConstantDataArray::getString(VMContext, Sel.getAsString()),
   4826         ((ObjCABI == 2) ? "__TEXT,__objc_methname,cstring_literals"
   4827                         : "__TEXT,__cstring,cstring_literals"),
   4828         1, true);
   4829 
   4830   return getConstantGEP(VMContext, Entry, 0, 0);
   4831 }
   4832 
   4833 // FIXME: Merge into a single cstring creation function.
   4834 llvm::Constant *CGObjCCommonMac::GetMethodVarName(IdentifierInfo *ID) {
   4835   return GetMethodVarName(CGM.getContext().Selectors.getNullarySelector(ID));
   4836 }
   4837 
   4838 llvm::Constant *CGObjCCommonMac::GetMethodVarType(const FieldDecl *Field) {
   4839   std::string TypeStr;
   4840   CGM.getContext().getObjCEncodingForType(Field->getType(), TypeStr, Field);
   4841 
   4842   llvm::GlobalVariable *&Entry = MethodVarTypes[TypeStr];
   4843 
   4844   if (!Entry)
   4845     Entry = CreateMetadataVar(
   4846         "OBJC_METH_VAR_TYPE_",
   4847         llvm::ConstantDataArray::getString(VMContext, TypeStr),
   4848         ((ObjCABI == 2) ? "__TEXT,__objc_methtype,cstring_literals"
   4849                         : "__TEXT,__cstring,cstring_literals"),
   4850         1, true);
   4851 
   4852   return getConstantGEP(VMContext, Entry, 0, 0);
   4853 }
   4854 
   4855 llvm::Constant *CGObjCCommonMac::GetMethodVarType(const ObjCMethodDecl *D,
   4856                                                   bool Extended) {
   4857   std::string TypeStr;
   4858   if (CGM.getContext().getObjCEncodingForMethodDecl(D, TypeStr, Extended))
   4859     return nullptr;
   4860 
   4861   llvm::GlobalVariable *&Entry = MethodVarTypes[TypeStr];
   4862 
   4863   if (!Entry)
   4864     Entry = CreateMetadataVar(
   4865         "OBJC_METH_VAR_TYPE_",
   4866         llvm::ConstantDataArray::getString(VMContext, TypeStr),
   4867         ((ObjCABI == 2) ? "__TEXT,__objc_methtype,cstring_literals"
   4868                         : "__TEXT,__cstring,cstring_literals"),
   4869         1, true);
   4870 
   4871   return getConstantGEP(VMContext, Entry, 0, 0);
   4872 }
   4873 
   4874 // FIXME: Merge into a single cstring creation function.
   4875 llvm::Constant *CGObjCCommonMac::GetPropertyName(IdentifierInfo *Ident) {
   4876   llvm::GlobalVariable *&Entry = PropertyNames[Ident];
   4877 
   4878   if (!Entry)
   4879     Entry = CreateMetadataVar(
   4880         "OBJC_PROP_NAME_ATTR_",
   4881         llvm::ConstantDataArray::getString(VMContext, Ident->getName()),
   4882         "__TEXT,__cstring,cstring_literals", 1, true);
   4883 
   4884   return getConstantGEP(VMContext, Entry, 0, 0);
   4885 }
   4886 
   4887 // FIXME: Merge into a single cstring creation function.
   4888 // FIXME: This Decl should be more precise.
   4889 llvm::Constant *
   4890 CGObjCCommonMac::GetPropertyTypeString(const ObjCPropertyDecl *PD,
   4891                                        const Decl *Container) {
   4892   std::string TypeStr;
   4893   CGM.getContext().getObjCEncodingForPropertyDecl(PD, Container, TypeStr);
   4894   return GetPropertyName(&CGM.getContext().Idents.get(TypeStr));
   4895 }
   4896 
   4897 void CGObjCCommonMac::GetNameForMethod(const ObjCMethodDecl *D,
   4898                                        const ObjCContainerDecl *CD,
   4899                                        SmallVectorImpl<char> &Name) {
   4900   llvm::raw_svector_ostream OS(Name);
   4901   assert (CD && "Missing container decl in GetNameForMethod");
   4902   OS << '\01' << (D->isInstanceMethod() ? '-' : '+')
   4903      << '[' << CD->getName();
   4904   if (const ObjCCategoryImplDecl *CID =
   4905       dyn_cast<ObjCCategoryImplDecl>(D->getDeclContext()))
   4906     OS << '(' << *CID << ')';
   4907   OS << ' ' << D->getSelector().getAsString() << ']';
   4908 }
   4909 
   4910 void CGObjCMac::FinishModule() {
   4911   EmitModuleInfo();
   4912 
   4913   // Emit the dummy bodies for any protocols which were referenced but
   4914   // never defined.
   4915   for (llvm::DenseMap<IdentifierInfo*, llvm::GlobalVariable*>::iterator
   4916          I = Protocols.begin(), e = Protocols.end(); I != e; ++I) {
   4917     if (I->second->hasInitializer())
   4918       continue;
   4919 
   4920     llvm::Constant *Values[5];
   4921     Values[0] = llvm::Constant::getNullValue(ObjCTypes.ProtocolExtensionPtrTy);
   4922     Values[1] = GetClassName(I->first->getName());
   4923     Values[2] = llvm::Constant::getNullValue(ObjCTypes.ProtocolListPtrTy);
   4924     Values[3] = Values[4] =
   4925       llvm::Constant::getNullValue(ObjCTypes.MethodDescriptionListPtrTy);
   4926     I->second->setInitializer(llvm::ConstantStruct::get(ObjCTypes.ProtocolTy,
   4927                                                         Values));
   4928     CGM.addCompilerUsedGlobal(I->second);
   4929   }
   4930 
   4931   // Add assembler directives to add lazy undefined symbol references
   4932   // for classes which are referenced but not defined. This is
   4933   // important for correct linker interaction.
   4934   //
   4935   // FIXME: It would be nice if we had an LLVM construct for this.
   4936   if (!LazySymbols.empty() || !DefinedSymbols.empty()) {
   4937     SmallString<256> Asm;
   4938     Asm += CGM.getModule().getModuleInlineAsm();
   4939     if (!Asm.empty() && Asm.back() != '\n')
   4940       Asm += '\n';
   4941 
   4942     llvm::raw_svector_ostream OS(Asm);
   4943     for (llvm::SetVector<IdentifierInfo*>::iterator I = DefinedSymbols.begin(),
   4944            e = DefinedSymbols.end(); I != e; ++I)
   4945       OS << "\t.objc_class_name_" << (*I)->getName() << "=0\n"
   4946          << "\t.globl .objc_class_name_" << (*I)->getName() << "\n";
   4947     for (llvm::SetVector<IdentifierInfo*>::iterator I = LazySymbols.begin(),
   4948          e = LazySymbols.end(); I != e; ++I) {
   4949       OS << "\t.lazy_reference .objc_class_name_" << (*I)->getName() << "\n";
   4950     }
   4951 
   4952     for (size_t i = 0, e = DefinedCategoryNames.size(); i < e; ++i) {
   4953       OS << "\t.objc_category_name_" << DefinedCategoryNames[i] << "=0\n"
   4954          << "\t.globl .objc_category_name_" << DefinedCategoryNames[i] << "\n";
   4955     }
   4956 
   4957     CGM.getModule().setModuleInlineAsm(OS.str());
   4958   }
   4959 }
   4960 
   4961 CGObjCNonFragileABIMac::CGObjCNonFragileABIMac(CodeGen::CodeGenModule &cgm)
   4962   : CGObjCCommonMac(cgm),
   4963     ObjCTypes(cgm) {
   4964   ObjCEmptyCacheVar = ObjCEmptyVtableVar = nullptr;
   4965   ObjCABI = 2;
   4966 }
   4967 
   4968 /* *** */
   4969 
   4970 ObjCCommonTypesHelper::ObjCCommonTypesHelper(CodeGen::CodeGenModule &cgm)
   4971   : VMContext(cgm.getLLVMContext()), CGM(cgm), ExternalProtocolPtrTy(nullptr)
   4972 {
   4973   CodeGen::CodeGenTypes &Types = CGM.getTypes();
   4974   ASTContext &Ctx = CGM.getContext();
   4975 
   4976   ShortTy = Types.ConvertType(Ctx.ShortTy);
   4977   IntTy = Types.ConvertType(Ctx.IntTy);
   4978   LongTy = Types.ConvertType(Ctx.LongTy);
   4979   LongLongTy = Types.ConvertType(Ctx.LongLongTy);
   4980   Int8PtrTy = CGM.Int8PtrTy;
   4981   Int8PtrPtrTy = CGM.Int8PtrPtrTy;
   4982 
   4983   // arm64 targets use "int" ivar offset variables. All others,
   4984   // including OS X x86_64 and Windows x86_64, use "long" ivar offsets.
   4985   if (CGM.getTarget().getTriple().getArch() == llvm::Triple::aarch64)
   4986     IvarOffsetVarTy = IntTy;
   4987   else
   4988     IvarOffsetVarTy = LongTy;
   4989 
   4990   ObjectPtrTy = Types.ConvertType(Ctx.getObjCIdType());
   4991   PtrObjectPtrTy = llvm::PointerType::getUnqual(ObjectPtrTy);
   4992   SelectorPtrTy = Types.ConvertType(Ctx.getObjCSelType());
   4993 
   4994   // I'm not sure I like this. The implicit coordination is a bit
   4995   // gross. We should solve this in a reasonable fashion because this
   4996   // is a pretty common task (match some runtime data structure with
   4997   // an LLVM data structure).
   4998 
   4999   // FIXME: This is leaked.
   5000   // FIXME: Merge with rewriter code?
   5001 
   5002   // struct _objc_super {
   5003   //   id self;
   5004   //   Class cls;
   5005   // }
   5006   RecordDecl *RD = RecordDecl::Create(Ctx, TTK_Struct,
   5007                                       Ctx.getTranslationUnitDecl(),
   5008                                       SourceLocation(), SourceLocation(),
   5009                                       &Ctx.Idents.get("_objc_super"));
   5010   RD->addDecl(FieldDecl::Create(Ctx, RD, SourceLocation(), SourceLocation(),
   5011                                 nullptr, Ctx.getObjCIdType(), nullptr, nullptr,
   5012                                 false, ICIS_NoInit));
   5013   RD->addDecl(FieldDecl::Create(Ctx, RD, SourceLocation(), SourceLocation(),
   5014                                 nullptr, Ctx.getObjCClassType(), nullptr,
   5015                                 nullptr, false, ICIS_NoInit));
   5016   RD->completeDefinition();
   5017 
   5018   SuperCTy = Ctx.getTagDeclType(RD);
   5019   SuperPtrCTy = Ctx.getPointerType(SuperCTy);
   5020 
   5021   SuperTy = cast<llvm::StructType>(Types.ConvertType(SuperCTy));
   5022   SuperPtrTy = llvm::PointerType::getUnqual(SuperTy);
   5023 
   5024   // struct _prop_t {
   5025   //   char *name;
   5026   //   char *attributes;
   5027   // }
   5028   PropertyTy = llvm::StructType::create("struct._prop_t",
   5029                                         Int8PtrTy, Int8PtrTy, nullptr);
   5030 
   5031   // struct _prop_list_t {
   5032   //   uint32_t entsize;      // sizeof(struct _prop_t)
   5033   //   uint32_t count_of_properties;
   5034   //   struct _prop_t prop_list[count_of_properties];
   5035   // }
   5036   PropertyListTy =
   5037     llvm::StructType::create("struct._prop_list_t", IntTy, IntTy,
   5038                              llvm::ArrayType::get(PropertyTy, 0), nullptr);
   5039   // struct _prop_list_t *
   5040   PropertyListPtrTy = llvm::PointerType::getUnqual(PropertyListTy);
   5041 
   5042   // struct _objc_method {
   5043   //   SEL _cmd;
   5044   //   char *method_type;
   5045   //   char *_imp;
   5046   // }
   5047   MethodTy = llvm::StructType::create("struct._objc_method",
   5048                                       SelectorPtrTy, Int8PtrTy, Int8PtrTy,
   5049                                       nullptr);
   5050 
   5051   // struct _objc_cache *
   5052   CacheTy = llvm::StructType::create(VMContext, "struct._objc_cache");
   5053   CachePtrTy = llvm::PointerType::getUnqual(CacheTy);
   5054 
   5055 }
   5056 
   5057 ObjCTypesHelper::ObjCTypesHelper(CodeGen::CodeGenModule &cgm)
   5058   : ObjCCommonTypesHelper(cgm) {
   5059   // struct _objc_method_description {
   5060   //   SEL name;
   5061   //   char *types;
   5062   // }
   5063   MethodDescriptionTy =
   5064     llvm::StructType::create("struct._objc_method_description",
   5065                              SelectorPtrTy, Int8PtrTy, nullptr);
   5066 
   5067   // struct _objc_method_description_list {
   5068   //   int count;
   5069   //   struct _objc_method_description[1];
   5070   // }
   5071   MethodDescriptionListTy = llvm::StructType::create(
   5072       "struct._objc_method_description_list", IntTy,
   5073       llvm::ArrayType::get(MethodDescriptionTy, 0), nullptr);
   5074 
   5075   // struct _objc_method_description_list *
   5076   MethodDescriptionListPtrTy =
   5077     llvm::PointerType::getUnqual(MethodDescriptionListTy);
   5078 
   5079   // Protocol description structures
   5080 
   5081   // struct _objc_protocol_extension {
   5082   //   uint32_t size;  // sizeof(struct _objc_protocol_extension)
   5083   //   struct _objc_method_description_list *optional_instance_methods;
   5084   //   struct _objc_method_description_list *optional_class_methods;
   5085   //   struct _objc_property_list *instance_properties;
   5086   //   const char ** extendedMethodTypes;
   5087   // }
   5088   ProtocolExtensionTy =
   5089     llvm::StructType::create("struct._objc_protocol_extension",
   5090                              IntTy, MethodDescriptionListPtrTy,
   5091                              MethodDescriptionListPtrTy, PropertyListPtrTy,
   5092                              Int8PtrPtrTy, nullptr);
   5093 
   5094   // struct _objc_protocol_extension *
   5095   ProtocolExtensionPtrTy = llvm::PointerType::getUnqual(ProtocolExtensionTy);
   5096 
   5097   // Handle recursive construction of Protocol and ProtocolList types
   5098 
   5099   ProtocolTy =
   5100     llvm::StructType::create(VMContext, "struct._objc_protocol");
   5101 
   5102   ProtocolListTy =
   5103     llvm::StructType::create(VMContext, "struct._objc_protocol_list");
   5104   ProtocolListTy->setBody(llvm::PointerType::getUnqual(ProtocolListTy),
   5105                           LongTy,
   5106                           llvm::ArrayType::get(ProtocolTy, 0),
   5107                           nullptr);
   5108 
   5109   // struct _objc_protocol {
   5110   //   struct _objc_protocol_extension *isa;
   5111   //   char *protocol_name;
   5112   //   struct _objc_protocol **_objc_protocol_list;
   5113   //   struct _objc_method_description_list *instance_methods;
   5114   //   struct _objc_method_description_list *class_methods;
   5115   // }
   5116   ProtocolTy->setBody(ProtocolExtensionPtrTy, Int8PtrTy,
   5117                       llvm::PointerType::getUnqual(ProtocolListTy),
   5118                       MethodDescriptionListPtrTy,
   5119                       MethodDescriptionListPtrTy,
   5120                       nullptr);
   5121 
   5122   // struct _objc_protocol_list *
   5123   ProtocolListPtrTy = llvm::PointerType::getUnqual(ProtocolListTy);
   5124 
   5125   ProtocolPtrTy = llvm::PointerType::getUnqual(ProtocolTy);
   5126 
   5127   // Class description structures
   5128 
   5129   // struct _objc_ivar {
   5130   //   char *ivar_name;
   5131   //   char *ivar_type;
   5132   //   int  ivar_offset;
   5133   // }
   5134   IvarTy = llvm::StructType::create("struct._objc_ivar",
   5135                                     Int8PtrTy, Int8PtrTy, IntTy, nullptr);
   5136 
   5137   // struct _objc_ivar_list *
   5138   IvarListTy =
   5139     llvm::StructType::create(VMContext, "struct._objc_ivar_list");
   5140   IvarListPtrTy = llvm::PointerType::getUnqual(IvarListTy);
   5141 
   5142   // struct _objc_method_list *
   5143   MethodListTy =
   5144     llvm::StructType::create(VMContext, "struct._objc_method_list");
   5145   MethodListPtrTy = llvm::PointerType::getUnqual(MethodListTy);
   5146 
   5147   // struct _objc_class_extension *
   5148   ClassExtensionTy =
   5149     llvm::StructType::create("struct._objc_class_extension",
   5150                              IntTy, Int8PtrTy, PropertyListPtrTy, nullptr);
   5151   ClassExtensionPtrTy = llvm::PointerType::getUnqual(ClassExtensionTy);
   5152 
   5153   ClassTy = llvm::StructType::create(VMContext, "struct._objc_class");
   5154 
   5155   // struct _objc_class {
   5156   //   Class isa;
   5157   //   Class super_class;
   5158   //   char *name;
   5159   //   long version;
   5160   //   long info;
   5161   //   long instance_size;
   5162   //   struct _objc_ivar_list *ivars;
   5163   //   struct _objc_method_list *methods;
   5164   //   struct _objc_cache *cache;
   5165   //   struct _objc_protocol_list *protocols;
   5166   //   char *ivar_layout;
   5167   //   struct _objc_class_ext *ext;
   5168   // };
   5169   ClassTy->setBody(llvm::PointerType::getUnqual(ClassTy),
   5170                    llvm::PointerType::getUnqual(ClassTy),
   5171                    Int8PtrTy,
   5172                    LongTy,
   5173                    LongTy,
   5174                    LongTy,
   5175                    IvarListPtrTy,
   5176                    MethodListPtrTy,
   5177                    CachePtrTy,
   5178                    ProtocolListPtrTy,
   5179                    Int8PtrTy,
   5180                    ClassExtensionPtrTy,
   5181                    nullptr);
   5182 
   5183   ClassPtrTy = llvm::PointerType::getUnqual(ClassTy);
   5184 
   5185   // struct _objc_category {
   5186   //   char *category_name;
   5187   //   char *class_name;
   5188   //   struct _objc_method_list *instance_method;
   5189   //   struct _objc_method_list *class_method;
   5190   //   uint32_t size;  // sizeof(struct _objc_category)
   5191   //   struct _objc_property_list *instance_properties;// category's @property
   5192   // }
   5193   CategoryTy =
   5194     llvm::StructType::create("struct._objc_category",
   5195                              Int8PtrTy, Int8PtrTy, MethodListPtrTy,
   5196                              MethodListPtrTy, ProtocolListPtrTy,
   5197                              IntTy, PropertyListPtrTy, nullptr);
   5198 
   5199   // Global metadata structures
   5200 
   5201   // struct _objc_symtab {
   5202   //   long sel_ref_cnt;
   5203   //   SEL *refs;
   5204   //   short cls_def_cnt;
   5205   //   short cat_def_cnt;
   5206   //   char *defs[cls_def_cnt + cat_def_cnt];
   5207   // }
   5208   SymtabTy =
   5209     llvm::StructType::create("struct._objc_symtab",
   5210                              LongTy, SelectorPtrTy, ShortTy, ShortTy,
   5211                              llvm::ArrayType::get(Int8PtrTy, 0), nullptr);
   5212   SymtabPtrTy = llvm::PointerType::getUnqual(SymtabTy);
   5213 
   5214   // struct _objc_module {
   5215   //   long version;
   5216   //   long size;   // sizeof(struct _objc_module)
   5217   //   char *name;
   5218   //   struct _objc_symtab* symtab;
   5219   //  }
   5220   ModuleTy =
   5221     llvm::StructType::create("struct._objc_module",
   5222                              LongTy, LongTy, Int8PtrTy, SymtabPtrTy, nullptr);
   5223 
   5224 
   5225   // FIXME: This is the size of the setjmp buffer and should be target
   5226   // specific. 18 is what's used on 32-bit X86.
   5227   uint64_t SetJmpBufferSize = 18;
   5228 
   5229   // Exceptions
   5230   llvm::Type *StackPtrTy = llvm::ArrayType::get(CGM.Int8PtrTy, 4);
   5231 
   5232   ExceptionDataTy =
   5233     llvm::StructType::create("struct._objc_exception_data",
   5234                              llvm::ArrayType::get(CGM.Int32Ty,SetJmpBufferSize),
   5235                              StackPtrTy, nullptr);
   5236 
   5237 }
   5238 
   5239 ObjCNonFragileABITypesHelper::ObjCNonFragileABITypesHelper(CodeGen::CodeGenModule &cgm)
   5240   : ObjCCommonTypesHelper(cgm) {
   5241   // struct _method_list_t {
   5242   //   uint32_t entsize;  // sizeof(struct _objc_method)
   5243   //   uint32_t method_count;
   5244   //   struct _objc_method method_list[method_count];
   5245   // }
   5246   MethodListnfABITy =
   5247     llvm::StructType::create("struct.__method_list_t", IntTy, IntTy,
   5248                              llvm::ArrayType::get(MethodTy, 0), nullptr);
   5249   // struct method_list_t *
   5250   MethodListnfABIPtrTy = llvm::PointerType::getUnqual(MethodListnfABITy);
   5251 
   5252   // struct _protocol_t {
   5253   //   id isa;  // NULL
   5254   //   const char * const protocol_name;
   5255   //   const struct _protocol_list_t * protocol_list; // super protocols
   5256   //   const struct method_list_t * const instance_methods;
   5257   //   const struct method_list_t * const class_methods;
   5258   //   const struct method_list_t *optionalInstanceMethods;
   5259   //   const struct method_list_t *optionalClassMethods;
   5260   //   const struct _prop_list_t * properties;
   5261   //   const uint32_t size;  // sizeof(struct _protocol_t)
   5262   //   const uint32_t flags;  // = 0
   5263   //   const char ** extendedMethodTypes;
   5264   //   const char *demangledName;
   5265   // }
   5266 
   5267   // Holder for struct _protocol_list_t *
   5268   ProtocolListnfABITy =
   5269     llvm::StructType::create(VMContext, "struct._objc_protocol_list");
   5270 
   5271   ProtocolnfABITy =
   5272     llvm::StructType::create("struct._protocol_t", ObjectPtrTy, Int8PtrTy,
   5273                              llvm::PointerType::getUnqual(ProtocolListnfABITy),
   5274                              MethodListnfABIPtrTy, MethodListnfABIPtrTy,
   5275                              MethodListnfABIPtrTy, MethodListnfABIPtrTy,
   5276                              PropertyListPtrTy, IntTy, IntTy, Int8PtrPtrTy,
   5277                              Int8PtrTy,
   5278                              nullptr);
   5279 
   5280   // struct _protocol_t*
   5281   ProtocolnfABIPtrTy = llvm::PointerType::getUnqual(ProtocolnfABITy);
   5282 
   5283   // struct _protocol_list_t {
   5284   //   long protocol_count;   // Note, this is 32/64 bit
   5285   //   struct _protocol_t *[protocol_count];
   5286   // }
   5287   ProtocolListnfABITy->setBody(LongTy,
   5288                                llvm::ArrayType::get(ProtocolnfABIPtrTy, 0),
   5289                                nullptr);
   5290 
   5291   // struct _objc_protocol_list*
   5292   ProtocolListnfABIPtrTy = llvm::PointerType::getUnqual(ProtocolListnfABITy);
   5293 
   5294   // struct _ivar_t {
   5295   //   unsigned [long] int *offset;  // pointer to ivar offset location
   5296   //   char *name;
   5297   //   char *type;
   5298   //   uint32_t alignment;
   5299   //   uint32_t size;
   5300   // }
   5301   IvarnfABITy = llvm::StructType::create(
   5302       "struct._ivar_t", llvm::PointerType::getUnqual(IvarOffsetVarTy),
   5303       Int8PtrTy, Int8PtrTy, IntTy, IntTy, nullptr);
   5304 
   5305   // struct _ivar_list_t {
   5306   //   uint32 entsize;  // sizeof(struct _ivar_t)
   5307   //   uint32 count;
   5308   //   struct _iver_t list[count];
   5309   // }
   5310   IvarListnfABITy =
   5311     llvm::StructType::create("struct._ivar_list_t", IntTy, IntTy,
   5312                              llvm::ArrayType::get(IvarnfABITy, 0), nullptr);
   5313 
   5314   IvarListnfABIPtrTy = llvm::PointerType::getUnqual(IvarListnfABITy);
   5315 
   5316   // struct _class_ro_t {
   5317   //   uint32_t const flags;
   5318   //   uint32_t const instanceStart;
   5319   //   uint32_t const instanceSize;
   5320   //   uint32_t const reserved;  // only when building for 64bit targets
   5321   //   const uint8_t * const ivarLayout;
   5322   //   const char *const name;
   5323   //   const struct _method_list_t * const baseMethods;
   5324   //   const struct _objc_protocol_list *const baseProtocols;
   5325   //   const struct _ivar_list_t *const ivars;
   5326   //   const uint8_t * const weakIvarLayout;
   5327   //   const struct _prop_list_t * const properties;
   5328   // }
   5329 
   5330   // FIXME. Add 'reserved' field in 64bit abi mode!
   5331   ClassRonfABITy = llvm::StructType::create("struct._class_ro_t",
   5332                                             IntTy, IntTy, IntTy, Int8PtrTy,
   5333                                             Int8PtrTy, MethodListnfABIPtrTy,
   5334                                             ProtocolListnfABIPtrTy,
   5335                                             IvarListnfABIPtrTy,
   5336                                             Int8PtrTy, PropertyListPtrTy,
   5337                                             nullptr);
   5338 
   5339   // ImpnfABITy - LLVM for id (*)(id, SEL, ...)
   5340   llvm::Type *params[] = { ObjectPtrTy, SelectorPtrTy };
   5341   ImpnfABITy = llvm::FunctionType::get(ObjectPtrTy, params, false)
   5342                  ->getPointerTo();
   5343 
   5344   // struct _class_t {
   5345   //   struct _class_t *isa;
   5346   //   struct _class_t * const superclass;
   5347   //   void *cache;
   5348   //   IMP *vtable;
   5349   //   struct class_ro_t *ro;
   5350   // }
   5351 
   5352   ClassnfABITy = llvm::StructType::create(VMContext, "struct._class_t");
   5353   ClassnfABITy->setBody(llvm::PointerType::getUnqual(ClassnfABITy),
   5354                         llvm::PointerType::getUnqual(ClassnfABITy),
   5355                         CachePtrTy,
   5356                         llvm::PointerType::getUnqual(ImpnfABITy),
   5357                         llvm::PointerType::getUnqual(ClassRonfABITy),
   5358                         nullptr);
   5359 
   5360   // LLVM for struct _class_t *
   5361   ClassnfABIPtrTy = llvm::PointerType::getUnqual(ClassnfABITy);
   5362 
   5363   // struct _category_t {
   5364   //   const char * const name;
   5365   //   struct _class_t *const cls;
   5366   //   const struct _method_list_t * const instance_methods;
   5367   //   const struct _method_list_t * const class_methods;
   5368   //   const struct _protocol_list_t * const protocols;
   5369   //   const struct _prop_list_t * const properties;
   5370   // }
   5371   CategorynfABITy = llvm::StructType::create("struct._category_t",
   5372                                              Int8PtrTy, ClassnfABIPtrTy,
   5373                                              MethodListnfABIPtrTy,
   5374                                              MethodListnfABIPtrTy,
   5375                                              ProtocolListnfABIPtrTy,
   5376                                              PropertyListPtrTy,
   5377                                              nullptr);
   5378 
   5379   // New types for nonfragile abi messaging.
   5380   CodeGen::CodeGenTypes &Types = CGM.getTypes();
   5381   ASTContext &Ctx = CGM.getContext();
   5382 
   5383   // MessageRefTy - LLVM for:
   5384   // struct _message_ref_t {
   5385   //   IMP messenger;
   5386   //   SEL name;
   5387   // };
   5388 
   5389   // First the clang type for struct _message_ref_t
   5390   RecordDecl *RD = RecordDecl::Create(Ctx, TTK_Struct,
   5391                                       Ctx.getTranslationUnitDecl(),
   5392                                       SourceLocation(), SourceLocation(),
   5393                                       &Ctx.Idents.get("_message_ref_t"));
   5394   RD->addDecl(FieldDecl::Create(Ctx, RD, SourceLocation(), SourceLocation(),
   5395                                 nullptr, Ctx.VoidPtrTy, nullptr, nullptr, false,
   5396                                 ICIS_NoInit));
   5397   RD->addDecl(FieldDecl::Create(Ctx, RD, SourceLocation(), SourceLocation(),
   5398                                 nullptr, Ctx.getObjCSelType(), nullptr, nullptr,
   5399                                 false, ICIS_NoInit));
   5400   RD->completeDefinition();
   5401 
   5402   MessageRefCTy = Ctx.getTagDeclType(RD);
   5403   MessageRefCPtrTy = Ctx.getPointerType(MessageRefCTy);
   5404   MessageRefTy = cast<llvm::StructType>(Types.ConvertType(MessageRefCTy));
   5405 
   5406   // MessageRefPtrTy - LLVM for struct _message_ref_t*
   5407   MessageRefPtrTy = llvm::PointerType::getUnqual(MessageRefTy);
   5408 
   5409   // SuperMessageRefTy - LLVM for:
   5410   // struct _super_message_ref_t {
   5411   //   SUPER_IMP messenger;
   5412   //   SEL name;
   5413   // };
   5414   SuperMessageRefTy =
   5415     llvm::StructType::create("struct._super_message_ref_t",
   5416                              ImpnfABITy, SelectorPtrTy, nullptr);
   5417 
   5418   // SuperMessageRefPtrTy - LLVM for struct _super_message_ref_t*
   5419   SuperMessageRefPtrTy = llvm::PointerType::getUnqual(SuperMessageRefTy);
   5420 
   5421 
   5422   // struct objc_typeinfo {
   5423   //   const void** vtable; // objc_ehtype_vtable + 2
   5424   //   const char*  name;    // c++ typeinfo string
   5425   //   Class        cls;
   5426   // };
   5427   EHTypeTy =
   5428     llvm::StructType::create("struct._objc_typeinfo",
   5429                              llvm::PointerType::getUnqual(Int8PtrTy),
   5430                              Int8PtrTy, ClassnfABIPtrTy, nullptr);
   5431   EHTypePtrTy = llvm::PointerType::getUnqual(EHTypeTy);
   5432 }
   5433 
   5434 llvm::Function *CGObjCNonFragileABIMac::ModuleInitFunction() {
   5435   FinishNonFragileABIModule();
   5436 
   5437   return nullptr;
   5438 }
   5439 
   5440 void CGObjCNonFragileABIMac::
   5441 AddModuleClassList(ArrayRef<llvm::GlobalValue*> Container,
   5442                    const char *SymbolName,
   5443                    const char *SectionName) {
   5444   unsigned NumClasses = Container.size();
   5445 
   5446   if (!NumClasses)
   5447     return;
   5448 
   5449   SmallVector<llvm::Constant*, 8> Symbols(NumClasses);
   5450   for (unsigned i=0; i<NumClasses; i++)
   5451     Symbols[i] = llvm::ConstantExpr::getBitCast(Container[i],
   5452                                                 ObjCTypes.Int8PtrTy);
   5453   llvm::Constant *Init =
   5454     llvm::ConstantArray::get(llvm::ArrayType::get(ObjCTypes.Int8PtrTy,
   5455                                                   Symbols.size()),
   5456                              Symbols);
   5457 
   5458   llvm::GlobalVariable *GV =
   5459     new llvm::GlobalVariable(CGM.getModule(), Init->getType(), false,
   5460                              llvm::GlobalValue::PrivateLinkage,
   5461                              Init,
   5462                              SymbolName);
   5463   GV->setAlignment(CGM.getDataLayout().getABITypeAlignment(Init->getType()));
   5464   GV->setSection(SectionName);
   5465   CGM.addCompilerUsedGlobal(GV);
   5466 }
   5467 
   5468 void CGObjCNonFragileABIMac::FinishNonFragileABIModule() {
   5469   // nonfragile abi has no module definition.
   5470 
   5471   // Build list of all implemented class addresses in array
   5472   // L_OBJC_LABEL_CLASS_$.
   5473 
   5474   for (unsigned i=0, NumClasses=ImplementedClasses.size(); i<NumClasses; i++) {
   5475     const ObjCInterfaceDecl *ID = ImplementedClasses[i];
   5476     assert(ID);
   5477     if (ObjCImplementationDecl *IMP = ID->getImplementation())
   5478       // We are implementing a weak imported interface. Give it external linkage
   5479       if (ID->isWeakImported() && !IMP->isWeakImported()) {
   5480         DefinedClasses[i]->setLinkage(llvm::GlobalVariable::ExternalLinkage);
   5481         DefinedMetaClasses[i]->setLinkage(llvm::GlobalVariable::ExternalLinkage);
   5482       }
   5483   }
   5484 
   5485   AddModuleClassList(DefinedClasses, "OBJC_LABEL_CLASS_$",
   5486                      "__DATA, __objc_classlist, regular, no_dead_strip");
   5487 
   5488   AddModuleClassList(DefinedNonLazyClasses, "OBJC_LABEL_NONLAZY_CLASS_$",
   5489                      "__DATA, __objc_nlclslist, regular, no_dead_strip");
   5490 
   5491   // Build list of all implemented category addresses in array
   5492   // L_OBJC_LABEL_CATEGORY_$.
   5493   AddModuleClassList(DefinedCategories, "OBJC_LABEL_CATEGORY_$",
   5494                      "__DATA, __objc_catlist, regular, no_dead_strip");
   5495   AddModuleClassList(DefinedNonLazyCategories, "OBJC_LABEL_NONLAZY_CATEGORY_$",
   5496                      "__DATA, __objc_nlcatlist, regular, no_dead_strip");
   5497 
   5498   EmitImageInfo();
   5499 }
   5500 
   5501 /// isVTableDispatchedSelector - Returns true if SEL is not in the list of
   5502 /// VTableDispatchMethods; false otherwise. What this means is that
   5503 /// except for the 19 selectors in the list, we generate 32bit-style
   5504 /// message dispatch call for all the rest.
   5505 bool CGObjCNonFragileABIMac::isVTableDispatchedSelector(Selector Sel) {
   5506   // At various points we've experimented with using vtable-based
   5507   // dispatch for all methods.
   5508   switch (CGM.getCodeGenOpts().getObjCDispatchMethod()) {
   5509   case CodeGenOptions::Legacy:
   5510     return false;
   5511   case CodeGenOptions::NonLegacy:
   5512     return true;
   5513   case CodeGenOptions::Mixed:
   5514     break;
   5515   }
   5516 
   5517   // If so, see whether this selector is in the white-list of things which must
   5518   // use the new dispatch convention. We lazily build a dense set for this.
   5519   if (VTableDispatchMethods.empty()) {
   5520     VTableDispatchMethods.insert(GetNullarySelector("alloc"));
   5521     VTableDispatchMethods.insert(GetNullarySelector("class"));
   5522     VTableDispatchMethods.insert(GetNullarySelector("self"));
   5523     VTableDispatchMethods.insert(GetNullarySelector("isFlipped"));
   5524     VTableDispatchMethods.insert(GetNullarySelector("length"));
   5525     VTableDispatchMethods.insert(GetNullarySelector("count"));
   5526 
   5527     // These are vtable-based if GC is disabled.
   5528     // Optimistically use vtable dispatch for hybrid compiles.
   5529     if (CGM.getLangOpts().getGC() != LangOptions::GCOnly) {
   5530       VTableDispatchMethods.insert(GetNullarySelector("retain"));
   5531       VTableDispatchMethods.insert(GetNullarySelector("release"));
   5532       VTableDispatchMethods.insert(GetNullarySelector("autorelease"));
   5533     }
   5534 
   5535     VTableDispatchMethods.insert(GetUnarySelector("allocWithZone"));
   5536     VTableDispatchMethods.insert(GetUnarySelector("isKindOfClass"));
   5537     VTableDispatchMethods.insert(GetUnarySelector("respondsToSelector"));
   5538     VTableDispatchMethods.insert(GetUnarySelector("objectForKey"));
   5539     VTableDispatchMethods.insert(GetUnarySelector("objectAtIndex"));
   5540     VTableDispatchMethods.insert(GetUnarySelector("isEqualToString"));
   5541     VTableDispatchMethods.insert(GetUnarySelector("isEqual"));
   5542 
   5543     // These are vtable-based if GC is enabled.
   5544     // Optimistically use vtable dispatch for hybrid compiles.
   5545     if (CGM.getLangOpts().getGC() != LangOptions::NonGC) {
   5546       VTableDispatchMethods.insert(GetNullarySelector("hash"));
   5547       VTableDispatchMethods.insert(GetUnarySelector("addObject"));
   5548 
   5549       // "countByEnumeratingWithState:objects:count"
   5550       IdentifierInfo *KeyIdents[] = {
   5551         &CGM.getContext().Idents.get("countByEnumeratingWithState"),
   5552         &CGM.getContext().Idents.get("objects"),
   5553         &CGM.getContext().Idents.get("count")
   5554       };
   5555       VTableDispatchMethods.insert(
   5556         CGM.getContext().Selectors.getSelector(3, KeyIdents));
   5557     }
   5558   }
   5559 
   5560   return VTableDispatchMethods.count(Sel);
   5561 }
   5562 
   5563 /// BuildClassRoTInitializer - generate meta-data for:
   5564 /// struct _class_ro_t {
   5565 ///   uint32_t const flags;
   5566 ///   uint32_t const instanceStart;
   5567 ///   uint32_t const instanceSize;
   5568 ///   uint32_t const reserved;  // only when building for 64bit targets
   5569 ///   const uint8_t * const ivarLayout;
   5570 ///   const char *const name;
   5571 ///   const struct _method_list_t * const baseMethods;
   5572 ///   const struct _protocol_list_t *const baseProtocols;
   5573 ///   const struct _ivar_list_t *const ivars;
   5574 ///   const uint8_t * const weakIvarLayout;
   5575 ///   const struct _prop_list_t * const properties;
   5576 /// }
   5577 ///
   5578 llvm::GlobalVariable * CGObjCNonFragileABIMac::BuildClassRoTInitializer(
   5579   unsigned flags,
   5580   unsigned InstanceStart,
   5581   unsigned InstanceSize,
   5582   const ObjCImplementationDecl *ID) {
   5583   std::string ClassName = ID->getObjCRuntimeNameAsString();
   5584   llvm::Constant *Values[10]; // 11 for 64bit targets!
   5585 
   5586   if (CGM.getLangOpts().ObjCAutoRefCount)
   5587     flags |= NonFragileABI_Class_CompiledByARC;
   5588 
   5589   Values[ 0] = llvm::ConstantInt::get(ObjCTypes.IntTy, flags);
   5590   Values[ 1] = llvm::ConstantInt::get(ObjCTypes.IntTy, InstanceStart);
   5591   Values[ 2] = llvm::ConstantInt::get(ObjCTypes.IntTy, InstanceSize);
   5592   // FIXME. For 64bit targets add 0 here.
   5593   Values[ 3] = (flags & NonFragileABI_Class_Meta)
   5594     ? GetIvarLayoutName(nullptr, ObjCTypes)
   5595     : BuildIvarLayout(ID, true);
   5596   Values[ 4] = GetClassName(ID->getObjCRuntimeNameAsString());
   5597   // const struct _method_list_t * const baseMethods;
   5598   std::vector<llvm::Constant*> Methods;
   5599   std::string MethodListName("\01l_OBJC_$_");
   5600   if (flags & NonFragileABI_Class_Meta) {
   5601     MethodListName += "CLASS_METHODS_";
   5602     MethodListName += ID->getObjCRuntimeNameAsString();
   5603     for (const auto *I : ID->class_methods())
   5604       // Class methods should always be defined.
   5605       Methods.push_back(GetMethodConstant(I));
   5606   } else {
   5607     MethodListName += "INSTANCE_METHODS_";
   5608     MethodListName += ID->getObjCRuntimeNameAsString();
   5609     for (const auto *I : ID->instance_methods())
   5610       // Instance methods should always be defined.
   5611       Methods.push_back(GetMethodConstant(I));
   5612 
   5613     for (const auto *PID : ID->property_impls()) {
   5614       if (PID->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize){
   5615         ObjCPropertyDecl *PD = PID->getPropertyDecl();
   5616 
   5617         if (ObjCMethodDecl *MD = PD->getGetterMethodDecl())
   5618           if (llvm::Constant *C = GetMethodConstant(MD))
   5619             Methods.push_back(C);
   5620         if (ObjCMethodDecl *MD = PD->getSetterMethodDecl())
   5621           if (llvm::Constant *C = GetMethodConstant(MD))
   5622             Methods.push_back(C);
   5623       }
   5624     }
   5625   }
   5626   Values[ 5] = EmitMethodList(MethodListName,
   5627                               "__DATA, __objc_const", Methods);
   5628 
   5629   const ObjCInterfaceDecl *OID = ID->getClassInterface();
   5630   assert(OID && "CGObjCNonFragileABIMac::BuildClassRoTInitializer");
   5631   Values[ 6] = EmitProtocolList("\01l_OBJC_CLASS_PROTOCOLS_$_"
   5632                                 + OID->getObjCRuntimeNameAsString(),
   5633                                 OID->all_referenced_protocol_begin(),
   5634                                 OID->all_referenced_protocol_end());
   5635 
   5636   if (flags & NonFragileABI_Class_Meta) {
   5637     Values[ 7] = llvm::Constant::getNullValue(ObjCTypes.IvarListnfABIPtrTy);
   5638     Values[ 8] = GetIvarLayoutName(nullptr, ObjCTypes);
   5639     Values[ 9] = llvm::Constant::getNullValue(ObjCTypes.PropertyListPtrTy);
   5640   } else {
   5641     Values[ 7] = EmitIvarList(ID);
   5642     Values[ 8] = BuildIvarLayout(ID, false);
   5643     Values[ 9] = EmitPropertyList("\01l_OBJC_$_PROP_LIST_" + ID->getObjCRuntimeNameAsString(),
   5644                                   ID, ID->getClassInterface(), ObjCTypes);
   5645   }
   5646   llvm::Constant *Init = llvm::ConstantStruct::get(ObjCTypes.ClassRonfABITy,
   5647                                                    Values);
   5648   llvm::GlobalVariable *CLASS_RO_GV =
   5649     new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ClassRonfABITy, false,
   5650                              llvm::GlobalValue::PrivateLinkage,
   5651                              Init,
   5652                              (flags & NonFragileABI_Class_Meta) ?
   5653                              std::string("\01l_OBJC_METACLASS_RO_$_")+ClassName :
   5654                              std::string("\01l_OBJC_CLASS_RO_$_")+ClassName);
   5655   CLASS_RO_GV->setAlignment(
   5656     CGM.getDataLayout().getABITypeAlignment(ObjCTypes.ClassRonfABITy));
   5657   CLASS_RO_GV->setSection("__DATA, __objc_const");
   5658   return CLASS_RO_GV;
   5659 
   5660 }
   5661 
   5662 /// BuildClassMetaData - This routine defines that to-level meta-data
   5663 /// for the given ClassName for:
   5664 /// struct _class_t {
   5665 ///   struct _class_t *isa;
   5666 ///   struct _class_t * const superclass;
   5667 ///   void *cache;
   5668 ///   IMP *vtable;
   5669 ///   struct class_ro_t *ro;
   5670 /// }
   5671 ///
   5672 llvm::GlobalVariable *CGObjCNonFragileABIMac::BuildClassMetaData(
   5673     const std::string &ClassName, llvm::Constant *IsAGV, llvm::Constant *SuperClassGV,
   5674     llvm::Constant *ClassRoGV, bool HiddenVisibility, bool Weak) {
   5675   llvm::Constant *Values[] = {
   5676     IsAGV,
   5677     SuperClassGV,
   5678     ObjCEmptyCacheVar,  // &ObjCEmptyCacheVar
   5679     ObjCEmptyVtableVar, // &ObjCEmptyVtableVar
   5680     ClassRoGV           // &CLASS_RO_GV
   5681   };
   5682   if (!Values[1])
   5683     Values[1] = llvm::Constant::getNullValue(ObjCTypes.ClassnfABIPtrTy);
   5684   if (!Values[3])
   5685     Values[3] = llvm::Constant::getNullValue(
   5686                   llvm::PointerType::getUnqual(ObjCTypes.ImpnfABITy));
   5687   llvm::Constant *Init = llvm::ConstantStruct::get(ObjCTypes.ClassnfABITy,
   5688                                                    Values);
   5689   llvm::GlobalVariable *GV = GetClassGlobal(ClassName, Weak);
   5690   GV->setInitializer(Init);
   5691   GV->setSection("__DATA, __objc_data");
   5692   GV->setAlignment(
   5693     CGM.getDataLayout().getABITypeAlignment(ObjCTypes.ClassnfABITy));
   5694   if (HiddenVisibility)
   5695     GV->setVisibility(llvm::GlobalValue::HiddenVisibility);
   5696   return GV;
   5697 }
   5698 
   5699 bool
   5700 CGObjCNonFragileABIMac::ImplementationIsNonLazy(const ObjCImplDecl *OD) const {
   5701   return OD->getClassMethod(GetNullarySelector("load")) != nullptr;
   5702 }
   5703 
   5704 void CGObjCNonFragileABIMac::GetClassSizeInfo(const ObjCImplementationDecl *OID,
   5705                                               uint32_t &InstanceStart,
   5706                                               uint32_t &InstanceSize) {
   5707   const ASTRecordLayout &RL =
   5708     CGM.getContext().getASTObjCImplementationLayout(OID);
   5709 
   5710   // InstanceSize is really instance end.
   5711   InstanceSize = RL.getDataSize().getQuantity();
   5712 
   5713   // If there are no fields, the start is the same as the end.
   5714   if (!RL.getFieldCount())
   5715     InstanceStart = InstanceSize;
   5716   else
   5717     InstanceStart = RL.getFieldOffset(0) / CGM.getContext().getCharWidth();
   5718 }
   5719 
   5720 void CGObjCNonFragileABIMac::GenerateClass(const ObjCImplementationDecl *ID) {
   5721   std::string ClassName = ID->getObjCRuntimeNameAsString();
   5722   if (!ObjCEmptyCacheVar) {
   5723     ObjCEmptyCacheVar = new llvm::GlobalVariable(
   5724       CGM.getModule(),
   5725       ObjCTypes.CacheTy,
   5726       false,
   5727       llvm::GlobalValue::ExternalLinkage,
   5728       nullptr,
   5729       "_objc_empty_cache");
   5730 
   5731     // Make this entry NULL for any iOS device target, any iOS simulator target,
   5732     // OS X with deployment target 10.9 or later.
   5733     const llvm::Triple &Triple = CGM.getTarget().getTriple();
   5734     if (Triple.isiOS() || (Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 9)))
   5735       // This entry will be null.
   5736       ObjCEmptyVtableVar = nullptr;
   5737     else
   5738       ObjCEmptyVtableVar = new llvm::GlobalVariable(
   5739                                                     CGM.getModule(),
   5740                                                     ObjCTypes.ImpnfABITy,
   5741                                                     false,
   5742                                                     llvm::GlobalValue::ExternalLinkage,
   5743                                                     nullptr,
   5744                                                     "_objc_empty_vtable");
   5745   }
   5746   assert(ID->getClassInterface() &&
   5747          "CGObjCNonFragileABIMac::GenerateClass - class is 0");
   5748   // FIXME: Is this correct (that meta class size is never computed)?
   5749   uint32_t InstanceStart =
   5750     CGM.getDataLayout().getTypeAllocSize(ObjCTypes.ClassnfABITy);
   5751   uint32_t InstanceSize = InstanceStart;
   5752   uint32_t flags = NonFragileABI_Class_Meta;
   5753   llvm::SmallString<64> ObjCMetaClassName(getMetaclassSymbolPrefix());
   5754   llvm::SmallString<64> ObjCClassName(getClassSymbolPrefix());
   5755   llvm::SmallString<64> TClassName;
   5756 
   5757   llvm::GlobalVariable *SuperClassGV, *IsAGV;
   5758 
   5759   // Build the flags for the metaclass.
   5760   bool classIsHidden =
   5761     ID->getClassInterface()->getVisibility() == HiddenVisibility;
   5762   if (classIsHidden)
   5763     flags |= NonFragileABI_Class_Hidden;
   5764 
   5765   // FIXME: why is this flag set on the metaclass?
   5766   // ObjC metaclasses have no fields and don't really get constructed.
   5767   if (ID->hasNonZeroConstructors() || ID->hasDestructors()) {
   5768     flags |= NonFragileABI_Class_HasCXXStructors;
   5769     if (!ID->hasNonZeroConstructors())
   5770       flags |= NonFragileABI_Class_HasCXXDestructorOnly;
   5771   }
   5772 
   5773   if (!ID->getClassInterface()->getSuperClass()) {
   5774     // class is root
   5775     flags |= NonFragileABI_Class_Root;
   5776     TClassName = ObjCClassName;
   5777     TClassName += ClassName;
   5778     SuperClassGV = GetClassGlobal(TClassName.str(),
   5779                                   ID->getClassInterface()->isWeakImported());
   5780     TClassName = ObjCMetaClassName;
   5781     TClassName += ClassName;
   5782     IsAGV = GetClassGlobal(TClassName.str(),
   5783                            ID->getClassInterface()->isWeakImported());
   5784   } else {
   5785     // Has a root. Current class is not a root.
   5786     const ObjCInterfaceDecl *Root = ID->getClassInterface();
   5787     while (const ObjCInterfaceDecl *Super = Root->getSuperClass())
   5788       Root = Super;
   5789     TClassName = ObjCMetaClassName ;
   5790     TClassName += Root->getObjCRuntimeNameAsString();
   5791     IsAGV = GetClassGlobal(TClassName.str(),
   5792                            Root->isWeakImported());
   5793 
   5794     // work on super class metadata symbol.
   5795     TClassName = ObjCMetaClassName;
   5796     TClassName += ID->getClassInterface()->getSuperClass()->getObjCRuntimeNameAsString();
   5797     SuperClassGV = GetClassGlobal(
   5798                                   TClassName.str(),
   5799                                   ID->getClassInterface()->getSuperClass()->isWeakImported());
   5800   }
   5801   llvm::GlobalVariable *CLASS_RO_GV = BuildClassRoTInitializer(flags,
   5802                                                                InstanceStart,
   5803                                                                InstanceSize,ID);
   5804   TClassName = ObjCMetaClassName;
   5805   TClassName += ClassName;
   5806   llvm::GlobalVariable *MetaTClass = BuildClassMetaData(
   5807       TClassName.str(), IsAGV, SuperClassGV, CLASS_RO_GV, classIsHidden,
   5808       ID->getClassInterface()->isWeakImported());
   5809   DefinedMetaClasses.push_back(MetaTClass);
   5810 
   5811   // Metadata for the class
   5812   flags = 0;
   5813   if (classIsHidden)
   5814     flags |= NonFragileABI_Class_Hidden;
   5815 
   5816   if (ID->hasNonZeroConstructors() || ID->hasDestructors()) {
   5817     flags |= NonFragileABI_Class_HasCXXStructors;
   5818 
   5819     // Set a flag to enable a runtime optimization when a class has
   5820     // fields that require destruction but which don't require
   5821     // anything except zero-initialization during construction.  This
   5822     // is most notably true of __strong and __weak types, but you can
   5823     // also imagine there being C++ types with non-trivial default
   5824     // constructors that merely set all fields to null.
   5825     if (!ID->hasNonZeroConstructors())
   5826       flags |= NonFragileABI_Class_HasCXXDestructorOnly;
   5827   }
   5828 
   5829   if (hasObjCExceptionAttribute(CGM.getContext(), ID->getClassInterface()))
   5830     flags |= NonFragileABI_Class_Exception;
   5831 
   5832   if (!ID->getClassInterface()->getSuperClass()) {
   5833     flags |= NonFragileABI_Class_Root;
   5834     SuperClassGV = nullptr;
   5835   } else {
   5836     // Has a root. Current class is not a root.
   5837     TClassName = ObjCClassName;
   5838     TClassName += ID->getClassInterface()->getSuperClass()->getObjCRuntimeNameAsString();
   5839     SuperClassGV = GetClassGlobal(
   5840                                   TClassName.str(),
   5841                                   ID->getClassInterface()->getSuperClass()->isWeakImported());
   5842   }
   5843   GetClassSizeInfo(ID, InstanceStart, InstanceSize);
   5844   CLASS_RO_GV = BuildClassRoTInitializer(flags,
   5845                                          InstanceStart,
   5846                                          InstanceSize,
   5847                                          ID);
   5848 
   5849   TClassName = ObjCClassName;
   5850   TClassName += ClassName;
   5851   llvm::GlobalVariable *ClassMD =
   5852     BuildClassMetaData(TClassName.str(), MetaTClass, SuperClassGV, CLASS_RO_GV,
   5853                        classIsHidden,
   5854                        ID->getClassInterface()->isWeakImported());
   5855   DefinedClasses.push_back(ClassMD);
   5856   ImplementedClasses.push_back(ID->getClassInterface());
   5857 
   5858   // Determine if this class is also "non-lazy".
   5859   if (ImplementationIsNonLazy(ID))
   5860     DefinedNonLazyClasses.push_back(ClassMD);
   5861 
   5862   // Force the definition of the EHType if necessary.
   5863   if (flags & NonFragileABI_Class_Exception)
   5864     GetInterfaceEHType(ID->getClassInterface(), true);
   5865   // Make sure method definition entries are all clear for next implementation.
   5866   MethodDefinitions.clear();
   5867 }
   5868 
   5869 /// GenerateProtocolRef - This routine is called to generate code for
   5870 /// a protocol reference expression; as in:
   5871 /// @code
   5872 ///   @protocol(Proto1);
   5873 /// @endcode
   5874 /// It generates a weak reference to l_OBJC_PROTOCOL_REFERENCE_$_Proto1
   5875 /// which will hold address of the protocol meta-data.
   5876 ///
   5877 llvm::Value *CGObjCNonFragileABIMac::GenerateProtocolRef(CodeGenFunction &CGF,
   5878                                                          const ObjCProtocolDecl *PD) {
   5879 
   5880   // This routine is called for @protocol only. So, we must build definition
   5881   // of protocol's meta-data (not a reference to it!)
   5882   //
   5883   llvm::Constant *Init =
   5884     llvm::ConstantExpr::getBitCast(GetOrEmitProtocol(PD),
   5885                                    ObjCTypes.getExternalProtocolPtrTy());
   5886 
   5887   std::string ProtocolName("\01l_OBJC_PROTOCOL_REFERENCE_$_");
   5888   ProtocolName += PD->getObjCRuntimeNameAsString();
   5889 
   5890   llvm::GlobalVariable *PTGV = CGM.getModule().getGlobalVariable(ProtocolName);
   5891   if (PTGV)
   5892     return CGF.Builder.CreateLoad(PTGV);
   5893   PTGV = new llvm::GlobalVariable(
   5894     CGM.getModule(),
   5895     Init->getType(), false,
   5896     llvm::GlobalValue::WeakAnyLinkage,
   5897     Init,
   5898     ProtocolName);
   5899   PTGV->setSection("__DATA, __objc_protorefs, coalesced, no_dead_strip");
   5900   PTGV->setVisibility(llvm::GlobalValue::HiddenVisibility);
   5901   CGM.addCompilerUsedGlobal(PTGV);
   5902   return CGF.Builder.CreateLoad(PTGV);
   5903 }
   5904 
   5905 /// GenerateCategory - Build metadata for a category implementation.
   5906 /// struct _category_t {
   5907 ///   const char * const name;
   5908 ///   struct _class_t *const cls;
   5909 ///   const struct _method_list_t * const instance_methods;
   5910 ///   const struct _method_list_t * const class_methods;
   5911 ///   const struct _protocol_list_t * const protocols;
   5912 ///   const struct _prop_list_t * const properties;
   5913 /// }
   5914 ///
   5915 void CGObjCNonFragileABIMac::GenerateCategory(const ObjCCategoryImplDecl *OCD) {
   5916   const ObjCInterfaceDecl *Interface = OCD->getClassInterface();
   5917   const char *Prefix = "\01l_OBJC_$_CATEGORY_";
   5918 
   5919   llvm::SmallString<64> ExtCatName(Prefix);
   5920   ExtCatName += Interface->getObjCRuntimeNameAsString();
   5921   ExtCatName += "_$_";
   5922   ExtCatName += OCD->getNameAsString();
   5923 
   5924   llvm::SmallString<64> ExtClassName(getClassSymbolPrefix());
   5925   ExtClassName += Interface->getObjCRuntimeNameAsString();
   5926 
   5927   llvm::Constant *Values[6];
   5928   Values[0] = GetClassName(OCD->getIdentifier()->getName());
   5929   // meta-class entry symbol
   5930   llvm::GlobalVariable *ClassGV =
   5931       GetClassGlobal(ExtClassName.str(), Interface->isWeakImported());
   5932 
   5933   Values[1] = ClassGV;
   5934   std::vector<llvm::Constant*> Methods;
   5935   llvm::SmallString<64> MethodListName(Prefix);
   5936 
   5937   MethodListName += "INSTANCE_METHODS_";
   5938   MethodListName += Interface->getObjCRuntimeNameAsString();
   5939   MethodListName += "_$_";
   5940   MethodListName += OCD->getName();
   5941 
   5942   for (const auto *I : OCD->instance_methods())
   5943     // Instance methods should always be defined.
   5944     Methods.push_back(GetMethodConstant(I));
   5945 
   5946   Values[2] = EmitMethodList(MethodListName.str(),
   5947                              "__DATA, __objc_const",
   5948                              Methods);
   5949 
   5950   MethodListName = Prefix;
   5951   MethodListName += "CLASS_METHODS_";
   5952   MethodListName += Interface->getObjCRuntimeNameAsString();
   5953   MethodListName += "_$_";
   5954   MethodListName += OCD->getNameAsString();
   5955 
   5956   Methods.clear();
   5957   for (const auto *I : OCD->class_methods())
   5958     // Class methods should always be defined.
   5959     Methods.push_back(GetMethodConstant(I));
   5960 
   5961   Values[3] = EmitMethodList(MethodListName.str(),
   5962                              "__DATA, __objc_const",
   5963                              Methods);
   5964   const ObjCCategoryDecl *Category =
   5965     Interface->FindCategoryDeclaration(OCD->getIdentifier());
   5966   if (Category) {
   5967     SmallString<256> ExtName;
   5968     llvm::raw_svector_ostream(ExtName) << Interface->getObjCRuntimeNameAsString() << "_$_"
   5969                                        << OCD->getName();
   5970     Values[4] = EmitProtocolList("\01l_OBJC_CATEGORY_PROTOCOLS_$_"
   5971                                    + Interface->getObjCRuntimeNameAsString() + "_$_"
   5972                                    + Category->getName(),
   5973                                    Category->protocol_begin(),
   5974                                    Category->protocol_end());
   5975     Values[5] = EmitPropertyList("\01l_OBJC_$_PROP_LIST_" + ExtName.str(),
   5976                                  OCD, Category, ObjCTypes);
   5977   } else {
   5978     Values[4] = llvm::Constant::getNullValue(ObjCTypes.ProtocolListnfABIPtrTy);
   5979     Values[5] = llvm::Constant::getNullValue(ObjCTypes.PropertyListPtrTy);
   5980   }
   5981 
   5982   llvm::Constant *Init =
   5983     llvm::ConstantStruct::get(ObjCTypes.CategorynfABITy,
   5984                               Values);
   5985   llvm::GlobalVariable *GCATV
   5986     = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.CategorynfABITy,
   5987                                false,
   5988                                llvm::GlobalValue::PrivateLinkage,
   5989                                Init,
   5990                                ExtCatName.str());
   5991   GCATV->setAlignment(
   5992     CGM.getDataLayout().getABITypeAlignment(ObjCTypes.CategorynfABITy));
   5993   GCATV->setSection("__DATA, __objc_const");
   5994   CGM.addCompilerUsedGlobal(GCATV);
   5995   DefinedCategories.push_back(GCATV);
   5996 
   5997   // Determine if this category is also "non-lazy".
   5998   if (ImplementationIsNonLazy(OCD))
   5999     DefinedNonLazyCategories.push_back(GCATV);
   6000   // method definition entries must be clear for next implementation.
   6001   MethodDefinitions.clear();
   6002 }
   6003 
   6004 /// GetMethodConstant - Return a struct objc_method constant for the
   6005 /// given method if it has been defined. The result is null if the
   6006 /// method has not been defined. The return value has type MethodPtrTy.
   6007 llvm::Constant *CGObjCNonFragileABIMac::GetMethodConstant(
   6008   const ObjCMethodDecl *MD) {
   6009   llvm::Function *Fn = GetMethodDefinition(MD);
   6010   if (!Fn)
   6011     return nullptr;
   6012 
   6013   llvm::Constant *Method[] = {
   6014     llvm::ConstantExpr::getBitCast(GetMethodVarName(MD->getSelector()),
   6015                                    ObjCTypes.SelectorPtrTy),
   6016     GetMethodVarType(MD),
   6017     llvm::ConstantExpr::getBitCast(Fn, ObjCTypes.Int8PtrTy)
   6018   };
   6019   return llvm::ConstantStruct::get(ObjCTypes.MethodTy, Method);
   6020 }
   6021 
   6022 /// EmitMethodList - Build meta-data for method declarations
   6023 /// struct _method_list_t {
   6024 ///   uint32_t entsize;  // sizeof(struct _objc_method)
   6025 ///   uint32_t method_count;
   6026 ///   struct _objc_method method_list[method_count];
   6027 /// }
   6028 ///
   6029 llvm::Constant *
   6030 CGObjCNonFragileABIMac::EmitMethodList(Twine Name,
   6031                                        const char *Section,
   6032                                        ArrayRef<llvm::Constant*> Methods) {
   6033   // Return null for empty list.
   6034   if (Methods.empty())
   6035     return llvm::Constant::getNullValue(ObjCTypes.MethodListnfABIPtrTy);
   6036 
   6037   llvm::Constant *Values[3];
   6038   // sizeof(struct _objc_method)
   6039   unsigned Size = CGM.getDataLayout().getTypeAllocSize(ObjCTypes.MethodTy);
   6040   Values[0] = llvm::ConstantInt::get(ObjCTypes.IntTy, Size);
   6041   // method_count
   6042   Values[1] = llvm::ConstantInt::get(ObjCTypes.IntTy, Methods.size());
   6043   llvm::ArrayType *AT = llvm::ArrayType::get(ObjCTypes.MethodTy,
   6044                                              Methods.size());
   6045   Values[2] = llvm::ConstantArray::get(AT, Methods);
   6046   llvm::Constant *Init = llvm::ConstantStruct::getAnon(Values);
   6047 
   6048   llvm::GlobalVariable *GV =
   6049     new llvm::GlobalVariable(CGM.getModule(), Init->getType(), false,
   6050                              llvm::GlobalValue::PrivateLinkage, Init, Name);
   6051   GV->setAlignment(CGM.getDataLayout().getABITypeAlignment(Init->getType()));
   6052   GV->setSection(Section);
   6053   CGM.addCompilerUsedGlobal(GV);
   6054   return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.MethodListnfABIPtrTy);
   6055 }
   6056 
   6057 /// ObjCIvarOffsetVariable - Returns the ivar offset variable for
   6058 /// the given ivar.
   6059 llvm::GlobalVariable *
   6060 CGObjCNonFragileABIMac::ObjCIvarOffsetVariable(const ObjCInterfaceDecl *ID,
   6061                                                const ObjCIvarDecl *Ivar) {
   6062 
   6063   const ObjCInterfaceDecl *Container = Ivar->getContainingInterface();
   6064   llvm::SmallString<64> Name("OBJC_IVAR_$_");
   6065   Name += Container->getObjCRuntimeNameAsString();
   6066   Name += ".";
   6067   Name += Ivar->getName();
   6068   llvm::GlobalVariable *IvarOffsetGV =
   6069     CGM.getModule().getGlobalVariable(Name);
   6070   if (!IvarOffsetGV)
   6071     IvarOffsetGV = new llvm::GlobalVariable(
   6072       CGM.getModule(), ObjCTypes.IvarOffsetVarTy, false,
   6073       llvm::GlobalValue::ExternalLinkage, nullptr, Name.str());
   6074   return IvarOffsetGV;
   6075 }
   6076 
   6077 llvm::Constant *
   6078 CGObjCNonFragileABIMac::EmitIvarOffsetVar(const ObjCInterfaceDecl *ID,
   6079                                           const ObjCIvarDecl *Ivar,
   6080                                           unsigned long int Offset) {
   6081   llvm::GlobalVariable *IvarOffsetGV = ObjCIvarOffsetVariable(ID, Ivar);
   6082   IvarOffsetGV->setInitializer(
   6083       llvm::ConstantInt::get(ObjCTypes.IvarOffsetVarTy, Offset));
   6084   IvarOffsetGV->setAlignment(
   6085       CGM.getDataLayout().getABITypeAlignment(ObjCTypes.IvarOffsetVarTy));
   6086 
   6087   // FIXME: This matches gcc, but shouldn't the visibility be set on the use as
   6088   // well (i.e., in ObjCIvarOffsetVariable).
   6089   if (Ivar->getAccessControl() == ObjCIvarDecl::Private ||
   6090       Ivar->getAccessControl() == ObjCIvarDecl::Package ||
   6091       ID->getVisibility() == HiddenVisibility)
   6092     IvarOffsetGV->setVisibility(llvm::GlobalValue::HiddenVisibility);
   6093   else
   6094     IvarOffsetGV->setVisibility(llvm::GlobalValue::DefaultVisibility);
   6095   IvarOffsetGV->setSection("__DATA, __objc_ivar");
   6096   return IvarOffsetGV;
   6097 }
   6098 
   6099 /// EmitIvarList - Emit the ivar list for the given
   6100 /// implementation. The return value has type
   6101 /// IvarListnfABIPtrTy.
   6102 ///  struct _ivar_t {
   6103 ///   unsigned [long] int *offset;  // pointer to ivar offset location
   6104 ///   char *name;
   6105 ///   char *type;
   6106 ///   uint32_t alignment;
   6107 ///   uint32_t size;
   6108 /// }
   6109 /// struct _ivar_list_t {
   6110 ///   uint32 entsize;  // sizeof(struct _ivar_t)
   6111 ///   uint32 count;
   6112 ///   struct _iver_t list[count];
   6113 /// }
   6114 ///
   6115 
   6116 llvm::Constant *CGObjCNonFragileABIMac::EmitIvarList(
   6117   const ObjCImplementationDecl *ID) {
   6118 
   6119   std::vector<llvm::Constant*> Ivars;
   6120 
   6121   const ObjCInterfaceDecl *OID = ID->getClassInterface();
   6122   assert(OID && "CGObjCNonFragileABIMac::EmitIvarList - null interface");
   6123 
   6124   // FIXME. Consolidate this with similar code in GenerateClass.
   6125 
   6126   for (const ObjCIvarDecl *IVD = OID->all_declared_ivar_begin();
   6127        IVD; IVD = IVD->getNextIvar()) {
   6128     // Ignore unnamed bit-fields.
   6129     if (!IVD->getDeclName())
   6130       continue;
   6131     llvm::Constant *Ivar[5];
   6132     Ivar[0] = EmitIvarOffsetVar(ID->getClassInterface(), IVD,
   6133                                 ComputeIvarBaseOffset(CGM, ID, IVD));
   6134     Ivar[1] = GetMethodVarName(IVD->getIdentifier());
   6135     Ivar[2] = GetMethodVarType(IVD);
   6136     llvm::Type *FieldTy =
   6137       CGM.getTypes().ConvertTypeForMem(IVD->getType());
   6138     unsigned Size = CGM.getDataLayout().getTypeAllocSize(FieldTy);
   6139     unsigned Align = CGM.getContext().getPreferredTypeAlign(
   6140       IVD->getType().getTypePtr()) >> 3;
   6141     Align = llvm::Log2_32(Align);
   6142     Ivar[3] = llvm::ConstantInt::get(ObjCTypes.IntTy, Align);
   6143     // NOTE. Size of a bitfield does not match gcc's, because of the
   6144     // way bitfields are treated special in each. But I am told that
   6145     // 'size' for bitfield ivars is ignored by the runtime so it does
   6146     // not matter.  If it matters, there is enough info to get the
   6147     // bitfield right!
   6148     Ivar[4] = llvm::ConstantInt::get(ObjCTypes.IntTy, Size);
   6149     Ivars.push_back(llvm::ConstantStruct::get(ObjCTypes.IvarnfABITy, Ivar));
   6150   }
   6151   // Return null for empty list.
   6152   if (Ivars.empty())
   6153     return llvm::Constant::getNullValue(ObjCTypes.IvarListnfABIPtrTy);
   6154 
   6155   llvm::Constant *Values[3];
   6156   unsigned Size = CGM.getDataLayout().getTypeAllocSize(ObjCTypes.IvarnfABITy);
   6157   Values[0] = llvm::ConstantInt::get(ObjCTypes.IntTy, Size);
   6158   Values[1] = llvm::ConstantInt::get(ObjCTypes.IntTy, Ivars.size());
   6159   llvm::ArrayType *AT = llvm::ArrayType::get(ObjCTypes.IvarnfABITy,
   6160                                              Ivars.size());
   6161   Values[2] = llvm::ConstantArray::get(AT, Ivars);
   6162   llvm::Constant *Init = llvm::ConstantStruct::getAnon(Values);
   6163   const char *Prefix = "\01l_OBJC_$_INSTANCE_VARIABLES_";
   6164   llvm::GlobalVariable *GV =
   6165     new llvm::GlobalVariable(CGM.getModule(), Init->getType(), false,
   6166                              llvm::GlobalValue::PrivateLinkage,
   6167                              Init,
   6168                              Prefix + OID->getObjCRuntimeNameAsString());
   6169   GV->setAlignment(
   6170     CGM.getDataLayout().getABITypeAlignment(Init->getType()));
   6171   GV->setSection("__DATA, __objc_const");
   6172 
   6173   CGM.addCompilerUsedGlobal(GV);
   6174   return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.IvarListnfABIPtrTy);
   6175 }
   6176 
   6177 llvm::Constant *CGObjCNonFragileABIMac::GetOrEmitProtocolRef(
   6178   const ObjCProtocolDecl *PD) {
   6179   llvm::GlobalVariable *&Entry = Protocols[PD->getIdentifier()];
   6180 
   6181   if (!Entry) {
   6182     // We use the initializer as a marker of whether this is a forward
   6183     // reference or not. At module finalization we add the empty
   6184     // contents for protocols which were referenced but never defined.
   6185     Entry =
   6186         new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ProtocolnfABITy,
   6187                                  false, llvm::GlobalValue::ExternalLinkage,
   6188                                  nullptr,
   6189                                  "\01l_OBJC_PROTOCOL_$_" + PD->getObjCRuntimeNameAsString());
   6190     Entry->setSection("__DATA,__datacoal_nt,coalesced");
   6191   }
   6192 
   6193   return Entry;
   6194 }
   6195 
   6196 /// GetOrEmitProtocol - Generate the protocol meta-data:
   6197 /// @code
   6198 /// struct _protocol_t {
   6199 ///   id isa;  // NULL
   6200 ///   const char * const protocol_name;
   6201 ///   const struct _protocol_list_t * protocol_list; // super protocols
   6202 ///   const struct method_list_t * const instance_methods;
   6203 ///   const struct method_list_t * const class_methods;
   6204 ///   const struct method_list_t *optionalInstanceMethods;
   6205 ///   const struct method_list_t *optionalClassMethods;
   6206 ///   const struct _prop_list_t * properties;
   6207 ///   const uint32_t size;  // sizeof(struct _protocol_t)
   6208 ///   const uint32_t flags;  // = 0
   6209 ///   const char ** extendedMethodTypes;
   6210 ///   const char *demangledName;
   6211 /// }
   6212 /// @endcode
   6213 ///
   6214 
   6215 llvm::Constant *CGObjCNonFragileABIMac::GetOrEmitProtocol(
   6216   const ObjCProtocolDecl *PD) {
   6217   llvm::GlobalVariable *Entry = Protocols[PD->getIdentifier()];
   6218 
   6219   // Early exit if a defining object has already been generated.
   6220   if (Entry && Entry->hasInitializer())
   6221     return Entry;
   6222 
   6223   // Use the protocol definition, if there is one.
   6224   if (const ObjCProtocolDecl *Def = PD->getDefinition())
   6225     PD = Def;
   6226 
   6227   // Construct method lists.
   6228   std::vector<llvm::Constant*> InstanceMethods, ClassMethods;
   6229   std::vector<llvm::Constant*> OptInstanceMethods, OptClassMethods;
   6230   std::vector<llvm::Constant*> MethodTypesExt, OptMethodTypesExt;
   6231   for (const auto *MD : PD->instance_methods()) {
   6232     llvm::Constant *C = GetMethodDescriptionConstant(MD);
   6233     if (!C)
   6234       return GetOrEmitProtocolRef(PD);
   6235 
   6236     if (MD->getImplementationControl() == ObjCMethodDecl::Optional) {
   6237       OptInstanceMethods.push_back(C);
   6238       OptMethodTypesExt.push_back(GetMethodVarType(MD, true));
   6239     } else {
   6240       InstanceMethods.push_back(C);
   6241       MethodTypesExt.push_back(GetMethodVarType(MD, true));
   6242     }
   6243   }
   6244 
   6245   for (const auto *MD : PD->class_methods()) {
   6246     llvm::Constant *C = GetMethodDescriptionConstant(MD);
   6247     if (!C)
   6248       return GetOrEmitProtocolRef(PD);
   6249 
   6250     if (MD->getImplementationControl() == ObjCMethodDecl::Optional) {
   6251       OptClassMethods.push_back(C);
   6252       OptMethodTypesExt.push_back(GetMethodVarType(MD, true));
   6253     } else {
   6254       ClassMethods.push_back(C);
   6255       MethodTypesExt.push_back(GetMethodVarType(MD, true));
   6256     }
   6257   }
   6258 
   6259   MethodTypesExt.insert(MethodTypesExt.end(),
   6260                         OptMethodTypesExt.begin(), OptMethodTypesExt.end());
   6261 
   6262   llvm::Constant *Values[12];
   6263   // isa is NULL
   6264   Values[0] = llvm::Constant::getNullValue(ObjCTypes.ObjectPtrTy);
   6265   Values[1] = GetClassName(PD->getObjCRuntimeNameAsString());
   6266   Values[2] = EmitProtocolList("\01l_OBJC_$_PROTOCOL_REFS_" + PD->getObjCRuntimeNameAsString(),
   6267                                PD->protocol_begin(),
   6268                                PD->protocol_end());
   6269 
   6270   Values[3] = EmitMethodList("\01l_OBJC_$_PROTOCOL_INSTANCE_METHODS_"
   6271                              + PD->getObjCRuntimeNameAsString(),
   6272                              "__DATA, __objc_const",
   6273                              InstanceMethods);
   6274   Values[4] = EmitMethodList("\01l_OBJC_$_PROTOCOL_CLASS_METHODS_"
   6275                              + PD->getObjCRuntimeNameAsString(),
   6276                              "__DATA, __objc_const",
   6277                              ClassMethods);
   6278   Values[5] = EmitMethodList("\01l_OBJC_$_PROTOCOL_INSTANCE_METHODS_OPT_"
   6279                              + PD->getObjCRuntimeNameAsString(),
   6280                              "__DATA, __objc_const",
   6281                              OptInstanceMethods);
   6282   Values[6] = EmitMethodList("\01l_OBJC_$_PROTOCOL_CLASS_METHODS_OPT_"
   6283                              + PD->getObjCRuntimeNameAsString(),
   6284                              "__DATA, __objc_const",
   6285                              OptClassMethods);
   6286   Values[7] = EmitPropertyList("\01l_OBJC_$_PROP_LIST_" + PD->getObjCRuntimeNameAsString(),
   6287                                nullptr, PD, ObjCTypes);
   6288   uint32_t Size =
   6289     CGM.getDataLayout().getTypeAllocSize(ObjCTypes.ProtocolnfABITy);
   6290   Values[8] = llvm::ConstantInt::get(ObjCTypes.IntTy, Size);
   6291   Values[9] = llvm::Constant::getNullValue(ObjCTypes.IntTy);
   6292   Values[10] = EmitProtocolMethodTypes("\01l_OBJC_$_PROTOCOL_METHOD_TYPES_"
   6293                                        + PD->getObjCRuntimeNameAsString(),
   6294                                        MethodTypesExt, ObjCTypes);
   6295   // const char *demangledName;
   6296   Values[11] = llvm::Constant::getNullValue(ObjCTypes.Int8PtrTy);
   6297 
   6298   llvm::Constant *Init = llvm::ConstantStruct::get(ObjCTypes.ProtocolnfABITy,
   6299                                                    Values);
   6300 
   6301   if (Entry) {
   6302     // Already created, fix the linkage and update the initializer.
   6303     Entry->setLinkage(llvm::GlobalValue::WeakAnyLinkage);
   6304     Entry->setInitializer(Init);
   6305   } else {
   6306     Entry =
   6307       new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ProtocolnfABITy,
   6308                                false, llvm::GlobalValue::WeakAnyLinkage, Init,
   6309                                "\01l_OBJC_PROTOCOL_$_" + PD->getObjCRuntimeNameAsString());
   6310     Entry->setAlignment(
   6311       CGM.getDataLayout().getABITypeAlignment(ObjCTypes.ProtocolnfABITy));
   6312     Entry->setSection("__DATA,__datacoal_nt,coalesced");
   6313 
   6314     Protocols[PD->getIdentifier()] = Entry;
   6315   }
   6316   Entry->setVisibility(llvm::GlobalValue::HiddenVisibility);
   6317   CGM.addCompilerUsedGlobal(Entry);
   6318 
   6319   // Use this protocol meta-data to build protocol list table in section
   6320   // __DATA, __objc_protolist
   6321   llvm::GlobalVariable *PTGV =
   6322     new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ProtocolnfABIPtrTy,
   6323                              false, llvm::GlobalValue::WeakAnyLinkage, Entry,
   6324                              "\01l_OBJC_LABEL_PROTOCOL_$_" + PD->getObjCRuntimeNameAsString());
   6325   PTGV->setAlignment(
   6326     CGM.getDataLayout().getABITypeAlignment(ObjCTypes.ProtocolnfABIPtrTy));
   6327   PTGV->setSection("__DATA, __objc_protolist, coalesced, no_dead_strip");
   6328   PTGV->setVisibility(llvm::GlobalValue::HiddenVisibility);
   6329   CGM.addCompilerUsedGlobal(PTGV);
   6330   return Entry;
   6331 }
   6332 
   6333 /// EmitProtocolList - Generate protocol list meta-data:
   6334 /// @code
   6335 /// struct _protocol_list_t {
   6336 ///   long protocol_count;   // Note, this is 32/64 bit
   6337 ///   struct _protocol_t[protocol_count];
   6338 /// }
   6339 /// @endcode
   6340 ///
   6341 llvm::Constant *
   6342 CGObjCNonFragileABIMac::EmitProtocolList(Twine Name,
   6343                                       ObjCProtocolDecl::protocol_iterator begin,
   6344                                       ObjCProtocolDecl::protocol_iterator end) {
   6345   SmallVector<llvm::Constant *, 16> ProtocolRefs;
   6346 
   6347   // Just return null for empty protocol lists
   6348   if (begin == end)
   6349     return llvm::Constant::getNullValue(ObjCTypes.ProtocolListnfABIPtrTy);
   6350 
   6351   // FIXME: We shouldn't need to do this lookup here, should we?
   6352   SmallString<256> TmpName;
   6353   Name.toVector(TmpName);
   6354   llvm::GlobalVariable *GV =
   6355     CGM.getModule().getGlobalVariable(TmpName.str(), true);
   6356   if (GV)
   6357     return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.ProtocolListnfABIPtrTy);
   6358 
   6359   for (; begin != end; ++begin)
   6360     ProtocolRefs.push_back(GetProtocolRef(*begin));  // Implemented???
   6361 
   6362   // This list is null terminated.
   6363   ProtocolRefs.push_back(llvm::Constant::getNullValue(
   6364                            ObjCTypes.ProtocolnfABIPtrTy));
   6365 
   6366   llvm::Constant *Values[2];
   6367   Values[0] =
   6368     llvm::ConstantInt::get(ObjCTypes.LongTy, ProtocolRefs.size() - 1);
   6369   Values[1] =
   6370     llvm::ConstantArray::get(llvm::ArrayType::get(ObjCTypes.ProtocolnfABIPtrTy,
   6371                                                   ProtocolRefs.size()),
   6372                              ProtocolRefs);
   6373 
   6374   llvm::Constant *Init = llvm::ConstantStruct::getAnon(Values);
   6375   GV = new llvm::GlobalVariable(CGM.getModule(), Init->getType(), false,
   6376                                 llvm::GlobalValue::PrivateLinkage,
   6377                                 Init, Name);
   6378   GV->setSection("__DATA, __objc_const");
   6379   GV->setAlignment(
   6380     CGM.getDataLayout().getABITypeAlignment(Init->getType()));
   6381   CGM.addCompilerUsedGlobal(GV);
   6382   return llvm::ConstantExpr::getBitCast(GV,
   6383                                         ObjCTypes.ProtocolListnfABIPtrTy);
   6384 }
   6385 
   6386 /// GetMethodDescriptionConstant - This routine build following meta-data:
   6387 /// struct _objc_method {
   6388 ///   SEL _cmd;
   6389 ///   char *method_type;
   6390 ///   char *_imp;
   6391 /// }
   6392 
   6393 llvm::Constant *
   6394 CGObjCNonFragileABIMac::GetMethodDescriptionConstant(const ObjCMethodDecl *MD) {
   6395   llvm::Constant *Desc[3];
   6396   Desc[0] =
   6397     llvm::ConstantExpr::getBitCast(GetMethodVarName(MD->getSelector()),
   6398                                    ObjCTypes.SelectorPtrTy);
   6399   Desc[1] = GetMethodVarType(MD);
   6400   if (!Desc[1])
   6401     return nullptr;
   6402 
   6403   // Protocol methods have no implementation. So, this entry is always NULL.
   6404   Desc[2] = llvm::Constant::getNullValue(ObjCTypes.Int8PtrTy);
   6405   return llvm::ConstantStruct::get(ObjCTypes.MethodTy, Desc);
   6406 }
   6407 
   6408 /// EmitObjCValueForIvar - Code Gen for nonfragile ivar reference.
   6409 /// This code gen. amounts to generating code for:
   6410 /// @code
   6411 /// (type *)((char *)base + _OBJC_IVAR_$_.ivar;
   6412 /// @encode
   6413 ///
   6414 LValue CGObjCNonFragileABIMac::EmitObjCValueForIvar(
   6415                                                CodeGen::CodeGenFunction &CGF,
   6416                                                QualType ObjectTy,
   6417                                                llvm::Value *BaseValue,
   6418                                                const ObjCIvarDecl *Ivar,
   6419                                                unsigned CVRQualifiers) {
   6420   ObjCInterfaceDecl *ID = ObjectTy->getAs<ObjCObjectType>()->getInterface();
   6421   llvm::Value *Offset = EmitIvarOffset(CGF, ID, Ivar);
   6422   return EmitValueForIvarAtOffset(CGF, ID, BaseValue, Ivar, CVRQualifiers,
   6423                                   Offset);
   6424 }
   6425 
   6426 llvm::Value *CGObjCNonFragileABIMac::EmitIvarOffset(
   6427   CodeGen::CodeGenFunction &CGF,
   6428   const ObjCInterfaceDecl *Interface,
   6429   const ObjCIvarDecl *Ivar) {
   6430   llvm::Value *IvarOffsetValue = ObjCIvarOffsetVariable(Interface, Ivar);
   6431   IvarOffsetValue = CGF.Builder.CreateLoad(IvarOffsetValue, "ivar");
   6432   if (IsIvarOffsetKnownIdempotent(CGF, Ivar))
   6433     cast<llvm::LoadInst>(IvarOffsetValue)
   6434         ->setMetadata(CGM.getModule().getMDKindID("invariant.load"),
   6435                       llvm::MDNode::get(VMContext, None));
   6436 
   6437   // This could be 32bit int or 64bit integer depending on the architecture.
   6438   // Cast it to 64bit integer value, if it is a 32bit integer ivar offset value
   6439   //  as this is what caller always expectes.
   6440   if (ObjCTypes.IvarOffsetVarTy == ObjCTypes.IntTy)
   6441     IvarOffsetValue = CGF.Builder.CreateIntCast(
   6442         IvarOffsetValue, ObjCTypes.LongTy, true, "ivar.conv");
   6443   return IvarOffsetValue;
   6444 }
   6445 
   6446 static void appendSelectorForMessageRefTable(std::string &buffer,
   6447                                              Selector selector) {
   6448   if (selector.isUnarySelector()) {
   6449     buffer += selector.getNameForSlot(0);
   6450     return;
   6451   }
   6452 
   6453   for (unsigned i = 0, e = selector.getNumArgs(); i != e; ++i) {
   6454     buffer += selector.getNameForSlot(i);
   6455     buffer += '_';
   6456   }
   6457 }
   6458 
   6459 /// Emit a "v-table" message send.  We emit a weak hidden-visibility
   6460 /// struct, initially containing the selector pointer and a pointer to
   6461 /// a "fixup" variant of the appropriate objc_msgSend.  To call, we
   6462 /// load and call the function pointer, passing the address of the
   6463 /// struct as the second parameter.  The runtime determines whether
   6464 /// the selector is currently emitted using vtable dispatch; if so, it
   6465 /// substitutes a stub function which simply tail-calls through the
   6466 /// appropriate vtable slot, and if not, it substitues a stub function
   6467 /// which tail-calls objc_msgSend.  Both stubs adjust the selector
   6468 /// argument to correctly point to the selector.
   6469 RValue
   6470 CGObjCNonFragileABIMac::EmitVTableMessageSend(CodeGenFunction &CGF,
   6471                                               ReturnValueSlot returnSlot,
   6472                                               QualType resultType,
   6473                                               Selector selector,
   6474                                               llvm::Value *arg0,
   6475                                               QualType arg0Type,
   6476                                               bool isSuper,
   6477                                               const CallArgList &formalArgs,
   6478                                               const ObjCMethodDecl *method) {
   6479   // Compute the actual arguments.
   6480   CallArgList args;
   6481 
   6482   // First argument: the receiver / super-call structure.
   6483   if (!isSuper)
   6484     arg0 = CGF.Builder.CreateBitCast(arg0, ObjCTypes.ObjectPtrTy);
   6485   args.add(RValue::get(arg0), arg0Type);
   6486 
   6487   // Second argument: a pointer to the message ref structure.  Leave
   6488   // the actual argument value blank for now.
   6489   args.add(RValue::get(nullptr), ObjCTypes.MessageRefCPtrTy);
   6490 
   6491   args.insert(args.end(), formalArgs.begin(), formalArgs.end());
   6492 
   6493   MessageSendInfo MSI = getMessageSendInfo(method, resultType, args);
   6494 
   6495   NullReturnState nullReturn;
   6496 
   6497   // Find the function to call and the mangled name for the message
   6498   // ref structure.  Using a different mangled name wouldn't actually
   6499   // be a problem; it would just be a waste.
   6500   //
   6501   // The runtime currently never uses vtable dispatch for anything
   6502   // except normal, non-super message-sends.
   6503   // FIXME: don't use this for that.
   6504   llvm::Constant *fn = nullptr;
   6505   std::string messageRefName("\01l_");
   6506   if (CGM.ReturnSlotInterferesWithArgs(MSI.CallInfo)) {
   6507     if (isSuper) {
   6508       fn = ObjCTypes.getMessageSendSuper2StretFixupFn();
   6509       messageRefName += "objc_msgSendSuper2_stret_fixup";
   6510     } else {
   6511       nullReturn.init(CGF, arg0);
   6512       fn = ObjCTypes.getMessageSendStretFixupFn();
   6513       messageRefName += "objc_msgSend_stret_fixup";
   6514     }
   6515   } else if (!isSuper && CGM.ReturnTypeUsesFPRet(resultType)) {
   6516     fn = ObjCTypes.getMessageSendFpretFixupFn();
   6517     messageRefName += "objc_msgSend_fpret_fixup";
   6518   } else {
   6519     if (isSuper) {
   6520       fn = ObjCTypes.getMessageSendSuper2FixupFn();
   6521       messageRefName += "objc_msgSendSuper2_fixup";
   6522     } else {
   6523       fn = ObjCTypes.getMessageSendFixupFn();
   6524       messageRefName += "objc_msgSend_fixup";
   6525     }
   6526   }
   6527   assert(fn && "CGObjCNonFragileABIMac::EmitMessageSend");
   6528   messageRefName += '_';
   6529 
   6530   // Append the selector name, except use underscores anywhere we
   6531   // would have used colons.
   6532   appendSelectorForMessageRefTable(messageRefName, selector);
   6533 
   6534   llvm::GlobalVariable *messageRef
   6535     = CGM.getModule().getGlobalVariable(messageRefName);
   6536   if (!messageRef) {
   6537     // Build the message ref structure.
   6538     llvm::Constant *values[] = { fn, GetMethodVarName(selector) };
   6539     llvm::Constant *init = llvm::ConstantStruct::getAnon(values);
   6540     messageRef = new llvm::GlobalVariable(CGM.getModule(),
   6541                                           init->getType(),
   6542                                           /*constant*/ false,
   6543                                           llvm::GlobalValue::WeakAnyLinkage,
   6544                                           init,
   6545                                           messageRefName);
   6546     messageRef->setVisibility(llvm::GlobalValue::HiddenVisibility);
   6547     messageRef->setAlignment(16);
   6548     messageRef->setSection("__DATA, __objc_msgrefs, coalesced");
   6549   }
   6550 
   6551   bool requiresnullCheck = false;
   6552   if (CGM.getLangOpts().ObjCAutoRefCount && method)
   6553     for (const auto *ParamDecl : method->params()) {
   6554       if (ParamDecl->hasAttr<NSConsumedAttr>()) {
   6555         if (!nullReturn.NullBB)
   6556           nullReturn.init(CGF, arg0);
   6557         requiresnullCheck = true;
   6558         break;
   6559       }
   6560     }
   6561 
   6562   llvm::Value *mref =
   6563     CGF.Builder.CreateBitCast(messageRef, ObjCTypes.MessageRefPtrTy);
   6564 
   6565   // Update the message ref argument.
   6566   args[1].RV = RValue::get(mref);
   6567 
   6568   // Load the function to call from the message ref table.
   6569   llvm::Value *callee =
   6570       CGF.Builder.CreateStructGEP(ObjCTypes.MessageRefTy, mref, 0);
   6571   callee = CGF.Builder.CreateLoad(callee, "msgSend_fn");
   6572 
   6573   callee = CGF.Builder.CreateBitCast(callee, MSI.MessengerType);
   6574 
   6575   RValue result = CGF.EmitCall(MSI.CallInfo, callee, returnSlot, args);
   6576   return nullReturn.complete(CGF, result, resultType, formalArgs,
   6577                              requiresnullCheck ? method : nullptr);
   6578 }
   6579 
   6580 /// Generate code for a message send expression in the nonfragile abi.
   6581 CodeGen::RValue
   6582 CGObjCNonFragileABIMac::GenerateMessageSend(CodeGen::CodeGenFunction &CGF,
   6583                                             ReturnValueSlot Return,
   6584                                             QualType ResultType,
   6585                                             Selector Sel,
   6586                                             llvm::Value *Receiver,
   6587                                             const CallArgList &CallArgs,
   6588                                             const ObjCInterfaceDecl *Class,
   6589                                             const ObjCMethodDecl *Method) {
   6590   return isVTableDispatchedSelector(Sel)
   6591     ? EmitVTableMessageSend(CGF, Return, ResultType, Sel,
   6592                             Receiver, CGF.getContext().getObjCIdType(),
   6593                             false, CallArgs, Method)
   6594     : EmitMessageSend(CGF, Return, ResultType,
   6595                       EmitSelector(CGF, Sel),
   6596                       Receiver, CGF.getContext().getObjCIdType(),
   6597                       false, CallArgs, Method, ObjCTypes);
   6598 }
   6599 
   6600 llvm::GlobalVariable *
   6601 CGObjCNonFragileABIMac::GetClassGlobal(const std::string &Name, bool Weak) {
   6602   llvm::GlobalValue::LinkageTypes L =
   6603       Weak ? llvm::GlobalValue::ExternalWeakLinkage
   6604            : llvm::GlobalValue::ExternalLinkage;
   6605 
   6606   llvm::GlobalVariable *GV = CGM.getModule().getGlobalVariable(Name);
   6607 
   6608   if (!GV)
   6609     GV = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ClassnfABITy,
   6610                                   false, L, nullptr, Name);
   6611 
   6612   assert(GV->getLinkage() == L);
   6613   return GV;
   6614 }
   6615 
   6616 llvm::Value *CGObjCNonFragileABIMac::EmitClassRefFromId(CodeGenFunction &CGF,
   6617                                                         IdentifierInfo *II,
   6618                                                         bool Weak,
   6619                                                         const ObjCInterfaceDecl *ID) {
   6620   llvm::GlobalVariable *&Entry = ClassReferences[II];
   6621 
   6622   if (!Entry) {
   6623     std::string ClassName(
   6624       getClassSymbolPrefix() +
   6625       (ID ? ID->getObjCRuntimeNameAsString() : II->getName()).str());
   6626     llvm::GlobalVariable *ClassGV = GetClassGlobal(ClassName, Weak);
   6627     Entry = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ClassnfABIPtrTy,
   6628                                      false, llvm::GlobalValue::PrivateLinkage,
   6629                                      ClassGV, "OBJC_CLASSLIST_REFERENCES_$_");
   6630     Entry->setAlignment(
   6631                         CGM.getDataLayout().getABITypeAlignment(
   6632                                                                 ObjCTypes.ClassnfABIPtrTy));
   6633     Entry->setSection("__DATA, __objc_classrefs, regular, no_dead_strip");
   6634     CGM.addCompilerUsedGlobal(Entry);
   6635   }
   6636   return CGF.Builder.CreateLoad(Entry);
   6637 }
   6638 
   6639 llvm::Value *CGObjCNonFragileABIMac::EmitClassRef(CodeGenFunction &CGF,
   6640                                                   const ObjCInterfaceDecl *ID) {
   6641   return EmitClassRefFromId(CGF, ID->getIdentifier(), ID->isWeakImported(), ID);
   6642 }
   6643 
   6644 llvm::Value *CGObjCNonFragileABIMac::EmitNSAutoreleasePoolClassRef(
   6645                                                     CodeGenFunction &CGF) {
   6646   IdentifierInfo *II = &CGM.getContext().Idents.get("NSAutoreleasePool");
   6647   return EmitClassRefFromId(CGF, II, false, 0);
   6648 }
   6649 
   6650 llvm::Value *
   6651 CGObjCNonFragileABIMac::EmitSuperClassRef(CodeGenFunction &CGF,
   6652                                           const ObjCInterfaceDecl *ID) {
   6653   llvm::GlobalVariable *&Entry = SuperClassReferences[ID->getIdentifier()];
   6654 
   6655   if (!Entry) {
   6656     llvm::SmallString<64> ClassName(getClassSymbolPrefix());
   6657     ClassName += ID->getObjCRuntimeNameAsString();
   6658     llvm::GlobalVariable *ClassGV = GetClassGlobal(ClassName.str(),
   6659                                                    ID->isWeakImported());
   6660     Entry = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ClassnfABIPtrTy,
   6661                                      false, llvm::GlobalValue::PrivateLinkage,
   6662                                      ClassGV, "OBJC_CLASSLIST_SUP_REFS_$_");
   6663     Entry->setAlignment(
   6664       CGM.getDataLayout().getABITypeAlignment(
   6665         ObjCTypes.ClassnfABIPtrTy));
   6666     Entry->setSection("__DATA, __objc_superrefs, regular, no_dead_strip");
   6667     CGM.addCompilerUsedGlobal(Entry);
   6668   }
   6669   return CGF.Builder.CreateLoad(Entry);
   6670 }
   6671 
   6672 /// EmitMetaClassRef - Return a Value * of the address of _class_t
   6673 /// meta-data
   6674 ///
   6675 llvm::Value *CGObjCNonFragileABIMac::EmitMetaClassRef(CodeGenFunction &CGF,
   6676                                                       const ObjCInterfaceDecl *ID,
   6677                                                       bool Weak) {
   6678   llvm::GlobalVariable * &Entry = MetaClassReferences[ID->getIdentifier()];
   6679   if (!Entry) {
   6680     llvm::SmallString<64> MetaClassName(getMetaclassSymbolPrefix());
   6681     MetaClassName += ID->getObjCRuntimeNameAsString();
   6682     llvm::GlobalVariable *MetaClassGV =
   6683       GetClassGlobal(MetaClassName.str(), Weak);
   6684 
   6685     Entry = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ClassnfABIPtrTy,
   6686                                      false, llvm::GlobalValue::PrivateLinkage,
   6687                                      MetaClassGV, "OBJC_CLASSLIST_SUP_REFS_$_");
   6688     Entry->setAlignment(
   6689         CGM.getDataLayout().getABITypeAlignment(ObjCTypes.ClassnfABIPtrTy));
   6690 
   6691     Entry->setSection("__DATA, __objc_superrefs, regular, no_dead_strip");
   6692     CGM.addCompilerUsedGlobal(Entry);
   6693   }
   6694 
   6695   return CGF.Builder.CreateLoad(Entry);
   6696 }
   6697 
   6698 /// GetClass - Return a reference to the class for the given interface
   6699 /// decl.
   6700 llvm::Value *CGObjCNonFragileABIMac::GetClass(CodeGenFunction &CGF,
   6701                                               const ObjCInterfaceDecl *ID) {
   6702   if (ID->isWeakImported()) {
   6703     llvm::SmallString<64> ClassName(getClassSymbolPrefix());
   6704     ClassName += ID->getObjCRuntimeNameAsString();
   6705     llvm::GlobalVariable *ClassGV = GetClassGlobal(ClassName.str(), true);
   6706     (void)ClassGV;
   6707     assert(ClassGV->hasExternalWeakLinkage());
   6708   }
   6709 
   6710   return EmitClassRef(CGF, ID);
   6711 }
   6712 
   6713 /// Generates a message send where the super is the receiver.  This is
   6714 /// a message send to self with special delivery semantics indicating
   6715 /// which class's method should be called.
   6716 CodeGen::RValue
   6717 CGObjCNonFragileABIMac::GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF,
   6718                                                  ReturnValueSlot Return,
   6719                                                  QualType ResultType,
   6720                                                  Selector Sel,
   6721                                                  const ObjCInterfaceDecl *Class,
   6722                                                  bool isCategoryImpl,
   6723                                                  llvm::Value *Receiver,
   6724                                                  bool IsClassMessage,
   6725                                                  const CodeGen::CallArgList &CallArgs,
   6726                                                  const ObjCMethodDecl *Method) {
   6727   // ...
   6728   // Create and init a super structure; this is a (receiver, class)
   6729   // pair we will pass to objc_msgSendSuper.
   6730   llvm::Value *ObjCSuper =
   6731     CGF.CreateTempAlloca(ObjCTypes.SuperTy, "objc_super");
   6732 
   6733   llvm::Value *ReceiverAsObject =
   6734     CGF.Builder.CreateBitCast(Receiver, ObjCTypes.ObjectPtrTy);
   6735   CGF.Builder.CreateStore(
   6736       ReceiverAsObject,
   6737       CGF.Builder.CreateStructGEP(ObjCTypes.SuperTy, ObjCSuper, 0));
   6738 
   6739   // If this is a class message the metaclass is passed as the target.
   6740   llvm::Value *Target;
   6741   if (IsClassMessage)
   6742       Target = EmitMetaClassRef(CGF, Class, Class->isWeakImported());
   6743   else
   6744     Target = EmitSuperClassRef(CGF, Class);
   6745 
   6746   // FIXME: We shouldn't need to do this cast, rectify the ASTContext and
   6747   // ObjCTypes types.
   6748   llvm::Type *ClassTy =
   6749     CGM.getTypes().ConvertType(CGF.getContext().getObjCClassType());
   6750   Target = CGF.Builder.CreateBitCast(Target, ClassTy);
   6751   CGF.Builder.CreateStore(
   6752       Target, CGF.Builder.CreateStructGEP(ObjCTypes.SuperTy, ObjCSuper, 1));
   6753 
   6754   return (isVTableDispatchedSelector(Sel))
   6755     ? EmitVTableMessageSend(CGF, Return, ResultType, Sel,
   6756                             ObjCSuper, ObjCTypes.SuperPtrCTy,
   6757                             true, CallArgs, Method)
   6758     : EmitMessageSend(CGF, Return, ResultType,
   6759                       EmitSelector(CGF, Sel),
   6760                       ObjCSuper, ObjCTypes.SuperPtrCTy,
   6761                       true, CallArgs, Method, ObjCTypes);
   6762 }
   6763 
   6764 llvm::Value *CGObjCNonFragileABIMac::EmitSelector(CodeGenFunction &CGF,
   6765                                                   Selector Sel, bool lval) {
   6766   llvm::GlobalVariable *&Entry = SelectorReferences[Sel];
   6767 
   6768   if (!Entry) {
   6769     llvm::Constant *Casted =
   6770       llvm::ConstantExpr::getBitCast(GetMethodVarName(Sel),
   6771                                      ObjCTypes.SelectorPtrTy);
   6772     Entry = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.SelectorPtrTy,
   6773                                      false, llvm::GlobalValue::PrivateLinkage,
   6774                                      Casted, "OBJC_SELECTOR_REFERENCES_");
   6775     Entry->setExternallyInitialized(true);
   6776     Entry->setSection("__DATA, __objc_selrefs, literal_pointers, no_dead_strip");
   6777     CGM.addCompilerUsedGlobal(Entry);
   6778   }
   6779 
   6780   if (lval)
   6781     return Entry;
   6782   llvm::LoadInst* LI = CGF.Builder.CreateLoad(Entry);
   6783 
   6784   LI->setMetadata(CGM.getModule().getMDKindID("invariant.load"),
   6785                   llvm::MDNode::get(VMContext, None));
   6786   return LI;
   6787 }
   6788 /// EmitObjCIvarAssign - Code gen for assigning to a __strong object.
   6789 /// objc_assign_ivar (id src, id *dst, ptrdiff_t)
   6790 ///
   6791 void CGObjCNonFragileABIMac::EmitObjCIvarAssign(CodeGen::CodeGenFunction &CGF,
   6792                                                 llvm::Value *src,
   6793                                                 llvm::Value *dst,
   6794                                                 llvm::Value *ivarOffset) {
   6795   llvm::Type * SrcTy = src->getType();
   6796   if (!isa<llvm::PointerType>(SrcTy)) {
   6797     unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
   6798     assert(Size <= 8 && "does not support size > 8");
   6799     src = (Size == 4 ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy)
   6800            : CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy));
   6801     src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
   6802   }
   6803   src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
   6804   dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
   6805   llvm::Value *args[] = { src, dst, ivarOffset };
   6806   CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignIvarFn(), args);
   6807 }
   6808 
   6809 /// EmitObjCStrongCastAssign - Code gen for assigning to a __strong cast object.
   6810 /// objc_assign_strongCast (id src, id *dst)
   6811 ///
   6812 void CGObjCNonFragileABIMac::EmitObjCStrongCastAssign(
   6813   CodeGen::CodeGenFunction &CGF,
   6814   llvm::Value *src, llvm::Value *dst) {
   6815   llvm::Type * SrcTy = src->getType();
   6816   if (!isa<llvm::PointerType>(SrcTy)) {
   6817     unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
   6818     assert(Size <= 8 && "does not support size > 8");
   6819     src = (Size == 4 ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy)
   6820            : CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy));
   6821     src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
   6822   }
   6823   src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
   6824   dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
   6825   llvm::Value *args[] = { src, dst };
   6826   CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignStrongCastFn(),
   6827                               args, "weakassign");
   6828 }
   6829 
   6830 void CGObjCNonFragileABIMac::EmitGCMemmoveCollectable(
   6831   CodeGen::CodeGenFunction &CGF,
   6832   llvm::Value *DestPtr,
   6833   llvm::Value *SrcPtr,
   6834   llvm::Value *Size) {
   6835   SrcPtr = CGF.Builder.CreateBitCast(SrcPtr, ObjCTypes.Int8PtrTy);
   6836   DestPtr = CGF.Builder.CreateBitCast(DestPtr, ObjCTypes.Int8PtrTy);
   6837   llvm::Value *args[] = { DestPtr, SrcPtr, Size };
   6838   CGF.EmitNounwindRuntimeCall(ObjCTypes.GcMemmoveCollectableFn(), args);
   6839 }
   6840 
   6841 /// EmitObjCWeakRead - Code gen for loading value of a __weak
   6842 /// object: objc_read_weak (id *src)
   6843 ///
   6844 llvm::Value * CGObjCNonFragileABIMac::EmitObjCWeakRead(
   6845   CodeGen::CodeGenFunction &CGF,
   6846   llvm::Value *AddrWeakObj) {
   6847   llvm::Type* DestTy =
   6848     cast<llvm::PointerType>(AddrWeakObj->getType())->getElementType();
   6849   AddrWeakObj = CGF.Builder.CreateBitCast(AddrWeakObj, ObjCTypes.PtrObjectPtrTy);
   6850   llvm::Value *read_weak =
   6851     CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcReadWeakFn(),
   6852                                 AddrWeakObj, "weakread");
   6853   read_weak = CGF.Builder.CreateBitCast(read_weak, DestTy);
   6854   return read_weak;
   6855 }
   6856 
   6857 /// EmitObjCWeakAssign - Code gen for assigning to a __weak object.
   6858 /// objc_assign_weak (id src, id *dst)
   6859 ///
   6860 void CGObjCNonFragileABIMac::EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF,
   6861                                                 llvm::Value *src, llvm::Value *dst) {
   6862   llvm::Type * SrcTy = src->getType();
   6863   if (!isa<llvm::PointerType>(SrcTy)) {
   6864     unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
   6865     assert(Size <= 8 && "does not support size > 8");
   6866     src = (Size == 4 ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy)
   6867            : CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy));
   6868     src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
   6869   }
   6870   src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
   6871   dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
   6872   llvm::Value *args[] = { src, dst };
   6873   CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignWeakFn(),
   6874                               args, "weakassign");
   6875 }
   6876 
   6877 /// EmitObjCGlobalAssign - Code gen for assigning to a __strong object.
   6878 /// objc_assign_global (id src, id *dst)
   6879 ///
   6880 void CGObjCNonFragileABIMac::EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF,
   6881                                           llvm::Value *src, llvm::Value *dst,
   6882                                           bool threadlocal) {
   6883   llvm::Type * SrcTy = src->getType();
   6884   if (!isa<llvm::PointerType>(SrcTy)) {
   6885     unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
   6886     assert(Size <= 8 && "does not support size > 8");
   6887     src = (Size == 4 ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy)
   6888            : CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy));
   6889     src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
   6890   }
   6891   src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
   6892   dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
   6893   llvm::Value *args[] = { src, dst };
   6894   if (!threadlocal)
   6895     CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignGlobalFn(),
   6896                                 args, "globalassign");
   6897   else
   6898     CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignThreadLocalFn(),
   6899                                 args, "threadlocalassign");
   6900 }
   6901 
   6902 void
   6903 CGObjCNonFragileABIMac::EmitSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
   6904                                              const ObjCAtSynchronizedStmt &S) {
   6905   EmitAtSynchronizedStmt(CGF, S,
   6906       cast<llvm::Function>(ObjCTypes.getSyncEnterFn()),
   6907       cast<llvm::Function>(ObjCTypes.getSyncExitFn()));
   6908 }
   6909 
   6910 llvm::Constant *
   6911 CGObjCNonFragileABIMac::GetEHType(QualType T) {
   6912   // There's a particular fixed type info for 'id'.
   6913   if (T->isObjCIdType() ||
   6914       T->isObjCQualifiedIdType()) {
   6915     llvm::Constant *IDEHType =
   6916       CGM.getModule().getGlobalVariable("OBJC_EHTYPE_id");
   6917     if (!IDEHType)
   6918       IDEHType =
   6919         new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.EHTypeTy,
   6920                                  false,
   6921                                  llvm::GlobalValue::ExternalLinkage,
   6922                                  nullptr, "OBJC_EHTYPE_id");
   6923     return IDEHType;
   6924   }
   6925 
   6926   // All other types should be Objective-C interface pointer types.
   6927   const ObjCObjectPointerType *PT =
   6928     T->getAs<ObjCObjectPointerType>();
   6929   assert(PT && "Invalid @catch type.");
   6930   const ObjCInterfaceType *IT = PT->getInterfaceType();
   6931   assert(IT && "Invalid @catch type.");
   6932   return GetInterfaceEHType(IT->getDecl(), false);
   6933 }
   6934 
   6935 void CGObjCNonFragileABIMac::EmitTryStmt(CodeGen::CodeGenFunction &CGF,
   6936                                          const ObjCAtTryStmt &S) {
   6937   EmitTryCatchStmt(CGF, S,
   6938       cast<llvm::Function>(ObjCTypes.getObjCBeginCatchFn()),
   6939       cast<llvm::Function>(ObjCTypes.getObjCEndCatchFn()),
   6940       cast<llvm::Function>(ObjCTypes.getExceptionRethrowFn()));
   6941 }
   6942 
   6943 /// EmitThrowStmt - Generate code for a throw statement.
   6944 void CGObjCNonFragileABIMac::EmitThrowStmt(CodeGen::CodeGenFunction &CGF,
   6945                                            const ObjCAtThrowStmt &S,
   6946                                            bool ClearInsertionPoint) {
   6947   if (const Expr *ThrowExpr = S.getThrowExpr()) {
   6948     llvm::Value *Exception = CGF.EmitObjCThrowOperand(ThrowExpr);
   6949     Exception = CGF.Builder.CreateBitCast(Exception, ObjCTypes.ObjectPtrTy);
   6950     CGF.EmitRuntimeCallOrInvoke(ObjCTypes.getExceptionThrowFn(), Exception)
   6951       .setDoesNotReturn();
   6952   } else {
   6953     CGF.EmitRuntimeCallOrInvoke(ObjCTypes.getExceptionRethrowFn())
   6954       .setDoesNotReturn();
   6955   }
   6956 
   6957   CGF.Builder.CreateUnreachable();
   6958   if (ClearInsertionPoint)
   6959     CGF.Builder.ClearInsertionPoint();
   6960 }
   6961 
   6962 llvm::Constant *
   6963 CGObjCNonFragileABIMac::GetInterfaceEHType(const ObjCInterfaceDecl *ID,
   6964                                            bool ForDefinition) {
   6965   llvm::GlobalVariable * &Entry = EHTypeReferences[ID->getIdentifier()];
   6966 
   6967   // If we don't need a definition, return the entry if found or check
   6968   // if we use an external reference.
   6969   if (!ForDefinition) {
   6970     if (Entry)
   6971       return Entry;
   6972 
   6973     // If this type (or a super class) has the __objc_exception__
   6974     // attribute, emit an external reference.
   6975     if (hasObjCExceptionAttribute(CGM.getContext(), ID))
   6976       return Entry =
   6977           new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.EHTypeTy, false,
   6978                                    llvm::GlobalValue::ExternalLinkage,
   6979                                    nullptr,
   6980                                    ("OBJC_EHTYPE_$_" +
   6981                                     ID->getObjCRuntimeNameAsString()));
   6982   }
   6983 
   6984   // Otherwise we need to either make a new entry or fill in the
   6985   // initializer.
   6986   assert((!Entry || !Entry->hasInitializer()) && "Duplicate EHType definition");
   6987   llvm::SmallString<64> ClassName(getClassSymbolPrefix());
   6988   ClassName += ID->getObjCRuntimeNameAsString();
   6989   std::string VTableName = "objc_ehtype_vtable";
   6990   llvm::GlobalVariable *VTableGV =
   6991     CGM.getModule().getGlobalVariable(VTableName);
   6992   if (!VTableGV)
   6993     VTableGV = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.Int8PtrTy,
   6994                                         false,
   6995                                         llvm::GlobalValue::ExternalLinkage,
   6996                                         nullptr, VTableName);
   6997 
   6998   llvm::Value *VTableIdx = llvm::ConstantInt::get(CGM.Int32Ty, 2);
   6999 
   7000   llvm::Constant *Values[] = {
   7001       llvm::ConstantExpr::getGetElementPtr(VTableGV->getValueType(), VTableGV,
   7002                                            VTableIdx),
   7003       GetClassName(ID->getObjCRuntimeNameAsString()),
   7004       GetClassGlobal(ClassName.str())};
   7005   llvm::Constant *Init =
   7006     llvm::ConstantStruct::get(ObjCTypes.EHTypeTy, Values);
   7007 
   7008   llvm::GlobalValue::LinkageTypes L = ForDefinition
   7009                                           ? llvm::GlobalValue::ExternalLinkage
   7010                                           : llvm::GlobalValue::WeakAnyLinkage;
   7011   if (Entry) {
   7012     Entry->setInitializer(Init);
   7013   } else {
   7014     llvm::SmallString<64> EHTYPEName("OBJC_EHTYPE_$_");
   7015     EHTYPEName += ID->getObjCRuntimeNameAsString();
   7016     Entry = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.EHTypeTy, false,
   7017                                      L,
   7018                                      Init,
   7019                                      EHTYPEName.str());
   7020   }
   7021   assert(Entry->getLinkage() == L);
   7022 
   7023   if (ID->getVisibility() == HiddenVisibility)
   7024     Entry->setVisibility(llvm::GlobalValue::HiddenVisibility);
   7025   Entry->setAlignment(CGM.getDataLayout().getABITypeAlignment(
   7026       ObjCTypes.EHTypeTy));
   7027 
   7028   if (ForDefinition)
   7029     Entry->setSection("__DATA,__objc_const");
   7030   else
   7031     Entry->setSection("__DATA,__datacoal_nt,coalesced");
   7032 
   7033   return Entry;
   7034 }
   7035 
   7036 /* *** */
   7037 
   7038 CodeGen::CGObjCRuntime *
   7039 CodeGen::CreateMacObjCRuntime(CodeGen::CodeGenModule &CGM) {
   7040   switch (CGM.getLangOpts().ObjCRuntime.getKind()) {
   7041   case ObjCRuntime::FragileMacOSX:
   7042   return new CGObjCMac(CGM);
   7043 
   7044   case ObjCRuntime::MacOSX:
   7045   case ObjCRuntime::iOS:
   7046     return new CGObjCNonFragileABIMac(CGM);
   7047 
   7048   case ObjCRuntime::GNUstep:
   7049   case ObjCRuntime::GCC:
   7050   case ObjCRuntime::ObjFW:
   7051     llvm_unreachable("these runtimes are not Mac runtimes");
   7052   }
   7053   llvm_unreachable("bad runtime");
   7054 }
   7055