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