blob: b9d6221f09c57c7325453a89ef5f621795347117 [file] [log] [blame]
Daniel Dunbarc17a4d32008-08-11 02:45:11 +00001//===------- CGObjCMac.cpp - Interface to Apple Objective-C Runtime -------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This provides Objective-C code generation targetting the Apple runtime.
11//
12//===----------------------------------------------------------------------===//
13
14#include "CGObjCRuntime.h"
15#include "CodeGenModule.h"
16#include "clang/AST/ASTContext.h"
Daniel Dunbare91593e2008-08-11 04:54:23 +000017#include "clang/AST/Decl.h"
Daniel Dunbarc17a4d32008-08-11 02:45:11 +000018#include "llvm/Module.h"
19#include "llvm/Support/Compiler.h"
20#include "llvm/Support/IRBuilder.h"
21#include "llvm/ADT/SmallVector.h"
22#include "llvm/ADT/StringMap.h"
23#include <map>
24
25using namespace clang;
26
27namespace {
28class CGObjCMac : public CodeGen::CGObjCRuntime {
29private:
30 CodeGen::CodeGenModule &CGM;
31
32public:
33 CGObjCMac(CodeGen::CodeGenModule &cgm);
34 virtual llvm::Constant *GenerateConstantString(const char *String,
35 const size_t length);
36
37 virtual llvm::Value *GenerateMessageSend(llvm::IRBuilder<> &Builder,
38 const llvm::Type *ReturnTy,
39 llvm::Value *Sender,
40 llvm::Value *Receiver,
41 Selector Sel,
42 llvm::Value** ArgV,
43 unsigned ArgC);
44
45 virtual llvm::Value *GenerateMessageSendSuper(llvm::IRBuilder<> &Builder,
46 const llvm::Type *ReturnTy,
47 llvm::Value *Sender,
48 const char *SuperClassName,
49 llvm::Value *Receiver,
50 Selector Sel,
51 llvm::Value** ArgV,
52 unsigned ArgC);
53
54 virtual llvm::Value *LookupClass(llvm::IRBuilder<> &Builder,
55 llvm::Value *ClassName);
56
57 virtual llvm::Value *GetSelector(llvm::IRBuilder<> &Builder, Selector Sel);
58
59 virtual llvm::Function *MethodPreamble(const std::string &ClassName,
60 const std::string &CategoryName,
61 const std::string &MethodName,
62 const llvm::Type *ReturnTy,
63 const llvm::Type *SelfTy,
64 const llvm::Type **ArgTy,
65 unsigned ArgC,
66 bool isClassMethod,
67 bool isVarArg);
68
69 virtual void GenerateCategory(const char *ClassName, const char *CategoryName,
70 const llvm::SmallVectorImpl<Selector> &InstanceMethodSels,
71 const llvm::SmallVectorImpl<llvm::Constant *> &InstanceMethodTypes,
72 const llvm::SmallVectorImpl<Selector> &ClassMethodSels,
73 const llvm::SmallVectorImpl<llvm::Constant *> &ClassMethodTypes,
74 const llvm::SmallVectorImpl<std::string> &Protocols);
75
76 virtual void GenerateClass(
77 const char *ClassName,
78 const char *SuperClassName,
79 const int instanceSize,
80 const llvm::SmallVectorImpl<llvm::Constant *> &IvarNames,
81 const llvm::SmallVectorImpl<llvm::Constant *> &IvarTypes,
82 const llvm::SmallVectorImpl<llvm::Constant *> &IvarOffsets,
83 const llvm::SmallVectorImpl<Selector> &InstanceMethodSels,
84 const llvm::SmallVectorImpl<llvm::Constant *> &InstanceMethodTypes,
85 const llvm::SmallVectorImpl<Selector> &ClassMethodSels,
86 const llvm::SmallVectorImpl<llvm::Constant *> &ClassMethodTypes,
87 const llvm::SmallVectorImpl<std::string> &Protocols);
88
89 virtual llvm::Value *GenerateProtocolRef(llvm::IRBuilder<> &Builder,
90 const char *ProtocolName);
91
92 virtual void GenerateProtocol(const char *ProtocolName,
93 const llvm::SmallVectorImpl<std::string> &Protocols,
94 const llvm::SmallVectorImpl<llvm::Constant *> &InstanceMethodNames,
95 const llvm::SmallVectorImpl<llvm::Constant *> &InstanceMethodTypes,
96 const llvm::SmallVectorImpl<llvm::Constant *> &ClassMethodNames,
97 const llvm::SmallVectorImpl<llvm::Constant *> &ClassMethodTypes);
98
99 virtual llvm::Function *ModuleInitFunction();
100};
101} // end anonymous namespace
102
103CGObjCMac::CGObjCMac(CodeGen::CodeGenModule &cgm) : CGM(cgm) {
104}
105
106// This has to perform the lookup every time, since posing and related
107// techniques can modify the name -> class mapping.
108llvm::Value *CGObjCMac::LookupClass(llvm::IRBuilder<> &Builder,
109 llvm::Value *ClassName) {
110 assert(0 && "Cannot lookup classes on Mac runtime.");
111 return 0;
112}
113
114/// GetSelector - Return the pointer to the unique'd string for this selector.
115llvm::Value *CGObjCMac::GetSelector(llvm::IRBuilder<> &Builder, Selector Sel) {
116 assert(0 && "Cannot get selector on Mac runtime.");
117 return 0;
118}
119
120/// Generate an NSConstantString object.
121llvm::Constant *CGObjCMac::GenerateConstantString(const char *String,
122 const size_t length) {
123 assert(0 && "Cannot generate constant string for Mac runtime.");
124 return 0;
125}
126
127/// Generates a message send where the super is the receiver. This is
128/// a message send to self with special delivery semantics indicating
129/// which class's method should be called.
130llvm::Value *CGObjCMac::GenerateMessageSendSuper(llvm::IRBuilder<> &Builder,
131 const llvm::Type *ReturnTy,
132 llvm::Value *Sender,
133 const char *SuperClassName,
134 llvm::Value *Receiver,
135 Selector Sel,
136 llvm::Value** ArgV,
137 unsigned ArgC) {
138 assert(0 && "Cannot generate message send to super for Mac runtime.");
139 return 0;
140}
141
142/// Generate code for a message send expression.
143llvm::Value *CGObjCMac::GenerateMessageSend(llvm::IRBuilder<> &Builder,
144 const llvm::Type *ReturnTy,
145 llvm::Value *Sender,
146 llvm::Value *Receiver,
147 Selector Sel,
148 llvm::Value** ArgV,
149 unsigned ArgC) {
150 assert(0 && "Cannot generate message send for Mac runtime.");
151 return 0;
152}
153
154llvm::Value *CGObjCMac::GenerateProtocolRef(llvm::IRBuilder<> &Builder,
155 const char *ProtocolName) {
156 assert(0 && "Cannot get protocol reference on Mac runtime.");
157 return 0;
158}
159
160void CGObjCMac::GenerateProtocol(const char *ProtocolName,
161 const llvm::SmallVectorImpl<std::string> &Protocols,
162 const llvm::SmallVectorImpl<llvm::Constant *> &InstanceMethodNames,
163 const llvm::SmallVectorImpl<llvm::Constant *> &InstanceMethodTypes,
164 const llvm::SmallVectorImpl<llvm::Constant *> &ClassMethodNames,
165 const llvm::SmallVectorImpl<llvm::Constant *> &ClassMethodTypes) {
166 assert(0 && "Cannot generate protocol for Mac runtime.");
167}
168
169void CGObjCMac::GenerateCategory(
170 const char *ClassName,
171 const char *CategoryName,
172 const llvm::SmallVectorImpl<Selector> &InstanceMethodSels,
173 const llvm::SmallVectorImpl<llvm::Constant *> &InstanceMethodTypes,
174 const llvm::SmallVectorImpl<Selector> &ClassMethodSels,
175 const llvm::SmallVectorImpl<llvm::Constant *> &ClassMethodTypes,
176 const llvm::SmallVectorImpl<std::string> &Protocols) {
177 assert(0 && "Cannot generate category for Mac runtime.");
178}
179
180void CGObjCMac::GenerateClass(
181 const char *ClassName,
182 const char *SuperClassName,
183 const int instanceSize,
184 const llvm::SmallVectorImpl<llvm::Constant *> &IvarNames,
185 const llvm::SmallVectorImpl<llvm::Constant *> &IvarTypes,
186 const llvm::SmallVectorImpl<llvm::Constant *> &IvarOffsets,
187 const llvm::SmallVectorImpl<Selector> &InstanceMethodSels,
188 const llvm::SmallVectorImpl<llvm::Constant *> &InstanceMethodTypes,
189 const llvm::SmallVectorImpl<Selector> &ClassMethodSels,
190 const llvm::SmallVectorImpl<llvm::Constant *> &ClassMethodTypes,
191 const llvm::SmallVectorImpl<std::string> &Protocols) {
192 assert(0 && "Cannot generate class for Mac runtime.");
193}
194
195llvm::Function *CGObjCMac::ModuleInitFunction() {
196 return NULL;
197}
198
199llvm::Function *CGObjCMac::MethodPreamble(
200 const std::string &ClassName,
201 const std::string &CategoryName,
202 const std::string &MethodName,
203 const llvm::Type *ReturnTy,
204 const llvm::Type *SelfTy,
205 const llvm::Type **ArgTy,
206 unsigned ArgC,
207 bool isClassMethod,
208 bool isVarArg) {
209 assert(0 && "Cannot generate method preamble for Mac runtime.");
210 return 0;
211}
212
213CodeGen::CGObjCRuntime *CodeGen::CreateMacObjCRuntime(CodeGen::CodeGenModule &CGM){
214 return new CGObjCMac(CGM);
215}