Ignore:
Timestamp:
Jun 8, 2012, 12:57:40 PM (13 years ago)
Author:
[email protected]
Message:

Explictly mark stubs called by JIT as being internal
https://bugs.webkit.org/show_bug.cgi?id=88552

Reviewed by Filip Pizlo.

Source/JavaScriptCore:

  • dfg/DFGOSRExitCompiler.h:
  • dfg/DFGOperations.cpp:
  • dfg/DFGOperations.h:
  • jit/HostCallReturnValue.h:
  • jit/JITStubs.cpp:
  • jit/JITStubs.h:
  • jit/ThunkGenerators.cpp:
  • llint/LLIntSlowPaths.h: Mark a bunch of stubs as being

WTF_INTERNAL. Change most calls to SYMBOL_STRING_RELOCATION to
LOCAL_REFERENCE, or GLOBAL_REFERENCE in the case of the wrappers
to truly global symbols.

  • offlineasm/asm.rb: Generate LOCAL_REFERENCE instead of

SYMBOL_STRING_RELOCATION.

Don't rely on weak pointers for eager CodeBlock finalization
https://bugs.webkit.org/show_bug.cgi?id=88465

Reviewed by Gavin Barraclough.

This is incompatible with lazy weak pointer finalization.

I considered just making CodeBlock finalization lazy-friendly, but it
turns out that the heap is already way up in CodeBlock's business when
it comes to finalization, so I decided to finish the job and move full
responsibility for CodeBlock finalization into the heap.

will build.

  • debugger/Debugger.cpp: Updated for rename.
  • heap/Heap.cpp:

(JSC::Heap::deleteAllCompiledCode): Renamed for consistency. Fixed a bug
where we would not delete code for a code block that had been previously
jettisoned. I don't know if this happens in practice -- I mostly did
this to improve consistency with deleteUnmarkedCompiledCode.

(JSC::Heap::deleteUnmarkedCompiledCode): New function, responsible for
eager finalization of unmarked code blocks.

(JSC::Heap::collect): Updated for rename. Updated to call
deleteUnmarkedCompiledCode(), which takes care of jettisoned DFG code
blocks too.

(JSC::Heap::addCompiledCode): Renamed, since this points to all code
now, not just functions.

  • heap/Heap.h:

(Heap): Keep track of all user code, not just functions. This is a
negligible additional overhead, since most code is function code.

  • runtime/Executable.cpp:

(JSC::*::finalize): Removed these functions, since we don't rely on
weak pointer finalization anymore.

(JSC::FunctionExecutable::FunctionExecutable): Moved linked-list stuff
into base class so all executables can be in the list.

(JSC::EvalExecutable::clearCode):
(JSC::ProgramExecutable::clearCode):
(JSC::FunctionExecutable::clearCode): All we need to do is delete our
CodeBlock -- that will delete all of its internal data structures.

(JSC::FunctionExecutable::clearCodeIfNotCompiling): Factored out a helper
function to improve clarity.

  • runtime/Executable.h:

(JSC::ExecutableBase): Moved linked-list stuff
into base class so all executables can be in the list.

(JSC::NativeExecutable::create):
(NativeExecutable):
(ScriptExecutable):
(JSC::ScriptExecutable::finishCreation):
(JSC::EvalExecutable::create):
(EvalExecutable):
(JSC::ProgramExecutable::create):
(ProgramExecutable):
(FunctionExecutable):
(JSC::FunctionExecutable::create): Don't use a finalizer -- the heap
will call us back to destroy our code block.

(JSC::FunctionExecutable::discardCode): Renamed to clearCodeIfNotCompiling()
for clarity.

(JSC::FunctionExecutable::isCompiling): New helper function, for clarity.

(JSC::ScriptExecutable::clearCodeVirtual): New helper function, since
the heap needs to make polymorphic calls to clear code.

  • runtime/JSGlobalData.cpp:

(JSC::StackPreservingRecompiler::operator()):

  • runtime/JSGlobalObject.cpp:

(JSC::DynamicGlobalObjectScope::DynamicGlobalObjectScope): Updated for
renames.

Source/WTF:

  • wtf/ExportMacros.h (WTF_INTERNAL, HAVE_INTERNAL_VISIBILITY): New

defines. Regardless of what the port does about visibility in
general, for code referenced only from assembly it is useful to
give it internal visibility.

  • wtf/InlineASM.h: Split SYMBOL_STRING_RELOCATION into

