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