CGObjCRuntime.h revision 021a7a63984f0f912dc9e9dae2a1b3e1509a40ce
1c17a4d3b16a2624a76de5d7508805534545bd3bfDaniel Dunbar//===----- CGObjCRuntime.h - Interface to ObjC Runtimes ---------*- C++ -*-===//
20f984268b05edab2cc555a427c441baa9c252658Chris Lattner//
30f984268b05edab2cc555a427c441baa9c252658Chris Lattner//                     The LLVM Compiler Infrastructure
40f984268b05edab2cc555a427c441baa9c252658Chris Lattner//
50f984268b05edab2cc555a427c441baa9c252658Chris Lattner// This file is distributed under the University of Illinois Open Source
60f984268b05edab2cc555a427c441baa9c252658Chris Lattner// License. See LICENSE.TXT for details.
70f984268b05edab2cc555a427c441baa9c252658Chris Lattner//
80f984268b05edab2cc555a427c441baa9c252658Chris Lattner//===----------------------------------------------------------------------===//
90f984268b05edab2cc555a427c441baa9c252658Chris Lattner//
100f984268b05edab2cc555a427c441baa9c252658Chris Lattner// This provides an abstract class for Objective-C code generation.  Concrete
110f984268b05edab2cc555a427c441baa9c252658Chris Lattner// subclasses of this implement code generation for specific Objective-C
120f984268b05edab2cc555a427c441baa9c252658Chris Lattner// runtime libraries.
130f984268b05edab2cc555a427c441baa9c252658Chris Lattner//
140f984268b05edab2cc555a427c441baa9c252658Chris Lattner//===----------------------------------------------------------------------===//
150f984268b05edab2cc555a427c441baa9c252658Chris Lattner
160f984268b05edab2cc555a427c441baa9c252658Chris Lattner#ifndef CLANG_CODEGEN_OBCJRUNTIME_H
170f984268b05edab2cc555a427c441baa9c252658Chris Lattner#define CLANG_CODEGEN_OBCJRUNTIME_H
18e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar#include "clang/Basic/IdentifierTable.h" // Selector
19df9ccc6381314ccca6407abb209155e9273a631dFariborz Jahanian#include "clang/AST/DeclObjC.h"
208ef07c0a81727aae37c820a816dac019f5fe1d43Argyrios Kyrtzidis#include <string>
210f984268b05edab2cc555a427c441baa9c252658Chris Lattner
2245d196b8387dcefc4df26cda114fa34c6528e928Daniel Dunbar#include "CGBuilder.h"
2346f45b9bec4a265ad8400a538e5ec3a5683617f1Daniel Dunbar#include "CGCall.h"
2445d196b8387dcefc4df26cda114fa34c6528e928Daniel Dunbar#include "CGValue.h"
258f2926b73ed635afecd020da787af6a837601a2bDaniel Dunbar
260f984268b05edab2cc555a427c441baa9c252658Chris Lattnernamespace llvm {
270f984268b05edab2cc555a427c441baa9c252658Chris Lattner  class Constant;
289777687562c338601c2f17906e65e1c1a0aad96fDaniel Dunbar  class Function;
299777687562c338601c2f17906e65e1c1a0aad96fDaniel Dunbar  class Module;
309777687562c338601c2f17906e65e1c1a0aad96fDaniel Dunbar  class StructLayout;
3184ad77a8f83121713ea69d8002d1fd19565f87abDaniel Dunbar  class StructType;
320f984268b05edab2cc555a427c441baa9c252658Chris Lattner  class Type;
330f984268b05edab2cc555a427c441baa9c252658Chris Lattner  class Value;
340f984268b05edab2cc555a427c441baa9c252658Chris Lattner}
350f984268b05edab2cc555a427c441baa9c252658Chris Lattner
360f984268b05edab2cc555a427c441baa9c252658Chris Lattnernamespace clang {
3746f45b9bec4a265ad8400a538e5ec3a5683617f1Daniel Dunbarnamespace CodeGen {
3846f45b9bec4a265ad8400a538e5ec3a5683617f1Daniel Dunbar  class CodeGenFunction;
3946f45b9bec4a265ad8400a538e5ec3a5683617f1Daniel Dunbar}
408f2926b73ed635afecd020da787af6a837601a2bDaniel Dunbar
419777687562c338601c2f17906e65e1c1a0aad96fDaniel Dunbar  class FieldDecl;
4264d5d6c5903157c521af496479d06dc26032d718Anders Carlsson  class ObjCAtTryStmt;
4364d5d6c5903157c521af496479d06dc26032d718Anders Carlsson  class ObjCAtThrowStmt;
4410cac6f7115b59a466bb8d2d51cdddeb38aadc37Chris Lattner  class ObjCAtSynchronizedStmt;
45679a502d462ef819e6175b58e255ca3f3391e7cfFariborz Jahanian  class ObjCContainerDecl;
467ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar  class ObjCCategoryImplDecl;
477ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar  class ObjCImplementationDecl;
48ddb2a3d55a24a1dbdf9152621642d9a4b4fc2f61Daniel Dunbar  class ObjCInterfaceDecl;
498f2926b73ed635afecd020da787af6a837601a2bDaniel Dunbar  class ObjCMessageExpr;
507ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar  class ObjCMethodDecl;
51af2f62ce32e462f256855cd24b06dec4755d2827Daniel Dunbar  class ObjCProtocolDecl;
528e67b63530b4f39a48bc12d97376f373a6901279Chris Lattner  class Selector;
530bb20361a321593887f067515dd04cf109f4c74aFariborz Jahanian  class ObjCIvarDecl;
5433fdb738a6c125f4c788733897021b7c1a062b0cSteve Naroff  class ObjCStringLiteral;
55af2f62ce32e462f256855cd24b06dec4755d2827Daniel Dunbar
560f984268b05edab2cc555a427c441baa9c252658Chris Lattnernamespace CodeGen {
57dce1406f1c1f572cfd61c494546572d63461c741Chris Lattner  class CodeGenModule;
580f984268b05edab2cc555a427c441baa9c252658Chris Lattner
59f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump// FIXME: Several methods should be pure virtual but aren't to avoid the
60f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump// partially-implemented subclass breaking.
6120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov
6220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov/// Implements runtime-specific code generation functions.
630f984268b05edab2cc555a427c441baa9c252658Chris Lattnerclass CGObjCRuntime {
64f0fe5bc0e46038dc79cdd27fcf0c77ad4789fdffDaniel Dunbarprotected:
659777687562c338601c2f17906e65e1c1a0aad96fDaniel Dunbar  // Utility functions for unified ivar access. These need to
669777687562c338601c2f17906e65e1c1a0aad96fDaniel Dunbar  // eventually be folded into other places (the structure layout
679777687562c338601c2f17906e65e1c1a0aad96fDaniel Dunbar  // code).
689777687562c338601c2f17906e65e1c1a0aad96fDaniel Dunbar
6984ad77a8f83121713ea69d8002d1fd19565f87abDaniel Dunbar  /// Compute an offset to the given ivar, suitable for passing to
7084ad77a8f83121713ea69d8002d1fd19565f87abDaniel Dunbar  /// EmitValueForIvarAtOffset.  Note that the correct handling of
7184ad77a8f83121713ea69d8002d1fd19565f87abDaniel Dunbar  /// bit-fields is carefully coordinated by these two, use caution!
729f89f2bc111339ee7fa0df3c2f18e39493b460c4Daniel Dunbar  ///
739f89f2bc111339ee7fa0df3c2f18e39493b460c4Daniel Dunbar  /// The latter overload is suitable for computing the offset of a
749f89f2bc111339ee7fa0df3c2f18e39493b460c4Daniel Dunbar  /// sythesized ivar.
759777687562c338601c2f17906e65e1c1a0aad96fDaniel Dunbar  uint64_t ComputeIvarBaseOffset(CodeGen::CodeGenModule &CGM,
769777687562c338601c2f17906e65e1c1a0aad96fDaniel Dunbar                                 const ObjCInterfaceDecl *OID,
779777687562c338601c2f17906e65e1c1a0aad96fDaniel Dunbar                                 const ObjCIvarDecl *Ivar);
789f89f2bc111339ee7fa0df3c2f18e39493b460c4Daniel Dunbar  uint64_t ComputeIvarBaseOffset(CodeGen::CodeGenModule &CGM,
799f89f2bc111339ee7fa0df3c2f18e39493b460c4Daniel Dunbar                                 const ObjCImplementationDecl *OID,
809f89f2bc111339ee7fa0df3c2f18e39493b460c4Daniel Dunbar                                 const ObjCIvarDecl *Ivar);
819777687562c338601c2f17906e65e1c1a0aad96fDaniel Dunbar
829777687562c338601c2f17906e65e1c1a0aad96fDaniel Dunbar  LValue EmitValueForIvarAtOffset(CodeGen::CodeGenFunction &CGF,
839777687562c338601c2f17906e65e1c1a0aad96fDaniel Dunbar                                  const ObjCInterfaceDecl *OID,
849777687562c338601c2f17906e65e1c1a0aad96fDaniel Dunbar                                  llvm::Value *BaseValue,
859777687562c338601c2f17906e65e1c1a0aad96fDaniel Dunbar                                  const ObjCIvarDecl *Ivar,
869777687562c338601c2f17906e65e1c1a0aad96fDaniel Dunbar                                  unsigned CVRQualifiers,
871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                  llvm::Value *Offset);
8858bf6101062867ca4b3028f9e77e4ae642f09b44Daniel Dunbar
890f984268b05edab2cc555a427c441baa9c252658Chris Lattnerpublic:
900f984268b05edab2cc555a427c441baa9c252658Chris Lattner  virtual ~CGObjCRuntime();
91af2f62ce32e462f256855cd24b06dec4755d2827Daniel Dunbar
92391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner  /// Generate the function required to register all Objective-C components in
93391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner  /// this compilation unit with the runtime library.
947ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar  virtual llvm::Function *ModuleInitFunction() = 0;
95af2f62ce32e462f256855cd24b06dec4755d2827Daniel Dunbar
967ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar  /// Get a selector for the specified name and type values. The
977ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar  /// return value should have the LLVM type for pointer-to
987ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar  /// ASTContext::getObjCSelType().
9945d196b8387dcefc4df26cda114fa34c6528e928Daniel Dunbar  virtual llvm::Value *GetSelector(CGBuilderTy &Builder,
10003b2960c14aede6ac82bdef32247094ebb72fa69Fariborz Jahanian                                   Selector Sel, bool lval=false) = 0;
101af2f62ce32e462f256855cd24b06dec4755d2827Daniel Dunbar
1021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// Get a typed selector.
103df9ccc6381314ccca6407abb209155e9273a631dFariborz Jahanian  virtual llvm::Value *GetSelector(CGBuilderTy &Builder,
104df9ccc6381314ccca6407abb209155e9273a631dFariborz Jahanian                                   const ObjCMethodDecl *Method) = 0;
105df9ccc6381314ccca6407abb209155e9273a631dFariborz Jahanian
1067ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar  /// Generate a constant string object.
1070d13f6fdbdd6f06e2449b8834dda53334abd399aDavid Chisnall  virtual llvm::Constant *GenerateConstantString(const StringLiteral *) = 0;
108af2f62ce32e462f256855cd24b06dec4755d2827Daniel Dunbar
10920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  /// Generate a category.  A category contains a list of methods (and
11020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  /// accompanying metadata) and a list of protocols.
1117ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar  virtual void GenerateCategory(const ObjCCategoryImplDecl *OCD) = 0;
112af2f62ce32e462f256855cd24b06dec4755d2827Daniel Dunbar
11320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  /// Generate a class stucture for this class.
1147ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar  virtual void GenerateClass(const ObjCImplementationDecl *OID) = 0;
1151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// Generate an Objective-C message send operation.
117d6c93d703541c992e06eb9a59a2d826a30da65b2Daniel Dunbar  ///
118d6c93d703541c992e06eb9a59a2d826a30da65b2Daniel Dunbar  /// \param Method - The method being called, this may be null if synthesizing
119d6c93d703541c992e06eb9a59a2d826a30da65b2Daniel Dunbar  /// a property setter or getter.
1201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  virtual CodeGen::RValue
1218f2926b73ed635afecd020da787af6a837601a2bDaniel Dunbar  GenerateMessageSend(CodeGen::CodeGenFunction &CGF,
122ef072fd2f3347cfd857d6eb787b245b950771430John McCall                      ReturnValueSlot ReturnSlot,
1237f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbar                      QualType ResultType,
1247f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbar                      Selector Sel,
125f56f1913e91ad32bed52dd3f6afc26735d336584Daniel Dunbar                      llvm::Value *Receiver,
126df9ccc6381314ccca6407abb209155e9273a631dFariborz Jahanian                      const CallArgList &CallArgs,
127c6cd5fd3eae71f8841504a396563343cfaaf503eDavid Chisnall                      const ObjCInterfaceDecl *Class = 0,
128d6c93d703541c992e06eb9a59a2d826a30da65b2Daniel Dunbar                      const ObjCMethodDecl *Method = 0) = 0;
129af2f62ce32e462f256855cd24b06dec4755d2827Daniel Dunbar
1307ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar  /// Generate an Objective-C message send operation to the super
131f56f1913e91ad32bed52dd3f6afc26735d336584Daniel Dunbar  /// class initiated in a method for Class and with the given Self
132f56f1913e91ad32bed52dd3f6afc26735d336584Daniel Dunbar  /// object.
133d6c93d703541c992e06eb9a59a2d826a30da65b2Daniel Dunbar  ///
134d6c93d703541c992e06eb9a59a2d826a30da65b2Daniel Dunbar  /// \param Method - The method being called, this may be null if synthesizing
135d6c93d703541c992e06eb9a59a2d826a30da65b2Daniel Dunbar  /// a property setter or getter.
1368f2926b73ed635afecd020da787af6a837601a2bDaniel Dunbar  virtual CodeGen::RValue
1378f2926b73ed635afecd020da787af6a837601a2bDaniel Dunbar  GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF,
138ef072fd2f3347cfd857d6eb787b245b950771430John McCall                           ReturnValueSlot ReturnSlot,
1397f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbar                           QualType ResultType,
1407f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbar                           Selector Sel,
141f56f1913e91ad32bed52dd3f6afc26735d336584Daniel Dunbar                           const ObjCInterfaceDecl *Class,
1427ce77920a35060f1c8dd72e541e42ce296ccd168Fariborz Jahanian                           bool isCategoryImpl,
143f56f1913e91ad32bed52dd3f6afc26735d336584Daniel Dunbar                           llvm::Value *Self,
14419cd87eb5fb3c197e631ce08fd52c446c4d4e8f1Daniel Dunbar                           bool IsClassMessage,
145d6c93d703541c992e06eb9a59a2d826a30da65b2Daniel Dunbar                           const CallArgList &CallArgs,
146d6c93d703541c992e06eb9a59a2d826a30da65b2Daniel Dunbar                           const ObjCMethodDecl *Method = 0) = 0;
14798c5ead87d720d8b68b6f236c3c3579a388fc882Daniel Dunbar
14898c5ead87d720d8b68b6f236c3c3579a388fc882Daniel Dunbar  /// Emit the code to return the named protocol as an object, as in a
14998c5ead87d720d8b68b6f236c3c3579a388fc882Daniel Dunbar  /// @protocol expression.
15045d196b8387dcefc4df26cda114fa34c6528e928Daniel Dunbar  virtual llvm::Value *GenerateProtocolRef(CGBuilderTy &Builder,
1517ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar                                           const ObjCProtocolDecl *OPD) = 0;
15298c5ead87d720d8b68b6f236c3c3579a388fc882Daniel Dunbar
1531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// Generate the named protocol.  Protocols contain method metadata but no
1541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// implementations.
1557ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar  virtual void GenerateProtocol(const ObjCProtocolDecl *OPD) = 0;
1567ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar
1577ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar  /// Generate a function preamble for a method with the specified
1581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// types.
1597ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar
160f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // FIXME: Current this just generates the Function definition, but really this
161f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // should also be generating the loads of the parameters, as the runtime
162f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump  // should have full control over how parameters are passed.
1631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  virtual llvm::Function *GenerateMethod(const ObjCMethodDecl *OMD,
164679a502d462ef819e6175b58e255ca3f3391e7cfFariborz Jahanian                                         const ObjCContainerDecl *CD) = 0;
165af2f62ce32e462f256855cd24b06dec4755d2827Daniel Dunbar
16649f6602707887eea1a558a1dffe0213102f887f2Daniel Dunbar  /// Return the runtime function for getting properties.
16774391b48b4791cded373683a3baf67314f358d50Chris Lattner  virtual llvm::Constant *GetPropertyGetFunction() = 0;
1681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
16949f6602707887eea1a558a1dffe0213102f887f2Daniel Dunbar  /// Return the runtime function for setting properties.
17074391b48b4791cded373683a3baf67314f358d50Chris Lattner  virtual llvm::Constant *GetPropertySetFunction() = 0;
17149f6602707887eea1a558a1dffe0213102f887f2Daniel Dunbar
1726cc590602f41c3e98e8af0023d54296c8eca7910Fariborz Jahanian  // API for atomic copying of qualified aggregates in setter/getter.
1736cc590602f41c3e98e8af0023d54296c8eca7910Fariborz Jahanian  virtual llvm::Constant *GetCopyStructFunction() = 0;
1746cc590602f41c3e98e8af0023d54296c8eca7910Fariborz Jahanian
175ddb2a3d55a24a1dbdf9152621642d9a4b4fc2f61Daniel Dunbar  /// GetClass - Return a reference to the class for the given
176ddb2a3d55a24a1dbdf9152621642d9a4b4fc2f61Daniel Dunbar  /// interface decl.
1771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  virtual llvm::Value *GetClass(CGBuilderTy &Builder,
178ddb2a3d55a24a1dbdf9152621642d9a4b4fc2f61Daniel Dunbar                                const ObjCInterfaceDecl *OID) = 0;
179af2f62ce32e462f256855cd24b06dec4755d2827Daniel Dunbar
1802abd89c039e835e84519a4cd8a7495899a70153dAnders Carlsson  /// EnumerationMutationFunction - Return the function that's called by the
1812abd89c039e835e84519a4cd8a7495899a70153dAnders Carlsson  /// compiler when a mutation is detected during foreach iteration.
18274391b48b4791cded373683a3baf67314f358d50Chris Lattner  virtual llvm::Constant *EnumerationMutationFunction() = 0;
1831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
184f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall  virtual void EmitSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
185f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall                                    const ObjCAtSynchronizedStmt &S) = 0;
186f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall  virtual void EmitTryStmt(CodeGen::CodeGenFunction &CGF,
187f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall                           const ObjCAtTryStmt &S) = 0;
18864d5d6c5903157c521af496479d06dc26032d718Anders Carlsson  virtual void EmitThrowStmt(CodeGen::CodeGenFunction &CGF,
18964d5d6c5903157c521af496479d06dc26032d718Anders Carlsson                             const ObjCAtThrowStmt &S) = 0;
1906bf2ae05c777052e5ec05649710380dea263e7e0Daniel Dunbar  virtual llvm::Value *EmitObjCWeakRead(CodeGen::CodeGenFunction &CGF,
1916bf2ae05c777052e5ec05649710380dea263e7e0Daniel Dunbar                                        llvm::Value *AddrWeakObj) = 0;
1923e283e344595e0bd499b13b30a92b7d9c10a2140Fariborz Jahanian  virtual void EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF,
1933e283e344595e0bd499b13b30a92b7d9c10a2140Fariborz Jahanian                                  llvm::Value *src, llvm::Value *dest) = 0;
19458626500527695865683d1d65053743de8770b60Fariborz Jahanian  virtual void EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF,
195021a7a63984f0f912dc9e9dae2a1b3e1509a40ceFariborz Jahanian                                    llvm::Value *src, llvm::Value *dest,
196021a7a63984f0f912dc9e9dae2a1b3e1509a40ceFariborz Jahanian                                    bool threadlocal=false) = 0;
1977eda8367cf63caee8acf907356b1d199ccaa6e89Fariborz Jahanian  virtual void EmitObjCIvarAssign(CodeGen::CodeGenFunction &CGF,
1986c7a1f364796ce1acb988714e9e42076d1ce332eFariborz Jahanian                                  llvm::Value *src, llvm::Value *dest,
1996c7a1f364796ce1acb988714e9e42076d1ce332eFariborz Jahanian                                  llvm::Value *ivarOffset) = 0;
20058626500527695865683d1d65053743de8770b60Fariborz Jahanian  virtual void EmitObjCStrongCastAssign(CodeGen::CodeGenFunction &CGF,
20158626500527695865683d1d65053743de8770b60Fariborz Jahanian                                        llvm::Value *src, llvm::Value *dest) = 0;
2021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
203598d3f61b6ca854e9d3c2f3359e24468502a61aaFariborz Jahanian  virtual LValue EmitObjCValueForIvar(CodeGen::CodeGenFunction &CGF,
204598d3f61b6ca854e9d3c2f3359e24468502a61aaFariborz Jahanian                                      QualType ObjectTy,
205598d3f61b6ca854e9d3c2f3359e24468502a61aaFariborz Jahanian                                      llvm::Value *BaseValue,
206598d3f61b6ca854e9d3c2f3359e24468502a61aaFariborz Jahanian                                      const ObjCIvarDecl *Ivar,
207598d3f61b6ca854e9d3c2f3359e24468502a61aaFariborz Jahanian                                      unsigned CVRQualifiers) = 0;
208f63aa3fd429cdb9145d78f0b656bc78754efedb9Fariborz Jahanian  virtual llvm::Value *EmitIvarOffset(CodeGen::CodeGenFunction &CGF,
2092a03192a02dbf4fdff438d1e658356bde871aba4Daniel Dunbar                                      const ObjCInterfaceDecl *Interface,
210f63aa3fd429cdb9145d78f0b656bc78754efedb9Fariborz Jahanian                                      const ObjCIvarDecl *Ivar) = 0;
211082b02e8403d3ee9d2ded969fbe0e5d472f04cd8Fariborz Jahanian  virtual void EmitGCMemmoveCollectable(CodeGen::CodeGenFunction &CGF,
2121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                        llvm::Value *DestPtr,
213082b02e8403d3ee9d2ded969fbe0e5d472f04cd8Fariborz Jahanian                                        llvm::Value *SrcPtr,
21455bcace250e1ff366e4482714b344b8cbc8be5f3Fariborz Jahanian                                        llvm::Value *Size) = 0;
2150f984268b05edab2cc555a427c441baa9c252658Chris Lattner};
2160f984268b05edab2cc555a427c441baa9c252658Chris Lattner
2171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// Creates an instance of an Objective-C runtime class.
218391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner//TODO: This should include some way of selecting which runtime to target.
219c17a4d3b16a2624a76de5d7508805534545bd3bfDaniel DunbarCGObjCRuntime *CreateGNUObjCRuntime(CodeGenModule &CGM);
220c17a4d3b16a2624a76de5d7508805534545bd3bfDaniel DunbarCGObjCRuntime *CreateMacObjCRuntime(CodeGenModule &CGM);
22130bc57187be7535c57ef1ca8ff3e765653e94332Fariborz JahanianCGObjCRuntime *CreateMacNonFragileABIObjCRuntime(CodeGenModule &CGM);
2220f984268b05edab2cc555a427c441baa9c252658Chris Lattner}
2230f984268b05edab2cc555a427c441baa9c252658Chris Lattner}
2240f984268b05edab2cc555a427c441baa9c252658Chris Lattner#endif
225