blob: 13a4b8027f27ca8ab6be64e57664cf6db86e3a30 [file] [log] [blame]
Ben Murdoch257744e2011-11-30 15:57:28 +00001// Copyright 2011 the V8 project authors. All rights reserved.
Ben Murdochb8a8cc12014-11-26 15:28:44 +00002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
Steve Blocka7e24c12009-10-30 11:49:00 +00004
5#ifndef V8_BUILTINS_H_
6#define V8_BUILTINS_H_
7
8namespace v8 {
9namespace internal {
10
Leon Clarkee46be812010-01-19 14:06:41 +000011// Specifies extra arguments required by a C++ builtin.
12enum BuiltinExtraArguments {
13 NO_EXTRA_ARGUMENTS = 0,
14 NEEDS_CALLED_FUNCTION = 1
15};
16
17
Ben Murdochb8a8cc12014-11-26 15:28:44 +000018#define CODE_AGE_LIST_WITH_ARG(V, A) \
19 V(Quadragenarian, A) \
20 V(Quinquagenarian, A) \
21 V(Sexagenarian, A) \
22 V(Septuagenarian, A) \
23 V(Octogenarian, A)
24
25#define CODE_AGE_LIST_IGNORE_ARG(X, V) V(X)
26
27#define CODE_AGE_LIST(V) \
28 CODE_AGE_LIST_WITH_ARG(CODE_AGE_LIST_IGNORE_ARG, V)
29
30#define CODE_AGE_LIST_COMPLETE(V) \
31 V(NotExecuted) \
32 V(ExecutedOnce) \
33 V(NoAge) \
34 CODE_AGE_LIST_WITH_ARG(CODE_AGE_LIST_IGNORE_ARG, V)
35
36#define DECLARE_CODE_AGE_BUILTIN(C, V) \
37 V(Make##C##CodeYoungAgainOddMarking, BUILTIN, \
38 UNINITIALIZED, kNoExtraICState) \
39 V(Make##C##CodeYoungAgainEvenMarking, BUILTIN, \
40 UNINITIALIZED, kNoExtraICState)
41
42
Leon Clarkee46be812010-01-19 14:06:41 +000043// Define list of builtins implemented in C++.
44#define BUILTIN_LIST_C(V) \
45 V(Illegal, NO_EXTRA_ARGUMENTS) \
46 \
47 V(EmptyFunction, NO_EXTRA_ARGUMENTS) \
48 \
Leon Clarkee46be812010-01-19 14:06:41 +000049 V(ArrayPush, NO_EXTRA_ARGUMENTS) \
50 V(ArrayPop, NO_EXTRA_ARGUMENTS) \
Andrei Popescu402d9372010-02-26 13:31:12 +000051 V(ArrayShift, NO_EXTRA_ARGUMENTS) \
52 V(ArrayUnshift, NO_EXTRA_ARGUMENTS) \
53 V(ArraySlice, NO_EXTRA_ARGUMENTS) \
54 V(ArraySplice, NO_EXTRA_ARGUMENTS) \
Steve Block6ded16b2010-05-10 14:33:55 +010055 V(ArrayConcat, NO_EXTRA_ARGUMENTS) \
Leon Clarkee46be812010-01-19 14:06:41 +000056 \
57 V(HandleApiCall, NEEDS_CALLED_FUNCTION) \
58 V(HandleApiCallConstruct, NEEDS_CALLED_FUNCTION) \
59 V(HandleApiCallAsFunction, NO_EXTRA_ARGUMENTS) \
Steve Block44f0eee2011-05-26 01:26:41 +010060 V(HandleApiCallAsConstructor, NO_EXTRA_ARGUMENTS) \
61 \
Ben Murdochb8a8cc12014-11-26 15:28:44 +000062 V(StrictModePoisonPill, NO_EXTRA_ARGUMENTS) \
63 V(GeneratorPoisonPill, NO_EXTRA_ARGUMENTS)
Steve Blocka7e24c12009-10-30 11:49:00 +000064
65// Define list of builtins implemented in assembly.
Ben Murdochb8a8cc12014-11-26 15:28:44 +000066#define BUILTIN_LIST_A(V) \
67 V(ArgumentsAdaptorTrampoline, BUILTIN, UNINITIALIZED, kNoExtraICState) \
68 V(InOptimizationQueue, BUILTIN, UNINITIALIZED, kNoExtraICState) \
69 V(JSConstructStubGeneric, BUILTIN, UNINITIALIZED, kNoExtraICState) \
70 V(JSConstructStubApi, BUILTIN, UNINITIALIZED, kNoExtraICState) \
71 V(JSEntryTrampoline, BUILTIN, UNINITIALIZED, kNoExtraICState) \
72 V(JSConstructEntryTrampoline, BUILTIN, UNINITIALIZED, kNoExtraICState) \
73 V(CompileLazy, BUILTIN, UNINITIALIZED, kNoExtraICState) \
74 V(CompileOptimized, BUILTIN, UNINITIALIZED, kNoExtraICState) \
75 V(CompileOptimizedConcurrent, BUILTIN, UNINITIALIZED, kNoExtraICState) \
76 V(NotifyDeoptimized, BUILTIN, UNINITIALIZED, kNoExtraICState) \
77 V(NotifySoftDeoptimized, BUILTIN, UNINITIALIZED, kNoExtraICState) \
78 V(NotifyLazyDeoptimized, BUILTIN, UNINITIALIZED, kNoExtraICState) \
79 V(NotifyStubFailure, BUILTIN, UNINITIALIZED, kNoExtraICState) \
80 V(NotifyStubFailureSaveDoubles, BUILTIN, UNINITIALIZED, kNoExtraICState) \
81 \
82 V(LoadIC_Miss, BUILTIN, UNINITIALIZED, kNoExtraICState) \
83 V(KeyedLoadIC_Miss, BUILTIN, UNINITIALIZED, kNoExtraICState) \
84 V(StoreIC_Miss, BUILTIN, UNINITIALIZED, kNoExtraICState) \
85 V(KeyedStoreIC_Miss, BUILTIN, UNINITIALIZED, kNoExtraICState) \
86 V(LoadIC_Getter_ForDeopt, LOAD_IC, MONOMORPHIC, kNoExtraICState) \
87 V(KeyedLoadIC_Initialize, KEYED_LOAD_IC, UNINITIALIZED, kNoExtraICState) \
88 V(KeyedLoadIC_PreMonomorphic, KEYED_LOAD_IC, PREMONOMORPHIC, \
89 kNoExtraICState) \
90 V(KeyedLoadIC_Generic, KEYED_LOAD_IC, GENERIC, kNoExtraICState) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +000091 \
92 V(StoreIC_Setter_ForDeopt, STORE_IC, MONOMORPHIC, StoreIC::kStrictModeState) \
93 \
94 V(KeyedStoreIC_Initialize, KEYED_STORE_IC, UNINITIALIZED, kNoExtraICState) \
95 V(KeyedStoreIC_PreMonomorphic, KEYED_STORE_IC, PREMONOMORPHIC, \
96 kNoExtraICState) \
Emily Bernierd0a1eb72015-03-24 16:35:39 -040097 V(KeyedStoreIC_Megamorphic, KEYED_STORE_IC, MEGAMORPHIC, kNoExtraICState) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +000098 V(KeyedStoreIC_Generic, KEYED_STORE_IC, GENERIC, kNoExtraICState) \
99 \
100 V(KeyedStoreIC_Initialize_Strict, KEYED_STORE_IC, UNINITIALIZED, \
101 StoreIC::kStrictModeState) \
102 V(KeyedStoreIC_PreMonomorphic_Strict, KEYED_STORE_IC, PREMONOMORPHIC, \
103 StoreIC::kStrictModeState) \
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400104 V(KeyedStoreIC_Megamorphic_Strict, KEYED_STORE_IC, MEGAMORPHIC, \
105 StoreIC::kStrictModeState) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000106 V(KeyedStoreIC_Generic_Strict, KEYED_STORE_IC, GENERIC, \
107 StoreIC::kStrictModeState) \
108 V(KeyedStoreIC_SloppyArguments, KEYED_STORE_IC, MONOMORPHIC, \
109 kNoExtraICState) \
110 \
111 /* Uses KeyedLoadIC_Initialize; must be after in list. */ \
112 V(FunctionCall, BUILTIN, UNINITIALIZED, kNoExtraICState) \
113 V(FunctionApply, BUILTIN, UNINITIALIZED, kNoExtraICState) \
114 \
115 V(InternalArrayCode, BUILTIN, UNINITIALIZED, kNoExtraICState) \
116 V(ArrayCode, BUILTIN, UNINITIALIZED, kNoExtraICState) \
117 \
118 V(StringConstructCode, BUILTIN, UNINITIALIZED, kNoExtraICState) \
119 \
120 V(OnStackReplacement, BUILTIN, UNINITIALIZED, kNoExtraICState) \
121 V(InterruptCheck, BUILTIN, UNINITIALIZED, kNoExtraICState) \
122 V(OsrAfterStackCheck, BUILTIN, UNINITIALIZED, kNoExtraICState) \
123 V(StackCheck, BUILTIN, UNINITIALIZED, kNoExtraICState) \
124 \
125 V(MarkCodeAsExecutedOnce, BUILTIN, UNINITIALIZED, kNoExtraICState) \
126 V(MarkCodeAsExecutedTwice, BUILTIN, UNINITIALIZED, kNoExtraICState) \
127 CODE_AGE_LIST_WITH_ARG(DECLARE_CODE_AGE_BUILTIN, V)
Kristian Monsen80d68ea2010-09-08 11:05:35 +0100128
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000129// Define list of builtin handlers implemented in assembly.
130#define BUILTIN_LIST_H(V) \
131 V(LoadIC_Slow, LOAD_IC) \
132 V(KeyedLoadIC_Slow, KEYED_LOAD_IC) \
133 V(StoreIC_Slow, STORE_IC) \
134 V(KeyedStoreIC_Slow, KEYED_STORE_IC) \
135 V(LoadIC_Normal, LOAD_IC) \
136 V(StoreIC_Normal, STORE_IC)
Steve Blocka7e24c12009-10-30 11:49:00 +0000137
Steve Blocka7e24c12009-10-30 11:49:00 +0000138// Define list of builtins used by the debugger implemented in assembly.
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000139#define BUILTIN_LIST_DEBUG_A(V) \
140 V(Return_DebugBreak, BUILTIN, DEBUG_STUB, \
141 DEBUG_BREAK) \
142 V(CallFunctionStub_DebugBreak, BUILTIN, DEBUG_STUB, \
143 DEBUG_BREAK) \
144 V(CallConstructStub_DebugBreak, BUILTIN, DEBUG_STUB, \
145 DEBUG_BREAK) \
146 V(CallConstructStub_Recording_DebugBreak, BUILTIN, DEBUG_STUB, \
147 DEBUG_BREAK) \
148 V(CallICStub_DebugBreak, CALL_IC, DEBUG_STUB, \
149 DEBUG_BREAK) \
150 V(LoadIC_DebugBreak, LOAD_IC, DEBUG_STUB, \
151 DEBUG_BREAK) \
152 V(KeyedLoadIC_DebugBreak, KEYED_LOAD_IC, DEBUG_STUB, \
153 DEBUG_BREAK) \
154 V(StoreIC_DebugBreak, STORE_IC, DEBUG_STUB, \
155 DEBUG_BREAK) \
156 V(KeyedStoreIC_DebugBreak, KEYED_STORE_IC, DEBUG_STUB, \
157 DEBUG_BREAK) \
158 V(CompareNilIC_DebugBreak, COMPARE_NIL_IC, DEBUG_STUB, \
159 DEBUG_BREAK) \
160 V(Slot_DebugBreak, BUILTIN, DEBUG_STUB, \
161 DEBUG_BREAK) \
162 V(PlainReturn_LiveEdit, BUILTIN, DEBUG_STUB, \
163 DEBUG_BREAK) \
164 V(FrameDropper_LiveEdit, BUILTIN, DEBUG_STUB, \
165 DEBUG_BREAK)
Steve Blocka7e24c12009-10-30 11:49:00 +0000166
167// Define list of builtins implemented in JavaScript.
168#define BUILTINS_LIST_JS(V) \
169 V(EQUALS, 1) \
170 V(STRICT_EQUALS, 1) \
171 V(COMPARE, 2) \
172 V(ADD, 1) \
173 V(SUB, 1) \
174 V(MUL, 1) \
175 V(DIV, 1) \
176 V(MOD, 1) \
177 V(BIT_OR, 1) \
178 V(BIT_AND, 1) \
179 V(BIT_XOR, 1) \
Steve Blocka7e24c12009-10-30 11:49:00 +0000180 V(SHL, 1) \
181 V(SAR, 1) \
182 V(SHR, 1) \
Ben Murdoche0cee9b2011-05-25 10:26:03 +0100183 V(DELETE, 2) \
Steve Blocka7e24c12009-10-30 11:49:00 +0000184 V(IN, 1) \
185 V(INSTANCE_OF, 1) \
Steve Blocka7e24c12009-10-30 11:49:00 +0000186 V(FILTER_KEY, 1) \
187 V(CALL_NON_FUNCTION, 0) \
188 V(CALL_NON_FUNCTION_AS_CONSTRUCTOR, 0) \
Ben Murdoch589d6972011-11-30 16:04:58 +0000189 V(CALL_FUNCTION_PROXY, 1) \
190 V(CALL_FUNCTION_PROXY_AS_CONSTRUCTOR, 1) \
Steve Blocka7e24c12009-10-30 11:49:00 +0000191 V(TO_OBJECT, 0) \
192 V(TO_NUMBER, 0) \
193 V(TO_STRING, 0) \
194 V(STRING_ADD_LEFT, 1) \
195 V(STRING_ADD_RIGHT, 1) \
196 V(APPLY_PREPARE, 1) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000197 V(STACK_OVERFLOW, 1)
Steve Blocka7e24c12009-10-30 11:49:00 +0000198
Steve Block44f0eee2011-05-26 01:26:41 +0100199class BuiltinFunctionTable;
Steve Blocka7e24c12009-10-30 11:49:00 +0000200class ObjectVisitor;
201
202
Steve Block44f0eee2011-05-26 01:26:41 +0100203class Builtins {
Steve Blocka7e24c12009-10-30 11:49:00 +0000204 public:
Steve Block44f0eee2011-05-26 01:26:41 +0100205 ~Builtins();
206
Steve Blocka7e24c12009-10-30 11:49:00 +0000207 // Generate all builtin code objects. Should be called once during
Steve Block44f0eee2011-05-26 01:26:41 +0100208 // isolate initialization.
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000209 void SetUp(Isolate* isolate, bool create_heap_objects);
Steve Block44f0eee2011-05-26 01:26:41 +0100210 void TearDown();
Steve Blocka7e24c12009-10-30 11:49:00 +0000211
212 // Garbage collection support.
Steve Block44f0eee2011-05-26 01:26:41 +0100213 void IterateBuiltins(ObjectVisitor* v);
Steve Blocka7e24c12009-10-30 11:49:00 +0000214
215 // Disassembler support.
Steve Block44f0eee2011-05-26 01:26:41 +0100216 const char* Lookup(byte* pc);
Steve Blocka7e24c12009-10-30 11:49:00 +0000217
218 enum Name {
Steve Block44f0eee2011-05-26 01:26:41 +0100219#define DEF_ENUM_C(name, ignore) k##name,
220#define DEF_ENUM_A(name, kind, state, extra) k##name,
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000221#define DEF_ENUM_H(name, kind) k##name,
Steve Blocka7e24c12009-10-30 11:49:00 +0000222 BUILTIN_LIST_C(DEF_ENUM_C)
223 BUILTIN_LIST_A(DEF_ENUM_A)
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000224 BUILTIN_LIST_H(DEF_ENUM_H)
Steve Blocka7e24c12009-10-30 11:49:00 +0000225 BUILTIN_LIST_DEBUG_A(DEF_ENUM_A)
226#undef DEF_ENUM_C
227#undef DEF_ENUM_A
228 builtin_count
229 };
230
231 enum CFunctionId {
Leon Clarkee46be812010-01-19 14:06:41 +0000232#define DEF_ENUM_C(name, ignore) c_##name,
Steve Blocka7e24c12009-10-30 11:49:00 +0000233 BUILTIN_LIST_C(DEF_ENUM_C)
234#undef DEF_ENUM_C
235 cfunction_count
236 };
237
238 enum JavaScript {
239#define DEF_ENUM(name, ignore) name,
240 BUILTINS_LIST_JS(DEF_ENUM)
241#undef DEF_ENUM
242 id_count
243 };
244
Steve Block44f0eee2011-05-26 01:26:41 +0100245#define DECLARE_BUILTIN_ACCESSOR_C(name, ignore) Handle<Code> name();
246#define DECLARE_BUILTIN_ACCESSOR_A(name, kind, state, extra) \
247 Handle<Code> name();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000248#define DECLARE_BUILTIN_ACCESSOR_H(name, kind) Handle<Code> name();
Steve Block44f0eee2011-05-26 01:26:41 +0100249 BUILTIN_LIST_C(DECLARE_BUILTIN_ACCESSOR_C)
250 BUILTIN_LIST_A(DECLARE_BUILTIN_ACCESSOR_A)
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000251 BUILTIN_LIST_H(DECLARE_BUILTIN_ACCESSOR_H)
Steve Block44f0eee2011-05-26 01:26:41 +0100252 BUILTIN_LIST_DEBUG_A(DECLARE_BUILTIN_ACCESSOR_A)
253#undef DECLARE_BUILTIN_ACCESSOR_C
254#undef DECLARE_BUILTIN_ACCESSOR_A
255
256 Code* builtin(Name name) {
Steve Blocka7e24c12009-10-30 11:49:00 +0000257 // Code::cast cannot be used here since we access builtins
258 // during the marking phase of mark sweep. See IC::Clear.
259 return reinterpret_cast<Code*>(builtins_[name]);
260 }
261
Steve Block44f0eee2011-05-26 01:26:41 +0100262 Address builtin_address(Name name) {
Steve Blocka7e24c12009-10-30 11:49:00 +0000263 return reinterpret_cast<Address>(&builtins_[name]);
264 }
265
266 static Address c_function_address(CFunctionId id) {
267 return c_functions_[id];
268 }
269
270 static const char* GetName(JavaScript id) { return javascript_names_[id]; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000271 const char* name(int index) {
272 DCHECK(index >= 0);
273 DCHECK(index < builtin_count);
274 return names_[index];
275 }
Steve Blocka7e24c12009-10-30 11:49:00 +0000276 static int GetArgumentsCount(JavaScript id) { return javascript_argc_[id]; }
Steve Block44f0eee2011-05-26 01:26:41 +0100277 Handle<Code> GetCode(JavaScript id, bool* resolved);
Steve Blocka7e24c12009-10-30 11:49:00 +0000278 static int NumberOfJavaScriptBuiltins() { return id_count; }
279
Steve Block44f0eee2011-05-26 01:26:41 +0100280 bool is_initialized() const { return initialized_; }
281
Steve Blocka7e24c12009-10-30 11:49:00 +0000282 private:
Steve Block44f0eee2011-05-26 01:26:41 +0100283 Builtins();
284
Steve Blocka7e24c12009-10-30 11:49:00 +0000285 // The external C++ functions called from the code.
Steve Block44f0eee2011-05-26 01:26:41 +0100286 static Address const c_functions_[cfunction_count];
Steve Blocka7e24c12009-10-30 11:49:00 +0000287
288 // Note: These are always Code objects, but to conform with
289 // IterateBuiltins() above which assumes Object**'s for the callback
290 // function f, we use an Object* array here.
Steve Block44f0eee2011-05-26 01:26:41 +0100291 Object* builtins_[builtin_count];
292 const char* names_[builtin_count];
293 static const char* const javascript_names_[id_count];
294 static int const javascript_argc_[id_count];
Steve Blocka7e24c12009-10-30 11:49:00 +0000295
Leon Clarkee46be812010-01-19 14:06:41 +0000296 static void Generate_Adaptor(MacroAssembler* masm,
297 CFunctionId id,
298 BuiltinExtraArguments extra_args);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000299 static void Generate_CompileLazy(MacroAssembler* masm);
300 static void Generate_InOptimizationQueue(MacroAssembler* masm);
301 static void Generate_CompileOptimized(MacroAssembler* masm);
302 static void Generate_CompileOptimizedConcurrent(MacroAssembler* masm);
Steve Blocka7e24c12009-10-30 11:49:00 +0000303 static void Generate_JSConstructStubGeneric(MacroAssembler* masm);
Leon Clarkee46be812010-01-19 14:06:41 +0000304 static void Generate_JSConstructStubApi(MacroAssembler* masm);
Steve Blocka7e24c12009-10-30 11:49:00 +0000305 static void Generate_JSEntryTrampoline(MacroAssembler* masm);
306 static void Generate_JSConstructEntryTrampoline(MacroAssembler* masm);
Ben Murdochb0fe1622011-05-05 13:52:32 +0100307 static void Generate_NotifyDeoptimized(MacroAssembler* masm);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000308 static void Generate_NotifySoftDeoptimized(MacroAssembler* masm);
Ben Murdochb0fe1622011-05-05 13:52:32 +0100309 static void Generate_NotifyLazyDeoptimized(MacroAssembler* masm);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000310 static void Generate_NotifyStubFailure(MacroAssembler* masm);
311 static void Generate_NotifyStubFailureSaveDoubles(MacroAssembler* masm);
Steve Blocka7e24c12009-10-30 11:49:00 +0000312 static void Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm);
313
314 static void Generate_FunctionCall(MacroAssembler* masm);
315 static void Generate_FunctionApply(MacroAssembler* masm);
316
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100317 static void Generate_InternalArrayCode(MacroAssembler* masm);
Steve Blocka7e24c12009-10-30 11:49:00 +0000318 static void Generate_ArrayCode(MacroAssembler* masm);
Kristian Monsen80d68ea2010-09-08 11:05:35 +0100319
320 static void Generate_StringConstructCode(MacroAssembler* masm);
Ben Murdochb0fe1622011-05-05 13:52:32 +0100321 static void Generate_OnStackReplacement(MacroAssembler* masm);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000322 static void Generate_OsrAfterStackCheck(MacroAssembler* masm);
323 static void Generate_InterruptCheck(MacroAssembler* masm);
324 static void Generate_StackCheck(MacroAssembler* masm);
325
326#define DECLARE_CODE_AGE_BUILTIN_GENERATOR(C) \
327 static void Generate_Make##C##CodeYoungAgainEvenMarking( \
328 MacroAssembler* masm); \
329 static void Generate_Make##C##CodeYoungAgainOddMarking( \
330 MacroAssembler* masm);
331 CODE_AGE_LIST(DECLARE_CODE_AGE_BUILTIN_GENERATOR)
332#undef DECLARE_CODE_AGE_BUILTIN_GENERATOR
333
334 static void Generate_MarkCodeAsExecutedOnce(MacroAssembler* masm);
335 static void Generate_MarkCodeAsExecutedTwice(MacroAssembler* masm);
Steve Block44f0eee2011-05-26 01:26:41 +0100336
337 static void InitBuiltinFunctionTable();
338
339 bool initialized_;
340
341 friend class BuiltinFunctionTable;
342 friend class Isolate;
343
344 DISALLOW_COPY_AND_ASSIGN(Builtins);
Steve Blocka7e24c12009-10-30 11:49:00 +0000345};
346
347} } // namespace v8::internal
348
349#endif // V8_BUILTINS_H_