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