Line data Source code
1 : // Copyright 2016 the V8 project authors. All rights reserved.
2 : // Use of this source code is governed by a BSD-style license that can be
3 : // found in the LICENSE file.
4 :
5 : #include "src/external-reference-table.h"
6 :
7 : #include "src/accessors.h"
8 : #include "src/assembler.h"
9 : #include "src/builtins/builtins.h"
10 : #include "src/counters.h"
11 : #include "src/deoptimizer.h"
12 : #include "src/ic/stub-cache.h"
13 : #include "src/objects-inl.h"
14 :
15 : #if defined(DEBUG) && defined(V8_OS_LINUX) && !defined(V8_OS_ANDROID)
16 : #define SYMBOLIZE_FUNCTION
17 : #include <execinfo.h>
18 : #include <vector>
19 : #endif // DEBUG && V8_OS_LINUX && !V8_OS_ANDROID
20 :
21 : namespace v8 {
22 : namespace internal {
23 :
24 : // Forward declarations for C++ builtins.
25 : #define FORWARD_DECLARE(Name) \
26 : Object* Builtin_##Name(int argc, Object** args, Isolate* isolate);
27 : BUILTIN_LIST_C(FORWARD_DECLARE)
28 : #undef FORWARD_DECLARE
29 :
30 171149 : ExternalReferenceTable* ExternalReferenceTable::instance(Isolate* isolate) {
31 : ExternalReferenceTable* external_reference_table =
32 : isolate->external_reference_table();
33 171149 : if (external_reference_table == NULL) {
34 61044 : external_reference_table = new ExternalReferenceTable(isolate);
35 : isolate->set_external_reference_table(external_reference_table);
36 : }
37 171149 : return external_reference_table;
38 : }
39 :
40 61044 : ExternalReferenceTable::ExternalReferenceTable(Isolate* isolate) {
41 : // nullptr is preserved through serialization/deserialization.
42 : Add(nullptr, "nullptr");
43 61044 : AddReferences(isolate);
44 61044 : AddBuiltins(isolate);
45 61044 : AddRuntimeFunctions(isolate);
46 61044 : AddIsolateAddresses(isolate);
47 61044 : AddAccessors(isolate);
48 61044 : AddStubCache(isolate);
49 : // API references must be added last.
50 61044 : AddApiReferences(isolate);
51 61044 : }
52 :
53 59559 : ExternalReferenceTable::~ExternalReferenceTable() {
54 : #ifdef SYMBOLIZE_FUNCTION
55 : for (char** table : symbol_tables_) {
56 : free(table);
57 : }
58 : #endif
59 59559 : }
60 :
61 : #ifdef DEBUG
62 : void ExternalReferenceTable::ResetCount() {
63 : for (ExternalReferenceEntry& entry : refs_) entry.count = 0;
64 : }
65 :
66 : void ExternalReferenceTable::PrintCount() {
67 : for (int i = 0; i < refs_.length(); i++) {
68 : v8::base::OS::Print("index=%5d count=%5d %-60s\n", i, refs_[i].count,
69 : refs_[i].name);
70 : }
71 : }
72 : #endif // DEBUG
73 :
74 0 : const char* ExternalReferenceTable::ResolveSymbol(void* address,
75 : std::vector<char**>* tables) {
76 : #ifdef SYMBOLIZE_FUNCTION
77 : char** table = backtrace_symbols(&address, 1);
78 : if (tables) tables->push_back(table);
79 : return table[0];
80 : #else
81 0 : return "<unresolved>";
82 : #endif // SYMBOLIZE_FUNCTION
83 : }
84 :
85 61044 : void ExternalReferenceTable::AddReferences(Isolate* isolate) {
86 : // Miscellaneous
87 : Add(ExternalReference::roots_array_start(isolate).address(),
88 122088 : "Heap::roots_array_start()");
89 : Add(ExternalReference::address_of_stack_limit(isolate).address(),
90 122088 : "StackGuard::address_of_jslimit()");
91 : Add(ExternalReference::address_of_real_stack_limit(isolate).address(),
92 122088 : "StackGuard::address_of_real_jslimit()");
93 : Add(ExternalReference::new_space_allocation_limit_address(isolate).address(),
94 122088 : "Heap::NewSpaceAllocationLimitAddress()");
95 : Add(ExternalReference::new_space_allocation_top_address(isolate).address(),
96 122088 : "Heap::NewSpaceAllocationTopAddress()");
97 : Add(ExternalReference::mod_two_doubles_operation(isolate).address(),
98 122088 : "mod_two_doubles");
99 : Add(ExternalReference::handle_scope_next_address(isolate).address(),
100 122088 : "HandleScope::next");
101 : Add(ExternalReference::handle_scope_limit_address(isolate).address(),
102 122088 : "HandleScope::limit");
103 : Add(ExternalReference::handle_scope_level_address(isolate).address(),
104 122088 : "HandleScope::level");
105 : Add(ExternalReference::new_deoptimizer_function(isolate).address(),
106 122088 : "Deoptimizer::New()");
107 : Add(ExternalReference::compute_output_frames_function(isolate).address(),
108 122088 : "Deoptimizer::ComputeOutputFrames()");
109 : Add(ExternalReference::address_of_min_int().address(),
110 122088 : "LDoubleConstant::min_int");
111 : Add(ExternalReference::address_of_one_half().address(),
112 122088 : "LDoubleConstant::one_half");
113 122088 : Add(ExternalReference::isolate_address(isolate).address(), "isolate");
114 : Add(ExternalReference::interpreter_dispatch_table_address(isolate).address(),
115 122088 : "Interpreter::dispatch_table_address");
116 : Add(ExternalReference::address_of_negative_infinity().address(),
117 122088 : "LDoubleConstant::negative_infinity");
118 : Add(ExternalReference::power_double_double_function(isolate).address(),
119 122088 : "power_double_double_function");
120 : Add(ExternalReference::ieee754_acos_function(isolate).address(),
121 122088 : "base::ieee754::acos");
122 : Add(ExternalReference::ieee754_acosh_function(isolate).address(),
123 122088 : "base::ieee754::acosh");
124 : Add(ExternalReference::ieee754_asin_function(isolate).address(),
125 122088 : "base::ieee754::asin");
126 : Add(ExternalReference::ieee754_asinh_function(isolate).address(),
127 122088 : "base::ieee754::asinh");
128 : Add(ExternalReference::ieee754_atan_function(isolate).address(),
129 122088 : "base::ieee754::atan");
130 : Add(ExternalReference::ieee754_atanh_function(isolate).address(),
131 122088 : "base::ieee754::atanh");
132 : Add(ExternalReference::ieee754_atan2_function(isolate).address(),
133 122088 : "base::ieee754::atan2");
134 : Add(ExternalReference::ieee754_cbrt_function(isolate).address(),
135 122088 : "base::ieee754::cbrt");
136 : Add(ExternalReference::ieee754_cos_function(isolate).address(),
137 122088 : "base::ieee754::cos");
138 : Add(ExternalReference::ieee754_cosh_function(isolate).address(),
139 122088 : "base::ieee754::cosh");
140 : Add(ExternalReference::ieee754_exp_function(isolate).address(),
141 122088 : "base::ieee754::exp");
142 : Add(ExternalReference::ieee754_expm1_function(isolate).address(),
143 122088 : "base::ieee754::expm1");
144 : Add(ExternalReference::ieee754_log_function(isolate).address(),
145 122088 : "base::ieee754::log");
146 : Add(ExternalReference::ieee754_log1p_function(isolate).address(),
147 122088 : "base::ieee754::log1p");
148 : Add(ExternalReference::ieee754_log10_function(isolate).address(),
149 122088 : "base::ieee754::log10");
150 : Add(ExternalReference::ieee754_log2_function(isolate).address(),
151 122088 : "base::ieee754::log2");
152 : Add(ExternalReference::ieee754_sin_function(isolate).address(),
153 122088 : "base::ieee754::sin");
154 : Add(ExternalReference::ieee754_sinh_function(isolate).address(),
155 122088 : "base::ieee754::sinh");
156 : Add(ExternalReference::ieee754_tan_function(isolate).address(),
157 122088 : "base::ieee754::tan");
158 : Add(ExternalReference::ieee754_tanh_function(isolate).address(),
159 122088 : "base::ieee754::tanh");
160 : Add(ExternalReference::store_buffer_top(isolate).address(),
161 122088 : "store_buffer_top");
162 122088 : Add(ExternalReference::address_of_the_hole_nan().address(), "the_hole_nan");
163 : Add(ExternalReference::get_date_field_function(isolate).address(),
164 122088 : "JSDate::GetField");
165 : Add(ExternalReference::date_cache_stamp(isolate).address(),
166 122088 : "date_cache_stamp");
167 : Add(ExternalReference::address_of_pending_message_obj(isolate).address(),
168 122088 : "address_of_pending_message_obj");
169 : Add(ExternalReference::get_make_code_young_function(isolate).address(),
170 122088 : "Code::MakeCodeYoung");
171 122088 : Add(ExternalReference::cpu_features().address(), "cpu_features");
172 : Add(ExternalReference::old_space_allocation_top_address(isolate).address(),
173 122088 : "Heap::OldSpaceAllocationTopAddress");
174 : Add(ExternalReference::old_space_allocation_limit_address(isolate).address(),
175 122088 : "Heap::OldSpaceAllocationLimitAddress");
176 : Add(ExternalReference::allocation_sites_list_address(isolate).address(),
177 122088 : "Heap::allocation_sites_list_address()");
178 122088 : Add(ExternalReference::address_of_uint32_bias().address(), "uint32_bias");
179 : Add(ExternalReference::get_mark_code_as_executed_function(isolate).address(),
180 122088 : "Code::MarkCodeAsExecuted");
181 : Add(ExternalReference::is_profiling_address(isolate).address(),
182 122088 : "Isolate::is_profiling");
183 : Add(ExternalReference::scheduled_exception_address(isolate).address(),
184 122088 : "Isolate::scheduled_exception");
185 : Add(ExternalReference::invoke_function_callback(isolate).address(),
186 122088 : "InvokeFunctionCallback");
187 : Add(ExternalReference::invoke_accessor_getter_callback(isolate).address(),
188 122088 : "InvokeAccessorGetterCallback");
189 : Add(ExternalReference::wasm_f32_trunc(isolate).address(),
190 122088 : "wasm::f32_trunc_wrapper");
191 : Add(ExternalReference::wasm_f32_floor(isolate).address(),
192 122088 : "wasm::f32_floor_wrapper");
193 : Add(ExternalReference::wasm_f32_ceil(isolate).address(),
194 122088 : "wasm::f32_ceil_wrapper");
195 : Add(ExternalReference::wasm_f32_nearest_int(isolate).address(),
196 122088 : "wasm::f32_nearest_int_wrapper");
197 : Add(ExternalReference::wasm_f64_trunc(isolate).address(),
198 122088 : "wasm::f64_trunc_wrapper");
199 : Add(ExternalReference::wasm_f64_floor(isolate).address(),
200 122088 : "wasm::f64_floor_wrapper");
201 : Add(ExternalReference::wasm_f64_ceil(isolate).address(),
202 122088 : "wasm::f64_ceil_wrapper");
203 : Add(ExternalReference::wasm_f64_nearest_int(isolate).address(),
204 122088 : "wasm::f64_nearest_int_wrapper");
205 : Add(ExternalReference::wasm_int64_to_float32(isolate).address(),
206 122088 : "wasm::int64_to_float32_wrapper");
207 : Add(ExternalReference::wasm_uint64_to_float32(isolate).address(),
208 122088 : "wasm::uint64_to_float32_wrapper");
209 : Add(ExternalReference::wasm_int64_to_float64(isolate).address(),
210 122088 : "wasm::int64_to_float64_wrapper");
211 : Add(ExternalReference::wasm_uint64_to_float64(isolate).address(),
212 122088 : "wasm::uint64_to_float64_wrapper");
213 : Add(ExternalReference::wasm_float32_to_int64(isolate).address(),
214 122088 : "wasm::float32_to_int64_wrapper");
215 : Add(ExternalReference::wasm_float32_to_uint64(isolate).address(),
216 122088 : "wasm::float32_to_uint64_wrapper");
217 : Add(ExternalReference::wasm_float64_to_int64(isolate).address(),
218 122088 : "wasm::float64_to_int64_wrapper");
219 : Add(ExternalReference::wasm_float64_to_uint64(isolate).address(),
220 122088 : "wasm::float64_to_uint64_wrapper");
221 : Add(ExternalReference::wasm_float64_pow(isolate).address(),
222 122088 : "wasm::float64_pow");
223 122088 : Add(ExternalReference::wasm_int64_div(isolate).address(), "wasm::int64_div");
224 122088 : Add(ExternalReference::wasm_int64_mod(isolate).address(), "wasm::int64_mod");
225 : Add(ExternalReference::wasm_uint64_div(isolate).address(),
226 122088 : "wasm::uint64_div");
227 : Add(ExternalReference::wasm_uint64_mod(isolate).address(),
228 122088 : "wasm::uint64_mod");
229 : Add(ExternalReference::wasm_word32_ctz(isolate).address(),
230 122088 : "wasm::word32_ctz");
231 : Add(ExternalReference::wasm_word64_ctz(isolate).address(),
232 122088 : "wasm::word64_ctz");
233 : Add(ExternalReference::wasm_word32_popcnt(isolate).address(),
234 122088 : "wasm::word32_popcnt");
235 : Add(ExternalReference::wasm_word64_popcnt(isolate).address(),
236 122088 : "wasm::word64_popcnt");
237 : Add(ExternalReference::f64_acos_wrapper_function(isolate).address(),
238 122088 : "f64_acos_wrapper");
239 : Add(ExternalReference::f64_asin_wrapper_function(isolate).address(),
240 122088 : "f64_asin_wrapper");
241 : Add(ExternalReference::f64_mod_wrapper_function(isolate).address(),
242 122088 : "f64_mod_wrapper");
243 : Add(ExternalReference::wasm_call_trap_callback_for_testing(isolate).address(),
244 122088 : "wasm::call_trap_callback_for_testing");
245 : Add(ExternalReference::libc_memchr_function(isolate).address(),
246 122088 : "libc_memchr");
247 : Add(ExternalReference::libc_memcpy_function(isolate).address(),
248 122088 : "libc_memcpy");
249 : Add(ExternalReference::libc_memset_function(isolate).address(),
250 122088 : "libc_memset");
251 : Add(ExternalReference::try_internalize_string_function(isolate).address(),
252 122088 : "try_internalize_string_function");
253 : Add(ExternalReference::search_string_raw<const uint8_t, const uint8_t>(
254 : isolate)
255 : .address(),
256 122088 : "search_string_raw<1-byte, 1-byte>");
257 : Add(ExternalReference::search_string_raw<const uint8_t, const uc16>(isolate)
258 : .address(),
259 122088 : "search_string_raw<1-byte, 2-byte>");
260 : Add(ExternalReference::search_string_raw<const uc16, const uint8_t>(isolate)
261 : .address(),
262 122088 : "search_string_raw<2-byte, 1-byte>");
263 : Add(ExternalReference::search_string_raw<const uc16, const uc16>(isolate)
264 : .address(),
265 122088 : "search_string_raw<1-byte, 2-byte>");
266 : Add(ExternalReference::log_enter_external_function(isolate).address(),
267 122088 : "Logger::EnterExternal");
268 : Add(ExternalReference::log_leave_external_function(isolate).address(),
269 122088 : "Logger::LeaveExternal");
270 : Add(ExternalReference::address_of_minus_one_half().address(),
271 122088 : "double_constants.minus_one_half");
272 : Add(ExternalReference::stress_deopt_count(isolate).address(),
273 122088 : "Isolate::stress_deopt_count_address()");
274 : Add(ExternalReference::runtime_function_table_address(isolate).address(),
275 122088 : "Runtime::runtime_function_table_address()");
276 : Add(ExternalReference::is_tail_call_elimination_enabled_address(isolate)
277 : .address(),
278 122088 : "Isolate::is_tail_call_elimination_enabled_address()");
279 : Add(ExternalReference::address_of_float_abs_constant().address(),
280 122088 : "float_absolute_constant");
281 : Add(ExternalReference::address_of_float_neg_constant().address(),
282 122088 : "float_negate_constant");
283 : Add(ExternalReference::address_of_double_abs_constant().address(),
284 122088 : "double_absolute_constant");
285 : Add(ExternalReference::address_of_double_neg_constant().address(),
286 122088 : "double_negate_constant");
287 : Add(ExternalReference::promise_hook_or_debug_is_active_address(isolate)
288 : .address(),
289 122088 : "Isolate::promise_hook_or_debug_is_active_address()");
290 :
291 : // Debug addresses
292 : Add(ExternalReference::debug_is_active_address(isolate).address(),
293 122088 : "Debug::is_active_address()");
294 : Add(ExternalReference::debug_hook_on_function_call_address(isolate).address(),
295 122088 : "Debug::hook_on_function_call_address()");
296 : Add(ExternalReference::debug_last_step_action_address(isolate).address(),
297 122088 : "Debug::step_in_enabled_address()");
298 : Add(ExternalReference::debug_suspended_generator_address(isolate).address(),
299 122088 : "Debug::step_suspended_generator_address()");
300 : Add(ExternalReference::debug_restart_fp_address(isolate).address(),
301 122088 : "Debug::restart_fp_address()");
302 :
303 : Add(ExternalReference::address_of_regexp_dotall_flag(isolate).address(),
304 122088 : "FLAG_harmony_regexp_dotall");
305 :
306 : #ifndef V8_INTERPRETED_REGEXP
307 : Add(ExternalReference::re_case_insensitive_compare_uc16(isolate).address(),
308 122088 : "NativeRegExpMacroAssembler::CaseInsensitiveCompareUC16()");
309 : Add(ExternalReference::re_check_stack_guard_state(isolate).address(),
310 122088 : "RegExpMacroAssembler*::CheckStackGuardState()");
311 : Add(ExternalReference::re_grow_stack(isolate).address(),
312 122088 : "NativeRegExpMacroAssembler::GrowStack()");
313 : Add(ExternalReference::re_word_character_map().address(),
314 122088 : "NativeRegExpMacroAssembler::word_character_map");
315 : Add(ExternalReference::address_of_regexp_stack_limit(isolate).address(),
316 122088 : "RegExpStack::limit_address()");
317 : Add(ExternalReference::address_of_regexp_stack_memory_address(isolate)
318 : .address(),
319 122088 : "RegExpStack::memory_address()");
320 : Add(ExternalReference::address_of_regexp_stack_memory_size(isolate).address(),
321 122088 : "RegExpStack::memory_size()");
322 : Add(ExternalReference::address_of_static_offsets_vector(isolate).address(),
323 122088 : "OffsetsVector::static_offsets_vector");
324 : #endif // V8_INTERPRETED_REGEXP
325 :
326 : // Runtime entries
327 : Add(ExternalReference::delete_handle_scope_extensions(isolate).address(),
328 122088 : "HandleScope::DeleteExtensions");
329 : Add(ExternalReference::incremental_marking_record_write_function(isolate)
330 : .address(),
331 122088 : "IncrementalMarking::RecordWrite");
332 : Add(ExternalReference::incremental_marking_record_write_code_entry_function(
333 : isolate)
334 : .address(),
335 122088 : "IncrementalMarking::RecordWriteOfCodeEntryFromCode");
336 : Add(ExternalReference::store_buffer_overflow_function(isolate).address(),
337 122088 : "StoreBuffer::StoreBufferOverflow");
338 61044 : }
339 :
340 61044 : void ExternalReferenceTable::AddBuiltins(Isolate* isolate) {
341 : struct CBuiltinEntry {
342 : Address address;
343 : const char* name;
344 : };
345 : static const CBuiltinEntry c_builtins[] = {
346 : #define DEF_ENTRY(Name, ...) {FUNCTION_ADDR(&Builtin_##Name), "Builtin_" #Name},
347 : BUILTIN_LIST_C(DEF_ENTRY)
348 : #undef DEF_ENTRY
349 : };
350 13979076 : for (unsigned i = 0; i < arraysize(c_builtins); ++i) {
351 : Add(ExternalReference(c_builtins[i].address, isolate).address(),
352 27836064 : c_builtins[i].name);
353 : }
354 :
355 : struct BuiltinEntry {
356 : Builtins::Name id;
357 : const char* name;
358 : };
359 : static const BuiltinEntry builtins[] = {
360 : #define DEF_ENTRY(Name, ...) {Builtins::k##Name, "Builtin_" #Name},
361 : BUILTIN_LIST_C(DEF_ENTRY) BUILTIN_LIST_A(DEF_ENTRY)
362 : #undef DEF_ENTRY
363 : };
364 19350890 : for (unsigned i = 0; i < arraysize(builtins); ++i) {
365 19350890 : Add(isolate->builtins()->builtin_address(builtins[i].id), builtins[i].name);
366 : }
367 61044 : }
368 :
369 61043 : void ExternalReferenceTable::AddRuntimeFunctions(Isolate* isolate) {
370 : struct RuntimeEntry {
371 : Runtime::FunctionId id;
372 : const char* name;
373 : };
374 :
375 : static const RuntimeEntry runtime_functions[] = {
376 : #define RUNTIME_ENTRY(name, i1, i2) {Runtime::k##name, "Runtime::" #name},
377 : FOR_EACH_INTRINSIC(RUNTIME_ENTRY)
378 : #undef RUNTIME_ENTRY
379 : };
380 :
381 35161099 : for (unsigned i = 0; i < arraysize(runtime_functions); ++i) {
382 35100055 : ExternalReference ref(runtime_functions[i].id, isolate);
383 35100055 : Add(ref.address(), runtime_functions[i].name);
384 : }
385 61044 : }
386 :
387 61044 : void ExternalReferenceTable::AddIsolateAddresses(Isolate* isolate) {
388 : // Top addresses
389 : static const char* address_names[] = {
390 : #define BUILD_NAME_LITERAL(Name, name) "Isolate::" #name "_address",
391 : FOR_EACH_ISOLATE_ADDRESS_NAME(BUILD_NAME_LITERAL) NULL
392 : #undef BUILD_NAME_LITERAL
393 : };
394 :
395 793572 : for (int i = 0; i < Isolate::kIsolateAddressCount; ++i) {
396 : Add(isolate->get_address_from_id(static_cast<Isolate::AddressId>(i)),
397 732528 : address_names[i]);
398 : }
399 61044 : }
400 :
401 61044 : void ExternalReferenceTable::AddAccessors(Isolate* isolate) {
402 : // Accessors
403 : struct AccessorRefTable {
404 : Address address;
405 : const char* name;
406 : };
407 :
408 : static const AccessorRefTable getters[] = {
409 : #define ACCESSOR_INFO_DECLARATION(name) \
410 : {FUNCTION_ADDR(&Accessors::name##Getter), "Accessors::" #name "Getter"},
411 : ACCESSOR_INFO_LIST(ACCESSOR_INFO_DECLARATION)
412 : #undef ACCESSOR_INFO_DECLARATION
413 : };
414 : static const AccessorRefTable setters[] = {
415 : #define ACCESSOR_SETTER_DECLARATION(name) \
416 : { FUNCTION_ADDR(&Accessors::name), "Accessors::" #name},
417 : ACCESSOR_SETTER_LIST(ACCESSOR_SETTER_DECLARATION)
418 : #undef ACCESSOR_INFO_DECLARATION
419 : };
420 :
421 1526100 : for (unsigned i = 0; i < arraysize(getters); ++i) {
422 1465056 : Add(getters[i].address, getters[i].name);
423 : }
424 :
425 305220 : for (unsigned i = 0; i < arraysize(setters); ++i) {
426 305220 : Add(setters[i].address, setters[i].name);
427 : }
428 61044 : }
429 :
430 122088 : void ExternalReferenceTable::AddStubCache(Isolate* isolate) {
431 : StubCache* load_stub_cache = isolate->load_stub_cache();
432 :
433 : // Stub cache tables
434 : Add(load_stub_cache->key_reference(StubCache::kPrimary).address(),
435 : "Load StubCache::primary_->key");
436 : Add(load_stub_cache->value_reference(StubCache::kPrimary).address(),
437 : "Load StubCache::primary_->value");
438 : Add(load_stub_cache->map_reference(StubCache::kPrimary).address(),
439 : "Load StubCache::primary_->map");
440 : Add(load_stub_cache->key_reference(StubCache::kSecondary).address(),
441 : "Load StubCache::secondary_->key");
442 : Add(load_stub_cache->value_reference(StubCache::kSecondary).address(),
443 : "Load StubCache::secondary_->value");
444 : Add(load_stub_cache->map_reference(StubCache::kSecondary).address(),
445 : "Load StubCache::secondary_->map");
446 :
447 : StubCache* store_stub_cache = isolate->store_stub_cache();
448 :
449 : // Stub cache tables
450 : Add(store_stub_cache->key_reference(StubCache::kPrimary).address(),
451 : "Store StubCache::primary_->key");
452 : Add(store_stub_cache->value_reference(StubCache::kPrimary).address(),
453 : "Store StubCache::primary_->value");
454 : Add(store_stub_cache->map_reference(StubCache::kPrimary).address(),
455 : "Store StubCache::primary_->map");
456 : Add(store_stub_cache->key_reference(StubCache::kSecondary).address(),
457 : "Store StubCache::secondary_->key");
458 : Add(store_stub_cache->value_reference(StubCache::kSecondary).address(),
459 : "Store StubCache::secondary_->value");
460 : Add(store_stub_cache->map_reference(StubCache::kSecondary).address(),
461 : "Store StubCache::secondary_->map");
462 61044 : }
463 :
464 122088 : void ExternalReferenceTable::AddApiReferences(Isolate* isolate) {
465 : // Add external references provided by the embedder (a null-terminated
466 : // array).
467 61044 : api_refs_start_ = size();
468 : intptr_t* api_external_references = isolate->api_external_references();
469 61044 : if (api_external_references != nullptr) {
470 420 : while (*api_external_references != 0) {
471 360 : Address address = reinterpret_cast<Address>(*api_external_references);
472 : #ifdef SYMBOLIZE_FUNCTION
473 : Add(address, ResolveSymbol(address, &symbol_tables_));
474 : #else
475 : Add(address, ResolveSymbol(address));
476 : #endif
477 360 : api_external_references++;
478 : }
479 : }
480 61044 : }
481 :
482 : } // namespace internal
483 : } // namespace v8
|