Index: src/serialize.cc |
diff --git a/src/serialize.cc b/src/serialize.cc |
index 5a54543910883b3aee59865838fb4d3fe2b1e0e5..7dab02f18dadcf03b5640f6c40b6f60de9b831e7 100644 |
--- a/src/serialize.cc |
+++ b/src/serialize.cc |
@@ -100,6 +100,8 @@ void ExternalReferenceTable::Add(Address address, |
entry.code = EncodeExternal(type, id); |
entry.name = name; |
DCHECK_NE(0, entry.code); |
+ // Assert that the code is added in ascending order to rule out duplicates. |
+ DCHECK((size() == 0) || (code(size() - 1) < entry.code)); |
refs_.Add(entry); |
if (id > max_id_[type]) max_id_[type] = id; |
} |
@@ -110,6 +112,144 @@ void ExternalReferenceTable::PopulateTable(Isolate* isolate) { |
max_id_[type_code] = 0; |
} |
+ // Miscellaneous |
+ Add(ExternalReference::roots_array_start(isolate).address(), |
+ "Heap::roots_array_start()"); |
+ Add(ExternalReference::address_of_stack_limit(isolate).address(), |
+ "StackGuard::address_of_jslimit()"); |
+ Add(ExternalReference::address_of_real_stack_limit(isolate).address(), |
+ "StackGuard::address_of_real_jslimit()"); |
+ Add(ExternalReference::new_space_start(isolate).address(), |
+ "Heap::NewSpaceStart()"); |
+ Add(ExternalReference::new_space_mask(isolate).address(), |
+ "Heap::NewSpaceMask()"); |
+ Add(ExternalReference::new_space_allocation_limit_address(isolate).address(), |
+ "Heap::NewSpaceAllocationLimitAddress()"); |
+ Add(ExternalReference::new_space_allocation_top_address(isolate).address(), |
+ "Heap::NewSpaceAllocationTopAddress()"); |
+ Add(ExternalReference::debug_break(isolate).address(), "Debug::Break()"); |
+ Add(ExternalReference::debug_step_in_fp_address(isolate).address(), |
+ "Debug::step_in_fp_addr()"); |
+ Add(ExternalReference::mod_two_doubles_operation(isolate).address(), |
+ "mod_two_doubles"); |
+ // Keyed lookup cache. |
+ Add(ExternalReference::keyed_lookup_cache_keys(isolate).address(), |
+ "KeyedLookupCache::keys()"); |
+ Add(ExternalReference::keyed_lookup_cache_field_offsets(isolate).address(), |
+ "KeyedLookupCache::field_offsets()"); |
+ Add(ExternalReference::handle_scope_next_address(isolate).address(), |
+ "HandleScope::next"); |
+ Add(ExternalReference::handle_scope_limit_address(isolate).address(), |
+ "HandleScope::limit"); |
+ Add(ExternalReference::handle_scope_level_address(isolate).address(), |
+ "HandleScope::level"); |
+ Add(ExternalReference::new_deoptimizer_function(isolate).address(), |
+ "Deoptimizer::New()"); |
+ Add(ExternalReference::compute_output_frames_function(isolate).address(), |
+ "Deoptimizer::ComputeOutputFrames()"); |
+ Add(ExternalReference::address_of_min_int().address(), |
+ "LDoubleConstant::min_int"); |
+ Add(ExternalReference::address_of_one_half().address(), |
+ "LDoubleConstant::one_half"); |
+ Add(ExternalReference::isolate_address(isolate).address(), "isolate"); |
+ Add(ExternalReference::address_of_negative_infinity().address(), |
+ "LDoubleConstant::negative_infinity"); |
+ Add(ExternalReference::power_double_double_function(isolate).address(), |
+ "power_double_double_function"); |
+ Add(ExternalReference::power_double_int_function(isolate).address(), |
+ "power_double_int_function"); |
+ Add(ExternalReference::math_log_double_function(isolate).address(), |
+ "std::log"); |
+ Add(ExternalReference::store_buffer_top(isolate).address(), |
+ "store_buffer_top"); |
+ Add(ExternalReference::address_of_canonical_non_hole_nan().address(), |
+ "canonical_nan"); |
+ Add(ExternalReference::address_of_the_hole_nan().address(), "the_hole_nan"); |
+ Add(ExternalReference::get_date_field_function(isolate).address(), |
+ "JSDate::GetField"); |
+ Add(ExternalReference::date_cache_stamp(isolate).address(), |
+ "date_cache_stamp"); |
+ Add(ExternalReference::address_of_pending_message_obj(isolate).address(), |
+ "address_of_pending_message_obj"); |
+ Add(ExternalReference::address_of_has_pending_message(isolate).address(), |
+ "address_of_has_pending_message"); |
+ Add(ExternalReference::address_of_pending_message_script(isolate).address(), |
+ "pending_message_script"); |
+ Add(ExternalReference::get_make_code_young_function(isolate).address(), |
+ "Code::MakeCodeYoung"); |
+ Add(ExternalReference::cpu_features().address(), "cpu_features"); |
+ Add(ExternalReference(Runtime::kAllocateInNewSpace, isolate).address(), |
+ "Runtime::AllocateInNewSpace"); |
+ Add(ExternalReference(Runtime::kAllocateInTargetSpace, isolate).address(), |
+ "Runtime::AllocateInTargetSpace"); |
+ Add(ExternalReference::old_pointer_space_allocation_top_address(isolate) |
+ .address(), |
+ "Heap::OldPointerSpaceAllocationTopAddress"); |
+ Add(ExternalReference::old_pointer_space_allocation_limit_address(isolate) |
+ .address(), |
+ "Heap::OldPointerSpaceAllocationLimitAddress"); |
+ Add(ExternalReference::old_data_space_allocation_top_address(isolate) |
+ .address(), |
+ "Heap::OldDataSpaceAllocationTopAddress"); |
+ Add(ExternalReference::old_data_space_allocation_limit_address(isolate) |
+ .address(), |
+ "Heap::OldDataSpaceAllocationLimitAddress"); |
+ Add(ExternalReference::allocation_sites_list_address(isolate).address(), |
+ "Heap::allocation_sites_list_address()"); |
+ Add(ExternalReference::address_of_uint32_bias().address(), "uint32_bias"); |
+ Add(ExternalReference::get_mark_code_as_executed_function(isolate).address(), |
+ "Code::MarkCodeAsExecuted"); |
+ Add(ExternalReference::is_profiling_address(isolate).address(), |
+ "CpuProfiler::is_profiling"); |
+ Add(ExternalReference::scheduled_exception_address(isolate).address(), |
+ "Isolate::scheduled_exception"); |
+ Add(ExternalReference::invoke_function_callback(isolate).address(), |
+ "InvokeFunctionCallback"); |
+ Add(ExternalReference::invoke_accessor_getter_callback(isolate).address(), |
+ "InvokeAccessorGetterCallback"); |
+ Add(ExternalReference::flush_icache_function(isolate).address(), |
+ "CpuFeatures::FlushICache"); |
+ Add(ExternalReference::log_enter_external_function(isolate).address(), |
+ "Logger::EnterExternal"); |
+ Add(ExternalReference::log_leave_external_function(isolate).address(), |
+ "Logger::LeaveExternal"); |
+ Add(ExternalReference::address_of_minus_one_half().address(), |
+ "double_constants.minus_one_half"); |
+ Add(ExternalReference::stress_deopt_count(isolate).address(), |
+ "Isolate::stress_deopt_count_address()"); |
+ Add(ExternalReference::incremental_marking_record_write_function(isolate) |
+ .address(), |
+ "IncrementalMarking::RecordWriteFromCode"); |
+ |
+ // Debug addresses |
+ Add(ExternalReference::debug_after_break_target_address(isolate).address(), |
+ "Debug::after_break_target_address()"); |
+ Add(ExternalReference::debug_restarter_frame_function_pointer_address(isolate) |
+ .address(), |
+ "Debug::restarter_frame_function_pointer_address()"); |
+ Add(ExternalReference::debug_is_active_address(isolate).address(), |
+ "Debug::is_active_address()"); |
+ |
+#ifndef V8_INTERPRETED_REGEXP |
+ Add(ExternalReference::re_case_insensitive_compare_uc16(isolate).address(), |
+ "NativeRegExpMacroAssembler::CaseInsensitiveCompareUC16()"); |
+ Add(ExternalReference::re_check_stack_guard_state(isolate).address(), |
+ "RegExpMacroAssembler*::CheckStackGuardState()"); |
+ Add(ExternalReference::re_grow_stack(isolate).address(), |
+ "NativeRegExpMacroAssembler::GrowStack()"); |
+ Add(ExternalReference::re_word_character_map().address(), |
+ "NativeRegExpMacroAssembler::word_character_map"); |
+ Add(ExternalReference::address_of_regexp_stack_limit(isolate).address(), |
+ "RegExpStack::limit_address()"); |
+ Add(ExternalReference::address_of_regexp_stack_memory_address(isolate) |
+ .address(), |
+ "RegExpStack::memory_address()"); |
+ Add(ExternalReference::address_of_regexp_stack_memory_size(isolate).address(), |
+ "RegExpStack::memory_size()"); |
+ Add(ExternalReference::address_of_static_offsets_vector(isolate).address(), |
+ "OffsetsVector::static_offsets_vector"); |
+#endif // V8_INTERPRETED_REGEXP |
+ |
// The following populates all of the different type of external references |
// into the ExternalReferenceTable. |
// |
@@ -240,292 +380,26 @@ void ExternalReferenceTable::PopulateTable(Isolate* isolate) { |
// Stub cache tables |
Add(stub_cache->key_reference(StubCache::kPrimary).address(), |
- STUB_CACHE_TABLE, |
- 1, |
- "StubCache::primary_->key"); |
+ STUB_CACHE_TABLE, 1, "StubCache::primary_->key"); |
Add(stub_cache->value_reference(StubCache::kPrimary).address(), |
- STUB_CACHE_TABLE, |
- 2, |
- "StubCache::primary_->value"); |
+ STUB_CACHE_TABLE, 2, "StubCache::primary_->value"); |
Add(stub_cache->map_reference(StubCache::kPrimary).address(), |
- STUB_CACHE_TABLE, |
- 3, |
- "StubCache::primary_->map"); |
+ STUB_CACHE_TABLE, 3, "StubCache::primary_->map"); |
Add(stub_cache->key_reference(StubCache::kSecondary).address(), |
- STUB_CACHE_TABLE, |
- 4, |
- "StubCache::secondary_->key"); |
+ STUB_CACHE_TABLE, 4, "StubCache::secondary_->key"); |
Add(stub_cache->value_reference(StubCache::kSecondary).address(), |
- STUB_CACHE_TABLE, |
- 5, |
- "StubCache::secondary_->value"); |
+ STUB_CACHE_TABLE, 5, "StubCache::secondary_->value"); |
Add(stub_cache->map_reference(StubCache::kSecondary).address(), |
- STUB_CACHE_TABLE, |
- 6, |
- "StubCache::secondary_->map"); |
+ STUB_CACHE_TABLE, 6, "StubCache::secondary_->map"); |
// Runtime entries |
Add(ExternalReference::delete_handle_scope_extensions(isolate).address(), |
- RUNTIME_ENTRY, |
- 4, |
- "HandleScope::DeleteExtensions"); |
- Add(ExternalReference:: |
- incremental_marking_record_write_function(isolate).address(), |
- RUNTIME_ENTRY, |
- 5, |
- "IncrementalMarking::RecordWrite"); |
+ RUNTIME_ENTRY, 1, "HandleScope::DeleteExtensions"); |
+ Add(ExternalReference::incremental_marking_record_write_function(isolate) |
+ .address(), |
+ RUNTIME_ENTRY, 2, "IncrementalMarking::RecordWrite"); |
Add(ExternalReference::store_buffer_overflow_function(isolate).address(), |
- RUNTIME_ENTRY, |
- 6, |
- "StoreBuffer::StoreBufferOverflow"); |
- |
- // Miscellaneous |
- Add(ExternalReference::roots_array_start(isolate).address(), |
- UNCLASSIFIED, |
- 3, |
- "Heap::roots_array_start()"); |
- Add(ExternalReference::address_of_stack_limit(isolate).address(), |
- UNCLASSIFIED, |
- 4, |
- "StackGuard::address_of_jslimit()"); |
- Add(ExternalReference::address_of_real_stack_limit(isolate).address(), |
- UNCLASSIFIED, |
- 5, |
- "StackGuard::address_of_real_jslimit()"); |
-#ifndef V8_INTERPRETED_REGEXP |
- Add(ExternalReference::address_of_regexp_stack_limit(isolate).address(), |
- UNCLASSIFIED, |
- 6, |
- "RegExpStack::limit_address()"); |
- Add(ExternalReference::address_of_regexp_stack_memory_address( |
- isolate).address(), |
- UNCLASSIFIED, |
- 7, |
- "RegExpStack::memory_address()"); |
- Add(ExternalReference::address_of_regexp_stack_memory_size(isolate).address(), |
- UNCLASSIFIED, |
- 8, |
- "RegExpStack::memory_size()"); |
- Add(ExternalReference::address_of_static_offsets_vector(isolate).address(), |
- UNCLASSIFIED, |
- 9, |
- "OffsetsVector::static_offsets_vector"); |
-#endif // V8_INTERPRETED_REGEXP |
- Add(ExternalReference::new_space_start(isolate).address(), |
- UNCLASSIFIED, |
- 10, |
- "Heap::NewSpaceStart()"); |
- Add(ExternalReference::new_space_mask(isolate).address(), |
- UNCLASSIFIED, |
- 11, |
- "Heap::NewSpaceMask()"); |
- Add(ExternalReference::new_space_allocation_limit_address(isolate).address(), |
- UNCLASSIFIED, |
- 14, |
- "Heap::NewSpaceAllocationLimitAddress()"); |
- Add(ExternalReference::new_space_allocation_top_address(isolate).address(), |
- UNCLASSIFIED, |
- 15, |
- "Heap::NewSpaceAllocationTopAddress()"); |
- Add(ExternalReference::debug_break(isolate).address(), |
- UNCLASSIFIED, |
- 16, |
- "Debug::Break()"); |
- Add(ExternalReference::debug_step_in_fp_address(isolate).address(), |
- UNCLASSIFIED, |
- 17, |
- "Debug::step_in_fp_addr()"); |
- Add(ExternalReference::mod_two_doubles_operation(isolate).address(), |
- UNCLASSIFIED, |
- 22, |
- "mod_two_doubles"); |
-#ifndef V8_INTERPRETED_REGEXP |
- Add(ExternalReference::re_case_insensitive_compare_uc16(isolate).address(), |
- UNCLASSIFIED, |
- 24, |
- "NativeRegExpMacroAssembler::CaseInsensitiveCompareUC16()"); |
- Add(ExternalReference::re_check_stack_guard_state(isolate).address(), |
- UNCLASSIFIED, |
- 25, |
- "RegExpMacroAssembler*::CheckStackGuardState()"); |
- Add(ExternalReference::re_grow_stack(isolate).address(), |
- UNCLASSIFIED, |
- 26, |
- "NativeRegExpMacroAssembler::GrowStack()"); |
- Add(ExternalReference::re_word_character_map().address(), |
- UNCLASSIFIED, |
- 27, |
- "NativeRegExpMacroAssembler::word_character_map"); |
-#endif // V8_INTERPRETED_REGEXP |
- // Keyed lookup cache. |
- Add(ExternalReference::keyed_lookup_cache_keys(isolate).address(), |
- UNCLASSIFIED, |
- 28, |
- "KeyedLookupCache::keys()"); |
- Add(ExternalReference::keyed_lookup_cache_field_offsets(isolate).address(), |
- UNCLASSIFIED, |
- 29, |
- "KeyedLookupCache::field_offsets()"); |
- Add(ExternalReference::handle_scope_next_address(isolate).address(), |
- UNCLASSIFIED, |
- 31, |
- "HandleScope::next"); |
- Add(ExternalReference::handle_scope_limit_address(isolate).address(), |
- UNCLASSIFIED, |
- 32, |
- "HandleScope::limit"); |
- Add(ExternalReference::handle_scope_level_address(isolate).address(), |
- UNCLASSIFIED, |
- 33, |
- "HandleScope::level"); |
- Add(ExternalReference::new_deoptimizer_function(isolate).address(), |
- UNCLASSIFIED, |
- 34, |
- "Deoptimizer::New()"); |
- Add(ExternalReference::compute_output_frames_function(isolate).address(), |
- UNCLASSIFIED, |
- 35, |
- "Deoptimizer::ComputeOutputFrames()"); |
- Add(ExternalReference::address_of_min_int().address(), |
- UNCLASSIFIED, |
- 36, |
- "LDoubleConstant::min_int"); |
- Add(ExternalReference::address_of_one_half().address(), |
- UNCLASSIFIED, |
- 37, |
- "LDoubleConstant::one_half"); |
- Add(ExternalReference::isolate_address(isolate).address(), |
- UNCLASSIFIED, |
- 38, |
- "isolate"); |
- Add(ExternalReference::address_of_minus_zero().address(), |
- UNCLASSIFIED, |
- 39, |
- "LDoubleConstant::minus_zero"); |
- Add(ExternalReference::address_of_negative_infinity().address(), |
- UNCLASSIFIED, |
- 40, |
- "LDoubleConstant::negative_infinity"); |
- Add(ExternalReference::power_double_double_function(isolate).address(), |
- UNCLASSIFIED, |
- 41, |
- "power_double_double_function"); |
- Add(ExternalReference::power_double_int_function(isolate).address(), |
- UNCLASSIFIED, |
- 42, |
- "power_double_int_function"); |
- Add(ExternalReference::store_buffer_top(isolate).address(), |
- UNCLASSIFIED, |
- 43, |
- "store_buffer_top"); |
- Add(ExternalReference::address_of_canonical_non_hole_nan().address(), |
- UNCLASSIFIED, |
- 44, |
- "canonical_nan"); |
- Add(ExternalReference::address_of_the_hole_nan().address(), |
- UNCLASSIFIED, |
- 45, |
- "the_hole_nan"); |
- Add(ExternalReference::get_date_field_function(isolate).address(), |
- UNCLASSIFIED, |
- 46, |
- "JSDate::GetField"); |
- Add(ExternalReference::date_cache_stamp(isolate).address(), |
- UNCLASSIFIED, |
- 47, |
- "date_cache_stamp"); |
- Add(ExternalReference::address_of_pending_message_obj(isolate).address(), |
- UNCLASSIFIED, |
- 48, |
- "address_of_pending_message_obj"); |
- Add(ExternalReference::address_of_has_pending_message(isolate).address(), |
- UNCLASSIFIED, |
- 49, |
- "address_of_has_pending_message"); |
- Add(ExternalReference::address_of_pending_message_script(isolate).address(), |
- UNCLASSIFIED, |
- 50, |
- "pending_message_script"); |
- Add(ExternalReference::get_make_code_young_function(isolate).address(), |
- UNCLASSIFIED, |
- 51, |
- "Code::MakeCodeYoung"); |
- Add(ExternalReference::cpu_features().address(), |
- UNCLASSIFIED, |
- 52, |
- "cpu_features"); |
- Add(ExternalReference(Runtime::kAllocateInNewSpace, isolate).address(), |
- UNCLASSIFIED, |
- 53, |
- "Runtime::AllocateInNewSpace"); |
- Add(ExternalReference(Runtime::kAllocateInTargetSpace, isolate).address(), |
- UNCLASSIFIED, |
- 54, |
- "Runtime::AllocateInTargetSpace"); |
- Add(ExternalReference::old_pointer_space_allocation_top_address( |
- isolate).address(), |
- UNCLASSIFIED, |
- 55, |
- "Heap::OldPointerSpaceAllocationTopAddress"); |
- Add(ExternalReference::old_pointer_space_allocation_limit_address( |
- isolate).address(), |
- UNCLASSIFIED, |
- 56, |
- "Heap::OldPointerSpaceAllocationLimitAddress"); |
- Add(ExternalReference::old_data_space_allocation_top_address( |
- isolate).address(), |
- UNCLASSIFIED, |
- 57, |
- "Heap::OldDataSpaceAllocationTopAddress"); |
- Add(ExternalReference::old_data_space_allocation_limit_address( |
- isolate).address(), |
- UNCLASSIFIED, |
- 58, |
- "Heap::OldDataSpaceAllocationLimitAddress"); |
- Add(ExternalReference::allocation_sites_list_address(isolate).address(), |
- UNCLASSIFIED, |
- 59, |
- "Heap::allocation_sites_list_address()"); |
- Add(ExternalReference::address_of_uint32_bias().address(), |
- UNCLASSIFIED, |
- 60, |
- "uint32_bias"); |
- Add(ExternalReference::get_mark_code_as_executed_function(isolate).address(), |
- UNCLASSIFIED, |
- 61, |
- "Code::MarkCodeAsExecuted"); |
- |
- Add(ExternalReference::is_profiling_address(isolate).address(), |
- UNCLASSIFIED, |
- 62, |
- "CpuProfiler::is_profiling"); |
- |
- Add(ExternalReference::scheduled_exception_address(isolate).address(), |
- UNCLASSIFIED, |
- 63, |
- "Isolate::scheduled_exception"); |
- |
- Add(ExternalReference::invoke_function_callback(isolate).address(), |
- UNCLASSIFIED, |
- 64, |
- "InvokeFunctionCallback"); |
- |
- Add(ExternalReference::invoke_accessor_getter_callback(isolate).address(), |
- UNCLASSIFIED, |
- 65, |
- "InvokeAccessorGetterCallback"); |
- |
- // Debug addresses |
- Add(ExternalReference::debug_after_break_target_address(isolate).address(), |
- UNCLASSIFIED, |
- 66, |
- "Debug::after_break_target_address()"); |
- |
- Add(ExternalReference::debug_restarter_frame_function_pointer_address( |
- isolate).address(), |
- UNCLASSIFIED, |
- 67, |
- "Debug::restarter_frame_function_pointer_address()"); |
+ RUNTIME_ENTRY, 3, "StoreBuffer::StoreBufferOverflow"); |
// Add a small set of deopt entry addresses to encoder without generating the |
// deopt table code, which isn't possible at deserialization time. |