CGObjCGNU.cpp revision 81a65f576842a1d02b1e3db21c14652c60a36448
1//===------- CGObjCGNU.cpp - Emit LLVM Code from ASTs for a Module --------===//
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 GNU runtime.  The
11// class in this file generates structures used by the GNU Objective-C runtime
12// library.  These structures are defined in objc/objc.h and objc/objc-api.h in
13// the GNU runtime distribution.
14//
15//===----------------------------------------------------------------------===//
16
17#include "CGObjCRuntime.h"
18#include "CodeGenModule.h"
19#include "CodeGenFunction.h"
20#include "CGCleanup.h"
21
22#include "clang/AST/ASTContext.h"
23#include "clang/AST/Decl.h"
24#include "clang/AST/DeclObjC.h"
25#include "clang/AST/RecordLayout.h"
26#include "clang/AST/StmtObjC.h"
27#include "clang/Basic/SourceManager.h"
28#include "clang/Basic/FileManager.h"
29
30#include "llvm/Intrinsics.h"
31#include "llvm/Module.h"
32#include "llvm/LLVMContext.h"
33#include "llvm/ADT/SmallVector.h"
34#include "llvm/ADT/StringMap.h"
35#include "llvm/Support/CallSite.h"
36#include "llvm/Support/Compiler.h"
37#include "llvm/Target/TargetData.h"
38
39#include <map>
40#include <stdarg.h>
41
42
43using namespace clang;
44using namespace CodeGen;
45using llvm::dyn_cast;
46
47
48namespace {
49/// Class that lazily initialises the runtime function.  Avoids inserting the
50/// types and the function declaration into a module if they're not used, and
51/// avoids constructing the type more than once if it's used more than once.
52class LazyRuntimeFunction {
53  CodeGenModule *CGM;
54  std::vector<const llvm::Type*> ArgTys;
55  const char *FunctionName;
56  llvm::Function *Function;
57  public:
58    /// Constructor leaves this class uninitialized, because it is intended to
59    /// be used as a field in another class and not all of the types that are
60    /// used as arguments will necessarily be available at construction time.
61    LazyRuntimeFunction() : CGM(0), FunctionName(0), Function(0) {}
62
63    /// Initialises the lazy function with the name, return type, and the types
64    /// of the arguments.
65    END_WITH_NULL
66    void init(CodeGenModule *Mod, const char *name,
67        const llvm::Type *RetTy, ...) {
68       CGM =Mod;
69       FunctionName = name;
70       Function = 0;
71       ArgTys.clear();
72       va_list Args;
73       va_start(Args, RetTy);
74         while (const llvm::Type *ArgTy = va_arg(Args, const llvm::Type*))
75           ArgTys.push_back(ArgTy);
76       va_end(Args);
77       // Push the return type on at the end so we can pop it off easily
78       ArgTys.push_back(RetTy);
79   }
80   /// Overloaded cast operator, allows the class to be implicitly cast to an
81   /// LLVM constant.
82   operator llvm::Function*() {
83     if (!Function) {
84       if (0 == FunctionName) return 0;
85       // We put the return type on the end of the vector, so pop it back off
86       const llvm::Type *RetTy = ArgTys.back();
87       ArgTys.pop_back();
88       llvm::FunctionType *FTy = llvm::FunctionType::get(RetTy, ArgTys, false);
89       Function =
90         cast<llvm::Function>(CGM->CreateRuntimeFunction(FTy, FunctionName));
91       // We won't need to use the types again, so we may as well clean up the
92       // vector now
93       ArgTys.resize(0);
94     }
95     return Function;
96   }
97};
98
99
100/// GNU Objective-C runtime code generation.  This class implements the parts of
101/// Objective-C support that are specific to the GNU family of runtimes (GCC and
102/// GNUstep).
103class CGObjCGNU : public CGObjCRuntime {
104protected:
105  /// The module that is using this class
106  CodeGenModule &CGM;
107  /// The LLVM module into which output is inserted
108  llvm::Module &TheModule;
109  /// strut objc_super.  Used for sending messages to super.  This structure
110  /// contains the receiver (object) and the expected class.
111  const llvm::StructType *ObjCSuperTy;
112  /// struct objc_super*.  The type of the argument to the superclass message
113  /// lookup functions.
114  const llvm::PointerType *PtrToObjCSuperTy;
115  /// LLVM type for selectors.  Opaque pointer (i8*) unless a header declaring
116  /// SEL is included in a header somewhere, in which case it will be whatever
117  /// type is declared in that header, most likely {i8*, i8*}.
118  const llvm::PointerType *SelectorTy;
119  /// LLVM i8 type.  Cached here to avoid repeatedly getting it in all of the
120  /// places where it's used
121  const llvm::IntegerType *Int8Ty;
122  /// Pointer to i8 - LLVM type of char*, for all of the places where the
123  /// runtime needs to deal with C strings.
124  const llvm::PointerType *PtrToInt8Ty;
125  /// Instance Method Pointer type.  This is a pointer to a function that takes,
126  /// at a minimum, an object and a selector, and is the generic type for
127  /// Objective-C methods.  Due to differences between variadic / non-variadic
128  /// calling conventions, it must always be cast to the correct type before
129  /// actually being used.
130  const llvm::PointerType *IMPTy;
131  /// Type of an untyped Objective-C object.  Clang treats id as a built-in type
132  /// when compiling Objective-C code, so this may be an opaque pointer (i8*),
133  /// but if the runtime header declaring it is included then it may be a
134  /// pointer to a structure.
135  const llvm::PointerType *IdTy;
136  /// Pointer to a pointer to an Objective-C object.  Used in the new ABI
137  /// message lookup function and some GC-related functions.
138  const llvm::PointerType *PtrToIdTy;
139  /// The clang type of id.  Used when using the clang CGCall infrastructure to
140  /// call Objective-C methods.
141  CanQualType ASTIdTy;
142  /// LLVM type for C int type.
143  const llvm::IntegerType *IntTy;
144  /// LLVM type for an opaque pointer.  This is identical to PtrToInt8Ty, but is
145  /// used in the code to document the difference between i8* meaning a pointer
146  /// to a C string and i8* meaning a pointer to some opaque type.
147  const llvm::PointerType *PtrTy;
148  /// LLVM type for C long type.  The runtime uses this in a lot of places where
149  /// it should be using intptr_t, but we can't fix this without breaking
150  /// compatibility with GCC...
151  const llvm::IntegerType *LongTy;
152  /// LLVM type for C size_t.  Used in various runtime data structures.
153  const llvm::IntegerType *SizeTy;
154  /// LLVM type for C ptrdiff_t.  Mainly used in property accessor functions.
155  const llvm::IntegerType *PtrDiffTy;
156  /// LLVM type for C int*.  Used for GCC-ABI-compatible non-fragile instance
157  /// variables.
158  const llvm::PointerType *PtrToIntTy;
159  /// LLVM type for Objective-C BOOL type.
160  const llvm::Type *BoolTy;
161  /// Metadata kind used to tie method lookups to message sends.  The GNUstep
162  /// runtime provides some LLVM passes that can use this to do things like
163  /// automatic IMP caching and speculative inlining.
164  unsigned msgSendMDKind;
165  /// Helper function that generates a constant string and returns a pointer to
166  /// the start of the string.  The result of this function can be used anywhere
167  /// where the C code specifies const char*.
168  llvm::Constant *MakeConstantString(const std::string &Str,
169                                     const std::string &Name="") {
170    llvm::Constant *ConstStr = CGM.GetAddrOfConstantCString(Str, Name.c_str());
171    return llvm::ConstantExpr::getGetElementPtr(ConstStr, Zeros, 2);
172  }
173  /// Emits a linkonce_odr string, whose name is the prefix followed by the
174  /// string value.  This allows the linker to combine the strings between
175  /// different modules.  Used for EH typeinfo names, selector strings, and a
176  /// few other things.
177  llvm::Constant *ExportUniqueString(const std::string &Str,
178                                     const std::string prefix) {
179    std::string name = prefix + Str;
180    llvm::Constant *ConstStr = TheModule.getGlobalVariable(name);
181    if (!ConstStr) {
182      llvm::Constant *value = llvm::ConstantArray::get(VMContext, Str, true);
183      ConstStr = new llvm::GlobalVariable(TheModule, value->getType(), true,
184              llvm::GlobalValue::LinkOnceODRLinkage, value, prefix + Str);
185    }
186    return llvm::ConstantExpr::getGetElementPtr(ConstStr, Zeros, 2);
187  }
188  /// Generates a global structure, initialized by the elements in the vector.
189  /// The element types must match the types of the structure elements in the
190  /// first argument.
191  llvm::GlobalVariable *MakeGlobal(const llvm::StructType *Ty,
192                                   std::vector<llvm::Constant*> &V,
193                                   llvm::StringRef Name="",
194                                   llvm::GlobalValue::LinkageTypes linkage
195                                         =llvm::GlobalValue::InternalLinkage) {
196    llvm::Constant *C = llvm::ConstantStruct::get(Ty, V);
197    return new llvm::GlobalVariable(TheModule, Ty, false,
198        linkage, C, Name);
199  }
200  /// Generates a global array.  The vector must contain the same number of
201  /// elements that the array type declares, of the type specified as the array
202  /// element type.
203  llvm::GlobalVariable *MakeGlobal(const llvm::ArrayType *Ty,
204                                   std::vector<llvm::Constant*> &V,
205                                   llvm::StringRef Name="",
206                                   llvm::GlobalValue::LinkageTypes linkage
207                                         =llvm::GlobalValue::InternalLinkage) {
208    llvm::Constant *C = llvm::ConstantArray::get(Ty, V);
209    return new llvm::GlobalVariable(TheModule, Ty, false,
210                                    linkage, C, Name);
211  }
212  /// Generates a global array, inferring the array type from the specified
213  /// element type and the size of the initialiser.
214  llvm::GlobalVariable *MakeGlobalArray(const llvm::Type *Ty,
215                                        std::vector<llvm::Constant*> &V,
216                                        llvm::StringRef Name="",
217                                        llvm::GlobalValue::LinkageTypes linkage
218                                         =llvm::GlobalValue::InternalLinkage) {
219    llvm::ArrayType *ArrayTy = llvm::ArrayType::get(Ty, V.size());
220    return MakeGlobal(ArrayTy, V, Name, linkage);
221  }
222  /// Ensures that the value has the required type, by inserting a bitcast if
223  /// required.  This function lets us avoid inserting bitcasts that are
224  /// redundant.
225  llvm::Value* EnforceType(CGBuilderTy B, llvm::Value *V, const llvm::Type *Ty){
226    if (V->getType() == Ty) return V;
227    return B.CreateBitCast(V, Ty);
228  }
229  // Some zeros used for GEPs in lots of places.
230  llvm::Constant *Zeros[2];
231  /// Null pointer value.  Mainly used as a terminator in various arrays.
232  llvm::Constant *NULLPtr;
233  /// LLVM context.
234  llvm::LLVMContext &VMContext;
235private:
236  /// Placeholder for the class.  Lots of things refer to the class before we've
237  /// actually emitted it.  We use this alias as a placeholder, and then replace
238  /// it with a pointer to the class structure before finally emitting the
239  /// module.
240  llvm::GlobalAlias *ClassPtrAlias;
241  /// Placeholder for the metaclass.  Lots of things refer to the class before
242  /// we've / actually emitted it.  We use this alias as a placeholder, and then
243  /// replace / it with a pointer to the metaclass structure before finally
244  /// emitting the / module.
245  llvm::GlobalAlias *MetaClassPtrAlias;
246  /// All of the classes that have been generated for this compilation units.
247  std::vector<llvm::Constant*> Classes;
248  /// All of the categories that have been generated for this compilation units.
249  std::vector<llvm::Constant*> Categories;
250  /// All of the Objective-C constant strings that have been generated for this
251  /// compilation units.
252  std::vector<llvm::Constant*> ConstantStrings;
253  /// Map from string values to Objective-C constant strings in the output.
254  /// Used to prevent emitting Objective-C strings more than once.  This should
255  /// not be required at all - CodeGenModule should manage this list.
256  llvm::StringMap<llvm::Constant*> ObjCStrings;
257  /// All of the protocols that have been declared.
258  llvm::StringMap<llvm::Constant*> ExistingProtocols;
259  /// For each variant of a selector, we store the type encoding and a
260  /// placeholder value.  For an untyped selector, the type will be the empty
261  /// string.  Selector references are all done via the module's selector table,
262  /// so we create an alias as a placeholder and then replace it with the real
263  /// value later.
264  typedef std::pair<std::string, llvm::GlobalAlias*> TypedSelector;
265  /// Type of the selector map.  This is roughly equivalent to the structure
266  /// used in the GNUstep runtime, which maintains a list of all of the valid
267  /// types for a selector in a table.
268  typedef llvm::DenseMap<Selector, llvm::SmallVector<TypedSelector, 2> >
269    SelectorMap;
270  /// A map from selectors to selector types.  This allows us to emit all
271  /// selectors of the same name and type together.
272  SelectorMap SelectorTable;
273
274  /// Selectors related to memory management.  When compiling in GC mode, we
275  /// omit these.
276  Selector RetainSel, ReleaseSel, AutoreleaseSel;
277  /// Runtime functions used for memory management in GC mode.  Note that clang
278  /// supports code generation for calling these functions, but neither GNU
279  /// runtime actually supports this API properly yet.
280  LazyRuntimeFunction IvarAssignFn, StrongCastAssignFn, MemMoveFn, WeakReadFn,
281    WeakAssignFn, GlobalAssignFn;
282
283protected:
284  /// Function used for throwing Objective-C exceptions.
285  LazyRuntimeFunction ExceptionThrowFn;
286  /// Function used for rethrowing exceptions, used at the end of @finally or
287  /// @synchronize blocks.
288  LazyRuntimeFunction ExceptionReThrowFn;
289  /// Function called when entering a catch function.  This is required for
290  /// differentiating Objective-C exceptions and foreign exceptions.
291  LazyRuntimeFunction EnterCatchFn;
292  /// Function called when exiting from a catch block.  Used to do exception
293  /// cleanup.
294  LazyRuntimeFunction ExitCatchFn;
295  /// Function called when entering an @synchronize block.  Acquires the lock.
296  LazyRuntimeFunction SyncEnterFn;
297  /// Function called when exiting an @synchronize block.  Releases the lock.
298  LazyRuntimeFunction SyncExitFn;
299
300private:
301
302  /// Function called if fast enumeration detects that the collection is
303  /// modified during the update.
304  LazyRuntimeFunction EnumerationMutationFn;
305  /// Function for implementing synthesized property getters that return an
306  /// object.
307  LazyRuntimeFunction GetPropertyFn;
308  /// Function for implementing synthesized property setters that return an
309  /// object.
310  LazyRuntimeFunction SetPropertyFn;
311  /// Function used for non-object declared property getters.
312  LazyRuntimeFunction GetStructPropertyFn;
313  /// Function used for non-object declared property setters.
314  LazyRuntimeFunction SetStructPropertyFn;
315
316  /// The version of the runtime that this class targets.  Must match the
317  /// version in the runtime.
318  const int RuntimeVersion;
319  /// The version of the protocol class.  Used to differentiate between ObjC1
320  /// and ObjC2 protocols.  Objective-C 1 protocols can not contain optional
321  /// components and can not contain declared properties.  We always emit
322  /// Objective-C 2 property structures, but we have to pretend that they're
323  /// Objective-C 1 property structures when targeting the GCC runtime or it
324  /// will abort.
325  const int ProtocolVersion;
326private:
327  /// Generates an instance variable list structure.  This is a structure
328  /// containing a size and an array of structures containing instance variable
329  /// metadata.  This is used purely for introspection in the fragile ABI.  In
330  /// the non-fragile ABI, it's used for instance variable fixup.
331  llvm::Constant *GenerateIvarList(
332      const llvm::SmallVectorImpl<llvm::Constant *>  &IvarNames,
333      const llvm::SmallVectorImpl<llvm::Constant *>  &IvarTypes,
334      const llvm::SmallVectorImpl<llvm::Constant *>  &IvarOffsets);
335  /// Generates a method list structure.  This is a structure containing a size
336  /// and an array of structures containing method metadata.
337  ///
338  /// This structure is used by both classes and categories, and contains a next
339  /// pointer allowing them to be chained together in a linked list.
340  llvm::Constant *GenerateMethodList(const llvm::StringRef &ClassName,
341      const llvm::StringRef &CategoryName,
342      const llvm::SmallVectorImpl<Selector>  &MethodSels,
343      const llvm::SmallVectorImpl<llvm::Constant *>  &MethodTypes,
344      bool isClassMethodList);
345  /// Emits an empty protocol.  This is used for @protocol() where no protocol
346  /// is found.  The runtime will (hopefully) fix up the pointer to refer to the
347  /// real protocol.
348  llvm::Constant *GenerateEmptyProtocol(const std::string &ProtocolName);
349  /// Generates a list of property metadata structures.  This follows the same
350  /// pattern as method and instance variable metadata lists.
351  llvm::Constant *GeneratePropertyList(const ObjCImplementationDecl *OID,
352        llvm::SmallVectorImpl<Selector> &InstanceMethodSels,
353        llvm::SmallVectorImpl<llvm::Constant*> &InstanceMethodTypes);
354  /// Generates a list of referenced protocols.  Classes, categories, and
355  /// protocols all use this structure.
356  llvm::Constant *GenerateProtocolList(
357      const llvm::SmallVectorImpl<std::string> &Protocols);
358  /// To ensure that all protocols are seen by the runtime, we add a category on
359  /// a class defined in the runtime, declaring no methods, but adopting the
360  /// protocols.  This is a horribly ugly hack, but it allows us to collect all
361  /// of the protocols without changing the ABI.
362  void GenerateProtocolHolderCategory(void);
363  /// Generates a class structure.
364  llvm::Constant *GenerateClassStructure(
365      llvm::Constant *MetaClass,
366      llvm::Constant *SuperClass,
367      unsigned info,
368      const char *Name,
369      llvm::Constant *Version,
370      llvm::Constant *InstanceSize,
371      llvm::Constant *IVars,
372      llvm::Constant *Methods,
373      llvm::Constant *Protocols,
374      llvm::Constant *IvarOffsets,
375      llvm::Constant *Properties,
376      bool isMeta=false);
377  /// Generates a method list.  This is used by protocols to define the required
378  /// and optional methods.
379  llvm::Constant *GenerateProtocolMethodList(
380      const llvm::SmallVectorImpl<llvm::Constant *>  &MethodNames,
381      const llvm::SmallVectorImpl<llvm::Constant *>  &MethodTypes);
382  /// Returns a selector with the specified type encoding.  An empty string is
383  /// used to return an untyped selector (with the types field set to NULL).
384  llvm::Value *GetSelector(CGBuilderTy &Builder, Selector Sel,
385    const std::string &TypeEncoding, bool lval);
386  /// Returns the variable used to store the offset of an instance variable.
387  llvm::GlobalVariable *ObjCIvarOffsetVariable(const ObjCInterfaceDecl *ID,
388      const ObjCIvarDecl *Ivar);
389  /// Emits a reference to a class.  This allows the linker to object if there
390  /// is no class of the matching name.
391  void EmitClassRef(const std::string &className);
392protected:
393  /// Looks up the method for sending a message to the specified object.  This
394  /// mechanism differs between the GCC and GNU runtimes, so this method must be
395  /// overridden in subclasses.
396  virtual llvm::Value *LookupIMP(CodeGenFunction &CGF,
397                                 llvm::Value *&Receiver,
398                                 llvm::Value *cmd,
399                                 llvm::MDNode *node) = 0;
400  /// Looks up the method for sending a message to a superclass.  This mechanism
401  /// differs between the GCC and GNU runtimes, so this method must be
402  /// overridden in subclasses.
403  virtual llvm::Value *LookupIMPSuper(CodeGenFunction &CGF,
404                                      llvm::Value *ObjCSuper,
405                                      llvm::Value *cmd) = 0;
406public:
407  CGObjCGNU(CodeGenModule &cgm, unsigned runtimeABIVersion,
408      unsigned protocolClassVersion);
409
410  virtual llvm::Constant *GenerateConstantString(const StringLiteral *);
411
412  virtual RValue
413  GenerateMessageSend(CodeGenFunction &CGF,
414                      ReturnValueSlot Return,
415                      QualType ResultType,
416                      Selector Sel,
417                      llvm::Value *Receiver,
418                      const CallArgList &CallArgs,
419                      const ObjCInterfaceDecl *Class,
420                      const ObjCMethodDecl *Method);
421  virtual RValue
422  GenerateMessageSendSuper(CodeGenFunction &CGF,
423                           ReturnValueSlot Return,
424                           QualType ResultType,
425                           Selector Sel,
426                           const ObjCInterfaceDecl *Class,
427                           bool isCategoryImpl,
428                           llvm::Value *Receiver,
429                           bool IsClassMessage,
430                           const CallArgList &CallArgs,
431                           const ObjCMethodDecl *Method);
432  virtual llvm::Value *GetClass(CGBuilderTy &Builder,
433                                const ObjCInterfaceDecl *OID);
434  virtual llvm::Value *GetSelector(CGBuilderTy &Builder, Selector Sel,
435                                   bool lval = false);
436  virtual llvm::Value *GetSelector(CGBuilderTy &Builder, const ObjCMethodDecl
437      *Method);
438  virtual llvm::Constant *GetEHType(QualType T);
439
440  virtual llvm::Function *GenerateMethod(const ObjCMethodDecl *OMD,
441                                         const ObjCContainerDecl *CD);
442  virtual void GenerateCategory(const ObjCCategoryImplDecl *CMD);
443  virtual void GenerateClass(const ObjCImplementationDecl *ClassDecl);
444  virtual llvm::Value *GenerateProtocolRef(CGBuilderTy &Builder,
445                                           const ObjCProtocolDecl *PD);
446  virtual void GenerateProtocol(const ObjCProtocolDecl *PD);
447  virtual llvm::Function *ModuleInitFunction();
448  virtual llvm::Function *GetPropertyGetFunction();
449  virtual llvm::Function *GetPropertySetFunction();
450  virtual llvm::Function *GetSetStructFunction();
451  virtual llvm::Function *GetGetStructFunction();
452  virtual llvm::Constant *EnumerationMutationFunction();
453
454  virtual void EmitTryStmt(CodeGenFunction &CGF,
455                           const ObjCAtTryStmt &S);
456  virtual void EmitSynchronizedStmt(CodeGenFunction &CGF,
457                                    const ObjCAtSynchronizedStmt &S);
458  virtual void EmitThrowStmt(CodeGenFunction &CGF,
459                             const ObjCAtThrowStmt &S);
460  virtual llvm::Value * EmitObjCWeakRead(CodeGenFunction &CGF,
461                                         llvm::Value *AddrWeakObj);
462  virtual void EmitObjCWeakAssign(CodeGenFunction &CGF,
463                                  llvm::Value *src, llvm::Value *dst);
464  virtual void EmitObjCGlobalAssign(CodeGenFunction &CGF,
465                                    llvm::Value *src, llvm::Value *dest,
466                                    bool threadlocal=false);
467  virtual void EmitObjCIvarAssign(CodeGenFunction &CGF,
468                                    llvm::Value *src, llvm::Value *dest,
469                                    llvm::Value *ivarOffset);
470  virtual void EmitObjCStrongCastAssign(CodeGenFunction &CGF,
471                                        llvm::Value *src, llvm::Value *dest);
472  virtual void EmitGCMemmoveCollectable(CodeGenFunction &CGF,
473                                        llvm::Value *DestPtr,
474                                        llvm::Value *SrcPtr,
475                                        llvm::Value *Size);
476  virtual LValue EmitObjCValueForIvar(CodeGenFunction &CGF,
477                                      QualType ObjectTy,
478                                      llvm::Value *BaseValue,
479                                      const ObjCIvarDecl *Ivar,
480                                      unsigned CVRQualifiers);
481  virtual llvm::Value *EmitIvarOffset(CodeGenFunction &CGF,
482                                      const ObjCInterfaceDecl *Interface,
483                                      const ObjCIvarDecl *Ivar);
484  virtual llvm::Constant *BuildGCBlockLayout(CodeGenModule &CGM,
485                                             const CGBlockInfo &blockInfo) {
486    return NULLPtr;
487  }
488};
489/// Class representing the legacy GCC Objective-C ABI.  This is the default when
490/// -fobjc-nonfragile-abi is not specified.
491///
492/// The GCC ABI target actually generates code that is approximately compatible
493/// with the new GNUstep runtime ABI, but refrains from using any features that
494/// would not work with the GCC runtime.  For example, clang always generates
495/// the extended form of the class structure, and the extra fields are simply
496/// ignored by GCC libobjc.
497class CGObjCGCC : public CGObjCGNU {
498  /// The GCC ABI message lookup function.  Returns an IMP pointing to the
499  /// method implementation for this message.
500  LazyRuntimeFunction MsgLookupFn;
501  /// The GCC ABI superclass message lookup function.  Takes a pointer to a
502  /// structure describing the receiver and the class, and a selector as
503  /// arguments.  Returns the IMP for the corresponding method.
504  LazyRuntimeFunction MsgLookupSuperFn;
505protected:
506  virtual llvm::Value *LookupIMP(CodeGenFunction &CGF,
507                                 llvm::Value *&Receiver,
508                                 llvm::Value *cmd,
509                                 llvm::MDNode *node) {
510    CGBuilderTy &Builder = CGF.Builder;
511    llvm::Value *imp = Builder.CreateCall2(MsgLookupFn,
512            EnforceType(Builder, Receiver, IdTy),
513            EnforceType(Builder, cmd, SelectorTy));
514    cast<llvm::CallInst>(imp)->setMetadata(msgSendMDKind, node);
515    return imp;
516  }
517  virtual llvm::Value *LookupIMPSuper(CodeGenFunction &CGF,
518                                      llvm::Value *ObjCSuper,
519                                      llvm::Value *cmd) {
520      CGBuilderTy &Builder = CGF.Builder;
521      llvm::Value *lookupArgs[] = {EnforceType(Builder, ObjCSuper,
522          PtrToObjCSuperTy), cmd};
523      return Builder.CreateCall(MsgLookupSuperFn, lookupArgs, lookupArgs+2);
524    }
525  public:
526    CGObjCGCC(CodeGenModule &Mod) : CGObjCGNU(Mod, 8, 2) {
527      // IMP objc_msg_lookup(id, SEL);
528      MsgLookupFn.init(&CGM, "objc_msg_lookup", IMPTy, IdTy, SelectorTy, NULL);
529      // IMP objc_msg_lookup_super(struct objc_super*, SEL);
530      MsgLookupSuperFn.init(&CGM, "objc_msg_lookup_super", IMPTy,
531              PtrToObjCSuperTy, SelectorTy, NULL);
532    }
533};
534/// Class used when targeting the new GNUstep runtime ABI.
535class CGObjCGNUstep : public CGObjCGNU {
536    /// The slot lookup function.  Returns a pointer to a cacheable structure
537    /// that contains (among other things) the IMP.
538    LazyRuntimeFunction SlotLookupFn;
539    /// The GNUstep ABI superclass message lookup function.  Takes a pointer to
540    /// a structure describing the receiver and the class, and a selector as
541    /// arguments.  Returns the slot for the corresponding method.  Superclass
542    /// message lookup rarely changes, so this is a good caching opportunity.
543    LazyRuntimeFunction SlotLookupSuperFn;
544    /// Type of an slot structure pointer.  This is returned by the various
545    /// lookup functions.
546    llvm::Type *SlotTy;
547  protected:
548    virtual llvm::Value *LookupIMP(CodeGenFunction &CGF,
549                                   llvm::Value *&Receiver,
550                                   llvm::Value *cmd,
551                                   llvm::MDNode *node) {
552      CGBuilderTy &Builder = CGF.Builder;
553      llvm::Function *LookupFn = SlotLookupFn;
554
555      // Store the receiver on the stack so that we can reload it later
556      llvm::Value *ReceiverPtr = CGF.CreateTempAlloca(Receiver->getType());
557      Builder.CreateStore(Receiver, ReceiverPtr);
558
559      llvm::Value *self;
560
561      if (isa<ObjCMethodDecl>(CGF.CurCodeDecl)) {
562        self = CGF.LoadObjCSelf();
563      } else {
564        self = llvm::ConstantPointerNull::get(IdTy);
565      }
566
567      // The lookup function is guaranteed not to capture the receiver pointer.
568      LookupFn->setDoesNotCapture(1);
569
570      llvm::CallInst *slot =
571          Builder.CreateCall3(LookupFn,
572              EnforceType(Builder, ReceiverPtr, PtrToIdTy),
573              EnforceType(Builder, cmd, SelectorTy),
574              EnforceType(Builder, self, IdTy));
575      slot->setOnlyReadsMemory();
576      slot->setMetadata(msgSendMDKind, node);
577
578      // Load the imp from the slot
579      llvm::Value *imp = Builder.CreateLoad(Builder.CreateStructGEP(slot, 4));
580
581      // The lookup function may have changed the receiver, so make sure we use
582      // the new one.
583      Receiver = Builder.CreateLoad(ReceiverPtr, true);
584      return imp;
585    }
586    virtual llvm::Value *LookupIMPSuper(CodeGenFunction &CGF,
587                                        llvm::Value *ObjCSuper,
588                                        llvm::Value *cmd) {
589      CGBuilderTy &Builder = CGF.Builder;
590      llvm::Value *lookupArgs[] = {ObjCSuper, cmd};
591
592      llvm::CallInst *slot = Builder.CreateCall(SlotLookupSuperFn, lookupArgs,
593          lookupArgs+2);
594      slot->setOnlyReadsMemory();
595
596      return Builder.CreateLoad(Builder.CreateStructGEP(slot, 4));
597    }
598  public:
599    CGObjCGNUstep(CodeGenModule &Mod) : CGObjCGNU(Mod, 9, 3) {
600      llvm::StructType *SlotStructTy = llvm::StructType::get(VMContext, PtrTy,
601          PtrTy, PtrTy, IntTy, IMPTy, NULL);
602      SlotTy = llvm::PointerType::getUnqual(SlotStructTy);
603      // Slot_t objc_msg_lookup_sender(id *receiver, SEL selector, id sender);
604      SlotLookupFn.init(&CGM, "objc_msg_lookup_sender", SlotTy, PtrToIdTy,
605          SelectorTy, IdTy, NULL);
606      // Slot_t objc_msg_lookup_super(struct objc_super*, SEL);
607      SlotLookupSuperFn.init(&CGM, "objc_slot_lookup_super", SlotTy,
608              PtrToObjCSuperTy, SelectorTy, NULL);
609      // If we're in ObjC++ mode, then we want to make
610      if (CGM.getLangOptions().CPlusPlus) {
611        const llvm::Type *VoidTy = llvm::Type::getVoidTy(VMContext);
612        // void *__cxa_begin_catch(void *e)
613        EnterCatchFn.init(&CGM, "__cxa_begin_catch", PtrTy, PtrTy, NULL);
614        // void __cxa_end_catch(void)
615        EnterCatchFn.init(&CGM, "__cxa_end_catch", VoidTy, NULL);
616        // void _Unwind_Resume_or_Rethrow(void*)
617        EnterCatchFn.init(&CGM, "_Unwind_Resume_or_Rethrow", VoidTy, PtrTy, NULL);
618      }
619    }
620};
621
622} // end anonymous namespace
623
624
625/// Emits a reference to a dummy variable which is emitted with each class.
626/// This ensures that a linker error will be generated when trying to link
627/// together modules where a referenced class is not defined.
628void CGObjCGNU::EmitClassRef(const std::string &className) {
629  std::string symbolRef = "__objc_class_ref_" + className;
630  // Don't emit two copies of the same symbol
631  if (TheModule.getGlobalVariable(symbolRef))
632    return;
633  std::string symbolName = "__objc_class_name_" + className;
634  llvm::GlobalVariable *ClassSymbol = TheModule.getGlobalVariable(symbolName);
635  if (!ClassSymbol) {
636    ClassSymbol = new llvm::GlobalVariable(TheModule, LongTy, false,
637        llvm::GlobalValue::ExternalLinkage, 0, symbolName);
638  }
639  new llvm::GlobalVariable(TheModule, ClassSymbol->getType(), true,
640    llvm::GlobalValue::WeakAnyLinkage, ClassSymbol, symbolRef);
641}
642
643static std::string SymbolNameForMethod(const llvm::StringRef &ClassName,
644    const llvm::StringRef &CategoryName, const Selector MethodName,
645    bool isClassMethod) {
646  std::string MethodNameColonStripped = MethodName.getAsString();
647  std::replace(MethodNameColonStripped.begin(), MethodNameColonStripped.end(),
648      ':', '_');
649  return (llvm::Twine(isClassMethod ? "_c_" : "_i_") + ClassName + "_" +
650    CategoryName + "_" + MethodNameColonStripped).str();
651}
652
653CGObjCGNU::CGObjCGNU(CodeGenModule &cgm, unsigned runtimeABIVersion,
654    unsigned protocolClassVersion)
655  : CGM(cgm), TheModule(CGM.getModule()), VMContext(cgm.getLLVMContext()),
656  ClassPtrAlias(0), MetaClassPtrAlias(0), RuntimeVersion(runtimeABIVersion),
657  ProtocolVersion(protocolClassVersion) {
658
659
660  msgSendMDKind = VMContext.getMDKindID("GNUObjCMessageSend");
661
662  CodeGenTypes &Types = CGM.getTypes();
663  IntTy = cast<llvm::IntegerType>(
664      Types.ConvertType(CGM.getContext().IntTy));
665  LongTy = cast<llvm::IntegerType>(
666      Types.ConvertType(CGM.getContext().LongTy));
667  SizeTy = cast<llvm::IntegerType>(
668      Types.ConvertType(CGM.getContext().getSizeType()));
669  PtrDiffTy = cast<llvm::IntegerType>(
670      Types.ConvertType(CGM.getContext().getPointerDiffType()));
671  BoolTy = CGM.getTypes().ConvertType(CGM.getContext().BoolTy);
672
673  Int8Ty = llvm::Type::getInt8Ty(VMContext);
674  // C string type.  Used in lots of places.
675  PtrToInt8Ty = llvm::PointerType::getUnqual(Int8Ty);
676
677  Zeros[0] = llvm::ConstantInt::get(LongTy, 0);
678  Zeros[1] = Zeros[0];
679  NULLPtr = llvm::ConstantPointerNull::get(PtrToInt8Ty);
680  // Get the selector Type.
681  QualType selTy = CGM.getContext().getObjCSelType();
682  if (QualType() == selTy) {
683    SelectorTy = PtrToInt8Ty;
684  } else {
685    SelectorTy = cast<llvm::PointerType>(CGM.getTypes().ConvertType(selTy));
686  }
687
688  PtrToIntTy = llvm::PointerType::getUnqual(IntTy);
689  PtrTy = PtrToInt8Ty;
690
691  // Object type
692  ASTIdTy = CGM.getContext().getCanonicalType(CGM.getContext().getObjCIdType());
693  if (QualType() == ASTIdTy) {
694    IdTy = PtrToInt8Ty;
695  } else {
696    IdTy = cast<llvm::PointerType>(CGM.getTypes().ConvertType(ASTIdTy));
697  }
698  PtrToIdTy = llvm::PointerType::getUnqual(IdTy);
699
700  ObjCSuperTy = llvm::StructType::get(VMContext, IdTy, IdTy, NULL);
701  PtrToObjCSuperTy = llvm::PointerType::getUnqual(ObjCSuperTy);
702
703  const llvm::Type *VoidTy = llvm::Type::getVoidTy(VMContext);
704
705  // void objc_exception_throw(id);
706  ExceptionThrowFn.init(&CGM, "objc_exception_throw", VoidTy, IdTy, NULL);
707  ExceptionReThrowFn.init(&CGM, "objc_exception_throw", VoidTy, IdTy, NULL);
708  // int objc_sync_enter(id);
709  SyncEnterFn.init(&CGM, "objc_sync_enter", IntTy, IdTy, NULL);
710  // int objc_sync_exit(id);
711  SyncExitFn.init(&CGM, "objc_sync_exit", IntTy, IdTy, NULL);
712
713  // void objc_enumerationMutation (id)
714  EnumerationMutationFn.init(&CGM, "objc_enumerationMutation", VoidTy,
715      IdTy, NULL);
716
717  // id objc_getProperty(id, SEL, ptrdiff_t, BOOL)
718  GetPropertyFn.init(&CGM, "objc_getProperty", IdTy, IdTy, SelectorTy,
719      PtrDiffTy, BoolTy, NULL);
720  // void objc_setProperty(id, SEL, ptrdiff_t, id, BOOL, BOOL)
721  SetPropertyFn.init(&CGM, "objc_setProperty", VoidTy, IdTy, SelectorTy,
722      PtrDiffTy, IdTy, BoolTy, BoolTy, NULL);
723  // void objc_setPropertyStruct(void*, void*, ptrdiff_t, BOOL, BOOL)
724  GetStructPropertyFn.init(&CGM, "objc_getPropertyStruct", VoidTy, PtrTy, PtrTy,
725      PtrDiffTy, BoolTy, BoolTy, NULL);
726  // void objc_setPropertyStruct(void*, void*, ptrdiff_t, BOOL, BOOL)
727  SetStructPropertyFn.init(&CGM, "objc_setPropertyStruct", VoidTy, PtrTy, PtrTy,
728      PtrDiffTy, BoolTy, BoolTy, NULL);
729
730  // IMP type
731  std::vector<const llvm::Type*> IMPArgs;
732  IMPArgs.push_back(IdTy);
733  IMPArgs.push_back(SelectorTy);
734  IMPTy = llvm::PointerType::getUnqual(llvm::FunctionType::get(IdTy, IMPArgs,
735              true));
736
737  // Don't bother initialising the GC stuff unless we're compiling in GC mode
738  if (CGM.getLangOptions().getGCMode() != LangOptions::NonGC) {
739    // Get selectors needed in GC mode
740    RetainSel = GetNullarySelector("retain", CGM.getContext());
741    ReleaseSel = GetNullarySelector("release", CGM.getContext());
742    AutoreleaseSel = GetNullarySelector("autorelease", CGM.getContext());
743
744    // Get functions needed in GC mode
745
746    // id objc_assign_ivar(id, id, ptrdiff_t);
747    IvarAssignFn.init(&CGM, "objc_assign_ivar", IdTy, IdTy, IdTy, PtrDiffTy,
748        NULL);
749    // id objc_assign_strongCast (id, id*)
750    StrongCastAssignFn.init(&CGM, "objc_assign_strongCast", IdTy, IdTy,
751        PtrToIdTy, NULL);
752    // id objc_assign_global(id, id*);
753    GlobalAssignFn.init(&CGM, "objc_assign_global", IdTy, IdTy, PtrToIdTy,
754        NULL);
755    // id objc_assign_weak(id, id*);
756    WeakAssignFn.init(&CGM, "objc_assign_weak", IdTy, IdTy, PtrToIdTy, NULL);
757    // id objc_read_weak(id*);
758    WeakReadFn.init(&CGM, "objc_read_weak", IdTy, PtrToIdTy, NULL);
759    // void *objc_memmove_collectable(void*, void *, size_t);
760    MemMoveFn.init(&CGM, "objc_memmove_collectable", PtrTy, PtrTy, PtrTy,
761        SizeTy, NULL);
762  }
763}
764
765// This has to perform the lookup every time, since posing and related
766// techniques can modify the name -> class mapping.
767llvm::Value *CGObjCGNU::GetClass(CGBuilderTy &Builder,
768                                 const ObjCInterfaceDecl *OID) {
769  llvm::Value *ClassName = CGM.GetAddrOfConstantCString(OID->getNameAsString());
770  // With the incompatible ABI, this will need to be replaced with a direct
771  // reference to the class symbol.  For the compatible nonfragile ABI we are
772  // still performing this lookup at run time but emitting the symbol for the
773  // class externally so that we can make the switch later.
774  EmitClassRef(OID->getNameAsString());
775  ClassName = Builder.CreateStructGEP(ClassName, 0);
776
777  std::vector<const llvm::Type*> Params(1, PtrToInt8Ty);
778  llvm::Constant *ClassLookupFn =
779    CGM.CreateRuntimeFunction(llvm::FunctionType::get(IdTy,
780                                                      Params,
781                                                      true),
782                              "objc_lookup_class");
783  return Builder.CreateCall(ClassLookupFn, ClassName);
784}
785
786llvm::Value *CGObjCGNU::GetSelector(CGBuilderTy &Builder, Selector Sel,
787    const std::string &TypeEncoding, bool lval) {
788
789  llvm::SmallVector<TypedSelector, 2> &Types = SelectorTable[Sel];
790  llvm::GlobalAlias *SelValue = 0;
791
792
793  for (llvm::SmallVectorImpl<TypedSelector>::iterator i = Types.begin(),
794      e = Types.end() ; i!=e ; i++) {
795    if (i->first == TypeEncoding) {
796      SelValue = i->second;
797      break;
798    }
799  }
800  if (0 == SelValue) {
801    SelValue = new llvm::GlobalAlias(SelectorTy,
802                                     llvm::GlobalValue::PrivateLinkage,
803                                     ".objc_selector_"+Sel.getAsString(), NULL,
804                                     &TheModule);
805    Types.push_back(TypedSelector(TypeEncoding, SelValue));
806  }
807
808  if (lval) {
809    llvm::Value *tmp = Builder.CreateAlloca(SelValue->getType());
810    Builder.CreateStore(SelValue, tmp);
811    return tmp;
812  }
813  return SelValue;
814}
815
816llvm::Value *CGObjCGNU::GetSelector(CGBuilderTy &Builder, Selector Sel,
817                                    bool lval) {
818  return GetSelector(Builder, Sel, std::string(), lval);
819}
820
821llvm::Value *CGObjCGNU::GetSelector(CGBuilderTy &Builder, const ObjCMethodDecl
822    *Method) {
823  std::string SelTypes;
824  CGM.getContext().getObjCEncodingForMethodDecl(Method, SelTypes);
825  return GetSelector(Builder, Method->getSelector(), SelTypes, false);
826}
827
828llvm::Constant *CGObjCGNU::GetEHType(QualType T) {
829  if (!CGM.getLangOptions().CPlusPlus) {
830      if (T->isObjCIdType()
831          || T->isObjCQualifiedIdType()) {
832        // With the old ABI, there was only one kind of catchall, which broke
833        // foreign exceptions.  With the new ABI, we use __objc_id_typeinfo as
834        // a pointer indicating object catchalls, and NULL to indicate real
835        // catchalls
836        if (CGM.getLangOptions().ObjCNonFragileABI) {
837          return MakeConstantString("@id");
838        } else {
839          return 0;
840        }
841      }
842
843      // All other types should be Objective-C interface pointer types.
844      const ObjCObjectPointerType *OPT =
845        T->getAs<ObjCObjectPointerType>();
846      assert(OPT && "Invalid @catch type.");
847      const ObjCInterfaceDecl *IDecl =
848        OPT->getObjectType()->getInterface();
849      assert(IDecl && "Invalid @catch type.");
850      return MakeConstantString(IDecl->getIdentifier()->getName());
851  }
852  // For Objective-C++, we want to provide the ability to catch both C++ and
853  // Objective-C objects in the same function.
854
855  // There's a particular fixed type info for 'id'.
856  if (T->isObjCIdType() ||
857      T->isObjCQualifiedIdType()) {
858    llvm::Constant *IDEHType =
859      CGM.getModule().getGlobalVariable("__objc_id_type_info");
860    if (!IDEHType)
861      IDEHType =
862        new llvm::GlobalVariable(CGM.getModule(), PtrToInt8Ty,
863                                 false,
864                                 llvm::GlobalValue::ExternalLinkage,
865                                 0, "__objc_id_type_info");
866    return llvm::ConstantExpr::getBitCast(IDEHType, PtrToInt8Ty);
867  }
868
869  const ObjCObjectPointerType *PT =
870    T->getAs<ObjCObjectPointerType>();
871  assert(PT && "Invalid @catch type.");
872  const ObjCInterfaceType *IT = PT->getInterfaceType();
873  assert(IT && "Invalid @catch type.");
874  std::string className = IT->getDecl()->getIdentifier()->getName();
875
876  std::string typeinfoName = "__objc_eh_typeinfo_" + className;
877
878  // Return the existing typeinfo if it exists
879  llvm::Constant *typeinfo = TheModule.getGlobalVariable(typeinfoName);
880  if (typeinfo) return typeinfo;
881
882  // Otherwise create it.
883
884  // vtable for gnustep::libobjc::__objc_class_type_info
885  // It's quite ugly hard-coding this.  Ideally we'd generate it using the host
886  // platform's name mangling.
887  const char *vtableName = "_ZTVN7gnustep7libobjc22__objc_class_type_infoE";
888  llvm::Constant *Vtable = TheModule.getGlobalVariable(vtableName);
889  if (!Vtable) {
890    Vtable = new llvm::GlobalVariable(TheModule, PtrToInt8Ty, true,
891            llvm::GlobalValue::ExternalLinkage, 0, vtableName);
892  }
893  llvm::Constant *Two = llvm::ConstantInt::get(IntTy, 2);
894  Vtable = llvm::ConstantExpr::getGetElementPtr(Vtable, &Two, 1);
895  Vtable = llvm::ConstantExpr::getBitCast(Vtable, PtrToInt8Ty);
896
897  llvm::Constant *typeName =
898    ExportUniqueString(className, "__objc_eh_typename_");
899
900  std::vector<llvm::Constant*> fields;
901  fields.push_back(Vtable);
902  fields.push_back(typeName);
903  llvm::Constant *TI =
904      MakeGlobal(llvm::StructType::get(VMContext, PtrToInt8Ty, PtrToInt8Ty,
905              NULL), fields, "__objc_eh_typeinfo_" + className,
906          llvm::GlobalValue::LinkOnceODRLinkage);
907  return llvm::ConstantExpr::getBitCast(TI, PtrToInt8Ty);
908}
909
910/// Generate an NSConstantString object.
911llvm::Constant *CGObjCGNU::GenerateConstantString(const StringLiteral *SL) {
912
913  std::string Str = SL->getString().str();
914
915  // Look for an existing one
916  llvm::StringMap<llvm::Constant*>::iterator old = ObjCStrings.find(Str);
917  if (old != ObjCStrings.end())
918    return old->getValue();
919
920  std::vector<llvm::Constant*> Ivars;
921  Ivars.push_back(NULLPtr);
922  Ivars.push_back(MakeConstantString(Str));
923  Ivars.push_back(llvm::ConstantInt::get(IntTy, Str.size()));
924  llvm::Constant *ObjCStr = MakeGlobal(
925    llvm::StructType::get(VMContext, PtrToInt8Ty, PtrToInt8Ty, IntTy, NULL),
926    Ivars, ".objc_str");
927  ObjCStr = llvm::ConstantExpr::getBitCast(ObjCStr, PtrToInt8Ty);
928  ObjCStrings[Str] = ObjCStr;
929  ConstantStrings.push_back(ObjCStr);
930  return ObjCStr;
931}
932
933///Generates a message send where the super is the receiver.  This is a message
934///send to self with special delivery semantics indicating which class's method
935///should be called.
936RValue
937CGObjCGNU::GenerateMessageSendSuper(CodeGenFunction &CGF,
938                                    ReturnValueSlot Return,
939                                    QualType ResultType,
940                                    Selector Sel,
941                                    const ObjCInterfaceDecl *Class,
942                                    bool isCategoryImpl,
943                                    llvm::Value *Receiver,
944                                    bool IsClassMessage,
945                                    const CallArgList &CallArgs,
946                                    const ObjCMethodDecl *Method) {
947  if (CGM.getLangOptions().getGCMode() != LangOptions::NonGC) {
948    if (Sel == RetainSel || Sel == AutoreleaseSel) {
949      return RValue::get(Receiver);
950    }
951    if (Sel == ReleaseSel) {
952      return RValue::get(0);
953    }
954  }
955
956  CGBuilderTy &Builder = CGF.Builder;
957  llvm::Value *cmd = GetSelector(Builder, Sel);
958
959
960  CallArgList ActualArgs;
961
962  ActualArgs.push_back(
963      std::make_pair(RValue::get(EnforceType(Builder, Receiver, IdTy)),
964      ASTIdTy));
965  ActualArgs.push_back(std::make_pair(RValue::get(cmd),
966                                      CGF.getContext().getObjCSelType()));
967  ActualArgs.insert(ActualArgs.end(), CallArgs.begin(), CallArgs.end());
968
969  CodeGenTypes &Types = CGM.getTypes();
970  const CGFunctionInfo &FnInfo = Types.getFunctionInfo(ResultType, ActualArgs,
971                                                       FunctionType::ExtInfo());
972
973  llvm::Value *ReceiverClass = 0;
974  if (isCategoryImpl) {
975    llvm::Constant *classLookupFunction = 0;
976    std::vector<const llvm::Type*> Params;
977    Params.push_back(PtrTy);
978    if (IsClassMessage)  {
979      classLookupFunction = CGM.CreateRuntimeFunction(llvm::FunctionType::get(
980            IdTy, Params, true), "objc_get_meta_class");
981    } else {
982      classLookupFunction = CGM.CreateRuntimeFunction(llvm::FunctionType::get(
983            IdTy, Params, true), "objc_get_class");
984    }
985    ReceiverClass = Builder.CreateCall(classLookupFunction,
986        MakeConstantString(Class->getNameAsString()));
987  } else {
988    // Set up global aliases for the metaclass or class pointer if they do not
989    // already exist.  These will are forward-references which will be set to
990    // pointers to the class and metaclass structure created for the runtime
991    // load function.  To send a message to super, we look up the value of the
992    // super_class pointer from either the class or metaclass structure.
993    if (IsClassMessage)  {
994      if (!MetaClassPtrAlias) {
995        MetaClassPtrAlias = new llvm::GlobalAlias(IdTy,
996            llvm::GlobalValue::InternalLinkage, ".objc_metaclass_ref" +
997            Class->getNameAsString(), NULL, &TheModule);
998      }
999      ReceiverClass = MetaClassPtrAlias;
1000    } else {
1001      if (!ClassPtrAlias) {
1002        ClassPtrAlias = new llvm::GlobalAlias(IdTy,
1003            llvm::GlobalValue::InternalLinkage, ".objc_class_ref" +
1004            Class->getNameAsString(), NULL, &TheModule);
1005      }
1006      ReceiverClass = ClassPtrAlias;
1007    }
1008  }
1009  // Cast the pointer to a simplified version of the class structure
1010  ReceiverClass = Builder.CreateBitCast(ReceiverClass,
1011      llvm::PointerType::getUnqual(
1012        llvm::StructType::get(VMContext, IdTy, IdTy, NULL)));
1013  // Get the superclass pointer
1014  ReceiverClass = Builder.CreateStructGEP(ReceiverClass, 1);
1015  // Load the superclass pointer
1016  ReceiverClass = Builder.CreateLoad(ReceiverClass);
1017  // Construct the structure used to look up the IMP
1018  llvm::StructType *ObjCSuperTy = llvm::StructType::get(VMContext,
1019      Receiver->getType(), IdTy, NULL);
1020  llvm::Value *ObjCSuper = Builder.CreateAlloca(ObjCSuperTy);
1021
1022  Builder.CreateStore(Receiver, Builder.CreateStructGEP(ObjCSuper, 0));
1023  Builder.CreateStore(ReceiverClass, Builder.CreateStructGEP(ObjCSuper, 1));
1024
1025  ObjCSuper = EnforceType(Builder, ObjCSuper, PtrToObjCSuperTy);
1026  const llvm::FunctionType *impType =
1027    Types.GetFunctionType(FnInfo, Method ? Method->isVariadic() : false);
1028
1029  // Get the IMP
1030  llvm::Value *imp = LookupIMPSuper(CGF, ObjCSuper, cmd);
1031  imp = EnforceType(Builder, imp, llvm::PointerType::getUnqual(impType));
1032
1033  llvm::Value *impMD[] = {
1034      llvm::MDString::get(VMContext, Sel.getAsString()),
1035      llvm::MDString::get(VMContext, Class->getSuperClass()->getNameAsString()),
1036      llvm::ConstantInt::get(llvm::Type::getInt1Ty(VMContext), IsClassMessage)
1037   };
1038  llvm::MDNode *node = llvm::MDNode::get(VMContext, impMD, 3);
1039
1040  llvm::Instruction *call;
1041  RValue msgRet = CGF.EmitCall(FnInfo, imp, Return, ActualArgs,
1042      0, &call);
1043  call->setMetadata(msgSendMDKind, node);
1044  return msgRet;
1045}
1046
1047/// Generate code for a message send expression.
1048RValue
1049CGObjCGNU::GenerateMessageSend(CodeGenFunction &CGF,
1050                               ReturnValueSlot Return,
1051                               QualType ResultType,
1052                               Selector Sel,
1053                               llvm::Value *Receiver,
1054                               const CallArgList &CallArgs,
1055                               const ObjCInterfaceDecl *Class,
1056                               const ObjCMethodDecl *Method) {
1057  // Strip out message sends to retain / release in GC mode
1058  if (CGM.getLangOptions().getGCMode() != LangOptions::NonGC) {
1059    if (Sel == RetainSel || Sel == AutoreleaseSel) {
1060      return RValue::get(Receiver);
1061    }
1062    if (Sel == ReleaseSel) {
1063      return RValue::get(0);
1064    }
1065  }
1066
1067  CGBuilderTy &Builder = CGF.Builder;
1068
1069  // If the return type is something that goes in an integer register, the
1070  // runtime will handle 0 returns.  For other cases, we fill in the 0 value
1071  // ourselves.
1072  //
1073  // The language spec says the result of this kind of message send is
1074  // undefined, but lots of people seem to have forgotten to read that
1075  // paragraph and insist on sending messages to nil that have structure
1076  // returns.  With GCC, this generates a random return value (whatever happens
1077  // to be on the stack / in those registers at the time) on most platforms,
1078  // and generates an illegal instruction trap on SPARC.  With LLVM it corrupts
1079  // the stack.
1080  bool isPointerSizedReturn = (ResultType->isAnyPointerType() ||
1081      ResultType->isIntegralOrEnumerationType() || ResultType->isVoidType());
1082
1083  llvm::BasicBlock *startBB = 0;
1084  llvm::BasicBlock *messageBB = 0;
1085  llvm::BasicBlock *continueBB = 0;
1086
1087  if (!isPointerSizedReturn) {
1088    startBB = Builder.GetInsertBlock();
1089    messageBB = CGF.createBasicBlock("msgSend");
1090    continueBB = CGF.createBasicBlock("continue");
1091
1092    llvm::Value *isNil = Builder.CreateICmpEQ(Receiver,
1093            llvm::Constant::getNullValue(Receiver->getType()));
1094    Builder.CreateCondBr(isNil, continueBB, messageBB);
1095    CGF.EmitBlock(messageBB);
1096  }
1097
1098  IdTy = cast<llvm::PointerType>(CGM.getTypes().ConvertType(ASTIdTy));
1099  llvm::Value *cmd;
1100  if (Method)
1101    cmd = GetSelector(Builder, Method);
1102  else
1103    cmd = GetSelector(Builder, Sel);
1104  cmd = EnforceType(Builder, cmd, SelectorTy);
1105  Receiver = EnforceType(Builder, Receiver, IdTy);
1106
1107  llvm::Value *impMD[] = {
1108        llvm::MDString::get(VMContext, Sel.getAsString()),
1109        llvm::MDString::get(VMContext, Class ? Class->getNameAsString() :""),
1110        llvm::ConstantInt::get(llvm::Type::getInt1Ty(VMContext), Class!=0)
1111   };
1112  llvm::MDNode *node = llvm::MDNode::get(VMContext, impMD, 3);
1113
1114  // Get the IMP to call
1115  llvm::Value *imp = LookupIMP(CGF, Receiver, cmd, node);
1116
1117  CallArgList ActualArgs;
1118  ActualArgs.push_back(
1119    std::make_pair(RValue::get(Receiver), ASTIdTy));
1120  ActualArgs.push_back(std::make_pair(RValue::get(cmd),
1121                                      CGF.getContext().getObjCSelType()));
1122  ActualArgs.insert(ActualArgs.end(), CallArgs.begin(), CallArgs.end());
1123
1124  CodeGenTypes &Types = CGM.getTypes();
1125  const CGFunctionInfo &FnInfo = Types.getFunctionInfo(ResultType, ActualArgs,
1126                                                       FunctionType::ExtInfo());
1127  const llvm::FunctionType *impType =
1128    Types.GetFunctionType(FnInfo, Method ? Method->isVariadic() : false);
1129  imp = EnforceType(Builder, imp, llvm::PointerType::getUnqual(impType));
1130
1131
1132  // For sender-aware dispatch, we pass the sender as the third argument to a
1133  // lookup function.  When sending messages from C code, the sender is nil.
1134  // objc_msg_lookup_sender(id *receiver, SEL selector, id sender);
1135  llvm::Instruction *call;
1136  RValue msgRet = CGF.EmitCall(FnInfo, imp, Return, ActualArgs,
1137      0, &call);
1138  call->setMetadata(msgSendMDKind, node);
1139
1140
1141  if (!isPointerSizedReturn) {
1142    messageBB = CGF.Builder.GetInsertBlock();
1143    CGF.Builder.CreateBr(continueBB);
1144    CGF.EmitBlock(continueBB);
1145    if (msgRet.isScalar()) {
1146      llvm::Value *v = msgRet.getScalarVal();
1147      llvm::PHINode *phi = Builder.CreatePHI(v->getType());
1148      phi->addIncoming(v, messageBB);
1149      phi->addIncoming(llvm::Constant::getNullValue(v->getType()), startBB);
1150      msgRet = RValue::get(phi);
1151    } else if (msgRet.isAggregate()) {
1152      llvm::Value *v = msgRet.getAggregateAddr();
1153      llvm::PHINode *phi = Builder.CreatePHI(v->getType());
1154      const llvm::PointerType *RetTy = cast<llvm::PointerType>(v->getType());
1155      llvm::AllocaInst *NullVal =
1156          CGF.CreateTempAlloca(RetTy->getElementType(), "null");
1157      CGF.InitTempAlloca(NullVal,
1158          llvm::Constant::getNullValue(RetTy->getElementType()));
1159      phi->addIncoming(v, messageBB);
1160      phi->addIncoming(NullVal, startBB);
1161      msgRet = RValue::getAggregate(phi);
1162    } else /* isComplex() */ {
1163      std::pair<llvm::Value*,llvm::Value*> v = msgRet.getComplexVal();
1164      llvm::PHINode *phi = Builder.CreatePHI(v.first->getType());
1165      phi->addIncoming(v.first, messageBB);
1166      phi->addIncoming(llvm::Constant::getNullValue(v.first->getType()),
1167          startBB);
1168      llvm::PHINode *phi2 = Builder.CreatePHI(v.second->getType());
1169      phi2->addIncoming(v.second, messageBB);
1170      phi2->addIncoming(llvm::Constant::getNullValue(v.second->getType()),
1171          startBB);
1172      msgRet = RValue::getComplex(phi, phi2);
1173    }
1174  }
1175  return msgRet;
1176}
1177
1178/// Generates a MethodList.  Used in construction of a objc_class and
1179/// objc_category structures.
1180llvm::Constant *CGObjCGNU::GenerateMethodList(const llvm::StringRef &ClassName,
1181                                              const llvm::StringRef &CategoryName,
1182    const llvm::SmallVectorImpl<Selector> &MethodSels,
1183    const llvm::SmallVectorImpl<llvm::Constant *> &MethodTypes,
1184    bool isClassMethodList) {
1185  if (MethodSels.empty())
1186    return NULLPtr;
1187  // Get the method structure type.
1188  llvm::StructType *ObjCMethodTy = llvm::StructType::get(VMContext,
1189    PtrToInt8Ty, // Really a selector, but the runtime creates it us.
1190    PtrToInt8Ty, // Method types
1191    IMPTy, //Method pointer
1192    NULL);
1193  std::vector<llvm::Constant*> Methods;
1194  std::vector<llvm::Constant*> Elements;
1195  for (unsigned int i = 0, e = MethodTypes.size(); i < e; ++i) {
1196    Elements.clear();
1197    llvm::Constant *Method =
1198      TheModule.getFunction(SymbolNameForMethod(ClassName, CategoryName,
1199                                                MethodSels[i],
1200                                                isClassMethodList));
1201    assert(Method && "Can't generate metadata for method that doesn't exist");
1202    llvm::Constant *C = MakeConstantString(MethodSels[i].getAsString());
1203    Elements.push_back(C);
1204    Elements.push_back(MethodTypes[i]);
1205    Method = llvm::ConstantExpr::getBitCast(Method,
1206        IMPTy);
1207    Elements.push_back(Method);
1208    Methods.push_back(llvm::ConstantStruct::get(ObjCMethodTy, Elements));
1209  }
1210
1211  // Array of method structures
1212  llvm::ArrayType *ObjCMethodArrayTy = llvm::ArrayType::get(ObjCMethodTy,
1213                                                            Methods.size());
1214  llvm::Constant *MethodArray = llvm::ConstantArray::get(ObjCMethodArrayTy,
1215                                                         Methods);
1216
1217  // Structure containing list pointer, array and array count
1218  llvm::SmallVector<const llvm::Type*, 16> ObjCMethodListFields;
1219  llvm::PATypeHolder OpaqueNextTy = llvm::OpaqueType::get(VMContext);
1220  llvm::Type *NextPtrTy = llvm::PointerType::getUnqual(OpaqueNextTy);
1221  llvm::StructType *ObjCMethodListTy = llvm::StructType::get(VMContext,
1222      NextPtrTy,
1223      IntTy,
1224      ObjCMethodArrayTy,
1225      NULL);
1226  // Refine next pointer type to concrete type
1227  llvm::cast<llvm::OpaqueType>(
1228      OpaqueNextTy.get())->refineAbstractTypeTo(ObjCMethodListTy);
1229  ObjCMethodListTy = llvm::cast<llvm::StructType>(OpaqueNextTy.get());
1230
1231  Methods.clear();
1232  Methods.push_back(llvm::ConstantPointerNull::get(
1233        llvm::PointerType::getUnqual(ObjCMethodListTy)));
1234  Methods.push_back(llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext),
1235        MethodTypes.size()));
1236  Methods.push_back(MethodArray);
1237
1238  // Create an instance of the structure
1239  return MakeGlobal(ObjCMethodListTy, Methods, ".objc_method_list");
1240}
1241
1242/// Generates an IvarList.  Used in construction of a objc_class.
1243llvm::Constant *CGObjCGNU::GenerateIvarList(
1244    const llvm::SmallVectorImpl<llvm::Constant *>  &IvarNames,
1245    const llvm::SmallVectorImpl<llvm::Constant *>  &IvarTypes,
1246    const llvm::SmallVectorImpl<llvm::Constant *>  &IvarOffsets) {
1247  if (IvarNames.size() == 0)
1248    return NULLPtr;
1249  // Get the method structure type.
1250  llvm::StructType *ObjCIvarTy = llvm::StructType::get(VMContext,
1251    PtrToInt8Ty,
1252    PtrToInt8Ty,
1253    IntTy,
1254    NULL);
1255  std::vector<llvm::Constant*> Ivars;
1256  std::vector<llvm::Constant*> Elements;
1257  for (unsigned int i = 0, e = IvarNames.size() ; i < e ; i++) {
1258    Elements.clear();
1259    Elements.push_back(IvarNames[i]);
1260    Elements.push_back(IvarTypes[i]);
1261    Elements.push_back(IvarOffsets[i]);
1262    Ivars.push_back(llvm::ConstantStruct::get(ObjCIvarTy, Elements));
1263  }
1264
1265  // Array of method structures
1266  llvm::ArrayType *ObjCIvarArrayTy = llvm::ArrayType::get(ObjCIvarTy,
1267      IvarNames.size());
1268
1269
1270  Elements.clear();
1271  Elements.push_back(llvm::ConstantInt::get(IntTy, (int)IvarNames.size()));
1272  Elements.push_back(llvm::ConstantArray::get(ObjCIvarArrayTy, Ivars));
1273  // Structure containing array and array count
1274  llvm::StructType *ObjCIvarListTy = llvm::StructType::get(VMContext, IntTy,
1275    ObjCIvarArrayTy,
1276    NULL);
1277
1278  // Create an instance of the structure
1279  return MakeGlobal(ObjCIvarListTy, Elements, ".objc_ivar_list");
1280}
1281
1282/// Generate a class structure
1283llvm::Constant *CGObjCGNU::GenerateClassStructure(
1284    llvm::Constant *MetaClass,
1285    llvm::Constant *SuperClass,
1286    unsigned info,
1287    const char *Name,
1288    llvm::Constant *Version,
1289    llvm::Constant *InstanceSize,
1290    llvm::Constant *IVars,
1291    llvm::Constant *Methods,
1292    llvm::Constant *Protocols,
1293    llvm::Constant *IvarOffsets,
1294    llvm::Constant *Properties,
1295    bool isMeta) {
1296  // Set up the class structure
1297  // Note:  Several of these are char*s when they should be ids.  This is
1298  // because the runtime performs this translation on load.
1299  //
1300  // Fields marked New ABI are part of the GNUstep runtime.  We emit them
1301  // anyway; the classes will still work with the GNU runtime, they will just
1302  // be ignored.
1303  llvm::StructType *ClassTy = llvm::StructType::get(VMContext,
1304      PtrToInt8Ty,        // class_pointer
1305      PtrToInt8Ty,        // super_class
1306      PtrToInt8Ty,        // name
1307      LongTy,             // version
1308      LongTy,             // info
1309      LongTy,             // instance_size
1310      IVars->getType(),   // ivars
1311      Methods->getType(), // methods
1312      // These are all filled in by the runtime, so we pretend
1313      PtrTy,              // dtable
1314      PtrTy,              // subclass_list
1315      PtrTy,              // sibling_class
1316      PtrTy,              // protocols
1317      PtrTy,              // gc_object_type
1318      // New ABI:
1319      LongTy,                 // abi_version
1320      IvarOffsets->getType(), // ivar_offsets
1321      Properties->getType(),  // properties
1322      NULL);
1323  llvm::Constant *Zero = llvm::ConstantInt::get(LongTy, 0);
1324  // Fill in the structure
1325  std::vector<llvm::Constant*> Elements;
1326  Elements.push_back(llvm::ConstantExpr::getBitCast(MetaClass, PtrToInt8Ty));
1327  Elements.push_back(SuperClass);
1328  Elements.push_back(MakeConstantString(Name, ".class_name"));
1329  Elements.push_back(Zero);
1330  Elements.push_back(llvm::ConstantInt::get(LongTy, info));
1331  if (isMeta) {
1332    llvm::TargetData td(&TheModule);
1333    Elements.push_back(llvm::ConstantInt::get(LongTy,
1334                     td.getTypeSizeInBits(ClassTy)/8));
1335  } else
1336    Elements.push_back(InstanceSize);
1337  Elements.push_back(IVars);
1338  Elements.push_back(Methods);
1339  Elements.push_back(NULLPtr);
1340  Elements.push_back(NULLPtr);
1341  Elements.push_back(NULLPtr);
1342  Elements.push_back(llvm::ConstantExpr::getBitCast(Protocols, PtrTy));
1343  Elements.push_back(NULLPtr);
1344  Elements.push_back(Zero);
1345  Elements.push_back(IvarOffsets);
1346  Elements.push_back(Properties);
1347  // Create an instance of the structure
1348  // This is now an externally visible symbol, so that we can speed up class
1349  // messages in the next ABI.
1350  return MakeGlobal(ClassTy, Elements, (isMeta ? "_OBJC_METACLASS_":
1351      "_OBJC_CLASS_") + std::string(Name), llvm::GlobalValue::ExternalLinkage);
1352}
1353
1354llvm::Constant *CGObjCGNU::GenerateProtocolMethodList(
1355    const llvm::SmallVectorImpl<llvm::Constant *>  &MethodNames,
1356    const llvm::SmallVectorImpl<llvm::Constant *>  &MethodTypes) {
1357  // Get the method structure type.
1358  llvm::StructType *ObjCMethodDescTy = llvm::StructType::get(VMContext,
1359    PtrToInt8Ty, // Really a selector, but the runtime does the casting for us.
1360    PtrToInt8Ty,
1361    NULL);
1362  std::vector<llvm::Constant*> Methods;
1363  std::vector<llvm::Constant*> Elements;
1364  for (unsigned int i = 0, e = MethodTypes.size() ; i < e ; i++) {
1365    Elements.clear();
1366    Elements.push_back(MethodNames[i]);
1367    Elements.push_back(MethodTypes[i]);
1368    Methods.push_back(llvm::ConstantStruct::get(ObjCMethodDescTy, Elements));
1369  }
1370  llvm::ArrayType *ObjCMethodArrayTy = llvm::ArrayType::get(ObjCMethodDescTy,
1371      MethodNames.size());
1372  llvm::Constant *Array = llvm::ConstantArray::get(ObjCMethodArrayTy,
1373                                                   Methods);
1374  llvm::StructType *ObjCMethodDescListTy = llvm::StructType::get(VMContext,
1375      IntTy, ObjCMethodArrayTy, NULL);
1376  Methods.clear();
1377  Methods.push_back(llvm::ConstantInt::get(IntTy, MethodNames.size()));
1378  Methods.push_back(Array);
1379  return MakeGlobal(ObjCMethodDescListTy, Methods, ".objc_method_list");
1380}
1381
1382// Create the protocol list structure used in classes, categories and so on
1383llvm::Constant *CGObjCGNU::GenerateProtocolList(
1384    const llvm::SmallVectorImpl<std::string> &Protocols) {
1385  llvm::ArrayType *ProtocolArrayTy = llvm::ArrayType::get(PtrToInt8Ty,
1386      Protocols.size());
1387  llvm::StructType *ProtocolListTy = llvm::StructType::get(VMContext,
1388      PtrTy, //Should be a recurisve pointer, but it's always NULL here.
1389      SizeTy,
1390      ProtocolArrayTy,
1391      NULL);
1392  std::vector<llvm::Constant*> Elements;
1393  for (const std::string *iter = Protocols.begin(), *endIter = Protocols.end();
1394      iter != endIter ; iter++) {
1395    llvm::Constant *protocol = 0;
1396    llvm::StringMap<llvm::Constant*>::iterator value =
1397      ExistingProtocols.find(*iter);
1398    if (value == ExistingProtocols.end()) {
1399      protocol = GenerateEmptyProtocol(*iter);
1400    } else {
1401      protocol = value->getValue();
1402    }
1403    llvm::Constant *Ptr = llvm::ConstantExpr::getBitCast(protocol,
1404                                                           PtrToInt8Ty);
1405    Elements.push_back(Ptr);
1406  }
1407  llvm::Constant * ProtocolArray = llvm::ConstantArray::get(ProtocolArrayTy,
1408      Elements);
1409  Elements.clear();
1410  Elements.push_back(NULLPtr);
1411  Elements.push_back(llvm::ConstantInt::get(LongTy, Protocols.size()));
1412  Elements.push_back(ProtocolArray);
1413  return MakeGlobal(ProtocolListTy, Elements, ".objc_protocol_list");
1414}
1415
1416llvm::Value *CGObjCGNU::GenerateProtocolRef(CGBuilderTy &Builder,
1417                                            const ObjCProtocolDecl *PD) {
1418  llvm::Value *protocol = ExistingProtocols[PD->getNameAsString()];
1419  const llvm::Type *T =
1420    CGM.getTypes().ConvertType(CGM.getContext().getObjCProtoType());
1421  return Builder.CreateBitCast(protocol, llvm::PointerType::getUnqual(T));
1422}
1423
1424llvm::Constant *CGObjCGNU::GenerateEmptyProtocol(
1425  const std::string &ProtocolName) {
1426  llvm::SmallVector<std::string, 0> EmptyStringVector;
1427  llvm::SmallVector<llvm::Constant*, 0> EmptyConstantVector;
1428
1429  llvm::Constant *ProtocolList = GenerateProtocolList(EmptyStringVector);
1430  llvm::Constant *MethodList =
1431    GenerateProtocolMethodList(EmptyConstantVector, EmptyConstantVector);
1432  // Protocols are objects containing lists of the methods implemented and
1433  // protocols adopted.
1434  llvm::StructType *ProtocolTy = llvm::StructType::get(VMContext, IdTy,
1435      PtrToInt8Ty,
1436      ProtocolList->getType(),
1437      MethodList->getType(),
1438      MethodList->getType(),
1439      MethodList->getType(),
1440      MethodList->getType(),
1441      NULL);
1442  std::vector<llvm::Constant*> Elements;
1443  // The isa pointer must be set to a magic number so the runtime knows it's
1444  // the correct layout.
1445  Elements.push_back(llvm::ConstantExpr::getIntToPtr(
1446        llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext),
1447          ProtocolVersion), IdTy));
1448  Elements.push_back(MakeConstantString(ProtocolName, ".objc_protocol_name"));
1449  Elements.push_back(ProtocolList);
1450  Elements.push_back(MethodList);
1451  Elements.push_back(MethodList);
1452  Elements.push_back(MethodList);
1453  Elements.push_back(MethodList);
1454  return MakeGlobal(ProtocolTy, Elements, ".objc_protocol");
1455}
1456
1457void CGObjCGNU::GenerateProtocol(const ObjCProtocolDecl *PD) {
1458  ASTContext &Context = CGM.getContext();
1459  std::string ProtocolName = PD->getNameAsString();
1460  llvm::SmallVector<std::string, 16> Protocols;
1461  for (ObjCProtocolDecl::protocol_iterator PI = PD->protocol_begin(),
1462       E = PD->protocol_end(); PI != E; ++PI)
1463    Protocols.push_back((*PI)->getNameAsString());
1464  llvm::SmallVector<llvm::Constant*, 16> InstanceMethodNames;
1465  llvm::SmallVector<llvm::Constant*, 16> InstanceMethodTypes;
1466  llvm::SmallVector<llvm::Constant*, 16> OptionalInstanceMethodNames;
1467  llvm::SmallVector<llvm::Constant*, 16> OptionalInstanceMethodTypes;
1468  for (ObjCProtocolDecl::instmeth_iterator iter = PD->instmeth_begin(),
1469       E = PD->instmeth_end(); iter != E; iter++) {
1470    std::string TypeStr;
1471    Context.getObjCEncodingForMethodDecl(*iter, TypeStr);
1472    if ((*iter)->getImplementationControl() == ObjCMethodDecl::Optional) {
1473      InstanceMethodNames.push_back(
1474          MakeConstantString((*iter)->getSelector().getAsString()));
1475      InstanceMethodTypes.push_back(MakeConstantString(TypeStr));
1476    } else {
1477      OptionalInstanceMethodNames.push_back(
1478          MakeConstantString((*iter)->getSelector().getAsString()));
1479      OptionalInstanceMethodTypes.push_back(MakeConstantString(TypeStr));
1480    }
1481  }
1482  // Collect information about class methods:
1483  llvm::SmallVector<llvm::Constant*, 16> ClassMethodNames;
1484  llvm::SmallVector<llvm::Constant*, 16> ClassMethodTypes;
1485  llvm::SmallVector<llvm::Constant*, 16> OptionalClassMethodNames;
1486  llvm::SmallVector<llvm::Constant*, 16> OptionalClassMethodTypes;
1487  for (ObjCProtocolDecl::classmeth_iterator
1488         iter = PD->classmeth_begin(), endIter = PD->classmeth_end();
1489       iter != endIter ; iter++) {
1490    std::string TypeStr;
1491    Context.getObjCEncodingForMethodDecl((*iter),TypeStr);
1492    if ((*iter)->getImplementationControl() == ObjCMethodDecl::Optional) {
1493      ClassMethodNames.push_back(
1494          MakeConstantString((*iter)->getSelector().getAsString()));
1495      ClassMethodTypes.push_back(MakeConstantString(TypeStr));
1496    } else {
1497      OptionalClassMethodNames.push_back(
1498          MakeConstantString((*iter)->getSelector().getAsString()));
1499      OptionalClassMethodTypes.push_back(MakeConstantString(TypeStr));
1500    }
1501  }
1502
1503  llvm::Constant *ProtocolList = GenerateProtocolList(Protocols);
1504  llvm::Constant *InstanceMethodList =
1505    GenerateProtocolMethodList(InstanceMethodNames, InstanceMethodTypes);
1506  llvm::Constant *ClassMethodList =
1507    GenerateProtocolMethodList(ClassMethodNames, ClassMethodTypes);
1508  llvm::Constant *OptionalInstanceMethodList =
1509    GenerateProtocolMethodList(OptionalInstanceMethodNames,
1510            OptionalInstanceMethodTypes);
1511  llvm::Constant *OptionalClassMethodList =
1512    GenerateProtocolMethodList(OptionalClassMethodNames,
1513            OptionalClassMethodTypes);
1514
1515  // Property metadata: name, attributes, isSynthesized, setter name, setter
1516  // types, getter name, getter types.
1517  // The isSynthesized value is always set to 0 in a protocol.  It exists to
1518  // simplify the runtime library by allowing it to use the same data
1519  // structures for protocol metadata everywhere.
1520  llvm::StructType *PropertyMetadataTy = llvm::StructType::get(VMContext,
1521          PtrToInt8Ty, Int8Ty, Int8Ty, PtrToInt8Ty, PtrToInt8Ty, PtrToInt8Ty,
1522          PtrToInt8Ty, NULL);
1523  std::vector<llvm::Constant*> Properties;
1524  std::vector<llvm::Constant*> OptionalProperties;
1525
1526  // Add all of the property methods need adding to the method list and to the
1527  // property metadata list.
1528  for (ObjCContainerDecl::prop_iterator
1529         iter = PD->prop_begin(), endIter = PD->prop_end();
1530       iter != endIter ; iter++) {
1531    std::vector<llvm::Constant*> Fields;
1532    ObjCPropertyDecl *property = (*iter);
1533
1534    Fields.push_back(MakeConstantString(property->getNameAsString()));
1535    Fields.push_back(llvm::ConstantInt::get(Int8Ty,
1536                property->getPropertyAttributes()));
1537    Fields.push_back(llvm::ConstantInt::get(Int8Ty, 0));
1538    if (ObjCMethodDecl *getter = property->getGetterMethodDecl()) {
1539      std::string TypeStr;
1540      Context.getObjCEncodingForMethodDecl(getter,TypeStr);
1541      llvm::Constant *TypeEncoding = MakeConstantString(TypeStr);
1542      InstanceMethodTypes.push_back(TypeEncoding);
1543      Fields.push_back(MakeConstantString(getter->getSelector().getAsString()));
1544      Fields.push_back(TypeEncoding);
1545    } else {
1546      Fields.push_back(NULLPtr);
1547      Fields.push_back(NULLPtr);
1548    }
1549    if (ObjCMethodDecl *setter = property->getSetterMethodDecl()) {
1550      std::string TypeStr;
1551      Context.getObjCEncodingForMethodDecl(setter,TypeStr);
1552      llvm::Constant *TypeEncoding = MakeConstantString(TypeStr);
1553      InstanceMethodTypes.push_back(TypeEncoding);
1554      Fields.push_back(MakeConstantString(setter->getSelector().getAsString()));
1555      Fields.push_back(TypeEncoding);
1556    } else {
1557      Fields.push_back(NULLPtr);
1558      Fields.push_back(NULLPtr);
1559    }
1560    if (property->getPropertyImplementation() == ObjCPropertyDecl::Optional) {
1561      OptionalProperties.push_back(llvm::ConstantStruct::get(PropertyMetadataTy, Fields));
1562    } else {
1563      Properties.push_back(llvm::ConstantStruct::get(PropertyMetadataTy, Fields));
1564    }
1565  }
1566  llvm::Constant *PropertyArray = llvm::ConstantArray::get(
1567      llvm::ArrayType::get(PropertyMetadataTy, Properties.size()), Properties);
1568  llvm::Constant* PropertyListInitFields[] =
1569    {llvm::ConstantInt::get(IntTy, Properties.size()), NULLPtr, PropertyArray};
1570
1571  llvm::Constant *PropertyListInit =
1572      llvm::ConstantStruct::get(VMContext, PropertyListInitFields, 3, false);
1573  llvm::Constant *PropertyList = new llvm::GlobalVariable(TheModule,
1574      PropertyListInit->getType(), false, llvm::GlobalValue::InternalLinkage,
1575      PropertyListInit, ".objc_property_list");
1576
1577  llvm::Constant *OptionalPropertyArray =
1578      llvm::ConstantArray::get(llvm::ArrayType::get(PropertyMetadataTy,
1579          OptionalProperties.size()) , OptionalProperties);
1580  llvm::Constant* OptionalPropertyListInitFields[] = {
1581      llvm::ConstantInt::get(IntTy, OptionalProperties.size()), NULLPtr,
1582      OptionalPropertyArray };
1583
1584  llvm::Constant *OptionalPropertyListInit =
1585      llvm::ConstantStruct::get(VMContext, OptionalPropertyListInitFields, 3, false);
1586  llvm::Constant *OptionalPropertyList = new llvm::GlobalVariable(TheModule,
1587          OptionalPropertyListInit->getType(), false,
1588          llvm::GlobalValue::InternalLinkage, OptionalPropertyListInit,
1589          ".objc_property_list");
1590
1591  // Protocols are objects containing lists of the methods implemented and
1592  // protocols adopted.
1593  llvm::StructType *ProtocolTy = llvm::StructType::get(VMContext, IdTy,
1594      PtrToInt8Ty,
1595      ProtocolList->getType(),
1596      InstanceMethodList->getType(),
1597      ClassMethodList->getType(),
1598      OptionalInstanceMethodList->getType(),
1599      OptionalClassMethodList->getType(),
1600      PropertyList->getType(),
1601      OptionalPropertyList->getType(),
1602      NULL);
1603  std::vector<llvm::Constant*> Elements;
1604  // The isa pointer must be set to a magic number so the runtime knows it's
1605  // the correct layout.
1606  Elements.push_back(llvm::ConstantExpr::getIntToPtr(
1607        llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext),
1608          ProtocolVersion), IdTy));
1609  Elements.push_back(MakeConstantString(ProtocolName, ".objc_protocol_name"));
1610  Elements.push_back(ProtocolList);
1611  Elements.push_back(InstanceMethodList);
1612  Elements.push_back(ClassMethodList);
1613  Elements.push_back(OptionalInstanceMethodList);
1614  Elements.push_back(OptionalClassMethodList);
1615  Elements.push_back(PropertyList);
1616  Elements.push_back(OptionalPropertyList);
1617  ExistingProtocols[ProtocolName] =
1618    llvm::ConstantExpr::getBitCast(MakeGlobal(ProtocolTy, Elements,
1619          ".objc_protocol"), IdTy);
1620}
1621void CGObjCGNU::GenerateProtocolHolderCategory(void) {
1622  // Collect information about instance methods
1623  llvm::SmallVector<Selector, 1> MethodSels;
1624  llvm::SmallVector<llvm::Constant*, 1> MethodTypes;
1625
1626  std::vector<llvm::Constant*> Elements;
1627  const std::string ClassName = "__ObjC_Protocol_Holder_Ugly_Hack";
1628  const std::string CategoryName = "AnotherHack";
1629  Elements.push_back(MakeConstantString(CategoryName));
1630  Elements.push_back(MakeConstantString(ClassName));
1631  // Instance method list
1632  Elements.push_back(llvm::ConstantExpr::getBitCast(GenerateMethodList(
1633          ClassName, CategoryName, MethodSels, MethodTypes, false), PtrTy));
1634  // Class method list
1635  Elements.push_back(llvm::ConstantExpr::getBitCast(GenerateMethodList(
1636          ClassName, CategoryName, MethodSels, MethodTypes, true), PtrTy));
1637  // Protocol list
1638  llvm::ArrayType *ProtocolArrayTy = llvm::ArrayType::get(PtrTy,
1639      ExistingProtocols.size());
1640  llvm::StructType *ProtocolListTy = llvm::StructType::get(VMContext,
1641      PtrTy, //Should be a recurisve pointer, but it's always NULL here.
1642      SizeTy,
1643      ProtocolArrayTy,
1644      NULL);
1645  std::vector<llvm::Constant*> ProtocolElements;
1646  for (llvm::StringMapIterator<llvm::Constant*> iter =
1647       ExistingProtocols.begin(), endIter = ExistingProtocols.end();
1648       iter != endIter ; iter++) {
1649    llvm::Constant *Ptr = llvm::ConstantExpr::getBitCast(iter->getValue(),
1650            PtrTy);
1651    ProtocolElements.push_back(Ptr);
1652  }
1653  llvm::Constant * ProtocolArray = llvm::ConstantArray::get(ProtocolArrayTy,
1654      ProtocolElements);
1655  ProtocolElements.clear();
1656  ProtocolElements.push_back(NULLPtr);
1657  ProtocolElements.push_back(llvm::ConstantInt::get(LongTy,
1658              ExistingProtocols.size()));
1659  ProtocolElements.push_back(ProtocolArray);
1660  Elements.push_back(llvm::ConstantExpr::getBitCast(MakeGlobal(ProtocolListTy,
1661                  ProtocolElements, ".objc_protocol_list"), PtrTy));
1662  Categories.push_back(llvm::ConstantExpr::getBitCast(
1663        MakeGlobal(llvm::StructType::get(VMContext, PtrToInt8Ty, PtrToInt8Ty,
1664            PtrTy, PtrTy, PtrTy, NULL), Elements), PtrTy));
1665}
1666
1667void CGObjCGNU::GenerateCategory(const ObjCCategoryImplDecl *OCD) {
1668  std::string ClassName = OCD->getClassInterface()->getNameAsString();
1669  std::string CategoryName = OCD->getNameAsString();
1670  // Collect information about instance methods
1671  llvm::SmallVector<Selector, 16> InstanceMethodSels;
1672  llvm::SmallVector<llvm::Constant*, 16> InstanceMethodTypes;
1673  for (ObjCCategoryImplDecl::instmeth_iterator
1674         iter = OCD->instmeth_begin(), endIter = OCD->instmeth_end();
1675       iter != endIter ; iter++) {
1676    InstanceMethodSels.push_back((*iter)->getSelector());
1677    std::string TypeStr;
1678    CGM.getContext().getObjCEncodingForMethodDecl(*iter,TypeStr);
1679    InstanceMethodTypes.push_back(MakeConstantString(TypeStr));
1680  }
1681
1682  // Collect information about class methods
1683  llvm::SmallVector<Selector, 16> ClassMethodSels;
1684  llvm::SmallVector<llvm::Constant*, 16> ClassMethodTypes;
1685  for (ObjCCategoryImplDecl::classmeth_iterator
1686         iter = OCD->classmeth_begin(), endIter = OCD->classmeth_end();
1687       iter != endIter ; iter++) {
1688    ClassMethodSels.push_back((*iter)->getSelector());
1689    std::string TypeStr;
1690    CGM.getContext().getObjCEncodingForMethodDecl(*iter,TypeStr);
1691    ClassMethodTypes.push_back(MakeConstantString(TypeStr));
1692  }
1693
1694  // Collect the names of referenced protocols
1695  llvm::SmallVector<std::string, 16> Protocols;
1696  const ObjCCategoryDecl *CatDecl = OCD->getCategoryDecl();
1697  const ObjCList<ObjCProtocolDecl> &Protos = CatDecl->getReferencedProtocols();
1698  for (ObjCList<ObjCProtocolDecl>::iterator I = Protos.begin(),
1699       E = Protos.end(); I != E; ++I)
1700    Protocols.push_back((*I)->getNameAsString());
1701
1702  std::vector<llvm::Constant*> Elements;
1703  Elements.push_back(MakeConstantString(CategoryName));
1704  Elements.push_back(MakeConstantString(ClassName));
1705  // Instance method list
1706  Elements.push_back(llvm::ConstantExpr::getBitCast(GenerateMethodList(
1707          ClassName, CategoryName, InstanceMethodSels, InstanceMethodTypes,
1708          false), PtrTy));
1709  // Class method list
1710  Elements.push_back(llvm::ConstantExpr::getBitCast(GenerateMethodList(
1711          ClassName, CategoryName, ClassMethodSels, ClassMethodTypes, true),
1712        PtrTy));
1713  // Protocol list
1714  Elements.push_back(llvm::ConstantExpr::getBitCast(
1715        GenerateProtocolList(Protocols), PtrTy));
1716  Categories.push_back(llvm::ConstantExpr::getBitCast(
1717        MakeGlobal(llvm::StructType::get(VMContext, PtrToInt8Ty, PtrToInt8Ty,
1718            PtrTy, PtrTy, PtrTy, NULL), Elements), PtrTy));
1719}
1720
1721llvm::Constant *CGObjCGNU::GeneratePropertyList(const ObjCImplementationDecl *OID,
1722        llvm::SmallVectorImpl<Selector> &InstanceMethodSels,
1723        llvm::SmallVectorImpl<llvm::Constant*> &InstanceMethodTypes) {
1724  ASTContext &Context = CGM.getContext();
1725  //
1726  // Property metadata: name, attributes, isSynthesized, setter name, setter
1727  // types, getter name, getter types.
1728  llvm::StructType *PropertyMetadataTy = llvm::StructType::get(VMContext,
1729          PtrToInt8Ty, Int8Ty, Int8Ty, PtrToInt8Ty, PtrToInt8Ty, PtrToInt8Ty,
1730          PtrToInt8Ty, NULL);
1731  std::vector<llvm::Constant*> Properties;
1732
1733
1734  // Add all of the property methods need adding to the method list and to the
1735  // property metadata list.
1736  for (ObjCImplDecl::propimpl_iterator
1737         iter = OID->propimpl_begin(), endIter = OID->propimpl_end();
1738       iter != endIter ; iter++) {
1739    std::vector<llvm::Constant*> Fields;
1740    ObjCPropertyDecl *property = (*iter)->getPropertyDecl();
1741    ObjCPropertyImplDecl *propertyImpl = *iter;
1742    bool isSynthesized = (propertyImpl->getPropertyImplementation() ==
1743        ObjCPropertyImplDecl::Synthesize);
1744
1745    Fields.push_back(MakeConstantString(property->getNameAsString()));
1746    Fields.push_back(llvm::ConstantInt::get(Int8Ty,
1747                property->getPropertyAttributes()));
1748    Fields.push_back(llvm::ConstantInt::get(Int8Ty, isSynthesized));
1749    if (ObjCMethodDecl *getter = property->getGetterMethodDecl()) {
1750      std::string TypeStr;
1751      Context.getObjCEncodingForMethodDecl(getter,TypeStr);
1752      llvm::Constant *TypeEncoding = MakeConstantString(TypeStr);
1753      if (isSynthesized) {
1754        InstanceMethodTypes.push_back(TypeEncoding);
1755        InstanceMethodSels.push_back(getter->getSelector());
1756      }
1757      Fields.push_back(MakeConstantString(getter->getSelector().getAsString()));
1758      Fields.push_back(TypeEncoding);
1759    } else {
1760      Fields.push_back(NULLPtr);
1761      Fields.push_back(NULLPtr);
1762    }
1763    if (ObjCMethodDecl *setter = property->getSetterMethodDecl()) {
1764      std::string TypeStr;
1765      Context.getObjCEncodingForMethodDecl(setter,TypeStr);
1766      llvm::Constant *TypeEncoding = MakeConstantString(TypeStr);
1767      if (isSynthesized) {
1768        InstanceMethodTypes.push_back(TypeEncoding);
1769        InstanceMethodSels.push_back(setter->getSelector());
1770      }
1771      Fields.push_back(MakeConstantString(setter->getSelector().getAsString()));
1772      Fields.push_back(TypeEncoding);
1773    } else {
1774      Fields.push_back(NULLPtr);
1775      Fields.push_back(NULLPtr);
1776    }
1777    Properties.push_back(llvm::ConstantStruct::get(PropertyMetadataTy, Fields));
1778  }
1779  llvm::ArrayType *PropertyArrayTy =
1780      llvm::ArrayType::get(PropertyMetadataTy, Properties.size());
1781  llvm::Constant *PropertyArray = llvm::ConstantArray::get(PropertyArrayTy,
1782          Properties);
1783  llvm::Constant* PropertyListInitFields[] =
1784    {llvm::ConstantInt::get(IntTy, Properties.size()), NULLPtr, PropertyArray};
1785
1786  llvm::Constant *PropertyListInit =
1787      llvm::ConstantStruct::get(VMContext, PropertyListInitFields, 3, false);
1788  return new llvm::GlobalVariable(TheModule, PropertyListInit->getType(), false,
1789          llvm::GlobalValue::InternalLinkage, PropertyListInit,
1790          ".objc_property_list");
1791}
1792
1793void CGObjCGNU::GenerateClass(const ObjCImplementationDecl *OID) {
1794  ASTContext &Context = CGM.getContext();
1795
1796  // Get the superclass name.
1797  const ObjCInterfaceDecl * SuperClassDecl =
1798    OID->getClassInterface()->getSuperClass();
1799  std::string SuperClassName;
1800  if (SuperClassDecl) {
1801    SuperClassName = SuperClassDecl->getNameAsString();
1802    EmitClassRef(SuperClassName);
1803  }
1804
1805  // Get the class name
1806  ObjCInterfaceDecl *ClassDecl =
1807    const_cast<ObjCInterfaceDecl *>(OID->getClassInterface());
1808  std::string ClassName = ClassDecl->getNameAsString();
1809  // Emit the symbol that is used to generate linker errors if this class is
1810  // referenced in other modules but not declared.
1811  std::string classSymbolName = "__objc_class_name_" + ClassName;
1812  if (llvm::GlobalVariable *symbol =
1813      TheModule.getGlobalVariable(classSymbolName)) {
1814    symbol->setInitializer(llvm::ConstantInt::get(LongTy, 0));
1815  } else {
1816    new llvm::GlobalVariable(TheModule, LongTy, false,
1817    llvm::GlobalValue::ExternalLinkage, llvm::ConstantInt::get(LongTy, 0),
1818    classSymbolName);
1819  }
1820
1821  // Get the size of instances.
1822  int instanceSize =
1823    Context.getASTObjCImplementationLayout(OID).getSize().getQuantity();
1824
1825  // Collect information about instance variables.
1826  llvm::SmallVector<llvm::Constant*, 16> IvarNames;
1827  llvm::SmallVector<llvm::Constant*, 16> IvarTypes;
1828  llvm::SmallVector<llvm::Constant*, 16> IvarOffsets;
1829
1830  std::vector<llvm::Constant*> IvarOffsetValues;
1831
1832  int superInstanceSize = !SuperClassDecl ? 0 :
1833    Context.getASTObjCInterfaceLayout(SuperClassDecl).getSize().getQuantity();
1834  // For non-fragile ivars, set the instance size to 0 - {the size of just this
1835  // class}.  The runtime will then set this to the correct value on load.
1836  if (CGM.getContext().getLangOptions().ObjCNonFragileABI) {
1837    instanceSize = 0 - (instanceSize - superInstanceSize);
1838  }
1839
1840  // Collect declared and synthesized ivars.
1841  llvm::SmallVector<ObjCIvarDecl*, 16> OIvars;
1842  CGM.getContext().ShallowCollectObjCIvars(ClassDecl, OIvars);
1843
1844  for (unsigned i = 0, e = OIvars.size(); i != e; ++i) {
1845      ObjCIvarDecl *IVD = OIvars[i];
1846      // Store the name
1847      IvarNames.push_back(MakeConstantString(IVD->getNameAsString()));
1848      // Get the type encoding for this ivar
1849      std::string TypeStr;
1850      Context.getObjCEncodingForType(IVD->getType(), TypeStr);
1851      IvarTypes.push_back(MakeConstantString(TypeStr));
1852      // Get the offset
1853      uint64_t BaseOffset = ComputeIvarBaseOffset(CGM, OID, IVD);
1854      uint64_t Offset = BaseOffset;
1855      if (CGM.getContext().getLangOptions().ObjCNonFragileABI) {
1856        Offset = BaseOffset - superInstanceSize;
1857      }
1858      IvarOffsets.push_back(
1859          llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), Offset));
1860      IvarOffsetValues.push_back(new llvm::GlobalVariable(TheModule, IntTy,
1861          false, llvm::GlobalValue::ExternalLinkage,
1862          llvm::ConstantInt::get(IntTy, Offset),
1863          "__objc_ivar_offset_value_" + ClassName +"." +
1864          IVD->getNameAsString()));
1865  }
1866  llvm::GlobalVariable *IvarOffsetArray =
1867    MakeGlobalArray(PtrToIntTy, IvarOffsetValues, ".ivar.offsets");
1868
1869
1870  // Collect information about instance methods
1871  llvm::SmallVector<Selector, 16> InstanceMethodSels;
1872  llvm::SmallVector<llvm::Constant*, 16> InstanceMethodTypes;
1873  for (ObjCImplementationDecl::instmeth_iterator
1874         iter = OID->instmeth_begin(), endIter = OID->instmeth_end();
1875       iter != endIter ; iter++) {
1876    InstanceMethodSels.push_back((*iter)->getSelector());
1877    std::string TypeStr;
1878    Context.getObjCEncodingForMethodDecl((*iter),TypeStr);
1879    InstanceMethodTypes.push_back(MakeConstantString(TypeStr));
1880  }
1881
1882  llvm::Constant *Properties = GeneratePropertyList(OID, InstanceMethodSels,
1883          InstanceMethodTypes);
1884
1885
1886  // Collect information about class methods
1887  llvm::SmallVector<Selector, 16> ClassMethodSels;
1888  llvm::SmallVector<llvm::Constant*, 16> ClassMethodTypes;
1889  for (ObjCImplementationDecl::classmeth_iterator
1890         iter = OID->classmeth_begin(), endIter = OID->classmeth_end();
1891       iter != endIter ; iter++) {
1892    ClassMethodSels.push_back((*iter)->getSelector());
1893    std::string TypeStr;
1894    Context.getObjCEncodingForMethodDecl((*iter),TypeStr);
1895    ClassMethodTypes.push_back(MakeConstantString(TypeStr));
1896  }
1897  // Collect the names of referenced protocols
1898  llvm::SmallVector<std::string, 16> Protocols;
1899  const ObjCList<ObjCProtocolDecl> &Protos =ClassDecl->getReferencedProtocols();
1900  for (ObjCList<ObjCProtocolDecl>::iterator I = Protos.begin(),
1901       E = Protos.end(); I != E; ++I)
1902    Protocols.push_back((*I)->getNameAsString());
1903
1904
1905
1906  // Get the superclass pointer.
1907  llvm::Constant *SuperClass;
1908  if (!SuperClassName.empty()) {
1909    SuperClass = MakeConstantString(SuperClassName, ".super_class_name");
1910  } else {
1911    SuperClass = llvm::ConstantPointerNull::get(PtrToInt8Ty);
1912  }
1913  // Empty vector used to construct empty method lists
1914  llvm::SmallVector<llvm::Constant*, 1>  empty;
1915  // Generate the method and instance variable lists
1916  llvm::Constant *MethodList = GenerateMethodList(ClassName, "",
1917      InstanceMethodSels, InstanceMethodTypes, false);
1918  llvm::Constant *ClassMethodList = GenerateMethodList(ClassName, "",
1919      ClassMethodSels, ClassMethodTypes, true);
1920  llvm::Constant *IvarList = GenerateIvarList(IvarNames, IvarTypes,
1921      IvarOffsets);
1922  // Irrespective of whether we are compiling for a fragile or non-fragile ABI,
1923  // we emit a symbol containing the offset for each ivar in the class.  This
1924  // allows code compiled for the non-Fragile ABI to inherit from code compiled
1925  // for the legacy ABI, without causing problems.  The converse is also
1926  // possible, but causes all ivar accesses to be fragile.
1927
1928  // Offset pointer for getting at the correct field in the ivar list when
1929  // setting up the alias.  These are: The base address for the global, the
1930  // ivar array (second field), the ivar in this list (set for each ivar), and
1931  // the offset (third field in ivar structure)
1932  const llvm::Type *IndexTy = llvm::Type::getInt32Ty(VMContext);
1933  llvm::Constant *offsetPointerIndexes[] = {Zeros[0],
1934      llvm::ConstantInt::get(IndexTy, 1), 0,
1935      llvm::ConstantInt::get(IndexTy, 2) };
1936
1937
1938  for (unsigned i = 0, e = OIvars.size(); i != e; ++i) {
1939      ObjCIvarDecl *IVD = OIvars[i];
1940      const std::string Name = "__objc_ivar_offset_" + ClassName + '.'
1941          + IVD->getNameAsString();
1942      offsetPointerIndexes[2] = llvm::ConstantInt::get(IndexTy, i);
1943      // Get the correct ivar field
1944      llvm::Constant *offsetValue = llvm::ConstantExpr::getGetElementPtr(
1945              IvarList, offsetPointerIndexes, 4);
1946      // Get the existing variable, if one exists.
1947      llvm::GlobalVariable *offset = TheModule.getNamedGlobal(Name);
1948      if (offset) {
1949          offset->setInitializer(offsetValue);
1950          // If this is the real definition, change its linkage type so that
1951          // different modules will use this one, rather than their private
1952          // copy.
1953          offset->setLinkage(llvm::GlobalValue::ExternalLinkage);
1954      } else {
1955          // Add a new alias if there isn't one already.
1956          offset = new llvm::GlobalVariable(TheModule, offsetValue->getType(),
1957                  false, llvm::GlobalValue::ExternalLinkage, offsetValue, Name);
1958      }
1959  }
1960  //Generate metaclass for class methods
1961  llvm::Constant *MetaClassStruct = GenerateClassStructure(NULLPtr,
1962      NULLPtr, 0x12L, ClassName.c_str(), 0, Zeros[0], GenerateIvarList(
1963        empty, empty, empty), ClassMethodList, NULLPtr, NULLPtr, NULLPtr, true);
1964
1965  // Generate the class structure
1966  llvm::Constant *ClassStruct =
1967    GenerateClassStructure(MetaClassStruct, SuperClass, 0x11L,
1968                           ClassName.c_str(), 0,
1969      llvm::ConstantInt::get(LongTy, instanceSize), IvarList,
1970      MethodList, GenerateProtocolList(Protocols), IvarOffsetArray,
1971      Properties);
1972
1973  // Resolve the class aliases, if they exist.
1974  if (ClassPtrAlias) {
1975    ClassPtrAlias->replaceAllUsesWith(
1976        llvm::ConstantExpr::getBitCast(ClassStruct, IdTy));
1977    ClassPtrAlias->eraseFromParent();
1978    ClassPtrAlias = 0;
1979  }
1980  if (MetaClassPtrAlias) {
1981    MetaClassPtrAlias->replaceAllUsesWith(
1982        llvm::ConstantExpr::getBitCast(MetaClassStruct, IdTy));
1983    MetaClassPtrAlias->eraseFromParent();
1984    MetaClassPtrAlias = 0;
1985  }
1986
1987  // Add class structure to list to be added to the symtab later
1988  ClassStruct = llvm::ConstantExpr::getBitCast(ClassStruct, PtrToInt8Ty);
1989  Classes.push_back(ClassStruct);
1990}
1991
1992
1993llvm::Function *CGObjCGNU::ModuleInitFunction() {
1994  // Only emit an ObjC load function if no Objective-C stuff has been called
1995  if (Classes.empty() && Categories.empty() && ConstantStrings.empty() &&
1996      ExistingProtocols.empty() && SelectorTable.empty())
1997    return NULL;
1998
1999  // Add all referenced protocols to a category.
2000  GenerateProtocolHolderCategory();
2001
2002  const llvm::StructType *SelStructTy = dyn_cast<llvm::StructType>(
2003          SelectorTy->getElementType());
2004  const llvm::Type *SelStructPtrTy = SelectorTy;
2005  bool isSelOpaque = false;
2006  if (SelStructTy == 0) {
2007    SelStructTy = llvm::StructType::get(VMContext, PtrToInt8Ty,
2008                                        PtrToInt8Ty, NULL);
2009    SelStructPtrTy = llvm::PointerType::getUnqual(SelStructTy);
2010    isSelOpaque = true;
2011  }
2012
2013  // Name the ObjC types to make the IR a bit easier to read
2014  TheModule.addTypeName(".objc_selector", SelStructPtrTy);
2015  TheModule.addTypeName(".objc_id", IdTy);
2016  TheModule.addTypeName(".objc_imp", IMPTy);
2017
2018  std::vector<llvm::Constant*> Elements;
2019  llvm::Constant *Statics = NULLPtr;
2020  // Generate statics list:
2021  if (ConstantStrings.size()) {
2022    llvm::ArrayType *StaticsArrayTy = llvm::ArrayType::get(PtrToInt8Ty,
2023        ConstantStrings.size() + 1);
2024    ConstantStrings.push_back(NULLPtr);
2025
2026    llvm::StringRef StringClass = CGM.getLangOptions().ObjCConstantStringClass;
2027
2028    if (StringClass.empty()) StringClass = "NXConstantString";
2029
2030    Elements.push_back(MakeConstantString(StringClass,
2031                ".objc_static_class_name"));
2032    Elements.push_back(llvm::ConstantArray::get(StaticsArrayTy,
2033       ConstantStrings));
2034    llvm::StructType *StaticsListTy =
2035      llvm::StructType::get(VMContext, PtrToInt8Ty, StaticsArrayTy, NULL);
2036    llvm::Type *StaticsListPtrTy =
2037      llvm::PointerType::getUnqual(StaticsListTy);
2038    Statics = MakeGlobal(StaticsListTy, Elements, ".objc_statics");
2039    llvm::ArrayType *StaticsListArrayTy =
2040      llvm::ArrayType::get(StaticsListPtrTy, 2);
2041    Elements.clear();
2042    Elements.push_back(Statics);
2043    Elements.push_back(llvm::Constant::getNullValue(StaticsListPtrTy));
2044    Statics = MakeGlobal(StaticsListArrayTy, Elements, ".objc_statics_ptr");
2045    Statics = llvm::ConstantExpr::getBitCast(Statics, PtrTy);
2046  }
2047  // Array of classes, categories, and constant objects
2048  llvm::ArrayType *ClassListTy = llvm::ArrayType::get(PtrToInt8Ty,
2049      Classes.size() + Categories.size()  + 2);
2050  llvm::StructType *SymTabTy = llvm::StructType::get(VMContext,
2051                                                     LongTy, SelStructPtrTy,
2052                                                     llvm::Type::getInt16Ty(VMContext),
2053                                                     llvm::Type::getInt16Ty(VMContext),
2054                                                     ClassListTy, NULL);
2055
2056  Elements.clear();
2057  // Pointer to an array of selectors used in this module.
2058  std::vector<llvm::Constant*> Selectors;
2059  std::vector<llvm::GlobalAlias*> SelectorAliases;
2060  for (SelectorMap::iterator iter = SelectorTable.begin(),
2061      iterEnd = SelectorTable.end(); iter != iterEnd ; ++iter) {
2062
2063    std::string SelNameStr = iter->first.getAsString();
2064    llvm::Constant *SelName = ExportUniqueString(SelNameStr, ".objc_sel_name");
2065
2066    llvm::SmallVectorImpl<TypedSelector> &Types = iter->second;
2067    for (llvm::SmallVectorImpl<TypedSelector>::iterator i = Types.begin(),
2068        e = Types.end() ; i!=e ; i++) {
2069
2070      llvm::Constant *SelectorTypeEncoding = NULLPtr;
2071      if (!i->first.empty())
2072        SelectorTypeEncoding = MakeConstantString(i->first, ".objc_sel_types");
2073
2074      Elements.push_back(SelName);
2075      Elements.push_back(SelectorTypeEncoding);
2076      Selectors.push_back(llvm::ConstantStruct::get(SelStructTy, Elements));
2077      Elements.clear();
2078
2079      // Store the selector alias for later replacement
2080      SelectorAliases.push_back(i->second);
2081    }
2082  }
2083  unsigned SelectorCount = Selectors.size();
2084  // NULL-terminate the selector list.  This should not actually be required,
2085  // because the selector list has a length field.  Unfortunately, the GCC
2086  // runtime decides to ignore the length field and expects a NULL terminator,
2087  // and GCC cooperates with this by always setting the length to 0.
2088  Elements.push_back(NULLPtr);
2089  Elements.push_back(NULLPtr);
2090  Selectors.push_back(llvm::ConstantStruct::get(SelStructTy, Elements));
2091  Elements.clear();
2092
2093  // Number of static selectors
2094  Elements.push_back(llvm::ConstantInt::get(LongTy, SelectorCount));
2095  llvm::Constant *SelectorList = MakeGlobalArray(SelStructTy, Selectors,
2096          ".objc_selector_list");
2097  Elements.push_back(llvm::ConstantExpr::getBitCast(SelectorList,
2098    SelStructPtrTy));
2099
2100  // Now that all of the static selectors exist, create pointers to them.
2101  for (unsigned int i=0 ; i<SelectorCount ; i++) {
2102
2103    llvm::Constant *Idxs[] = {Zeros[0],
2104      llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), i), Zeros[0]};
2105    // FIXME: We're generating redundant loads and stores here!
2106    llvm::Constant *SelPtr = llvm::ConstantExpr::getGetElementPtr(SelectorList,
2107        Idxs, 2);
2108    // If selectors are defined as an opaque type, cast the pointer to this
2109    // type.
2110    SelPtr = llvm::ConstantExpr::getBitCast(SelPtr, SelectorTy);
2111    SelectorAliases[i]->replaceAllUsesWith(SelPtr);
2112    SelectorAliases[i]->eraseFromParent();
2113  }
2114
2115  // Number of classes defined.
2116  Elements.push_back(llvm::ConstantInt::get(llvm::Type::getInt16Ty(VMContext),
2117        Classes.size()));
2118  // Number of categories defined
2119  Elements.push_back(llvm::ConstantInt::get(llvm::Type::getInt16Ty(VMContext),
2120        Categories.size()));
2121  // Create an array of classes, then categories, then static object instances
2122  Classes.insert(Classes.end(), Categories.begin(), Categories.end());
2123  //  NULL-terminated list of static object instances (mainly constant strings)
2124  Classes.push_back(Statics);
2125  Classes.push_back(NULLPtr);
2126  llvm::Constant *ClassList = llvm::ConstantArray::get(ClassListTy, Classes);
2127  Elements.push_back(ClassList);
2128  // Construct the symbol table
2129  llvm::Constant *SymTab= MakeGlobal(SymTabTy, Elements);
2130
2131  // The symbol table is contained in a module which has some version-checking
2132  // constants
2133  llvm::StructType * ModuleTy = llvm::StructType::get(VMContext, LongTy, LongTy,
2134      PtrToInt8Ty, llvm::PointerType::getUnqual(SymTabTy), NULL);
2135  Elements.clear();
2136  // Runtime version, used for ABI compatibility checking.
2137  Elements.push_back(llvm::ConstantInt::get(LongTy, RuntimeVersion));
2138  // sizeof(ModuleTy)
2139  llvm::TargetData td(&TheModule);
2140  Elements.push_back(llvm::ConstantInt::get(LongTy,
2141                     td.getTypeSizeInBits(ModuleTy)/8));
2142
2143  // The path to the source file where this module was declared
2144  SourceManager &SM = CGM.getContext().getSourceManager();
2145  const FileEntry *mainFile = SM.getFileEntryForID(SM.getMainFileID());
2146  std::string path =
2147    std::string(mainFile->getDir()->getName()) + '/' + mainFile->getName();
2148  Elements.push_back(MakeConstantString(path, ".objc_source_file_name"));
2149
2150  Elements.push_back(SymTab);
2151  llvm::Value *Module = MakeGlobal(ModuleTy, Elements);
2152
2153  // Create the load function calling the runtime entry point with the module
2154  // structure
2155  llvm::Function * LoadFunction = llvm::Function::Create(
2156      llvm::FunctionType::get(llvm::Type::getVoidTy(VMContext), false),
2157      llvm::GlobalValue::InternalLinkage, ".objc_load_function",
2158      &TheModule);
2159  llvm::BasicBlock *EntryBB =
2160      llvm::BasicBlock::Create(VMContext, "entry", LoadFunction);
2161  CGBuilderTy Builder(VMContext);
2162  Builder.SetInsertPoint(EntryBB);
2163
2164  std::vector<const llvm::Type*> Params(1,
2165      llvm::PointerType::getUnqual(ModuleTy));
2166  llvm::Value *Register = CGM.CreateRuntimeFunction(llvm::FunctionType::get(
2167        llvm::Type::getVoidTy(VMContext), Params, true), "__objc_exec_class");
2168  Builder.CreateCall(Register, Module);
2169  Builder.CreateRetVoid();
2170
2171  return LoadFunction;
2172}
2173
2174llvm::Function *CGObjCGNU::GenerateMethod(const ObjCMethodDecl *OMD,
2175                                          const ObjCContainerDecl *CD) {
2176  const ObjCCategoryImplDecl *OCD =
2177    dyn_cast<ObjCCategoryImplDecl>(OMD->getDeclContext());
2178  llvm::StringRef CategoryName = OCD ? OCD->getName() : "";
2179  llvm::StringRef ClassName = CD->getName();
2180  Selector MethodName = OMD->getSelector();
2181  bool isClassMethod = !OMD->isInstanceMethod();
2182
2183  CodeGenTypes &Types = CGM.getTypes();
2184  const llvm::FunctionType *MethodTy =
2185    Types.GetFunctionType(Types.getFunctionInfo(OMD), OMD->isVariadic());
2186  std::string FunctionName = SymbolNameForMethod(ClassName, CategoryName,
2187      MethodName, isClassMethod);
2188
2189  llvm::Function *Method
2190    = llvm::Function::Create(MethodTy,
2191                             llvm::GlobalValue::InternalLinkage,
2192                             FunctionName,
2193                             &TheModule);
2194  return Method;
2195}
2196
2197llvm::Function *CGObjCGNU::GetPropertyGetFunction() {
2198  return GetPropertyFn;
2199}
2200
2201llvm::Function *CGObjCGNU::GetPropertySetFunction() {
2202  return SetPropertyFn;
2203}
2204
2205llvm::Function *CGObjCGNU::GetGetStructFunction() {
2206  return GetStructPropertyFn;
2207}
2208llvm::Function *CGObjCGNU::GetSetStructFunction() {
2209  return SetStructPropertyFn;
2210}
2211
2212llvm::Constant *CGObjCGNU::EnumerationMutationFunction() {
2213  return EnumerationMutationFn;
2214}
2215
2216void CGObjCGNU::EmitSynchronizedStmt(CodeGenFunction &CGF,
2217                                     const ObjCAtSynchronizedStmt &S) {
2218  EmitAtSynchronizedStmt(CGF, S, SyncEnterFn, SyncExitFn);
2219}
2220
2221
2222void CGObjCGNU::EmitTryStmt(CodeGenFunction &CGF,
2223                            const ObjCAtTryStmt &S) {
2224  // Unlike the Apple non-fragile runtimes, which also uses
2225  // unwind-based zero cost exceptions, the GNU Objective C runtime's
2226  // EH support isn't a veneer over C++ EH.  Instead, exception
2227  // objects are created by __objc_exception_throw and destroyed by
2228  // the personality function; this avoids the need for bracketing
2229  // catch handlers with calls to __blah_begin_catch/__blah_end_catch
2230  // (or even _Unwind_DeleteException), but probably doesn't
2231  // interoperate very well with foreign exceptions.
2232  //
2233  // In Objective-C++ mode, we actually emit something equivalent to the C++
2234  // exception handler.
2235  EmitTryCatchStmt(CGF, S, EnterCatchFn, ExitCatchFn, ExceptionReThrowFn);
2236  return ;
2237}
2238
2239void CGObjCGNU::EmitThrowStmt(CodeGenFunction &CGF,
2240                              const ObjCAtThrowStmt &S) {
2241  llvm::Value *ExceptionAsObject;
2242
2243  if (const Expr *ThrowExpr = S.getThrowExpr()) {
2244    llvm::Value *Exception = CGF.EmitScalarExpr(ThrowExpr);
2245    ExceptionAsObject = Exception;
2246  } else {
2247    assert((!CGF.ObjCEHValueStack.empty() && CGF.ObjCEHValueStack.back()) &&
2248           "Unexpected rethrow outside @catch block.");
2249    ExceptionAsObject = CGF.ObjCEHValueStack.back();
2250  }
2251  ExceptionAsObject =
2252      CGF.Builder.CreateBitCast(ExceptionAsObject, IdTy, "tmp");
2253
2254  // Note: This may have to be an invoke, if we want to support constructs like:
2255  // @try {
2256  //  @throw(obj);
2257  // }
2258  // @catch(id) ...
2259  //
2260  // This is effectively turning @throw into an incredibly-expensive goto, but
2261  // it may happen as a result of inlining followed by missed optimizations, or
2262  // as a result of stupidity.
2263  llvm::BasicBlock *UnwindBB = CGF.getInvokeDest();
2264  if (!UnwindBB) {
2265    CGF.Builder.CreateCall(ExceptionThrowFn, ExceptionAsObject);
2266    CGF.Builder.CreateUnreachable();
2267  } else {
2268    CGF.Builder.CreateInvoke(ExceptionThrowFn, UnwindBB, UnwindBB, &ExceptionAsObject,
2269        &ExceptionAsObject+1);
2270  }
2271  // Clear the insertion point to indicate we are in unreachable code.
2272  CGF.Builder.ClearInsertionPoint();
2273}
2274
2275llvm::Value * CGObjCGNU::EmitObjCWeakRead(CodeGenFunction &CGF,
2276                                          llvm::Value *AddrWeakObj) {
2277  CGBuilderTy B = CGF.Builder;
2278  AddrWeakObj = EnforceType(B, AddrWeakObj, IdTy);
2279  return B.CreateCall(WeakReadFn, AddrWeakObj);
2280}
2281
2282void CGObjCGNU::EmitObjCWeakAssign(CodeGenFunction &CGF,
2283                                   llvm::Value *src, llvm::Value *dst) {
2284  CGBuilderTy B = CGF.Builder;
2285  src = EnforceType(B, src, IdTy);
2286  dst = EnforceType(B, dst, PtrToIdTy);
2287  B.CreateCall2(WeakAssignFn, src, dst);
2288}
2289
2290void CGObjCGNU::EmitObjCGlobalAssign(CodeGenFunction &CGF,
2291                                     llvm::Value *src, llvm::Value *dst,
2292                                     bool threadlocal) {
2293  CGBuilderTy B = CGF.Builder;
2294  src = EnforceType(B, src, IdTy);
2295  dst = EnforceType(B, dst, PtrToIdTy);
2296  if (!threadlocal)
2297    B.CreateCall2(GlobalAssignFn, src, dst);
2298  else
2299    // FIXME. Add threadloca assign API
2300    assert(false && "EmitObjCGlobalAssign - Threal Local API NYI");
2301}
2302
2303void CGObjCGNU::EmitObjCIvarAssign(CodeGenFunction &CGF,
2304                                   llvm::Value *src, llvm::Value *dst,
2305                                   llvm::Value *ivarOffset) {
2306  CGBuilderTy B = CGF.Builder;
2307  src = EnforceType(B, src, IdTy);
2308  dst = EnforceType(B, dst, PtrToIdTy);
2309  B.CreateCall3(IvarAssignFn, src, dst, ivarOffset);
2310}
2311
2312void CGObjCGNU::EmitObjCStrongCastAssign(CodeGenFunction &CGF,
2313                                         llvm::Value *src, llvm::Value *dst) {
2314  CGBuilderTy B = CGF.Builder;
2315  src = EnforceType(B, src, IdTy);
2316  dst = EnforceType(B, dst, PtrToIdTy);
2317  B.CreateCall2(StrongCastAssignFn, src, dst);
2318}
2319
2320void CGObjCGNU::EmitGCMemmoveCollectable(CodeGenFunction &CGF,
2321                                         llvm::Value *DestPtr,
2322                                         llvm::Value *SrcPtr,
2323                                         llvm::Value *Size) {
2324  CGBuilderTy B = CGF.Builder;
2325  DestPtr = EnforceType(B, DestPtr, IdTy);
2326  SrcPtr = EnforceType(B, SrcPtr, PtrToIdTy);
2327
2328  B.CreateCall3(MemMoveFn, DestPtr, SrcPtr, Size);
2329}
2330
2331llvm::GlobalVariable *CGObjCGNU::ObjCIvarOffsetVariable(
2332                              const ObjCInterfaceDecl *ID,
2333                              const ObjCIvarDecl *Ivar) {
2334  const std::string Name = "__objc_ivar_offset_" + ID->getNameAsString()
2335    + '.' + Ivar->getNameAsString();
2336  // Emit the variable and initialize it with what we think the correct value
2337  // is.  This allows code compiled with non-fragile ivars to work correctly
2338  // when linked against code which isn't (most of the time).
2339  llvm::GlobalVariable *IvarOffsetPointer = TheModule.getNamedGlobal(Name);
2340  if (!IvarOffsetPointer) {
2341    // This will cause a run-time crash if we accidentally use it.  A value of
2342    // 0 would seem more sensible, but will silently overwrite the isa pointer
2343    // causing a great deal of confusion.
2344    uint64_t Offset = -1;
2345    // We can't call ComputeIvarBaseOffset() here if we have the
2346    // implementation, because it will create an invalid ASTRecordLayout object
2347    // that we are then stuck with forever, so we only initialize the ivar
2348    // offset variable with a guess if we only have the interface.  The
2349    // initializer will be reset later anyway, when we are generating the class
2350    // description.
2351    if (!CGM.getContext().getObjCImplementation(
2352              const_cast<ObjCInterfaceDecl *>(ID)))
2353      Offset = ComputeIvarBaseOffset(CGM, ID, Ivar);
2354
2355    llvm::ConstantInt *OffsetGuess =
2356      llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), Offset, "ivar");
2357    // Don't emit the guess in non-PIC code because the linker will not be able
2358    // to replace it with the real version for a library.  In non-PIC code you
2359    // must compile with the fragile ABI if you want to use ivars from a
2360    // GCC-compiled class.
2361    if (CGM.getLangOptions().PICLevel) {
2362      llvm::GlobalVariable *IvarOffsetGV = new llvm::GlobalVariable(TheModule,
2363            llvm::Type::getInt32Ty(VMContext), false,
2364            llvm::GlobalValue::PrivateLinkage, OffsetGuess, Name+".guess");
2365      IvarOffsetPointer = new llvm::GlobalVariable(TheModule,
2366            IvarOffsetGV->getType(), false, llvm::GlobalValue::LinkOnceAnyLinkage,
2367            IvarOffsetGV, Name);
2368    } else {
2369      IvarOffsetPointer = new llvm::GlobalVariable(TheModule,
2370              llvm::Type::getInt32PtrTy(VMContext), false,
2371              llvm::GlobalValue::ExternalLinkage, 0, Name);
2372    }
2373  }
2374  return IvarOffsetPointer;
2375}
2376
2377LValue CGObjCGNU::EmitObjCValueForIvar(CodeGenFunction &CGF,
2378                                       QualType ObjectTy,
2379                                       llvm::Value *BaseValue,
2380                                       const ObjCIvarDecl *Ivar,
2381                                       unsigned CVRQualifiers) {
2382  const ObjCInterfaceDecl *ID =
2383    ObjectTy->getAs<ObjCObjectType>()->getInterface();
2384  return EmitValueForIvarAtOffset(CGF, ID, BaseValue, Ivar, CVRQualifiers,
2385                                  EmitIvarOffset(CGF, ID, Ivar));
2386}
2387
2388static const ObjCInterfaceDecl *FindIvarInterface(ASTContext &Context,
2389                                                  const ObjCInterfaceDecl *OID,
2390                                                  const ObjCIvarDecl *OIVD) {
2391  llvm::SmallVector<ObjCIvarDecl*, 16> Ivars;
2392  Context.ShallowCollectObjCIvars(OID, Ivars);
2393  for (unsigned k = 0, e = Ivars.size(); k != e; ++k) {
2394    if (OIVD == Ivars[k])
2395      return OID;
2396  }
2397
2398  // Otherwise check in the super class.
2399  if (const ObjCInterfaceDecl *Super = OID->getSuperClass())
2400    return FindIvarInterface(Context, Super, OIVD);
2401
2402  return 0;
2403}
2404
2405llvm::Value *CGObjCGNU::EmitIvarOffset(CodeGenFunction &CGF,
2406                         const ObjCInterfaceDecl *Interface,
2407                         const ObjCIvarDecl *Ivar) {
2408  if (CGM.getLangOptions().ObjCNonFragileABI) {
2409    Interface = FindIvarInterface(CGM.getContext(), Interface, Ivar);
2410    return CGF.Builder.CreateZExtOrBitCast(
2411        CGF.Builder.CreateLoad(CGF.Builder.CreateLoad(
2412                ObjCIvarOffsetVariable(Interface, Ivar), false, "ivar")),
2413        PtrDiffTy);
2414  }
2415  uint64_t Offset = ComputeIvarBaseOffset(CGF.CGM, Interface, Ivar);
2416  return llvm::ConstantInt::get(PtrDiffTy, Offset, "ivar");
2417}
2418
2419CGObjCRuntime *
2420clang::CodeGen::CreateGNUObjCRuntime(CodeGenModule &CGM) {
2421  if (CGM.getLangOptions().ObjCNonFragileABI)
2422    return new CGObjCGNUstep(CGM);
2423  return new CGObjCGCC(CGM);
2424}
2425