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