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