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