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