CGObjCMac.cpp revision 2b1e311009cf682b7b5adb8ba97a0816f727bfb7
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::Value *getMessageSendFn(bool IsSuper, const llvm::Type *ReturnTy);
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  // FIXME: This is a hack, we are implicitly coordinating with
532  // EmitCall, which will move the return type to the first parameter
533  // and set the structure return flag. See getMessageSendFn().
534
535  const llvm::Type *ReturnTy = CGM.getTypes().ConvertType(ResultType);
536  return CGF.EmitCall(ObjCTypes.getMessageSendFn(IsSuper, ReturnTy),
537                      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  const llvm::Type *ReturnTy =
1349    CGM.getTypes().ConvertReturnType(OMD->getResultType());
1350  const llvm::Type *SelfTy =
1351    CGM.getTypes().ConvertType(OMD->getSelfDecl()->getType());
1352
1353  std::vector<const llvm::Type*> ArgTys;
1354  ArgTys.reserve(1 + 2 + OMD->param_size());
1355
1356  // FIXME: This is not something we should have to be dealing with
1357  // here.
1358  bool useStructRet =
1359    CodeGen::CodeGenFunction::hasAggregateLLVMType(OMD->getResultType());
1360  if (useStructRet) {
1361    ArgTys.push_back(llvm::PointerType::getUnqual(ReturnTy));
1362    ReturnTy = llvm::Type::VoidTy;
1363  }
1364
1365  // Implicit arguments
1366  ArgTys.push_back(SelfTy);
1367  ArgTys.push_back(ObjCTypes.SelectorPtrTy);
1368
1369  for (ObjCMethodDecl::param_const_iterator
1370         i = OMD->param_begin(), e = OMD->param_end();
1371       i != e; ++i) {
1372    const llvm::Type *Ty = CGM.getTypes().ConvertType((*i)->getType());
1373    if (Ty->isSingleValueType()) {
1374      ArgTys.push_back(Ty);
1375    } else {
1376      ArgTys.push_back(llvm::PointerType::getUnqual(Ty));
1377    }
1378  }
1379
1380  std::string Name;
1381  GetNameForMethod(OMD, Name);
1382
1383  llvm::Function *Method =
1384    llvm::Function::Create(llvm::FunctionType::get(ReturnTy,
1385                                                   ArgTys,
1386                                                   OMD->isVariadic()),
1387                           llvm::GlobalValue::InternalLinkage,
1388                           Name,
1389                           &CGM.getModule());
1390  MethodDefinitions.insert(std::make_pair(OMD, Method));
1391
1392  unsigned Offset = 3; // Return plus self and selector implicit args.
1393  if (useStructRet) {
1394    Method->addParamAttr(1, llvm::ParamAttr::StructRet);
1395    ++Offset;
1396  }
1397
1398  // FIXME: This is horrible, we need to be reusing the machinery in
1399  // CodeGenModule.cpp (SetFunctionAttributes).
1400  for (ObjCMethodDecl::param_const_iterator
1401         i = OMD->param_begin(), e = OMD->param_end();
1402       i != e; ++i, ++Offset) {
1403    const llvm::Type *Ty = CGM.getTypes().ConvertType((*i)->getType());
1404    if (!Ty->isSingleValueType())
1405      Method->addParamAttr(Offset, llvm::ParamAttr::ByVal);
1406  }
1407
1408  return Method;
1409}
1410
1411llvm::Function *CGObjCMac::ModuleInitFunction() {
1412  // Abuse this interface function as a place to finalize.
1413  FinishModule();
1414
1415  return NULL;
1416}
1417
1418llvm::Function *CGObjCMac::EnumerationMutationFunction()
1419{
1420  return ObjCTypes.EnumerationMutationFn;
1421}
1422
1423void CGObjCMac::EmitTryStmt(CodeGen::CodeGenFunction &CGF,
1424                            const ObjCAtTryStmt &S)
1425{
1426  CGF.ErrorUnsupported(&S, "@try statement");
1427}
1428
1429void CGObjCMac::EmitThrowStmt(CodeGen::CodeGenFunction &CGF,
1430                              const ObjCAtThrowStmt &S)
1431{
1432  llvm::Value *ExceptionAsObject;
1433
1434  if (const Expr *ThrowExpr = S.getThrowExpr()) {
1435    llvm::Value *Exception = CGF.EmitScalarExpr(ThrowExpr);
1436    ExceptionAsObject =
1437      CGF.Builder.CreateBitCast(Exception, ObjCTypes.ObjectPtrTy, "tmp");
1438  } else {
1439    assert(0 && "FIXME: rethrows not supported!");
1440  }
1441
1442  CGF.Builder.CreateCall(ObjCTypes.ExceptionThrowFn, ExceptionAsObject);
1443
1444}
1445
1446/* *** Private Interface *** */
1447
1448/// EmitImageInfo - Emit the image info marker used to encode some module
1449/// level information.
1450///
1451/// See: <rdr://4810609&4810587&4810587>
1452/// struct IMAGE_INFO {
1453///   unsigned version;
1454///   unsigned flags;
1455/// };
1456enum ImageInfoFlags {
1457  eImageInfo_FixAndContinue   = (1 << 0), // FIXME: Not sure what this implies
1458  eImageInfo_GarbageCollected = (1 << 1),
1459  eImageInfo_GCOnly           = (1 << 2)
1460};
1461
1462void CGObjCMac::EmitImageInfo() {
1463  unsigned version = 0; // Version is unused?
1464  unsigned flags = 0;
1465
1466  // FIXME: Fix and continue?
1467  if (CGM.getLangOptions().getGCMode() != LangOptions::NonGC)
1468    flags |= eImageInfo_GarbageCollected;
1469  if (CGM.getLangOptions().getGCMode() == LangOptions::GCOnly)
1470    flags |= eImageInfo_GCOnly;
1471
1472  // Emitted as int[2];
1473  llvm::Constant *values[2] = {
1474    llvm::ConstantInt::get(llvm::Type::Int32Ty, version),
1475    llvm::ConstantInt::get(llvm::Type::Int32Ty, flags)
1476  };
1477  llvm::ArrayType *AT = llvm::ArrayType::get(llvm::Type::Int32Ty, 2);
1478  llvm::GlobalVariable *GV =
1479    new llvm::GlobalVariable(AT, true,
1480                             llvm::GlobalValue::InternalLinkage,
1481                             llvm::ConstantArray::get(AT, values, 2),
1482                             "\01L_OBJC_IMAGE_INFO",
1483                             &CGM.getModule());
1484
1485  if (ObjCABI == 1) {
1486    GV->setSection("__OBJC, __image_info,regular");
1487  } else {
1488    GV->setSection("__DATA, __objc_imageinfo, regular, no_dead_strip");
1489  }
1490
1491  UsedGlobals.push_back(GV);
1492}
1493
1494
1495// struct objc_module {
1496//   unsigned long version;
1497//   unsigned long size;
1498//   const char *name;
1499//   Symtab symtab;
1500// };
1501
1502// FIXME: Get from somewhere
1503static const int ModuleVersion = 7;
1504
1505void CGObjCMac::EmitModuleInfo() {
1506  uint64_t Size = CGM.getTargetData().getABITypeSize(ObjCTypes.ModuleTy);
1507
1508  std::vector<llvm::Constant*> Values(4);
1509  Values[0] = llvm::ConstantInt::get(ObjCTypes.LongTy, ModuleVersion);
1510  Values[1] = llvm::ConstantInt::get(ObjCTypes.LongTy, Size);
1511  // This used to be the filename, now it is unused. <rdr://4327263>
1512  Values[2] = GetClassName(&CGM.getContext().Idents.get(""));
1513  Values[3] = EmitModuleSymbols();
1514
1515  llvm::GlobalVariable *GV =
1516    new llvm::GlobalVariable(ObjCTypes.ModuleTy, false,
1517                             llvm::GlobalValue::InternalLinkage,
1518                             llvm::ConstantStruct::get(ObjCTypes.ModuleTy,
1519                                                       Values),
1520                             "\01L_OBJC_MODULES",
1521                             &CGM.getModule());
1522  GV->setSection("__OBJC,__module_info,regular,no_dead_strip");
1523  UsedGlobals.push_back(GV);
1524}
1525
1526llvm::Constant *CGObjCMac::EmitModuleSymbols() {
1527  unsigned NumClasses = DefinedClasses.size();
1528  unsigned NumCategories = DefinedCategories.size();
1529
1530  // Return null if no symbols were defined.
1531  if (!NumClasses && !NumCategories)
1532    return llvm::Constant::getNullValue(ObjCTypes.SymtabPtrTy);
1533
1534  std::vector<llvm::Constant*> Values(5);
1535  Values[0] = llvm::ConstantInt::get(ObjCTypes.LongTy, 0);
1536  Values[1] = llvm::Constant::getNullValue(ObjCTypes.SelectorPtrTy);
1537  Values[2] = llvm::ConstantInt::get(ObjCTypes.ShortTy, NumClasses);
1538  Values[3] = llvm::ConstantInt::get(ObjCTypes.ShortTy, NumCategories);
1539
1540  // The runtime expects exactly the list of defined classes followed
1541  // by the list of defined categories, in a single array.
1542  std::vector<llvm::Constant*> Symbols(NumClasses + NumCategories);
1543  for (unsigned i=0; i<NumClasses; i++)
1544    Symbols[i] = llvm::ConstantExpr::getBitCast(DefinedClasses[i],
1545                                                ObjCTypes.Int8PtrTy);
1546  for (unsigned i=0; i<NumCategories; i++)
1547    Symbols[NumClasses + i] =
1548      llvm::ConstantExpr::getBitCast(DefinedCategories[i],
1549                                     ObjCTypes.Int8PtrTy);
1550
1551  Values[4] =
1552    llvm::ConstantArray::get(llvm::ArrayType::get(ObjCTypes.Int8PtrTy,
1553                                                  NumClasses + NumCategories),
1554                             Symbols);
1555
1556  llvm::Constant *Init = llvm::ConstantStruct::get(Values);
1557
1558  llvm::GlobalVariable *GV =
1559    new llvm::GlobalVariable(Init->getType(), false,
1560                             llvm::GlobalValue::InternalLinkage,
1561                             Init,
1562                             "\01L_OBJC_SYMBOLS",
1563                             &CGM.getModule());
1564  GV->setSection("__OBJC,__symbols,regular,no_dead_strip");
1565  UsedGlobals.push_back(GV);
1566  return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.SymtabPtrTy);
1567}
1568
1569llvm::Value *CGObjCMac::EmitClassRef(llvm::IRBuilder<> &Builder,
1570                                     const ObjCInterfaceDecl *ID) {
1571  LazySymbols.insert(ID->getIdentifier());
1572
1573  llvm::GlobalVariable *&Entry = ClassReferences[ID->getIdentifier()];
1574
1575  if (!Entry) {
1576    llvm::Constant *Casted =
1577      llvm::ConstantExpr::getBitCast(GetClassName(ID->getIdentifier()),
1578                                     ObjCTypes.ClassPtrTy);
1579    Entry =
1580      new llvm::GlobalVariable(ObjCTypes.ClassPtrTy, false,
1581                               llvm::GlobalValue::InternalLinkage,
1582                               Casted, "\01L_OBJC_CLASS_REFERENCES_",
1583                               &CGM.getModule());
1584    Entry->setSection("__OBJC,__cls_refs,literal_pointers,no_dead_strip");
1585    UsedGlobals.push_back(Entry);
1586  }
1587
1588  return Builder.CreateLoad(Entry, false, "tmp");
1589}
1590
1591llvm::Value *CGObjCMac::EmitSelector(llvm::IRBuilder<> &Builder, Selector Sel) {
1592  llvm::GlobalVariable *&Entry = SelectorReferences[Sel];
1593
1594  if (!Entry) {
1595    llvm::Constant *Casted =
1596      llvm::ConstantExpr::getBitCast(GetMethodVarName(Sel),
1597                                     ObjCTypes.SelectorPtrTy);
1598    Entry =
1599      new llvm::GlobalVariable(ObjCTypes.SelectorPtrTy, false,
1600                               llvm::GlobalValue::InternalLinkage,
1601                               Casted, "\01L_OBJC_SELECTOR_REFERENCES_",
1602                               &CGM.getModule());
1603    Entry->setSection("__OBJC,__message_refs,literal_pointers,no_dead_strip");
1604    UsedGlobals.push_back(Entry);
1605  }
1606
1607  return Builder.CreateLoad(Entry, false, "tmp");
1608}
1609
1610llvm::Constant *CGObjCMac::GetClassName(IdentifierInfo *Ident) {
1611  llvm::GlobalVariable *&Entry = ClassNames[Ident];
1612
1613  if (!Entry) {
1614    llvm::Constant *C = llvm::ConstantArray::get(Ident->getName());
1615    Entry =
1616      new llvm::GlobalVariable(C->getType(), false,
1617                               llvm::GlobalValue::InternalLinkage,
1618                               C, "\01L_OBJC_CLASS_NAME_",
1619                               &CGM.getModule());
1620    Entry->setSection("__TEXT,__cstring,cstring_literals");
1621    UsedGlobals.push_back(Entry);
1622  }
1623
1624  return getConstantGEP(Entry, 0, 0);
1625}
1626
1627llvm::Constant *CGObjCMac::GetMethodVarName(Selector Sel) {
1628  llvm::GlobalVariable *&Entry = MethodVarNames[Sel];
1629
1630  if (!Entry) {
1631    llvm::Constant *C = llvm::ConstantArray::get(Sel.getName());
1632    Entry =
1633      new llvm::GlobalVariable(C->getType(), false,
1634                               llvm::GlobalValue::InternalLinkage,
1635                               C, "\01L_OBJC_METH_VAR_NAME_",
1636                               &CGM.getModule());
1637    Entry->setSection("__TEXT,__cstring,cstring_literals");
1638    UsedGlobals.push_back(Entry);
1639  }
1640
1641  return getConstantGEP(Entry, 0, 0);
1642}
1643
1644// FIXME: Merge into a single cstring creation function.
1645llvm::Constant *CGObjCMac::GetMethodVarName(IdentifierInfo *ID) {
1646  return GetMethodVarName(CGM.getContext().Selectors.getNullarySelector(ID));
1647}
1648
1649// FIXME: Merge into a single cstring creation function.
1650llvm::Constant *CGObjCMac::GetMethodVarName(const std::string &Name) {
1651  return GetMethodVarName(&CGM.getContext().Idents.get(Name));
1652}
1653
1654llvm::Constant *CGObjCMac::GetMethodVarType(const std::string &Name) {
1655  llvm::GlobalVariable *&Entry = MethodVarTypes[Name];
1656
1657  if (!Entry) {
1658    llvm::Constant *C = llvm::ConstantArray::get(Name);
1659    Entry =
1660      new llvm::GlobalVariable(C->getType(), false,
1661                               llvm::GlobalValue::InternalLinkage,
1662                               C, "\01L_OBJC_METH_VAR_TYPE_",
1663                               &CGM.getModule());
1664    Entry->setSection("__TEXT,__cstring,cstring_literals");
1665    UsedGlobals.push_back(Entry);
1666  }
1667
1668  return getConstantGEP(Entry, 0, 0);
1669}
1670
1671// FIXME: Merge into a single cstring creation function.
1672llvm::Constant *CGObjCMac::GetMethodVarType(const ObjCMethodDecl *D) {
1673  std::string TypeStr;
1674  CGM.getContext().getObjCEncodingForMethodDecl(const_cast<ObjCMethodDecl*>(D),
1675                                                TypeStr);
1676  return GetMethodVarType(TypeStr);
1677}
1678
1679// FIXME: Merge into a single cstring creation function.
1680llvm::Constant *CGObjCMac::GetPropertyName(IdentifierInfo *Ident) {
1681  llvm::GlobalVariable *&Entry = PropertyNames[Ident];
1682
1683  if (!Entry) {
1684    llvm::Constant *C = llvm::ConstantArray::get(Ident->getName());
1685    Entry =
1686      new llvm::GlobalVariable(C->getType(), false,
1687                               llvm::GlobalValue::InternalLinkage,
1688                               C, "\01L_OBJC_PROP_NAME_ATTR_",
1689                               &CGM.getModule());
1690    Entry->setSection("__TEXT,__cstring,cstring_literals");
1691    UsedGlobals.push_back(Entry);
1692  }
1693
1694  return getConstantGEP(Entry, 0, 0);
1695}
1696
1697// FIXME: Merge into a single cstring creation function.
1698// FIXME: This Decl should be more precise.
1699llvm::Constant *CGObjCMac::GetPropertyTypeString(const ObjCPropertyDecl *PD,
1700                                                 const Decl *Container) {
1701  std::string TypeStr;
1702  CGM.getContext().getObjCEncodingForPropertyDecl(PD, Container, TypeStr);
1703  return GetPropertyName(&CGM.getContext().Idents.get(TypeStr));
1704}
1705
1706void CGObjCMac::GetNameForMethod(const ObjCMethodDecl *D,
1707                                 std::string &NameOut) {
1708  // FIXME: Find the mangling GCC uses.
1709  std::stringstream s;
1710  s << (D->isInstance() ? "-" : "+");
1711  s << "[";
1712  s << D->getClassInterface()->getName();
1713  s << " ";
1714  s << D->getSelector().getName();
1715  s << "]";
1716  NameOut = s.str();
1717}
1718
1719void CGObjCMac::FinishModule() {
1720  EmitModuleInfo();
1721
1722  std::vector<llvm::Constant*> Used;
1723
1724  for (std::vector<llvm::GlobalVariable*>::iterator i = UsedGlobals.begin(),
1725         e = UsedGlobals.end(); i != e; ++i) {
1726    Used.push_back(llvm::ConstantExpr::getBitCast(*i, ObjCTypes.Int8PtrTy));
1727  }
1728
1729  llvm::ArrayType *AT = llvm::ArrayType::get(ObjCTypes.Int8PtrTy, Used.size());
1730  llvm::GlobalValue *GV =
1731    new llvm::GlobalVariable(AT, false,
1732                             llvm::GlobalValue::AppendingLinkage,
1733                             llvm::ConstantArray::get(AT, Used),
1734                             "llvm.used",
1735                             &CGM.getModule());
1736
1737  GV->setSection("llvm.metadata");
1738
1739  // Add assembler directives to add lazy undefined symbol references
1740  // for classes which are referenced but not defined. This is
1741  // important for correct linker interaction.
1742
1743  // FIXME: Uh, this isn't particularly portable.
1744  std::stringstream s;
1745  for (std::set<IdentifierInfo*>::iterator i = LazySymbols.begin(),
1746         e = LazySymbols.end(); i != e; ++i) {
1747    s << "\t.lazy_reference .objc_class_name_" << (*i)->getName() << "\n";
1748  }
1749  for (std::set<IdentifierInfo*>::iterator i = DefinedSymbols.begin(),
1750         e = DefinedSymbols.end(); i != e; ++i) {
1751    s << "\t.objc_class_name_" << (*i)->getName() << "=0\n"
1752      << "\t.globl .objc_class_name_" << (*i)->getName() << "\n";
1753  }
1754  CGM.getModule().appendModuleInlineAsm(s.str());
1755}
1756
1757/* *** */
1758
1759ObjCTypesHelper::ObjCTypesHelper(CodeGen::CodeGenModule &cgm)
1760  : CGM(cgm)
1761{
1762  CodeGen::CodeGenTypes &Types = CGM.getTypes();
1763  ASTContext &Ctx = CGM.getContext();
1764
1765  ShortTy = Types.ConvertType(Ctx.ShortTy);
1766  IntTy = Types.ConvertType(Ctx.IntTy);
1767  LongTy = Types.ConvertType(Ctx.LongTy);
1768  Int8PtrTy = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
1769
1770  ObjectPtrTy = Types.ConvertType(Ctx.getObjCIdType());
1771  SelectorPtrTy = Types.ConvertType(Ctx.getObjCSelType());
1772
1773  // FIXME: It would be nice to unify this with the opaque type, so
1774  // that the IR comes out a bit cleaner.
1775  const llvm::Type *T = Types.ConvertType(Ctx.getObjCProtoType());
1776  ExternalProtocolPtrTy = llvm::PointerType::getUnqual(T);
1777
1778  MethodDescriptionTy =
1779    llvm::StructType::get(SelectorPtrTy,
1780                          Int8PtrTy,
1781                          NULL);
1782  CGM.getModule().addTypeName("struct._objc_method_description",
1783                              MethodDescriptionTy);
1784
1785  MethodDescriptionListTy =
1786    llvm::StructType::get(IntTy,
1787                          llvm::ArrayType::get(MethodDescriptionTy, 0),
1788                          NULL);
1789  CGM.getModule().addTypeName("struct._objc_method_description_list",
1790                              MethodDescriptionListTy);
1791  MethodDescriptionListPtrTy =
1792    llvm::PointerType::getUnqual(MethodDescriptionListTy);
1793
1794  PropertyTy = llvm::StructType::get(Int8PtrTy,
1795                                     Int8PtrTy,
1796                                     NULL);
1797  CGM.getModule().addTypeName("struct._objc_property",
1798                              PropertyTy);
1799
1800  PropertyListTy = llvm::StructType::get(IntTy,
1801                                         IntTy,
1802                                         llvm::ArrayType::get(PropertyTy, 0),
1803                                         NULL);
1804  CGM.getModule().addTypeName("struct._objc_property_list",
1805                              PropertyListTy);
1806  PropertyListPtrTy = llvm::PointerType::getUnqual(PropertyListTy);
1807
1808  // Protocol description structures
1809
1810  ProtocolExtensionTy =
1811    llvm::StructType::get(Types.ConvertType(Ctx.IntTy),
1812                          llvm::PointerType::getUnqual(MethodDescriptionListTy),
1813                          llvm::PointerType::getUnqual(MethodDescriptionListTy),
1814                          PropertyListPtrTy,
1815                          NULL);
1816  CGM.getModule().addTypeName("struct._objc_protocol_extension",
1817                              ProtocolExtensionTy);
1818  ProtocolExtensionPtrTy = llvm::PointerType::getUnqual(ProtocolExtensionTy);
1819
1820  // Handle recursive construction of Protocl and ProtocolList types
1821
1822  llvm::PATypeHolder ProtocolTyHolder = llvm::OpaqueType::get();
1823  llvm::PATypeHolder ProtocolListTyHolder = llvm::OpaqueType::get();
1824
1825  T = llvm::StructType::get(llvm::PointerType::getUnqual(ProtocolListTyHolder),
1826                            LongTy,
1827                            llvm::ArrayType::get(ProtocolTyHolder, 0),
1828                            NULL);
1829  cast<llvm::OpaqueType>(ProtocolListTyHolder.get())->refineAbstractTypeTo(T);
1830
1831  T = llvm::StructType::get(llvm::PointerType::getUnqual(ProtocolExtensionTy),
1832                            Int8PtrTy,
1833                            llvm::PointerType::getUnqual(ProtocolListTyHolder),
1834                            MethodDescriptionListPtrTy,
1835                            MethodDescriptionListPtrTy,
1836                            NULL);
1837  cast<llvm::OpaqueType>(ProtocolTyHolder.get())->refineAbstractTypeTo(T);
1838
1839  ProtocolListTy = cast<llvm::StructType>(ProtocolListTyHolder.get());
1840  CGM.getModule().addTypeName("struct._objc_protocol_list",
1841                              ProtocolListTy);
1842  ProtocolListPtrTy = llvm::PointerType::getUnqual(ProtocolListTy);
1843
1844  ProtocolTy = cast<llvm::StructType>(ProtocolTyHolder.get());
1845  CGM.getModule().addTypeName("struct.__objc_protocol", ProtocolTy);
1846  ProtocolPtrTy = llvm::PointerType::getUnqual(ProtocolTy);
1847
1848  // Class description structures
1849
1850  IvarTy = llvm::StructType::get(Int8PtrTy,
1851                                 Int8PtrTy,
1852                                 IntTy,
1853                                 NULL);
1854  CGM.getModule().addTypeName("struct._objc_ivar", IvarTy);
1855
1856  IvarListTy = llvm::OpaqueType::get();
1857  CGM.getModule().addTypeName("struct._objc_ivar_list", IvarListTy);
1858  IvarListPtrTy = llvm::PointerType::getUnqual(IvarListTy);
1859
1860  MethodTy = llvm::StructType::get(SelectorPtrTy,
1861                                   Int8PtrTy,
1862                                   Int8PtrTy,
1863                                   NULL);
1864  CGM.getModule().addTypeName("struct._objc_method", MethodTy);
1865
1866  MethodListTy = llvm::OpaqueType::get();
1867  CGM.getModule().addTypeName("struct._objc_method_list", MethodListTy);
1868  MethodListPtrTy = llvm::PointerType::getUnqual(MethodListTy);
1869
1870  CacheTy = llvm::OpaqueType::get();
1871  CGM.getModule().addTypeName("struct._objc_cache", CacheTy);
1872  CachePtrTy = llvm::PointerType::getUnqual(CacheTy);
1873
1874  ClassExtensionTy =
1875    llvm::StructType::get(IntTy,
1876                          Int8PtrTy,
1877                          PropertyListPtrTy,
1878                          NULL);
1879  CGM.getModule().addTypeName("struct._objc_class_extension", ClassExtensionTy);
1880  ClassExtensionPtrTy = llvm::PointerType::getUnqual(ClassExtensionTy);
1881
1882  llvm::PATypeHolder ClassTyHolder = llvm::OpaqueType::get();
1883
1884  T = llvm::StructType::get(llvm::PointerType::getUnqual(ClassTyHolder),
1885                            llvm::PointerType::getUnqual(ClassTyHolder),
1886                            Int8PtrTy,
1887                            LongTy,
1888                            LongTy,
1889                            LongTy,
1890                            IvarListPtrTy,
1891                            MethodListPtrTy,
1892                            CachePtrTy,
1893                            ProtocolListPtrTy,
1894                            Int8PtrTy,
1895                            ClassExtensionPtrTy,
1896                            NULL);
1897  cast<llvm::OpaqueType>(ClassTyHolder.get())->refineAbstractTypeTo(T);
1898
1899  ClassTy = cast<llvm::StructType>(ClassTyHolder.get());
1900  CGM.getModule().addTypeName("struct._objc_class", ClassTy);
1901  ClassPtrTy = llvm::PointerType::getUnqual(ClassTy);
1902
1903  CategoryTy = llvm::StructType::get(Int8PtrTy,
1904                                     Int8PtrTy,
1905                                     MethodListPtrTy,
1906                                     MethodListPtrTy,
1907                                     ProtocolListPtrTy,
1908                                     IntTy,
1909                                     PropertyListPtrTy,
1910                                     NULL);
1911  CGM.getModule().addTypeName("struct._objc_category", CategoryTy);
1912
1913  // I'm not sure I like this. The implicit coordination is a bit
1914  // gross. We should solve this in a reasonable fashion because this
1915  // is a pretty common task (match some runtime data structure with
1916  // an LLVM data structure).
1917
1918  // FIXME: This is leaked.
1919  // FIXME: Merge with rewriter code?
1920  RecordDecl *RD = RecordDecl::Create(Ctx, TagDecl::TK_struct, 0,
1921                                      SourceLocation(),
1922                                      &Ctx.Idents.get("_objc_super"));
1923  FieldDecl *FieldDecls[2];
1924  FieldDecls[0] = FieldDecl::Create(Ctx, SourceLocation(), 0,
1925                                    Ctx.getObjCIdType());
1926  FieldDecls[1] = FieldDecl::Create(Ctx, SourceLocation(), 0,
1927                                    Ctx.getObjCClassType());
1928  RD->defineBody(Ctx, FieldDecls, 2);
1929
1930  SuperCTy = Ctx.getTagDeclType(RD);
1931  SuperPtrCTy = Ctx.getPointerType(SuperCTy);
1932
1933  SuperTy = cast<llvm::StructType>(Types.ConvertType(SuperCTy));
1934  SuperPtrTy = llvm::PointerType::getUnqual(SuperTy);
1935
1936  // Global metadata structures
1937
1938  SymtabTy = llvm::StructType::get(LongTy,
1939                                   SelectorPtrTy,
1940                                   ShortTy,
1941                                   ShortTy,
1942                                   llvm::ArrayType::get(Int8PtrTy, 0),
1943                                   NULL);
1944  CGM.getModule().addTypeName("struct._objc_symtab", SymtabTy);
1945  SymtabPtrTy = llvm::PointerType::getUnqual(SymtabTy);
1946
1947  ModuleTy =
1948    llvm::StructType::get(LongTy,
1949                          LongTy,
1950                          Int8PtrTy,
1951                          SymtabPtrTy,
1952                          NULL);
1953  CGM.getModule().addTypeName("struct._objc_module", ModuleTy);
1954
1955  // Message send functions
1956
1957  std::vector<const llvm::Type*> Params;
1958  Params.push_back(ObjectPtrTy);
1959  Params.push_back(SelectorPtrTy);
1960  MessageSendFn = llvm::Function::Create(llvm::FunctionType::get(ObjectPtrTy,
1961                                                                 Params,
1962                                                                 true),
1963                                         llvm::Function::ExternalLinkage,
1964                                         "objc_msgSend",
1965                                         &CGM.getModule());
1966
1967  Params.clear();
1968  Params.push_back(Int8PtrTy);
1969  Params.push_back(ObjectPtrTy);
1970  Params.push_back(SelectorPtrTy);
1971  MessageSendStretFn =
1972    llvm::Function::Create(llvm::FunctionType::get(llvm::Type::VoidTy,
1973                                                   Params,
1974                                                   true),
1975                             llvm::Function::ExternalLinkage,
1976                             "objc_msgSend_stret",
1977                             &CGM.getModule());
1978
1979  Params.clear();
1980  Params.push_back(SuperPtrTy);
1981  Params.push_back(SelectorPtrTy);
1982  MessageSendSuperFn =
1983    llvm::Function::Create(llvm::FunctionType::get(ObjectPtrTy,
1984                                                   Params,
1985                                                   true),
1986                           llvm::Function::ExternalLinkage,
1987                           "objc_msgSendSuper",
1988                           &CGM.getModule());
1989
1990  Params.clear();
1991  Params.push_back(Int8PtrTy);
1992  Params.push_back(SuperPtrTy);
1993  Params.push_back(SelectorPtrTy);
1994  MessageSendSuperStretFn =
1995    llvm::Function::Create(llvm::FunctionType::get(llvm::Type::VoidTy,
1996                                                   Params,
1997                                                   true),
1998                           llvm::Function::ExternalLinkage,
1999                           "objc_msgSendSuper_stret",
2000                           &CGM.getModule());
2001
2002  // Enumeration mutation.
2003
2004  Params.clear();
2005  Params.push_back(ObjectPtrTy);
2006  EnumerationMutationFn =
2007    llvm::Function::Create(llvm::FunctionType::get(llvm::Type::VoidTy,
2008                                                   Params,
2009                                                   false),
2010                           llvm::Function::ExternalLinkage,
2011                           "objc_enumerationMutation",
2012                           &CGM.getModule());
2013
2014  // FIXME: This is the size of the setjmp buffer and should be
2015  // target specific. 18 is what's used on 32-bit X86.
2016  uint64_t SetJmpBufferSize = 18;
2017
2018  // Exceptions
2019  const llvm::Type *StackPtrTy =
2020    llvm::PointerType::getUnqual(llvm::ArrayType::get(llvm::Type::Int8Ty, 4));
2021
2022  ExceptionDataTy =
2023    llvm::StructType::get(llvm::ArrayType::get(llvm::Type::Int32Ty,
2024                                               SetJmpBufferSize),
2025                          StackPtrTy, NULL);
2026  CGM.getModule().addTypeName("struct._objc_exception_data",
2027                              ExceptionDataTy);
2028
2029  Params.clear();
2030  Params.push_back(ObjectPtrTy);
2031  ExceptionThrowFn =
2032   llvm::Function::Create(llvm::FunctionType::get(llvm::Type::VoidTy,
2033                                                   Params,
2034                                                   false),
2035                           llvm::Function::ExternalLinkage,
2036                           "objc_exception_throw",
2037                           &CGM.getModule());
2038
2039  Params.clear();
2040  Params.push_back(llvm::PointerType::getUnqual(ExceptionDataTy));
2041  ExceptionTryEnterFn =
2042   llvm::Function::Create(llvm::FunctionType::get(llvm::Type::VoidTy,
2043                                                   Params,
2044                                                   false),
2045                           llvm::Function::ExternalLinkage,
2046                           "objc_exception_try_enter",
2047                           &CGM.getModule());
2048  ExceptionTryExitFn =
2049    llvm::Function::Create(llvm::FunctionType::get(llvm::Type::VoidTy,
2050                                                   Params,
2051                                                   false),
2052                           llvm::Function::ExternalLinkage,
2053                           "objc_exception_try_exit",
2054                           &CGM.getModule());
2055  ExceptionExtractFn =
2056    llvm::Function::Create(llvm::FunctionType::get(ObjectPtrTy,
2057                                                   Params,
2058                                                   false),
2059                           llvm::Function::ExternalLinkage,
2060                           "objc_exception_extract",
2061                           &CGM.getModule());
2062
2063  Params.clear();
2064  Params.push_back(ClassPtrTy);
2065  Params.push_back(ObjectPtrTy);
2066  ExceptionMatchFn =
2067    llvm::Function::Create(llvm::FunctionType::get(llvm::Type::Int32Ty,
2068                                                   Params,
2069                                                   false),
2070                           llvm::Function::ExternalLinkage,
2071                           "objc_exception_match",
2072                           &CGM.getModule());
2073
2074  Params.clear();
2075  Params.push_back(llvm::PointerType::getUnqual(llvm::Type::Int32Ty));
2076  SetJmpFn =
2077    llvm::Function::Create(llvm::FunctionType::get(llvm::Type::Int32Ty,
2078                                                   Params,
2079                                                   false),
2080                           llvm::Function::ExternalLinkage,
2081                           "_setjmp",
2082                           &CGM.getModule());
2083
2084}
2085
2086ObjCTypesHelper::~ObjCTypesHelper() {
2087}
2088
2089llvm::Value *ObjCTypesHelper::getMessageSendFn(bool IsSuper,
2090                                               const llvm::Type *ReturnTy) {
2091  llvm::Function *F;
2092  llvm::FunctionType *CallFTy;
2093
2094  // FIXME: Should we be caching any of this?
2095  if (!ReturnTy->isSingleValueType()) {
2096    F = IsSuper ? MessageSendSuperStretFn : MessageSendStretFn;
2097    std::vector<const llvm::Type*> Params(3);
2098    Params[0] = llvm::PointerType::getUnqual(ReturnTy);
2099    Params[1] = IsSuper ? SuperPtrTy : ObjectPtrTy;
2100    Params[2] = SelectorPtrTy;
2101    CallFTy = llvm::FunctionType::get(llvm::Type::VoidTy, Params, true);
2102  } else { // FIXME: floating point?
2103    F = IsSuper ? MessageSendSuperFn : MessageSendFn;
2104    std::vector<const llvm::Type*> Params(2);
2105    Params[0] = IsSuper ? SuperPtrTy : ObjectPtrTy;
2106    Params[1] = SelectorPtrTy;
2107    CallFTy = llvm::FunctionType::get(ReturnTy, Params, true);
2108  }
2109
2110  return llvm::ConstantExpr::getBitCast(F,
2111                                        llvm::PointerType::getUnqual(CallFTy));
2112}
2113
2114/* *** */
2115
2116CodeGen::CGObjCRuntime *
2117CodeGen::CreateMacObjCRuntime(CodeGen::CodeGenModule &CGM) {
2118  return new CGObjCMac(CGM);
2119}
2120