1/*
2 * Copyright (C) 2008 Apple Inc. All rights reserved.
3 * Copyright (C) Research In Motion Limited 2010. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * 1.  Redistributions of source code must retain the above copyright
10 *     notice, this list of conditions and the following disclaimer.
11 * 2.  Redistributions in binary form must reproduce the above copyright
12 *     notice, this list of conditions and the following disclaimer in the
13 *     documentation and/or other materials provided with the distribution.
14 * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
15 *     its contributors may be used to endorse or promote products derived
16 *     from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
19 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
22 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30#ifndef JITStubs_h
31#define JITStubs_h
32
33#include "CallData.h"
34#include "MacroAssemblerCodeRef.h"
35#include "Register.h"
36#include "ThunkGenerators.h"
37#include <wtf/HashMap.h>
38
39#if ENABLE(JIT)
40
41namespace JSC {
42
43    struct StructureStubInfo;
44
45    class CodeBlock;
46    class ExecutablePool;
47    class FunctionExecutable;
48    class Identifier;
49    class JSGlobalData;
50    class JSGlobalObject;
51    class JSObject;
52    class JSPropertyNameIterator;
53    class JSValue;
54    class JSValueEncodedAsPointer;
55    class NativeExecutable;
56    class Profiler;
57    class PropertySlot;
58    class PutPropertySlot;
59    class RegisterFile;
60    class RegExp;
61
62    union JITStubArg {
63        void* asPointer;
64        EncodedJSValue asEncodedJSValue;
65        int32_t asInt32;
66
67        JSValue jsValue() { return JSValue::decode(asEncodedJSValue); }
68        JSObject* jsObject() { return static_cast<JSObject*>(asPointer); }
69        Identifier& identifier() { return *static_cast<Identifier*>(asPointer); }
70        int32_t int32() { return asInt32; }
71        CodeBlock* codeBlock() { return static_cast<CodeBlock*>(asPointer); }
72        FunctionExecutable* function() { return static_cast<FunctionExecutable*>(asPointer); }
73        RegExp* regExp() { return static_cast<RegExp*>(asPointer); }
74        JSPropertyNameIterator* propertyNameIterator() { return static_cast<JSPropertyNameIterator*>(asPointer); }
75        JSGlobalObject* globalObject() { return static_cast<JSGlobalObject*>(asPointer); }
76        JSString* jsString() { return static_cast<JSString*>(asPointer); }
77        ReturnAddressPtr returnAddress() { return ReturnAddressPtr(asPointer); }
78    };
79
80    struct TrampolineStructure {
81        MacroAssemblerCodePtr ctiStringLengthTrampoline;
82        MacroAssemblerCodePtr ctiVirtualCallLink;
83        MacroAssemblerCodePtr ctiVirtualConstructLink;
84        MacroAssemblerCodePtr ctiVirtualCall;
85        MacroAssemblerCodePtr ctiVirtualConstruct;
86        MacroAssemblerCodePtr ctiNativeCall;
87        MacroAssemblerCodePtr ctiNativeConstruct;
88        MacroAssemblerCodePtr ctiSoftModulo;
89    };
90
91#if CPU(X86_64)
92    struct JITStackFrame {
93        void* reserved; // Unused
94        JITStubArg args[6];
95        void* padding[2]; // Maintain 32-byte stack alignment (possibly overkill).
96
97        void* code;
98        RegisterFile* registerFile;
99        CallFrame* callFrame;
100        void* unused1;
101        Profiler** enabledProfilerReference;
102        JSGlobalData* globalData;
103
104        void* savedRBX;
105        void* savedR15;
106        void* savedR14;
107        void* savedR13;
108        void* savedR12;
109        void* savedRBP;
110        void* savedRIP;
111
112        // When JIT code makes a call, it pushes its return address just below the rest of the stack.
113        ReturnAddressPtr* returnAddressSlot() { return reinterpret_cast<ReturnAddressPtr*>(this) - 1; }
114    };
115#elif CPU(X86)
116#if COMPILER(MSVC) || (OS(WINDOWS) && COMPILER(GCC))
117#pragma pack(push)
118#pragma pack(4)
119#endif // COMPILER(MSVC) || (OS(WINDOWS) && COMPILER(GCC))
120    struct JITStackFrame {
121        void* reserved; // Unused
122        JITStubArg args[6];
123#if USE(JSVALUE32_64)
124        void* padding[2]; // Maintain 16-byte stack alignment.
125#endif
126
127        void* savedEBX;
128        void* savedEDI;
129        void* savedESI;
130        void* savedEBP;
131        void* savedEIP;
132
133        void* code;
134        RegisterFile* registerFile;
135        CallFrame* callFrame;
136        void* unused1;
137        Profiler** enabledProfilerReference;
138        JSGlobalData* globalData;
139
140        // When JIT code makes a call, it pushes its return address just below the rest of the stack.
141        ReturnAddressPtr* returnAddressSlot() { return reinterpret_cast<ReturnAddressPtr*>(this) - 1; }
142    };
143#if COMPILER(MSVC) || (OS(WINDOWS) && COMPILER(GCC))
144#pragma pack(pop)
145#endif // COMPILER(MSVC) || (OS(WINDOWS) && COMPILER(GCC))
146#elif CPU(ARM_THUMB2)
147    struct JITStackFrame {
148        JITStubArg reserved; // Unused
149        JITStubArg args[6];
150#if USE(JSVALUE64)
151        void* padding; // Maintain 16-byte stack alignment.
152#endif
153
154        ReturnAddressPtr thunkReturnAddress;
155
156        void* preservedReturnAddress;
157        void* preservedR4;
158        void* preservedR5;
159        void* preservedR6;
160
161        // These arguments passed in r1..r3 (r0 contained the entry code pointed, which is not preserved)
162        RegisterFile* registerFile;
163        CallFrame* callFrame;
164        void* unused1;
165
166        // These arguments passed on the stack.
167        Profiler** enabledProfilerReference;
168        JSGlobalData* globalData;
169
170        ReturnAddressPtr* returnAddressSlot() { return &thunkReturnAddress; }
171    };
172#elif CPU(ARM_TRADITIONAL)
173#if COMPILER(MSVC)
174#pragma pack(push)
175#pragma pack(4)
176#endif // COMPILER(MSVC)
177    struct JITStackFrame {
178        JITStubArg padding; // Unused
179        JITStubArg args[7];
180
181        ReturnAddressPtr thunkReturnAddress;
182
183        void* preservedR4;
184        void* preservedR5;
185        void* preservedR6;
186        void* preservedR7;
187        void* preservedR8;
188        void* preservedLink;
189
190        RegisterFile* registerFile;
191        CallFrame* callFrame;
192        void* unused1;
193
194        // These arguments passed on the stack.
195        Profiler** enabledProfilerReference;
196        JSGlobalData* globalData;
197
198        // When JIT code makes a call, it pushes its return address just below the rest of the stack.
199        ReturnAddressPtr* returnAddressSlot() { return &thunkReturnAddress; }
200    };
201#if COMPILER(MSVC)
202#pragma pack(pop)
203#endif // COMPILER(MSVC)
204#elif CPU(MIPS)
205    struct JITStackFrame {
206        JITStubArg reserved; // Unused
207        JITStubArg args[6];
208
209#if USE(JSVALUE32_64)
210        void* padding; // Make the overall stack length 8-byte aligned.
211#endif
212
213        void* preservedGP; // store GP when using PIC code
214        void* preservedS0;
215        void* preservedS1;
216        void* preservedS2;
217        void* preservedReturnAddress;
218
219        ReturnAddressPtr thunkReturnAddress;
220
221        // These arguments passed in a1..a3 (a0 contained the entry code pointed, which is not preserved)
222        RegisterFile* registerFile;
223        CallFrame* callFrame;
224        void* unused1;
225
226        // These arguments passed on the stack.
227        Profiler** enabledProfilerReference;
228        JSGlobalData* globalData;
229
230        ReturnAddressPtr* returnAddressSlot() { return &thunkReturnAddress; }
231    };
232#elif CPU(SH4)
233    struct JITStackFrame {
234        JITStubArg padding; // Unused
235        JITStubArg args[6];
236
237        ReturnAddressPtr thunkReturnAddress;
238        void* savedR10;
239        void* savedR11;
240        void* savedR13;
241        void* savedRPR;
242        void* savedR14;
243        void* savedTimeoutReg;
244
245        RegisterFile* registerFile;
246        CallFrame* callFrame;
247        JSValue* exception;
248        Profiler** enabledProfilerReference;
249        JSGlobalData* globalData;
250
251        ReturnAddressPtr* returnAddressSlot() { return &thunkReturnAddress; }
252    };
253#else
254#error "JITStackFrame not defined for this platform."
255#endif
256
257#define JITSTACKFRAME_ARGS_INDEX (OBJECT_OFFSETOF(JITStackFrame, args) / sizeof(void*))
258
259#define STUB_ARGS_DECLARATION void** args
260#define STUB_ARGS (args)
261
262#if CPU(X86)
263    #if COMPILER(MSVC)
264    #define JIT_STUB __fastcall
265    #elif COMPILER(GCC)
266    #define JIT_STUB  __attribute__ ((fastcall))
267    #else
268    #error "JIT_STUB function calls require fastcall conventions on x86, add appropriate directive/attribute here for your compiler!"
269    #endif
270#else
271    #define JIT_STUB
272#endif
273
274    extern "C" void ctiVMThrowTrampoline();
275    extern "C" void ctiOpThrowNotCaught();
276    extern "C" EncodedJSValue ctiTrampoline(void* code, RegisterFile*, CallFrame*, void* /*unused1*/, Profiler**, JSGlobalData*);
277
278    template <typename T> class Strong;
279
280    class JITThunks {
281    public:
282        JITThunks(JSGlobalData*);
283        ~JITThunks();
284
285        static void tryCacheGetByID(CallFrame*, CodeBlock*, ReturnAddressPtr returnAddress, JSValue baseValue, const Identifier& propertyName, const PropertySlot&, StructureStubInfo* stubInfo);
286        static void tryCachePutByID(CallFrame*, CodeBlock*, ReturnAddressPtr returnAddress, JSValue baseValue, const PutPropertySlot&, StructureStubInfo* stubInfo, bool direct);
287
288        MacroAssemblerCodePtr ctiStringLengthTrampoline() { return m_trampolineStructure.ctiStringLengthTrampoline; }
289        MacroAssemblerCodePtr ctiVirtualCallLink() { return m_trampolineStructure.ctiVirtualCallLink; }
290        MacroAssemblerCodePtr ctiVirtualConstructLink() { return m_trampolineStructure.ctiVirtualConstructLink; }
291        MacroAssemblerCodePtr ctiVirtualCall() { return m_trampolineStructure.ctiVirtualCall; }
292        MacroAssemblerCodePtr ctiVirtualConstruct() { return m_trampolineStructure.ctiVirtualConstruct; }
293        MacroAssemblerCodePtr ctiNativeCall() { return m_trampolineStructure.ctiNativeCall; }
294        MacroAssemblerCodePtr ctiNativeConstruct() { return m_trampolineStructure.ctiNativeConstruct; }
295        MacroAssemblerCodePtr ctiSoftModulo() { return m_trampolineStructure.ctiSoftModulo; }
296
297        MacroAssemblerCodePtr ctiStub(JSGlobalData* globalData, ThunkGenerator generator);
298
299        NativeExecutable* hostFunctionStub(JSGlobalData*, NativeFunction);
300        NativeExecutable* hostFunctionStub(JSGlobalData*, NativeFunction, ThunkGenerator);
301
302        void clearHostFunctionStubs();
303
304    private:
305        typedef HashMap<ThunkGenerator, MacroAssemblerCodePtr> CTIStubMap;
306        CTIStubMap m_ctiStubMap;
307        typedef HashMap<NativeFunction, Strong<NativeExecutable> > HostFunctionStubMap;
308        OwnPtr<HostFunctionStubMap> m_hostFunctionStubMap;
309        RefPtr<ExecutablePool> m_executablePool;
310
311        TrampolineStructure m_trampolineStructure;
312    };
313
314extern "C" {
315    EncodedJSValue JIT_STUB cti_op_add(STUB_ARGS_DECLARATION);
316    EncodedJSValue JIT_STUB cti_op_bitand(STUB_ARGS_DECLARATION);
317    EncodedJSValue JIT_STUB cti_op_bitnot(STUB_ARGS_DECLARATION);
318    EncodedJSValue JIT_STUB cti_op_bitor(STUB_ARGS_DECLARATION);
319    EncodedJSValue JIT_STUB cti_op_bitxor(STUB_ARGS_DECLARATION);
320    EncodedJSValue JIT_STUB cti_op_call_NotJSFunction(STUB_ARGS_DECLARATION);
321    EncodedJSValue JIT_STUB cti_op_call_eval(STUB_ARGS_DECLARATION);
322    EncodedJSValue JIT_STUB cti_op_construct_NotJSConstruct(STUB_ARGS_DECLARATION);
323    EncodedJSValue JIT_STUB cti_op_create_this(STUB_ARGS_DECLARATION);
324    EncodedJSValue JIT_STUB cti_op_convert_this(STUB_ARGS_DECLARATION);
325    EncodedJSValue JIT_STUB cti_op_convert_this_strict(STUB_ARGS_DECLARATION);
326    EncodedJSValue JIT_STUB cti_op_create_arguments(STUB_ARGS_DECLARATION);
327    EncodedJSValue JIT_STUB cti_op_create_arguments_no_params(STUB_ARGS_DECLARATION);
328    EncodedJSValue JIT_STUB cti_op_del_by_id(STUB_ARGS_DECLARATION);
329    EncodedJSValue JIT_STUB cti_op_del_by_val(STUB_ARGS_DECLARATION);
330    EncodedJSValue JIT_STUB cti_op_div(STUB_ARGS_DECLARATION);
331    EncodedJSValue JIT_STUB cti_op_get_by_id(STUB_ARGS_DECLARATION);
332    EncodedJSValue JIT_STUB cti_op_get_by_id_array_fail(STUB_ARGS_DECLARATION);
333    EncodedJSValue JIT_STUB cti_op_get_by_id_custom_stub(STUB_ARGS_DECLARATION);
334    EncodedJSValue JIT_STUB cti_op_get_by_id_generic(STUB_ARGS_DECLARATION);
335    EncodedJSValue JIT_STUB cti_op_get_by_id_getter_stub(STUB_ARGS_DECLARATION);
336    EncodedJSValue JIT_STUB cti_op_get_by_id_method_check(STUB_ARGS_DECLARATION);
337    EncodedJSValue JIT_STUB cti_op_get_by_id_proto_fail(STUB_ARGS_DECLARATION);
338    EncodedJSValue JIT_STUB cti_op_get_by_id_proto_list(STUB_ARGS_DECLARATION);
339    EncodedJSValue JIT_STUB cti_op_get_by_id_proto_list_full(STUB_ARGS_DECLARATION);
340    EncodedJSValue JIT_STUB cti_op_get_by_id_self_fail(STUB_ARGS_DECLARATION);
341    EncodedJSValue JIT_STUB cti_op_get_by_id_string_fail(STUB_ARGS_DECLARATION);
342    EncodedJSValue JIT_STUB cti_op_get_by_val(STUB_ARGS_DECLARATION);
343    EncodedJSValue JIT_STUB cti_op_get_by_val_byte_array(STUB_ARGS_DECLARATION);
344    EncodedJSValue JIT_STUB cti_op_get_by_val_string(STUB_ARGS_DECLARATION);
345    EncodedJSValue JIT_STUB cti_op_in(STUB_ARGS_DECLARATION);
346    EncodedJSValue JIT_STUB cti_op_instanceof(STUB_ARGS_DECLARATION);
347    EncodedJSValue JIT_STUB cti_op_is_boolean(STUB_ARGS_DECLARATION);
348    EncodedJSValue JIT_STUB cti_op_is_function(STUB_ARGS_DECLARATION);
349    EncodedJSValue JIT_STUB cti_op_is_number(STUB_ARGS_DECLARATION);
350    EncodedJSValue JIT_STUB cti_op_is_object(STUB_ARGS_DECLARATION);
351    EncodedJSValue JIT_STUB cti_op_is_string(STUB_ARGS_DECLARATION);
352    EncodedJSValue JIT_STUB cti_op_is_undefined(STUB_ARGS_DECLARATION);
353    EncodedJSValue JIT_STUB cti_op_less(STUB_ARGS_DECLARATION);
354    EncodedJSValue JIT_STUB cti_op_lesseq(STUB_ARGS_DECLARATION);
355    EncodedJSValue JIT_STUB cti_op_lshift(STUB_ARGS_DECLARATION);
356    EncodedJSValue JIT_STUB cti_op_mod(STUB_ARGS_DECLARATION);
357    EncodedJSValue JIT_STUB cti_op_mul(STUB_ARGS_DECLARATION);
358    EncodedJSValue JIT_STUB cti_op_negate(STUB_ARGS_DECLARATION);
359    EncodedJSValue JIT_STUB cti_op_not(STUB_ARGS_DECLARATION);
360    EncodedJSValue JIT_STUB cti_op_nstricteq(STUB_ARGS_DECLARATION);
361    EncodedJSValue JIT_STUB cti_op_post_dec(STUB_ARGS_DECLARATION);
362    EncodedJSValue JIT_STUB cti_op_post_inc(STUB_ARGS_DECLARATION);
363    EncodedJSValue JIT_STUB cti_op_pre_dec(STUB_ARGS_DECLARATION);
364    EncodedJSValue JIT_STUB cti_op_pre_inc(STUB_ARGS_DECLARATION);
365    EncodedJSValue JIT_STUB cti_op_resolve(STUB_ARGS_DECLARATION);
366    EncodedJSValue JIT_STUB cti_op_resolve_base(STUB_ARGS_DECLARATION);
367    EncodedJSValue JIT_STUB cti_op_resolve_base_strict_put(STUB_ARGS_DECLARATION);
368    EncodedJSValue JIT_STUB cti_op_ensure_property_exists(STUB_ARGS_DECLARATION);
369    EncodedJSValue JIT_STUB cti_op_resolve_global(STUB_ARGS_DECLARATION);
370    EncodedJSValue JIT_STUB cti_op_resolve_global_dynamic(STUB_ARGS_DECLARATION);
371    EncodedJSValue JIT_STUB cti_op_resolve_skip(STUB_ARGS_DECLARATION);
372    EncodedJSValue JIT_STUB cti_op_resolve_with_base(STUB_ARGS_DECLARATION);
373    EncodedJSValue JIT_STUB cti_op_rshift(STUB_ARGS_DECLARATION);
374    EncodedJSValue JIT_STUB cti_op_strcat(STUB_ARGS_DECLARATION);
375    EncodedJSValue JIT_STUB cti_op_stricteq(STUB_ARGS_DECLARATION);
376    EncodedJSValue JIT_STUB cti_op_sub(STUB_ARGS_DECLARATION);
377    EncodedJSValue JIT_STUB cti_op_to_jsnumber(STUB_ARGS_DECLARATION);
378    EncodedJSValue JIT_STUB cti_op_to_primitive(STUB_ARGS_DECLARATION);
379    EncodedJSValue JIT_STUB cti_op_typeof(STUB_ARGS_DECLARATION);
380    EncodedJSValue JIT_STUB cti_op_urshift(STUB_ARGS_DECLARATION);
381    EncodedJSValue JIT_STUB cti_to_object(STUB_ARGS_DECLARATION);
382    JSObject* JIT_STUB cti_op_new_array(STUB_ARGS_DECLARATION);
383    JSObject* JIT_STUB cti_op_new_func(STUB_ARGS_DECLARATION);
384    JSObject* JIT_STUB cti_op_new_func_exp(STUB_ARGS_DECLARATION);
385    JSObject* JIT_STUB cti_op_new_object(STUB_ARGS_DECLARATION);
386    JSObject* JIT_STUB cti_op_new_regexp(STUB_ARGS_DECLARATION);
387    JSObject* JIT_STUB cti_op_push_activation(STUB_ARGS_DECLARATION);
388    JSObject* JIT_STUB cti_op_push_new_scope(STUB_ARGS_DECLARATION);
389    JSObject* JIT_STUB cti_op_push_scope(STUB_ARGS_DECLARATION);
390    JSObject* JIT_STUB cti_op_put_by_id_transition_realloc(STUB_ARGS_DECLARATION);
391    JSPropertyNameIterator* JIT_STUB cti_op_get_pnames(STUB_ARGS_DECLARATION);
392    int JIT_STUB cti_op_eq(STUB_ARGS_DECLARATION);
393    int JIT_STUB cti_op_eq_strings(STUB_ARGS_DECLARATION);
394    int JIT_STUB cti_op_jless(STUB_ARGS_DECLARATION);
395    int JIT_STUB cti_op_jlesseq(STUB_ARGS_DECLARATION);
396    int JIT_STUB cti_op_jtrue(STUB_ARGS_DECLARATION);
397    int JIT_STUB cti_op_load_varargs(STUB_ARGS_DECLARATION);
398    int JIT_STUB cti_op_loop_if_lesseq(STUB_ARGS_DECLARATION);
399    int JIT_STUB cti_timeout_check(STUB_ARGS_DECLARATION);
400    int JIT_STUB cti_has_property(STUB_ARGS_DECLARATION);
401    void JIT_STUB cti_op_check_has_instance(STUB_ARGS_DECLARATION);
402    void JIT_STUB cti_op_debug(STUB_ARGS_DECLARATION);
403    void JIT_STUB cti_op_end(STUB_ARGS_DECLARATION);
404    void JIT_STUB cti_op_jmp_scopes(STUB_ARGS_DECLARATION);
405    void JIT_STUB cti_op_pop_scope(STUB_ARGS_DECLARATION);
406    void JIT_STUB cti_op_profile_did_call(STUB_ARGS_DECLARATION);
407    void JIT_STUB cti_op_profile_will_call(STUB_ARGS_DECLARATION);
408    void JIT_STUB cti_op_put_by_id(STUB_ARGS_DECLARATION);
409    void JIT_STUB cti_op_put_by_id_fail(STUB_ARGS_DECLARATION);
410    void JIT_STUB cti_op_put_by_id_generic(STUB_ARGS_DECLARATION);
411    void JIT_STUB cti_op_put_by_id_direct(STUB_ARGS_DECLARATION);
412    void JIT_STUB cti_op_put_by_id_direct_fail(STUB_ARGS_DECLARATION);
413    void JIT_STUB cti_op_put_by_id_direct_generic(STUB_ARGS_DECLARATION);
414    void JIT_STUB cti_op_put_by_index(STUB_ARGS_DECLARATION);
415    void JIT_STUB cti_op_put_by_val(STUB_ARGS_DECLARATION);
416    void JIT_STUB cti_op_put_by_val_byte_array(STUB_ARGS_DECLARATION);
417    void JIT_STUB cti_op_put_getter(STUB_ARGS_DECLARATION);
418    void JIT_STUB cti_op_put_setter(STUB_ARGS_DECLARATION);
419    void JIT_STUB cti_op_tear_off_activation(STUB_ARGS_DECLARATION);
420    void JIT_STUB cti_op_tear_off_arguments(STUB_ARGS_DECLARATION);
421    void JIT_STUB cti_op_throw_reference_error(STUB_ARGS_DECLARATION);
422    void* JIT_STUB cti_op_call_arityCheck(STUB_ARGS_DECLARATION);
423    void* JIT_STUB cti_op_construct_arityCheck(STUB_ARGS_DECLARATION);
424    void* JIT_STUB cti_op_call_jitCompile(STUB_ARGS_DECLARATION);
425    void* JIT_STUB cti_op_construct_jitCompile(STUB_ARGS_DECLARATION);
426    void* JIT_STUB cti_op_switch_char(STUB_ARGS_DECLARATION);
427    void* JIT_STUB cti_op_switch_imm(STUB_ARGS_DECLARATION);
428    void* JIT_STUB cti_op_switch_string(STUB_ARGS_DECLARATION);
429    void* JIT_STUB cti_op_throw(STUB_ARGS_DECLARATION);
430    void* JIT_STUB cti_register_file_check(STUB_ARGS_DECLARATION);
431    void* JIT_STUB cti_vm_lazyLinkCall(STUB_ARGS_DECLARATION);
432    void* JIT_STUB cti_vm_lazyLinkConstruct(STUB_ARGS_DECLARATION);
433    void* JIT_STUB cti_vm_throw(STUB_ARGS_DECLARATION);
434} // extern "C"
435
436} // namespace JSC
437
438#endif // ENABLE(JIT)
439
440#endif // JITStubs_h
441