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