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