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