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