Home | History | Annotate | Download | only in jit
      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 
     41 namespace 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 
    314 extern "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