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