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