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