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