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