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     auto Name = getSymbolNameForMethod(OMD);
4005 
4006     CodeGenTypes &Types = CGM.getTypes();
4007     llvm::FunctionType *MethodTy =
4008         Types.GetFunctionType(Types.arrangeObjCMethodDeclaration(OMD));
4009     Method =
4010         llvm::Function::Create(MethodTy, llvm::GlobalValue::InternalLinkage,
4011                                Name, &CGM.getModule());
4012   }
4013 
4014   MethodDefinitions.insert(std::make_pair(OMD, Method));
4015 
4016   return Method;
4017 }
4018 
4019 llvm::Function *
4020 CGObjCCommonMac::GenerateDirectMethod(const ObjCMethodDecl *OMD,
4021                                       const ObjCContainerDecl *CD) {
4022   auto *COMD = OMD->getCanonicalDecl();
4023   auto I = DirectMethodDefinitions.find(COMD);
4024   llvm::Function *OldFn = nullptr, *Fn = nullptr;
4025 
4026   if (I != DirectMethodDefinitions.end()) {
4027     // Objective-C allows for the declaration and implementation types
4028     // to differ slightly.
4029     //
4030     // If we're being asked for the Function associated for a method
4031     // implementation, a previous value might have been cached
4032     // based on the type of the canonical declaration.
4033     //
4034     // If these do not match, then we'll replace this function with
4035     // a new one that has the proper type below.
4036     if (!OMD->getBody() || COMD->getReturnType() == OMD->getReturnType())
4037       return I->second;
4038     OldFn = I->second;
4039   }
4040 
4041   CodeGenTypes &Types = CGM.getTypes();
4042   llvm::FunctionType *MethodTy =
4043     Types.GetFunctionType(Types.arrangeObjCMethodDeclaration(OMD));
4044 
4045   if (OldFn) {
4046     Fn = llvm::Function::Create(MethodTy, llvm::GlobalValue::ExternalLinkage,
4047                                 "", &CGM.getModule());
4048     Fn->takeName(OldFn);
4049     OldFn->replaceAllUsesWith(
4050         llvm::ConstantExpr::getBitCast(Fn, OldFn->getType()));
4051     OldFn->eraseFromParent();
4052 
4053     // Replace the cached function in the map.
4054     I->second = Fn;
4055   } else {
4056     auto Name = getSymbolNameForMethod(OMD, /*include category*/ false);
4057 
4058     Fn = llvm::Function::Create(MethodTy, llvm::GlobalValue::ExternalLinkage,
4059                                 Name, &CGM.getModule());
4060     DirectMethodDefinitions.insert(std::make_pair(COMD, Fn));
4061   }
4062 
4063   return Fn;
4064 }
4065 
4066 void CGObjCCommonMac::GenerateDirectMethodPrologue(
4067     CodeGenFunction &CGF, llvm::Function *Fn, const ObjCMethodDecl *OMD,
4068     const ObjCContainerDecl *CD) {
4069   auto &Builder = CGF.Builder;
4070   bool ReceiverCanBeNull = true;
4071   auto selfAddr = CGF.GetAddrOfLocalVar(OMD->getSelfDecl());
4072   auto selfValue = Builder.CreateLoad(selfAddr);
4073 
4074   // Generate:
4075   //
4076   // /* for class methods only to force class lazy initialization */
4077   // self = [self self];
4078   //
4079   // /* unless the receiver is never NULL */
4080   // if (self == nil) {
4081   //     return (ReturnType){ };
4082   // }
4083   //
4084   // _cmd = @selector(...)
4085   // ...
4086 
4087   if (OMD->isClassMethod()) {
4088     const ObjCInterfaceDecl *OID = cast<ObjCInterfaceDecl>(CD);
4089     assert(OID &&
4090            "GenerateDirectMethod() should be called with the Class Interface");
4091     Selector SelfSel = GetNullarySelector("self", CGM.getContext());
4092     auto ResultType = CGF.getContext().getObjCIdType();
4093     RValue result;
4094     CallArgList Args;
4095 
4096     // TODO: If this method is inlined, the caller might know that `self` is
4097     // already initialized; for example, it might be an ordinary Objective-C
4098     // method which always receives an initialized `self`, or it might have just
4099     // forced initialization on its own.
4100     //
4101     // We should find a way to eliminate this unnecessary initialization in such
4102     // cases in LLVM.
4103     result = GeneratePossiblySpecializedMessageSend(
4104         CGF, ReturnValueSlot(), ResultType, SelfSel, selfValue, Args, OID,
4105         nullptr, true);
4106     Builder.CreateStore(result.getScalarVal(), selfAddr);
4107 
4108     // Nullable `Class` expressions cannot be messaged with a direct method
4109     // so the only reason why the receive can be null would be because
4110     // of weak linking.
4111     ReceiverCanBeNull = isWeakLinkedClass(OID);
4112   }
4113 
4114   if (ReceiverCanBeNull) {
4115     llvm::BasicBlock *SelfIsNilBlock =
4116         CGF.createBasicBlock("objc_direct_method.self_is_nil");
4117     llvm::BasicBlock *ContBlock =
4118         CGF.createBasicBlock("objc_direct_method.cont");
4119 
4120     // if (self == nil) {
4121     auto selfTy = cast<llvm::PointerType>(selfValue->getType());
4122     auto Zero = llvm::ConstantPointerNull::get(selfTy);
4123 
4124     llvm::MDBuilder MDHelper(CGM.getLLVMContext());
4125     Builder.CreateCondBr(Builder.CreateICmpEQ(selfValue, Zero), SelfIsNilBlock,
4126                          ContBlock, MDHelper.createBranchWeights(1, 1 << 20));
4127 
4128     CGF.EmitBlock(SelfIsNilBlock);
4129 
4130     //   return (ReturnType){ };
4131     auto retTy = OMD->getReturnType();
4132     Builder.SetInsertPoint(SelfIsNilBlock);
4133     if (!retTy->isVoidType()) {
4134       CGF.EmitNullInitialization(CGF.ReturnValue, retTy);
4135     }
4136     CGF.EmitBranchThroughCleanup(CGF.ReturnBlock);
4137     // }
4138 
4139     // rest of the body
4140     CGF.EmitBlock(ContBlock);
4141     Builder.SetInsertPoint(ContBlock);
4142   }
4143 
4144   // only synthesize _cmd if it's referenced
4145   if (OMD->getCmdDecl()->isUsed()) {
4146     Builder.CreateStore(GetSelector(CGF, OMD),
4147                         CGF.GetAddrOfLocalVar(OMD->getCmdDecl()));
4148   }
4149 }
4150 
4151 llvm::GlobalVariable *CGObjCCommonMac::CreateMetadataVar(Twine Name,
4152                                                ConstantStructBuilder &Init,
4153                                                          StringRef Section,
4154                                                          CharUnits Align,
4155                                                          bool AddToUsed) {
4156   llvm::GlobalValue::LinkageTypes LT =
4157       getLinkageTypeForObjCMetadata(CGM, Section);
4158   llvm::GlobalVariable *GV =
4159       Init.finishAndCreateGlobal(Name, Align, /*constant*/ false, LT);
4160   if (!Section.empty())
4161     GV->setSection(Section);
4162   if (AddToUsed)
4163     CGM.addCompilerUsedGlobal(GV);
4164   return GV;
4165 }
4166 
4167 llvm::GlobalVariable *CGObjCCommonMac::CreateMetadataVar(Twine Name,
4168                                                          llvm::Constant *Init,
4169                                                          StringRef Section,
4170                                                          CharUnits Align,
4171                                                          bool AddToUsed) {
4172   llvm::Type *Ty = Init->getType();
4173   llvm::GlobalValue::LinkageTypes LT =
4174       getLinkageTypeForObjCMetadata(CGM, Section);
4175   llvm::GlobalVariable *GV =
4176       new llvm::GlobalVariable(CGM.getModule(), Ty, false, LT, Init, Name);
4177   if (!Section.empty())
4178     GV->setSection(Section);
4179   GV->setAlignment(Align.getAsAlign());
4180   if (AddToUsed)
4181     CGM.addCompilerUsedGlobal(GV);
4182   return GV;
4183 }
4184 
4185 llvm::GlobalVariable *
4186 CGObjCCommonMac::CreateCStringLiteral(StringRef Name, ObjCLabelType Type,
4187                                       bool ForceNonFragileABI,
4188                                       bool NullTerminate) {
4189   StringRef Label;
4190   switch (Type) {
4191   case ObjCLabelType::ClassName:     Label = "OBJC_CLASS_NAME_"; break;
4192   case ObjCLabelType::MethodVarName: Label = "OBJC_METH_VAR_NAME_"; break;
4193   case ObjCLabelType::MethodVarType: Label = "OBJC_METH_VAR_TYPE_"; break;
4194   case ObjCLabelType::PropertyName:  Label = "OBJC_PROP_NAME_ATTR_"; break;
4195   }
4196 
4197   bool NonFragile = ForceNonFragileABI || isNonFragileABI();
4198 
4199   StringRef Section;
4200   switch (Type) {
4201   case ObjCLabelType::ClassName:
4202     Section = NonFragile ? "__TEXT,__objc_classname,cstring_literals"
4203                          : "__TEXT,__cstring,cstring_literals";
4204     break;
4205   case ObjCLabelType::MethodVarName:
4206     Section = NonFragile ? "__TEXT,__objc_methname,cstring_literals"
4207                          : "__TEXT,__cstring,cstring_literals";
4208     break;
4209   case ObjCLabelType::MethodVarType:
4210     Section = NonFragile ? "__TEXT,__objc_methtype,cstring_literals"
4211                          : "__TEXT,__cstring,cstring_literals";
4212     break;
4213   case ObjCLabelType::PropertyName:
4214     Section = NonFragile ? "__TEXT,__objc_methname,cstring_literals"
4215                          : "__TEXT,__cstring,cstring_literals";
4216     break;
4217   }
4218 
4219   llvm::Constant *Value =
4220       llvm::ConstantDataArray::getString(VMContext, Name, NullTerminate);
4221   llvm::GlobalVariable *GV =
4222       new llvm::GlobalVariable(CGM.getModule(), Value->getType(),
4223                                /*isConstant=*/true,
4224                                llvm::GlobalValue::PrivateLinkage, Value, Label);
4225   if (CGM.getTriple().isOSBinFormatMachO())
4226     GV->setSection(Section);
4227   GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4228   GV->setAlignment(CharUnits::One().getAsAlign());
4229   CGM.addCompilerUsedGlobal(GV);
4230 
4231   return GV;
4232 }
4233 
4234 llvm::Function *CGObjCMac::ModuleInitFunction() {
4235   // Abuse this interface function as a place to finalize.
4236   FinishModule();
4237   return nullptr;
4238 }
4239 
4240 llvm::FunctionCallee CGObjCMac::GetPropertyGetFunction() {
4241   return ObjCTypes.getGetPropertyFn();
4242 }
4243 
4244 llvm::FunctionCallee CGObjCMac::GetPropertySetFunction() {
4245   return ObjCTypes.getSetPropertyFn();
4246 }
4247 
4248 llvm::FunctionCallee CGObjCMac::GetOptimizedPropertySetFunction(bool atomic,
4249                                                                 bool copy) {
4250   return ObjCTypes.getOptimizedSetPropertyFn(atomic, copy);
4251 }
4252 
4253 llvm::FunctionCallee CGObjCMac::GetGetStructFunction() {
4254   return ObjCTypes.getCopyStructFn();
4255 }
4256 
4257 llvm::FunctionCallee CGObjCMac::GetSetStructFunction() {
4258   return ObjCTypes.getCopyStructFn();
4259 }
4260 
4261 llvm::FunctionCallee CGObjCMac::GetCppAtomicObjectGetFunction() {
4262   return ObjCTypes.getCppAtomicObjectFunction();
4263 }
4264 
4265 llvm::FunctionCallee CGObjCMac::GetCppAtomicObjectSetFunction() {
4266   return ObjCTypes.getCppAtomicObjectFunction();
4267 }
4268 
4269 llvm::FunctionCallee CGObjCMac::EnumerationMutationFunction() {
4270   return ObjCTypes.getEnumerationMutationFn();
4271 }
4272 
4273 void CGObjCMac::EmitTryStmt(CodeGenFunction &CGF, const ObjCAtTryStmt &S) {
4274   return EmitTryOrSynchronizedStmt(CGF, S);
4275 }
4276 
4277 void CGObjCMac::EmitSynchronizedStmt(CodeGenFunction &CGF,
4278                                      const ObjCAtSynchronizedStmt &S) {
4279   return EmitTryOrSynchronizedStmt(CGF, S);
4280 }
4281 
4282 namespace {
4283   struct PerformFragileFinally final : EHScopeStack::Cleanup {
4284     const Stmt &S;
4285     Address SyncArgSlot;
4286     Address CallTryExitVar;
4287     Address ExceptionData;
4288     ObjCTypesHelper &ObjCTypes;
4289     PerformFragileFinally(const Stmt *S,
4290                           Address SyncArgSlot,
4291                           Address CallTryExitVar,
4292                           Address ExceptionData,
4293                           ObjCTypesHelper *ObjCTypes)
4294       : S(*S), SyncArgSlot(SyncArgSlot), CallTryExitVar(CallTryExitVar),
4295         ExceptionData(ExceptionData), ObjCTypes(*ObjCTypes) {}
4296 
4297     void Emit(CodeGenFunction &CGF, Flags flags) override {
4298       // Check whether we need to call objc_exception_try_exit.
4299       // In optimized code, this branch will always be folded.
4300       llvm::BasicBlock *FinallyCallExit =
4301         CGF.createBasicBlock("finally.call_exit");
4302       llvm::BasicBlock *FinallyNoCallExit =
4303         CGF.createBasicBlock("finally.no_call_exit");
4304       CGF.Builder.CreateCondBr(CGF.Builder.CreateLoad(CallTryExitVar),
4305                                FinallyCallExit, FinallyNoCallExit);
4306 
4307       CGF.EmitBlock(FinallyCallExit);
4308       CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionTryExitFn(),
4309                                   ExceptionData.getPointer());
4310 
4311       CGF.EmitBlock(FinallyNoCallExit);
4312 
4313       if (isa<ObjCAtTryStmt>(S)) {
4314         if (const ObjCAtFinallyStmt* FinallyStmt =
4315               cast<ObjCAtTryStmt>(S).getFinallyStmt()) {
4316           // Don't try to do the @finally if this is an EH cleanup.
4317           if (flags.isForEHCleanup()) return;
4318 
4319           // Save the current cleanup destination in case there's
4320           // control flow inside the finally statement.
4321           llvm::Value *CurCleanupDest =
4322             CGF.Builder.CreateLoad(CGF.getNormalCleanupDestSlot());
4323 
4324           CGF.EmitStmt(FinallyStmt->getFinallyBody());
4325 
4326           if (CGF.HaveInsertPoint()) {
4327             CGF.Builder.CreateStore(CurCleanupDest,
4328                                     CGF.getNormalCleanupDestSlot());
4329           } else {
4330             // Currently, the end of the cleanup must always exist.
4331             CGF.EnsureInsertPoint();
4332           }
4333         }
4334       } else {
4335         // Emit objc_sync_exit(expr); as finally's sole statement for
4336         // @synchronized.
4337         llvm::Value *SyncArg = CGF.Builder.CreateLoad(SyncArgSlot);
4338         CGF.EmitNounwindRuntimeCall(ObjCTypes.getSyncExitFn(), SyncArg);
4339       }
4340     }
4341   };
4342 
4343   class FragileHazards {
4344     CodeGenFunction &CGF;
4345     SmallVector<llvm::Value*, 20> Locals;
4346     llvm::DenseSet<llvm::BasicBlock*> BlocksBeforeTry;
4347 
4348     llvm::InlineAsm *ReadHazard;
4349     llvm::InlineAsm *WriteHazard;
4350 
4351     llvm::FunctionType *GetAsmFnType();
4352 
4353     void collectLocals();
4354     void emitReadHazard(CGBuilderTy &Builder);
4355 
4356   public:
4357     FragileHazards(CodeGenFunction &CGF);
4358 
4359     void emitWriteHazard();
4360     void emitHazardsInNewBlocks();
4361   };
4362 } // end anonymous namespace
4363 
4364 /// Create the fragile-ABI read and write hazards based on the current
4365 /// state of the function, which is presumed to be immediately prior
4366 /// to a @try block.  These hazards are used to maintain correct
4367 /// semantics in the face of optimization and the fragile ABI's
4368 /// cavalier use of setjmp/longjmp.
4369 FragileHazards::FragileHazards(CodeGenFunction &CGF) : CGF(CGF) {
4370   collectLocals();
4371 
4372   if (Locals.empty()) return;
4373 
4374   // Collect all the blocks in the function.
4375   for (llvm::Function::iterator
4376          I = CGF.CurFn->begin(), E = CGF.CurFn->end(); I != E; ++I)
4377     BlocksBeforeTry.insert(&*I);
4378 
4379   llvm::FunctionType *AsmFnTy = GetAsmFnType();
4380 
4381   // Create a read hazard for the allocas.  This inhibits dead-store
4382   // optimizations and forces the values to memory.  This hazard is
4383   // inserted before any 'throwing' calls in the protected scope to
4384   // reflect the possibility that the variables might be read from the
4385   // catch block if the call throws.
4386   {
4387     std::string Constraint;
4388     for (unsigned I = 0, E = Locals.size(); I != E; ++I) {
4389       if (I) Constraint += ',';
4390       Constraint += "*m";
4391     }
4392 
4393     ReadHazard = llvm::InlineAsm::get(AsmFnTy, "", Constraint, true, false);
4394   }
4395 
4396   // Create a write hazard for the allocas.  This inhibits folding
4397   // loads across the hazard.  This hazard is inserted at the
4398   // beginning of the catch path to reflect the possibility that the
4399   // variables might have been written within the protected scope.
4400   {
4401     std::string Constraint;
4402     for (unsigned I = 0, E = Locals.size(); I != E; ++I) {
4403       if (I) Constraint += ',';
4404       Constraint += "=*m";
4405     }
4406 
4407     WriteHazard = llvm::InlineAsm::get(AsmFnTy, "", Constraint, true, false);
4408   }
4409 }
4410 
4411 /// Emit a write hazard at the current location.
4412 void FragileHazards::emitWriteHazard() {
4413   if (Locals.empty()) return;
4414 
4415   CGF.EmitNounwindRuntimeCall(WriteHazard, Locals);
4416 }
4417 
4418 void FragileHazards::emitReadHazard(CGBuilderTy &Builder) {
4419   assert(!Locals.empty());
4420   llvm::CallInst *call = Builder.CreateCall(ReadHazard, Locals);
4421   call->setDoesNotThrow();
4422   call->setCallingConv(CGF.getRuntimeCC());
4423 }
4424 
4425 /// Emit read hazards in all the protected blocks, i.e. all the blocks
4426 /// which have been inserted since the beginning of the try.
4427 void FragileHazards::emitHazardsInNewBlocks() {
4428   if (Locals.empty()) return;
4429 
4430   CGBuilderTy Builder(CGF, CGF.getLLVMContext());
4431 
4432   // Iterate through all blocks, skipping those prior to the try.
4433   for (llvm::Function::iterator
4434          FI = CGF.CurFn->begin(), FE = CGF.CurFn->end(); FI != FE; ++FI) {
4435     llvm::BasicBlock &BB = *FI;
4436     if (BlocksBeforeTry.count(&BB)) continue;
4437 
4438     // Walk through all the calls in the block.
4439     for (llvm::BasicBlock::iterator
4440            BI = BB.begin(), BE = BB.end(); BI != BE; ++BI) {
4441       llvm::Instruction &I = *BI;
4442 
4443       // Ignore instructions that aren't non-intrinsic calls.
4444       // These are the only calls that can possibly call longjmp.
4445       if (!isa<llvm::CallInst>(I) && !isa<llvm::InvokeInst>(I))
4446         continue;
4447       if (isa<llvm::IntrinsicInst>(I))
4448         continue;
4449 
4450       // Ignore call sites marked nounwind.  This may be questionable,
4451       // since 'nounwind' doesn't necessarily mean 'does not call longjmp'.
4452       if (cast<llvm::CallBase>(I).doesNotThrow())
4453         continue;
4454 
4455       // Insert a read hazard before the call.  This will ensure that
4456       // any writes to the locals are performed before making the
4457       // call.  If the call throws, then this is sufficient to
4458       // guarantee correctness as long as it doesn't also write to any
4459       // locals.
4460       Builder.SetInsertPoint(&BB, BI);
4461       emitReadHazard(Builder);
4462     }
4463   }
4464 }
4465 
4466 static void addIfPresent(llvm::DenseSet<llvm::Value*> &S, Address V) {
4467   if (V.isValid()) S.insert(V.getPointer());
4468 }
4469 
4470 void FragileHazards::collectLocals() {
4471   // Compute a set of allocas to ignore.
4472   llvm::DenseSet<llvm::Value*> AllocasToIgnore;
4473   addIfPresent(AllocasToIgnore, CGF.ReturnValue);
4474   addIfPresent(AllocasToIgnore, CGF.NormalCleanupDest);
4475 
4476   // Collect all the allocas currently in the function.  This is
4477   // probably way too aggressive.
4478   llvm::BasicBlock &Entry = CGF.CurFn->getEntryBlock();
4479   for (llvm::BasicBlock::iterator
4480          I = Entry.begin(), E = Entry.end(); I != E; ++I)
4481     if (isa<llvm::AllocaInst>(*I) && !AllocasToIgnore.count(&*I))
4482       Locals.push_back(&*I);
4483 }
4484 
4485 llvm::FunctionType *FragileHazards::GetAsmFnType() {
4486   SmallVector<llvm::Type *, 16> tys(Locals.size());
4487   for (unsigned i = 0, e = Locals.size(); i != e; ++i)
4488     tys[i] = Locals[i]->getType();
4489   return llvm::FunctionType::get(CGF.VoidTy, tys, false);
4490 }
4491 
4492 /*
4493 
4494   Objective-C setjmp-longjmp (sjlj) Exception Handling
4495   --
4496 
4497   A catch buffer is a setjmp buffer plus:
4498     - a pointer to the exception that was caught
4499     - a pointer to the previous exception data buffer
4500     - two pointers of reserved storage
4501   Therefore catch buffers form a stack, with a pointer to the top
4502   of the stack kept in thread-local storage.
4503 
4504   objc_exception_try_enter pushes a catch buffer onto the EH stack.
4505   objc_exception_try_exit pops the given catch buffer, which is
4506     required to be the top of the EH stack.
4507   objc_exception_throw pops the top of the EH stack, writes the
4508     thrown exception into the appropriate field, and longjmps
4509     to the setjmp buffer.  It crashes the process (with a printf
4510     and an abort()) if there are no catch buffers on the stack.
4511   objc_exception_extract just reads the exception pointer out of the
4512     catch buffer.
4513 
4514   There's no reason an implementation couldn't use a light-weight
4515   setjmp here --- something like __builtin_setjmp, but API-compatible
4516   with the heavyweight setjmp.  This will be more important if we ever
4517   want to implement correct ObjC/C++ exception interactions for the
4518   fragile ABI.
4519 
4520   Note that for this use of setjmp/longjmp to be correct, we may need
4521   to mark some local variables volatile: if a non-volatile local
4522   variable is modified between the setjmp and the longjmp, it has
4523   indeterminate value.  For the purposes of LLVM IR, it may be
4524   sufficient to make loads and stores within the @try (to variables
4525   declared outside the @try) volatile.  This is necessary for
4526   optimized correctness, but is not currently being done; this is
4527   being tracked as rdar://problem/8160285
4528 
4529   The basic framework for a @try-catch-finally is as follows:
4530   {
4531   objc_exception_data d;
4532   id _rethrow = null;
4533   bool _call_try_exit = true;
4534 
4535   objc_exception_try_enter(&d);
4536   if (!setjmp(d.jmp_buf)) {
4537   ... try body ...
4538   } else {
4539   // exception path
4540   id _caught = objc_exception_extract(&d);
4541 
4542   // enter new try scope for handlers
4543   if (!setjmp(d.jmp_buf)) {
4544   ... match exception and execute catch blocks ...
4545 
4546   // fell off end, rethrow.
4547   _rethrow = _caught;
4548   ... jump-through-finally to finally_rethrow ...
4549   } else {
4550   // exception in catch block
4551   _rethrow = objc_exception_extract(&d);
4552   _call_try_exit = false;
4553   ... jump-through-finally to finally_rethrow ...
4554   }
4555   }
4556   ... jump-through-finally to finally_end ...
4557 
4558   finally:
4559   if (_call_try_exit)
4560   objc_exception_try_exit(&d);
4561 
4562   ... finally block ....
4563   ... dispatch to finally destination ...
4564 
4565   finally_rethrow:
4566   objc_exception_throw(_rethrow);
4567 
4568   finally_end:
4569   }
4570 
4571   This framework differs slightly from the one gcc uses, in that gcc
4572   uses _rethrow to determine if objc_exception_try_exit should be called
4573   and if the object should be rethrown. This breaks in the face of
4574   throwing nil and introduces unnecessary branches.
4575 
4576   We specialize this framework for a few particular circumstances:
4577 
4578   - If there are no catch blocks, then we avoid emitting the second
4579   exception handling context.
4580 
4581   - If there is a catch-all catch block (i.e. @catch(...) or @catch(id
4582   e)) we avoid emitting the code to rethrow an uncaught exception.
4583 
4584   - FIXME: If there is no @finally block we can do a few more
4585   simplifications.
4586 
4587   Rethrows and Jumps-Through-Finally
4588   --
4589 
4590   '@throw;' is supported by pushing the currently-caught exception
4591   onto ObjCEHStack while the @catch blocks are emitted.
4592 
4593   Branches through the @finally block are handled with an ordinary
4594   normal cleanup.  We do not register an EH cleanup; fragile-ABI ObjC
4595   exceptions are not compatible with C++ exceptions, and this is
4596   hardly the only place where this will go wrong.
4597 
4598   @synchronized(expr) { stmt; } is emitted as if it were:
4599     id synch_value = expr;
4600     objc_sync_enter(synch_value);
4601     @try { stmt; } @finally { objc_sync_exit(synch_value); }
4602 */
4603 
4604 void CGObjCMac::EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
4605                                           const Stmt &S) {
4606   bool isTry = isa<ObjCAtTryStmt>(S);
4607 
4608   // A destination for the fall-through edges of the catch handlers to
4609   // jump to.
4610   CodeGenFunction::JumpDest FinallyEnd =
4611     CGF.getJumpDestInCurrentScope("finally.end");
4612 
4613   // A destination for the rethrow edge of the catch handlers to jump
4614   // to.
4615   CodeGenFunction::JumpDest FinallyRethrow =
4616     CGF.getJumpDestInCurrentScope("finally.rethrow");
4617 
4618   // For @synchronized, call objc_sync_enter(sync.expr). The
4619   // evaluation of the expression must occur before we enter the
4620   // @synchronized.  We can't avoid a temp here because we need the
4621   // value to be preserved.  If the backend ever does liveness
4622   // correctly after setjmp, this will be unnecessary.
4623   Address SyncArgSlot = Address::invalid();
4624   if (!isTry) {
4625     llvm::Value *SyncArg =
4626       CGF.EmitScalarExpr(cast<ObjCAtSynchronizedStmt>(S).getSynchExpr());
4627     SyncArg = CGF.Builder.CreateBitCast(SyncArg, ObjCTypes.ObjectPtrTy);
4628     CGF.EmitNounwindRuntimeCall(ObjCTypes.getSyncEnterFn(), SyncArg);
4629 
4630     SyncArgSlot = CGF.CreateTempAlloca(SyncArg->getType(),
4631                                        CGF.getPointerAlign(), "sync.arg");
4632     CGF.Builder.CreateStore(SyncArg, SyncArgSlot);
4633   }
4634 
4635   // Allocate memory for the setjmp buffer.  This needs to be kept
4636   // live throughout the try and catch blocks.
4637   Address ExceptionData = CGF.CreateTempAlloca(ObjCTypes.ExceptionDataTy,
4638                                                CGF.getPointerAlign(),
4639                                                "exceptiondata.ptr");
4640 
4641   // Create the fragile hazards.  Note that this will not capture any
4642   // of the allocas required for exception processing, but will
4643   // capture the current basic block (which extends all the way to the
4644   // setjmp call) as "before the @try".
4645   FragileHazards Hazards(CGF);
4646 
4647   // Create a flag indicating whether the cleanup needs to call
4648   // objc_exception_try_exit.  This is true except when
4649   //   - no catches match and we're branching through the cleanup
4650   //     just to rethrow the exception, or
4651   //   - a catch matched and we're falling out of the catch handler.
4652   // The setjmp-safety rule here is that we should always store to this
4653   // variable in a place that dominates the branch through the cleanup
4654   // without passing through any setjmps.
4655   Address CallTryExitVar = CGF.CreateTempAlloca(CGF.Builder.getInt1Ty(),
4656                                                 CharUnits::One(),
4657                                                 "_call_try_exit");
4658 
4659   // A slot containing the exception to rethrow.  Only needed when we
4660   // have both a @catch and a @finally.
4661   Address PropagatingExnVar = Address::invalid();
4662 
4663   // Push a normal cleanup to leave the try scope.
4664   CGF.EHStack.pushCleanup<PerformFragileFinally>(NormalAndEHCleanup, &S,
4665                                                  SyncArgSlot,
4666                                                  CallTryExitVar,
4667                                                  ExceptionData,
4668                                                  &ObjCTypes);
4669 
4670   // Enter a try block:
4671   //  - Call objc_exception_try_enter to push ExceptionData on top of
4672   //    the EH stack.
4673   CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionTryEnterFn(),
4674                               ExceptionData.getPointer());
4675 
4676   //  - Call setjmp on the exception data buffer.
4677   llvm::Constant *Zero = llvm::ConstantInt::get(CGF.Builder.getInt32Ty(), 0);
4678   llvm::Value *GEPIndexes[] = { Zero, Zero, Zero };
4679   llvm::Value *SetJmpBuffer = CGF.Builder.CreateGEP(
4680       ObjCTypes.ExceptionDataTy, ExceptionData.getPointer(), GEPIndexes,
4681       "setjmp_buffer");
4682   llvm::CallInst *SetJmpResult = CGF.EmitNounwindRuntimeCall(
4683       ObjCTypes.getSetJmpFn(), SetJmpBuffer, "setjmp_result");
4684   SetJmpResult->setCanReturnTwice();
4685 
4686   // If setjmp returned 0, enter the protected block; otherwise,
4687   // branch to the handler.
4688   llvm::BasicBlock *TryBlock = CGF.createBasicBlock("try");
4689   llvm::BasicBlock *TryHandler = CGF.createBasicBlock("try.handler");
4690   llvm::Value *DidCatch =
4691     CGF.Builder.CreateIsNotNull(SetJmpResult, "did_catch_exception");
4692   CGF.Builder.CreateCondBr(DidCatch, TryHandler, TryBlock);
4693 
4694   // Emit the protected block.
4695   CGF.EmitBlock(TryBlock);
4696   CGF.Builder.CreateStore(CGF.Builder.getTrue(), CallTryExitVar);
4697   CGF.EmitStmt(isTry ? cast<ObjCAtTryStmt>(S).getTryBody()
4698                      : cast<ObjCAtSynchronizedStmt>(S).getSynchBody());
4699 
4700   CGBuilderTy::InsertPoint TryFallthroughIP = CGF.Builder.saveAndClearIP();
4701 
4702   // Emit the exception handler block.
4703   CGF.EmitBlock(TryHandler);
4704 
4705   // Don't optimize loads of the in-scope locals across this point.
4706   Hazards.emitWriteHazard();
4707 
4708   // For a @synchronized (or a @try with no catches), just branch
4709   // through the cleanup to the rethrow block.
4710   if (!isTry || !cast<ObjCAtTryStmt>(S).getNumCatchStmts()) {
4711     // Tell the cleanup not to re-pop the exit.
4712     CGF.Builder.CreateStore(CGF.Builder.getFalse(), CallTryExitVar);
4713     CGF.EmitBranchThroughCleanup(FinallyRethrow);
4714 
4715   // Otherwise, we have to match against the caught exceptions.
4716   } else {
4717     // Retrieve the exception object.  We may emit multiple blocks but
4718     // nothing can cross this so the value is already in SSA form.
4719     llvm::CallInst *Caught =
4720       CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionExtractFn(),
4721                                   ExceptionData.getPointer(), "caught");
4722 
4723     // Push the exception to rethrow onto the EH value stack for the
4724     // benefit of any @throws in the handlers.
4725     CGF.ObjCEHValueStack.push_back(Caught);
4726 
4727     const ObjCAtTryStmt* AtTryStmt = cast<ObjCAtTryStmt>(&S);
4728 
4729     bool HasFinally = (AtTryStmt->getFinallyStmt() != nullptr);
4730 
4731     llvm::BasicBlock *CatchBlock = nullptr;
4732     llvm::BasicBlock *CatchHandler = nullptr;
4733     if (HasFinally) {
4734       // Save the currently-propagating exception before
4735       // objc_exception_try_enter clears the exception slot.
4736       PropagatingExnVar = CGF.CreateTempAlloca(Caught->getType(),
4737                                                CGF.getPointerAlign(),
4738                                                "propagating_exception");
4739       CGF.Builder.CreateStore(Caught, PropagatingExnVar);
4740 
4741       // Enter a new exception try block (in case a @catch block
4742       // throws an exception).
4743       CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionTryEnterFn(),
4744                                   ExceptionData.getPointer());
4745 
4746       llvm::CallInst *SetJmpResult =
4747         CGF.EmitNounwindRuntimeCall(ObjCTypes.getSetJmpFn(),
4748                                     SetJmpBuffer, "setjmp.result");
4749       SetJmpResult->setCanReturnTwice();
4750 
4751       llvm::Value *Threw =
4752         CGF.Builder.CreateIsNotNull(SetJmpResult, "did_catch_exception");
4753 
4754       CatchBlock = CGF.createBasicBlock("catch");
4755       CatchHandler = CGF.createBasicBlock("catch_for_catch");
4756       CGF.Builder.CreateCondBr(Threw, CatchHandler, CatchBlock);
4757 
4758       CGF.EmitBlock(CatchBlock);
4759     }
4760 
4761     CGF.Builder.CreateStore(CGF.Builder.getInt1(HasFinally), CallTryExitVar);
4762 
4763     // Handle catch list. As a special case we check if everything is
4764     // matched and avoid generating code for falling off the end if
4765     // so.
4766     bool AllMatched = false;
4767     for (unsigned I = 0, N = AtTryStmt->getNumCatchStmts(); I != N; ++I) {
4768       const ObjCAtCatchStmt *CatchStmt = AtTryStmt->getCatchStmt(I);
4769 
4770       const VarDecl *CatchParam = CatchStmt->getCatchParamDecl();
4771       const ObjCObjectPointerType *OPT = nullptr;
4772 
4773       // catch(...) always matches.
4774       if (!CatchParam) {
4775         AllMatched = true;
4776       } else {
4777         OPT = CatchParam->getType()->getAs<ObjCObjectPointerType>();
4778 
4779         // catch(id e) always matches under this ABI, since only
4780         // ObjC exceptions end up here in the first place.
4781         // FIXME: For the time being we also match id<X>; this should
4782         // be rejected by Sema instead.
4783         if (OPT && (OPT->isObjCIdType() || OPT->isObjCQualifiedIdType()))
4784           AllMatched = true;
4785       }
4786 
4787       // If this is a catch-all, we don't need to test anything.
4788       if (AllMatched) {
4789         CodeGenFunction::RunCleanupsScope CatchVarCleanups(CGF);
4790 
4791         if (CatchParam) {
4792           CGF.EmitAutoVarDecl(*CatchParam);
4793           assert(CGF.HaveInsertPoint() && "DeclStmt destroyed insert point?");
4794 
4795           // These types work out because ConvertType(id) == i8*.
4796           EmitInitOfCatchParam(CGF, Caught, CatchParam);
4797         }
4798 
4799         CGF.EmitStmt(CatchStmt->getCatchBody());
4800 
4801         // The scope of the catch variable ends right here.
4802         CatchVarCleanups.ForceCleanup();
4803 
4804         CGF.EmitBranchThroughCleanup(FinallyEnd);
4805         break;
4806       }
4807 
4808       assert(OPT && "Unexpected non-object pointer type in @catch");
4809       const ObjCObjectType *ObjTy = OPT->getObjectType();
4810 
4811       // FIXME: @catch (Class c) ?
4812       ObjCInterfaceDecl *IDecl = ObjTy->getInterface();
4813       assert(IDecl && "Catch parameter must have Objective-C type!");
4814 
4815       // Check if the @catch block matches the exception object.
4816       llvm::Value *Class = EmitClassRef(CGF, IDecl);
4817 
4818       llvm::Value *matchArgs[] = { Class, Caught };
4819       llvm::CallInst *Match =
4820         CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionMatchFn(),
4821                                     matchArgs, "match");
4822 
4823       llvm::BasicBlock *MatchedBlock = CGF.createBasicBlock("match");
4824       llvm::BasicBlock *NextCatchBlock = CGF.createBasicBlock("catch.next");
4825 
4826       CGF.Builder.CreateCondBr(CGF.Builder.CreateIsNotNull(Match, "matched"),
4827                                MatchedBlock, NextCatchBlock);
4828 
4829       // Emit the @catch block.
4830       CGF.EmitBlock(MatchedBlock);
4831 
4832       // Collect any cleanups for the catch variable.  The scope lasts until
4833       // the end of the catch body.
4834       CodeGenFunction::RunCleanupsScope CatchVarCleanups(CGF);
4835 
4836       CGF.EmitAutoVarDecl(*CatchParam);
4837       assert(CGF.HaveInsertPoint() && "DeclStmt destroyed insert point?");
4838 
4839       // Initialize the catch variable.
4840       llvm::Value *Tmp =
4841         CGF.Builder.CreateBitCast(Caught,
4842                                   CGF.ConvertType(CatchParam->getType()));
4843       EmitInitOfCatchParam(CGF, Tmp, CatchParam);
4844 
4845       CGF.EmitStmt(CatchStmt->getCatchBody());
4846 
4847       // We're done with the catch variable.
4848       CatchVarCleanups.ForceCleanup();
4849 
4850       CGF.EmitBranchThroughCleanup(FinallyEnd);
4851 
4852       CGF.EmitBlock(NextCatchBlock);
4853     }
4854 
4855     CGF.ObjCEHValueStack.pop_back();
4856 
4857     // If nothing wanted anything to do with the caught exception,
4858     // kill the extract call.
4859     if (Caught->use_empty())
4860       Caught->eraseFromParent();
4861 
4862     if (!AllMatched)
4863       CGF.EmitBranchThroughCleanup(FinallyRethrow);
4864 
4865     if (HasFinally) {
4866       // Emit the exception handler for the @catch blocks.
4867       CGF.EmitBlock(CatchHandler);
4868 
4869       // In theory we might now need a write hazard, but actually it's
4870       // unnecessary because there's no local-accessing code between
4871       // the try's write hazard and here.
4872       //Hazards.emitWriteHazard();
4873 
4874       // Extract the new exception and save it to the
4875       // propagating-exception slot.
4876       assert(PropagatingExnVar.isValid());
4877       llvm::CallInst *NewCaught =
4878         CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionExtractFn(),
4879                                     ExceptionData.getPointer(), "caught");
4880       CGF.Builder.CreateStore(NewCaught, PropagatingExnVar);
4881 
4882       // Don't pop the catch handler; the throw already did.
4883       CGF.Builder.CreateStore(CGF.Builder.getFalse(), CallTryExitVar);
4884       CGF.EmitBranchThroughCleanup(FinallyRethrow);
4885     }
4886   }
4887 
4888   // Insert read hazards as required in the new blocks.
4889   Hazards.emitHazardsInNewBlocks();
4890 
4891   // Pop the cleanup.
4892   CGF.Builder.restoreIP(TryFallthroughIP);
4893   if (CGF.HaveInsertPoint())
4894     CGF.Builder.CreateStore(CGF.Builder.getTrue(), CallTryExitVar);
4895   CGF.PopCleanupBlock();
4896   CGF.EmitBlock(FinallyEnd.getBlock(), true);
4897 
4898   // Emit the rethrow block.
4899   CGBuilderTy::InsertPoint SavedIP = CGF.Builder.saveAndClearIP();
4900   CGF.EmitBlock(FinallyRethrow.getBlock(), true);
4901   if (CGF.HaveInsertPoint()) {
4902     // If we have a propagating-exception variable, check it.
4903     llvm::Value *PropagatingExn;
4904     if (PropagatingExnVar.isValid()) {
4905       PropagatingExn = CGF.Builder.CreateLoad(PropagatingExnVar);
4906 
4907     // Otherwise, just look in the buffer for the exception to throw.
4908     } else {
4909       llvm::CallInst *Caught =
4910         CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionExtractFn(),
4911                                     ExceptionData.getPointer());
4912       PropagatingExn = Caught;
4913     }
4914 
4915     CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionThrowFn(),
4916                                 PropagatingExn);
4917     CGF.Builder.CreateUnreachable();
4918   }
4919 
4920   CGF.Builder.restoreIP(SavedIP);
4921 }
4922 
4923 void CGObjCMac::EmitThrowStmt(CodeGen::CodeGenFunction &CGF,
4924                               const ObjCAtThrowStmt &S,
4925                               bool ClearInsertionPoint) {
4926   llvm::Value *ExceptionAsObject;
4927 
4928   if (const Expr *ThrowExpr = S.getThrowExpr()) {
4929     llvm::Value *Exception = CGF.EmitObjCThrowOperand(ThrowExpr);
4930     ExceptionAsObject =
4931       CGF.Builder.CreateBitCast(Exception, ObjCTypes.ObjectPtrTy);
4932   } else {
4933     assert((!CGF.ObjCEHValueStack.empty() && CGF.ObjCEHValueStack.back()) &&
4934            "Unexpected rethrow outside @catch block.");
4935     ExceptionAsObject = CGF.ObjCEHValueStack.back();
4936   }
4937 
4938   CGF.EmitRuntimeCall(ObjCTypes.getExceptionThrowFn(), ExceptionAsObject)
4939     ->setDoesNotReturn();
4940   CGF.Builder.CreateUnreachable();
4941 
4942   // Clear the insertion point to indicate we are in unreachable code.
4943   if (ClearInsertionPoint)
4944     CGF.Builder.ClearInsertionPoint();
4945 }
4946 
4947 /// EmitObjCWeakRead - Code gen for loading value of a __weak
4948 /// object: objc_read_weak (id *src)
4949 ///
4950 llvm::Value * CGObjCMac::EmitObjCWeakRead(CodeGen::CodeGenFunction &CGF,
4951                                           Address AddrWeakObj) {
4952   llvm::Type* DestTy = AddrWeakObj.getElementType();
4953   AddrWeakObj = CGF.Builder.CreateBitCast(AddrWeakObj,
4954                                           ObjCTypes.PtrObjectPtrTy);
4955   llvm::Value *read_weak =
4956     CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcReadWeakFn(),
4957                                 AddrWeakObj.getPointer(), "weakread");
4958   read_weak = CGF.Builder.CreateBitCast(read_weak, DestTy);
4959   return read_weak;
4960 }
4961 
4962 /// EmitObjCWeakAssign - Code gen for assigning to a __weak object.
4963 /// objc_assign_weak (id src, id *dst)
4964 ///
4965 void CGObjCMac::EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF,
4966                                    llvm::Value *src, Address dst) {
4967   llvm::Type * SrcTy = src->getType();
4968   if (!isa<llvm::PointerType>(SrcTy)) {
4969     unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
4970     assert(Size <= 8 && "does not support size > 8");
4971     src = (Size == 4) ? CGF.Builder.CreateBitCast(src, CGM.Int32Ty)
4972                       : CGF.Builder.CreateBitCast(src, CGM.Int64Ty);
4973     src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
4974   }
4975   src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
4976   dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
4977   llvm::Value *args[] = { src, dst.getPointer() };
4978   CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignWeakFn(),
4979                               args, "weakassign");
4980 }
4981 
4982 /// EmitObjCGlobalAssign - Code gen for assigning to a __strong object.
4983 /// objc_assign_global (id src, id *dst)
4984 ///
4985 void CGObjCMac::EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF,
4986                                      llvm::Value *src, Address dst,
4987                                      bool threadlocal) {
4988   llvm::Type * SrcTy = src->getType();
4989   if (!isa<llvm::PointerType>(SrcTy)) {
4990     unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
4991     assert(Size <= 8 && "does not support size > 8");
4992     src = (Size == 4) ? CGF.Builder.CreateBitCast(src, CGM.Int32Ty)
4993                       : CGF.Builder.CreateBitCast(src, CGM.Int64Ty);
4994     src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
4995   }
4996   src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
4997   dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
4998   llvm::Value *args[] = { src, dst.getPointer() };
4999   if (!threadlocal)
5000     CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignGlobalFn(),
5001                                 args, "globalassign");
5002   else
5003     CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignThreadLocalFn(),
5004                                 args, "threadlocalassign");
5005 }
5006 
5007 /// EmitObjCIvarAssign - Code gen for assigning to a __strong object.
5008 /// objc_assign_ivar (id src, id *dst, ptrdiff_t ivaroffset)
5009 ///
5010 void CGObjCMac::EmitObjCIvarAssign(CodeGen::CodeGenFunction &CGF,
5011                                    llvm::Value *src, Address dst,
5012                                    llvm::Value *ivarOffset) {
5013   assert(ivarOffset && "EmitObjCIvarAssign - ivarOffset is NULL");
5014   llvm::Type * SrcTy = src->getType();
5015   if (!isa<llvm::PointerType>(SrcTy)) {
5016     unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
5017     assert(Size <= 8 && "does not support size > 8");
5018     src = (Size == 4) ? CGF.Builder.CreateBitCast(src, CGM.Int32Ty)
5019                       : CGF.Builder.CreateBitCast(src, CGM.Int64Ty);
5020     src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
5021   }
5022   src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
5023   dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
5024   llvm::Value *args[] = { src, dst.getPointer(), ivarOffset };
5025   CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignIvarFn(), args);
5026 }
5027 
5028 /// EmitObjCStrongCastAssign - Code gen for assigning to a __strong cast object.
5029 /// objc_assign_strongCast (id src, id *dst)
5030 ///
5031 void CGObjCMac::EmitObjCStrongCastAssign(CodeGen::CodeGenFunction &CGF,
5032                                          llvm::Value *src, Address dst) {
5033   llvm::Type * SrcTy = src->getType();
5034   if (!isa<llvm::PointerType>(SrcTy)) {
5035     unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
5036     assert(Size <= 8 && "does not support size > 8");
5037     src = (Size == 4) ? CGF.Builder.CreateBitCast(src, CGM.Int32Ty)
5038                       : CGF.Builder.CreateBitCast(src, CGM.Int64Ty);
5039     src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
5040   }
5041   src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
5042   dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
5043   llvm::Value *args[] = { src, dst.getPointer() };
5044   CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignStrongCastFn(),
5045                               args, "strongassign");
5046 }
5047 
5048 void CGObjCMac::EmitGCMemmoveCollectable(CodeGen::CodeGenFunction &CGF,
5049                                          Address DestPtr,
5050                                          Address SrcPtr,
5051                                          llvm::Value *size) {
5052   SrcPtr = CGF.Builder.CreateBitCast(SrcPtr, ObjCTypes.Int8PtrTy);
5053   DestPtr = CGF.Builder.CreateBitCast(DestPtr, ObjCTypes.Int8PtrTy);
5054   llvm::Value *args[] = { DestPtr.getPointer(), SrcPtr.getPointer(), size };
5055   CGF.EmitNounwindRuntimeCall(ObjCTypes.GcMemmoveCollectableFn(), args);
5056 }
5057 
5058 /// EmitObjCValueForIvar - Code Gen for ivar reference.
5059 ///
5060 LValue CGObjCMac::EmitObjCValueForIvar(CodeGen::CodeGenFunction &CGF,
5061                                        QualType ObjectTy,
5062                                        llvm::Value *BaseValue,
5063                                        const ObjCIvarDecl *Ivar,
5064                                        unsigned CVRQualifiers) {
5065   const ObjCInterfaceDecl *ID =
5066     ObjectTy->castAs<ObjCObjectType>()->getInterface();
5067   return EmitValueForIvarAtOffset(CGF, ID, BaseValue, Ivar, CVRQualifiers,
5068                                   EmitIvarOffset(CGF, ID, Ivar));
5069 }
5070 
5071 llvm::Value *CGObjCMac::EmitIvarOffset(CodeGen::CodeGenFunction &CGF,
5072                                        const ObjCInterfaceDecl *Interface,
5073                                        const ObjCIvarDecl *Ivar) {
5074   uint64_t Offset = ComputeIvarBaseOffset(CGM, Interface, Ivar);
5075   return llvm::ConstantInt::get(
5076     CGM.getTypes().ConvertType(CGM.getContext().LongTy),
5077     Offset);
5078 }
5079 
5080 /* *** Private Interface *** */
5081 
5082 std::string CGObjCCommonMac::GetSectionName(StringRef Section,
5083                                             StringRef MachOAttributes) {
5084   switch (CGM.getTriple().getObjectFormat()) {
5085   case llvm::Triple::UnknownObjectFormat:
5086     llvm_unreachable("unexpected object file format");
5087   case llvm::Triple::MachO: {
5088     if (MachOAttributes.empty())
5089       return ("__DATA," + Section).str();
5090     return ("__DATA," + Section + "," + MachOAttributes).str();
5091   }
5092   case llvm::Triple::ELF:
5093     assert(Section.substr(0, 2) == "__" &&
5094            "expected the name to begin with __");
5095     return Section.substr(2).str();
5096   case llvm::Triple::COFF:
5097     assert(Section.substr(0, 2) == "__" &&
5098            "expected the name to begin with __");
5099     return ("." + Section.substr(2) + "$B").str();
5100   case llvm::Triple::Wasm:
5101   case llvm::Triple::GOFF:
5102   case llvm::Triple::XCOFF:
5103     llvm::report_fatal_error(
5104         "Objective-C support is unimplemented for object file format");
5105   }
5106 
5107   llvm_unreachable("Unhandled llvm::Triple::ObjectFormatType enum");
5108 }
5109 
5110 /// EmitImageInfo - Emit the image info marker used to encode some module
5111 /// level information.
5112 ///
5113 /// See: <rdr://4810609&4810587&4810587>
5114 /// struct IMAGE_INFO {
5115 ///   unsigned version;
5116 ///   unsigned flags;
5117 /// };
5118 enum ImageInfoFlags {
5119   eImageInfo_FixAndContinue      = (1 << 0), // This flag is no longer set by clang.
5120   eImageInfo_GarbageCollected    = (1 << 1),
5121   eImageInfo_GCOnly              = (1 << 2),
5122   eImageInfo_OptimizedByDyld     = (1 << 3), // This flag is set by the dyld shared cache.
5123 
5124   // A flag indicating that the module has no instances of a @synthesize of a
5125   // superclass variable. <rdar://problem/6803242>
5126   eImageInfo_CorrectedSynthesize = (1 << 4), // This flag is no longer set by clang.
5127   eImageInfo_ImageIsSimulated    = (1 << 5),
5128   eImageInfo_ClassProperties     = (1 << 6)
5129 };
5130 
5131 void CGObjCCommonMac::EmitImageInfo() {
5132   unsigned version = 0; // Version is unused?
5133   std::string Section =
5134       (ObjCABI == 1)
5135           ? "__OBJC,__image_info,regular"
5136           : GetSectionName("__objc_imageinfo", "regular,no_dead_strip");
5137 
5138   // Generate module-level named metadata to convey this information to the
5139   // linker and code-gen.
5140   llvm::Module &Mod = CGM.getModule();
5141 
5142   // Add the ObjC ABI version to the module flags.
5143   Mod.addModuleFlag(llvm::Module::Error, "Objective-C Version", ObjCABI);
5144   Mod.addModuleFlag(llvm::Module::Error, "Objective-C Image Info Version",
5145                     version);
5146   Mod.addModuleFlag(llvm::Module::Error, "Objective-C Image Info Section",
5147                     llvm::MDString::get(VMContext, Section));
5148 
5149   auto Int8Ty = llvm::Type::getInt8Ty(VMContext);
5150   if (CGM.getLangOpts().getGC() == LangOptions::NonGC) {
5151     // Non-GC overrides those files which specify GC.
5152     Mod.addModuleFlag(llvm::Module::Error,
5153                       "Objective-C Garbage Collection",
5154                       llvm::ConstantInt::get(Int8Ty,0));
5155   } else {
5156     // Add the ObjC garbage collection value.
5157     Mod.addModuleFlag(llvm::Module::Error,
5158                       "Objective-C Garbage Collection",
5159                       llvm::ConstantInt::get(Int8Ty,
5160                         (uint8_t)eImageInfo_GarbageCollected));
5161 
5162     if (CGM.getLangOpts().getGC() == LangOptions::GCOnly) {
5163       // Add the ObjC GC Only value.
5164       Mod.addModuleFlag(llvm::Module::Error, "Objective-C GC Only",
5165                         eImageInfo_GCOnly);
5166 
5167       // Require that GC be specified and set to eImageInfo_GarbageCollected.
5168       llvm::Metadata *Ops[2] = {
5169           llvm::MDString::get(VMContext, "Objective-C Garbage Collection"),
5170           llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
5171               Int8Ty, eImageInfo_GarbageCollected))};
5172       Mod.addModuleFlag(llvm::Module::Require, "Objective-C GC Only",
5173                         llvm::MDNode::get(VMContext, Ops));
5174     }
5175   }
5176 
5177   // Indicate whether we're compiling this to run on a simulator.
5178   if (CGM.getTarget().getTriple().isSimulatorEnvironment())
5179     Mod.addModuleFlag(llvm::Module::Error, "Objective-C Is Simulated",
5180                       eImageInfo_ImageIsSimulated);
5181 
5182   // Indicate whether we are generating class properties.
5183   Mod.addModuleFlag(llvm::Module::Error, "Objective-C Class Properties",
5184                     eImageInfo_ClassProperties);
5185 }
5186 
5187 // struct objc_module {
5188 //   unsigned long version;
5189 //   unsigned long size;
5190 //   const char *name;
5191 //   Symtab symtab;
5192 // };
5193 
5194 // FIXME: Get from somewhere
5195 static const int ModuleVersion = 7;
5196 
5197 void CGObjCMac::EmitModuleInfo() {
5198   uint64_t Size = CGM.getDataLayout().getTypeAllocSize(ObjCTypes.ModuleTy);
5199 
5200   ConstantInitBuilder builder(CGM);
5201   auto values = builder.beginStruct(ObjCTypes.ModuleTy);
5202   values.addInt(ObjCTypes.LongTy, ModuleVersion);
5203   values.addInt(ObjCTypes.LongTy, Size);
5204   // This used to be the filename, now it is unused. <rdr://4327263>
5205   values.add(GetClassName(StringRef("")));
5206   values.add(EmitModuleSymbols());
5207   CreateMetadataVar("OBJC_MODULES", values,
5208                     "__OBJC,__module_info,regular,no_dead_strip",
5209                     CGM.getPointerAlign(), true);
5210 }
5211 
5212 llvm::Constant *CGObjCMac::EmitModuleSymbols() {
5213   unsigned NumClasses = DefinedClasses.size();
5214   unsigned NumCategories = DefinedCategories.size();
5215 
5216   // Return null if no symbols were defined.
5217   if (!NumClasses && !NumCategories)
5218     return llvm::Constant::getNullValue(ObjCTypes.SymtabPtrTy);
5219 
5220   ConstantInitBuilder builder(CGM);
5221   auto values = builder.beginStruct();
5222   values.addInt(ObjCTypes.LongTy, 0);
5223   values.addNullPointer(ObjCTypes.SelectorPtrTy);
5224   values.addInt(ObjCTypes.ShortTy, NumClasses);
5225   values.addInt(ObjCTypes.ShortTy, NumCategories);
5226 
5227   // The runtime expects exactly the list of defined classes followed
5228   // by the list of defined categories, in a single array.
5229   auto array = values.beginArray(ObjCTypes.Int8PtrTy);
5230   for (unsigned i=0; i<NumClasses; i++) {
5231     const ObjCInterfaceDecl *ID = ImplementedClasses[i];
5232     assert(ID);
5233     if (ObjCImplementationDecl *IMP = ID->getImplementation())
5234       // We are implementing a weak imported interface. Give it external linkage
5235       if (ID->isWeakImported() && !IMP->isWeakImported())
5236         DefinedClasses[i]->setLinkage(llvm::GlobalVariable::ExternalLinkage);
5237 
5238     array.addBitCast(DefinedClasses[i], ObjCTypes.Int8PtrTy);
5239   }
5240   for (unsigned i=0; i<NumCategories; i++)
5241     array.addBitCast(DefinedCategories[i], ObjCTypes.Int8PtrTy);
5242 
5243   array.finishAndAddTo(values);
5244 
5245   llvm::GlobalVariable *GV = CreateMetadataVar(
5246       "OBJC_SYMBOLS", values, "__OBJC,__symbols,regular,no_dead_strip",
5247       CGM.getPointerAlign(), true);
5248   return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.SymtabPtrTy);
5249 }
5250 
5251 llvm::Value *CGObjCMac::EmitClassRefFromId(CodeGenFunction &CGF,
5252                                            IdentifierInfo *II) {
5253   LazySymbols.insert(II);
5254 
5255   llvm::GlobalVariable *&Entry = ClassReferences[II];
5256 
5257   if (!Entry) {
5258     llvm::Constant *Casted =
5259     llvm::ConstantExpr::getBitCast(GetClassName(II->getName()),
5260                                    ObjCTypes.ClassPtrTy);
5261     Entry = CreateMetadataVar(
5262         "OBJC_CLASS_REFERENCES_", Casted,
5263         "__OBJC,__cls_refs,literal_pointers,no_dead_strip",
5264         CGM.getPointerAlign(), true);
5265   }
5266 
5267   return CGF.Builder.CreateAlignedLoad(Entry, CGF.getPointerAlign());
5268 }
5269 
5270 llvm::Value *CGObjCMac::EmitClassRef(CodeGenFunction &CGF,
5271                                      const ObjCInterfaceDecl *ID) {
5272   // If the class has the objc_runtime_visible attribute, we need to
5273   // use the Objective-C runtime to get the class.
5274   if (ID->hasAttr<ObjCRuntimeVisibleAttr>())
5275     return EmitClassRefViaRuntime(CGF, ID, ObjCTypes);
5276 
5277   IdentifierInfo *RuntimeName =
5278       &CGM.getContext().Idents.get(ID->getObjCRuntimeNameAsString());
5279   return EmitClassRefFromId(CGF, RuntimeName);
5280 }
5281 
5282 llvm::Value *CGObjCMac::EmitNSAutoreleasePoolClassRef(CodeGenFunction &CGF) {
5283   IdentifierInfo *II = &CGM.getContext().Idents.get("NSAutoreleasePool");
5284   return EmitClassRefFromId(CGF, II);
5285 }
5286 
5287 llvm::Value *CGObjCMac::EmitSelector(CodeGenFunction &CGF, Selector Sel) {
5288   return CGF.Builder.CreateLoad(EmitSelectorAddr(Sel));
5289 }
5290 
5291 Address CGObjCMac::EmitSelectorAddr(Selector Sel) {
5292   CharUnits Align = CGM.getPointerAlign();
5293 
5294   llvm::GlobalVariable *&Entry = SelectorReferences[Sel];
5295   if (!Entry) {
5296     llvm::Constant *Casted =
5297       llvm::ConstantExpr::getBitCast(GetMethodVarName(Sel),
5298                                      ObjCTypes.SelectorPtrTy);
5299     Entry = CreateMetadataVar(
5300         "OBJC_SELECTOR_REFERENCES_", Casted,
5301         "__OBJC,__message_refs,literal_pointers,no_dead_strip", Align, true);
5302     Entry->setExternallyInitialized(true);
5303   }
5304 
5305   return Address(Entry, Align);
5306 }
5307 
5308 llvm::Constant *CGObjCCommonMac::GetClassName(StringRef RuntimeName) {
5309     llvm::GlobalVariable *&Entry = ClassNames[RuntimeName];
5310     if (!Entry)
5311       Entry = CreateCStringLiteral(RuntimeName, ObjCLabelType::ClassName);
5312     return getConstantGEP(VMContext, Entry, 0, 0);
5313 }
5314 
5315 llvm::Function *CGObjCCommonMac::GetMethodDefinition(const ObjCMethodDecl *MD) {
5316   llvm::DenseMap<const ObjCMethodDecl*, llvm::Function*>::iterator
5317       I = MethodDefinitions.find(MD);
5318   if (I != MethodDefinitions.end())
5319     return I->second;
5320 
5321   return nullptr;
5322 }
5323 
5324 /// GetIvarLayoutName - Returns a unique constant for the given
5325 /// ivar layout bitmap.
5326 llvm::Constant *CGObjCCommonMac::GetIvarLayoutName(IdentifierInfo *Ident,
5327                                        const ObjCCommonTypesHelper &ObjCTypes) {
5328   return llvm::Constant::getNullValue(ObjCTypes.Int8PtrTy);
5329 }
5330 
5331 void IvarLayoutBuilder::visitRecord(const RecordType *RT,
5332                                     CharUnits offset) {
5333   const RecordDecl *RD = RT->getDecl();
5334 
5335   // If this is a union, remember that we had one, because it might mess
5336   // up the ordering of layout entries.
5337   if (RD->isUnion())
5338     IsDisordered = true;
5339 
5340   const ASTRecordLayout *recLayout = nullptr;
5341   visitAggregate(RD->field_begin(), RD->field_end(), offset,
5342                  [&](const FieldDecl *field) -> CharUnits {
5343     if (!recLayout)
5344       recLayout = &CGM.getContext().getASTRecordLayout(RD);
5345     auto offsetInBits = recLayout->getFieldOffset(field->getFieldIndex());
5346     return CGM.getContext().toCharUnitsFromBits(offsetInBits);
5347   });
5348 }
5349 
5350 template <class Iterator, class GetOffsetFn>
5351 void IvarLayoutBuilder::visitAggregate(Iterator begin, Iterator end,
5352                                        CharUnits aggregateOffset,
5353                                        const GetOffsetFn &getOffset) {
5354   for (; begin != end; ++begin) {
5355     auto field = *begin;
5356 
5357     // Skip over bitfields.
5358     if (field->isBitField()) {
5359       continue;
5360     }
5361 
5362     // Compute the offset of the field within the aggregate.
5363     CharUnits fieldOffset = aggregateOffset + getOffset(field);
5364 
5365     visitField(field, fieldOffset);
5366   }
5367 }
5368 
5369 /// Collect layout information for the given fields into IvarsInfo.
5370 void IvarLayoutBuilder::visitField(const FieldDecl *field,
5371                                    CharUnits fieldOffset) {
5372   QualType fieldType = field->getType();
5373 
5374   // Drill down into arrays.
5375   uint64_t numElts = 1;
5376   if (auto arrayType = CGM.getContext().getAsIncompleteArrayType(fieldType)) {
5377     numElts = 0;
5378     fieldType = arrayType->getElementType();
5379   }
5380   // Unlike incomplete arrays, constant arrays can be nested.
5381   while (auto arrayType = CGM.getContext().getAsConstantArrayType(fieldType)) {
5382     numElts *= arrayType->getSize().getZExtValue();
5383     fieldType = arrayType->getElementType();
5384   }
5385 
5386   assert(!fieldType->isArrayType() && "ivar of non-constant array type?");
5387 
5388   // If we ended up with a zero-sized array, we've done what we can do within
5389   // the limits of this layout encoding.
5390   if (numElts == 0) return;
5391 
5392   // Recurse if the base element type is a record type.
5393   if (auto recType = fieldType->getAs<RecordType>()) {
5394     size_t oldEnd = IvarsInfo.size();
5395 
5396     visitRecord(recType, fieldOffset);
5397 
5398     // If we have an array, replicate the first entry's layout information.
5399     auto numEltEntries = IvarsInfo.size() - oldEnd;
5400     if (numElts != 1 && numEltEntries != 0) {
5401       CharUnits eltSize = CGM.getContext().getTypeSizeInChars(recType);
5402       for (uint64_t eltIndex = 1; eltIndex != numElts; ++eltIndex) {
5403         // Copy the last numEltEntries onto the end of the array, adjusting
5404         // each for the element size.
5405         for (size_t i = 0; i != numEltEntries; ++i) {
5406           auto firstEntry = IvarsInfo[oldEnd + i];
5407           IvarsInfo.push_back(IvarInfo(firstEntry.Offset + eltIndex * eltSize,
5408                                        firstEntry.SizeInWords));
5409         }
5410       }
5411     }
5412 
5413     return;
5414   }
5415 
5416   // Classify the element type.
5417   Qualifiers::GC GCAttr = GetGCAttrTypeForType(CGM.getContext(), fieldType);
5418 
5419   // If it matches what we're looking for, add an entry.
5420   if ((ForStrongLayout && GCAttr == Qualifiers::Strong)
5421       || (!ForStrongLayout && GCAttr == Qualifiers::Weak)) {
5422     assert(CGM.getContext().getTypeSizeInChars(fieldType)
5423              == CGM.getPointerSize());
5424     IvarsInfo.push_back(IvarInfo(fieldOffset, numElts));
5425   }
5426 }
5427 
5428 /// buildBitmap - This routine does the horsework of taking the offsets of
5429 /// strong/weak references and creating a bitmap.  The bitmap is also
5430 /// returned in the given buffer, suitable for being passed to \c dump().
5431 llvm::Constant *IvarLayoutBuilder::buildBitmap(CGObjCCommonMac &CGObjC,
5432                                 llvm::SmallVectorImpl<unsigned char> &buffer) {
5433   // The bitmap is a series of skip/scan instructions, aligned to word
5434   // boundaries.  The skip is performed first.
5435   const unsigned char MaxNibble = 0xF;
5436   const unsigned char SkipMask = 0xF0, SkipShift = 4;
5437   const unsigned char ScanMask = 0x0F, ScanShift = 0;
5438 
5439   assert(!IvarsInfo.empty() && "generating bitmap for no data");
5440 
5441   // Sort the ivar info on byte position in case we encounterred a
5442   // union nested in the ivar list.
5443   if (IsDisordered) {
5444     // This isn't a stable sort, but our algorithm should handle it fine.
5445     llvm::array_pod_sort(IvarsInfo.begin(), IvarsInfo.end());
5446   } else {
5447     assert(llvm::is_sorted(IvarsInfo));
5448   }
5449   assert(IvarsInfo.back().Offset < InstanceEnd);
5450 
5451   assert(buffer.empty());
5452 
5453   // Skip the next N words.
5454   auto skip = [&](unsigned numWords) {
5455     assert(numWords > 0);
5456 
5457     // Try to merge into the previous byte.  Since scans happen second, we
5458     // can't do this if it includes a scan.
5459     if (!buffer.empty() && !(buffer.back() & ScanMask)) {
5460       unsigned lastSkip = buffer.back() >> SkipShift;
5461       if (lastSkip < MaxNibble) {
5462         unsigned claimed = std::min(MaxNibble - lastSkip, numWords);
5463         numWords -= claimed;
5464         lastSkip += claimed;
5465         buffer.back() = (lastSkip << SkipShift);
5466       }
5467     }
5468 
5469     while (numWords >= MaxNibble) {
5470       buffer.push_back(MaxNibble << SkipShift);
5471       numWords -= MaxNibble;
5472     }
5473     if (numWords) {
5474       buffer.push_back(numWords << SkipShift);
5475     }
5476   };
5477 
5478   // Scan the next N words.
5479   auto scan = [&](unsigned numWords) {
5480     assert(numWords > 0);
5481 
5482     // Try to merge into the previous byte.  Since scans happen second, we can
5483     // do this even if it includes a skip.
5484     if (!buffer.empty()) {
5485       unsigned lastScan = (buffer.back() & ScanMask) >> ScanShift;
5486       if (lastScan < MaxNibble) {
5487         unsigned claimed = std::min(MaxNibble - lastScan, numWords);
5488         numWords -= claimed;
5489         lastScan += claimed;
5490         buffer.back() = (buffer.back() & SkipMask) | (lastScan << ScanShift);
5491       }
5492     }
5493 
5494     while (numWords >= MaxNibble) {
5495       buffer.push_back(MaxNibble << ScanShift);
5496       numWords -= MaxNibble;
5497     }
5498     if (numWords) {
5499       buffer.push_back(numWords << ScanShift);
5500     }
5501   };
5502 
5503   // One past the end of the last scan.
5504   unsigned endOfLastScanInWords = 0;
5505   const CharUnits WordSize = CGM.getPointerSize();
5506 
5507   // Consider all the scan requests.
5508   for (auto &request : IvarsInfo) {
5509     CharUnits beginOfScan = request.Offset - InstanceBegin;
5510 
5511     // Ignore scan requests that don't start at an even multiple of the
5512     // word size.  We can't encode them.
5513     if ((beginOfScan % WordSize) != 0) continue;
5514 
5515     // Ignore scan requests that start before the instance start.
5516     // This assumes that scans never span that boundary.  The boundary
5517     // isn't the true start of the ivars, because in the fragile-ARC case
5518     // it's rounded up to word alignment, but the test above should leave
5519     // us ignoring that possibility.
5520     if (beginOfScan.isNegative()) {
5521       assert(request.Offset + request.SizeInWords * WordSize <= InstanceBegin);
5522       continue;
5523     }
5524 
5525     unsigned beginOfScanInWords = beginOfScan / WordSize;
5526     unsigned endOfScanInWords = beginOfScanInWords + request.SizeInWords;
5527 
5528     // If the scan starts some number of words after the last one ended,
5529     // skip forward.
5530     if (beginOfScanInWords > endOfLastScanInWords) {
5531       skip(beginOfScanInWords - endOfLastScanInWords);
5532 
5533     // Otherwise, start scanning where the last left off.
5534     } else {
5535       beginOfScanInWords = endOfLastScanInWords;
5536 
5537       // If that leaves us with nothing to scan, ignore this request.
5538       if (beginOfScanInWords >= endOfScanInWords) continue;
5539     }
5540 
5541     // Scan to the end of the request.
5542     assert(beginOfScanInWords < endOfScanInWords);
5543     scan(endOfScanInWords - beginOfScanInWords);
5544     endOfLastScanInWords = endOfScanInWords;
5545   }
5546 
5547   if (buffer.empty())
5548     return llvm::ConstantPointerNull::get(CGM.Int8PtrTy);
5549 
5550   // For GC layouts, emit a skip to the end of the allocation so that we
5551   // have precise information about the entire thing.  This isn't useful
5552   // or necessary for the ARC-style layout strings.
5553   if (CGM.getLangOpts().getGC() != LangOptions::NonGC) {
5554     unsigned lastOffsetInWords =
5555       (InstanceEnd - InstanceBegin + WordSize - CharUnits::One()) / WordSize;
5556     if (lastOffsetInWords > endOfLastScanInWords) {
5557       skip(lastOffsetInWords - endOfLastScanInWords);
5558     }
5559   }
5560 
5561   // Null terminate the string.
5562   buffer.push_back(0);
5563 
5564   auto *Entry = CGObjC.CreateCStringLiteral(
5565       reinterpret_cast<char *>(buffer.data()), ObjCLabelType::ClassName);
5566   return getConstantGEP(CGM.getLLVMContext(), Entry, 0, 0);
5567 }
5568 
5569 /// BuildIvarLayout - Builds ivar layout bitmap for the class
5570 /// implementation for the __strong or __weak case.
5571 /// The layout map displays which words in ivar list must be skipped
5572 /// and which must be scanned by GC (see below). String is built of bytes.
5573 /// Each byte is divided up in two nibbles (4-bit each). Left nibble is count
5574 /// of words to skip and right nibble is count of words to scan. So, each
5575 /// nibble represents up to 15 workds to skip or scan. Skipping the rest is
5576 /// represented by a 0x00 byte which also ends the string.
5577 /// 1. when ForStrongLayout is true, following ivars are scanned:
5578 /// - id, Class
5579 /// - object *
5580 /// - __strong anything
5581 ///
5582 /// 2. When ForStrongLayout is false, following ivars are scanned:
5583 /// - __weak anything
5584 ///
5585 llvm::Constant *
5586 CGObjCCommonMac::BuildIvarLayout(const ObjCImplementationDecl *OMD,
5587                                  CharUnits beginOffset, CharUnits endOffset,
5588                                  bool ForStrongLayout, bool HasMRCWeakIvars) {
5589   // If this is MRC, and we're either building a strong layout or there
5590   // are no weak ivars, bail out early.
5591   llvm::Type *PtrTy = CGM.Int8PtrTy;
5592   if (CGM.getLangOpts().getGC() == LangOptions::NonGC &&
5593       !CGM.getLangOpts().ObjCAutoRefCount &&
5594       (ForStrongLayout || !HasMRCWeakIvars))
5595     return llvm::Constant::getNullValue(PtrTy);
5596 
5597   const ObjCInterfaceDecl *OI = OMD->getClassInterface();
5598   SmallVector<const ObjCIvarDecl*, 32> ivars;
5599 
5600   // GC layout strings include the complete object layout, possibly
5601   // inaccurately in the non-fragile ABI; the runtime knows how to fix this
5602   // up.
5603   //
5604   // ARC layout strings only include the class's ivars.  In non-fragile
5605   // runtimes, that means starting at InstanceStart, rounded up to word
5606   // alignment.  In fragile runtimes, there's no InstanceStart, so it means
5607   // starting at the offset of the first ivar, rounded up to word alignment.
5608   //
5609   // MRC weak layout strings follow the ARC style.
5610   CharUnits baseOffset;
5611   if (CGM.getLangOpts().getGC() == LangOptions::NonGC) {
5612     for (const ObjCIvarDecl *IVD = OI->all_declared_ivar_begin();
5613          IVD; IVD = IVD->getNextIvar())
5614       ivars.push_back(IVD);
5615 
5616     if (isNonFragileABI()) {
5617       baseOffset = beginOffset; // InstanceStart
5618     } else if (!ivars.empty()) {
5619       baseOffset =
5620         CharUnits::fromQuantity(ComputeIvarBaseOffset(CGM, OMD, ivars[0]));
5621     } else {
5622       baseOffset = CharUnits::Zero();
5623     }
5624 
5625     baseOffset = baseOffset.alignTo(CGM.getPointerAlign());
5626   }
5627   else {
5628     CGM.getContext().DeepCollectObjCIvars(OI, true, ivars);
5629 
5630     baseOffset = CharUnits::Zero();
5631   }
5632 
5633   if (ivars.empty())
5634     return llvm::Constant::getNullValue(PtrTy);
5635 
5636   IvarLayoutBuilder builder(CGM, baseOffset, endOffset, ForStrongLayout);
5637 
5638   builder.visitAggregate(ivars.begin(), ivars.end(), CharUnits::Zero(),
5639                          [&](const ObjCIvarDecl *ivar) -> CharUnits {
5640       return CharUnits::fromQuantity(ComputeIvarBaseOffset(CGM, OMD, ivar));
5641   });
5642 
5643   if (!builder.hasBitmapData())
5644     return llvm::Constant::getNullValue(PtrTy);
5645 
5646   llvm::SmallVector<unsigned char, 4> buffer;
5647   llvm::Constant *C = builder.buildBitmap(*this, buffer);
5648 
5649    if (CGM.getLangOpts().ObjCGCBitmapPrint && !buffer.empty()) {
5650     printf("\n%s ivar layout for class '%s': ",
5651            ForStrongLayout ? "strong" : "weak",
5652            OMD->getClassInterface()->getName().str().c_str());
5653     builder.dump(buffer);
5654   }
5655   return C;
5656 }
5657 
5658 llvm::Constant *CGObjCCommonMac::GetMethodVarName(Selector Sel) {
5659   llvm::GlobalVariable *&Entry = MethodVarNames[Sel];
5660   // FIXME: Avoid std::string in "Sel.getAsString()"
5661   if (!Entry)
5662     Entry = CreateCStringLiteral(Sel.getAsString(), ObjCLabelType::MethodVarName);
5663   return getConstantGEP(VMContext, Entry, 0, 0);
5664 }
5665 
5666 // FIXME: Merge into a single cstring creation function.
5667 llvm::Constant *CGObjCCommonMac::GetMethodVarName(IdentifierInfo *ID) {
5668   return GetMethodVarName(CGM.getContext().Selectors.getNullarySelector(ID));
5669 }
5670 
5671 llvm::Constant *CGObjCCommonMac::GetMethodVarType(const FieldDecl *Field) {
5672   std::string TypeStr;
5673   CGM.getContext().getObjCEncodingForType(Field->getType(), TypeStr, Field);
5674 
5675   llvm::GlobalVariable *&Entry = MethodVarTypes[TypeStr];
5676   if (!Entry)
5677     Entry = CreateCStringLiteral(TypeStr, ObjCLabelType::MethodVarType);
5678   return getConstantGEP(VMContext, Entry, 0, 0);
5679 }
5680 
5681 llvm::Constant *CGObjCCommonMac::GetMethodVarType(const ObjCMethodDecl *D,
5682                                                   bool Extended) {
5683   std::string TypeStr =
5684     CGM.getContext().getObjCEncodingForMethodDecl(D, Extended);
5685 
5686   llvm::GlobalVariable *&Entry = MethodVarTypes[TypeStr];
5687   if (!Entry)
5688     Entry = CreateCStringLiteral(TypeStr, ObjCLabelType::MethodVarType);
5689   return getConstantGEP(VMContext, Entry, 0, 0);
5690 }
5691 
5692 // FIXME: Merge into a single cstring creation function.
5693 llvm::Constant *CGObjCCommonMac::GetPropertyName(IdentifierInfo *Ident) {
5694   llvm::GlobalVariable *&Entry = PropertyNames[Ident];
5695   if (!Entry)
5696     Entry = CreateCStringLiteral(Ident->getName(), ObjCLabelType::PropertyName);
5697   return getConstantGEP(VMContext, Entry, 0, 0);
5698 }
5699 
5700 // FIXME: Merge into a single cstring creation function.
5701 // FIXME: This Decl should be more precise.
5702 llvm::Constant *
5703 CGObjCCommonMac::GetPropertyTypeString(const ObjCPropertyDecl *PD,
5704                                        const Decl *Container) {
5705   std::string TypeStr =
5706     CGM.getContext().getObjCEncodingForPropertyDecl(PD, Container);
5707   return GetPropertyName(&CGM.getContext().Idents.get(TypeStr));
5708 }
5709 
5710 void CGObjCMac::FinishModule() {
5711   EmitModuleInfo();
5712 
5713   // Emit the dummy bodies for any protocols which were referenced but
5714   // never defined.
5715   for (auto &entry : Protocols) {
5716     llvm::GlobalVariable *global = entry.second;
5717     if (global->hasInitializer())
5718       continue;
5719 
5720     ConstantInitBuilder builder(CGM);
5721     auto values = builder.beginStruct(ObjCTypes.ProtocolTy);
5722     values.addNullPointer(ObjCTypes.ProtocolExtensionPtrTy);
5723     values.add(GetClassName(entry.first->getName()));
5724     values.addNullPointer(ObjCTypes.ProtocolListPtrTy);
5725     values.addNullPointer(ObjCTypes.MethodDescriptionListPtrTy);
5726     values.addNullPointer(ObjCTypes.MethodDescriptionListPtrTy);
5727     values.finishAndSetAsInitializer(global);
5728     CGM.addCompilerUsedGlobal(global);
5729   }
5730 
5731   // Add assembler directives to add lazy undefined symbol references
5732   // for classes which are referenced but not defined. This is
5733   // important for correct linker interaction.
5734   //
5735   // FIXME: It would be nice if we had an LLVM construct for this.
5736   if ((!LazySymbols.empty() || !DefinedSymbols.empty()) &&
5737       CGM.getTriple().isOSBinFormatMachO()) {
5738     SmallString<256> Asm;
5739     Asm += CGM.getModule().getModuleInlineAsm();
5740     if (!Asm.empty() && Asm.back() != '\n')
5741       Asm += '\n';
5742 
5743     llvm::raw_svector_ostream OS(Asm);
5744     for (const auto *Sym : DefinedSymbols)
5745       OS << "\t.objc_class_name_" << Sym->getName() << "=0\n"
5746          << "\t.globl .objc_class_name_" << Sym->getName() << "\n";
5747     for (const auto *Sym : LazySymbols)
5748       OS << "\t.lazy_reference .objc_class_name_" << Sym->getName() << "\n";
5749     for (const auto &Category : DefinedCategoryNames)
5750       OS << "\t.objc_category_name_" << Category << "=0\n"
5751          << "\t.globl .objc_category_name_" << Category << "\n";
5752 
5753     CGM.getModule().setModuleInlineAsm(OS.str());
5754   }
5755 }
5756 
5757 CGObjCNonFragileABIMac::CGObjCNonFragileABIMac(CodeGen::CodeGenModule &cgm)
5758     : CGObjCCommonMac(cgm), ObjCTypes(cgm), ObjCEmptyCacheVar(nullptr),
5759       ObjCEmptyVtableVar(nullptr) {
5760   ObjCABI = 2;
5761 }
5762 
5763 /* *** */
5764 
5765 ObjCCommonTypesHelper::ObjCCommonTypesHelper(CodeGen::CodeGenModule &cgm)
5766   : VMContext(cgm.getLLVMContext()), CGM(cgm), ExternalProtocolPtrTy(nullptr)
5767 {
5768   CodeGen::CodeGenTypes &Types = CGM.getTypes();
5769   ASTContext &Ctx = CGM.getContext();
5770 
5771   ShortTy = cast<llvm::IntegerType>(Types.ConvertType(Ctx.ShortTy));
5772   IntTy = CGM.IntTy;
5773   LongTy = cast<llvm::IntegerType>(Types.ConvertType(Ctx.LongTy));
5774   Int8PtrTy = CGM.Int8PtrTy;
5775   Int8PtrPtrTy = CGM.Int8PtrPtrTy;
5776 
5777   // arm64 targets use "int" ivar offset variables. All others,
5778   // including OS X x86_64 and Windows x86_64, use "long" ivar offsets.
5779   if (CGM.getTarget().getTriple().getArch() == llvm::Triple::aarch64)
5780     IvarOffsetVarTy = IntTy;
5781   else
5782     IvarOffsetVarTy = LongTy;
5783 
5784   ObjectPtrTy =
5785     cast<llvm::PointerType>(Types.ConvertType(Ctx.getObjCIdType()));
5786   PtrObjectPtrTy =
5787     llvm::PointerType::getUnqual(ObjectPtrTy);
5788   SelectorPtrTy =
5789     cast<llvm::PointerType>(Types.ConvertType(Ctx.getObjCSelType()));
5790 
5791   // I'm not sure I like this. The implicit coordination is a bit
5792   // gross. We should solve this in a reasonable fashion because this
5793   // is a pretty common task (match some runtime data structure with
5794   // an LLVM data structure).
5795 
5796   // FIXME: This is leaked.
5797   // FIXME: Merge with rewriter code?
5798 
5799   // struct _objc_super {
5800   //   id self;
5801   //   Class cls;
5802   // }
5803   RecordDecl *RD = RecordDecl::Create(Ctx, TTK_Struct,
5804                                       Ctx.getTranslationUnitDecl(),
5805                                       SourceLocation(), SourceLocation(),
5806                                       &Ctx.Idents.get("_objc_super"));
5807   RD->addDecl(FieldDecl::Create(Ctx, RD, SourceLocation(), SourceLocation(),
5808                                 nullptr, Ctx.getObjCIdType(), nullptr, nullptr,
5809                                 false, ICIS_NoInit));
5810   RD->addDecl(FieldDecl::Create(Ctx, RD, SourceLocation(), SourceLocation(),
5811                                 nullptr, Ctx.getObjCClassType(), nullptr,
5812                                 nullptr, false, ICIS_NoInit));
5813   RD->completeDefinition();
5814 
5815   SuperCTy = Ctx.getTagDeclType(RD);
5816   SuperPtrCTy = Ctx.getPointerType(SuperCTy);
5817 
5818   SuperTy = cast<llvm::StructType>(Types.ConvertType(SuperCTy));
5819   SuperPtrTy = llvm::PointerType::getUnqual(SuperTy);
5820 
5821   // struct _prop_t {
5822   //   char *name;
5823   //   char *attributes;
5824   // }
5825   PropertyTy = llvm::StructType::create("struct._prop_t", Int8PtrTy, Int8PtrTy);
5826 
5827   // struct _prop_list_t {
5828   //   uint32_t entsize;      // sizeof(struct _prop_t)
5829   //   uint32_t count_of_properties;
5830   //   struct _prop_t prop_list[count_of_properties];
5831   // }
5832   PropertyListTy = llvm::StructType::create(
5833       "struct._prop_list_t", IntTy, IntTy, llvm::ArrayType::get(PropertyTy, 0));
5834   // struct _prop_list_t *
5835   PropertyListPtrTy = llvm::PointerType::getUnqual(PropertyListTy);
5836 
5837   // struct _objc_method {
5838   //   SEL _cmd;
5839   //   char *method_type;
5840   //   char *_imp;
5841   // }
5842   MethodTy = llvm::StructType::create("struct._objc_method", SelectorPtrTy,
5843                                       Int8PtrTy, Int8PtrTy);
5844 
5845   // struct _objc_cache *
5846   CacheTy = llvm::StructType::create(VMContext, "struct._objc_cache");
5847   CachePtrTy = llvm::PointerType::getUnqual(CacheTy);
5848 }
5849 
5850 ObjCTypesHelper::ObjCTypesHelper(CodeGen::CodeGenModule &cgm)
5851   : ObjCCommonTypesHelper(cgm) {
5852   // struct _objc_method_description {
5853   //   SEL name;
5854   //   char *types;
5855   // }
5856   MethodDescriptionTy = llvm::StructType::create(
5857       "struct._objc_method_description", SelectorPtrTy, Int8PtrTy);
5858 
5859   // struct _objc_method_description_list {
5860   //   int count;
5861   //   struct _objc_method_description[1];
5862   // }
5863   MethodDescriptionListTy =
5864       llvm::StructType::create("struct._objc_method_description_list", IntTy,
5865                                llvm::ArrayType::get(MethodDescriptionTy, 0));
5866 
5867   // struct _objc_method_description_list *
5868   MethodDescriptionListPtrTy =
5869     llvm::PointerType::getUnqual(MethodDescriptionListTy);
5870 
5871   // Protocol description structures
5872 
5873   // struct _objc_protocol_extension {
5874   //   uint32_t size;  // sizeof(struct _objc_protocol_extension)
5875   //   struct _objc_method_description_list *optional_instance_methods;
5876   //   struct _objc_method_description_list *optional_class_methods;
5877   //   struct _objc_property_list *instance_properties;
5878   //   const char ** extendedMethodTypes;
5879   //   struct _objc_property_list *class_properties;
5880   // }
5881   ProtocolExtensionTy = llvm::StructType::create(
5882       "struct._objc_protocol_extension", IntTy, MethodDescriptionListPtrTy,
5883       MethodDescriptionListPtrTy, PropertyListPtrTy, Int8PtrPtrTy,
5884       PropertyListPtrTy);
5885 
5886   // struct _objc_protocol_extension *
5887   ProtocolExtensionPtrTy = llvm::PointerType::getUnqual(ProtocolExtensionTy);
5888 
5889   // Handle recursive construction of Protocol and ProtocolList types
5890 
5891   ProtocolTy =
5892     llvm::StructType::create(VMContext, "struct._objc_protocol");
5893 
5894   ProtocolListTy =
5895     llvm::StructType::create(VMContext, "struct._objc_protocol_list");
5896   ProtocolListTy->setBody(llvm::PointerType::getUnqual(ProtocolListTy), LongTy,
5897                           llvm::ArrayType::get(ProtocolTy, 0));
5898 
5899   // struct _objc_protocol {
5900   //   struct _objc_protocol_extension *isa;
5901   //   char *protocol_name;
5902   //   struct _objc_protocol **_objc_protocol_list;
5903   //   struct _objc_method_description_list *instance_methods;
5904   //   struct _objc_method_description_list *class_methods;
5905   // }
5906   ProtocolTy->setBody(ProtocolExtensionPtrTy, Int8PtrTy,
5907                       llvm::PointerType::getUnqual(ProtocolListTy),
5908                       MethodDescriptionListPtrTy, MethodDescriptionListPtrTy);
5909 
5910   // struct _objc_protocol_list *
5911   ProtocolListPtrTy = llvm::PointerType::getUnqual(ProtocolListTy);
5912 
5913   ProtocolPtrTy = llvm::PointerType::getUnqual(ProtocolTy);
5914 
5915   // Class description structures
5916 
5917   // struct _objc_ivar {
5918   //   char *ivar_name;
5919   //   char *ivar_type;
5920   //   int  ivar_offset;
5921   // }
5922   IvarTy = llvm::StructType::create("struct._objc_ivar", Int8PtrTy, Int8PtrTy,
5923                                     IntTy);
5924 
5925   // struct _objc_ivar_list *
5926   IvarListTy =
5927     llvm::StructType::create(VMContext, "struct._objc_ivar_list");
5928   IvarListPtrTy = llvm::PointerType::getUnqual(IvarListTy);
5929 
5930   // struct _objc_method_list *
5931   MethodListTy =
5932     llvm::StructType::create(VMContext, "struct._objc_method_list");
5933   MethodListPtrTy = llvm::PointerType::getUnqual(MethodListTy);
5934 
5935   // struct _objc_class_extension *
5936   ClassExtensionTy = llvm::StructType::create(
5937       "struct._objc_class_extension", IntTy, Int8PtrTy, PropertyListPtrTy);
5938   ClassExtensionPtrTy = llvm::PointerType::getUnqual(ClassExtensionTy);
5939 
5940   ClassTy = llvm::StructType::create(VMContext, "struct._objc_class");
5941 
5942   // struct _objc_class {
5943   //   Class isa;
5944   //   Class super_class;
5945   //   char *name;
5946   //   long version;
5947   //   long info;
5948   //   long instance_size;
5949   //   struct _objc_ivar_list *ivars;
5950   //   struct _objc_method_list *methods;
5951   //   struct _objc_cache *cache;
5952   //   struct _objc_protocol_list *protocols;
5953   //   char *ivar_layout;
5954   //   struct _objc_class_ext *ext;
5955   // };
5956   ClassTy->setBody(llvm::PointerType::getUnqual(ClassTy),
5957                    llvm::PointerType::getUnqual(ClassTy), Int8PtrTy, LongTy,
5958                    LongTy, LongTy, IvarListPtrTy, MethodListPtrTy, CachePtrTy,
5959                    ProtocolListPtrTy, Int8PtrTy, ClassExtensionPtrTy);
5960 
5961   ClassPtrTy = llvm::PointerType::getUnqual(ClassTy);
5962 
5963   // struct _objc_category {
5964   //   char *category_name;
5965   //   char *class_name;
5966   //   struct _objc_method_list *instance_method;
5967   //   struct _objc_method_list *class_method;
5968   //   struct _objc_protocol_list *protocols;
5969   //   uint32_t size;  // sizeof(struct _objc_category)
5970   //   struct _objc_property_list *instance_properties;// category's @property
5971   //   struct _objc_property_list *class_properties;
5972   // }
5973   CategoryTy = llvm::StructType::create(
5974       "struct._objc_category", Int8PtrTy, Int8PtrTy, MethodListPtrTy,
5975       MethodListPtrTy, ProtocolListPtrTy, IntTy, PropertyListPtrTy,
5976       PropertyListPtrTy);
5977 
5978   // Global metadata structures
5979 
5980   // struct _objc_symtab {
5981   //   long sel_ref_cnt;
5982   //   SEL *refs;
5983   //   short cls_def_cnt;
5984   //   short cat_def_cnt;
5985   //   char *defs[cls_def_cnt + cat_def_cnt];
5986   // }
5987   SymtabTy = llvm::StructType::create("struct._objc_symtab", LongTy,
5988                                       SelectorPtrTy, ShortTy, ShortTy,
5989                                       llvm::ArrayType::get(Int8PtrTy, 0));
5990   SymtabPtrTy = llvm::PointerType::getUnqual(SymtabTy);
5991 
5992   // struct _objc_module {
5993   //   long version;
5994   //   long size;   // sizeof(struct _objc_module)
5995   //   char *name;
5996   //   struct _objc_symtab* symtab;
5997   //  }
5998   ModuleTy = llvm::StructType::create("struct._objc_module", LongTy, LongTy,
5999                                       Int8PtrTy, SymtabPtrTy);
6000 
6001   // FIXME: This is the size of the setjmp buffer and should be target
6002   // specific. 18 is what's used on 32-bit X86.
6003   uint64_t SetJmpBufferSize = 18;
6004 
6005   // Exceptions
6006   llvm::Type *StackPtrTy = llvm::ArrayType::get(CGM.Int8PtrTy, 4);
6007 
6008   ExceptionDataTy = llvm::StructType::create(
6009       "struct._objc_exception_data",
6010       llvm::ArrayType::get(CGM.Int32Ty, SetJmpBufferSize), StackPtrTy);
6011 }
6012 
6013 ObjCNonFragileABITypesHelper::ObjCNonFragileABITypesHelper(CodeGen::CodeGenModule &cgm)
6014   : ObjCCommonTypesHelper(cgm) {
6015   // struct _method_list_t {
6016   //   uint32_t entsize;  // sizeof(struct _objc_method)
6017   //   uint32_t method_count;
6018   //   struct _objc_method method_list[method_count];
6019   // }
6020   MethodListnfABITy =
6021       llvm::StructType::create("struct.__method_list_t", IntTy, IntTy,
6022                                llvm::ArrayType::get(MethodTy, 0));
6023   // struct method_list_t *
6024   MethodListnfABIPtrTy = llvm::PointerType::getUnqual(MethodListnfABITy);
6025 
6026   // struct _protocol_t {
6027   //   id isa;  // NULL
6028   //   const char * const protocol_name;
6029   //   const struct _protocol_list_t * protocol_list; // super protocols
6030   //   const struct method_list_t * const instance_methods;
6031   //   const struct method_list_t * const class_methods;
6032   //   const struct method_list_t *optionalInstanceMethods;
6033   //   const struct method_list_t *optionalClassMethods;
6034   //   const struct _prop_list_t * properties;
6035   //   const uint32_t size;  // sizeof(struct _protocol_t)
6036   //   const uint32_t flags;  // = 0
6037   //   const char ** extendedMethodTypes;
6038   //   const char *demangledName;
6039   //   const struct _prop_list_t * class_properties;
6040   // }
6041 
6042   // Holder for struct _protocol_list_t *
6043   ProtocolListnfABITy =
6044     llvm::StructType::create(VMContext, "struct._objc_protocol_list");
6045 
6046   ProtocolnfABITy = llvm::StructType::create(
6047       "struct._protocol_t", ObjectPtrTy, Int8PtrTy,
6048       llvm::PointerType::getUnqual(ProtocolListnfABITy), MethodListnfABIPtrTy,
6049       MethodListnfABIPtrTy, MethodListnfABIPtrTy, MethodListnfABIPtrTy,
6050       PropertyListPtrTy, IntTy, IntTy, Int8PtrPtrTy, Int8PtrTy,
6051       PropertyListPtrTy);
6052 
6053   // struct _protocol_t*
6054   ProtocolnfABIPtrTy = llvm::PointerType::getUnqual(ProtocolnfABITy);
6055 
6056   // struct _protocol_list_t {
6057   //   long protocol_count;   // Note, this is 32/64 bit
6058   //   struct _protocol_t *[protocol_count];
6059   // }
6060   ProtocolListnfABITy->setBody(LongTy,
6061                                llvm::ArrayType::get(ProtocolnfABIPtrTy, 0));
6062 
6063   // struct _objc_protocol_list*
6064   ProtocolListnfABIPtrTy = llvm::PointerType::getUnqual(ProtocolListnfABITy);
6065 
6066   // struct _ivar_t {
6067   //   unsigned [long] int *offset;  // pointer to ivar offset location
6068   //   char *name;
6069   //   char *type;
6070   //   uint32_t alignment;
6071   //   uint32_t size;
6072   // }
6073   IvarnfABITy = llvm::StructType::create(
6074       "struct._ivar_t", llvm::PointerType::getUnqual(IvarOffsetVarTy),
6075       Int8PtrTy, Int8PtrTy, IntTy, IntTy);
6076 
6077   // struct _ivar_list_t {
6078   //   uint32 entsize;  // sizeof(struct _ivar_t)
6079   //   uint32 count;
6080   //   struct _iver_t list[count];
6081   // }
6082   IvarListnfABITy =
6083       llvm::StructType::create("struct._ivar_list_t", IntTy, IntTy,
6084                                llvm::ArrayType::get(IvarnfABITy, 0));
6085 
6086   IvarListnfABIPtrTy = llvm::PointerType::getUnqual(IvarListnfABITy);
6087 
6088   // struct _class_ro_t {
6089   //   uint32_t const flags;
6090   //   uint32_t const instanceStart;
6091   //   uint32_t const instanceSize;
6092   //   uint32_t const reserved;  // only when building for 64bit targets
6093   //   const uint8_t * const ivarLayout;
6094   //   const char *const name;
6095   //   const struct _method_list_t * const baseMethods;
6096   //   const struct _objc_protocol_list *const baseProtocols;
6097   //   const struct _ivar_list_t *const ivars;
6098   //   const uint8_t * const weakIvarLayout;
6099   //   const struct _prop_list_t * const properties;
6100   // }
6101 
6102   // FIXME. Add 'reserved' field in 64bit abi mode!
6103   ClassRonfABITy = llvm::StructType::create(
6104       "struct._class_ro_t", IntTy, IntTy, IntTy, Int8PtrTy, Int8PtrTy,
6105       MethodListnfABIPtrTy, ProtocolListnfABIPtrTy, IvarListnfABIPtrTy,
6106       Int8PtrTy, PropertyListPtrTy);
6107 
6108   // ImpnfABITy - LLVM for id (*)(id, SEL, ...)
6109   llvm::Type *params[] = { ObjectPtrTy, SelectorPtrTy };
6110   ImpnfABITy = llvm::FunctionType::get(ObjectPtrTy, params, false)
6111                  ->getPointerTo();
6112 
6113   // struct _class_t {
6114   //   struct _class_t *isa;
6115   //   struct _class_t * const superclass;
6116   //   void *cache;
6117   //   IMP *vtable;
6118   //   struct class_ro_t *ro;
6119   // }
6120 
6121   ClassnfABITy = llvm::StructType::create(VMContext, "struct._class_t");
6122   ClassnfABITy->setBody(llvm::PointerType::getUnqual(ClassnfABITy),
6123                         llvm::PointerType::getUnqual(ClassnfABITy), CachePtrTy,
6124                         llvm::PointerType::getUnqual(ImpnfABITy),
6125                         llvm::PointerType::getUnqual(ClassRonfABITy));
6126 
6127   // LLVM for struct _class_t *
6128   ClassnfABIPtrTy = llvm::PointerType::getUnqual(ClassnfABITy);
6129 
6130   // struct _category_t {
6131   //   const char * const name;
6132   //   struct _class_t *const cls;
6133   //   const struct _method_list_t * const instance_methods;
6134   //   const struct _method_list_t * const class_methods;
6135   //   const struct _protocol_list_t * const protocols;
6136   //   const struct _prop_list_t * const properties;
6137   //   const struct _prop_list_t * const class_properties;
6138   //   const uint32_t size;
6139   // }
6140   CategorynfABITy = llvm::StructType::create(
6141       "struct._category_t", Int8PtrTy, ClassnfABIPtrTy, MethodListnfABIPtrTy,
6142       MethodListnfABIPtrTy, ProtocolListnfABIPtrTy, PropertyListPtrTy,
6143       PropertyListPtrTy, IntTy);
6144 
6145   // New types for nonfragile abi messaging.
6146   CodeGen::CodeGenTypes &Types = CGM.getTypes();
6147   ASTContext &Ctx = CGM.getContext();
6148 
6149   // MessageRefTy - LLVM for:
6150   // struct _message_ref_t {
6151   //   IMP messenger;
6152   //   SEL name;
6153   // };
6154 
6155   // First the clang type for struct _message_ref_t
6156   RecordDecl *RD = RecordDecl::Create(Ctx, TTK_Struct,
6157                                       Ctx.getTranslationUnitDecl(),
6158                                       SourceLocation(), SourceLocation(),
6159                                       &Ctx.Idents.get("_message_ref_t"));
6160   RD->addDecl(FieldDecl::Create(Ctx, RD, SourceLocation(), SourceLocation(),
6161                                 nullptr, Ctx.VoidPtrTy, nullptr, nullptr, false,
6162                                 ICIS_NoInit));
6163   RD->addDecl(FieldDecl::Create(Ctx, RD, SourceLocation(), SourceLocation(),
6164                                 nullptr, Ctx.getObjCSelType(), nullptr, nullptr,
6165                                 false, ICIS_NoInit));
6166   RD->completeDefinition();
6167 
6168   MessageRefCTy = Ctx.getTagDeclType(RD);
6169   MessageRefCPtrTy = Ctx.getPointerType(MessageRefCTy);
6170   MessageRefTy = cast<llvm::StructType>(Types.ConvertType(MessageRefCTy));
6171 
6172   // MessageRefPtrTy - LLVM for struct _message_ref_t*
6173   MessageRefPtrTy = llvm::PointerType::getUnqual(MessageRefTy);
6174 
6175   // SuperMessageRefTy - LLVM for:
6176   // struct _super_message_ref_t {
6177   //   SUPER_IMP messenger;
6178   //   SEL name;
6179   // };
6180   SuperMessageRefTy = llvm::StructType::create("struct._super_message_ref_t",
6181                                                ImpnfABITy, SelectorPtrTy);
6182 
6183   // SuperMessageRefPtrTy - LLVM for struct _super_message_ref_t*
6184   SuperMessageRefPtrTy = llvm::PointerType::getUnqual(SuperMessageRefTy);
6185 
6186 
6187   // struct objc_typeinfo {
6188   //   const void** vtable; // objc_ehtype_vtable + 2
6189   //   const char*  name;    // c++ typeinfo string
6190   //   Class        cls;
6191   // };
6192   EHTypeTy = llvm::StructType::create("struct._objc_typeinfo",
6193                                       llvm::PointerType::getUnqual(Int8PtrTy),
6194                                       Int8PtrTy, ClassnfABIPtrTy);
6195   EHTypePtrTy = llvm::PointerType::getUnqual(EHTypeTy);
6196 }
6197 
6198 llvm::Function *CGObjCNonFragileABIMac::ModuleInitFunction() {
6199   FinishNonFragileABIModule();
6200 
6201   return nullptr;
6202 }
6203 
6204 void CGObjCNonFragileABIMac::AddModuleClassList(
6205     ArrayRef<llvm::GlobalValue *> Container, StringRef SymbolName,
6206     StringRef SectionName) {
6207   unsigned NumClasses = Container.size();
6208 
6209   if (!NumClasses)
6210     return;
6211 
6212   SmallVector<llvm::Constant*, 8> Symbols(NumClasses);
6213   for (unsigned i=0; i<NumClasses; i++)
6214     Symbols[i] = llvm::ConstantExpr::getBitCast(Container[i],
6215                                                 ObjCTypes.Int8PtrTy);
6216   llvm::Constant *Init =
6217     llvm::ConstantArray::get(llvm::ArrayType::get(ObjCTypes.Int8PtrTy,
6218                                                   Symbols.size()),
6219                              Symbols);
6220 
6221   // Section name is obtained by calling GetSectionName, which returns
6222   // sections in the __DATA segment on MachO.
6223   assert((!CGM.getTriple().isOSBinFormatMachO() ||
6224           SectionName.startswith("__DATA")) &&
6225          "SectionName expected to start with __DATA on MachO");
6226   llvm::GlobalVariable *GV = new llvm::GlobalVariable(
6227       CGM.getModule(), Init->getType(), false,
6228       llvm::GlobalValue::PrivateLinkage, Init, SymbolName);
6229   GV->setAlignment(
6230       llvm::Align(CGM.getDataLayout().getABITypeAlignment(Init->getType())));
6231   GV->setSection(SectionName);
6232   CGM.addCompilerUsedGlobal(GV);
6233 }
6234 
6235 void CGObjCNonFragileABIMac::FinishNonFragileABIModule() {
6236   // nonfragile abi has no module definition.
6237 
6238   // Build list of all implemented class addresses in array
6239   // L_OBJC_LABEL_CLASS_$.
6240 
6241   for (unsigned i=0, NumClasses=ImplementedClasses.size(); i<NumClasses; i++) {
6242     const ObjCInterfaceDecl *ID = ImplementedClasses[i];
6243     assert(ID);
6244     if (ObjCImplementationDecl *IMP = ID->getImplementation())
6245       // We are implementing a weak imported interface. Give it external linkage
6246       if (ID->isWeakImported() && !IMP->isWeakImported()) {
6247         DefinedClasses[i]->setLinkage(llvm::GlobalVariable::ExternalLinkage);
6248         DefinedMetaClasses[i]->setLinkage(llvm::GlobalVariable::ExternalLinkage);
6249       }
6250   }
6251 
6252   AddModuleClassList(DefinedClasses, "OBJC_LABEL_CLASS_$",
6253                      GetSectionName("__objc_classlist",
6254                                     "regular,no_dead_strip"));
6255 
6256   AddModuleClassList(DefinedNonLazyClasses, "OBJC_LABEL_NONLAZY_CLASS_$",
6257                      GetSectionName("__objc_nlclslist",
6258                                     "regular,no_dead_strip"));
6259 
6260   // Build list of all implemented category addresses in array
6261   // L_OBJC_LABEL_CATEGORY_$.
6262   AddModuleClassList(DefinedCategories, "OBJC_LABEL_CATEGORY_$",
6263                      GetSectionName("__objc_catlist",
6264                                     "regular,no_dead_strip"));
6265   AddModuleClassList(DefinedStubCategories, "OBJC_LABEL_STUB_CATEGORY_$",
6266                      GetSectionName("__objc_catlist2",
6267                                     "regular,no_dead_strip"));
6268   AddModuleClassList(DefinedNonLazyCategories, "OBJC_LABEL_NONLAZY_CATEGORY_$",
6269                      GetSectionName("__objc_nlcatlist",
6270                                     "regular,no_dead_strip"));
6271 
6272   EmitImageInfo();
6273 }
6274 
6275 /// isVTableDispatchedSelector - Returns true if SEL is not in the list of
6276 /// VTableDispatchMethods; false otherwise. What this means is that
6277 /// except for the 19 selectors in the list, we generate 32bit-style
6278 /// message dispatch call for all the rest.
6279 bool CGObjCNonFragileABIMac::isVTableDispatchedSelector(Selector Sel) {
6280   // At various points we've experimented with using vtable-based
6281   // dispatch for all methods.
6282   switch (CGM.getCodeGenOpts().getObjCDispatchMethod()) {
6283   case CodeGenOptions::Legacy:
6284     return false;
6285   case CodeGenOptions::NonLegacy:
6286     return true;
6287   case CodeGenOptions::Mixed:
6288     break;
6289   }
6290 
6291   // If so, see whether this selector is in the white-list of things which must
6292   // use the new dispatch convention. We lazily build a dense set for this.
6293   if (VTableDispatchMethods.empty()) {
6294     VTableDispatchMethods.insert(GetNullarySelector("alloc"));
6295     VTableDispatchMethods.insert(GetNullarySelector("class"));
6296     VTableDispatchMethods.insert(GetNullarySelector("self"));
6297     VTableDispatchMethods.insert(GetNullarySelector("isFlipped"));
6298     VTableDispatchMethods.insert(GetNullarySelector("length"));
6299     VTableDispatchMethods.insert(GetNullarySelector("count"));
6300 
6301     // These are vtable-based if GC is disabled.
6302     // Optimistically use vtable dispatch for hybrid compiles.
6303     if (CGM.getLangOpts().getGC() != LangOptions::GCOnly) {
6304       VTableDispatchMethods.insert(GetNullarySelector("retain"));
6305       VTableDispatchMethods.insert(GetNullarySelector("release"));
6306       VTableDispatchMethods.insert(GetNullarySelector("autorelease"));
6307     }
6308 
6309     VTableDispatchMethods.insert(GetUnarySelector("allocWithZone"));
6310     VTableDispatchMethods.insert(GetUnarySelector("isKindOfClass"));
6311     VTableDispatchMethods.insert(GetUnarySelector("respondsToSelector"));
6312     VTableDispatchMethods.insert(GetUnarySelector("objectForKey"));
6313     VTableDispatchMethods.insert(GetUnarySelector("objectAtIndex"));
6314     VTableDispatchMethods.insert(GetUnarySelector("isEqualToString"));
6315     VTableDispatchMethods.insert(GetUnarySelector("isEqual"));
6316 
6317     // These are vtable-based if GC is enabled.
6318     // Optimistically use vtable dispatch for hybrid compiles.
6319     if (CGM.getLangOpts().getGC() != LangOptions::NonGC) {
6320       VTableDispatchMethods.insert(GetNullarySelector("hash"));
6321       VTableDispatchMethods.insert(GetUnarySelector("addObject"));
6322 
6323       // "countByEnumeratingWithState:objects:count"
6324       IdentifierInfo *KeyIdents[] = {
6325         &CGM.getContext().Idents.get("countByEnumeratingWithState"),
6326         &CGM.getContext().Idents.get("objects"),
6327         &CGM.getContext().Idents.get("count")
6328       };
6329       VTableDispatchMethods.insert(
6330         CGM.getContext().Selectors.getSelector(3, KeyIdents));
6331     }
6332   }
6333 
6334   return VTableDispatchMethods.count(Sel);
6335 }
6336 
6337 /// BuildClassRoTInitializer - generate meta-data for:
6338 /// struct _class_ro_t {
6339 ///   uint32_t const flags;
6340 ///   uint32_t const instanceStart;
6341 ///   uint32_t const instanceSize;
6342 ///   uint32_t const reserved;  // only when building for 64bit targets
6343 ///   const uint8_t * const ivarLayout;
6344 ///   const char *const name;
6345 ///   const struct _method_list_t * const baseMethods;
6346 ///   const struct _protocol_list_t *const baseProtocols;
6347 ///   const struct _ivar_list_t *const ivars;
6348 ///   const uint8_t * const weakIvarLayout;
6349 ///   const struct _prop_list_t * const properties;
6350 /// }
6351 ///
6352 llvm::GlobalVariable * CGObjCNonFragileABIMac::BuildClassRoTInitializer(
6353   unsigned flags,
6354   unsigned InstanceStart,
6355   unsigned InstanceSize,
6356   const ObjCImplementationDecl *ID) {
6357   std::string ClassName = std::string(ID->getObjCRuntimeNameAsString());
6358 
6359   CharUnits beginInstance = CharUnits::fromQuantity(InstanceStart);
6360   CharUnits endInstance = CharUnits::fromQuantity(InstanceSize);
6361 
6362   bool hasMRCWeak = false;
6363   if (CGM.getLangOpts().ObjCAutoRefCount)
6364     flags |= NonFragileABI_Class_CompiledByARC;
6365   else if ((hasMRCWeak = hasMRCWeakIvars(CGM, ID)))
6366     flags |= NonFragileABI_Class_HasMRCWeakIvars;
6367 
6368   ConstantInitBuilder builder(CGM);
6369   auto values = builder.beginStruct(ObjCTypes.ClassRonfABITy);
6370 
6371   values.addInt(ObjCTypes.IntTy, flags);
6372   values.addInt(ObjCTypes.IntTy, InstanceStart);
6373   values.addInt(ObjCTypes.IntTy, InstanceSize);
6374   values.add((flags & NonFragileABI_Class_Meta)
6375                 ? GetIvarLayoutName(nullptr, ObjCTypes)
6376                 : BuildStrongIvarLayout(ID, beginInstance, endInstance));
6377   values.add(GetClassName(ID->getObjCRuntimeNameAsString()));
6378 
6379   // const struct _method_list_t * const baseMethods;
6380   SmallVector<const ObjCMethodDecl*, 16> methods;
6381   if (flags & NonFragileABI_Class_Meta) {
6382     for (const auto *MD : ID->class_methods())
6383       if (!MD->isDirectMethod())
6384         methods.push_back(MD);
6385   } else {
6386     for (const auto *MD : ID->instance_methods())
6387       if (!MD->isDirectMethod())
6388         methods.push_back(MD);
6389   }
6390 
6391   values.add(emitMethodList(ID->getObjCRuntimeNameAsString(),
6392                             (flags & NonFragileABI_Class_Meta)
6393                                ? MethodListType::ClassMethods
6394                                : MethodListType::InstanceMethods,
6395                             methods));
6396 
6397   const ObjCInterfaceDecl *OID = ID->getClassInterface();
6398   assert(OID && "CGObjCNonFragileABIMac::BuildClassRoTInitializer");
6399   values.add(EmitProtocolList("_OBJC_CLASS_PROTOCOLS_$_"
6400                                 + OID->getObjCRuntimeNameAsString(),
6401                               OID->all_referenced_protocol_begin(),
6402                               OID->all_referenced_protocol_end()));
6403 
6404   if (flags & NonFragileABI_Class_Meta) {
6405     values.addNullPointer(ObjCTypes.IvarListnfABIPtrTy);
6406     values.add(GetIvarLayoutName(nullptr, ObjCTypes));
6407     values.add(EmitPropertyList(
6408         "_OBJC_$_CLASS_PROP_LIST_" + ID->getObjCRuntimeNameAsString(),
6409         ID, ID->getClassInterface(), ObjCTypes, true));
6410   } else {
6411     values.add(EmitIvarList(ID));
6412     values.add(BuildWeakIvarLayout(ID, beginInstance, endInstance, hasMRCWeak));
6413     values.add(EmitPropertyList(
6414         "_OBJC_$_PROP_LIST_" + ID->getObjCRuntimeNameAsString(),
6415         ID, ID->getClassInterface(), ObjCTypes, false));
6416   }
6417 
6418   llvm::SmallString<64> roLabel;
6419   llvm::raw_svector_ostream(roLabel)
6420       << ((flags & NonFragileABI_Class_Meta) ? "_OBJC_METACLASS_RO_$_"
6421                                              : "_OBJC_CLASS_RO_$_")
6422       << ClassName;
6423 
6424   return finishAndCreateGlobal(values, roLabel, CGM);
6425 }
6426 
6427 /// Build the metaclass object for a class.
6428 ///
6429 /// struct _class_t {
6430 ///   struct _class_t *isa;
6431 ///   struct _class_t * const superclass;
6432 ///   void *cache;
6433 ///   IMP *vtable;
6434 ///   struct class_ro_t *ro;
6435 /// }
6436 ///
6437 llvm::GlobalVariable *
6438 CGObjCNonFragileABIMac::BuildClassObject(const ObjCInterfaceDecl *CI,
6439                                          bool isMetaclass,
6440                                          llvm::Constant *IsAGV,
6441                                          llvm::Constant *SuperClassGV,
6442                                          llvm::Constant *ClassRoGV,
6443                                          bool HiddenVisibility) {
6444   ConstantInitBuilder builder(CGM);
6445   auto values = builder.beginStruct(ObjCTypes.ClassnfABITy);
6446   values.add(IsAGV);
6447   if (SuperClassGV) {
6448     values.add(SuperClassGV);
6449   } else {
6450     values.addNullPointer(ObjCTypes.ClassnfABIPtrTy);
6451   }
6452   values.add(ObjCEmptyCacheVar);
6453   values.add(ObjCEmptyVtableVar);
6454   values.add(ClassRoGV);
6455 
6456   llvm::GlobalVariable *GV =
6457     cast<llvm::GlobalVariable>(GetClassGlobal(CI, isMetaclass, ForDefinition));
6458   values.finishAndSetAsInitializer(GV);
6459 
6460   if (CGM.getTriple().isOSBinFormatMachO())
6461     GV->setSection("__DATA, __objc_data");
6462   GV->setAlignment(llvm::Align(
6463       CGM.getDataLayout().getABITypeAlignment(ObjCTypes.ClassnfABITy)));
6464   if (!CGM.getTriple().isOSBinFormatCOFF())
6465     if (HiddenVisibility)
6466       GV->setVisibility(llvm::GlobalValue::HiddenVisibility);
6467   return GV;
6468 }
6469 
6470 bool CGObjCNonFragileABIMac::ImplementationIsNonLazy(
6471     const ObjCImplDecl *OD) const {
6472   return OD->getClassMethod(GetNullarySelector("load")) != nullptr ||
6473          OD->getClassInterface()->hasAttr<ObjCNonLazyClassAttr>() ||
6474          OD->hasAttr<ObjCNonLazyClassAttr>();
6475 }
6476 
6477 void CGObjCNonFragileABIMac::GetClassSizeInfo(const ObjCImplementationDecl *OID,
6478                                               uint32_t &InstanceStart,
6479                                               uint32_t &InstanceSize) {
6480   const ASTRecordLayout &RL =
6481     CGM.getContext().getASTObjCImplementationLayout(OID);
6482 
6483   // InstanceSize is really instance end.
6484   InstanceSize = RL.getDataSize().getQuantity();
6485 
6486   // If there are no fields, the start is the same as the end.
6487   if (!RL.getFieldCount())
6488     InstanceStart = InstanceSize;
6489   else
6490     InstanceStart = RL.getFieldOffset(0) / CGM.getContext().getCharWidth();
6491 }
6492 
6493 static llvm::GlobalValue::DLLStorageClassTypes getStorage(CodeGenModule &CGM,
6494                                                           StringRef Name) {
6495   IdentifierInfo &II = CGM.getContext().Idents.get(Name);
6496   TranslationUnitDecl *TUDecl = CGM.getContext().getTranslationUnitDecl();
6497   DeclContext *DC = TranslationUnitDecl::castToDeclContext(TUDecl);
6498 
6499   const VarDecl *VD = nullptr;
6500   for (const auto &Result : DC->lookup(&II))
6501     if ((VD = dyn_cast<VarDecl>(Result)))
6502       break;
6503 
6504   if (!VD)
6505     return llvm::GlobalValue::DLLImportStorageClass;
6506   if (VD->hasAttr<DLLExportAttr>())
6507     return llvm::GlobalValue::DLLExportStorageClass;
6508   if (VD->hasAttr<DLLImportAttr>())
6509     return llvm::GlobalValue::DLLImportStorageClass;
6510   return llvm::GlobalValue::DefaultStorageClass;
6511 }
6512 
6513 void CGObjCNonFragileABIMac::GenerateClass(const ObjCImplementationDecl *ID) {
6514   if (!ObjCEmptyCacheVar) {
6515     ObjCEmptyCacheVar =
6516         new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.CacheTy, false,
6517                                  llvm::GlobalValue::ExternalLinkage, nullptr,
6518                                  "_objc_empty_cache");
6519     if (CGM.getTriple().isOSBinFormatCOFF())
6520       ObjCEmptyCacheVar->setDLLStorageClass(getStorage(CGM, "_objc_empty_cache"));
6521 
6522     // Only OS X with deployment version <10.9 use the empty vtable symbol
6523     const llvm::Triple &Triple = CGM.getTarget().getTriple();
6524     if (Triple.isMacOSX() && Triple.isMacOSXVersionLT(10, 9))
6525       ObjCEmptyVtableVar =
6526           new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ImpnfABITy, false,
6527                                    llvm::GlobalValue::ExternalLinkage, nullptr,
6528                                    "_objc_empty_vtable");
6529     else
6530       ObjCEmptyVtableVar =
6531         llvm::ConstantPointerNull::get(ObjCTypes.ImpnfABITy->getPointerTo());
6532   }
6533 
6534   // FIXME: Is this correct (that meta class size is never computed)?
6535   uint32_t InstanceStart =
6536     CGM.getDataLayout().getTypeAllocSize(ObjCTypes.ClassnfABITy);
6537   uint32_t InstanceSize = InstanceStart;
6538   uint32_t flags = NonFragileABI_Class_Meta;
6539 
6540   llvm::Constant *SuperClassGV, *IsAGV;
6541 
6542   const auto *CI = ID->getClassInterface();
6543   assert(CI && "CGObjCNonFragileABIMac::GenerateClass - class is 0");
6544 
6545   // Build the flags for the metaclass.
6546   bool classIsHidden = (CGM.getTriple().isOSBinFormatCOFF())
6547                            ? !CI->hasAttr<DLLExportAttr>()
6548                            : CI->getVisibility() == HiddenVisibility;
6549   if (classIsHidden)
6550     flags |= NonFragileABI_Class_Hidden;
6551 
6552   // FIXME: why is this flag set on the metaclass?
6553   // ObjC metaclasses have no fields and don't really get constructed.
6554   if (ID->hasNonZeroConstructors() || ID->hasDestructors()) {
6555     flags |= NonFragileABI_Class_HasCXXStructors;
6556     if (!ID->hasNonZeroConstructors())
6557       flags |= NonFragileABI_Class_HasCXXDestructorOnly;
6558   }
6559 
6560   if (!CI->getSuperClass()) {
6561     // class is root
6562     flags |= NonFragileABI_Class_Root;
6563 
6564     SuperClassGV = GetClassGlobal(CI, /*metaclass*/ false, NotForDefinition);
6565     IsAGV = GetClassGlobal(CI, /*metaclass*/ true, NotForDefinition);
6566   } else {
6567     // Has a root. Current class is not a root.
6568     const ObjCInterfaceDecl *Root = ID->getClassInterface();
6569     while (const ObjCInterfaceDecl *Super = Root->getSuperClass())
6570       Root = Super;
6571 
6572     const auto *Super = CI->getSuperClass();
6573     IsAGV = GetClassGlobal(Root, /*metaclass*/ true, NotForDefinition);
6574     SuperClassGV = GetClassGlobal(Super, /*metaclass*/ true, NotForDefinition);
6575   }
6576 
6577   llvm::GlobalVariable *CLASS_RO_GV =
6578       BuildClassRoTInitializer(flags, InstanceStart, InstanceSize, ID);
6579 
6580   llvm::GlobalVariable *MetaTClass =
6581     BuildClassObject(CI, /*metaclass*/ true,
6582                      IsAGV, SuperClassGV, CLASS_RO_GV, classIsHidden);
6583   CGM.setGVProperties(MetaTClass, CI);
6584   DefinedMetaClasses.push_back(MetaTClass);
6585 
6586   // Metadata for the class
6587   flags = 0;
6588   if (classIsHidden)
6589     flags |= NonFragileABI_Class_Hidden;
6590 
6591   if (ID->hasNonZeroConstructors() || ID->hasDestructors()) {
6592     flags |= NonFragileABI_Class_HasCXXStructors;
6593 
6594     // Set a flag to enable a runtime optimization when a class has
6595     // fields that require destruction but which don't require
6596     // anything except zero-initialization during construction.  This
6597     // is most notably true of __strong and __weak types, but you can
6598     // also imagine there being C++ types with non-trivial default
6599     // constructors that merely set all fields to null.
6600     if (!ID->hasNonZeroConstructors())
6601       flags |= NonFragileABI_Class_HasCXXDestructorOnly;
6602   }
6603 
6604   if (hasObjCExceptionAttribute(CGM.getContext(), CI))
6605     flags |= NonFragileABI_Class_Exception;
6606 
6607   if (!CI->getSuperClass()) {
6608     flags |= NonFragileABI_Class_Root;
6609     SuperClassGV = nullptr;
6610   } else {
6611     // Has a root. Current class is not a root.
6612     const auto *Super = CI->getSuperClass();
6613     SuperClassGV = GetClassGlobal(Super, /*metaclass*/ false, NotForDefinition);
6614   }
6615 
6616   GetClassSizeInfo(ID, InstanceStart, InstanceSize);
6617   CLASS_RO_GV =
6618       BuildClassRoTInitializer(flags, InstanceStart, InstanceSize, ID);
6619 
6620   llvm::GlobalVariable *ClassMD =
6621     BuildClassObject(CI, /*metaclass*/ false,
6622                      MetaTClass, SuperClassGV, CLASS_RO_GV, classIsHidden);
6623   CGM.setGVProperties(ClassMD, CI);
6624   DefinedClasses.push_back(ClassMD);
6625   ImplementedClasses.push_back(CI);
6626 
6627   // Determine if this class is also "non-lazy".
6628   if (ImplementationIsNonLazy(ID))
6629     DefinedNonLazyClasses.push_back(ClassMD);
6630 
6631   // Force the definition of the EHType if necessary.
6632   if (flags & NonFragileABI_Class_Exception)
6633     (void) GetInterfaceEHType(CI, ForDefinition);
6634   // Make sure method definition entries are all clear for next implementation.
6635   MethodDefinitions.clear();
6636 }
6637 
6638 /// GenerateProtocolRef - This routine is called to generate code for
6639 /// a protocol reference expression; as in:
6640 /// @code
6641 ///   @protocol(Proto1);
6642 /// @endcode
6643 /// It generates a weak reference to l_OBJC_PROTOCOL_REFERENCE_$_Proto1
6644 /// which will hold address of the protocol meta-data.
6645 ///
6646 llvm::Value *CGObjCNonFragileABIMac::GenerateProtocolRef(CodeGenFunction &CGF,
6647                                                          const ObjCProtocolDecl *PD) {
6648 
6649   // This routine is called for @protocol only. So, we must build definition
6650   // of protocol's meta-data (not a reference to it!)
6651   //
6652   llvm::Constant *Init =
6653     llvm::ConstantExpr::getBitCast(GetOrEmitProtocol(PD),
6654                                    ObjCTypes.getExternalProtocolPtrTy());
6655 
6656   std::string ProtocolName("_OBJC_PROTOCOL_REFERENCE_$_");
6657   ProtocolName += PD->getObjCRuntimeNameAsString();
6658 
6659   CharUnits Align = CGF.getPointerAlign();
6660 
6661   llvm::GlobalVariable *PTGV = CGM.getModule().getGlobalVariable(ProtocolName);
6662   if (PTGV)
6663     return CGF.Builder.CreateAlignedLoad(PTGV, Align);
6664   PTGV = new llvm::GlobalVariable(CGM.getModule(), Init->getType(), false,
6665                                   llvm::GlobalValue::WeakAnyLinkage, Init,
6666                                   ProtocolName);
6667   PTGV->setSection(GetSectionName("__objc_protorefs",
6668                                   "coalesced,no_dead_strip"));
6669   PTGV->setVisibility(llvm::GlobalValue::HiddenVisibility);
6670   PTGV->setAlignment(Align.getAsAlign());
6671   if (!CGM.getTriple().isOSBinFormatMachO())
6672     PTGV->setComdat(CGM.getModule().getOrInsertComdat(ProtocolName));
6673   CGM.addUsedGlobal(PTGV);
6674   return CGF.Builder.CreateAlignedLoad(PTGV, Align);
6675 }
6676 
6677 /// GenerateCategory - Build metadata for a category implementation.
6678 /// struct _category_t {
6679 ///   const char * const name;
6680 ///   struct _class_t *const cls;
6681 ///   const struct _method_list_t * const instance_methods;
6682 ///   const struct _method_list_t * const class_methods;
6683 ///   const struct _protocol_list_t * const protocols;
6684 ///   const struct _prop_list_t * const properties;
6685 ///   const struct _prop_list_t * const class_properties;
6686 ///   const uint32_t size;
6687 /// }
6688 ///
6689 void CGObjCNonFragileABIMac::GenerateCategory(const ObjCCategoryImplDecl *OCD) {
6690   const ObjCInterfaceDecl *Interface = OCD->getClassInterface();
6691   const char *Prefix = "_OBJC_$_CATEGORY_";
6692 
6693   llvm::SmallString<64> ExtCatName(Prefix);
6694   ExtCatName += Interface->getObjCRuntimeNameAsString();
6695   ExtCatName += "_$_";
6696   ExtCatName += OCD->getNameAsString();
6697 
6698   ConstantInitBuilder builder(CGM);
6699   auto values = builder.beginStruct(ObjCTypes.CategorynfABITy);
6700   values.add(GetClassName(OCD->getIdentifier()->getName()));
6701   // meta-class entry symbol
6702   values.add(GetClassGlobal(Interface, /*metaclass*/ false, NotForDefinition));
6703   std::string listName =
6704       (Interface->getObjCRuntimeNameAsString() + "_$_" + OCD->getName()).str();
6705 
6706   SmallVector<const ObjCMethodDecl *, 16> instanceMethods;
6707   SmallVector<const ObjCMethodDecl *, 8> classMethods;
6708   for (const auto *MD : OCD->methods()) {
6709     if (MD->isDirectMethod())
6710       continue;
6711     if (MD->isInstanceMethod()) {
6712       instanceMethods.push_back(MD);
6713     } else {
6714       classMethods.push_back(MD);
6715     }
6716   }
6717 
6718   values.add(emitMethodList(listName, MethodListType::CategoryInstanceMethods,
6719                             instanceMethods));
6720   values.add(emitMethodList(listName, MethodListType::CategoryClassMethods,
6721                             classMethods));
6722 
6723   const ObjCCategoryDecl *Category =
6724     Interface->FindCategoryDeclaration(OCD->getIdentifier());
6725   if (Category) {
6726     SmallString<256> ExtName;
6727     llvm::raw_svector_ostream(ExtName) << Interface->getObjCRuntimeNameAsString() << "_$_"
6728                                        << OCD->getName();
6729     values.add(EmitProtocolList("_OBJC_CATEGORY_PROTOCOLS_$_"
6730                                    + Interface->getObjCRuntimeNameAsString() + "_$_"
6731                                    + Category->getName(),
6732                                 Category->protocol_begin(),
6733                                 Category->protocol_end()));
6734     values.add(EmitPropertyList("_OBJC_$_PROP_LIST_" + ExtName.str(),
6735                                 OCD, Category, ObjCTypes, false));
6736     values.add(EmitPropertyList("_OBJC_$_CLASS_PROP_LIST_" + ExtName.str(),
6737                                 OCD, Category, ObjCTypes, true));
6738   } else {
6739     values.addNullPointer(ObjCTypes.ProtocolListnfABIPtrTy);
6740     values.addNullPointer(ObjCTypes.PropertyListPtrTy);
6741     values.addNullPointer(ObjCTypes.PropertyListPtrTy);
6742   }
6743 
6744   unsigned Size = CGM.getDataLayout().getTypeAllocSize(ObjCTypes.CategorynfABITy);
6745   values.addInt(ObjCTypes.IntTy, Size);
6746 
6747   llvm::GlobalVariable *GCATV =
6748       finishAndCreateGlobal(values, ExtCatName.str(), CGM);
6749   CGM.addCompilerUsedGlobal(GCATV);
6750   if (Interface->hasAttr<ObjCClassStubAttr>())
6751     DefinedStubCategories.push_back(GCATV);
6752   else
6753     DefinedCategories.push_back(GCATV);
6754 
6755   // Determine if this category is also "non-lazy".
6756   if (ImplementationIsNonLazy(OCD))
6757     DefinedNonLazyCategories.push_back(GCATV);
6758   // method definition entries must be clear for next implementation.
6759   MethodDefinitions.clear();
6760 }
6761 
6762 /// emitMethodConstant - Return a struct objc_method constant.  If
6763 /// forProtocol is true, the implementation will be null; otherwise,
6764 /// the method must have a definition registered with the runtime.
6765 ///
6766 /// struct _objc_method {
6767 ///   SEL _cmd;
6768 ///   char *method_type;
6769 ///   char *_imp;
6770 /// }
6771 void CGObjCNonFragileABIMac::emitMethodConstant(ConstantArrayBuilder &builder,
6772                                                 const ObjCMethodDecl *MD,
6773                                                 bool forProtocol) {
6774   auto method = builder.beginStruct(ObjCTypes.MethodTy);
6775   method.addBitCast(GetMethodVarName(MD->getSelector()),
6776                     ObjCTypes.SelectorPtrTy);
6777   method.add(GetMethodVarType(MD));
6778 
6779   if (forProtocol) {
6780     // Protocol methods have no implementation. So, this entry is always NULL.
6781     method.addNullPointer(ObjCTypes.Int8PtrTy);
6782   } else {
6783     llvm::Function *fn = GetMethodDefinition(MD);
6784     assert(fn && "no definition for method?");
6785     method.addBitCast(fn, ObjCTypes.Int8PtrTy);
6786   }
6787 
6788   method.finishAndAddTo(builder);
6789 }
6790 
6791 /// Build meta-data for method declarations.
6792 ///
6793 /// struct _method_list_t {
6794 ///   uint32_t entsize;  // sizeof(struct _objc_method)
6795 ///   uint32_t method_count;
6796 ///   struct _objc_method method_list[method_count];
6797 /// }
6798 ///
6799 llvm::Constant *
6800 CGObjCNonFragileABIMac::emitMethodList(Twine name, MethodListType kind,
6801                               ArrayRef<const ObjCMethodDecl *> methods) {
6802   // Return null for empty list.
6803   if (methods.empty())
6804     return llvm::Constant::getNullValue(ObjCTypes.MethodListnfABIPtrTy);
6805 
6806   StringRef prefix;
6807   bool forProtocol;
6808   switch (kind) {
6809   case MethodListType::CategoryInstanceMethods:
6810     prefix = "_OBJC_$_CATEGORY_INSTANCE_METHODS_";
6811     forProtocol = false;
6812     break;
6813   case MethodListType::CategoryClassMethods:
6814     prefix = "_OBJC_$_CATEGORY_CLASS_METHODS_";
6815     forProtocol = false;
6816     break;
6817   case MethodListType::InstanceMethods:
6818     prefix = "_OBJC_$_INSTANCE_METHODS_";
6819     forProtocol = false;
6820     break;
6821   case MethodListType::ClassMethods:
6822     prefix = "_OBJC_$_CLASS_METHODS_";
6823     forProtocol = false;
6824     break;
6825 
6826   case MethodListType::ProtocolInstanceMethods:
6827     prefix = "_OBJC_$_PROTOCOL_INSTANCE_METHODS_";
6828     forProtocol = true;
6829     break;
6830   case MethodListType::ProtocolClassMethods:
6831     prefix = "_OBJC_$_PROTOCOL_CLASS_METHODS_";
6832     forProtocol = true;
6833     break;
6834   case MethodListType::OptionalProtocolInstanceMethods:
6835     prefix = "_OBJC_$_PROTOCOL_INSTANCE_METHODS_OPT_";
6836     forProtocol = true;
6837     break;
6838   case MethodListType::OptionalProtocolClassMethods:
6839     prefix = "_OBJC_$_PROTOCOL_CLASS_METHODS_OPT_";
6840     forProtocol = true;
6841     break;
6842   }
6843 
6844   ConstantInitBuilder builder(CGM);
6845   auto values = builder.beginStruct();
6846 
6847   // sizeof(struct _objc_method)
6848   unsigned Size = CGM.getDataLayout().getTypeAllocSize(ObjCTypes.MethodTy);
6849   values.addInt(ObjCTypes.IntTy, Size);
6850   // method_count
6851   values.addInt(ObjCTypes.IntTy, methods.size());
6852   auto methodArray = values.beginArray(ObjCTypes.MethodTy);
6853   for (auto MD : methods)
6854     emitMethodConstant(methodArray, MD, forProtocol);
6855   methodArray.finishAndAddTo(values);
6856 
6857   llvm::GlobalVariable *GV = finishAndCreateGlobal(values, prefix + name, CGM);
6858   CGM.addCompilerUsedGlobal(GV);
6859   return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.MethodListnfABIPtrTy);
6860 }
6861 
6862 /// ObjCIvarOffsetVariable - Returns the ivar offset variable for
6863 /// the given ivar.
6864 llvm::GlobalVariable *
6865 CGObjCNonFragileABIMac::ObjCIvarOffsetVariable(const ObjCInterfaceDecl *ID,
6866                                                const ObjCIvarDecl *Ivar) {
6867   const ObjCInterfaceDecl *Container = Ivar->getContainingInterface();
6868   llvm::SmallString<64> Name("OBJC_IVAR_$_");
6869   Name += Container->getObjCRuntimeNameAsString();
6870   Name += ".";
6871   Name += Ivar->getName();
6872   llvm::GlobalVariable *IvarOffsetGV = CGM.getModule().getGlobalVariable(Name);
6873   if (!IvarOffsetGV) {
6874     IvarOffsetGV =
6875         new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.IvarOffsetVarTy,
6876                                  false, llvm::GlobalValue::ExternalLinkage,
6877                                  nullptr, Name.str());
6878     if (CGM.getTriple().isOSBinFormatCOFF()) {
6879       bool IsPrivateOrPackage =
6880           Ivar->getAccessControl() == ObjCIvarDecl::Private ||
6881           Ivar->getAccessControl() == ObjCIvarDecl::Package;
6882 
6883       const ObjCInterfaceDecl *ContainingID = Ivar->getContainingInterface();
6884 
6885       if (ContainingID->hasAttr<DLLImportAttr>())
6886         IvarOffsetGV
6887             ->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
6888       else if (ContainingID->hasAttr<DLLExportAttr>() && !IsPrivateOrPackage)
6889         IvarOffsetGV
6890             ->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
6891     }
6892   }
6893   return IvarOffsetGV;
6894 }
6895 
6896 llvm::Constant *
6897 CGObjCNonFragileABIMac::EmitIvarOffsetVar(const ObjCInterfaceDecl *ID,
6898                                           const ObjCIvarDecl *Ivar,
6899                                           unsigned long int Offset) {
6900   llvm::GlobalVariable *IvarOffsetGV = ObjCIvarOffsetVariable(ID, Ivar);
6901   IvarOffsetGV->setInitializer(
6902       llvm::ConstantInt::get(ObjCTypes.IvarOffsetVarTy, Offset));
6903   IvarOffsetGV->setAlignment(llvm::Align(
6904       CGM.getDataLayout().getABITypeAlignment(ObjCTypes.IvarOffsetVarTy)));
6905 
6906   if (!CGM.getTriple().isOSBinFormatCOFF()) {
6907     // FIXME: This matches gcc, but shouldn't the visibility be set on the use
6908     // as well (i.e., in ObjCIvarOffsetVariable).
6909     if (Ivar->getAccessControl() == ObjCIvarDecl::Private ||
6910         Ivar->getAccessControl() == ObjCIvarDecl::Package ||
6911         ID->getVisibility() == HiddenVisibility)
6912       IvarOffsetGV->setVisibility(llvm::GlobalValue::HiddenVisibility);
6913     else
6914       IvarOffsetGV->setVisibility(llvm::GlobalValue::DefaultVisibility);
6915   }
6916 
6917   // If ID's layout is known, then make the global constant. This serves as a
6918   // useful assertion: we'll never use this variable to calculate ivar offsets,
6919   // so if the runtime tries to patch it then we should crash.
6920   if (isClassLayoutKnownStatically(ID))
6921     IvarOffsetGV->setConstant(true);
6922 
6923   if (CGM.getTriple().isOSBinFormatMachO())
6924     IvarOffsetGV->setSection("__DATA, __objc_ivar");
6925   return IvarOffsetGV;
6926 }
6927 
6928 /// EmitIvarList - Emit the ivar list for the given
6929 /// implementation. The return value has type
6930 /// IvarListnfABIPtrTy.
6931 ///  struct _ivar_t {
6932 ///   unsigned [long] int *offset;  // pointer to ivar offset location
6933 ///   char *name;
6934 ///   char *type;
6935 ///   uint32_t alignment;
6936 ///   uint32_t size;
6937 /// }
6938 /// struct _ivar_list_t {
6939 ///   uint32 entsize;  // sizeof(struct _ivar_t)
6940 ///   uint32 count;
6941 ///   struct _iver_t list[count];
6942 /// }
6943 ///
6944 
6945 llvm::Constant *CGObjCNonFragileABIMac::EmitIvarList(
6946   const ObjCImplementationDecl *ID) {
6947 
6948   ConstantInitBuilder builder(CGM);
6949   auto ivarList = builder.beginStruct();
6950   ivarList.addInt(ObjCTypes.IntTy,
6951                   CGM.getDataLayout().getTypeAllocSize(ObjCTypes.IvarnfABITy));
6952   auto ivarCountSlot = ivarList.addPlaceholder();
6953   auto ivars = ivarList.beginArray(ObjCTypes.IvarnfABITy);
6954 
6955   const ObjCInterfaceDecl *OID = ID->getClassInterface();
6956   assert(OID && "CGObjCNonFragileABIMac::EmitIvarList - null interface");
6957 
6958   // FIXME. Consolidate this with similar code in GenerateClass.
6959 
6960   for (const ObjCIvarDecl *IVD = OID->all_declared_ivar_begin();
6961        IVD; IVD = IVD->getNextIvar()) {
6962     // Ignore unnamed bit-fields.
6963     if (!IVD->getDeclName())
6964       continue;
6965 
6966     auto ivar = ivars.beginStruct(ObjCTypes.IvarnfABITy);
6967     ivar.add(EmitIvarOffsetVar(ID->getClassInterface(), IVD,
6968                                ComputeIvarBaseOffset(CGM, ID, IVD)));
6969     ivar.add(GetMethodVarName(IVD->getIdentifier()));
6970     ivar.add(GetMethodVarType(IVD));
6971     llvm::Type *FieldTy =
6972       CGM.getTypes().ConvertTypeForMem(IVD->getType());
6973     unsigned Size = CGM.getDataLayout().getTypeAllocSize(FieldTy);
6974     unsigned Align = CGM.getContext().getPreferredTypeAlign(
6975       IVD->getType().getTypePtr()) >> 3;
6976     Align = llvm::Log2_32(Align);
6977     ivar.addInt(ObjCTypes.IntTy, Align);
6978     // NOTE. Size of a bitfield does not match gcc's, because of the
6979     // way bitfields are treated special in each. But I am told that
6980     // 'size' for bitfield ivars is ignored by the runtime so it does
6981     // not matter.  If it matters, there is enough info to get the
6982     // bitfield right!
6983     ivar.addInt(ObjCTypes.IntTy, Size);
6984     ivar.finishAndAddTo(ivars);
6985   }
6986   // Return null for empty list.
6987   if (ivars.empty()) {
6988     ivars.abandon();
6989     ivarList.abandon();
6990     return llvm::Constant::getNullValue(ObjCTypes.IvarListnfABIPtrTy);
6991   }
6992 
6993   auto ivarCount = ivars.size();
6994   ivars.finishAndAddTo(ivarList);
6995   ivarList.fillPlaceholderWithInt(ivarCountSlot, ObjCTypes.IntTy, ivarCount);
6996 
6997   const char *Prefix = "_OBJC_$_INSTANCE_VARIABLES_";
6998   llvm::GlobalVariable *GV = finishAndCreateGlobal(
6999       ivarList, Prefix + OID->getObjCRuntimeNameAsString(), CGM);
7000   CGM.addCompilerUsedGlobal(GV);
7001   return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.IvarListnfABIPtrTy);
7002 }
7003 
7004 llvm::Constant *CGObjCNonFragileABIMac::GetOrEmitProtocolRef(
7005   const ObjCProtocolDecl *PD) {
7006   llvm::GlobalVariable *&Entry = Protocols[PD->getIdentifier()];
7007 
7008   if (!Entry) {
7009     // We use the initializer as a marker of whether this is a forward
7010     // reference or not. At module finalization we add the empty
7011     // contents for protocols which were referenced but never defined.
7012     llvm::SmallString<64> Protocol;
7013     llvm::raw_svector_ostream(Protocol) << "_OBJC_PROTOCOL_$_"
7014                                         << PD->getObjCRuntimeNameAsString();
7015 
7016     Entry = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ProtocolnfABITy,
7017                                      false, llvm::GlobalValue::ExternalLinkage,
7018                                      nullptr, Protocol);
7019     if (!CGM.getTriple().isOSBinFormatMachO())
7020       Entry->setComdat(CGM.getModule().getOrInsertComdat(Protocol));
7021   }
7022 
7023   return Entry;
7024 }
7025 
7026 /// GetOrEmitProtocol - Generate the protocol meta-data:
7027 /// @code
7028 /// struct _protocol_t {
7029 ///   id isa;  // NULL
7030 ///   const char * const protocol_name;
7031 ///   const struct _protocol_list_t * protocol_list; // super protocols
7032 ///   const struct method_list_t * const instance_methods;
7033 ///   const struct method_list_t * const class_methods;
7034 ///   const struct method_list_t *optionalInstanceMethods;
7035 ///   const struct method_list_t *optionalClassMethods;
7036 ///   const struct _prop_list_t * properties;
7037 ///   const uint32_t size;  // sizeof(struct _protocol_t)
7038 ///   const uint32_t flags;  // = 0
7039 ///   const char ** extendedMethodTypes;
7040 ///   const char *demangledName;
7041 ///   const struct _prop_list_t * class_properties;
7042 /// }
7043 /// @endcode
7044 ///
7045 
7046 llvm::Constant *CGObjCNonFragileABIMac::GetOrEmitProtocol(
7047   const ObjCProtocolDecl *PD) {
7048   llvm::GlobalVariable *Entry = Protocols[PD->getIdentifier()];
7049 
7050   // Early exit if a defining object has already been generated.
7051   if (Entry && Entry->hasInitializer())
7052     return Entry;
7053 
7054   // Use the protocol definition, if there is one.
7055   assert(PD->hasDefinition() &&
7056          "emitting protocol metadata without definition");
7057   PD = PD->getDefinition();
7058 
7059   auto methodLists = ProtocolMethodLists::get(PD);
7060 
7061   ConstantInitBuilder builder(CGM);
7062   auto values = builder.beginStruct(ObjCTypes.ProtocolnfABITy);
7063 
7064   // isa is NULL
7065   values.addNullPointer(ObjCTypes.ObjectPtrTy);
7066   values.add(GetClassName(PD->getObjCRuntimeNameAsString()));
7067   values.add(EmitProtocolList("_OBJC_$_PROTOCOL_REFS_"
7068                                 + PD->getObjCRuntimeNameAsString(),
7069                                PD->protocol_begin(),
7070                                PD->protocol_end()));
7071   values.add(methodLists.emitMethodList(this, PD,
7072                                  ProtocolMethodLists::RequiredInstanceMethods));
7073   values.add(methodLists.emitMethodList(this, PD,
7074                                  ProtocolMethodLists::RequiredClassMethods));
7075   values.add(methodLists.emitMethodList(this, PD,
7076                                  ProtocolMethodLists::OptionalInstanceMethods));
7077   values.add(methodLists.emitMethodList(this, PD,
7078                                  ProtocolMethodLists::OptionalClassMethods));
7079   values.add(EmitPropertyList(
7080                "_OBJC_$_PROP_LIST_" + PD->getObjCRuntimeNameAsString(),
7081                nullptr, PD, ObjCTypes, false));
7082   uint32_t Size =
7083     CGM.getDataLayout().getTypeAllocSize(ObjCTypes.ProtocolnfABITy);
7084   values.addInt(ObjCTypes.IntTy, Size);
7085   values.addInt(ObjCTypes.IntTy, 0);
7086   values.add(EmitProtocolMethodTypes("_OBJC_$_PROTOCOL_METHOD_TYPES_"
7087                                        + PD->getObjCRuntimeNameAsString(),
7088                                      methodLists.emitExtendedTypesArray(this),
7089                                      ObjCTypes));
7090 
7091   // const char *demangledName;
7092   values.addNullPointer(ObjCTypes.Int8PtrTy);
7093 
7094   values.add(EmitPropertyList(
7095       "_OBJC_$_CLASS_PROP_LIST_" + PD->getObjCRuntimeNameAsString(),
7096       nullptr, PD, ObjCTypes, true));
7097 
7098   if (Entry) {
7099     // Already created, fix the linkage and update the initializer.
7100     Entry->setLinkage(llvm::GlobalValue::WeakAnyLinkage);
7101     values.finishAndSetAsInitializer(Entry);
7102   } else {
7103     llvm::SmallString<64> symbolName;
7104     llvm::raw_svector_ostream(symbolName)
7105       << "_OBJC_PROTOCOL_$_" << PD->getObjCRuntimeNameAsString();
7106 
7107     Entry = values.finishAndCreateGlobal(symbolName, CGM.getPointerAlign(),
7108                                          /*constant*/ false,
7109                                          llvm::GlobalValue::WeakAnyLinkage);
7110     if (!CGM.getTriple().isOSBinFormatMachO())
7111       Entry->setComdat(CGM.getModule().getOrInsertComdat(symbolName));
7112 
7113     Protocols[PD->getIdentifier()] = Entry;
7114   }
7115   Entry->setVisibility(llvm::GlobalValue::HiddenVisibility);
7116   CGM.addUsedGlobal(Entry);
7117 
7118   // Use this protocol meta-data to build protocol list table in section
7119   // __DATA, __objc_protolist
7120   llvm::SmallString<64> ProtocolRef;
7121   llvm::raw_svector_ostream(ProtocolRef) << "_OBJC_LABEL_PROTOCOL_$_"
7122                                          << PD->getObjCRuntimeNameAsString();
7123 
7124   llvm::GlobalVariable *PTGV =
7125     new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ProtocolnfABIPtrTy,
7126                              false, llvm::GlobalValue::WeakAnyLinkage, Entry,
7127                              ProtocolRef);
7128   if (!CGM.getTriple().isOSBinFormatMachO())
7129     PTGV->setComdat(CGM.getModule().getOrInsertComdat(ProtocolRef));
7130   PTGV->setAlignment(llvm::Align(
7131       CGM.getDataLayout().getABITypeAlignment(ObjCTypes.ProtocolnfABIPtrTy)));
7132   PTGV->setSection(GetSectionName("__objc_protolist",
7133                                   "coalesced,no_dead_strip"));
7134   PTGV->setVisibility(llvm::GlobalValue::HiddenVisibility);
7135   CGM.addUsedGlobal(PTGV);
7136   return Entry;
7137 }
7138 
7139 /// EmitProtocolList - Generate protocol list meta-data:
7140 /// @code
7141 /// struct _protocol_list_t {
7142 ///   long protocol_count;   // Note, this is 32/64 bit
7143 ///   struct _protocol_t[protocol_count];
7144 /// }
7145 /// @endcode
7146 ///
7147 llvm::Constant *
7148 CGObjCNonFragileABIMac::EmitProtocolList(Twine Name,
7149                                       ObjCProtocolDecl::protocol_iterator begin,
7150                                       ObjCProtocolDecl::protocol_iterator end) {
7151   SmallVector<llvm::Constant *, 16> ProtocolRefs;
7152 
7153   // Just return null for empty protocol lists
7154   if (begin == end)
7155     return llvm::Constant::getNullValue(ObjCTypes.ProtocolListnfABIPtrTy);
7156 
7157   // FIXME: We shouldn't need to do this lookup here, should we?
7158   SmallString<256> TmpName;
7159   Name.toVector(TmpName);
7160   llvm::GlobalVariable *GV =
7161     CGM.getModule().getGlobalVariable(TmpName.str(), true);
7162   if (GV)
7163     return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.ProtocolListnfABIPtrTy);
7164 
7165   ConstantInitBuilder builder(CGM);
7166   auto values = builder.beginStruct();
7167   auto countSlot = values.addPlaceholder();
7168 
7169   // A null-terminated array of protocols.
7170   auto array = values.beginArray(ObjCTypes.ProtocolnfABIPtrTy);
7171   for (; begin != end; ++begin)
7172     array.add(GetProtocolRef(*begin));  // Implemented???
7173   auto count = array.size();
7174   array.addNullPointer(ObjCTypes.ProtocolnfABIPtrTy);
7175 
7176   array.finishAndAddTo(values);
7177   values.fillPlaceholderWithInt(countSlot, ObjCTypes.LongTy, count);
7178 
7179   GV = finishAndCreateGlobal(values, Name, CGM);
7180   CGM.addCompilerUsedGlobal(GV);
7181   return llvm::ConstantExpr::getBitCast(GV,
7182                                         ObjCTypes.ProtocolListnfABIPtrTy);
7183 }
7184 
7185 /// EmitObjCValueForIvar - Code Gen for nonfragile ivar reference.
7186 /// This code gen. amounts to generating code for:
7187 /// @code
7188 /// (type *)((char *)base + _OBJC_IVAR_$_.ivar;
7189 /// @encode
7190 ///
7191 LValue CGObjCNonFragileABIMac::EmitObjCValueForIvar(
7192                                                CodeGen::CodeGenFunction &CGF,
7193                                                QualType ObjectTy,
7194                                                llvm::Value *BaseValue,
7195                                                const ObjCIvarDecl *Ivar,
7196                                                unsigned CVRQualifiers) {
7197   ObjCInterfaceDecl *ID = ObjectTy->castAs<ObjCObjectType>()->getInterface();
7198   llvm::Value *Offset = EmitIvarOffset(CGF, ID, Ivar);
7199   return EmitValueForIvarAtOffset(CGF, ID, BaseValue, Ivar, CVRQualifiers,
7200                                   Offset);
7201 }
7202 
7203 llvm::Value *
7204 CGObjCNonFragileABIMac::EmitIvarOffset(CodeGen::CodeGenFunction &CGF,
7205                                        const ObjCInterfaceDecl *Interface,
7206                                        const ObjCIvarDecl *Ivar) {
7207   llvm::Value *IvarOffsetValue;
7208   if (isClassLayoutKnownStatically(Interface)) {
7209     IvarOffsetValue = llvm::ConstantInt::get(
7210         ObjCTypes.IvarOffsetVarTy,
7211         ComputeIvarBaseOffset(CGM, Interface->getImplementation(), Ivar));
7212   } else {
7213     llvm::GlobalVariable *GV = ObjCIvarOffsetVariable(Interface, Ivar);
7214     IvarOffsetValue =
7215         CGF.Builder.CreateAlignedLoad(GV, CGF.getSizeAlign(), "ivar");
7216     if (IsIvarOffsetKnownIdempotent(CGF, Ivar))
7217       cast<llvm::LoadInst>(IvarOffsetValue)
7218           ->setMetadata(CGM.getModule().getMDKindID("invariant.load"),
7219                         llvm::MDNode::get(VMContext, None));
7220   }
7221 
7222   // This could be 32bit int or 64bit integer depending on the architecture.
7223   // Cast it to 64bit integer value, if it is a 32bit integer ivar offset value
7224   //  as this is what caller always expects.
7225   if (ObjCTypes.IvarOffsetVarTy == ObjCTypes.IntTy)
7226     IvarOffsetValue = CGF.Builder.CreateIntCast(
7227         IvarOffsetValue, ObjCTypes.LongTy, true, "ivar.conv");
7228   return IvarOffsetValue;
7229 }
7230 
7231 static void appendSelectorForMessageRefTable(std::string &buffer,
7232                                              Selector selector) {
7233   if (selector.isUnarySelector()) {
7234     buffer += selector.getNameForSlot(0);
7235     return;
7236   }
7237 
7238   for (unsigned i = 0, e = selector.getNumArgs(); i != e; ++i) {
7239     buffer += selector.getNameForSlot(i);
7240     buffer += '_';
7241   }
7242 }
7243 
7244 /// Emit a "vtable" message send.  We emit a weak hidden-visibility
7245 /// struct, initially containing the selector pointer and a pointer to
7246 /// a "fixup" variant of the appropriate objc_msgSend.  To call, we
7247 /// load and call the function pointer, passing the address of the
7248 /// struct as the second parameter.  The runtime determines whether
7249 /// the selector is currently emitted using vtable dispatch; if so, it
7250 /// substitutes a stub function which simply tail-calls through the
7251 /// appropriate vtable slot, and if not, it substitues a stub function
7252 /// which tail-calls objc_msgSend.  Both stubs adjust the selector
7253 /// argument to correctly point to the selector.
7254 RValue
7255 CGObjCNonFragileABIMac::EmitVTableMessageSend(CodeGenFunction &CGF,
7256                                               ReturnValueSlot returnSlot,
7257                                               QualType resultType,
7258                                               Selector selector,
7259                                               llvm::Value *arg0,
7260                                               QualType arg0Type,
7261                                               bool isSuper,
7262                                               const CallArgList &formalArgs,
7263                                               const ObjCMethodDecl *method) {
7264   // Compute the actual arguments.
7265   CallArgList args;
7266 
7267   // First argument: the receiver / super-call structure.
7268   if (!isSuper)
7269     arg0 = CGF.Builder.CreateBitCast(arg0, ObjCTypes.ObjectPtrTy);
7270   args.add(RValue::get(arg0), arg0Type);
7271 
7272   // Second argument: a pointer to the message ref structure.  Leave
7273   // the actual argument value blank for now.
7274   args.add(RValue::get(nullptr), ObjCTypes.MessageRefCPtrTy);
7275 
7276   args.insert(args.end(), formalArgs.begin(), formalArgs.end());
7277 
7278   MessageSendInfo MSI = getMessageSendInfo(method, resultType, args);
7279 
7280   NullReturnState nullReturn;
7281 
7282   // Find the function to call and the mangled name for the message
7283   // ref structure.  Using a different mangled name wouldn't actually
7284   // be a problem; it would just be a waste.
7285   //
7286   // The runtime currently never uses vtable dispatch for anything
7287   // except normal, non-super message-sends.
7288   // FIXME: don't use this for that.
7289   llvm::FunctionCallee fn = nullptr;
7290   std::string messageRefName("_");
7291   if (CGM.ReturnSlotInterferesWithArgs(MSI.CallInfo)) {
7292     if (isSuper) {
7293       fn = ObjCTypes.getMessageSendSuper2StretFixupFn();
7294       messageRefName += "objc_msgSendSuper2_stret_fixup";
7295     } else {
7296       nullReturn.init(CGF, arg0);
7297       fn = ObjCTypes.getMessageSendStretFixupFn();
7298       messageRefName += "objc_msgSend_stret_fixup";
7299     }
7300   } else if (!isSuper && CGM.ReturnTypeUsesFPRet(resultType)) {
7301     fn = ObjCTypes.getMessageSendFpretFixupFn();
7302     messageRefName += "objc_msgSend_fpret_fixup";
7303   } else {
7304     if (isSuper) {
7305       fn = ObjCTypes.getMessageSendSuper2FixupFn();
7306       messageRefName += "objc_msgSendSuper2_fixup";
7307     } else {
7308       fn = ObjCTypes.getMessageSendFixupFn();
7309       messageRefName += "objc_msgSend_fixup";
7310     }
7311   }
7312   assert(fn && "CGObjCNonFragileABIMac::EmitMessageSend");
7313   messageRefName += '_';
7314 
7315   // Append the selector name, except use underscores anywhere we
7316   // would have used colons.
7317   appendSelectorForMessageRefTable(messageRefName, selector);
7318 
7319   llvm::GlobalVariable *messageRef
7320     = CGM.getModule().getGlobalVariable(messageRefName);
7321   if (!messageRef) {
7322     // Build the message ref structure.
7323     ConstantInitBuilder builder(CGM);
7324     auto values = builder.beginStruct();
7325     values.add(cast<llvm::Constant>(fn.getCallee()));
7326     values.add(GetMethodVarName(selector));
7327     messageRef = values.finishAndCreateGlobal(messageRefName,
7328                                               CharUnits::fromQuantity(16),
7329                                               /*constant*/ false,
7330                                         llvm::GlobalValue::WeakAnyLinkage);
7331     messageRef->setVisibility(llvm::GlobalValue::HiddenVisibility);
7332     messageRef->setSection(GetSectionName("__objc_msgrefs", "coalesced"));
7333   }
7334 
7335   bool requiresnullCheck = false;
7336   if (CGM.getLangOpts().ObjCAutoRefCount && method)
7337     for (const auto *ParamDecl : method->parameters()) {
7338       if (ParamDecl->hasAttr<NSConsumedAttr>()) {
7339         if (!nullReturn.NullBB)
7340           nullReturn.init(CGF, arg0);
7341         requiresnullCheck = true;
7342         break;
7343       }
7344     }
7345 
7346   Address mref =
7347     Address(CGF.Builder.CreateBitCast(messageRef, ObjCTypes.MessageRefPtrTy),
7348             CGF.getPointerAlign());
7349 
7350   // Update the message ref argument.
7351   args[1].setRValue(RValue::get(mref.getPointer()));
7352 
7353   // Load the function to call from the message ref table.
7354   Address calleeAddr = CGF.Builder.CreateStructGEP(mref, 0);
7355   llvm::Value *calleePtr = CGF.Builder.CreateLoad(calleeAddr, "msgSend_fn");
7356 
7357   calleePtr = CGF.Builder.CreateBitCast(calleePtr, MSI.MessengerType);
7358   CGCallee callee(CGCalleeInfo(), calleePtr);
7359 
7360   RValue result = CGF.EmitCall(MSI.CallInfo, callee, returnSlot, args);
7361   return nullReturn.complete(CGF, returnSlot, result, resultType, formalArgs,
7362                              requiresnullCheck ? method : nullptr);
7363 }
7364 
7365 /// Generate code for a message send expression in the nonfragile abi.
7366 CodeGen::RValue
7367 CGObjCNonFragileABIMac::GenerateMessageSend(CodeGen::CodeGenFunction &CGF,
7368                                             ReturnValueSlot Return,
7369                                             QualType ResultType,
7370                                             Selector Sel,
7371                                             llvm::Value *Receiver,
7372                                             const CallArgList &CallArgs,
7373                                             const ObjCInterfaceDecl *Class,
7374                                             const ObjCMethodDecl *Method) {
7375   return isVTableDispatchedSelector(Sel)
7376     ? EmitVTableMessageSend(CGF, Return, ResultType, Sel,
7377                             Receiver, CGF.getContext().getObjCIdType(),
7378                             false, CallArgs, Method)
7379     : EmitMessageSend(CGF, Return, ResultType, Sel,
7380                       Receiver, CGF.getContext().getObjCIdType(),
7381                       false, CallArgs, Method, Class, ObjCTypes);
7382 }
7383 
7384 llvm::Constant *
7385 CGObjCNonFragileABIMac::GetClassGlobal(const ObjCInterfaceDecl *ID,
7386                                        bool metaclass,
7387                                        ForDefinition_t isForDefinition) {
7388   auto prefix =
7389     (metaclass ? getMetaclassSymbolPrefix() : getClassSymbolPrefix());
7390   return GetClassGlobal((prefix + ID->getObjCRuntimeNameAsString()).str(),
7391                         isForDefinition,
7392                         ID->isWeakImported(),
7393                         !isForDefinition
7394                           && CGM.getTriple().isOSBinFormatCOFF()
7395                           && ID->hasAttr<DLLImportAttr>());
7396 }
7397 
7398 llvm::Constant *
7399 CGObjCNonFragileABIMac::GetClassGlobal(StringRef Name,
7400                                        ForDefinition_t IsForDefinition,
7401                                        bool Weak, bool DLLImport) {
7402   llvm::GlobalValue::LinkageTypes L =
7403       Weak ? llvm::GlobalValue::ExternalWeakLinkage
7404            : llvm::GlobalValue::ExternalLinkage;
7405 
7406   llvm::GlobalVariable *GV = CGM.getModule().getGlobalVariable(Name);
7407   if (!GV || GV->getType() != ObjCTypes.ClassnfABITy->getPointerTo()) {
7408     auto *NewGV = new llvm::GlobalVariable(ObjCTypes.ClassnfABITy, false, L,
7409                                            nullptr, Name);
7410 
7411     if (DLLImport)
7412       NewGV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
7413 
7414     if (GV) {
7415       GV->replaceAllUsesWith(
7416           llvm::ConstantExpr::getBitCast(NewGV, GV->getType()));
7417       GV->eraseFromParent();
7418     }
7419     GV = NewGV;
7420     CGM.getModule().getGlobalList().push_back(GV);
7421   }
7422 
7423   assert(GV->getLinkage() == L);
7424   return GV;
7425 }
7426 
7427 llvm::Constant *
7428 CGObjCNonFragileABIMac::GetClassGlobalForClassRef(const ObjCInterfaceDecl *ID) {
7429   llvm::Constant *ClassGV = GetClassGlobal(ID, /*metaclass*/ false,
7430                                            NotForDefinition);
7431 
7432   if (!ID->hasAttr<ObjCClassStubAttr>())
7433     return ClassGV;
7434 
7435   ClassGV = llvm::ConstantExpr::getPointerCast(ClassGV, ObjCTypes.Int8PtrTy);
7436 
7437   // Stub classes are pointer-aligned. Classrefs pointing at stub classes
7438   // must set the least significant bit set to 1.
7439   auto *Idx = llvm::ConstantInt::get(CGM.Int32Ty, 1);
7440   return llvm::ConstantExpr::getGetElementPtr(CGM.Int8Ty, ClassGV, Idx);
7441 }
7442 
7443 llvm::Value *
7444 CGObjCNonFragileABIMac::EmitLoadOfClassRef(CodeGenFunction &CGF,
7445                                            const ObjCInterfaceDecl *ID,
7446                                            llvm::GlobalVariable *Entry) {
7447   if (ID && ID->hasAttr<ObjCClassStubAttr>()) {
7448     // Classrefs pointing at Objective-C stub classes must be loaded by calling
7449     // a special runtime function.
7450     return CGF.EmitRuntimeCall(
7451       ObjCTypes.getLoadClassrefFn(), Entry, "load_classref_result");
7452   }
7453 
7454   CharUnits Align = CGF.getPointerAlign();
7455   return CGF.Builder.CreateAlignedLoad(Entry, Align);
7456 }
7457 
7458 llvm::Value *
7459 CGObjCNonFragileABIMac::EmitClassRefFromId(CodeGenFunction &CGF,
7460                                            IdentifierInfo *II,
7461                                            const ObjCInterfaceDecl *ID) {
7462   llvm::GlobalVariable *&Entry = ClassReferences[II];
7463 
7464   if (!Entry) {
7465     llvm::Constant *ClassGV;
7466     if (ID) {
7467       ClassGV = GetClassGlobalForClassRef(ID);
7468     } else {
7469       ClassGV = GetClassGlobal((getClassSymbolPrefix() + II->getName()).str(),
7470                                NotForDefinition);
7471       assert(ClassGV->getType() == ObjCTypes.ClassnfABIPtrTy &&
7472              "classref was emitted with the wrong type?");
7473     }
7474 
7475     std::string SectionName =
7476         GetSectionName("__objc_classrefs", "regular,no_dead_strip");
7477     Entry = new llvm::GlobalVariable(
7478         CGM.getModule(), ClassGV->getType(), false,
7479         getLinkageTypeForObjCMetadata(CGM, SectionName), ClassGV,
7480         "OBJC_CLASSLIST_REFERENCES_$_");
7481     Entry->setAlignment(CGF.getPointerAlign().getAsAlign());
7482     if (!ID || !ID->hasAttr<ObjCClassStubAttr>())
7483       Entry->setSection(SectionName);
7484 
7485     CGM.addCompilerUsedGlobal(Entry);
7486   }
7487 
7488   return EmitLoadOfClassRef(CGF, ID, Entry);
7489 }
7490 
7491 llvm::Value *CGObjCNonFragileABIMac::EmitClassRef(CodeGenFunction &CGF,
7492                                                   const ObjCInterfaceDecl *ID) {
7493   // If the class has the objc_runtime_visible attribute, we need to
7494   // use the Objective-C runtime to get the class.
7495   if (ID->hasAttr<ObjCRuntimeVisibleAttr>())
7496     return EmitClassRefViaRuntime(CGF, ID, ObjCTypes);
7497 
7498   return EmitClassRefFromId(CGF, ID->getIdentifier(), ID);
7499 }
7500 
7501 llvm::Value *CGObjCNonFragileABIMac::EmitNSAutoreleasePoolClassRef(
7502                                                     CodeGenFunction &CGF) {
7503   IdentifierInfo *II = &CGM.getContext().Idents.get("NSAutoreleasePool");
7504   return EmitClassRefFromId(CGF, II, nullptr);
7505 }
7506 
7507 llvm::Value *
7508 CGObjCNonFragileABIMac::EmitSuperClassRef(CodeGenFunction &CGF,
7509                                           const ObjCInterfaceDecl *ID) {
7510   llvm::GlobalVariable *&Entry = SuperClassReferences[ID->getIdentifier()];
7511 
7512   if (!Entry) {
7513     llvm::Constant *ClassGV = GetClassGlobalForClassRef(ID);
7514     std::string SectionName =
7515         GetSectionName("__objc_superrefs", "regular,no_dead_strip");
7516     Entry = new llvm::GlobalVariable(CGM.getModule(), ClassGV->getType(), false,
7517                                      llvm::GlobalValue::PrivateLinkage, ClassGV,
7518                                      "OBJC_CLASSLIST_SUP_REFS_$_");
7519     Entry->setAlignment(CGF.getPointerAlign().getAsAlign());
7520     Entry->setSection(SectionName);
7521     CGM.addCompilerUsedGlobal(Entry);
7522   }
7523 
7524   return EmitLoadOfClassRef(CGF, ID, Entry);
7525 }
7526 
7527 /// EmitMetaClassRef - Return a Value * of the address of _class_t
7528 /// meta-data
7529 ///
7530 llvm::Value *CGObjCNonFragileABIMac::EmitMetaClassRef(CodeGenFunction &CGF,
7531                                                       const ObjCInterfaceDecl *ID,
7532                                                       bool Weak) {
7533   CharUnits Align = CGF.getPointerAlign();
7534   llvm::GlobalVariable * &Entry = MetaClassReferences[ID->getIdentifier()];
7535   if (!Entry) {
7536     auto MetaClassGV = GetClassGlobal(ID, /*metaclass*/ true, NotForDefinition);
7537     std::string SectionName =
7538         GetSectionName("__objc_superrefs", "regular,no_dead_strip");
7539     Entry = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ClassnfABIPtrTy,
7540                                      false, llvm::GlobalValue::PrivateLinkage,
7541                                      MetaClassGV, "OBJC_CLASSLIST_SUP_REFS_$_");
7542     Entry->setAlignment(Align.getAsAlign());
7543     Entry->setSection(SectionName);
7544     CGM.addCompilerUsedGlobal(Entry);
7545   }
7546 
7547   return CGF.Builder.CreateAlignedLoad(Entry, Align);
7548 }
7549 
7550 /// GetClass - Return a reference to the class for the given interface
7551 /// decl.
7552 llvm::Value *CGObjCNonFragileABIMac::GetClass(CodeGenFunction &CGF,
7553                                               const ObjCInterfaceDecl *ID) {
7554   if (ID->isWeakImported()) {
7555     auto ClassGV = GetClassGlobal(ID, /*metaclass*/ false, NotForDefinition);
7556     (void)ClassGV;
7557     assert(!isa<llvm::GlobalVariable>(ClassGV) ||
7558            cast<llvm::GlobalVariable>(ClassGV)->hasExternalWeakLinkage());
7559   }
7560 
7561   return EmitClassRef(CGF, ID);
7562 }
7563 
7564 /// Generates a message send where the super is the receiver.  This is
7565 /// a message send to self with special delivery semantics indicating
7566 /// which class's method should be called.
7567 CodeGen::RValue
7568 CGObjCNonFragileABIMac::GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF,
7569                                                  ReturnValueSlot Return,
7570                                                  QualType ResultType,
7571                                                  Selector Sel,
7572                                                  const ObjCInterfaceDecl *Class,
7573                                                  bool isCategoryImpl,
7574                                                  llvm::Value *Receiver,
7575                                                  bool IsClassMessage,
7576                                                  const CodeGen::CallArgList &CallArgs,
7577                                                  const ObjCMethodDecl *Method) {
7578   // ...
7579   // Create and init a super structure; this is a (receiver, class)
7580   // pair we will pass to objc_msgSendSuper.
7581   Address ObjCSuper =
7582     CGF.CreateTempAlloca(ObjCTypes.SuperTy, CGF.getPointerAlign(),
7583                          "objc_super");
7584 
7585   llvm::Value *ReceiverAsObject =
7586     CGF.Builder.CreateBitCast(Receiver, ObjCTypes.ObjectPtrTy);
7587   CGF.Builder.CreateStore(ReceiverAsObject,
7588                           CGF.Builder.CreateStructGEP(ObjCSuper, 0));
7589 
7590   // If this is a class message the metaclass is passed as the target.
7591   llvm::Value *Target;
7592   if (IsClassMessage)
7593       Target = EmitMetaClassRef(CGF, Class, Class->isWeakImported());
7594   else
7595     Target = EmitSuperClassRef(CGF, Class);
7596 
7597   // FIXME: We shouldn't need to do this cast, rectify the ASTContext and
7598   // ObjCTypes types.
7599   llvm::Type *ClassTy =
7600     CGM.getTypes().ConvertType(CGF.getContext().getObjCClassType());
7601   Target = CGF.Builder.CreateBitCast(Target, ClassTy);
7602   CGF.Builder.CreateStore(Target, CGF.Builder.CreateStructGEP(ObjCSuper, 1));
7603 
7604   return (isVTableDispatchedSelector(Sel))
7605     ? EmitVTableMessageSend(CGF, Return, ResultType, Sel,
7606                             ObjCSuper.getPointer(), ObjCTypes.SuperPtrCTy,
7607                             true, CallArgs, Method)
7608     : EmitMessageSend(CGF, Return, ResultType, Sel,
7609                       ObjCSuper.getPointer(), ObjCTypes.SuperPtrCTy,
7610                       true, CallArgs, Method, Class, ObjCTypes);
7611 }
7612 
7613 llvm::Value *CGObjCNonFragileABIMac::EmitSelector(CodeGenFunction &CGF,
7614                                                   Selector Sel) {
7615   Address Addr = EmitSelectorAddr(Sel);
7616 
7617   llvm::LoadInst* LI = CGF.Builder.CreateLoad(Addr);
7618   LI->setMetadata(CGM.getModule().getMDKindID("invariant.load"),
7619                   llvm::MDNode::get(VMContext, None));
7620   return LI;
7621 }
7622 
7623 Address CGObjCNonFragileABIMac::EmitSelectorAddr(Selector Sel) {
7624   llvm::GlobalVariable *&Entry = SelectorReferences[Sel];
7625   CharUnits Align = CGM.getPointerAlign();
7626   if (!Entry) {
7627     llvm::Constant *Casted =
7628       llvm::ConstantExpr::getBitCast(GetMethodVarName(Sel),
7629                                      ObjCTypes.SelectorPtrTy);
7630     std::string SectionName =
7631         GetSectionName("__objc_selrefs", "literal_pointers,no_dead_strip");
7632     Entry = new llvm::GlobalVariable(
7633         CGM.getModule(), ObjCTypes.SelectorPtrTy, false,
7634         getLinkageTypeForObjCMetadata(CGM, SectionName), Casted,
7635         "OBJC_SELECTOR_REFERENCES_");
7636     Entry->setExternallyInitialized(true);
7637     Entry->setSection(SectionName);
7638     Entry->setAlignment(Align.getAsAlign());
7639     CGM.addCompilerUsedGlobal(Entry);
7640   }
7641 
7642   return Address(Entry, Align);
7643 }
7644 
7645 /// EmitObjCIvarAssign - Code gen for assigning to a __strong object.
7646 /// objc_assign_ivar (id src, id *dst, ptrdiff_t)
7647 ///
7648 void CGObjCNonFragileABIMac::EmitObjCIvarAssign(CodeGen::CodeGenFunction &CGF,
7649                                                 llvm::Value *src,
7650                                                 Address dst,
7651                                                 llvm::Value *ivarOffset) {
7652   llvm::Type * SrcTy = src->getType();
7653   if (!isa<llvm::PointerType>(SrcTy)) {
7654     unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
7655     assert(Size <= 8 && "does not support size > 8");
7656     src = (Size == 4 ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy)
7657            : CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy));
7658     src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
7659   }
7660   src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
7661   dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
7662   llvm::Value *args[] = { src, dst.getPointer(), ivarOffset };
7663   CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignIvarFn(), args);
7664 }
7665 
7666 /// EmitObjCStrongCastAssign - Code gen for assigning to a __strong cast object.
7667 /// objc_assign_strongCast (id src, id *dst)
7668 ///
7669 void CGObjCNonFragileABIMac::EmitObjCStrongCastAssign(
7670   CodeGen::CodeGenFunction &CGF,
7671   llvm::Value *src, Address dst) {
7672   llvm::Type * SrcTy = src->getType();
7673   if (!isa<llvm::PointerType>(SrcTy)) {
7674     unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
7675     assert(Size <= 8 && "does not support size > 8");
7676     src = (Size == 4 ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy)
7677            : CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy));
7678     src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
7679   }
7680   src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
7681   dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
7682   llvm::Value *args[] = { src, dst.getPointer() };
7683   CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignStrongCastFn(),
7684                               args, "weakassign");
7685 }
7686 
7687 void CGObjCNonFragileABIMac::EmitGCMemmoveCollectable(
7688   CodeGen::CodeGenFunction &CGF,
7689   Address DestPtr,
7690   Address SrcPtr,
7691   llvm::Value *Size) {
7692   SrcPtr = CGF.Builder.CreateBitCast(SrcPtr, ObjCTypes.Int8PtrTy);
7693   DestPtr = CGF.Builder.CreateBitCast(DestPtr, ObjCTypes.Int8PtrTy);
7694   llvm::Value *args[] = { DestPtr.getPointer(), SrcPtr.getPointer(), Size };
7695   CGF.EmitNounwindRuntimeCall(ObjCTypes.GcMemmoveCollectableFn(), args);
7696 }
7697 
7698 /// EmitObjCWeakRead - Code gen for loading value of a __weak
7699 /// object: objc_read_weak (id *src)
7700 ///
7701 llvm::Value * CGObjCNonFragileABIMac::EmitObjCWeakRead(
7702   CodeGen::CodeGenFunction &CGF,
7703   Address AddrWeakObj) {
7704   llvm::Type *DestTy = AddrWeakObj.getElementType();
7705   AddrWeakObj = CGF.Builder.CreateBitCast(AddrWeakObj, ObjCTypes.PtrObjectPtrTy);
7706   llvm::Value *read_weak =
7707     CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcReadWeakFn(),
7708                                 AddrWeakObj.getPointer(), "weakread");
7709   read_weak = CGF.Builder.CreateBitCast(read_weak, DestTy);
7710   return read_weak;
7711 }
7712 
7713 /// EmitObjCWeakAssign - Code gen for assigning to a __weak object.
7714 /// objc_assign_weak (id src, id *dst)
7715 ///
7716 void CGObjCNonFragileABIMac::EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF,
7717                                                 llvm::Value *src, Address dst) {
7718   llvm::Type * SrcTy = src->getType();
7719   if (!isa<llvm::PointerType>(SrcTy)) {
7720     unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
7721     assert(Size <= 8 && "does not support size > 8");
7722     src = (Size == 4 ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy)
7723            : CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy));
7724     src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
7725   }
7726   src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
7727   dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
7728   llvm::Value *args[] = { src, dst.getPointer() };
7729   CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignWeakFn(),
7730                               args, "weakassign");
7731 }
7732 
7733 /// EmitObjCGlobalAssign - Code gen for assigning to a __strong object.
7734 /// objc_assign_global (id src, id *dst)
7735 ///
7736 void CGObjCNonFragileABIMac::EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF,
7737                                           llvm::Value *src, Address dst,
7738                                           bool threadlocal) {
7739   llvm::Type * SrcTy = src->getType();
7740   if (!isa<llvm::PointerType>(SrcTy)) {
7741     unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
7742     assert(Size <= 8 && "does not support size > 8");
7743     src = (Size == 4 ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy)
7744            : CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy));
7745     src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
7746   }
7747   src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
7748   dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
7749   llvm::Value *args[] = { src, dst.getPointer() };
7750   if (!threadlocal)
7751     CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignGlobalFn(),
7752                                 args, "globalassign");
7753   else
7754     CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignThreadLocalFn(),
7755                                 args, "threadlocalassign");
7756 }
7757 
7758 void
7759 CGObjCNonFragileABIMac::EmitSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
7760                                              const ObjCAtSynchronizedStmt &S) {
7761   EmitAtSynchronizedStmt(CGF, S, ObjCTypes.getSyncEnterFn(),
7762                          ObjCTypes.getSyncExitFn());
7763 }
7764 
7765 llvm::Constant *
7766 CGObjCNonFragileABIMac::GetEHType(QualType T) {
7767   // There's a particular fixed type info for 'id'.
7768   if (T->isObjCIdType() || T->isObjCQualifiedIdType()) {
7769     auto *IDEHType = CGM.getModule().getGlobalVariable("OBJC_EHTYPE_id");
7770     if (!IDEHType) {
7771       IDEHType =
7772           new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.EHTypeTy, false,
7773                                    llvm::GlobalValue::ExternalLinkage, nullptr,
7774                                    "OBJC_EHTYPE_id");
7775       if (CGM.getTriple().isOSBinFormatCOFF())
7776         IDEHType->setDLLStorageClass(getStorage(CGM, "OBJC_EHTYPE_id"));
7777     }
7778     return IDEHType;
7779   }
7780 
7781   // All other types should be Objective-C interface pointer types.
7782   const ObjCObjectPointerType *PT = T->getAs<ObjCObjectPointerType>();
7783   assert(PT && "Invalid @catch type.");
7784 
7785   const ObjCInterfaceType *IT = PT->getInterfaceType();
7786   assert(IT && "Invalid @catch type.");
7787 
7788   return GetInterfaceEHType(IT->getDecl(), NotForDefinition);
7789 }
7790 
7791 void CGObjCNonFragileABIMac::EmitTryStmt(CodeGen::CodeGenFunction &CGF,
7792                                          const ObjCAtTryStmt &S) {
7793   EmitTryCatchStmt(CGF, S, ObjCTypes.getObjCBeginCatchFn(),
7794                    ObjCTypes.getObjCEndCatchFn(),
7795                    ObjCTypes.getExceptionRethrowFn());
7796 }
7797 
7798 /// EmitThrowStmt - Generate code for a throw statement.
7799 void CGObjCNonFragileABIMac::EmitThrowStmt(CodeGen::CodeGenFunction &CGF,
7800                                            const ObjCAtThrowStmt &S,
7801                                            bool ClearInsertionPoint) {
7802   if (const Expr *ThrowExpr = S.getThrowExpr()) {
7803     llvm::Value *Exception = CGF.EmitObjCThrowOperand(ThrowExpr);
7804     Exception = CGF.Builder.CreateBitCast(Exception, ObjCTypes.ObjectPtrTy);
7805     llvm::CallBase *Call =
7806         CGF.EmitRuntimeCallOrInvoke(ObjCTypes.getExceptionThrowFn(), Exception);
7807     Call->setDoesNotReturn();
7808   } else {
7809     llvm::CallBase *Call =
7810         CGF.EmitRuntimeCallOrInvoke(ObjCTypes.getExceptionRethrowFn());
7811     Call->setDoesNotReturn();
7812   }
7813 
7814   CGF.Builder.CreateUnreachable();
7815   if (ClearInsertionPoint)
7816     CGF.Builder.ClearInsertionPoint();
7817 }
7818 
7819 llvm::Constant *
7820 CGObjCNonFragileABIMac::GetInterfaceEHType(const ObjCInterfaceDecl *ID,
7821                                            ForDefinition_t IsForDefinition) {
7822   llvm::GlobalVariable * &Entry = EHTypeReferences[ID->getIdentifier()];
7823   StringRef ClassName = ID->getObjCRuntimeNameAsString();
7824 
7825   // If we don't need a definition, return the entry if found or check
7826   // if we use an external reference.
7827   if (!IsForDefinition) {
7828     if (Entry)
7829       return Entry;
7830 
7831     // If this type (or a super class) has the __objc_exception__
7832     // attribute, emit an external reference.
7833     if (hasObjCExceptionAttribute(CGM.getContext(), ID)) {
7834       std::string EHTypeName = ("OBJC_EHTYPE_$_" + ClassName).str();
7835       Entry = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.EHTypeTy,
7836                                        false, llvm::GlobalValue::ExternalLinkage,
7837                                        nullptr, EHTypeName);
7838       CGM.setGVProperties(Entry, ID);
7839       return Entry;
7840     }
7841   }
7842 
7843   // Otherwise we need to either make a new entry or fill in the initializer.
7844   assert((!Entry || !Entry->hasInitializer()) && "Duplicate EHType definition");
7845 
7846   std::string VTableName = "objc_ehtype_vtable";
7847   auto *VTableGV = CGM.getModule().getGlobalVariable(VTableName);
7848   if (!VTableGV) {
7849     VTableGV =
7850         new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.Int8PtrTy, false,
7851                                  llvm::GlobalValue::ExternalLinkage, nullptr,
7852                                  VTableName);
7853     if (CGM.getTriple().isOSBinFormatCOFF())
7854       VTableGV->setDLLStorageClass(getStorage(CGM, VTableName));
7855   }
7856 
7857   llvm::Value *VTableIdx = llvm::ConstantInt::get(CGM.Int32Ty, 2);
7858   ConstantInitBuilder builder(CGM);
7859   auto values = builder.beginStruct(ObjCTypes.EHTypeTy);
7860   values.add(
7861     llvm::ConstantExpr::getInBoundsGetElementPtr(VTableGV->getValueType(),
7862                                                  VTableGV, VTableIdx));
7863   values.add(GetClassName(ClassName));
7864   values.add(GetClassGlobal(ID, /*metaclass*/ false, NotForDefinition));
7865 
7866   llvm::GlobalValue::LinkageTypes L = IsForDefinition
7867                                           ? llvm::GlobalValue::ExternalLinkage
7868                                           : llvm::GlobalValue::WeakAnyLinkage;
7869   if (Entry) {
7870     values.finishAndSetAsInitializer(Entry);
7871     Entry->setAlignment(CGM.getPointerAlign().getAsAlign());
7872   } else {
7873     Entry = values.finishAndCreateGlobal("OBJC_EHTYPE_$_" + ClassName,
7874                                          CGM.getPointerAlign(),
7875                                          /*constant*/ false,
7876                                          L);
7877     if (hasObjCExceptionAttribute(CGM.getContext(), ID))
7878       CGM.setGVProperties(Entry, ID);
7879   }
7880   assert(Entry->getLinkage() == L);
7881 
7882   if (!CGM.getTriple().isOSBinFormatCOFF())
7883     if (ID->getVisibility() == HiddenVisibility)
7884       Entry->setVisibility(llvm::GlobalValue::HiddenVisibility);
7885 
7886   if (IsForDefinition)
7887     if (CGM.getTriple().isOSBinFormatMachO())
7888       Entry->setSection("__DATA,__objc_const");
7889 
7890   return Entry;
7891 }
7892 
7893 /* *** */
7894 
7895 CodeGen::CGObjCRuntime *
7896 CodeGen::CreateMacObjCRuntime(CodeGen::CodeGenModule &CGM) {
7897   switch (CGM.getLangOpts().ObjCRuntime.getKind()) {
7898   case ObjCRuntime::FragileMacOSX:
7899   return new CGObjCMac(CGM);
7900 
7901   case ObjCRuntime::MacOSX:
7902   case ObjCRuntime::iOS:
7903   case ObjCRuntime::WatchOS:
7904     return new CGObjCNonFragileABIMac(CGM);
7905 
7906   case ObjCRuntime::GNUstep:
7907   case ObjCRuntime::GCC:
7908   case ObjCRuntime::ObjFW:
7909     llvm_unreachable("these runtimes are not Mac runtimes");
7910   }
7911   llvm_unreachable("bad runtime");
7912 }
7913