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