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