CGObjCRuntime.h revision af2f62ce32e462f256855cd24b06dec4755d2827
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"
2058bf6101062867ca4b3028f9e77e4ae642f09b44Daniel Dunbar#include "llvm/Support/IRBuilder.h"
218ef07c0a81727aae37c820a816dac019f5fe1d43Argyrios Kyrtzidis#include <string>
220f984268b05edab2cc555a427c441baa9c252658Chris Lattner
230f984268b05edab2cc555a427c441baa9c252658Chris Lattnernamespace llvm {
240f984268b05edab2cc555a427c441baa9c252658Chris Lattner  class Constant;
250f984268b05edab2cc555a427c441baa9c252658Chris Lattner  class Type;
260f984268b05edab2cc555a427c441baa9c252658Chris Lattner  class Value;
270f984268b05edab2cc555a427c441baa9c252658Chris Lattner  class Module;
28391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner  class Function;
290f984268b05edab2cc555a427c441baa9c252658Chris Lattner}
300f984268b05edab2cc555a427c441baa9c252658Chris Lattner
310f984268b05edab2cc555a427c441baa9c252658Chris Lattnernamespace clang {
32af2f62ce32e462f256855cd24b06dec4755d2827Daniel Dunbar  class ObjCProtocolDecl;
338e67b63530b4f39a48bc12d97376f373a6901279Chris Lattner  class Selector;
34af2f62ce32e462f256855cd24b06dec4755d2827Daniel Dunbar
350f984268b05edab2cc555a427c441baa9c252658Chris Lattnernamespace CodeGen {
36dce1406f1c1f572cfd61c494546572d63461c741Chris Lattner  class CodeGenModule;
370f984268b05edab2cc555a427c441baa9c252658Chris Lattner
3820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov//FIXME Several methods should be pure virtual but aren't to avoid the
3920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov//partially-implemented subclass breaking.
4020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov
4120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov/// Implements runtime-specific code generation functions.
420f984268b05edab2cc555a427c441baa9c252658Chris Lattnerclass CGObjCRuntime {
4358bf6101062867ca4b3028f9e77e4ae642f09b44Daniel Dunbar  typedef llvm::IRBuilder<> BuilderType;
4458bf6101062867ca4b3028f9e77e4ae642f09b44Daniel Dunbar
450f984268b05edab2cc555a427c441baa9c252658Chris Lattnerpublic:
460f984268b05edab2cc555a427c441baa9c252658Chris Lattner  virtual ~CGObjCRuntime();
470f984268b05edab2cc555a427c441baa9c252658Chris Lattner
48391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner  /// Generate an Objective-C message send operation
4958bf6101062867ca4b3028f9e77e4ae642f09b44Daniel Dunbar  virtual llvm::Value *GenerateMessageSend(BuilderType &Builder,
500f984268b05edab2cc555a427c441baa9c252658Chris Lattner                                           const llvm::Type *ReturnTy,
510f984268b05edab2cc555a427c441baa9c252658Chris Lattner                                           llvm::Value *Receiver,
529384c768e93f270118a30ce96546083a666da284Chris Lattner                                           Selector Sel,
530f984268b05edab2cc555a427c441baa9c252658Chris Lattner                                           llvm::Value** ArgV,
5420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov                                           unsigned ArgC) =0;
55af2f62ce32e462f256855cd24b06dec4755d2827Daniel Dunbar
56391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner  /// Generate the function required to register all Objective-C components in
57391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner  /// this compilation unit with the runtime library.
5820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  virtual llvm::Function *ModuleInitFunction() =0;
59af2f62ce32e462f256855cd24b06dec4755d2827Daniel Dunbar
6020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  /// Get a selector for the specified name and type values
6158bf6101062867ca4b3028f9e77e4ae642f09b44Daniel Dunbar  virtual llvm::Value *GetSelector(BuilderType &Builder,
6285e356825b291f86c6e926638914222b834b71a3Chris Lattner                                   Selector Sel) =0;
63af2f62ce32e462f256855cd24b06dec4755d2827Daniel Dunbar
6420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  /// Generate a constant string object
65bbce49b9e5c6d7f05926b89f8e6fd235ae01c250Daniel Dunbar  virtual llvm::Constant *GenerateConstantString(const std::string &String) = 0;
66af2f62ce32e462f256855cd24b06dec4755d2827Daniel Dunbar
6720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  /// Generate a category.  A category contains a list of methods (and
6820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  /// accompanying metadata) and a list of protocols.
6920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  virtual void GenerateCategory(const char *ClassName, const char *CategoryName,
70a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner             const llvm::SmallVectorImpl<Selector>  &InstanceMethodSels,
7120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov             const llvm::SmallVectorImpl<llvm::Constant *>  &InstanceMethodTypes,
72a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner             const llvm::SmallVectorImpl<Selector>  &ClassMethodSels,
7320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov             const llvm::SmallVectorImpl<llvm::Constant *>  &ClassMethodTypes,
7420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov             const llvm::SmallVectorImpl<std::string> &Protocols) =0;
75af2f62ce32e462f256855cd24b06dec4755d2827Daniel Dunbar
7620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  /// Generate a class stucture for this class.
7720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  virtual void GenerateClass(
7820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov             const char *ClassName,
7920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov             const char *SuperClassName,
8020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov             const int instanceSize,
8120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov             const llvm::SmallVectorImpl<llvm::Constant *>  &IvarNames,
8220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov             const llvm::SmallVectorImpl<llvm::Constant *>  &IvarTypes,
8320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov             const llvm::SmallVectorImpl<llvm::Constant *>  &IvarOffsets,
84a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner             const llvm::SmallVectorImpl<Selector>  &InstanceMethodSels,
8520ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov             const llvm::SmallVectorImpl<llvm::Constant *>  &InstanceMethodTypes,
86a4210076fc1d7ac0a20b8b4a79e18a8ae33b9c69Chris Lattner             const llvm::SmallVectorImpl<Selector>  &ClassMethodSels,
8720ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov             const llvm::SmallVectorImpl<llvm::Constant *>  &ClassMethodTypes,
8820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov             const llvm::SmallVectorImpl<std::string> &Protocols) =0;
89af2f62ce32e462f256855cd24b06dec4755d2827Daniel Dunbar
9085e356825b291f86c6e926638914222b834b71a3Chris Lattner  virtual llvm::Value *GenerateMessageSendSuper(llvm::IRBuilder<true> &Builder,
918e67b63530b4f39a48bc12d97376f373a6901279Chris Lattner                                                const llvm::Type *ReturnTy,
928e67b63530b4f39a48bc12d97376f373a6901279Chris Lattner                                                const char *SuperClassName,
938e67b63530b4f39a48bc12d97376f373a6901279Chris Lattner                                                llvm::Value *Receiver,
948e67b63530b4f39a48bc12d97376f373a6901279Chris Lattner                                                Selector Sel,
958e67b63530b4f39a48bc12d97376f373a6901279Chris Lattner                                                llvm::Value** ArgV,
968e67b63530b4f39a48bc12d97376f373a6901279Chris Lattner                                                unsigned ArgC) = 0;
9798c5ead87d720d8b68b6f236c3c3579a388fc882Daniel Dunbar
9898c5ead87d720d8b68b6f236c3c3579a388fc882Daniel Dunbar  /// Emit the code to return the named protocol as an object, as in a
9998c5ead87d720d8b68b6f236c3c3579a388fc882Daniel Dunbar  /// @protocol expression.
10098c5ead87d720d8b68b6f236c3c3579a388fc882Daniel Dunbar  virtual llvm::Value *GenerateProtocolRef(llvm::IRBuilder<true> &Builder,
101af2f62ce32e462f256855cd24b06dec4755d2827Daniel Dunbar                                           const ObjCProtocolDecl *PD) = 0;
10298c5ead87d720d8b68b6f236c3c3579a388fc882Daniel Dunbar
10320ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  /// Generate the named protocol.  Protocols contain method metadata but no
10420ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  /// implementations.
105af2f62ce32e462f256855cd24b06dec4755d2827Daniel Dunbar  virtual void GenerateProtocol(const ObjCProtocolDecl *PD) = 0;
106af2f62ce32e462f256855cd24b06dec4755d2827Daniel Dunbar
107391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner  /// Generate a function preamble for a method with the specified types
10820ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  virtual llvm::Function *MethodPreamble(
10920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov                                         const std::string &ClassName,
11020ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov                                         const std::string &CategoryName,
11120ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov                                         const std::string &MethodName,
11220ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov                                         const llvm::Type *ReturnTy,
113391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner                                         const llvm::Type *SelfTy,
114391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner                                         const llvm::Type **ArgTy,
115391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner                                         unsigned ArgC,
11620ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov                                         bool isClassMethod,
117391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner                                         bool isVarArg) = 0;
118af2f62ce32e462f256855cd24b06dec4755d2827Daniel Dunbar
11920ff3108fcd2c3bd734dc79efc22ebaa090abd41Anton Korobeynikov  /// Look up the class for the specified name
12058bf6101062867ca4b3028f9e77e4ae642f09b44Daniel Dunbar  virtual llvm::Value *LookupClass(BuilderType &Builder,
12185e356825b291f86c6e926638914222b834b71a3Chris Lattner                                   llvm::Value *ClassName) =0;
122af2f62ce32e462f256855cd24b06dec4755d2827Daniel Dunbar
123391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner  /// If instance variable addresses are determined at runtime then this should
124391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner  /// return true, otherwise instance variables will be accessed directly from
125391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner  /// the structure.  If this returns true then @defs is invalid for this
126391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner  /// runtime and a warning should be generated.
127391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner  virtual bool LateBoundIVars() { return false; }
1280f984268b05edab2cc555a427c441baa9c252658Chris Lattner};
1290f984268b05edab2cc555a427c441baa9c252658Chris Lattner
130391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner/// Creates an instance of an Objective-C runtime class.
131391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner//TODO: This should include some way of selecting which runtime to target.
132c17a4d3b16a2624a76de5d7508805534545bd3bfDaniel DunbarCGObjCRuntime *CreateGNUObjCRuntime(CodeGenModule &CGM);
133c17a4d3b16a2624a76de5d7508805534545bd3bfDaniel DunbarCGObjCRuntime *CreateMacObjCRuntime(CodeGenModule &CGM);
1340f984268b05edab2cc555a427c441baa9c252658Chris Lattner}
1350f984268b05edab2cc555a427c441baa9c252658Chris Lattner}
1360f984268b05edab2cc555a427c441baa9c252658Chris Lattner#endif
137