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