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