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