1/*
2 * Copyright (C) 2011 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#ifndef LLIntSlowPaths_h
27#define LLIntSlowPaths_h
28
29#include <wtf/Platform.h>
30#include <wtf/StdLibExtras.h>
31
32#if ENABLE(LLINT)
33
34namespace JSC {
35
36class ExecState;
37struct Instruction;
38
39namespace LLInt {
40
41#if USE(JSVALUE64)
42// According to C++ rules, a type used for the return signature of function with C linkage (i.e.
43// 'extern "C"') needs to be POD; hence putting any constructors into it could cause either compiler
44// warnings, or worse, a change in the ABI used to return these types.
45struct SlowPathReturnType {
46    void* a;
47    ExecState* b;
48};
49
50inline SlowPathReturnType encodeResult(void* a, ExecState* b)
51{
52    SlowPathReturnType result;
53    result.a = a;
54    result.b = b;
55    return result;
56}
57
58inline void decodeResult(SlowPathReturnType result, void*& a, ExecState*& b)
59{
60    a = result.a;
61    b = result.b;
62}
63
64#else // USE(JSVALUE32_64)
65typedef int64_t SlowPathReturnType;
66
67typedef union {
68    struct {
69        void* a;
70        ExecState* b;
71    } pair;
72    int64_t i;
73} SlowPathReturnTypeEncoding;
74
75inline SlowPathReturnType encodeResult(void* a, ExecState* b)
76{
77    SlowPathReturnTypeEncoding u;
78    u.pair.a = a;
79    u.pair.b = b;
80    return u.i;
81}
82
83inline void decodeResult(SlowPathReturnType result, void*& a, ExecState*& b)
84{
85    SlowPathReturnTypeEncoding u;
86    u.i = result;
87    a = u.pair.a;
88    b = u.pair.b;
89}
90#endif // USE(JSVALUE32_64)
91
92extern "C" SlowPathReturnType llint_trace_operand(ExecState*, Instruction*, int fromWhere, int operand);
93extern "C" SlowPathReturnType llint_trace_value(ExecState*, Instruction*, int fromWhere, int operand);
94
95#define LLINT_SLOW_PATH_DECL(name) \
96    extern "C" SlowPathReturnType llint_##name(ExecState* exec, Instruction* pc)
97
98#define LLINT_SLOW_PATH_HIDDEN_DECL(name) \
99    LLINT_SLOW_PATH_DECL(name) WTF_INTERNAL
100
101LLINT_SLOW_PATH_HIDDEN_DECL(trace_prologue);
102LLINT_SLOW_PATH_HIDDEN_DECL(trace_prologue_function_for_call);
103LLINT_SLOW_PATH_HIDDEN_DECL(trace_prologue_function_for_construct);
104LLINT_SLOW_PATH_HIDDEN_DECL(trace_arityCheck_for_call);
105LLINT_SLOW_PATH_HIDDEN_DECL(trace_arityCheck_for_construct);
106LLINT_SLOW_PATH_HIDDEN_DECL(trace);
107LLINT_SLOW_PATH_HIDDEN_DECL(special_trace);
108LLINT_SLOW_PATH_HIDDEN_DECL(entry_osr);
109LLINT_SLOW_PATH_HIDDEN_DECL(entry_osr_function_for_call);
110LLINT_SLOW_PATH_HIDDEN_DECL(entry_osr_function_for_construct);
111LLINT_SLOW_PATH_HIDDEN_DECL(entry_osr_function_for_call_arityCheck);
112LLINT_SLOW_PATH_HIDDEN_DECL(entry_osr_function_for_construct_arityCheck);
113LLINT_SLOW_PATH_HIDDEN_DECL(loop_osr);
114LLINT_SLOW_PATH_HIDDEN_DECL(replace);
115LLINT_SLOW_PATH_HIDDEN_DECL(stack_check);
116LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_call_arityCheck);
117LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_construct_arityCheck);
118LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_create_activation);
119LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_create_arguments);
120LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_create_this);
121LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_convert_this);
122LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_new_object);
123LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_new_array);
124LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_new_array_with_size);
125LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_new_array_buffer);
126LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_new_regexp);
127LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_not);
128LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_eq);
129LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_neq);
130LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_stricteq);
131LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_nstricteq);
132LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_less);
133LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_lesseq);
134LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_greater);
135LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_greatereq);
136LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_pre_inc);
137LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_pre_dec);
138LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_to_number);
139LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_negate);
140LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_add);
141LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_mul);
142LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_sub);
143LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_div);
144LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_mod);
145LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_lshift);
146LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_rshift);
147LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_urshift);
148LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_bitand);
149LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_bitor);
150LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_bitxor);
151LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_check_has_instance);
152LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_instanceof);
153LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_typeof);
154LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_is_object);
155LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_is_function);
156LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_in);
157LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_resolve);
158LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_put_to_base);
159LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_resolve_base);
160LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_resolve_with_base);
161LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_resolve_with_this);
162LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_init_global_const_check);
163LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_get_by_id);
164LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_get_arguments_length);
165LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_put_by_id);
166LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_del_by_id);
167LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_get_by_val);
168LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_get_argument_by_val);
169LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_get_by_pname);
170LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_put_by_val);
171LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_del_by_val);
172LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_put_by_index);
173LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_put_getter_setter);
174LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jtrue);
175LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jfalse);
176LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jless);
177LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jnless);
178LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jgreater);
179LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jngreater);
180LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jlesseq);
181LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jnlesseq);
182LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jgreatereq);
183LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jngreatereq);
184LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_switch_imm);
185LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_switch_char);
186LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_switch_string);
187LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_new_func);
188LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_new_func_exp);
189LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_call);
190LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_construct);
191LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_call_varargs);
192LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_call_eval);
193LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_tear_off_activation);
194LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_tear_off_arguments);
195LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_strcat);
196LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_to_primitive);
197LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_get_pnames);
198LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_next_pname);
199LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_push_with_scope);
200LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_pop_scope);
201LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_push_name_scope);
202LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_throw);
203LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_throw_static_error);
204LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_handle_watchdog_timer);
205LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_debug);
206LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_profile_will_call);
207LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_profile_did_call);
208LLINT_SLOW_PATH_HIDDEN_DECL(throw_from_native_call);
209
210} } // namespace JSC::LLInt
211
212#endif // ENABLE(LLINT)
213
214#endif // LLIntSlowPaths_h
215
216