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