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