Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Newer
Older
100644 417 lines (374 sloc) 13.193 kB
cfd7b4d added licensing information on the new files
Laurent Sansonetti authored
1 /*
2 * MacRuby compiler.
3 *
4 * This file is covered by the Ruby license. See COPYING for more details.
5 *
6 * Copyright (C) 2008-2009, Apple Inc. All rights reserved.
7 */
8
cb65416 the great schism, part I
Laurent Sansonetti authored
9 #ifndef __COMPILER_H_
10 #define __COMPILER_H_
11
12 #if defined(__cplusplus)
13
14 // For the dispatcher.
9590d40 fixing and adding several missing ruby method features
Laurent Sansonetti authored
15 #define DISPATCH_VCALL 1 // no receiver, no argument
16 #define DISPATCH_FCALL 2 // no receiver, one or more arguments
17 #define DISPATCH_SUPER 3 // super call
18 #define DISPATCH_SELF_ATTRASGN 4 // self attribute assignment
19 #define SPLAT_ARG_FOLLOWS 0xdeadbeef
cb65416 the great schism, part I
Laurent Sansonetti authored
20
21 // For defined?
22 #define DEFINED_IVAR 1
23 #define DEFINED_GVAR 2
24 #define DEFINED_CVAR 3
25 #define DEFINED_CONST 4
26 #define DEFINED_LCONST 5
27 #define DEFINED_SUPER 6
28 #define DEFINED_METHOD 7
29
bb0b28c moving to LLVM r82747
Laurent Sansonetti authored
30 class RoxorScope {
2541db3 added preliminary support for backtracing/symbolication
Laurent Sansonetti authored
31 public:
32 std::string path;
33 std::vector<unsigned int> dispatch_lines;
34
bb0b28c moving to LLVM r82747
Laurent Sansonetti authored
35 RoxorScope(const char *fname) : path(fname) {}
2541db3 added preliminary support for backtracing/symbolication
Laurent Sansonetti authored
36 };
37
cb65416 the great schism, part I
Laurent Sansonetti authored
38 class RoxorCompiler {
39 public:
40 static llvm::Module *module;
41 static RoxorCompiler *shared;
42
3432fd1 a better exception-based implementation for return-from-block
Laurent Sansonetti authored
43 RoxorCompiler(void);
cb65416 the great schism, part I
Laurent Sansonetti authored
44 virtual ~RoxorCompiler(void) { }
45
3432fd1 a better exception-based implementation for return-from-block
Laurent Sansonetti authored
46 void set_fname(const char *_fname) {
47 fname = _fname;
48 }
49
cb65416 the great schism, part I
Laurent Sansonetti authored
50 Value *compile_node(NODE *node);
51
52 virtual Function *compile_main_function(NODE *node);
53 Function *compile_read_attr(ID name);
54 Function *compile_write_attr(ID name);
9fab1ac fixed variadic functions/methods calls
Laurent Sansonetti authored
55 Function *compile_stub(const char *types, bool variadic, int min_argc,
56 bool is_objc);
cb65416 the great schism, part I
Laurent Sansonetti authored
57 Function *compile_bs_struct_new(rb_vm_bs_boxed_t *bs_boxed);
58 Function *compile_bs_struct_writer(rb_vm_bs_boxed_t *bs_boxed,
59 int field);
60 Function *compile_ffi_function(void *stub, void *imp, int argc);
61 Function *compile_to_rval_convertor(const char *type);
62 Function *compile_to_ocval_convertor(const char *type);
c1c347f AOT compiler: now supporting objc stubs and super dispatch
Laurent Sansonetti authored
63 Function *compile_objc_stub(Function *ruby_func, IMP ruby_imp,
64 const rb_vm_arity_t &arity, const char *types);
208a965 a quick implementation for #define_method (not yet 100% complete)
Laurent Sansonetti authored
65 Function *compile_block_caller(rb_vm_block_t *block);
cb65416 the great schism, part I
Laurent Sansonetti authored
66
67 const Type *convert_type(const char *type);
68
c219e86 don't slow ivars used inside an eval string
Laurent Sansonetti authored
69 bool is_inside_eval(void) { return inside_eval; }
70 void set_inside_eval(bool flag) { inside_eval = flag; }
12a1d67 fixing bugs in instance_eval & friends + fixed some specs so that the…
Laurent Sansonetti authored
71 bool is_dynamic_class(void) { return dynamic_class; }
72 void set_dynamic_class(bool flag) { dynamic_class = flag; }
c219e86 don't slow ivars used inside an eval string
Laurent Sansonetti authored
73
bb0b28c moving to LLVM r82747
Laurent Sansonetti authored
74 RoxorScope *scope_for_function(Function *f) {
75 std::map<Function *, RoxorScope *>::iterator i = scopes.find(f);
76 return i == scopes.end() ? NULL : i->second;
77 }
78
79 void clear_scopes(void) {
80 scopes.clear();
81 }
82
cb65416 the great schism, part I
Laurent Sansonetti authored
83 protected:
84 const char *fname;
c219e86 don't slow ivars used inside an eval string
Laurent Sansonetti authored
85 bool inside_eval;
cb65416 the great schism, part I
Laurent Sansonetti authored
86
87 std::map<ID, Value *> lvars;
88 std::vector<ID> dvars;
f61f2c7 @vincentisambart const pointers should be real constants
vincentisambart authored
89 std::map<ID, Value *> ivar_slots_cache;
cb65416 the great schism, part I
Laurent Sansonetti authored
90 std::map<std::string, GlobalVariable *> static_strings;
e379686 some work on unicode support (still in progress)
Laurent Sansonetti authored
91 std::map<CFHashCode, GlobalVariable *> static_ustrings;
bb0b28c moving to LLVM r82747
Laurent Sansonetti authored
92 std::map<Function *, RoxorScope *> scopes;
cb65416 the great schism, part I
Laurent Sansonetti authored
93
94 #if ROXOR_COMPILER_DEBUG
95 int level;
96 # define DEBUG_LEVEL_INC() (level++)
97 # define DEBUG_LEVEL_DEC() (level--)
98 #else
99 # define DEBUG_LEVEL_INC()
100 # define DEBUG_LEVEL_DEC()
101 #endif
102
2541db3 added preliminary support for backtracing/symbolication
Laurent Sansonetti authored
103 unsigned int current_line;
cb65416 the great schism, part I
Laurent Sansonetti authored
104 BasicBlock *bb;
105 BasicBlock *entry_bb;
106 ID current_mid;
164ca93 fixed super within a method that has a splat argument
Laurent Sansonetti authored
107 rb_vm_arity_t current_arity;
cb65416 the great schism, part I
Laurent Sansonetti authored
108 bool current_instance_method;
109 ID self_id;
110 Value *current_self;
111 bool current_block;
1961daa better fix than last one
Laurent Sansonetti authored
112 bool current_block_chain;
cb65416 the great schism, part I
Laurent Sansonetti authored
113 Value *current_var_uses;
114 Value *running_block;
115 BasicBlock *begin_bb;
63c77f8 @vincentisambart now rescues in rescues should work properly in most cases
vincentisambart authored
116 // block used in an invoke when an exception occurs
117 BasicBlock *rescue_invoke_bb;
118 // block to return to in a rescue if an exception is not handled
119 BasicBlock *rescue_rethrow_bb;
cb65416 the great schism, part I
Laurent Sansonetti authored
120 BasicBlock *ensure_bb;
121 bool current_rescue;
122 NODE *current_block_node;
123 Function *current_block_func;
124 GlobalVariable *current_opened_class;
12a1d67 fixing bugs in instance_eval & friends + fixed some specs so that the…
Laurent Sansonetti authored
125 bool dynamic_class;
cb65416 the great schism, part I
Laurent Sansonetti authored
126 bool current_module;
127 BasicBlock *current_loop_begin_bb;
128 BasicBlock *current_loop_body_bb;
129 BasicBlock *current_loop_end_bb;
513ee74 @vincentisambart Fixed the return value of while/until loops
vincentisambart authored
130 PHINode *current_loop_exit_val;
3432fd1 a better exception-based implementation for return-from-block
Laurent Sansonetti authored
131 int return_from_block;
132 int return_from_block_ids;
5d7a33f @vincentisambart when there are multiple returns in an ensure,
vincentisambart authored
133 PHINode *ensure_pn;
bb0b28c moving to LLVM r82747
Laurent Sansonetti authored
134 RoxorScope *current_scope;
cb65416 the great schism, part I
Laurent Sansonetti authored
135
136 Function *dispatcherFunc;
38456a4 most fast ops in place
Laurent Sansonetti authored
137 Function *fastPlusFunc;
138 Function *fastMinusFunc;
139 Function *fastMultFunc;
140 Function *fastDivFunc;
141 Function *fastLtFunc;
142 Function *fastLeFunc;
143 Function *fastGtFunc;
144 Function *fastGeFunc;
944d624 optimize #== and #!= for non fixnum/float types
Laurent Sansonetti authored
145 Function *fastEqFunc;
146 Function *fastNeqFunc;
cb65416 the great schism, part I
Laurent Sansonetti authored
147 Function *fastEqqFunc;
148 Function *whenSplatFunc;
149 Function *prepareBlockFunc;
150 Function *pushBindingFunc;
151 Function *getBlockFunc;
152 Function *currentBlockObjectFunc;
153 Function *getConstFunc;
154 Function *setConstFunc;
155 Function *prepareMethodFunc;
156 Function *singletonClassFunc;
157 Function *defineClassFunc;
158 Function *prepareIvarSlotFunc;
159 Function *getIvarFunc;
160 Function *setIvarFunc;
161 Function *definedFunc;
162 Function *undefFunc;
163 Function *aliasFunc;
164 Function *valiasFunc;
165 Function *newHashFunc;
166 Function *toAFunc;
167 Function *toAryFunc;
168 Function *catArrayFunc;
169 Function *dupArrayFunc;
170 Function *newArrayFunc;
171 Function *newStructFunc;
172 Function *newOpaqueFunc;
ff75d60 added support for overwriting an ObjC method that accepts a pointer
Laurent Sansonetti authored
173 Function *newPointerFunc;
cb65416 the great schism, part I
Laurent Sansonetti authored
174 Function *getStructFieldsFunc;
175 Function *getOpaqueDataFunc;
176 Function *getPointerPtrFunc;
177 Function *checkArityFunc;
178 Function *setStructFunc;
179 Function *newRangeFunc;
180 Function *newRegexpFunc;
181 Function *strInternFunc;
182 Function *keepVarsFunc;
183 Function *masgnGetElemBeforeSplatFunc;
184 Function *masgnGetElemAfterSplatFunc;
185 Function *masgnGetSplatFunc;
186 Function *newStringFunc;
913687b fixed a bug in the way we compile literal strings
Laurent Sansonetti authored
187 Function *newString2Func;
188 Function *newString3Func;
cb65416 the great schism, part I
Laurent Sansonetti authored
189 Function *yieldFunc;
7da28cb make sure break makes yield return from its scope
Laurent Sansonetti authored
190 Function *getBrokenFunc;
208a965 a quick implementation for #define_method (not yet 100% complete)
Laurent Sansonetti authored
191 Function *blockEvalFunc;
cb65416 the great schism, part I
Laurent Sansonetti authored
192 Function *gvarSetFunc;
193 Function *gvarGetFunc;
194 Function *cvarSetFunc;
195 Function *cvarGetFunc;
196 Function *currentExceptionFunc;
197 Function *popExceptionFunc;
198 Function *getSpecialFunc;
199 Function *breakFunc;
6c5b476 a new implementation for return-from-block which uses an exception in…
Laurent Sansonetti authored
200 Function *returnFromBlockFunc;
3432fd1 a better exception-based implementation for return-from-block
Laurent Sansonetti authored
201 Function *checkReturnFromBlockFunc;
cb65416 the great schism, part I
Laurent Sansonetti authored
202 Function *longjmpFunc;
203 Function *setjmpFunc;
9590d40 fixing and adding several missing ruby method features
Laurent Sansonetti authored
204 Function *setScopeFunc;
205 Function *setCurrentClassFunc;
77f9768 implemented super from a block
Laurent Sansonetti authored
206 Function *getCacheFunc;
cb65416 the great schism, part I
Laurent Sansonetti authored
207
208 Constant *zeroVal;
209 Constant *oneVal;
210 Constant *twoVal;
01528a7 floating point arithmetic optimization: Float objects are now immedia…
Laurent Sansonetti authored
211 Constant *threeVal;
cb65416 the great schism, part I
Laurent Sansonetti authored
212 Constant *nilVal;
213 Constant *trueVal;
214 Constant *falseVal;
215 Constant *undefVal;
216 Constant *splatArgFollowsVal;
9590d40 fixing and adding several missing ruby method features
Laurent Sansonetti authored
217 Constant *defaultScope;
218 Constant *publicScope;
bb0b28c moving to LLVM r82747
Laurent Sansonetti authored
219
220 const Type *VoidTy;
221 const Type *Int1Ty;
222 const Type *Int8Ty;
223 const Type *Int16Ty;
224 const Type *Int32Ty;
225 const Type *Int64Ty;
226 const Type *FloatTy;
227 const Type *DoubleTy;
cb65416 the great schism, part I
Laurent Sansonetti authored
228 const Type *RubyObjTy;
f61f2c7 @vincentisambart const pointers should be real constants
vincentisambart authored
229 const PointerType *RubyObjPtrTy;
230 const PointerType *RubyObjPtrPtrTy;
231 const PointerType *PtrTy;
232 const PointerType *PtrPtrTy;
cb65416 the great schism, part I
Laurent Sansonetti authored
233 const Type *IntTy;
f61f2c7 @vincentisambart const pointers should be real constants
vincentisambart authored
234 const PointerType *Int32PtrTy;
cb65416 the great schism, part I
Laurent Sansonetti authored
235
236 void compile_node_error(const char *msg, NODE *node);
237
f61f2c7 @vincentisambart const pointers should be real constants
vincentisambart authored
238 virtual Constant *
239 compile_const_pointer(void *ptr, const PointerType *type=NULL) {
85b7cc2 AOT compiler: ivar slots support
Laurent Sansonetti authored
240 if (type == NULL) {
241 type = PtrTy;
242 }
f61f2c7 @vincentisambart const pointers should be real constants
vincentisambart authored
243 if (ptr == NULL) {
244 return ConstantPointerNull::get(type);
245 }
246 else {
247 Constant *ptrint = ConstantInt::get(IntTy, (long)ptr);
248 return ConstantExpr::getIntToPtr(ptrint, type);
249 }
cb65416 the great schism, part I
Laurent Sansonetti authored
250 }
251
f61f2c7 @vincentisambart const pointers should be real constants
vincentisambart authored
252 Constant *
253 compile_const_pointer_to_pointer(void *ptr) {
254 return compile_const_pointer(ptr, PtrPtrTy);
cb65416 the great schism, part I
Laurent Sansonetti authored
255 }
256
c80c60a in the objc->ruby 32-bit stub convert ruby exceptions to objc
Laurent Sansonetti authored
257 Instruction *compile_protected_call(Value *imp,
cb65416 the great schism, part I
Laurent Sansonetti authored
258 std::vector<Value *> &params);
259 void compile_dispatch_arguments(NODE *args,
260 std::vector<Value *> &arguments, int *pargc);
261 Function::ArgumentListType::iterator compile_optional_arguments(
262 Function::ArgumentListType::iterator iter, NODE *node);
263 void compile_boolean_test(Value *condVal, BasicBlock *ifTrueBB,
264 BasicBlock *ifFalseBB);
265 void compile_when_arguments(NODE *args, Value *comparedToVal,
266 BasicBlock *thenBB);
267 void compile_single_when_argument(NODE *arg, Value *comparedToVal,
268 BasicBlock *thenBB);
12a1d67 fixing bugs in instance_eval & friends + fixed some specs so that the…
Laurent Sansonetti authored
269 virtual void compile_prepare_method(Value *classVal, Value *sel,
270 bool singleton, Function *new_function, rb_vm_arity_t &arity,
9590d40 fixing and adding several missing ruby method features
Laurent Sansonetti authored
271 NODE *body);
cb65416 the great schism, part I
Laurent Sansonetti authored
272 Value *compile_dispatch_call(std::vector<Value *> &params);
273 Value *compile_when_splat(Value *comparedToVal, Value *splatVal);
944d624 optimize #== and #!= for non fixnum/float types
Laurent Sansonetti authored
274 Value *compile_fast_op_call(SEL sel, Value *selfVal, Value *comparedToVal);
cb65416 the great schism, part I
Laurent Sansonetti authored
275 Value *compile_attribute_assign(NODE *node, Value *extra_val);
2c54dbd AOT compiler: added support for blocks
Laurent Sansonetti authored
276 virtual Value *compile_prepare_block_args(Function *func, int *flags);
277 Value *compile_block_create(NODE *node);
cb65416 the great schism, part I
Laurent Sansonetti authored
278 Value *compile_binding(void);
279 Value *compile_optimized_dispatch_call(SEL sel, int argc,
280 std::vector<Value *> &params);
281 Value *compile_ivar_read(ID vid);
282 Value *compile_ivar_assignment(ID vid, Value *val);
283 Value *compile_cvar_assignment(ID vid, Value *val);
eeb7a10 added support for @@foo||=42, a lot of changes for a very stupid func…
Laurent Sansonetti authored
284 Value *compile_cvar_get(ID vid, bool check);
42e4a2a AOT compiler: added support for global variables
Laurent Sansonetti authored
285 Value *compile_gvar_assignment(NODE *node, Value *val);
cb65416 the great schism, part I
Laurent Sansonetti authored
286 Value *compile_constant_declaration(NODE *node, Value *val);
287 Value *compile_multiple_assignment(NODE *node, Value *val);
288 void compile_multiple_assignment_element(NODE *node, Value *val);
289 Value *compile_current_class(void);
57d8085 AOT compiler: added support for NSObject and ID compilation
Laurent Sansonetti authored
290 virtual Value *compile_nsobject(void);
78b1e93 added support for AOT compilation of the rb_eStandardError constant
Laurent Sansonetti authored
291 virtual Value *compile_standarderror(void);
aca37ff fixed const lookup inside a module defined under an explicit (using :…
Laurent Sansonetti authored
292 Value *compile_class_path(NODE *node, bool *outer);
cb65416 the great schism, part I
Laurent Sansonetti authored
293 Value *compile_const(ID id, Value *outer);
294 Value *compile_singleton_class(Value *obj);
295 Value *compile_defined_expression(NODE *node);
296 Value *compile_dstr(NODE *node);
297 Value *compile_dvar_slot(ID name);
298 void compile_break_val(Value *val);
e8d79c7 @vincentisambart a return in an ensure should now work properly
vincentisambart authored
299 void compile_simple_return(Value *val);
3432fd1 a better exception-based implementation for return-from-block
Laurent Sansonetti authored
300 void compile_return_from_block(Value *val, int id);
301 void compile_return_from_block_handler(int id);
cb65416 the great schism, part I
Laurent Sansonetti authored
302 Value *compile_jump(NODE *node);
303 virtual Value *compile_mcache(SEL sel, bool super);
77f9768 implemented super from a block
Laurent Sansonetti authored
304 Value *compile_get_mcache(Value *sel, bool super);
cb65416 the great schism, part I
Laurent Sansonetti authored
305 virtual Value *compile_ccache(ID id);
f61f2c7 @vincentisambart const pointers should be real constants
vincentisambart authored
306 virtual Value *compile_sel(SEL sel, bool add_to_bb=true) {
307 return compile_const_pointer(sel, PtrTy);
cb65416 the great schism, part I
Laurent Sansonetti authored
308 }
57d8085 AOT compiler: added support for NSObject and ID compilation
Laurent Sansonetti authored
309 virtual Value *compile_id(ID id);
913687b fixed a bug in the way we compile literal strings
Laurent Sansonetti authored
310 GlobalVariable *compile_const_global_string(const char *str,
311 const size_t str_len);
312 GlobalVariable *compile_const_global_string(const char *str) {
313 return compile_const_global_string(str, strlen(str));
314 }
e379686 some work on unicode support (still in progress)
Laurent Sansonetti authored
315 GlobalVariable *compile_const_global_ustring(const UniChar *str,
316 const size_t str_len, CFHashCode hash);
317
2c54dbd AOT compiler: added support for blocks
Laurent Sansonetti authored
318 Value *compile_arity(rb_vm_arity_t &arity);
95f3b23 added support for AOT compilation of literal ranges
Laurent Sansonetti authored
319 Instruction *compile_range(Value *beg, Value *end, bool exclude_end,
14423f1 fixed AOT compilation of literal ranges (objects should be retained)
Laurent Sansonetti authored
320 bool retain=false, bool add_to_bb=true);
913687b fixed a bug in the way we compile literal strings
Laurent Sansonetti authored
321 Value *compile_literal(VALUE val);
907bd81 AOT compiler: added support for some immutable literals
Laurent Sansonetti authored
322 virtual Value *compile_immutable_literal(VALUE val);
42e4a2a AOT compiler: added support for global variables
Laurent Sansonetti authored
323 virtual Value *compile_global_entry(NODE *node);
cb65416 the great schism, part I
Laurent Sansonetti authored
324
9590d40 fixing and adding several missing ruby method features
Laurent Sansonetti authored
325 void compile_set_current_scope(Value *klass, Value *scope);
326 Value *compile_set_current_class(Value *klass);
327
3432fd1 a better exception-based implementation for return-from-block
Laurent Sansonetti authored
328 Value *compile_landing_pad_header(void);
329 Value *compile_landing_pad_header(const std::type_info &eh_type);
6c5b476 a new implementation for return-from-block which uses an exception in…
Laurent Sansonetti authored
330 void compile_landing_pad_footer(bool pop_exception=true);
c80c60a in the objc->ruby 32-bit stub convert ruby exceptions to objc
Laurent Sansonetti authored
331 Value *compile_current_exception(void);
cb65416 the great schism, part I
Laurent Sansonetti authored
332 void compile_rethrow_exception(void);
333 void compile_pop_exception(void);
334 Value *compile_lvar_slot(ID name);
335 bool compile_lvars(ID *tbl);
336 Value *compile_new_struct(Value *klass, std::vector<Value *> &fields);
337 Value *compile_new_opaque(Value *klass, Value *val);
ff75d60 added support for overwriting an ObjC method that accepts a pointer
Laurent Sansonetti authored
338 Value *compile_new_pointer(const char *type, Value *val);
cb65416 the great schism, part I
Laurent Sansonetti authored
339 void compile_get_struct_fields(Value *val, Value *buf,
340 rb_vm_bs_boxed_t *bs_boxed);
341 Value *compile_get_opaque_data(Value *val, rb_vm_bs_boxed_t *bs_boxed,
342 Value *slot);
343 Value *compile_get_cptr(Value *val, const char *type, Value *slot);
344 void compile_check_arity(Value *given, Value *requested);
345 void compile_set_struct(Value *rcv, int field, Value *val);
346
347 Value *compile_conversion_to_c(const char *type, Value *val,
348 Value *slot);
349 Value *compile_conversion_to_ruby(const char *type,
350 const Type *llvm_type, Value *val);
351
f61f2c7 @vincentisambart const pointers should be real constants
vincentisambart authored
352 Value *compile_slot_cache(ID id);
353 virtual Value *gen_slot_cache(ID id);
cb65416 the great schism, part I
Laurent Sansonetti authored
354 ICmpInst *is_value_a_fixnum(Value *val);
355 void compile_ivar_slots(Value *klass, BasicBlock::InstListType &list,
356 BasicBlock::InstListType::iterator iter);
357 bool unbox_ruby_constant(Value *val, VALUE *rval);
01528a7 floating point arithmetic optimization: Float objects are now immedia…
Laurent Sansonetti authored
358 Value *optimized_immediate_op(SEL sel, Value *leftVal, Value *rightVal,
359 bool float_op, bool *is_predicate);
360 Value *compile_double_coercion(Value *val, Value *mask,
361 BasicBlock *fallback_bb, Function *f);
2a1240c @vincentisambart some refactoring
vincentisambart authored
362 void compile_keep_vars(BasicBlock *startBB, BasicBlock *mergeBB);
01528a7 floating point arithmetic optimization: Float objects are now immedia…
Laurent Sansonetti authored
363
cb65416 the great schism, part I
Laurent Sansonetti authored
364 SEL mid_to_sel(ID mid, int arity);
365 };
366
bb0b28c moving to LLVM r82747
Laurent Sansonetti authored
367 #define context (RoxorCompiler::module->getContext())
368
cb65416 the great schism, part I
Laurent Sansonetti authored
369 class RoxorAOTCompiler : public RoxorCompiler {
370 public:
3432fd1 a better exception-based implementation for return-from-block
Laurent Sansonetti authored
371 RoxorAOTCompiler(void);
cb65416 the great schism, part I
Laurent Sansonetti authored
372
373 Function *compile_main_function(NODE *node);
374
375 private:
376 std::map<SEL, GlobalVariable *> mcaches;
377 std::map<ID, GlobalVariable *> ccaches;
378 std::map<SEL, GlobalVariable *> sels;
57d8085 AOT compiler: added support for NSObject and ID compilation
Laurent Sansonetti authored
379 std::map<ID, GlobalVariable *> ids;
42e4a2a AOT compiler: added support for global variables
Laurent Sansonetti authored
380 std::map<ID, GlobalVariable *> global_entries;
85b7cc2 AOT compiler: ivar slots support
Laurent Sansonetti authored
381 std::vector<GlobalVariable *> ivar_slots;
907bd81 AOT compiler: added support for some immutable literals
Laurent Sansonetti authored
382 std::map<VALUE, GlobalVariable *> literals;
383
57d8085 AOT compiler: added support for NSObject and ID compilation
Laurent Sansonetti authored
384 GlobalVariable *cObject_gvar;
78b1e93 added support for AOT compilation of the rb_eStandardError constant
Laurent Sansonetti authored
385 GlobalVariable *cStandardError_gvar;
386 std::vector<GlobalVariable *> class_gvars;
cb65416 the great schism, part I
Laurent Sansonetti authored
387
388 Value *compile_mcache(SEL sel, bool super);
389 Value *compile_ccache(ID id);
f61f2c7 @vincentisambart const pointers should be real constants
vincentisambart authored
390 Value *compile_sel(SEL sel, bool add_to_bb=true);
12a1d67 fixing bugs in instance_eval & friends + fixed some specs so that the…
Laurent Sansonetti authored
391 void compile_prepare_method(Value *classVal, Value *sel,
392 bool singleton, Function *new_function, rb_vm_arity_t &arity,
9590d40 fixing and adding several missing ruby method features
Laurent Sansonetti authored
393 NODE *body);
2c54dbd AOT compiler: added support for blocks
Laurent Sansonetti authored
394 Value *compile_prepare_block_args(Function *func, int *flags);
57d8085 AOT compiler: added support for NSObject and ID compilation
Laurent Sansonetti authored
395 Value *compile_nsobject(void);
78b1e93 added support for AOT compilation of the rb_eStandardError constant
Laurent Sansonetti authored
396 Value *compile_standarderror(void);
57d8085 AOT compiler: added support for NSObject and ID compilation
Laurent Sansonetti authored
397 Value *compile_id(ID id);
907bd81 AOT compiler: added support for some immutable literals
Laurent Sansonetti authored
398 Value *compile_immutable_literal(VALUE val);
42e4a2a AOT compiler: added support for global variables
Laurent Sansonetti authored
399 Value *compile_global_entry(NODE *node);
cb65416 the great schism, part I
Laurent Sansonetti authored
400
f61f2c7 @vincentisambart const pointers should be real constants
vincentisambart authored
401 Value *gen_slot_cache(ID id);
85b7cc2 AOT compiler: ivar slots support
Laurent Sansonetti authored
402
f61f2c7 @vincentisambart const pointers should be real constants
vincentisambart authored
403 Constant *
404 compile_const_pointer(void *ptr, const PointerType *type=NULL) {
cb65416 the great schism, part I
Laurent Sansonetti authored
405 if (ptr == NULL) {
f61f2c7 @vincentisambart const pointers should be real constants
vincentisambart authored
406 return RoxorCompiler::compile_const_pointer(ptr, type);
cb65416 the great schism, part I
Laurent Sansonetti authored
407 }
408 printf("compile_const_pointer() called with a non-NULL pointer " \
409 "on the AOT compiler - leaving the ship!\n");
410 abort();
411 }
412 };
413
414 #endif /* __cplusplus */
415
416 #endif /* __COMPILER_H_ */
Something went wrong with that request. Please try again.