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