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