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