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 
43 using namespace clang;
44 using namespace CodeGen;
45 using llvm::dyn_cast;
46 
47 
48 namespace {
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.
52 class 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).
103 class CGObjCGNU : public CGObjCRuntime {
104 protected:
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;
235 private:
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 
283 protected:
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 
300 private:
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;
326 private:
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);
392 protected:
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;
406 public:
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.
497 class 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;
505 protected:
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.
535 class 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         ExceptionReThrowFn.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.
628 void 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 
643 static 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 
653 CGObjCGNU::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.
767 llvm::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 
786 llvm::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 
816 llvm::Value *CGObjCGNU::GetSelector(CGBuilderTy &Builder, Selector Sel,
817                                     bool lval) {
818   return GetSelector(Builder, Sel, std::string(), lval);
819 }
820 
821 llvm::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 
828 llvm::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.
911 llvm::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.
936 RValue
937 CGObjCGNU::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.
1048 RValue
1049 CGObjCGNU::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(), 2);
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(), 2);
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(), 2);
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(), 2);
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.
1180 llvm::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.
1243 llvm::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
1283 llvm::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 
1354 llvm::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
1383 llvm::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 
1416 llvm::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 
1424 llvm::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 
1457 void 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 }
1621 void 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 
1667 void 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 
1721 llvm::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 
1793 void 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 
1993 llvm::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 
2174 llvm::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 
2197 llvm::Function *CGObjCGNU::GetPropertyGetFunction() {
2198   return GetPropertyFn;
2199 }
2200 
2201 llvm::Function *CGObjCGNU::GetPropertySetFunction() {
2202   return SetPropertyFn;
2203 }
2204 
2205 llvm::Function *CGObjCGNU::GetGetStructFunction() {
2206   return GetStructPropertyFn;
2207 }
2208 llvm::Function *CGObjCGNU::GetSetStructFunction() {
2209   return SetStructPropertyFn;
2210 }
2211 
2212 llvm::Constant *CGObjCGNU::EnumerationMutationFunction() {
2213   return EnumerationMutationFn;
2214 }
2215 
2216 void CGObjCGNU::EmitSynchronizedStmt(CodeGenFunction &CGF,
2217                                      const ObjCAtSynchronizedStmt &S) {
2218   EmitAtSynchronizedStmt(CGF, S, SyncEnterFn, SyncExitFn);
2219 }
2220 
2221 
2222 void 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 
2239 void 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 
2275 llvm::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 
2282 void 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 
2290 void 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 
2303 void 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 
2312 void 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 
2320 void 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 
2331 llvm::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 
2377 LValue 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 
2388 static 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 
2405 llvm::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 
2419 CGObjCRuntime *
2420 clang::CodeGen::CreateGNUObjCRuntime(CodeGenModule &CGM) {
2421   if (CGM.getLangOptions().ObjCNonFragileABI)
2422     return new CGObjCGNUstep(CGM);
2423   return new CGObjCGCC(CGM);
2424 }
2425