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