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