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