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