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