CGObjCRuntime.h revision 7eda8367cf63caee8acf907356b1d199ccaa6e89
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 1920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov#include "llvm/ADT/SmallVector.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; 280f984268b05edab2cc555a427c441baa9c252658Chris Lattner class Type; 290f984268b05edab2cc555a427c441baa9c252658Chris Lattner class Value; 300f984268b05edab2cc555a427c441baa9c252658Chris Lattner class Module; 31391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner class Function; 320f984268b05edab2cc555a427c441baa9c252658Chris Lattner} 330f984268b05edab2cc555a427c441baa9c252658Chris Lattner 340f984268b05edab2cc555a427c441baa9c252658Chris Lattnernamespace clang { 3546f45b9bec4a265ad8400a538e5ec3a5683617f1Daniel Dunbarnamespace CodeGen { 3646f45b9bec4a265ad8400a538e5ec3a5683617f1Daniel Dunbar class CodeGenFunction; 3746f45b9bec4a265ad8400a538e5ec3a5683617f1Daniel Dunbar} 388f2926b73ed635afecd020da787af6a837601a2bDaniel Dunbar 3964d5d6c5903157c521af496479d06dc26032d718Anders Carlsson class ObjCAtTryStmt; 4064d5d6c5903157c521af496479d06dc26032d718Anders Carlsson class ObjCAtThrowStmt; 4110cac6f7115b59a466bb8d2d51cdddeb38aadc37Chris Lattner class ObjCAtSynchronizedStmt; 427ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar class ObjCCategoryImplDecl; 437ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar class ObjCImplementationDecl; 44ddb2a3d55a24a1dbdf9152621642d9a4b4fc2f61Daniel Dunbar class ObjCInterfaceDecl; 458f2926b73ed635afecd020da787af6a837601a2bDaniel Dunbar class ObjCMessageExpr; 467ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar class ObjCMethodDecl; 47af2f62ce32e462f256855cd24b06dec4755d2827Daniel Dunbar class ObjCProtocolDecl; 488e67b63530b4f39a48bc12d97376f373a6901279Chris Lattner class Selector; 49af2f62ce32e462f256855cd24b06dec4755d2827Daniel Dunbar 500f984268b05edab2cc555a427c441baa9c252658Chris Lattnernamespace CodeGen { 51dce1406f1c1f572cfd61c494546572d63461c741Chris Lattner class CodeGenModule; 520f984268b05edab2cc555a427c441baa9c252658Chris Lattner 5320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov//FIXME Several methods should be pure virtual but aren't to avoid the 5420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov//partially-implemented subclass breaking. 5520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov 5620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov/// Implements runtime-specific code generation functions. 570f984268b05edab2cc555a427c441baa9c252658Chris Lattnerclass CGObjCRuntime { 5858bf6101062867ca4b3028f9e77e4ae642f09b44Daniel Dunbar 590f984268b05edab2cc555a427c441baa9c252658Chris Lattnerpublic: 600f984268b05edab2cc555a427c441baa9c252658Chris Lattner virtual ~CGObjCRuntime(); 61af2f62ce32e462f256855cd24b06dec4755d2827Daniel Dunbar 62391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner /// Generate the function required to register all Objective-C components in 63391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner /// this compilation unit with the runtime library. 647ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar virtual llvm::Function *ModuleInitFunction() = 0; 65af2f62ce32e462f256855cd24b06dec4755d2827Daniel Dunbar 667ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar /// Get a selector for the specified name and type values. The 677ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar /// return value should have the LLVM type for pointer-to 687ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar /// ASTContext::getObjCSelType(). 6945d196b8387dcefc4df26cda114fa34c6528e928Daniel Dunbar virtual llvm::Value *GetSelector(CGBuilderTy &Builder, 707ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar Selector Sel) = 0; 71af2f62ce32e462f256855cd24b06dec4755d2827Daniel Dunbar 727ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar /// Generate a constant string object. 73bbce49b9e5c6d7f05926b89f8e6fd235ae01c250Daniel Dunbar virtual llvm::Constant *GenerateConstantString(const std::string &String) = 0; 74af2f62ce32e462f256855cd24b06dec4755d2827Daniel Dunbar 7520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov /// Generate a category. A category contains a list of methods (and 7620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov /// accompanying metadata) and a list of protocols. 777ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar virtual void GenerateCategory(const ObjCCategoryImplDecl *OCD) = 0; 78af2f62ce32e462f256855cd24b06dec4755d2827Daniel Dunbar 7920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov /// Generate a class stucture for this class. 807ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar virtual void GenerateClass(const ObjCImplementationDecl *OID) = 0; 817ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar 827ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar /// Generate an Objective-C message send operation. 838f2926b73ed635afecd020da787af6a837601a2bDaniel Dunbar virtual CodeGen::RValue 848f2926b73ed635afecd020da787af6a837601a2bDaniel Dunbar GenerateMessageSend(CodeGen::CodeGenFunction &CGF, 857f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbar QualType ResultType, 867f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbar Selector Sel, 87f56f1913e91ad32bed52dd3f6afc26735d336584Daniel Dunbar llvm::Value *Receiver, 8819cd87eb5fb3c197e631ce08fd52c446c4d4e8f1Daniel Dunbar bool IsClassMessage, 8919cd87eb5fb3c197e631ce08fd52c446c4d4e8f1Daniel Dunbar const CallArgList &CallArgs) = 0; 90af2f62ce32e462f256855cd24b06dec4755d2827Daniel Dunbar 917ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar /// Generate an Objective-C message send operation to the super 92f56f1913e91ad32bed52dd3f6afc26735d336584Daniel Dunbar /// class initiated in a method for Class and with the given Self 93f56f1913e91ad32bed52dd3f6afc26735d336584Daniel Dunbar /// object. 948f2926b73ed635afecd020da787af6a837601a2bDaniel Dunbar virtual CodeGen::RValue 958f2926b73ed635afecd020da787af6a837601a2bDaniel Dunbar GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF, 967f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbar QualType ResultType, 977f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbar Selector Sel, 98f56f1913e91ad32bed52dd3f6afc26735d336584Daniel Dunbar const ObjCInterfaceDecl *Class, 99f56f1913e91ad32bed52dd3f6afc26735d336584Daniel Dunbar llvm::Value *Self, 10019cd87eb5fb3c197e631ce08fd52c446c4d4e8f1Daniel Dunbar bool IsClassMessage, 10119cd87eb5fb3c197e631ce08fd52c446c4d4e8f1Daniel Dunbar const CallArgList &CallArgs) = 0; 10298c5ead87d720d8b68b6f236c3c3579a388fc882Daniel Dunbar 10398c5ead87d720d8b68b6f236c3c3579a388fc882Daniel Dunbar /// Emit the code to return the named protocol as an object, as in a 10498c5ead87d720d8b68b6f236c3c3579a388fc882Daniel Dunbar /// @protocol expression. 10545d196b8387dcefc4df26cda114fa34c6528e928Daniel Dunbar virtual llvm::Value *GenerateProtocolRef(CGBuilderTy &Builder, 1067ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar const ObjCProtocolDecl *OPD) = 0; 10798c5ead87d720d8b68b6f236c3c3579a388fc882Daniel Dunbar 10820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov /// Generate the named protocol. Protocols contain method metadata but no 10920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov /// implementations. 1107ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar virtual void GenerateProtocol(const ObjCProtocolDecl *OPD) = 0; 1117ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar 1127ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar /// Generate a function preamble for a method with the specified 1137ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar /// types. 1147ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar 1157ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar // FIXME: Current this just generates the Function definition, but 1167ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar // really this should also be generating the loads of the 1177ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar // parameters, as the runtime should have full control over how 1187ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar // parameters are passed. 1197ded7f4983dc4a20561db7a8d02c6b2435030961Daniel Dunbar virtual llvm::Function *GenerateMethod(const ObjCMethodDecl *OMD) = 0; 120af2f62ce32e462f256855cd24b06dec4755d2827Daniel Dunbar 12149f6602707887eea1a558a1dffe0213102f887f2Daniel Dunbar /// Return the runtime function for getting properties. 12249f6602707887eea1a558a1dffe0213102f887f2Daniel Dunbar virtual llvm::Function *GetPropertyGetFunction() = 0; 12349f6602707887eea1a558a1dffe0213102f887f2Daniel Dunbar 12449f6602707887eea1a558a1dffe0213102f887f2Daniel Dunbar /// Return the runtime function for setting properties. 12549f6602707887eea1a558a1dffe0213102f887f2Daniel Dunbar virtual llvm::Function *GetPropertySetFunction() = 0; 12649f6602707887eea1a558a1dffe0213102f887f2Daniel Dunbar 127ddb2a3d55a24a1dbdf9152621642d9a4b4fc2f61Daniel Dunbar /// GetClass - Return a reference to the class for the given 128ddb2a3d55a24a1dbdf9152621642d9a4b4fc2f61Daniel Dunbar /// interface decl. 12945d196b8387dcefc4df26cda114fa34c6528e928Daniel Dunbar virtual llvm::Value *GetClass(CGBuilderTy &Builder, 130ddb2a3d55a24a1dbdf9152621642d9a4b4fc2f61Daniel Dunbar const ObjCInterfaceDecl *OID) = 0; 131af2f62ce32e462f256855cd24b06dec4755d2827Daniel Dunbar 1322abd89c039e835e84519a4cd8a7495899a70153dAnders Carlsson /// EnumerationMutationFunction - Return the function that's called by the 1332abd89c039e835e84519a4cd8a7495899a70153dAnders Carlsson /// compiler when a mutation is detected during foreach iteration. 1342abd89c039e835e84519a4cd8a7495899a70153dAnders Carlsson virtual llvm::Function *EnumerationMutationFunction() = 0; 1352abd89c039e835e84519a4cd8a7495899a70153dAnders Carlsson 136391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner /// If instance variable addresses are determined at runtime then this should 137391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner /// return true, otherwise instance variables will be accessed directly from 138391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner /// the structure. If this returns true then @defs is invalid for this 139391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner /// runtime and a warning should be generated. 14019cd87eb5fb3c197e631ce08fd52c446c4d4e8f1Daniel Dunbar virtual bool LateBoundIVars() const { return false; } 14164d5d6c5903157c521af496479d06dc26032d718Anders Carlsson 14264d5d6c5903157c521af496479d06dc26032d718Anders Carlsson virtual void EmitTryStmt(CodeGen::CodeGenFunction &CGF, 14364d5d6c5903157c521af496479d06dc26032d718Anders Carlsson const ObjCAtTryStmt &S) = 0; 14464d5d6c5903157c521af496479d06dc26032d718Anders Carlsson virtual void EmitThrowStmt(CodeGen::CodeGenFunction &CGF, 14564d5d6c5903157c521af496479d06dc26032d718Anders Carlsson const ObjCAtThrowStmt &S) = 0; 14610cac6f7115b59a466bb8d2d51cdddeb38aadc37Chris Lattner virtual void EmitSynchronizedStmt(CodeGen::CodeGenFunction &CGF, 14710cac6f7115b59a466bb8d2d51cdddeb38aadc37Chris Lattner const ObjCAtSynchronizedStmt &S) = 0; 1483e283e344595e0bd499b13b30a92b7d9c10a2140Fariborz Jahanian virtual llvm::Value * EmitObjCWeakRead(CodeGen::CodeGenFunction &CGF, 1496dc2317b59cb1180a59f6c283d96b7a5dfeb5307Fariborz Jahanian llvm::Value *AddrWeakObj) = 0; 1503e283e344595e0bd499b13b30a92b7d9c10a2140Fariborz Jahanian virtual void EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF, 1513e283e344595e0bd499b13b30a92b7d9c10a2140Fariborz Jahanian llvm::Value *src, llvm::Value *dest) = 0; 15258626500527695865683d1d65053743de8770b60Fariborz Jahanian virtual void EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF, 15358626500527695865683d1d65053743de8770b60Fariborz Jahanian llvm::Value *src, llvm::Value *dest) = 0; 1547eda8367cf63caee8acf907356b1d199ccaa6e89Fariborz Jahanian virtual void EmitObjCIvarAssign(CodeGen::CodeGenFunction &CGF, 1557eda8367cf63caee8acf907356b1d199ccaa6e89Fariborz Jahanian llvm::Value *src, llvm::Value *dest) = 0; 15658626500527695865683d1d65053743de8770b60Fariborz Jahanian virtual void EmitObjCStrongCastAssign(CodeGen::CodeGenFunction &CGF, 15758626500527695865683d1d65053743de8770b60Fariborz Jahanian llvm::Value *src, llvm::Value *dest) = 0; 1580f984268b05edab2cc555a427c441baa9c252658Chris Lattner}; 1590f984268b05edab2cc555a427c441baa9c252658Chris Lattner 160391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner/// Creates an instance of an Objective-C runtime class. 161391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner//TODO: This should include some way of selecting which runtime to target. 162c17a4d3b16a2624a76de5d7508805534545bd3bfDaniel DunbarCGObjCRuntime *CreateGNUObjCRuntime(CodeGenModule &CGM); 163c17a4d3b16a2624a76de5d7508805534545bd3bfDaniel DunbarCGObjCRuntime *CreateMacObjCRuntime(CodeGenModule &CGM); 1640f984268b05edab2cc555a427c441baa9c252658Chris Lattner} 1650f984268b05edab2cc555a427c441baa9c252658Chris Lattner} 1660f984268b05edab2cc555a427c441baa9c252658Chris Lattner#endif 167