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