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