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