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