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