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