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