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