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