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