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