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