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