CGObjCMac.cpp revision 62d5c1b5038cdaa4a887a03c37fe1e8d00166ea0
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 "CodeGenModule.h"
17#include "CodeGenFunction.h"
18#include "clang/AST/ASTContext.h"
19#include "clang/AST/Decl.h"
20#include "clang/AST/DeclObjC.h"
21#include "clang/Basic/LangOptions.h"
22
23#include "llvm/Module.h"
24#include "llvm/Support/IRBuilder.h"
25#include "llvm/Target/TargetData.h"
26#include <sstream>
27
28using namespace clang;
29using namespace CodeGen;
30
31namespace {
32
33  typedef std::vector<llvm::Constant*> ConstantVector;
34
35  // FIXME: We should find a nicer way to make the labels for
36  // metadata, string concatenation is lame.
37
38/// ObjCTypesHelper - Helper class that encapsulates lazy
39/// construction of varies types used during ObjC generation.
40class ObjCTypesHelper {
41private:
42  CodeGen::CodeGenModule &CGM;
43
44  llvm::Function *MessageSendFn, *MessageSendStretFn;
45  llvm::Function *MessageSendSuperFn, *MessageSendSuperStretFn;
46
47public:
48  const llvm::Type *ShortTy, *IntTy, *LongTy;
49  const llvm::Type *Int8PtrTy;
50
51  /// ObjectPtrTy - LLVM type for object handles (typeof(id))
52  const llvm::Type *ObjectPtrTy;
53  /// SelectorPtrTy - LLVM type for selector handles (typeof(SEL))
54  const llvm::Type *SelectorPtrTy;
55  /// ProtocolPtrTy - LLVM type for external protocol handles
56  /// (typeof(Protocol))
57  const llvm::Type *ExternalProtocolPtrTy;
58
59  // SuperCTy - clang type for struct objc_super.
60  QualType SuperCTy;
61  // SuperPtrCTy - clang type for struct objc_super *.
62  QualType SuperPtrCTy;
63
64  /// SuperTy - LLVM type for struct objc_super.
65  const llvm::StructType *SuperTy;
66  /// SuperPtrTy - LLVM type for struct objc_super *.
67  const llvm::Type *SuperPtrTy;
68
69  /// SymtabTy - LLVM type for struct objc_symtab.
70  const llvm::StructType *SymtabTy;
71  /// SymtabPtrTy - LLVM type for struct objc_symtab *.
72  const llvm::Type *SymtabPtrTy;
73  /// ModuleTy - LLVM type for struct objc_module.
74  const llvm::StructType *ModuleTy;
75
76  /// ProtocolTy - LLVM type for struct objc_protocol.
77  const llvm::StructType *ProtocolTy;
78  /// ProtocolPtrTy - LLVM type for struct objc_protocol *.
79  const llvm::Type *ProtocolPtrTy;
80  /// ProtocolExtensionTy - LLVM type for struct
81  /// objc_protocol_extension.
82  const llvm::StructType *ProtocolExtensionTy;
83  /// ProtocolExtensionTy - LLVM type for struct
84  /// objc_protocol_extension *.
85  const llvm::Type *ProtocolExtensionPtrTy;
86  /// MethodDescriptionTy - LLVM type for struct
87  /// objc_method_description.
88  const llvm::StructType *MethodDescriptionTy;
89  /// MethodDescriptionListTy - LLVM type for struct
90  /// objc_method_description_list.
91  const llvm::StructType *MethodDescriptionListTy;
92  /// MethodDescriptionListPtrTy - LLVM type for struct
93  /// objc_method_description_list *.
94  const llvm::Type *MethodDescriptionListPtrTy;
95  /// PropertyTy - LLVM type for struct objc_property (struct _prop_t
96  /// in GCC parlance).
97  const llvm::StructType *PropertyTy;
98  /// PropertyListTy - LLVM type for struct objc_property_list
99  /// (_prop_list_t in GCC parlance).
100  const llvm::StructType *PropertyListTy;
101  /// PropertyListPtrTy - LLVM type for struct objc_property_list*.
102  const llvm::Type *PropertyListPtrTy;
103  /// ProtocolListTy - LLVM type for struct objc_property_list.
104  const llvm::Type *ProtocolListTy;
105  /// ProtocolListPtrTy - LLVM type for struct objc_property_list*.
106  const llvm::Type *ProtocolListPtrTy;
107  /// CategoryTy - LLVM type for struct objc_category.
108  const llvm::StructType *CategoryTy;
109  /// ClassTy - LLVM type for struct objc_class.
110  const llvm::StructType *ClassTy;
111  /// ClassPtrTy - LLVM type for struct objc_class *.
112  const llvm::Type *ClassPtrTy;
113  /// ClassExtensionTy - LLVM type for struct objc_class_ext.
114  const llvm::StructType *ClassExtensionTy;
115  /// ClassExtensionPtrTy - LLVM type for struct objc_class_ext *.
116  const llvm::Type *ClassExtensionPtrTy;
117  /// CacheTy - LLVM type for struct objc_cache.
118  const llvm::Type *CacheTy;
119  /// CachePtrTy - LLVM type for struct objc_cache *.
120  const llvm::Type *CachePtrTy;
121  // IvarTy - LLVM type for struct objc_ivar.
122  const llvm::StructType *IvarTy;
123  /// IvarListTy - LLVM type for struct objc_ivar_list.
124  const llvm::Type *IvarListTy;
125  /// IvarListPtrTy - LLVM type for struct objc_ivar_list *.
126  const llvm::Type *IvarListPtrTy;
127  // MethodTy - LLVM type for struct objc_method.
128  const llvm::StructType *MethodTy;
129  /// MethodListTy - LLVM type for struct objc_method_list.
130  const llvm::Type *MethodListTy;
131  /// MethodListPtrTy - LLVM type for struct objc_method_list *.
132  const llvm::Type *MethodListPtrTy;
133
134  llvm::Function *EnumerationMutationFn;
135
136  /// ExceptionDataTy - LLVM type for struct _objc_exception_data.
137  const llvm::Type *ExceptionDataTy;
138
139  /// ExceptionThrowFn - LLVM objc_exception_throw function.
140  llvm::Function *ExceptionThrowFn;
141
142  /// ExceptionTryEnterFn - LLVM objc_exception_try_enter function.
143  llvm::Function *ExceptionTryEnterFn;
144
145  /// ExceptionTryExitFn - LLVM objc_exception_try_exit function.
146  llvm::Function *ExceptionTryExitFn;
147
148  /// ExceptionExtractFn - LLVM objc_exception_extract function.
149  llvm::Function *ExceptionExtractFn;
150
151  /// ExceptionMatchFn - LLVM objc_exception_match function.
152  llvm::Function *ExceptionMatchFn;
153
154  /// SetJmpFn - LLVM _setjmp function.
155  llvm::Function *SetJmpFn;
156
157public:
158  ObjCTypesHelper(CodeGen::CodeGenModule &cgm);
159  ~ObjCTypesHelper();
160
161  llvm::Constant *getMessageSendFn(bool IsSuper, bool isStret);
162};
163
164class CGObjCMac : public CodeGen::CGObjCRuntime {
165private:
166  CodeGen::CodeGenModule &CGM;
167  ObjCTypesHelper ObjCTypes;
168  /// ObjCABI - FIXME: Not sure yet.
169  unsigned ObjCABI;
170
171  /// LazySymbols - Symbols to generate a lazy reference for. See
172  /// DefinedSymbols and FinishModule().
173  std::set<IdentifierInfo*> LazySymbols;
174
175  /// DefinedSymbols - External symbols which are defined by this
176  /// module. The symbols in this list and LazySymbols are used to add
177  /// special linker symbols which ensure that Objective-C modules are
178  /// linked properly.
179  std::set<IdentifierInfo*> DefinedSymbols;
180
181  /// ClassNames - uniqued class names.
182  llvm::DenseMap<IdentifierInfo*, llvm::GlobalVariable*> ClassNames;
183
184  /// MethodVarNames - uniqued method variable names.
185  llvm::DenseMap<Selector, llvm::GlobalVariable*> MethodVarNames;
186
187  /// MethodVarTypes - uniqued method type signatures. We have to use
188  /// a StringMap here because have no other unique reference.
189  llvm::StringMap<llvm::GlobalVariable*> MethodVarTypes;
190
191  /// MethodDefinitions - map of methods which have been defined in
192  /// this translation unit.
193  llvm::DenseMap<const ObjCMethodDecl*, llvm::Function*> MethodDefinitions;
194
195  /// PropertyNames - uniqued method variable names.
196  llvm::DenseMap<IdentifierInfo*, llvm::GlobalVariable*> PropertyNames;
197
198  /// ClassReferences - uniqued class references.
199  llvm::DenseMap<IdentifierInfo*, llvm::GlobalVariable*> ClassReferences;
200
201  /// SelectorReferences - uniqued selector references.
202  llvm::DenseMap<Selector, llvm::GlobalVariable*> SelectorReferences;
203
204  /// Protocols - Protocols for which an objc_protocol structure has
205  /// been emitted. Forward declarations are handled by creating an
206  /// empty structure whose initializer is filled in when/if defined.
207  llvm::DenseMap<IdentifierInfo*, llvm::GlobalVariable*> Protocols;
208
209  /// DefinedClasses - List of defined classes.
210  std::vector<llvm::GlobalValue*> DefinedClasses;
211
212  /// DefinedCategories - List of defined categories.
213  std::vector<llvm::GlobalValue*> DefinedCategories;
214
215  /// UsedGlobals - List of globals to pack into the llvm.used metadata
216  /// to prevent them from being clobbered.
217  std::vector<llvm::GlobalVariable*> UsedGlobals;
218
219  /// EmitImageInfo - Emit the image info marker used to encode some module
220  /// level information.
221  void EmitImageInfo();
222
223  /// EmitModuleInfo - Another marker encoding module level
224  /// information.
225  void EmitModuleInfo();
226
227  /// EmitModuleSymols - Emit module symbols, the list of defined
228  /// classes and categories. The result has type SymtabPtrTy.
229  llvm::Constant *EmitModuleSymbols();
230
231  /// FinishModule - Write out global data structures at the end of
232  /// processing a translation unit.
233  void FinishModule();
234
235  /// EmitClassExtension - Generate the class extension structure used
236  /// to store the weak ivar layout and properties. The return value
237  /// has type ClassExtensionPtrTy.
238  llvm::Constant *EmitClassExtension(const ObjCImplementationDecl *ID);
239
240  /// EmitClassRef - Return a Value*, of type ObjCTypes.ClassPtrTy,
241  /// for the given class.
242  llvm::Value *EmitClassRef(llvm::IRBuilder<> &Builder,
243                            const ObjCInterfaceDecl *ID);
244
245  CodeGen::RValue EmitMessageSend(CodeGen::CodeGenFunction &CGF,
246                                  QualType ResultType,
247                                  Selector Sel,
248                                  llvm::Value *Arg0,
249                                  QualType Arg0Ty,
250                                  bool IsSuper,
251                                  const CallArgList &CallArgs);
252
253  /// EmitIvarList - Emit the ivar list for the given
254  /// implementation. If ForClass is true the list of class ivars
255  /// (i.e. metaclass ivars) is emitted, otherwise the list of
256  /// interface ivars will be emitted. The return value has type
257  /// IvarListPtrTy.
258  llvm::Constant *EmitIvarList(const ObjCImplementationDecl *ID,
259                               bool ForClass,
260                               const llvm::Type *InterfaceTy);
261
262  /// EmitMetaClass - Emit a forward reference to the class structure
263  /// for the metaclass of the given interface. The return value has
264  /// type ClassPtrTy.
265  llvm::Constant *EmitMetaClassRef(const ObjCInterfaceDecl *ID);
266
267  /// EmitMetaClass - Emit a class structure for the metaclass of the
268  /// given implementation. The return value has type ClassPtrTy.
269  llvm::Constant *EmitMetaClass(const ObjCImplementationDecl *ID,
270                                llvm::Constant *Protocols,
271                                const llvm::Type *InterfaceTy,
272                                const ConstantVector &Methods);
273
274  llvm::Constant *GetMethodConstant(const ObjCMethodDecl *MD);
275
276  llvm::Constant *GetMethodDescriptionConstant(const ObjCMethodDecl *MD);
277
278  /// EmitMethodList - Emit the method list for the given
279  /// implementation. The return value has type MethodListPtrTy.
280  llvm::Constant *EmitMethodList(const std::string &Name,
281                                 const char *Section,
282                                 const ConstantVector &Methods);
283
284  /// EmitMethodDescList - Emit a method description list for a list of
285  /// method declarations.
286  ///  - TypeName: The name for the type containing the methods.
287  ///  - IsProtocol: True iff these methods are for a protocol.
288  ///  - ClassMethds: True iff these are class methods.
289  ///  - Required: When true, only "required" methods are
290  ///    listed. Similarly, when false only "optional" methods are
291  ///    listed. For classes this should always be true.
292  ///  - begin, end: The method list to output.
293  ///
294  /// The return value has type MethodDescriptionListPtrTy.
295  llvm::Constant *EmitMethodDescList(const std::string &Name,
296                                     const char *Section,
297                                     const ConstantVector &Methods);
298
299  /// EmitPropertyList - Emit the given property list. The return
300  /// value has type PropertyListPtrTy.
301  llvm::Constant *EmitPropertyList(const std::string &Name,
302                                   const Decl *Container,
303                                   ObjCPropertyDecl * const *begin,
304                                   ObjCPropertyDecl * const *end);
305
306  /// EmitProtocolExtension - Generate the protocol extension
307  /// structure used to store optional instance and class methods, and
308  /// protocol properties. The return value has type
309  /// ProtocolExtensionPtrTy.
310  llvm::Constant *
311  EmitProtocolExtension(const ObjCProtocolDecl *PD,
312                        const ConstantVector &OptInstanceMethods,
313                        const ConstantVector &OptClassMethods);
314
315  /// EmitProtocolList - Generate the list of referenced
316  /// protocols. The return value has type ProtocolListPtrTy.
317  llvm::Constant *EmitProtocolList(const std::string &Name,
318                                   ObjCProtocolDecl::protocol_iterator begin,
319                                   ObjCProtocolDecl::protocol_iterator end);
320
321  /// EmitSelector - Return a Value*, of type ObjCTypes.SelectorPtrTy,
322  /// for the given selector.
323  llvm::Value *EmitSelector(llvm::IRBuilder<> &Builder, Selector Sel);
324
325  /// GetProtocolRef - Return a reference to the internal protocol
326  /// description, creating an empty one if it has not been
327  /// defined. The return value has type pointer-to ProtocolTy.
328  llvm::GlobalVariable *GetProtocolRef(const ObjCProtocolDecl *PD);
329
330  /// GetClassName - Return a unique constant for the given selector's
331  /// name. The return value has type char *.
332  llvm::Constant *GetClassName(IdentifierInfo *Ident);
333
334  /// GetMethodVarName - Return a unique constant for the given
335  /// selector's name. The return value has type char *.
336  llvm::Constant *GetMethodVarName(Selector Sel);
337  llvm::Constant *GetMethodVarName(IdentifierInfo *Ident);
338  llvm::Constant *GetMethodVarName(const std::string &Name);
339
340  /// GetMethodVarType - Return a unique constant for the given
341  /// selector's name. The return value has type char *.
342
343  // FIXME: This is a horrible name.
344  llvm::Constant *GetMethodVarType(const ObjCMethodDecl *D);
345  llvm::Constant *GetMethodVarType(const std::string &Name);
346
347  /// GetPropertyName - Return a unique constant for the given
348  /// name. The return value has type char *.
349  llvm::Constant *GetPropertyName(IdentifierInfo *Ident);
350
351  // FIXME: This can be dropped once string functions are unified.
352  llvm::Constant *GetPropertyTypeString(const ObjCPropertyDecl *PD,
353                                        const Decl *Container);
354
355  /// GetNameForMethod - Return a name for the given method.
356  /// \param[out] NameOut - The return value.
357  void GetNameForMethod(const ObjCMethodDecl *OMD,
358                        std::string &NameOut);
359
360public:
361  CGObjCMac(CodeGen::CodeGenModule &cgm);
362  virtual llvm::Constant *GenerateConstantString(const std::string &String);
363
364  virtual CodeGen::RValue GenerateMessageSend(CodeGen::CodeGenFunction &CGF,
365                                              QualType ResultType,
366                                              Selector Sel,
367                                              llvm::Value *Receiver,
368                                              bool IsClassMessage,
369                                              const CallArgList &CallArgs);
370
371  virtual CodeGen::RValue
372  GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF,
373                           QualType ResultType,
374                           Selector Sel,
375                           const ObjCInterfaceDecl *Class,
376                           llvm::Value *Receiver,
377                           bool IsClassMessage,
378                           const CallArgList &CallArgs);
379
380  virtual llvm::Value *GetClass(llvm::IRBuilder<> &Builder,
381                                const ObjCInterfaceDecl *ID);
382
383  virtual llvm::Value *GetSelector(llvm::IRBuilder<> &Builder, Selector Sel);
384
385  virtual llvm::Function *GenerateMethod(const ObjCMethodDecl *OMD);
386
387  virtual void GenerateCategory(const ObjCCategoryImplDecl *CMD);
388
389  virtual void GenerateClass(const ObjCImplementationDecl *ClassDecl);
390
391  virtual llvm::Value *GenerateProtocolRef(llvm::IRBuilder<> &Builder,
392                                           const ObjCProtocolDecl *PD);
393
394  virtual void GenerateProtocol(const ObjCProtocolDecl *PD);
395
396  virtual llvm::Function *ModuleInitFunction();
397  virtual llvm::Function *EnumerationMutationFunction();
398
399  virtual void EmitTryStmt(CodeGen::CodeGenFunction &CGF,
400                           const ObjCAtTryStmt &S);
401  virtual void EmitThrowStmt(CodeGen::CodeGenFunction &CGF,
402                             const ObjCAtThrowStmt &S);
403
404};
405} // end anonymous namespace
406
407/* *** Helper Functions *** */
408
409/// getConstantGEP() - Help routine to construct simple GEPs.
410static llvm::Constant *getConstantGEP(llvm::Constant *C,
411                                      unsigned idx0,
412                                      unsigned idx1) {
413  llvm::Value *Idxs[] = {
414    llvm::ConstantInt::get(llvm::Type::Int32Ty, idx0),
415    llvm::ConstantInt::get(llvm::Type::Int32Ty, idx1)
416  };
417  return llvm::ConstantExpr::getGetElementPtr(C, Idxs, 2);
418}
419
420/* *** CGObjCMac Public Interface *** */
421
422CGObjCMac::CGObjCMac(CodeGen::CodeGenModule &cgm)
423  : CGM(cgm),
424    ObjCTypes(cgm),
425    ObjCABI(1)
426{
427  // FIXME: How does this get set in GCC? And what does it even mean?
428  if (ObjCTypes.LongTy != CGM.getTypes().ConvertType(CGM.getContext().IntTy))
429      ObjCABI = 2;
430
431  EmitImageInfo();
432}
433
434/// GetClass - Return a reference to the class for the given interface
435/// decl.
436llvm::Value *CGObjCMac::GetClass(llvm::IRBuilder<> &Builder,
437                                 const ObjCInterfaceDecl *ID) {
438  return EmitClassRef(Builder, ID);
439}
440
441/// GetSelector - Return the pointer to the unique'd string for this selector.
442llvm::Value *CGObjCMac::GetSelector(llvm::IRBuilder<> &Builder, Selector Sel) {
443  return EmitSelector(Builder, Sel);
444}
445
446/// Generate a constant CFString object.
447/*
448   struct __builtin_CFString {
449     const int *isa; // point to __CFConstantStringClassReference
450     int flags;
451     const char *str;
452     long length;
453   };
454*/
455
456llvm::Constant *CGObjCMac::GenerateConstantString(const std::string &String) {
457  return CGM.GetAddrOfConstantCFString(String);
458}
459
460/// Generates a message send where the super is the receiver.  This is
461/// a message send to self with special delivery semantics indicating
462/// which class's method should be called.
463CodeGen::RValue
464CGObjCMac::GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF,
465                                    QualType ResultType,
466                                    Selector Sel,
467                                    const ObjCInterfaceDecl *Class,
468                                    llvm::Value *Receiver,
469                                    bool IsClassMessage,
470                                    const CodeGen::CallArgList &CallArgs) {
471  // Create and init a super structure; this is a (receiver, class)
472  // pair we will pass to objc_msgSendSuper.
473  llvm::Value *ObjCSuper =
474    CGF.Builder.CreateAlloca(ObjCTypes.SuperTy, 0, "objc_super");
475  llvm::Value *ReceiverAsObject =
476    CGF.Builder.CreateBitCast(Receiver, ObjCTypes.ObjectPtrTy);
477  CGF.Builder.CreateStore(ReceiverAsObject,
478                          CGF.Builder.CreateStructGEP(ObjCSuper, 0));
479
480  // If this is a class message the metaclass is passed as the target.
481  llvm::Value *Target;
482  if (IsClassMessage) {
483    llvm::Value *MetaClassPtr = EmitMetaClassRef(Class);
484    llvm::Value *SuperPtr = CGF.Builder.CreateStructGEP(MetaClassPtr, 1);
485    llvm::Value *Super = CGF.Builder.CreateLoad(SuperPtr);
486    Target = Super;
487  } else {
488    Target = EmitClassRef(CGF.Builder, Class->getSuperClass());
489  }
490  // FIXME: We shouldn't need to do this cast, rectify the ASTContext
491  // and ObjCTypes types.
492  const llvm::Type *ClassTy =
493    CGM.getTypes().ConvertType(CGF.getContext().getObjCClassType());
494  Target = CGF.Builder.CreateBitCast(Target, ClassTy);
495  CGF.Builder.CreateStore(Target,
496                          CGF.Builder.CreateStructGEP(ObjCSuper, 1));
497
498  return EmitMessageSend(CGF, ResultType, Sel,
499                         ObjCSuper, ObjCTypes.SuperPtrCTy,
500                         true, CallArgs);
501}
502
503/// Generate code for a message send expression.
504CodeGen::RValue CGObjCMac::GenerateMessageSend(CodeGen::CodeGenFunction &CGF,
505                                               QualType ResultType,
506                                               Selector Sel,
507                                               llvm::Value *Receiver,
508                                               bool IsClassMessage,
509                                               const CallArgList &CallArgs) {
510  llvm::Value *Arg0 =
511    CGF.Builder.CreateBitCast(Receiver, ObjCTypes.ObjectPtrTy, "tmp");
512  return EmitMessageSend(CGF, ResultType, Sel,
513                         Arg0, CGF.getContext().getObjCIdType(),
514                         false, CallArgs);
515}
516
517CodeGen::RValue CGObjCMac::EmitMessageSend(CodeGen::CodeGenFunction &CGF,
518                                           QualType ResultType,
519                                           Selector Sel,
520                                           llvm::Value *Arg0,
521                                           QualType Arg0Ty,
522                                           bool IsSuper,
523                                           const CallArgList &CallArgs) {
524  CallArgList ActualArgs;
525  ActualArgs.push_back(std::make_pair(RValue::get(Arg0), Arg0Ty));
526  ActualArgs.push_back(std::make_pair(RValue::get(EmitSelector(CGF.Builder,
527                                                               Sel)),
528                                      CGF.getContext().getObjCSelType()));
529  ActualArgs.insert(ActualArgs.end(), CallArgs.begin(), CallArgs.end());
530
531  const llvm::FunctionType *FTy =
532    CGM.getTypes().GetFunctionType(CGCallInfo(ResultType, ActualArgs),
533                                   false);
534  llvm::Constant *Fn =
535    ObjCTypes.getMessageSendFn(IsSuper, CGM.ReturnTypeUsesSret(ResultType));
536  Fn = llvm::ConstantExpr::getBitCast(Fn, llvm::PointerType::getUnqual(FTy));
537  return CGF.EmitCall(Fn, ResultType, ActualArgs);
538}
539
540llvm::Value *CGObjCMac::GenerateProtocolRef(llvm::IRBuilder<> &Builder,
541                                            const ObjCProtocolDecl *PD) {
542  // FIXME: I don't understand why gcc generates this, or where it is
543  // resolved. Investigate. Its also wasteful to look this up over and
544  // over.
545  LazySymbols.insert(&CGM.getContext().Idents.get("Protocol"));
546
547  return llvm::ConstantExpr::getBitCast(GetProtocolRef(PD),
548                                        ObjCTypes.ExternalProtocolPtrTy);
549}
550
551/*
552     // APPLE LOCAL radar 4585769 - Objective-C 1.0 extensions
553  struct _objc_protocol {
554    struct _objc_protocol_extension *isa;
555    char *protocol_name;
556    struct _objc_protocol_list *protocol_list;
557    struct _objc__method_prototype_list *instance_methods;
558    struct _objc__method_prototype_list *class_methods
559  };
560
561  See EmitProtocolExtension().
562*/
563void CGObjCMac::GenerateProtocol(const ObjCProtocolDecl *PD) {
564  // FIXME: I don't understand why gcc generates this, or where it is
565  // resolved. Investigate. Its also wasteful to look this up over and
566  // over.
567  LazySymbols.insert(&CGM.getContext().Idents.get("Protocol"));
568
569  const char *ProtocolName = PD->getName();
570
571  // Construct method lists.
572  std::vector<llvm::Constant*> InstanceMethods, ClassMethods;
573  std::vector<llvm::Constant*> OptInstanceMethods, OptClassMethods;
574  for (ObjCProtocolDecl::instmeth_iterator i = PD->instmeth_begin(),
575         e = PD->instmeth_end(); i != e; ++i) {
576    ObjCMethodDecl *MD = *i;
577    llvm::Constant *C = GetMethodDescriptionConstant(MD);
578    if (MD->getImplementationControl() == ObjCMethodDecl::Optional) {
579      OptInstanceMethods.push_back(C);
580    } else {
581      InstanceMethods.push_back(C);
582    }
583  }
584
585  for (ObjCProtocolDecl::classmeth_iterator i = PD->classmeth_begin(),
586         e = PD->classmeth_end(); i != e; ++i) {
587    ObjCMethodDecl *MD = *i;
588    llvm::Constant *C = GetMethodDescriptionConstant(MD);
589    if (MD->getImplementationControl() == ObjCMethodDecl::Optional) {
590      OptClassMethods.push_back(C);
591    } else {
592      ClassMethods.push_back(C);
593    }
594  }
595
596  std::vector<llvm::Constant*> Values(5);
597  Values[0] = EmitProtocolExtension(PD, OptInstanceMethods, OptClassMethods);
598  Values[1] = GetClassName(PD->getIdentifier());
599  Values[2] =
600    EmitProtocolList(std::string("\01L_OBJC_PROTOCOL_REFS_")+PD->getName(),
601                     PD->protocol_begin(),
602                     PD->protocol_end());
603  Values[3] =
604    EmitMethodDescList(std::string("\01L_OBJC_PROTOCOL_INSTANCE_METHODS_")
605                       + PD->getName(),
606                       "__OBJC,__cat_inst_meth,regular,no_dead_strip",
607                       InstanceMethods);
608  Values[4] =
609    EmitMethodDescList(std::string("\01L_OBJC_PROTOCOL_CLASS_METHODS_")
610                       + PD->getName(),
611                       "__OBJC,__cat_cls_meth,regular,no_dead_strip",
612                       ClassMethods);
613  llvm::Constant *Init = llvm::ConstantStruct::get(ObjCTypes.ProtocolTy,
614                                                   Values);
615
616  llvm::GlobalVariable *&Entry = Protocols[PD->getIdentifier()];
617  if (Entry) {
618    // Already created, just update the initializer
619    Entry->setInitializer(Init);
620  } else {
621    Entry =
622      new llvm::GlobalVariable(ObjCTypes.ProtocolTy, false,
623                               llvm::GlobalValue::InternalLinkage,
624                               Init,
625                               std::string("\01L_OBJC_PROTOCOL_")+ProtocolName,
626                               &CGM.getModule());
627    Entry->setSection("__OBJC,__protocol,regular,no_dead_strip");
628    UsedGlobals.push_back(Entry);
629    // FIXME: Is this necessary? Why only for protocol?
630    Entry->setAlignment(4);
631  }
632}
633
634llvm::GlobalVariable *CGObjCMac::GetProtocolRef(const ObjCProtocolDecl *PD) {
635  llvm::GlobalVariable *&Entry = Protocols[PD->getIdentifier()];
636
637  if (!Entry) {
638    std::vector<llvm::Constant*> Values(5);
639    Values[0] = llvm::Constant::getNullValue(ObjCTypes.ProtocolExtensionPtrTy);
640    Values[1] = GetClassName(PD->getIdentifier());
641    Values[2] = llvm::Constant::getNullValue(ObjCTypes.ProtocolListPtrTy);
642    Values[3] = Values[4] =
643      llvm::Constant::getNullValue(ObjCTypes.MethodDescriptionListPtrTy);
644    llvm::Constant *Init = llvm::ConstantStruct::get(ObjCTypes.ProtocolTy,
645                                                     Values);
646
647    Entry =
648      new llvm::GlobalVariable(ObjCTypes.ProtocolTy, false,
649                               llvm::GlobalValue::InternalLinkage,
650                               Init,
651                               std::string("\01L_OBJC_PROTOCOL_")+PD->getName(),
652                               &CGM.getModule());
653    Entry->setSection("__OBJC,__protocol,regular,no_dead_strip");
654    UsedGlobals.push_back(Entry);
655    // FIXME: Is this necessary? Why only for protocol?
656    Entry->setAlignment(4);
657  }
658
659  return Entry;
660}
661
662/*
663  struct _objc_protocol_extension {
664    uint32_t size;
665    struct objc_method_description_list *optional_instance_methods;
666    struct objc_method_description_list *optional_class_methods;
667    struct objc_property_list *instance_properties;
668  };
669*/
670llvm::Constant *
671CGObjCMac::EmitProtocolExtension(const ObjCProtocolDecl *PD,
672                                 const ConstantVector &OptInstanceMethods,
673                                 const ConstantVector &OptClassMethods) {
674  uint64_t Size =
675    CGM.getTargetData().getABITypeSize(ObjCTypes.ProtocolExtensionTy);
676  std::vector<llvm::Constant*> Values(4);
677  Values[0] = llvm::ConstantInt::get(ObjCTypes.IntTy, Size);
678  Values[1] =
679    EmitMethodDescList(std::string("\01L_OBJC_PROTOCOL_INSTANCE_METHODS_OPT_")
680                       + PD->getName(),
681                       "__OBJC,__cat_inst_meth,regular,no_dead_strip",
682                       OptInstanceMethods);
683  Values[2] =
684    EmitMethodDescList(std::string("\01L_OBJC_PROTOCOL_CLASS_METHODS_OPT_")
685                       + PD->getName(),
686                       "__OBJC,__cat_cls_meth,regular,no_dead_strip",
687                       OptClassMethods);
688  Values[3] = EmitPropertyList(std::string("\01L_OBJC_$_PROP_PROTO_LIST_") +
689                               PD->getName(),
690                               0,
691                               PD->classprop_begin(),
692                               PD->classprop_end());
693
694  // Return null if no extension bits are used.
695  if (Values[1]->isNullValue() && Values[2]->isNullValue() &&
696      Values[3]->isNullValue())
697    return llvm::Constant::getNullValue(ObjCTypes.ProtocolExtensionPtrTy);
698
699  llvm::Constant *Init =
700    llvm::ConstantStruct::get(ObjCTypes.ProtocolExtensionTy, Values);
701  llvm::GlobalVariable *GV =
702      new llvm::GlobalVariable(ObjCTypes.ProtocolExtensionTy, false,
703                               llvm::GlobalValue::InternalLinkage,
704                               Init,
705                               (std::string("\01L_OBJC_PROTOCOLEXT_") +
706                                PD->getName()),
707                               &CGM.getModule());
708  // No special section, but goes in llvm.used
709  UsedGlobals.push_back(GV);
710
711  return GV;
712}
713
714/*
715  struct objc_protocol_list {
716    struct objc_protocol_list *next;
717    long count;
718    Protocol *list[];
719  };
720*/
721llvm::Constant *
722CGObjCMac::EmitProtocolList(const std::string &Name,
723                            ObjCProtocolDecl::protocol_iterator begin,
724                            ObjCProtocolDecl::protocol_iterator end) {
725  std::vector<llvm::Constant*> ProtocolRefs;
726
727  for (; begin != end; ++begin)
728    ProtocolRefs.push_back(GetProtocolRef(*begin));
729
730  // Just return null for empty protocol lists
731  if (ProtocolRefs.empty())
732    return llvm::Constant::getNullValue(ObjCTypes.ProtocolListPtrTy);
733
734  // This list is null terminated.
735  ProtocolRefs.push_back(llvm::Constant::getNullValue(ObjCTypes.ProtocolPtrTy));
736
737  std::vector<llvm::Constant*> Values(3);
738  // This field is only used by the runtime.
739  Values[0] = llvm::Constant::getNullValue(ObjCTypes.ProtocolListPtrTy);
740  Values[1] = llvm::ConstantInt::get(ObjCTypes.LongTy, ProtocolRefs.size() - 1);
741  Values[2] =
742    llvm::ConstantArray::get(llvm::ArrayType::get(ObjCTypes.ProtocolPtrTy,
743                                                  ProtocolRefs.size()),
744                             ProtocolRefs);
745
746  llvm::Constant *Init = llvm::ConstantStruct::get(Values);
747  llvm::GlobalVariable *GV =
748    new llvm::GlobalVariable(Init->getType(), false,
749                             llvm::GlobalValue::InternalLinkage,
750                             Init,
751                             Name,
752                             &CGM.getModule());
753  GV->setSection("__OBJC,__cat_cls_meth,regular,no_dead_strip");
754  return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.ProtocolListPtrTy);
755}
756
757/*
758  struct _objc_property {
759    const char * const name;
760    const char * const attributes;
761  };
762
763  struct _objc_property_list {
764    uint32_t entsize; // sizeof (struct _objc_property)
765    uint32_t prop_count;
766    struct _objc_property[prop_count];
767  };
768*/
769llvm::Constant *CGObjCMac::EmitPropertyList(const std::string &Name,
770                                            const Decl *Container,
771                                            ObjCPropertyDecl * const *begin,
772                                            ObjCPropertyDecl * const *end) {
773  std::vector<llvm::Constant*> Properties, Prop(2);
774  for (; begin != end; ++begin) {
775    const ObjCPropertyDecl *PD = *begin;
776    Prop[0] = GetPropertyName(PD->getIdentifier());
777    Prop[1] = GetPropertyTypeString(PD, Container);
778    Properties.push_back(llvm::ConstantStruct::get(ObjCTypes.PropertyTy,
779                                                   Prop));
780  }
781
782  // Return null for empty list.
783  if (Properties.empty())
784    return llvm::Constant::getNullValue(ObjCTypes.PropertyListPtrTy);
785
786  unsigned PropertySize =
787    CGM.getTargetData().getABITypeSize(ObjCTypes.PropertyTy);
788  std::vector<llvm::Constant*> Values(3);
789  Values[0] = llvm::ConstantInt::get(ObjCTypes.IntTy, PropertySize);
790  Values[1] = llvm::ConstantInt::get(ObjCTypes.IntTy, Properties.size());
791  llvm::ArrayType *AT = llvm::ArrayType::get(ObjCTypes.PropertyTy,
792                                             Properties.size());
793  Values[2] = llvm::ConstantArray::get(AT, Properties);
794  llvm::Constant *Init = llvm::ConstantStruct::get(Values);
795
796  llvm::GlobalVariable *GV =
797    new llvm::GlobalVariable(Init->getType(), false,
798                             llvm::GlobalValue::InternalLinkage,
799                             Init,
800                             Name,
801                             &CGM.getModule());
802  // No special section on property lists?
803  UsedGlobals.push_back(GV);
804  return llvm::ConstantExpr::getBitCast(GV,
805                                        ObjCTypes.PropertyListPtrTy);
806
807}
808
809/*
810  struct objc_method_description_list {
811    int count;
812    struct objc_method_description list[];
813  };
814*/
815llvm::Constant *
816CGObjCMac::GetMethodDescriptionConstant(const ObjCMethodDecl *MD) {
817  std::vector<llvm::Constant*> Desc(2);
818  Desc[0] = llvm::ConstantExpr::getBitCast(GetMethodVarName(MD->getSelector()),
819                                           ObjCTypes.SelectorPtrTy);
820  Desc[1] = GetMethodVarType(MD);
821  return llvm::ConstantStruct::get(ObjCTypes.MethodDescriptionTy,
822                                   Desc);
823}
824
825llvm::Constant *CGObjCMac::EmitMethodDescList(const std::string &Name,
826                                              const char *Section,
827                                              const ConstantVector &Methods) {
828  // Return null for empty list.
829  if (Methods.empty())
830    return llvm::Constant::getNullValue(ObjCTypes.MethodDescriptionListPtrTy);
831
832  std::vector<llvm::Constant*> Values(2);
833  Values[0] = llvm::ConstantInt::get(ObjCTypes.IntTy, Methods.size());
834  llvm::ArrayType *AT = llvm::ArrayType::get(ObjCTypes.MethodDescriptionTy,
835                                             Methods.size());
836  Values[1] = llvm::ConstantArray::get(AT, Methods);
837  llvm::Constant *Init = llvm::ConstantStruct::get(Values);
838
839  llvm::GlobalVariable *GV =
840    new llvm::GlobalVariable(Init->getType(), false,
841                             llvm::GlobalValue::InternalLinkage,
842                             Init, Name, &CGM.getModule());
843  GV->setSection(Section);
844  UsedGlobals.push_back(GV);
845  return llvm::ConstantExpr::getBitCast(GV,
846                                        ObjCTypes.MethodDescriptionListPtrTy);
847}
848
849/*
850  struct _objc_category {
851    char *category_name;
852    char *class_name;
853    struct _objc_method_list *instance_methods;
854    struct _objc_method_list *class_methods;
855    struct _objc_protocol_list *protocols;
856    uint32_t size; // <rdar://4585769>
857    struct _objc_property_list *instance_properties;
858  };
859 */
860void CGObjCMac::GenerateCategory(const ObjCCategoryImplDecl *OCD) {
861  unsigned Size = CGM.getTargetData().getABITypeSize(ObjCTypes.CategoryTy);
862
863  // FIXME: This is poor design, the OCD should have a pointer to the
864  // category decl. Additionally, note that Category can be null for
865  // the @implementation w/o an @interface case. Sema should just
866  // create one for us as it does for @implementation so everyone else
867  // can live life under a clear blue sky.
868  const ObjCInterfaceDecl *Interface = OCD->getClassInterface();
869  const ObjCCategoryDecl *Category =
870    Interface->FindCategoryDeclaration(OCD->getIdentifier());
871  std::string ExtName(std::string(Interface->getName()) +
872                      "_" +
873                      OCD->getName());
874
875  std::vector<llvm::Constant*> InstanceMethods, ClassMethods;
876  for (ObjCCategoryImplDecl::instmeth_iterator i = OCD->instmeth_begin(),
877         e = OCD->instmeth_end(); i != e; ++i) {
878    // Instance methods should always be defined.
879    InstanceMethods.push_back(GetMethodConstant(*i));
880  }
881  for (ObjCCategoryImplDecl::classmeth_iterator i = OCD->classmeth_begin(),
882         e = OCD->classmeth_end(); i != e; ++i) {
883    // Class methods should always be defined.
884    ClassMethods.push_back(GetMethodConstant(*i));
885  }
886
887  std::vector<llvm::Constant*> Values(7);
888  Values[0] = GetClassName(OCD->getIdentifier());
889  Values[1] = GetClassName(Interface->getIdentifier());
890  Values[2] =
891    EmitMethodList(std::string("\01L_OBJC_CATEGORY_INSTANCE_METHODS_") +
892                   ExtName,
893                   "__OBJC,__cat_inst_meth,regular,no_dead_strip",
894                   InstanceMethods);
895  Values[3] =
896    EmitMethodList(std::string("\01L_OBJC_CATEGORY_CLASS_METHODS_") + ExtName,
897                   "__OBJC,__cat_class_meth,regular,no_dead_strip",
898                   ClassMethods);
899  if (Category) {
900    Values[4] =
901      EmitProtocolList(std::string("\01L_OBJC_CATEGORY_PROTOCOLS_") + ExtName,
902                       Category->protocol_begin(),
903                       Category->protocol_end());
904  } else {
905    Values[4] = llvm::Constant::getNullValue(ObjCTypes.ProtocolListPtrTy);
906  }
907  Values[5] = llvm::ConstantInt::get(ObjCTypes.IntTy, Size);
908
909  // If there is no category @interface then there can be no properties.
910  if (Category) {
911    Values[6] = EmitPropertyList(std::string("\01L_OBJC_$_PROP_LIST_") + ExtName,
912                                 OCD,
913                                 Category->classprop_begin(),
914                                 Category->classprop_end());
915  } else {
916    Values[6] = llvm::Constant::getNullValue(ObjCTypes.PropertyListPtrTy);
917  }
918
919  llvm::Constant *Init = llvm::ConstantStruct::get(ObjCTypes.CategoryTy,
920                                                   Values);
921
922  llvm::GlobalVariable *GV =
923    new llvm::GlobalVariable(ObjCTypes.CategoryTy, false,
924                             llvm::GlobalValue::InternalLinkage,
925                             Init,
926                             std::string("\01L_OBJC_CATEGORY_")+ExtName,
927                             &CGM.getModule());
928  GV->setSection("__OBJC,__category,regular,no_dead_strip");
929  UsedGlobals.push_back(GV);
930  DefinedCategories.push_back(GV);
931}
932
933// FIXME: Get from somewhere?
934enum ClassFlags {
935  eClassFlags_Factory              = 0x00001,
936  eClassFlags_Meta                 = 0x00002,
937  // <rdr://5142207>
938  eClassFlags_HasCXXStructors      = 0x02000,
939  eClassFlags_Hidden               = 0x20000,
940  eClassFlags_ABI2_Hidden          = 0x00010,
941  eClassFlags_ABI2_HasCXXStructors = 0x00004   // <rdr://4923634>
942};
943
944// <rdr://5142207&4705298&4843145>
945static bool IsClassHidden(const ObjCInterfaceDecl *ID) {
946  if (const VisibilityAttr *attr = ID->getAttr<VisibilityAttr>()) {
947    // FIXME: Support -fvisibility
948    switch (attr->getVisibility()) {
949    default:
950      assert(0 && "Unknown visibility");
951      return false;
952    case VisibilityAttr::DefaultVisibility:
953    case VisibilityAttr::ProtectedVisibility:  // FIXME: What do we do here?
954      return false;
955    case VisibilityAttr::HiddenVisibility:
956      return true;
957    }
958  } else {
959    return false; // FIXME: Support -fvisibility
960  }
961}
962
963/*
964  struct _objc_class {
965    Class isa;
966    Class super_class;
967    const char *name;
968    long version;
969    long info;
970    long instance_size;
971    struct _objc_ivar_list *ivars;
972    struct _objc_method_list *methods;
973    struct _objc_cache *cache;
974    struct _objc_protocol_list *protocols;
975    // Objective-C 1.0 extensions (<rdr://4585769>)
976    const char *ivar_layout;
977    struct _objc_class_ext *ext;
978  };
979
980  See EmitClassExtension();
981 */
982void CGObjCMac::GenerateClass(const ObjCImplementationDecl *ID) {
983  DefinedSymbols.insert(ID->getIdentifier());
984
985  const char *ClassName = ID->getName();
986  // FIXME: Gross
987  ObjCInterfaceDecl *Interface =
988    const_cast<ObjCInterfaceDecl*>(ID->getClassInterface());
989  llvm::Constant *Protocols =
990    EmitProtocolList(std::string("\01L_OBJC_CLASS_PROTOCOLS_") + ID->getName(),
991                     Interface->protocol_begin(),
992                     Interface->protocol_end());
993  const llvm::Type *InterfaceTy =
994   CGM.getTypes().ConvertType(CGM.getContext().getObjCInterfaceType(Interface));
995  unsigned Flags = eClassFlags_Factory;
996  unsigned Size = CGM.getTargetData().getABITypeSize(InterfaceTy);
997
998  // FIXME: Set CXX-structors flag.
999  if (IsClassHidden(ID->getClassInterface()))
1000    Flags |= eClassFlags_Hidden;
1001
1002  std::vector<llvm::Constant*> InstanceMethods, ClassMethods;
1003  for (ObjCImplementationDecl::instmeth_iterator i = ID->instmeth_begin(),
1004         e = ID->instmeth_end(); i != e; ++i) {
1005    // Instance methods should always be defined.
1006    InstanceMethods.push_back(GetMethodConstant(*i));
1007  }
1008  for (ObjCImplementationDecl::classmeth_iterator i = ID->classmeth_begin(),
1009         e = ID->classmeth_end(); i != e; ++i) {
1010    // Class methods should always be defined.
1011    ClassMethods.push_back(GetMethodConstant(*i));
1012  }
1013
1014  for (ObjCImplementationDecl::propimpl_iterator i = ID->propimpl_begin(),
1015         e = ID->propimpl_end(); i != e; ++i) {
1016    ObjCPropertyImplDecl *PID = *i;
1017
1018    if (PID->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize) {
1019      ObjCPropertyDecl *PD = PID->getPropertyDecl();
1020
1021      if (ObjCMethodDecl *MD = PD->getGetterMethodDecl())
1022        if (llvm::Constant *C = GetMethodConstant(MD))
1023          InstanceMethods.push_back(C);
1024      if (ObjCMethodDecl *MD = PD->getSetterMethodDecl())
1025        if (llvm::Constant *C = GetMethodConstant(MD))
1026          InstanceMethods.push_back(C);
1027    }
1028  }
1029
1030  std::vector<llvm::Constant*> Values(12);
1031  Values[ 0] = EmitMetaClass(ID, Protocols, InterfaceTy, ClassMethods);
1032  if (ObjCInterfaceDecl *Super = Interface->getSuperClass()) {
1033    // Record a reference to the super class.
1034    LazySymbols.insert(Super->getIdentifier());
1035
1036    Values[ 1] =
1037      llvm::ConstantExpr::getBitCast(GetClassName(Super->getIdentifier()),
1038                                     ObjCTypes.ClassPtrTy);
1039  } else {
1040    Values[ 1] = llvm::Constant::getNullValue(ObjCTypes.ClassPtrTy);
1041  }
1042  Values[ 2] = GetClassName(ID->getIdentifier());
1043  // Version is always 0.
1044  Values[ 3] = llvm::ConstantInt::get(ObjCTypes.LongTy, 0);
1045  Values[ 4] = llvm::ConstantInt::get(ObjCTypes.LongTy, Flags);
1046  Values[ 5] = llvm::ConstantInt::get(ObjCTypes.LongTy, Size);
1047  Values[ 6] = EmitIvarList(ID, false, InterfaceTy);
1048  Values[ 7] =
1049    EmitMethodList(std::string("\01L_OBJC_INSTANCE_METHODS_") + ID->getName(),
1050                   "__OBJC,__inst_meth,regular,no_dead_strip",
1051                   InstanceMethods);
1052  // cache is always NULL.
1053  Values[ 8] = llvm::Constant::getNullValue(ObjCTypes.CachePtrTy);
1054  Values[ 9] = Protocols;
1055  // FIXME: Set ivar_layout
1056  Values[10] = llvm::Constant::getNullValue(ObjCTypes.Int8PtrTy);
1057  Values[11] = EmitClassExtension(ID);
1058  llvm::Constant *Init = llvm::ConstantStruct::get(ObjCTypes.ClassTy,
1059                                                   Values);
1060
1061  llvm::GlobalVariable *GV =
1062    new llvm::GlobalVariable(ObjCTypes.ClassTy, false,
1063                             llvm::GlobalValue::InternalLinkage,
1064                             Init,
1065                             std::string("\01L_OBJC_CLASS_")+ClassName,
1066                             &CGM.getModule());
1067  GV->setSection("__OBJC,__class,regular,no_dead_strip");
1068  UsedGlobals.push_back(GV);
1069  // FIXME: Why?
1070  GV->setAlignment(32);
1071  DefinedClasses.push_back(GV);
1072}
1073
1074llvm::Constant *CGObjCMac::EmitMetaClass(const ObjCImplementationDecl *ID,
1075                                         llvm::Constant *Protocols,
1076                                         const llvm::Type *InterfaceTy,
1077                                         const ConstantVector &Methods) {
1078  const char *ClassName = ID->getName();
1079  unsigned Flags = eClassFlags_Meta;
1080  unsigned Size = CGM.getTargetData().getABITypeSize(ObjCTypes.ClassTy);
1081
1082  if (IsClassHidden(ID->getClassInterface()))
1083    Flags |= eClassFlags_Hidden;
1084
1085  std::vector<llvm::Constant*> Values(12);
1086  // The isa for the metaclass is the root of the hierarchy.
1087  const ObjCInterfaceDecl *Root = ID->getClassInterface();
1088  while (const ObjCInterfaceDecl *Super = Root->getSuperClass())
1089    Root = Super;
1090  Values[ 0] =
1091    llvm::ConstantExpr::getBitCast(GetClassName(Root->getIdentifier()),
1092                                   ObjCTypes.ClassPtrTy);
1093  // The super class for the metaclass is emitted as the name of the
1094  // super class. The runtime fixes this up to point to the
1095  // *metaclass* for the super class.
1096  if (ObjCInterfaceDecl *Super = ID->getClassInterface()->getSuperClass()) {
1097    Values[ 1] =
1098      llvm::ConstantExpr::getBitCast(GetClassName(Super->getIdentifier()),
1099                                     ObjCTypes.ClassPtrTy);
1100  } else {
1101    Values[ 1] = llvm::Constant::getNullValue(ObjCTypes.ClassPtrTy);
1102  }
1103  Values[ 2] = GetClassName(ID->getIdentifier());
1104  // Version is always 0.
1105  Values[ 3] = llvm::ConstantInt::get(ObjCTypes.LongTy, 0);
1106  Values[ 4] = llvm::ConstantInt::get(ObjCTypes.LongTy, Flags);
1107  Values[ 5] = llvm::ConstantInt::get(ObjCTypes.LongTy, Size);
1108  Values[ 6] = EmitIvarList(ID, true, InterfaceTy);
1109  Values[ 7] =
1110    EmitMethodList(std::string("\01L_OBJC_CLASS_METHODS_") + ID->getName(),
1111                   "__OBJC,__inst_meth,regular,no_dead_strip",
1112                   Methods);
1113  // cache is always NULL.
1114  Values[ 8] = llvm::Constant::getNullValue(ObjCTypes.CachePtrTy);
1115  Values[ 9] = Protocols;
1116  // ivar_layout for metaclass is always NULL.
1117  Values[10] = llvm::Constant::getNullValue(ObjCTypes.Int8PtrTy);
1118  // The class extension is always unused for metaclasses.
1119  Values[11] = llvm::Constant::getNullValue(ObjCTypes.ClassExtensionPtrTy);
1120  llvm::Constant *Init = llvm::ConstantStruct::get(ObjCTypes.ClassTy,
1121                                                   Values);
1122
1123  std::string Name("\01L_OBJC_METACLASS_");
1124  Name += ClassName;
1125
1126  // Check for a forward reference.
1127  llvm::GlobalVariable *GV = CGM.getModule().getGlobalVariable(Name);
1128  if (GV) {
1129    assert(GV->getType()->getElementType() == ObjCTypes.ClassTy &&
1130           "Forward metaclass reference has incorrect type.");
1131    GV->setLinkage(llvm::GlobalValue::InternalLinkage);
1132    GV->setInitializer(Init);
1133  } else {
1134    GV = new llvm::GlobalVariable(ObjCTypes.ClassTy, false,
1135                                  llvm::GlobalValue::InternalLinkage,
1136                                  Init, Name,
1137                                  &CGM.getModule());
1138  }
1139  GV->setSection("__OBJC,__meta_class,regular,no_dead_strip");
1140  UsedGlobals.push_back(GV);
1141  // FIXME: Why?
1142  GV->setAlignment(32);
1143
1144  return GV;
1145}
1146
1147llvm::Constant *CGObjCMac::EmitMetaClassRef(const ObjCInterfaceDecl *ID) {
1148  std::string Name("\01L_OBJC_METACLASS_");
1149  Name += ID->getName();
1150
1151  // FIXME: Should we look these up somewhere other than the
1152  // module. Its a bit silly since we only generate these while
1153  // processing an implementation, so exactly one pointer would work
1154  // if know when we entered/exitted an implementation block.
1155
1156  // Check for an existing forward reference.
1157  if (llvm::GlobalVariable *GV = CGM.getModule().getGlobalVariable(Name)) {
1158    assert(GV->getType()->getElementType() == ObjCTypes.ClassTy &&
1159           "Forward metaclass reference has incorrect type.");
1160    return GV;
1161  } else {
1162    // Generate as an external reference to keep a consistent
1163    // module. This will be patched up when we emit the metaclass.
1164    return new llvm::GlobalVariable(ObjCTypes.ClassTy, false,
1165                                    llvm::GlobalValue::ExternalLinkage,
1166                                    0,
1167                                    Name,
1168                                    &CGM.getModule());
1169  }
1170}
1171
1172/*
1173  struct objc_class_ext {
1174    uint32_t size;
1175    const char *weak_ivar_layout;
1176    struct _objc_property_list *properties;
1177  };
1178*/
1179llvm::Constant *
1180CGObjCMac::EmitClassExtension(const ObjCImplementationDecl *ID) {
1181  uint64_t Size =
1182    CGM.getTargetData().getABITypeSize(ObjCTypes.ClassExtensionTy);
1183
1184  std::vector<llvm::Constant*> Values(3);
1185  Values[0] = llvm::ConstantInt::get(ObjCTypes.IntTy, Size);
1186  // FIXME: Output weak_ivar_layout string.
1187  Values[1] = llvm::Constant::getNullValue(ObjCTypes.Int8PtrTy);
1188  Values[2] = EmitPropertyList(std::string("\01L_OBJC_$_PROP_LIST_") +
1189                               ID->getName(),
1190                               ID,
1191                               ID->getClassInterface()->classprop_begin(),
1192                               ID->getClassInterface()->classprop_end());
1193
1194  // Return null if no extension bits are used.
1195  if (Values[1]->isNullValue() && Values[2]->isNullValue())
1196    return llvm::Constant::getNullValue(ObjCTypes.ClassExtensionPtrTy);
1197
1198  llvm::Constant *Init =
1199    llvm::ConstantStruct::get(ObjCTypes.ClassExtensionTy, Values);
1200  llvm::GlobalVariable *GV =
1201    new llvm::GlobalVariable(ObjCTypes.ClassExtensionTy, false,
1202                             llvm::GlobalValue::InternalLinkage,
1203                             Init,
1204                             (std::string("\01L_OBJC_CLASSEXT_") +
1205                              ID->getName()),
1206                             &CGM.getModule());
1207  // No special section, but goes in llvm.used
1208  UsedGlobals.push_back(GV);
1209
1210  return GV;
1211}
1212
1213/*
1214  struct objc_ivar {
1215    char *ivar_name;
1216    char *ivar_type;
1217    int ivar_offset;
1218  };
1219
1220  struct objc_ivar_list {
1221    int ivar_count;
1222    struct objc_ivar list[count];
1223  };
1224 */
1225llvm::Constant *CGObjCMac::EmitIvarList(const ObjCImplementationDecl *ID,
1226                                        bool ForClass,
1227                                        const llvm::Type *InterfaceTy) {
1228  std::vector<llvm::Constant*> Ivars, Ivar(3);
1229
1230  // When emitting the root class GCC emits ivar entries for the
1231  // actual class structure. It is not clear if we need to follow this
1232  // behavior; for now lets try and get away with not doing it. If so,
1233  // the cleanest solution would be to make up an ObjCInterfaceDecl
1234  // for the class.
1235  if (ForClass)
1236    return llvm::Constant::getNullValue(ObjCTypes.IvarListPtrTy);
1237
1238  const llvm::StructLayout *Layout =
1239    CGM.getTargetData().getStructLayout(cast<llvm::StructType>(InterfaceTy));
1240  for (ObjCInterfaceDecl::ivar_iterator
1241         i = ID->getClassInterface()->ivar_begin(),
1242         e = ID->getClassInterface()->ivar_end(); i != e; ++i) {
1243    ObjCIvarDecl *V = *i;
1244    unsigned Offset =
1245      Layout->getElementOffset(CGM.getTypes().getLLVMFieldNo(V));
1246    std::string TypeStr;
1247    llvm::SmallVector<const RecordType *, 8> EncodingRecordTypes;
1248    Ivar[0] = GetMethodVarName(V->getIdentifier());
1249    CGM.getContext().getObjCEncodingForType(V->getType(), TypeStr,
1250                                            EncodingRecordTypes);
1251    Ivar[1] = GetMethodVarType(TypeStr);
1252    Ivar[2] = llvm::ConstantInt::get(ObjCTypes.IntTy, Offset);
1253    Ivars.push_back(llvm::ConstantStruct::get(ObjCTypes.IvarTy,
1254                                              Ivar));
1255  }
1256
1257  // Return null for empty list.
1258  if (Ivars.empty())
1259    return llvm::Constant::getNullValue(ObjCTypes.IvarListPtrTy);
1260
1261  std::vector<llvm::Constant*> Values(2);
1262  Values[0] = llvm::ConstantInt::get(ObjCTypes.IntTy, Ivars.size());
1263  llvm::ArrayType *AT = llvm::ArrayType::get(ObjCTypes.IvarTy,
1264                                             Ivars.size());
1265  Values[1] = llvm::ConstantArray::get(AT, Ivars);
1266  llvm::Constant *Init = llvm::ConstantStruct::get(Values);
1267
1268  const char *Prefix = (ForClass ? "\01L_OBJC_CLASS_VARIABLES_" :
1269                        "\01L_OBJC_INSTANCE_VARIABLES_");
1270  llvm::GlobalVariable *GV =
1271    new llvm::GlobalVariable(Init->getType(), false,
1272                             llvm::GlobalValue::InternalLinkage,
1273                             Init,
1274                             std::string(Prefix) + ID->getName(),
1275                             &CGM.getModule());
1276  if (ForClass) {
1277    GV->setSection("__OBJC,__cls_vars,regular,no_dead_strip");
1278    // FIXME: Why is this only here?
1279    GV->setAlignment(32);
1280  } else {
1281    GV->setSection("__OBJC,__instance_vars,regular,no_dead_strip");
1282  }
1283  UsedGlobals.push_back(GV);
1284  return llvm::ConstantExpr::getBitCast(GV,
1285                                        ObjCTypes.IvarListPtrTy);
1286}
1287
1288/*
1289  struct objc_method {
1290    SEL method_name;
1291    char *method_types;
1292    void *method;
1293  };
1294
1295  struct objc_method_list {
1296    struct objc_method_list *obsolete;
1297    int count;
1298    struct objc_method methods_list[count];
1299  };
1300*/
1301
1302/// GetMethodConstant - Return a struct objc_method constant for the
1303/// given method if it has been defined. The result is null if the
1304/// method has not been defined. The return value has type MethodPtrTy.
1305llvm::Constant *CGObjCMac::GetMethodConstant(const ObjCMethodDecl *MD) {
1306  // FIXME: Use DenseMap::lookup
1307  llvm::Function *Fn = MethodDefinitions[MD];
1308  if (!Fn)
1309    return 0;
1310
1311  std::vector<llvm::Constant*> Method(3);
1312  Method[0] =
1313    llvm::ConstantExpr::getBitCast(GetMethodVarName(MD->getSelector()),
1314                                   ObjCTypes.SelectorPtrTy);
1315  Method[1] = GetMethodVarType(MD);
1316  Method[2] = llvm::ConstantExpr::getBitCast(Fn, ObjCTypes.Int8PtrTy);
1317  return llvm::ConstantStruct::get(ObjCTypes.MethodTy, Method);
1318}
1319
1320llvm::Constant *CGObjCMac::EmitMethodList(const std::string &Name,
1321                                          const char *Section,
1322                                          const ConstantVector &Methods) {
1323  // Return null for empty list.
1324  if (Methods.empty())
1325    return llvm::Constant::getNullValue(ObjCTypes.MethodListPtrTy);
1326
1327  std::vector<llvm::Constant*> Values(3);
1328  Values[0] = llvm::Constant::getNullValue(ObjCTypes.Int8PtrTy);
1329  Values[1] = llvm::ConstantInt::get(ObjCTypes.IntTy, Methods.size());
1330  llvm::ArrayType *AT = llvm::ArrayType::get(ObjCTypes.MethodTy,
1331                                             Methods.size());
1332  Values[2] = llvm::ConstantArray::get(AT, Methods);
1333  llvm::Constant *Init = llvm::ConstantStruct::get(Values);
1334
1335  llvm::GlobalVariable *GV =
1336    new llvm::GlobalVariable(Init->getType(), false,
1337                             llvm::GlobalValue::InternalLinkage,
1338                             Init,
1339                             Name,
1340                             &CGM.getModule());
1341  GV->setSection(Section);
1342  UsedGlobals.push_back(GV);
1343  return llvm::ConstantExpr::getBitCast(GV,
1344                                        ObjCTypes.MethodListPtrTy);
1345}
1346
1347llvm::Function *CGObjCMac::GenerateMethod(const ObjCMethodDecl *OMD) {
1348  std::string Name;
1349  GetNameForMethod(OMD, Name);
1350
1351  const llvm::FunctionType *MethodTy =
1352    CGM.getTypes().GetFunctionType(CGFunctionInfo(OMD, CGM.getContext()));
1353  llvm::Function *Method =
1354    llvm::Function::Create(MethodTy,
1355                           llvm::GlobalValue::InternalLinkage,
1356                           Name,
1357                           &CGM.getModule());
1358  MethodDefinitions.insert(std::make_pair(OMD, Method));
1359
1360  return Method;
1361}
1362
1363llvm::Function *CGObjCMac::ModuleInitFunction() {
1364  // Abuse this interface function as a place to finalize.
1365  FinishModule();
1366
1367  return NULL;
1368}
1369
1370llvm::Function *CGObjCMac::EnumerationMutationFunction()
1371{
1372  return ObjCTypes.EnumerationMutationFn;
1373}
1374
1375void CGObjCMac::EmitTryStmt(CodeGen::CodeGenFunction &CGF,
1376                            const ObjCAtTryStmt &S)
1377{
1378  // Allocate exception data.
1379  llvm::Value *ExceptionData = CGF.CreateTempAlloca(ObjCTypes.ExceptionDataTy,
1380                                                    "exceptiondata.ptr");
1381
1382  // Allocate memory for the rethrow pointer.
1383  llvm::Value *RethrowPtr = CGF.CreateTempAlloca(ObjCTypes.ObjectPtrTy);
1384  CGF.Builder.CreateStore(llvm::Constant::getNullValue(ObjCTypes.ObjectPtrTy),
1385                          RethrowPtr);
1386
1387  // Enter a new try block and call setjmp.
1388  CGF.Builder.CreateCall(ObjCTypes.ExceptionTryEnterFn, ExceptionData);
1389  llvm::Value *JmpBufPtr = CGF.Builder.CreateStructGEP(ExceptionData, 0,
1390                                                       "jmpbufarray");
1391  JmpBufPtr = CGF.Builder.CreateStructGEP(JmpBufPtr, 0, "tmp");
1392  llvm::Value *SetJmpResult = CGF.Builder.CreateCall(ObjCTypes.SetJmpFn,
1393                                                     JmpBufPtr, "result");
1394
1395
1396  llvm::BasicBlock *FinallyBlock = llvm::BasicBlock::Create("finally");
1397
1398  llvm::BasicBlock *TryBlock = llvm::BasicBlock::Create("try");
1399  llvm::BasicBlock *ExceptionInTryBlock =
1400    llvm::BasicBlock::Create("exceptionintry");
1401
1402  // If setjmp returns 1, there was an exception in the @try block.
1403  llvm::Value *Zero = llvm::Constant::getNullValue(llvm::Type::Int32Ty);
1404  llvm::Value *IsZero = CGF.Builder.CreateICmpEQ(SetJmpResult, Zero, "iszero");
1405  CGF.Builder.CreateCondBr(IsZero, TryBlock, ExceptionInTryBlock);
1406
1407  // Emit the @try block.
1408  CGF.EmitBlock(TryBlock);
1409  CGF.EmitStmt(S.getTryBody());
1410  CGF.Builder.CreateBr(FinallyBlock);
1411
1412  // Emit the "exception in @try" block.
1413  CGF.EmitBlock(ExceptionInTryBlock);
1414
1415  if (const ObjCAtCatchStmt* CatchStmt = S.getCatchStmts()) {
1416    // Allocate memory for the caught exception and extract it from the
1417    // exception data.
1418    llvm::Value *CaughtPtr = CGF.CreateTempAlloca(ObjCTypes.ObjectPtrTy);
1419    llvm::Value *Extract = CGF.Builder.CreateCall(ObjCTypes.ExceptionExtractFn,
1420                                                  ExceptionData);
1421    CGF.Builder.CreateStore(Extract, CaughtPtr);
1422
1423    // Enter a new exception try block
1424    // (in case a @catch block throws an exception).
1425    CGF.Builder.CreateCall(ObjCTypes.ExceptionTryEnterFn, ExceptionData);
1426
1427    llvm::Value *SetJmpResult = CGF.Builder.CreateCall(ObjCTypes.SetJmpFn,
1428                                                       JmpBufPtr, "result");
1429
1430
1431    llvm::Value *Zero = llvm::Constant::getNullValue(llvm::Type::Int32Ty);
1432    llvm::Value *IsZero = CGF.Builder.CreateICmpEQ(SetJmpResult, Zero,
1433                                                   "iszero");
1434
1435    llvm::BasicBlock *CatchBlock = llvm::BasicBlock::Create("catch");
1436    llvm::BasicBlock *ExceptionInCatchBlock =
1437      llvm::BasicBlock::Create("exceptionincatch");
1438    CGF.Builder.CreateCondBr(IsZero, CatchBlock, ExceptionInCatchBlock);
1439
1440    CGF.EmitBlock(CatchBlock);
1441
1442    // Handle catch list
1443    for (; CatchStmt; CatchStmt = CatchStmt->getNextCatchStmt()) {
1444      llvm::BasicBlock *NextCatchBlock = llvm::BasicBlock::Create("nextcatch");
1445
1446      QualType T;
1447      bool MatchesAll = false;
1448
1449      // catch(...) always matches.
1450      if (CatchStmt->hasEllipsis())
1451        MatchesAll = true;
1452      else {
1453        const DeclStmt *DS = cast<DeclStmt>(CatchStmt->getCatchParamStmt());
1454        QualType PT = cast<ValueDecl>(DS->getDecl())->getType();
1455        T = PT->getAsPointerType()->getPointeeType();
1456
1457        // catch(id e) always matches.
1458        if (CGF.getContext().isObjCIdType(T))
1459          MatchesAll = true;
1460      }
1461
1462      if (MatchesAll) {
1463        CGF.EmitStmt(CatchStmt->getCatchBody());
1464        CGF.Builder.CreateBr(FinallyBlock);
1465
1466        CGF.EmitBlock(NextCatchBlock);
1467        break;
1468      }
1469
1470      const ObjCInterfaceType *ObjCType = T->getAsPointerToObjCInterfaceType();
1471      assert(ObjCType && "Catch parameter must have Objective-C type!");
1472
1473      // Check if the @catch block matches the exception object.
1474      llvm::Value *Class = EmitClassRef(CGF.Builder, ObjCType->getDecl());
1475
1476      llvm::Value *Caught = CGF.Builder.CreateLoad(CaughtPtr, "caught");
1477      llvm::Value *Match = CGF.Builder.CreateCall2(ObjCTypes.ExceptionMatchFn,
1478                                                   Class, Caught, "match");
1479
1480      llvm::Value *DidMatch = CGF.Builder.CreateICmpNE(Match, Zero, "iszero");
1481
1482      llvm::BasicBlock *MatchedBlock = llvm::BasicBlock::Create("matched");
1483
1484      CGF.Builder.CreateCondBr(DidMatch, MatchedBlock, NextCatchBlock);
1485
1486      // Emit the @catch block.
1487      CGF.EmitBlock(MatchedBlock);
1488      CGF.EmitStmt(CatchStmt->getCatchBody());
1489      CGF.Builder.CreateBr(FinallyBlock);
1490
1491      CGF.EmitBlock(NextCatchBlock);
1492    }
1493
1494    // None of the handlers caught the exception, so store it and rethrow
1495    // it later.
1496    llvm::Value *Caught = CGF.Builder.CreateLoad(CaughtPtr, "caught");
1497    CGF.Builder.CreateStore(Caught, RethrowPtr);
1498    CGF.Builder.CreateCall(ObjCTypes.ExceptionTryExitFn,
1499                           ExceptionData);
1500
1501    CGF.Builder.CreateBr(FinallyBlock);
1502
1503    CGF.EmitBlock(ExceptionInCatchBlock);
1504
1505    Extract = CGF.Builder.CreateCall(ObjCTypes.ExceptionExtractFn,
1506                                     ExceptionData);
1507    CGF.Builder.CreateStore(Extract, RethrowPtr);
1508  }
1509
1510  // Emit the @finally block.
1511  CGF.EmitBlock(FinallyBlock);
1512
1513  llvm::Value *Rethrow = CGF.Builder.CreateLoad(RethrowPtr);
1514  llvm::Value *ZeroPtr = llvm::Constant::getNullValue(ObjCTypes.ObjectPtrTy);
1515
1516  llvm::Value *RethrowIsZero = CGF.Builder.CreateICmpEQ(Rethrow, ZeroPtr);
1517
1518  llvm::BasicBlock *TryExitBlock = llvm::BasicBlock::Create("tryexit");
1519  llvm::BasicBlock *AfterTryExitBlock =
1520    llvm::BasicBlock::Create("aftertryexit");
1521
1522  CGF.Builder.CreateCondBr(RethrowIsZero, TryExitBlock, AfterTryExitBlock);
1523  CGF.EmitBlock(TryExitBlock);
1524  CGF.Builder.CreateCall(ObjCTypes.ExceptionTryExitFn, ExceptionData);
1525  CGF.EmitBlock(AfterTryExitBlock);
1526
1527  if (const ObjCAtFinallyStmt* FinallyStmt = S.getFinallyStmt())
1528    CGF.EmitStmt(FinallyStmt->getFinallyBody());
1529
1530  llvm::Value *RethrowIsNotZero = CGF.Builder.CreateICmpNE(Rethrow, ZeroPtr);
1531
1532  llvm::BasicBlock *RethrowBlock = llvm::BasicBlock::Create("rethrow");
1533  llvm::BasicBlock *FinallyEndBlock = llvm::BasicBlock::Create("finallyend");
1534
1535  // If necessary, rethrow the exception.
1536  CGF.Builder.CreateCondBr(RethrowIsNotZero, RethrowBlock, FinallyEndBlock);
1537  CGF.EmitBlock(RethrowBlock);
1538  CGF.Builder.CreateCall(ObjCTypes.ExceptionThrowFn, Rethrow);
1539  CGF.EmitBlock(FinallyEndBlock);
1540}
1541
1542void CGObjCMac::EmitThrowStmt(CodeGen::CodeGenFunction &CGF,
1543                              const ObjCAtThrowStmt &S)
1544{
1545  llvm::Value *ExceptionAsObject;
1546
1547  if (const Expr *ThrowExpr = S.getThrowExpr()) {
1548    llvm::Value *Exception = CGF.EmitScalarExpr(ThrowExpr);
1549    ExceptionAsObject =
1550      CGF.Builder.CreateBitCast(Exception, ObjCTypes.ObjectPtrTy, "tmp");
1551  } else {
1552    assert(0 && "FIXME: rethrows not supported!");
1553  }
1554
1555  CGF.Builder.CreateCall(ObjCTypes.ExceptionThrowFn, ExceptionAsObject);
1556  CGF.Builder.CreateUnreachable();
1557  CGF.EmitBlock(llvm::BasicBlock::Create("bb"));
1558}
1559
1560/* *** Private Interface *** */
1561
1562/// EmitImageInfo - Emit the image info marker used to encode some module
1563/// level information.
1564///
1565/// See: <rdr://4810609&4810587&4810587>
1566/// struct IMAGE_INFO {
1567///   unsigned version;
1568///   unsigned flags;
1569/// };
1570enum ImageInfoFlags {
1571  eImageInfo_FixAndContinue   = (1 << 0), // FIXME: Not sure what this implies
1572  eImageInfo_GarbageCollected = (1 << 1),
1573  eImageInfo_GCOnly           = (1 << 2)
1574};
1575
1576void CGObjCMac::EmitImageInfo() {
1577  unsigned version = 0; // Version is unused?
1578  unsigned flags = 0;
1579
1580  // FIXME: Fix and continue?
1581  if (CGM.getLangOptions().getGCMode() != LangOptions::NonGC)
1582    flags |= eImageInfo_GarbageCollected;
1583  if (CGM.getLangOptions().getGCMode() == LangOptions::GCOnly)
1584    flags |= eImageInfo_GCOnly;
1585
1586  // Emitted as int[2];
1587  llvm::Constant *values[2] = {
1588    llvm::ConstantInt::get(llvm::Type::Int32Ty, version),
1589    llvm::ConstantInt::get(llvm::Type::Int32Ty, flags)
1590  };
1591  llvm::ArrayType *AT = llvm::ArrayType::get(llvm::Type::Int32Ty, 2);
1592  llvm::GlobalVariable *GV =
1593    new llvm::GlobalVariable(AT, true,
1594                             llvm::GlobalValue::InternalLinkage,
1595                             llvm::ConstantArray::get(AT, values, 2),
1596                             "\01L_OBJC_IMAGE_INFO",
1597                             &CGM.getModule());
1598
1599  if (ObjCABI == 1) {
1600    GV->setSection("__OBJC, __image_info,regular");
1601  } else {
1602    GV->setSection("__DATA, __objc_imageinfo, regular, no_dead_strip");
1603  }
1604
1605  UsedGlobals.push_back(GV);
1606}
1607
1608
1609// struct objc_module {
1610//   unsigned long version;
1611//   unsigned long size;
1612//   const char *name;
1613//   Symtab symtab;
1614// };
1615
1616// FIXME: Get from somewhere
1617static const int ModuleVersion = 7;
1618
1619void CGObjCMac::EmitModuleInfo() {
1620  uint64_t Size = CGM.getTargetData().getABITypeSize(ObjCTypes.ModuleTy);
1621
1622  std::vector<llvm::Constant*> Values(4);
1623  Values[0] = llvm::ConstantInt::get(ObjCTypes.LongTy, ModuleVersion);
1624  Values[1] = llvm::ConstantInt::get(ObjCTypes.LongTy, Size);
1625  // This used to be the filename, now it is unused. <rdr://4327263>
1626  Values[2] = GetClassName(&CGM.getContext().Idents.get(""));
1627  Values[3] = EmitModuleSymbols();
1628
1629  llvm::GlobalVariable *GV =
1630    new llvm::GlobalVariable(ObjCTypes.ModuleTy, false,
1631                             llvm::GlobalValue::InternalLinkage,
1632                             llvm::ConstantStruct::get(ObjCTypes.ModuleTy,
1633                                                       Values),
1634                             "\01L_OBJC_MODULES",
1635                             &CGM.getModule());
1636  GV->setSection("__OBJC,__module_info,regular,no_dead_strip");
1637  UsedGlobals.push_back(GV);
1638}
1639
1640llvm::Constant *CGObjCMac::EmitModuleSymbols() {
1641  unsigned NumClasses = DefinedClasses.size();
1642  unsigned NumCategories = DefinedCategories.size();
1643
1644  // Return null if no symbols were defined.
1645  if (!NumClasses && !NumCategories)
1646    return llvm::Constant::getNullValue(ObjCTypes.SymtabPtrTy);
1647
1648  std::vector<llvm::Constant*> Values(5);
1649  Values[0] = llvm::ConstantInt::get(ObjCTypes.LongTy, 0);
1650  Values[1] = llvm::Constant::getNullValue(ObjCTypes.SelectorPtrTy);
1651  Values[2] = llvm::ConstantInt::get(ObjCTypes.ShortTy, NumClasses);
1652  Values[3] = llvm::ConstantInt::get(ObjCTypes.ShortTy, NumCategories);
1653
1654  // The runtime expects exactly the list of defined classes followed
1655  // by the list of defined categories, in a single array.
1656  std::vector<llvm::Constant*> Symbols(NumClasses + NumCategories);
1657  for (unsigned i=0; i<NumClasses; i++)
1658    Symbols[i] = llvm::ConstantExpr::getBitCast(DefinedClasses[i],
1659                                                ObjCTypes.Int8PtrTy);
1660  for (unsigned i=0; i<NumCategories; i++)
1661    Symbols[NumClasses + i] =
1662      llvm::ConstantExpr::getBitCast(DefinedCategories[i],
1663                                     ObjCTypes.Int8PtrTy);
1664
1665  Values[4] =
1666    llvm::ConstantArray::get(llvm::ArrayType::get(ObjCTypes.Int8PtrTy,
1667                                                  NumClasses + NumCategories),
1668                             Symbols);
1669
1670  llvm::Constant *Init = llvm::ConstantStruct::get(Values);
1671
1672  llvm::GlobalVariable *GV =
1673    new llvm::GlobalVariable(Init->getType(), false,
1674                             llvm::GlobalValue::InternalLinkage,
1675                             Init,
1676                             "\01L_OBJC_SYMBOLS",
1677                             &CGM.getModule());
1678  GV->setSection("__OBJC,__symbols,regular,no_dead_strip");
1679  UsedGlobals.push_back(GV);
1680  return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.SymtabPtrTy);
1681}
1682
1683llvm::Value *CGObjCMac::EmitClassRef(llvm::IRBuilder<> &Builder,
1684                                     const ObjCInterfaceDecl *ID) {
1685  LazySymbols.insert(ID->getIdentifier());
1686
1687  llvm::GlobalVariable *&Entry = ClassReferences[ID->getIdentifier()];
1688
1689  if (!Entry) {
1690    llvm::Constant *Casted =
1691      llvm::ConstantExpr::getBitCast(GetClassName(ID->getIdentifier()),
1692                                     ObjCTypes.ClassPtrTy);
1693    Entry =
1694      new llvm::GlobalVariable(ObjCTypes.ClassPtrTy, false,
1695                               llvm::GlobalValue::InternalLinkage,
1696                               Casted, "\01L_OBJC_CLASS_REFERENCES_",
1697                               &CGM.getModule());
1698    Entry->setSection("__OBJC,__cls_refs,literal_pointers,no_dead_strip");
1699    UsedGlobals.push_back(Entry);
1700  }
1701
1702  return Builder.CreateLoad(Entry, false, "tmp");
1703}
1704
1705llvm::Value *CGObjCMac::EmitSelector(llvm::IRBuilder<> &Builder, Selector Sel) {
1706  llvm::GlobalVariable *&Entry = SelectorReferences[Sel];
1707
1708  if (!Entry) {
1709    llvm::Constant *Casted =
1710      llvm::ConstantExpr::getBitCast(GetMethodVarName(Sel),
1711                                     ObjCTypes.SelectorPtrTy);
1712    Entry =
1713      new llvm::GlobalVariable(ObjCTypes.SelectorPtrTy, false,
1714                               llvm::GlobalValue::InternalLinkage,
1715                               Casted, "\01L_OBJC_SELECTOR_REFERENCES_",
1716                               &CGM.getModule());
1717    Entry->setSection("__OBJC,__message_refs,literal_pointers,no_dead_strip");
1718    UsedGlobals.push_back(Entry);
1719  }
1720
1721  return Builder.CreateLoad(Entry, false, "tmp");
1722}
1723
1724llvm::Constant *CGObjCMac::GetClassName(IdentifierInfo *Ident) {
1725  llvm::GlobalVariable *&Entry = ClassNames[Ident];
1726
1727  if (!Entry) {
1728    llvm::Constant *C = llvm::ConstantArray::get(Ident->getName());
1729    Entry =
1730      new llvm::GlobalVariable(C->getType(), false,
1731                               llvm::GlobalValue::InternalLinkage,
1732                               C, "\01L_OBJC_CLASS_NAME_",
1733                               &CGM.getModule());
1734    Entry->setSection("__TEXT,__cstring,cstring_literals");
1735    UsedGlobals.push_back(Entry);
1736  }
1737
1738  return getConstantGEP(Entry, 0, 0);
1739}
1740
1741llvm::Constant *CGObjCMac::GetMethodVarName(Selector Sel) {
1742  llvm::GlobalVariable *&Entry = MethodVarNames[Sel];
1743
1744  if (!Entry) {
1745    llvm::Constant *C = llvm::ConstantArray::get(Sel.getName());
1746    Entry =
1747      new llvm::GlobalVariable(C->getType(), false,
1748                               llvm::GlobalValue::InternalLinkage,
1749                               C, "\01L_OBJC_METH_VAR_NAME_",
1750                               &CGM.getModule());
1751    Entry->setSection("__TEXT,__cstring,cstring_literals");
1752    UsedGlobals.push_back(Entry);
1753  }
1754
1755  return getConstantGEP(Entry, 0, 0);
1756}
1757
1758// FIXME: Merge into a single cstring creation function.
1759llvm::Constant *CGObjCMac::GetMethodVarName(IdentifierInfo *ID) {
1760  return GetMethodVarName(CGM.getContext().Selectors.getNullarySelector(ID));
1761}
1762
1763// FIXME: Merge into a single cstring creation function.
1764llvm::Constant *CGObjCMac::GetMethodVarName(const std::string &Name) {
1765  return GetMethodVarName(&CGM.getContext().Idents.get(Name));
1766}
1767
1768llvm::Constant *CGObjCMac::GetMethodVarType(const std::string &Name) {
1769  llvm::GlobalVariable *&Entry = MethodVarTypes[Name];
1770
1771  if (!Entry) {
1772    llvm::Constant *C = llvm::ConstantArray::get(Name);
1773    Entry =
1774      new llvm::GlobalVariable(C->getType(), false,
1775                               llvm::GlobalValue::InternalLinkage,
1776                               C, "\01L_OBJC_METH_VAR_TYPE_",
1777                               &CGM.getModule());
1778    Entry->setSection("__TEXT,__cstring,cstring_literals");
1779    UsedGlobals.push_back(Entry);
1780  }
1781
1782  return getConstantGEP(Entry, 0, 0);
1783}
1784
1785// FIXME: Merge into a single cstring creation function.
1786llvm::Constant *CGObjCMac::GetMethodVarType(const ObjCMethodDecl *D) {
1787  std::string TypeStr;
1788  CGM.getContext().getObjCEncodingForMethodDecl(const_cast<ObjCMethodDecl*>(D),
1789                                                TypeStr);
1790  return GetMethodVarType(TypeStr);
1791}
1792
1793// FIXME: Merge into a single cstring creation function.
1794llvm::Constant *CGObjCMac::GetPropertyName(IdentifierInfo *Ident) {
1795  llvm::GlobalVariable *&Entry = PropertyNames[Ident];
1796
1797  if (!Entry) {
1798    llvm::Constant *C = llvm::ConstantArray::get(Ident->getName());
1799    Entry =
1800      new llvm::GlobalVariable(C->getType(), false,
1801                               llvm::GlobalValue::InternalLinkage,
1802                               C, "\01L_OBJC_PROP_NAME_ATTR_",
1803                               &CGM.getModule());
1804    Entry->setSection("__TEXT,__cstring,cstring_literals");
1805    UsedGlobals.push_back(Entry);
1806  }
1807
1808  return getConstantGEP(Entry, 0, 0);
1809}
1810
1811// FIXME: Merge into a single cstring creation function.
1812// FIXME: This Decl should be more precise.
1813llvm::Constant *CGObjCMac::GetPropertyTypeString(const ObjCPropertyDecl *PD,
1814                                                 const Decl *Container) {
1815  std::string TypeStr;
1816  CGM.getContext().getObjCEncodingForPropertyDecl(PD, Container, TypeStr);
1817  return GetPropertyName(&CGM.getContext().Idents.get(TypeStr));
1818}
1819
1820void CGObjCMac::GetNameForMethod(const ObjCMethodDecl *D,
1821                                 std::string &NameOut) {
1822  // FIXME: Find the mangling GCC uses.
1823  std::stringstream s;
1824  s << (D->isInstance() ? "-" : "+");
1825  s << "[";
1826  s << D->getClassInterface()->getName();
1827  s << " ";
1828  s << D->getSelector().getName();
1829  s << "]";
1830  NameOut = s.str();
1831}
1832
1833void CGObjCMac::FinishModule() {
1834  EmitModuleInfo();
1835
1836  std::vector<llvm::Constant*> Used;
1837
1838  for (std::vector<llvm::GlobalVariable*>::iterator i = UsedGlobals.begin(),
1839         e = UsedGlobals.end(); i != e; ++i) {
1840    Used.push_back(llvm::ConstantExpr::getBitCast(*i, ObjCTypes.Int8PtrTy));
1841  }
1842
1843  llvm::ArrayType *AT = llvm::ArrayType::get(ObjCTypes.Int8PtrTy, Used.size());
1844  llvm::GlobalValue *GV =
1845    new llvm::GlobalVariable(AT, false,
1846                             llvm::GlobalValue::AppendingLinkage,
1847                             llvm::ConstantArray::get(AT, Used),
1848                             "llvm.used",
1849                             &CGM.getModule());
1850
1851  GV->setSection("llvm.metadata");
1852
1853  // Add assembler directives to add lazy undefined symbol references
1854  // for classes which are referenced but not defined. This is
1855  // important for correct linker interaction.
1856
1857  // FIXME: Uh, this isn't particularly portable.
1858  std::stringstream s;
1859  for (std::set<IdentifierInfo*>::iterator i = LazySymbols.begin(),
1860         e = LazySymbols.end(); i != e; ++i) {
1861    s << "\t.lazy_reference .objc_class_name_" << (*i)->getName() << "\n";
1862  }
1863  for (std::set<IdentifierInfo*>::iterator i = DefinedSymbols.begin(),
1864         e = DefinedSymbols.end(); i != e; ++i) {
1865    s << "\t.objc_class_name_" << (*i)->getName() << "=0\n"
1866      << "\t.globl .objc_class_name_" << (*i)->getName() << "\n";
1867  }
1868  CGM.getModule().appendModuleInlineAsm(s.str());
1869}
1870
1871/* *** */
1872
1873ObjCTypesHelper::ObjCTypesHelper(CodeGen::CodeGenModule &cgm)
1874  : CGM(cgm)
1875{
1876  CodeGen::CodeGenTypes &Types = CGM.getTypes();
1877  ASTContext &Ctx = CGM.getContext();
1878
1879  ShortTy = Types.ConvertType(Ctx.ShortTy);
1880  IntTy = Types.ConvertType(Ctx.IntTy);
1881  LongTy = Types.ConvertType(Ctx.LongTy);
1882  Int8PtrTy = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
1883
1884  ObjectPtrTy = Types.ConvertType(Ctx.getObjCIdType());
1885  SelectorPtrTy = Types.ConvertType(Ctx.getObjCSelType());
1886
1887  // FIXME: It would be nice to unify this with the opaque type, so
1888  // that the IR comes out a bit cleaner.
1889  const llvm::Type *T = Types.ConvertType(Ctx.getObjCProtoType());
1890  ExternalProtocolPtrTy = llvm::PointerType::getUnqual(T);
1891
1892  MethodDescriptionTy =
1893    llvm::StructType::get(SelectorPtrTy,
1894                          Int8PtrTy,
1895                          NULL);
1896  CGM.getModule().addTypeName("struct._objc_method_description",
1897                              MethodDescriptionTy);
1898
1899  MethodDescriptionListTy =
1900    llvm::StructType::get(IntTy,
1901                          llvm::ArrayType::get(MethodDescriptionTy, 0),
1902                          NULL);
1903  CGM.getModule().addTypeName("struct._objc_method_description_list",
1904                              MethodDescriptionListTy);
1905  MethodDescriptionListPtrTy =
1906    llvm::PointerType::getUnqual(MethodDescriptionListTy);
1907
1908  PropertyTy = llvm::StructType::get(Int8PtrTy,
1909                                     Int8PtrTy,
1910                                     NULL);
1911  CGM.getModule().addTypeName("struct._objc_property",
1912                              PropertyTy);
1913
1914  PropertyListTy = llvm::StructType::get(IntTy,
1915                                         IntTy,
1916                                         llvm::ArrayType::get(PropertyTy, 0),
1917                                         NULL);
1918  CGM.getModule().addTypeName("struct._objc_property_list",
1919                              PropertyListTy);
1920  PropertyListPtrTy = llvm::PointerType::getUnqual(PropertyListTy);
1921
1922  // Protocol description structures
1923
1924  ProtocolExtensionTy =
1925    llvm::StructType::get(Types.ConvertType(Ctx.IntTy),
1926                          llvm::PointerType::getUnqual(MethodDescriptionListTy),
1927                          llvm::PointerType::getUnqual(MethodDescriptionListTy),
1928                          PropertyListPtrTy,
1929                          NULL);
1930  CGM.getModule().addTypeName("struct._objc_protocol_extension",
1931                              ProtocolExtensionTy);
1932  ProtocolExtensionPtrTy = llvm::PointerType::getUnqual(ProtocolExtensionTy);
1933
1934  // Handle recursive construction of Protocl and ProtocolList types
1935
1936  llvm::PATypeHolder ProtocolTyHolder = llvm::OpaqueType::get();
1937  llvm::PATypeHolder ProtocolListTyHolder = llvm::OpaqueType::get();
1938
1939  T = llvm::StructType::get(llvm::PointerType::getUnqual(ProtocolListTyHolder),
1940                            LongTy,
1941                            llvm::ArrayType::get(ProtocolTyHolder, 0),
1942                            NULL);
1943  cast<llvm::OpaqueType>(ProtocolListTyHolder.get())->refineAbstractTypeTo(T);
1944
1945  T = llvm::StructType::get(llvm::PointerType::getUnqual(ProtocolExtensionTy),
1946                            Int8PtrTy,
1947                            llvm::PointerType::getUnqual(ProtocolListTyHolder),
1948                            MethodDescriptionListPtrTy,
1949                            MethodDescriptionListPtrTy,
1950                            NULL);
1951  cast<llvm::OpaqueType>(ProtocolTyHolder.get())->refineAbstractTypeTo(T);
1952
1953  ProtocolListTy = cast<llvm::StructType>(ProtocolListTyHolder.get());
1954  CGM.getModule().addTypeName("struct._objc_protocol_list",
1955                              ProtocolListTy);
1956  ProtocolListPtrTy = llvm::PointerType::getUnqual(ProtocolListTy);
1957
1958  ProtocolTy = cast<llvm::StructType>(ProtocolTyHolder.get());
1959  CGM.getModule().addTypeName("struct.__objc_protocol", ProtocolTy);
1960  ProtocolPtrTy = llvm::PointerType::getUnqual(ProtocolTy);
1961
1962  // Class description structures
1963
1964  IvarTy = llvm::StructType::get(Int8PtrTy,
1965                                 Int8PtrTy,
1966                                 IntTy,
1967                                 NULL);
1968  CGM.getModule().addTypeName("struct._objc_ivar", IvarTy);
1969
1970  IvarListTy = llvm::OpaqueType::get();
1971  CGM.getModule().addTypeName("struct._objc_ivar_list", IvarListTy);
1972  IvarListPtrTy = llvm::PointerType::getUnqual(IvarListTy);
1973
1974  MethodTy = llvm::StructType::get(SelectorPtrTy,
1975                                   Int8PtrTy,
1976                                   Int8PtrTy,
1977                                   NULL);
1978  CGM.getModule().addTypeName("struct._objc_method", MethodTy);
1979
1980  MethodListTy = llvm::OpaqueType::get();
1981  CGM.getModule().addTypeName("struct._objc_method_list", MethodListTy);
1982  MethodListPtrTy = llvm::PointerType::getUnqual(MethodListTy);
1983
1984  CacheTy = llvm::OpaqueType::get();
1985  CGM.getModule().addTypeName("struct._objc_cache", CacheTy);
1986  CachePtrTy = llvm::PointerType::getUnqual(CacheTy);
1987
1988  ClassExtensionTy =
1989    llvm::StructType::get(IntTy,
1990                          Int8PtrTy,
1991                          PropertyListPtrTy,
1992                          NULL);
1993  CGM.getModule().addTypeName("struct._objc_class_extension", ClassExtensionTy);
1994  ClassExtensionPtrTy = llvm::PointerType::getUnqual(ClassExtensionTy);
1995
1996  llvm::PATypeHolder ClassTyHolder = llvm::OpaqueType::get();
1997
1998  T = llvm::StructType::get(llvm::PointerType::getUnqual(ClassTyHolder),
1999                            llvm::PointerType::getUnqual(ClassTyHolder),
2000                            Int8PtrTy,
2001                            LongTy,
2002                            LongTy,
2003                            LongTy,
2004                            IvarListPtrTy,
2005                            MethodListPtrTy,
2006                            CachePtrTy,
2007                            ProtocolListPtrTy,
2008                            Int8PtrTy,
2009                            ClassExtensionPtrTy,
2010                            NULL);
2011  cast<llvm::OpaqueType>(ClassTyHolder.get())->refineAbstractTypeTo(T);
2012
2013  ClassTy = cast<llvm::StructType>(ClassTyHolder.get());
2014  CGM.getModule().addTypeName("struct._objc_class", ClassTy);
2015  ClassPtrTy = llvm::PointerType::getUnqual(ClassTy);
2016
2017  CategoryTy = llvm::StructType::get(Int8PtrTy,
2018                                     Int8PtrTy,
2019                                     MethodListPtrTy,
2020                                     MethodListPtrTy,
2021                                     ProtocolListPtrTy,
2022                                     IntTy,
2023                                     PropertyListPtrTy,
2024                                     NULL);
2025  CGM.getModule().addTypeName("struct._objc_category", CategoryTy);
2026
2027  // I'm not sure I like this. The implicit coordination is a bit
2028  // gross. We should solve this in a reasonable fashion because this
2029  // is a pretty common task (match some runtime data structure with
2030  // an LLVM data structure).
2031
2032  // FIXME: This is leaked.
2033  // FIXME: Merge with rewriter code?
2034  RecordDecl *RD = RecordDecl::Create(Ctx, TagDecl::TK_struct, 0,
2035                                      SourceLocation(),
2036                                      &Ctx.Idents.get("_objc_super"));
2037  FieldDecl *FieldDecls[2];
2038  FieldDecls[0] = FieldDecl::Create(Ctx, SourceLocation(), 0,
2039                                    Ctx.getObjCIdType());
2040  FieldDecls[1] = FieldDecl::Create(Ctx, SourceLocation(), 0,
2041                                    Ctx.getObjCClassType());
2042  RD->defineBody(Ctx, FieldDecls, 2);
2043
2044  SuperCTy = Ctx.getTagDeclType(RD);
2045  SuperPtrCTy = Ctx.getPointerType(SuperCTy);
2046
2047  SuperTy = cast<llvm::StructType>(Types.ConvertType(SuperCTy));
2048  SuperPtrTy = llvm::PointerType::getUnqual(SuperTy);
2049
2050  // Global metadata structures
2051
2052  SymtabTy = llvm::StructType::get(LongTy,
2053                                   SelectorPtrTy,
2054                                   ShortTy,
2055                                   ShortTy,
2056                                   llvm::ArrayType::get(Int8PtrTy, 0),
2057                                   NULL);
2058  CGM.getModule().addTypeName("struct._objc_symtab", SymtabTy);
2059  SymtabPtrTy = llvm::PointerType::getUnqual(SymtabTy);
2060
2061  ModuleTy =
2062    llvm::StructType::get(LongTy,
2063                          LongTy,
2064                          Int8PtrTy,
2065                          SymtabPtrTy,
2066                          NULL);
2067  CGM.getModule().addTypeName("struct._objc_module", ModuleTy);
2068
2069  // Message send functions
2070
2071  std::vector<const llvm::Type*> Params;
2072  Params.push_back(ObjectPtrTy);
2073  Params.push_back(SelectorPtrTy);
2074  MessageSendFn = llvm::Function::Create(llvm::FunctionType::get(ObjectPtrTy,
2075                                                                 Params,
2076                                                                 true),
2077                                         llvm::Function::ExternalLinkage,
2078                                         "objc_msgSend",
2079                                         &CGM.getModule());
2080
2081  Params.clear();
2082  Params.push_back(Int8PtrTy);
2083  Params.push_back(ObjectPtrTy);
2084  Params.push_back(SelectorPtrTy);
2085  MessageSendStretFn =
2086    llvm::Function::Create(llvm::FunctionType::get(llvm::Type::VoidTy,
2087                                                   Params,
2088                                                   true),
2089                             llvm::Function::ExternalLinkage,
2090                             "objc_msgSend_stret",
2091                             &CGM.getModule());
2092
2093  Params.clear();
2094  Params.push_back(SuperPtrTy);
2095  Params.push_back(SelectorPtrTy);
2096  MessageSendSuperFn =
2097    llvm::Function::Create(llvm::FunctionType::get(ObjectPtrTy,
2098                                                   Params,
2099                                                   true),
2100                           llvm::Function::ExternalLinkage,
2101                           "objc_msgSendSuper",
2102                           &CGM.getModule());
2103
2104  Params.clear();
2105  Params.push_back(Int8PtrTy);
2106  Params.push_back(SuperPtrTy);
2107  Params.push_back(SelectorPtrTy);
2108  MessageSendSuperStretFn =
2109    llvm::Function::Create(llvm::FunctionType::get(llvm::Type::VoidTy,
2110                                                   Params,
2111                                                   true),
2112                           llvm::Function::ExternalLinkage,
2113                           "objc_msgSendSuper_stret",
2114                           &CGM.getModule());
2115
2116  // Enumeration mutation.
2117
2118  Params.clear();
2119  Params.push_back(ObjectPtrTy);
2120  EnumerationMutationFn =
2121    llvm::Function::Create(llvm::FunctionType::get(llvm::Type::VoidTy,
2122                                                   Params,
2123                                                   false),
2124                           llvm::Function::ExternalLinkage,
2125                           "objc_enumerationMutation",
2126                           &CGM.getModule());
2127
2128  // FIXME: This is the size of the setjmp buffer and should be
2129  // target specific. 18 is what's used on 32-bit X86.
2130  uint64_t SetJmpBufferSize = 18;
2131
2132  // Exceptions
2133  const llvm::Type *StackPtrTy =
2134    llvm::PointerType::getUnqual(llvm::ArrayType::get(llvm::Type::Int8Ty, 4));
2135
2136  ExceptionDataTy =
2137    llvm::StructType::get(llvm::ArrayType::get(llvm::Type::Int32Ty,
2138                                               SetJmpBufferSize),
2139                          StackPtrTy, NULL);
2140  CGM.getModule().addTypeName("struct._objc_exception_data",
2141                              ExceptionDataTy);
2142
2143  Params.clear();
2144  Params.push_back(ObjectPtrTy);
2145  ExceptionThrowFn =
2146   llvm::Function::Create(llvm::FunctionType::get(llvm::Type::VoidTy,
2147                                                   Params,
2148                                                   false),
2149                           llvm::Function::ExternalLinkage,
2150                           "objc_exception_throw",
2151                           &CGM.getModule());
2152
2153  Params.clear();
2154  Params.push_back(llvm::PointerType::getUnqual(ExceptionDataTy));
2155  ExceptionTryEnterFn =
2156   llvm::Function::Create(llvm::FunctionType::get(llvm::Type::VoidTy,
2157                                                   Params,
2158                                                   false),
2159                           llvm::Function::ExternalLinkage,
2160                           "objc_exception_try_enter",
2161                           &CGM.getModule());
2162  ExceptionTryExitFn =
2163    llvm::Function::Create(llvm::FunctionType::get(llvm::Type::VoidTy,
2164                                                   Params,
2165                                                   false),
2166                           llvm::Function::ExternalLinkage,
2167                           "objc_exception_try_exit",
2168                           &CGM.getModule());
2169  ExceptionExtractFn =
2170    llvm::Function::Create(llvm::FunctionType::get(ObjectPtrTy,
2171                                                   Params,
2172                                                   false),
2173                           llvm::Function::ExternalLinkage,
2174                           "objc_exception_extract",
2175                           &CGM.getModule());
2176
2177  Params.clear();
2178  Params.push_back(ClassPtrTy);
2179  Params.push_back(ObjectPtrTy);
2180  ExceptionMatchFn =
2181    llvm::Function::Create(llvm::FunctionType::get(llvm::Type::Int32Ty,
2182                                                   Params,
2183                                                   false),
2184                           llvm::Function::ExternalLinkage,
2185                           "objc_exception_match",
2186                           &CGM.getModule());
2187
2188  Params.clear();
2189  Params.push_back(llvm::PointerType::getUnqual(llvm::Type::Int32Ty));
2190  SetJmpFn =
2191    llvm::Function::Create(llvm::FunctionType::get(llvm::Type::Int32Ty,
2192                                                   Params,
2193                                                   false),
2194                           llvm::Function::ExternalLinkage,
2195                           "_setjmp",
2196                           &CGM.getModule());
2197
2198}
2199
2200ObjCTypesHelper::~ObjCTypesHelper() {
2201}
2202
2203llvm::Constant *ObjCTypesHelper::getMessageSendFn(bool IsSuper, bool IsStret) {
2204  if (IsStret) {
2205    return IsSuper ? MessageSendSuperStretFn : MessageSendStretFn;
2206  } else { // FIXME: floating point?
2207    return IsSuper ? MessageSendSuperFn : MessageSendFn;
2208  }
2209}
2210
2211/* *** */
2212
2213CodeGen::CGObjCRuntime *
2214CodeGen::CreateMacObjCRuntime(CodeGen::CodeGenModule &CGM) {
2215  return new CGObjCMac(CGM);
2216}
2217