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