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