LOCAL_REFERENCE and GLOBAL_REFERENCE; the former will try to avoid
indirection if HAVE(INTERNAL_VISIBILITY).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/llint/LLIntSlowPaths.h

    r113930 r119857  
    7979    extern "C" SlowPathReturnType llint_##name(ExecState* exec, Instruction* pc)
    8080
    81 LLINT_SLOW_PATH_DECL(trace_prologue);
    82 LLINT_SLOW_PATH_DECL(trace_prologue_function_for_call);
    83 LLINT_SLOW_PATH_DECL(trace_prologue_function_for_construct);
    84 LLINT_SLOW_PATH_DECL(trace_arityCheck_for_call);
    85 LLINT_SLOW_PATH_DECL(trace_arityCheck_for_construct);
    86 LLINT_SLOW_PATH_DECL(trace);
    87 LLINT_SLOW_PATH_DECL(special_trace);
    88 LLINT_SLOW_PATH_DECL(entry_osr);
    89 LLINT_SLOW_PATH_DECL(entry_osr_function_for_call);
    90 LLINT_SLOW_PATH_DECL(entry_osr_function_for_construct);
    91 LLINT_SLOW_PATH_DECL(entry_osr_function_for_call_arityCheck);
    92 LLINT_SLOW_PATH_DECL(entry_osr_function_for_construct_arityCheck);
    93 LLINT_SLOW_PATH_DECL(loop_osr);
    94 LLINT_SLOW_PATH_DECL(replace);
    95 LLINT_SLOW_PATH_DECL(register_file_check);
    96 LLINT_SLOW_PATH_DECL(slow_path_call_arityCheck);
    97 LLINT_SLOW_PATH_DECL(slow_path_construct_arityCheck);
    98 LLINT_SLOW_PATH_DECL(slow_path_create_activation);
    99 LLINT_SLOW_PATH_DECL(slow_path_create_arguments);
    100 LLINT_SLOW_PATH_DECL(slow_path_create_this);
    101 LLINT_SLOW_PATH_DECL(slow_path_convert_this);
    102 LLINT_SLOW_PATH_DECL(slow_path_new_object);
    103 LLINT_SLOW_PATH_DECL(slow_path_new_array);
    104 LLINT_SLOW_PATH_DECL(slow_path_new_array_buffer);
    105 LLINT_SLOW_PATH_DECL(slow_path_new_regexp);
    106 LLINT_SLOW_PATH_DECL(slow_path_not);
    107 LLINT_SLOW_PATH_DECL(slow_path_eq);
    108 LLINT_SLOW_PATH_DECL(slow_path_neq);
    109 LLINT_SLOW_PATH_DECL(slow_path_stricteq);
    110 LLINT_SLOW_PATH_DECL(slow_path_nstricteq);
    111 LLINT_SLOW_PATH_DECL(slow_path_less);
    112 LLINT_SLOW_PATH_DECL(slow_path_lesseq);
    113 LLINT_SLOW_PATH_DECL(slow_path_greater);
    114 LLINT_SLOW_PATH_DECL(slow_path_greatereq);
    115 LLINT_SLOW_PATH_DECL(slow_path_pre_inc);
    116 LLINT_SLOW_PATH_DECL(slow_path_pre_dec);
    117 LLINT_SLOW_PATH_DECL(slow_path_post_inc);
    118 LLINT_SLOW_PATH_DECL(slow_path_post_dec);
    119 LLINT_SLOW_PATH_DECL(slow_path_to_jsnumber);
    120 LLINT_SLOW_PATH_DECL(slow_path_negate);
    121 LLINT_SLOW_PATH_DECL(slow_path_add);
    122 LLINT_SLOW_PATH_DECL(slow_path_mul);
    123 LLINT_SLOW_PATH_DECL(slow_path_sub);
    124 LLINT_SLOW_PATH_DECL(slow_path_div);
    125 LLINT_SLOW_PATH_DECL(slow_path_mod);
    126 LLINT_SLOW_PATH_DECL(slow_path_lshift);
    127 LLINT_SLOW_PATH_DECL(slow_path_rshift);
    128 LLINT_SLOW_PATH_DECL(slow_path_urshift);
    129 LLINT_SLOW_PATH_DECL(slow_path_bitand);
    130 LLINT_SLOW_PATH_DECL(slow_path_bitor);
    131 LLINT_SLOW_PATH_DECL(slow_path_bitxor);
    132 LLINT_SLOW_PATH_DECL(slow_path_check_has_instance);
    133 LLINT_SLOW_PATH_DECL(slow_path_instanceof);
    134 LLINT_SLOW_PATH_DECL(slow_path_typeof);
    135 LLINT_SLOW_PATH_DECL(slow_path_is_object);
    136 LLINT_SLOW_PATH_DECL(slow_path_is_function);
    137 LLINT_SLOW_PATH_DECL(slow_path_in);
    138 LLINT_SLOW_PATH_DECL(slow_path_resolve);
    139 LLINT_SLOW_PATH_DECL(slow_path_resolve_skip);
    140 LLINT_SLOW_PATH_DECL(slow_path_resolve_global);
    141 LLINT_SLOW_PATH_DECL(slow_path_resolve_global_dynamic);
    142 LLINT_SLOW_PATH_DECL(slow_path_resolve_for_resolve_global_dynamic);
    143 LLINT_SLOW_PATH_DECL(slow_path_resolve_base);
    144 LLINT_SLOW_PATH_DECL(slow_path_ensure_property_exists);
    145 LLINT_SLOW_PATH_DECL(slow_path_resolve_with_base);
    146 LLINT_SLOW_PATH_DECL(slow_path_resolve_with_this);
    147 LLINT_SLOW_PATH_DECL(slow_path_get_by_id);
    148 LLINT_SLOW_PATH_DECL(slow_path_get_arguments_length);
    149 LLINT_SLOW_PATH_DECL(slow_path_put_by_id);
    150 LLINT_SLOW_PATH_DECL(slow_path_del_by_id);
    151 LLINT_SLOW_PATH_DECL(slow_path_get_by_val);
    152 LLINT_SLOW_PATH_DECL(slow_path_get_argument_by_val);
    153 LLINT_SLOW_PATH_DECL(slow_path_get_by_pname);
    154 LLINT_SLOW_PATH_DECL(slow_path_put_by_val);
    155 LLINT_SLOW_PATH_DECL(slow_path_del_by_val);
    156 LLINT_SLOW_PATH_DECL(slow_path_put_by_index);
    157 LLINT_SLOW_PATH_DECL(slow_path_put_getter_setter);
    158 LLINT_SLOW_PATH_DECL(slow_path_jmp_scopes);
    159 LLINT_SLOW_PATH_DECL(slow_path_jtrue);
    160 LLINT_SLOW_PATH_DECL(slow_path_jfalse);
    161 LLINT_SLOW_PATH_DECL(slow_path_jless);
    162 LLINT_SLOW_PATH_DECL(slow_path_jnless);
    163 LLINT_SLOW_PATH_DECL(slow_path_jgreater);
    164 LLINT_SLOW_PATH_DECL(slow_path_jngreater);
    165 LLINT_SLOW_PATH_DECL(slow_path_jlesseq);
    166 LLINT_SLOW_PATH_DECL(slow_path_jnlesseq);
    167 LLINT_SLOW_PATH_DECL(slow_path_jgreatereq);
    168 LLINT_SLOW_PATH_DECL(slow_path_jngreatereq);
    169 LLINT_SLOW_PATH_DECL(slow_path_switch_imm);
    170 LLINT_SLOW_PATH_DECL(slow_path_switch_char);
    171 LLINT_SLOW_PATH_DECL(slow_path_switch_string);
    172 LLINT_SLOW_PATH_DECL(slow_path_new_func);
    173 LLINT_SLOW_PATH_DECL(slow_path_new_func_exp);
    174 LLINT_SLOW_PATH_DECL(slow_path_call);
    175 LLINT_SLOW_PATH_DECL(slow_path_construct);
    176 LLINT_SLOW_PATH_DECL(slow_path_call_varargs);
    177 LLINT_SLOW_PATH_DECL(slow_path_call_eval);
    178 LLINT_SLOW_PATH_DECL(slow_path_tear_off_activation);
    179 LLINT_SLOW_PATH_DECL(slow_path_tear_off_arguments);
    180 LLINT_SLOW_PATH_DECL(slow_path_strcat);
    181 LLINT_SLOW_PATH_DECL(slow_path_to_primitive);
    182 LLINT_SLOW_PATH_DECL(slow_path_get_pnames);
    183 LLINT_SLOW_PATH_DECL(slow_path_next_pname);
    184 LLINT_SLOW_PATH_DECL(slow_path_push_scope);
    185 LLINT_SLOW_PATH_DECL(slow_path_pop_scope);
    186 LLINT_SLOW_PATH_DECL(slow_path_push_new_scope);
    187 LLINT_SLOW_PATH_DECL(slow_path_throw);
    188 LLINT_SLOW_PATH_DECL(slow_path_throw_reference_error);
    189 LLINT_SLOW_PATH_DECL(slow_path_debug);
    190 LLINT_SLOW_PATH_DECL(slow_path_profile_will_call);
    191 LLINT_SLOW_PATH_DECL(slow_path_profile_did_call);
    192 LLINT_SLOW_PATH_DECL(throw_from_native_call);
     81#define LLINT_SLOW_PATH_HIDDEN_DECL(name) \
     82    LLINT_SLOW_PATH_DECL(name) WTF_INTERNAL
     83
     84LLINT_SLOW_PATH_HIDDEN_DECL(trace_prologue);
     85LLINT_SLOW_PATH_HIDDEN_DECL(trace_prologue_function_for_call);
     86LLINT_SLOW_PATH_HIDDEN_DECL(trace_prologue_function_for_construct);
     87LLINT_SLOW_PATH_HIDDEN_DECL(trace_arityCheck_for_call);
     88LLINT_SLOW_PATH_HIDDEN_DECL(trace_arityCheck_for_construct);
     89LLINT_SLOW_PATH_HIDDEN_DECL(trace);
     90LLINT_SLOW_PATH_HIDDEN_DECL(special_trace);
     91LLINT_SLOW_PATH_HIDDEN_DECL(entry_osr);
     92LLINT_SLOW_PATH_HIDDEN_DECL(entry_osr_function_for_call);
     93LLINT_SLOW_PATH_HIDDEN_DECL(entry_osr_function_for_construct);
     94LLINT_SLOW_PATH_HIDDEN_DECL(entry_osr_function_for_call_arityCheck);
     95LLINT_SLOW_PATH_HIDDEN_DECL(entry_osr_function_for_construct_arityCheck);
     96LLINT_SLOW_PATH_HIDDEN_DECL(loop_osr);
     97LLINT_SLOW_PATH_HIDDEN_DECL(replace);
     98LLINT_SLOW_PATH_HIDDEN_DECL(register_file_check);
     99LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_call_arityCheck);
     100LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_construct_arityCheck);
     101LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_create_activation);
     102LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_create_arguments);
     103LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_create_this);
     104LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_convert_this);
     105LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_new_object);
     106LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_new_array);
     107LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_new_array_buffer);
     108LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_new_regexp);
     109LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_not);
     110LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_eq);
     111LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_neq);
     112LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_stricteq);
     113LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_nstricteq);
     114LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_less);
     115LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_lesseq);
     116LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_greater);
     117LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_greatereq);
     118LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_pre_inc);
     119LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_pre_dec);
     120LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_post_inc);
     121LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_post_dec);
     122LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_to_jsnumber);
     123LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_negate);
     124LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_add);
     125LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_mul);
     126LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_sub);
     127LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_div);
     128LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_mod);
     129LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_lshift);
     130LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_rshift);
     131LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_urshift);
     132LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_bitand);
     133LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_bitor);
     134LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_bitxor);
     135LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_check_has_instance);
     136LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_instanceof);
     137LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_typeof);
     138LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_is_object);
     139LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_is_function);
     140LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_in);
     141LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_resolve);
     142LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_resolve_skip);
     143LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_resolve_global);
     144LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_resolve_global_dynamic);
     145LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_resolve_for_resolve_global_dynamic);
     146LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_resolve_base);
     147LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_ensure_property_exists);
     148LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_resolve_with_base);
     149LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_resolve_with_this);
     150LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_get_by_id);
     151LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_get_arguments_length);
     152LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_put_by_id);
     153LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_del_by_id);
     154LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_get_by_val);
     155LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_get_argument_by_val);
     156LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_get_by_pname);
     157LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_put_by_val);
     158LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_del_by_val);
     159LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_put_by_index);
     160LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_put_getter_setter);
     161LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jmp_scopes);
     162LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jtrue);
     163LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jfalse);
     164LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jless);
     165LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jnless);
     166LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jgreater);
     167LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jngreater);
     168LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jlesseq);
     169LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jnlesseq);
     170LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jgreatereq);
     171LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jngreatereq);
     172LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_switch_imm);
     173LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_switch_char);
     174LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_switch_string);
     175LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_new_func);
     176LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_new_func_exp);
     177LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_call);
     178LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_construct);
     179LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_call_varargs);
     180LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_call_eval);
     181LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_tear_off_activation);
     182LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_tear_off_arguments);
     183LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_strcat);
     184LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_to_primitive);
     185LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_get_pnames);
     186LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_next_pname);
     187LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_push_scope);
     188LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_pop_scope);
     189LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_push_new_scope);
     190LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_throw);
     191LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_throw_reference_error);
     192LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_debug);
     193LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_profile_will_call);
     194LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_profile_did_call);
     195LLINT_SLOW_PATH_HIDDEN_DECL(throw_from_native_call);
    193196
    194197} } // namespace JSC::LLInt
Note: See TracChangeset for help on using the changeset viewer.