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