Bug Summary

File:out/../deps/v8/src/wasm/wasm-serialization.cc
Warning:line 692, column 21
Moved-from object 'batch' of type 'std::vector' is moved

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-unknown-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name wasm-serialization.cc -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -relaxed-aliasing -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/home/maurizio/node-v18.6.0/out -resource-dir /usr/local/lib/clang/16.0.0 -D _GLIBCXX_USE_CXX11_ABI=1 -D NODE_OPENSSL_CONF_NAME=nodejs_conf -D NODE_OPENSSL_HAS_QUIC -D V8_GYP_BUILD -D V8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -D __STDC_FORMAT_MACROS -D OPENSSL_NO_PINSHARED -D OPENSSL_THREADS -D V8_TARGET_ARCH_X64 -D V8_HAVE_TARGET_OS -D V8_TARGET_OS_LINUX -D V8_EMBEDDER_STRING="-node.8" -D ENABLE_DISASSEMBLER -D V8_PROMISE_INTERNAL_FIELD_COUNT=1 -D V8_SHORT_BUILTIN_CALLS -D OBJECT_PRINT -D V8_INTL_SUPPORT -D V8_ATOMIC_OBJECT_FIELD_WRITES -D V8_ENABLE_LAZY_SOURCE_POSITIONS -D V8_USE_SIPHASH -D V8_SHARED_RO_HEAP -D V8_WIN64_UNWINDING_INFO -D V8_ENABLE_REGEXP_INTERPRETER_THREADED_DISPATCH -D V8_SNAPSHOT_COMPRESSION -D V8_ENABLE_WEBASSEMBLY -D V8_ENABLE_JAVASCRIPT_PROMISE_HOOKS -D V8_ALLOCATION_FOLDING -D V8_ALLOCATION_SITE_TRACKING -D V8_SCRIPTORMODULE_LEGACY_LIFETIME -D V8_ADVANCED_BIGINT_ALGORITHMS -D ICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_STATIC -D UCONFIG_NO_SERVICE=1 -D U_ENABLE_DYLOAD=0 -D U_STATIC_IMPLEMENTATION=1 -D U_HAVE_STD_STRING=1 -D UCONFIG_NO_BREAK_ITERATION=0 -I ../deps/v8 -I ../deps/v8/include -I /home/maurizio/node-v18.6.0/out/Release/obj/gen/inspector-generated-output-root -I ../deps/v8/third_party/inspector_protocol -I /home/maurizio/node-v18.6.0/out/Release/obj/gen -I /home/maurizio/node-v18.6.0/out/Release/obj/gen/generate-bytecode-output-root -I ../deps/icu-small/source/i18n -I ../deps/icu-small/source/common -I ../deps/v8/third_party/zlib -I ../deps/v8/third_party/zlib/google -internal-isystem /usr/lib/gcc/x86_64-redhat-linux/8/../../../../include/c++/8 -internal-isystem /usr/lib/gcc/x86_64-redhat-linux/8/../../../../include/c++/8/x86_64-redhat-linux -internal-isystem /usr/lib/gcc/x86_64-redhat-linux/8/../../../../include/c++/8/backward -internal-isystem /usr/local/lib/clang/16.0.0/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-redhat-linux/8/../../../../x86_64-redhat-linux/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -O3 -Wno-unused-parameter -Wno-return-type -std=gnu++17 -fdeprecated-macro -fdebug-compilation-dir=/home/maurizio/node-v18.6.0/out -ferror-limit 19 -fno-rtti -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /tmp/scan-build-2022-08-22-142216-507842-1 -x c++ ../deps/v8/src/wasm/wasm-serialization.cc
1// Copyright 2017 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/wasm/wasm-serialization.h"
6
7#include "src/base/platform/wrappers.h"
8#include "src/codegen/assembler-inl.h"
9#include "src/codegen/external-reference-table.h"
10#include "src/objects/objects-inl.h"
11#include "src/objects/objects.h"
12#include "src/runtime/runtime.h"
13#include "src/snapshot/code-serializer.h"
14#include "src/utils/ostreams.h"
15#include "src/utils/utils.h"
16#include "src/utils/version.h"
17#include "src/wasm/code-space-access.h"
18#include "src/wasm/function-compiler.h"
19#include "src/wasm/module-compiler.h"
20#include "src/wasm/module-decoder.h"
21#include "src/wasm/wasm-code-manager.h"
22#include "src/wasm/wasm-engine.h"
23#include "src/wasm/wasm-module.h"
24#include "src/wasm/wasm-objects-inl.h"
25#include "src/wasm/wasm-objects.h"
26#include "src/wasm/wasm-result.h"
27
28namespace v8 {
29namespace internal {
30namespace wasm {
31
32namespace {
33constexpr uint8_t kLazyFunction = 2;
34constexpr uint8_t kLiftoffFunction = 3;
35constexpr uint8_t kTurboFanFunction = 4;
36
37// TODO(bbudge) Try to unify the various implementations of readers and writers
38// in Wasm, e.g. StreamProcessor and ZoneBuffer, with these.
39class Writer {
40 public:
41 explicit Writer(base::Vector<byte> buffer)
42 : start_(buffer.begin()), end_(buffer.end()), pos_(buffer.begin()) {}
43
44 size_t bytes_written() const { return pos_ - start_; }
45 byte* current_location() const { return pos_; }
46 size_t current_size() const { return end_ - pos_; }
47 base::Vector<byte> current_buffer() const {
48 return {current_location(), current_size()};
49 }
50
51 template <typename T>
52 void Write(const T& value) {
53 DCHECK_GE(current_size(), sizeof(T))((void) 0);
54 WriteUnalignedValue(reinterpret_cast<Address>(current_location()), value);
55 pos_ += sizeof(T);
56 if (FLAG_trace_wasm_serialization) {
57 StdoutStream{} << "wrote: " << static_cast<size_t>(value)
58 << " sized: " << sizeof(T) << std::endl;
59 }
60 }
61
62 void WriteVector(const base::Vector<const byte> v) {
63 DCHECK_GE(current_size(), v.size())((void) 0);
64 if (v.size() > 0) {
65 memcpy(current_location(), v.begin(), v.size());
66 pos_ += v.size();
67 }
68 if (FLAG_trace_wasm_serialization) {
69 StdoutStream{} << "wrote vector of " << v.size() << " elements"
70 << std::endl;
71 }
72 }
73
74 void Skip(size_t size) { pos_ += size; }
75
76 private:
77 byte* const start_;
78 byte* const end_;
79 byte* pos_;
80};
81
82class Reader {
83 public:
84 explicit Reader(base::Vector<const byte> buffer)
85 : start_(buffer.begin()), end_(buffer.end()), pos_(buffer.begin()) {}
86
87 size_t bytes_read() const { return pos_ - start_; }
88 const byte* current_location() const { return pos_; }
89 size_t current_size() const { return end_ - pos_; }
90 base::Vector<const byte> current_buffer() const {
91 return {current_location(), current_size()};
92 }
93
94 template <typename T>
95 T Read() {
96 DCHECK_GE(current_size(), sizeof(T))((void) 0);
97 T value =
98 ReadUnalignedValue<T>(reinterpret_cast<Address>(current_location()));
99 pos_ += sizeof(T);
100 if (FLAG_trace_wasm_serialization) {
101 StdoutStream{} << "read: " << static_cast<size_t>(value)
102 << " sized: " << sizeof(T) << std::endl;
103 }
104 return value;
105 }
106
107 template <typename T>
108 base::Vector<const T> ReadVector(size_t size) {
109 DCHECK_GE(current_size(), size)((void) 0);
110 base::Vector<const byte> bytes{pos_, size * sizeof(T)};
111 pos_ += size * sizeof(T);
112 if (FLAG_trace_wasm_serialization) {
113 StdoutStream{} << "read vector of " << size << " elements of size "
114 << sizeof(T) << " (total size " << size * sizeof(T) << ")"
115 << std::endl;
116 }
117 return base::Vector<const T>::cast(bytes);
118 }
119
120 void Skip(size_t size) { pos_ += size; }
121
122 private:
123 const byte* const start_;
124 const byte* const end_;
125 const byte* pos_;
126};
127
128void WriteHeader(Writer* writer) {
129 writer->Write(SerializedData::kMagicNumber);
130 writer->Write(Version::Hash());
131 writer->Write(static_cast<uint32_t>(CpuFeatures::SupportedFeatures()));
132 writer->Write(FlagList::Hash());
133 DCHECK_EQ(WasmSerializer::kHeaderSize, writer->bytes_written())((void) 0);
134}
135
136// On Intel, call sites are encoded as a displacement. For linking and for
137// serialization/deserialization, we want to store/retrieve a tag (the function
138// index). On Intel, that means accessing the raw displacement.
139// On ARM64, call sites are encoded as either a literal load or a direct branch.
140// Other platforms simply require accessing the target address.
141void SetWasmCalleeTag(RelocInfo* rinfo, uint32_t tag) {
142#if V8_TARGET_ARCH_X641 || V8_TARGET_ARCH_IA32
143 DCHECK(rinfo->HasTargetAddressAddress())((void) 0);
144 DCHECK(!RelocInfo::IsCompressedEmbeddedObject(rinfo->rmode()))((void) 0);
145 WriteUnalignedValue(rinfo->target_address_address(), tag);
146#elif V8_TARGET_ARCH_ARM64
147 Instruction* instr = reinterpret_cast<Instruction*>(rinfo->pc());
148 if (instr->IsLdrLiteralX()) {
149 WriteUnalignedValue(rinfo->constant_pool_entry_address(),
150 static_cast<Address>(tag));
151 } else {
152 DCHECK(instr->IsBranchAndLink() || instr->IsUnconditionalBranch())((void) 0);
153 instr->SetBranchImmTarget(
154 reinterpret_cast<Instruction*>(rinfo->pc() + tag * kInstrSize));
155 }
156#else
157 Address addr = static_cast<Address>(tag);
158 if (rinfo->rmode() == RelocInfo::EXTERNAL_REFERENCE) {
159 rinfo->set_target_external_reference(addr, SKIP_ICACHE_FLUSH);
160 } else if (rinfo->rmode() == RelocInfo::WASM_STUB_CALL) {
161 rinfo->set_wasm_stub_call_address(addr, SKIP_ICACHE_FLUSH);
162 } else {
163 rinfo->set_target_address(addr, SKIP_WRITE_BARRIER, SKIP_ICACHE_FLUSH);
164 }
165#endif
166}
167
168uint32_t GetWasmCalleeTag(RelocInfo* rinfo) {
169#if V8_TARGET_ARCH_X641 || V8_TARGET_ARCH_IA32
170 DCHECK(!RelocInfo::IsCompressedEmbeddedObject(rinfo->rmode()))((void) 0);
171 return ReadUnalignedValue<uint32_t>(rinfo->target_address_address());
172#elif V8_TARGET_ARCH_ARM64
173 Instruction* instr = reinterpret_cast<Instruction*>(rinfo->pc());
174 if (instr->IsLdrLiteralX()) {
175 return ReadUnalignedValue<uint32_t>(rinfo->constant_pool_entry_address());
176 } else {
177 DCHECK(instr->IsBranchAndLink() || instr->IsUnconditionalBranch())((void) 0);
178 return static_cast<uint32_t>(instr->ImmPCOffset() / kInstrSize);
179 }
180#else
181 Address addr;
182 if (rinfo->rmode() == RelocInfo::EXTERNAL_REFERENCE) {
183 addr = rinfo->target_external_reference();
184 } else if (rinfo->rmode() == RelocInfo::WASM_STUB_CALL) {
185 addr = rinfo->wasm_stub_call_address();
186 } else {
187 addr = rinfo->target_address();
188 }
189 return static_cast<uint32_t>(addr);
190#endif
191}
192
193constexpr size_t kHeaderSize = sizeof(size_t); // total code size
194
195constexpr size_t kCodeHeaderSize = sizeof(uint8_t) + // code kind
196 sizeof(int) + // offset of constant pool
197 sizeof(int) + // offset of safepoint table
198 sizeof(int) + // offset of handler table
199 sizeof(int) + // offset of code comments
200 sizeof(int) + // unpadded binary size
201 sizeof(int) + // stack slots
202 sizeof(int) + // tagged parameter slots
203 sizeof(int) + // code size
204 sizeof(int) + // reloc size
205 sizeof(int) + // source positions size
206 sizeof(int) + // protected instructions size
207 sizeof(WasmCode::Kind) + // code kind
208 sizeof(ExecutionTier); // tier
209
210// A List of all isolate-independent external references. This is used to create
211// a tag from the Address of an external reference and vice versa.
212class ExternalReferenceList {
213 public:
214 ExternalReferenceList(const ExternalReferenceList&) = delete;
215 ExternalReferenceList& operator=(const ExternalReferenceList&) = delete;
216
217 uint32_t tag_from_address(Address ext_ref_address) const {
218 auto tag_addr_less_than = [this](uint32_t tag, Address searched_addr) {
219 return external_reference_by_tag_[tag] < searched_addr;
220 };
221 auto it = std::lower_bound(std::begin(tags_ordered_by_address_),
222 std::end(tags_ordered_by_address_),
223 ext_ref_address, tag_addr_less_than);
224 DCHECK_NE(std::end(tags_ordered_by_address_), it)((void) 0);
225 uint32_t tag = *it;
226 DCHECK_EQ(address_from_tag(tag), ext_ref_address)((void) 0);
227 return tag;
228 }
229
230 Address address_from_tag(uint32_t tag) const {
231 DCHECK_GT(kNumExternalReferences, tag)((void) 0);
232 return external_reference_by_tag_[tag];
233 }
234
235 static const ExternalReferenceList& Get() {
236 static ExternalReferenceList list; // Lazily initialized.
237 return list;
238 }
239
240 private:
241 // Private constructor. There will only be a single instance of this object.
242 ExternalReferenceList() {
243 for (uint32_t i = 0; i < kNumExternalReferences; ++i) {
244 tags_ordered_by_address_[i] = i;
245 }
246 auto addr_by_tag_less_than = [this](uint32_t a, uint32_t b) {
247 return external_reference_by_tag_[a] < external_reference_by_tag_[b];
248 };
249 std::sort(std::begin(tags_ordered_by_address_),
250 std::end(tags_ordered_by_address_), addr_by_tag_less_than);
251 }
252
253#define COUNT_EXTERNAL_REFERENCE(name, ...) +1
254 static constexpr uint32_t kNumExternalReferencesList =
255 EXTERNAL_REFERENCE_LIST(COUNT_EXTERNAL_REFERENCE)COUNT_EXTERNAL_REFERENCE(abort_with_reason, "abort_with_reason"
) COUNT_EXTERNAL_REFERENCE(address_of_builtin_subclassing_flag
, "FLAG_builtin_subclassing") COUNT_EXTERNAL_REFERENCE(address_of_double_abs_constant
, "double_absolute_constant") COUNT_EXTERNAL_REFERENCE(address_of_double_neg_constant
, "double_negate_constant") COUNT_EXTERNAL_REFERENCE(address_of_enable_experimental_regexp_engine
, "address_of_enable_experimental_regexp_engine") COUNT_EXTERNAL_REFERENCE
(address_of_float_abs_constant, "float_absolute_constant") COUNT_EXTERNAL_REFERENCE
(address_of_float_neg_constant, "float_negate_constant") COUNT_EXTERNAL_REFERENCE
(address_of_min_int, "LDoubleConstant::min_int") COUNT_EXTERNAL_REFERENCE
(address_of_mock_arraybuffer_allocator_flag, "FLAG_mock_arraybuffer_allocator"
) COUNT_EXTERNAL_REFERENCE(address_of_one_half, "LDoubleConstant::one_half"
) COUNT_EXTERNAL_REFERENCE(address_of_runtime_stats_flag, "TracingFlags::runtime_stats"
) COUNT_EXTERNAL_REFERENCE(address_of_shared_string_table_flag
, "FLAG_shared_string_table") COUNT_EXTERNAL_REFERENCE(address_of_the_hole_nan
, "the_hole_nan") COUNT_EXTERNAL_REFERENCE(address_of_uint32_bias
, "uint32_bias") COUNT_EXTERNAL_REFERENCE(baseline_pc_for_bytecode_offset
, "BaselinePCForBytecodeOffset") COUNT_EXTERNAL_REFERENCE(baseline_pc_for_next_executed_bytecode
, "BaselinePCForNextExecutedBytecode") COUNT_EXTERNAL_REFERENCE
(bytecode_size_table_address, "Bytecodes::bytecode_size_table_address"
) COUNT_EXTERNAL_REFERENCE(check_object_type, "check_object_type"
) COUNT_EXTERNAL_REFERENCE(compute_integer_hash, "ComputeSeededHash"
) COUNT_EXTERNAL_REFERENCE(compute_output_frames_function, "Deoptimizer::ComputeOutputFrames()"
) COUNT_EXTERNAL_REFERENCE(copy_fast_number_jsarray_elements_to_typed_array
, "copy_fast_number_jsarray_elements_to_typed_array") COUNT_EXTERNAL_REFERENCE
(copy_typed_array_elements_slice, "copy_typed_array_elements_slice"
) COUNT_EXTERNAL_REFERENCE(copy_typed_array_elements_to_typed_array
, "copy_typed_array_elements_to_typed_array") COUNT_EXTERNAL_REFERENCE
(cpu_features, "cpu_features") COUNT_EXTERNAL_REFERENCE(delete_handle_scope_extensions
, "HandleScope::DeleteExtensions") COUNT_EXTERNAL_REFERENCE(ephemeron_key_write_barrier_function
, "Heap::EphemeronKeyWriteBarrierFromCode") COUNT_EXTERNAL_REFERENCE
(f64_acos_wrapper_function, "f64_acos_wrapper") COUNT_EXTERNAL_REFERENCE
(f64_asin_wrapper_function, "f64_asin_wrapper") COUNT_EXTERNAL_REFERENCE
(f64_mod_wrapper_function, "f64_mod_wrapper") COUNT_EXTERNAL_REFERENCE
(get_date_field_function, "JSDate::GetField") COUNT_EXTERNAL_REFERENCE
(get_or_create_hash_raw, "get_or_create_hash_raw") COUNT_EXTERNAL_REFERENCE
(gsab_byte_length, "GsabByteLength") COUNT_EXTERNAL_REFERENCE
(ieee754_acos_function, "base::ieee754::acos") COUNT_EXTERNAL_REFERENCE
(ieee754_acosh_function, "base::ieee754::acosh") COUNT_EXTERNAL_REFERENCE
(ieee754_asin_function, "base::ieee754::asin") COUNT_EXTERNAL_REFERENCE
(ieee754_asinh_function, "base::ieee754::asinh") COUNT_EXTERNAL_REFERENCE
(ieee754_atan_function, "base::ieee754::atan") COUNT_EXTERNAL_REFERENCE
(ieee754_atan2_function, "base::ieee754::atan2") COUNT_EXTERNAL_REFERENCE
(ieee754_atanh_function, "base::ieee754::atanh") COUNT_EXTERNAL_REFERENCE
(ieee754_cbrt_function, "base::ieee754::cbrt") COUNT_EXTERNAL_REFERENCE
(ieee754_cos_function, "base::ieee754::cos") COUNT_EXTERNAL_REFERENCE
(ieee754_cosh_function, "base::ieee754::cosh") COUNT_EXTERNAL_REFERENCE
(ieee754_exp_function, "base::ieee754::exp") COUNT_EXTERNAL_REFERENCE
(ieee754_expm1_function, "base::ieee754::expm1") COUNT_EXTERNAL_REFERENCE
(ieee754_log_function, "base::ieee754::log") COUNT_EXTERNAL_REFERENCE
(ieee754_log10_function, "base::ieee754::log10") COUNT_EXTERNAL_REFERENCE
(ieee754_log1p_function, "base::ieee754::log1p") COUNT_EXTERNAL_REFERENCE
(ieee754_log2_function, "base::ieee754::log2") COUNT_EXTERNAL_REFERENCE
(ieee754_pow_function, "base::ieee754::pow") COUNT_EXTERNAL_REFERENCE
(ieee754_sin_function, "base::ieee754::sin") COUNT_EXTERNAL_REFERENCE
(ieee754_sinh_function, "base::ieee754::sinh") COUNT_EXTERNAL_REFERENCE
(ieee754_tan_function, "base::ieee754::tan") COUNT_EXTERNAL_REFERENCE
(ieee754_tanh_function, "base::ieee754::tanh") COUNT_EXTERNAL_REFERENCE
(insert_remembered_set_function, "Heap::InsertIntoRememberedSetFromCode"
) COUNT_EXTERNAL_REFERENCE(invalidate_prototype_chains_function
, "JSObject::InvalidatePrototypeChains()") COUNT_EXTERNAL_REFERENCE
(invoke_accessor_getter_callback, "InvokeAccessorGetterCallback"
) COUNT_EXTERNAL_REFERENCE(invoke_function_callback, "InvokeFunctionCallback"
) COUNT_EXTERNAL_REFERENCE(jsarray_array_join_concat_to_sequential_string
, "jsarray_array_join_concat_to_sequential_string") COUNT_EXTERNAL_REFERENCE
(jsreceiver_create_identity_hash, "jsreceiver_create_identity_hash"
) COUNT_EXTERNAL_REFERENCE(libc_memchr_function, "libc_memchr"
) COUNT_EXTERNAL_REFERENCE(libc_memcpy_function, "libc_memcpy"
) COUNT_EXTERNAL_REFERENCE(libc_memmove_function, "libc_memmove"
) COUNT_EXTERNAL_REFERENCE(libc_memset_function, "libc_memset"
) COUNT_EXTERNAL_REFERENCE(relaxed_memcpy_function, "relaxed_memcpy"
) COUNT_EXTERNAL_REFERENCE(relaxed_memmove_function, "relaxed_memmove"
) COUNT_EXTERNAL_REFERENCE(mod_two_doubles_operation, "mod_two_doubles"
) COUNT_EXTERNAL_REFERENCE(mutable_big_int_absolute_add_and_canonicalize_function
, "MutableBigInt_AbsoluteAddAndCanonicalize") COUNT_EXTERNAL_REFERENCE
(mutable_big_int_absolute_compare_function, "MutableBigInt_AbsoluteCompare"
) COUNT_EXTERNAL_REFERENCE(mutable_big_int_absolute_sub_and_canonicalize_function
, "MutableBigInt_AbsoluteSubAndCanonicalize") COUNT_EXTERNAL_REFERENCE
(new_deoptimizer_function, "Deoptimizer::New()") COUNT_EXTERNAL_REFERENCE
(orderedhashmap_gethash_raw, "orderedhashmap_gethash_raw") COUNT_EXTERNAL_REFERENCE
(printf_function, "printf") COUNT_EXTERNAL_REFERENCE(refill_math_random
, "MathRandom::RefillCache") COUNT_EXTERNAL_REFERENCE(search_string_raw_one_one
, "search_string_raw_one_one") COUNT_EXTERNAL_REFERENCE(search_string_raw_one_two
, "search_string_raw_one_two") COUNT_EXTERNAL_REFERENCE(search_string_raw_two_one
, "search_string_raw_two_one") COUNT_EXTERNAL_REFERENCE(search_string_raw_two_two
, "search_string_raw_two_two") COUNT_EXTERNAL_REFERENCE(string_write_to_flat_one_byte
, "string_write_to_flat_one_byte") COUNT_EXTERNAL_REFERENCE(string_write_to_flat_two_byte
, "string_write_to_flat_two_byte") COUNT_EXTERNAL_REFERENCE(external_one_byte_string_get_chars
, "external_one_byte_string_get_chars") COUNT_EXTERNAL_REFERENCE
(external_two_byte_string_get_chars, "external_two_byte_string_get_chars"
) COUNT_EXTERNAL_REFERENCE(smi_lexicographic_compare_function
, "smi_lexicographic_compare_function") COUNT_EXTERNAL_REFERENCE
(string_to_array_index_function, "String::ToArrayIndex") COUNT_EXTERNAL_REFERENCE
(try_string_to_index_or_lookup_existing, "try_string_to_index_or_lookup_existing"
) COUNT_EXTERNAL_REFERENCE(wasm_call_trap_callback_for_testing
, "wasm::call_trap_callback_for_testing") COUNT_EXTERNAL_REFERENCE
(wasm_f32_ceil, "wasm::f32_ceil_wrapper") COUNT_EXTERNAL_REFERENCE
(wasm_f32_floor, "wasm::f32_floor_wrapper") COUNT_EXTERNAL_REFERENCE
(wasm_f32_nearest_int, "wasm::f32_nearest_int_wrapper") COUNT_EXTERNAL_REFERENCE
(wasm_f32_trunc, "wasm::f32_trunc_wrapper") COUNT_EXTERNAL_REFERENCE
(wasm_f64_ceil, "wasm::f64_ceil_wrapper") COUNT_EXTERNAL_REFERENCE
(wasm_f64_floor, "wasm::f64_floor_wrapper") COUNT_EXTERNAL_REFERENCE
(wasm_f64_nearest_int, "wasm::f64_nearest_int_wrapper") COUNT_EXTERNAL_REFERENCE
(wasm_f64_trunc, "wasm::f64_trunc_wrapper") COUNT_EXTERNAL_REFERENCE
(wasm_float32_to_int64, "wasm::float32_to_int64_wrapper") COUNT_EXTERNAL_REFERENCE
(wasm_float32_to_uint64, "wasm::float32_to_uint64_wrapper") COUNT_EXTERNAL_REFERENCE
(wasm_float32_to_int64_sat, "wasm::float32_to_int64_sat_wrapper"
) COUNT_EXTERNAL_REFERENCE(wasm_float32_to_uint64_sat, "wasm::float32_to_uint64_sat_wrapper"
) COUNT_EXTERNAL_REFERENCE(wasm_float64_pow, "wasm::float64_pow"
) COUNT_EXTERNAL_REFERENCE(wasm_float64_to_int64, "wasm::float64_to_int64_wrapper"
) COUNT_EXTERNAL_REFERENCE(wasm_float64_to_uint64, "wasm::float64_to_uint64_wrapper"
) COUNT_EXTERNAL_REFERENCE(wasm_float64_to_int64_sat, "wasm::float64_to_int64_sat_wrapper"
) COUNT_EXTERNAL_REFERENCE(wasm_float64_to_uint64_sat, "wasm::float64_to_uint64_sat_wrapper"
) COUNT_EXTERNAL_REFERENCE(wasm_int64_div, "wasm::int64_div")
COUNT_EXTERNAL_REFERENCE(wasm_int64_mod, "wasm::int64_mod") COUNT_EXTERNAL_REFERENCE
(wasm_int64_to_float32, "wasm::int64_to_float32_wrapper") COUNT_EXTERNAL_REFERENCE
(wasm_int64_to_float64, "wasm::int64_to_float64_wrapper") COUNT_EXTERNAL_REFERENCE
(wasm_uint64_div, "wasm::uint64_div") COUNT_EXTERNAL_REFERENCE
(wasm_uint64_mod, "wasm::uint64_mod") COUNT_EXTERNAL_REFERENCE
(wasm_uint64_to_float32, "wasm::uint64_to_float32_wrapper") COUNT_EXTERNAL_REFERENCE
(wasm_uint64_to_float64, "wasm::uint64_to_float64_wrapper") COUNT_EXTERNAL_REFERENCE
(wasm_word32_ctz, "wasm::word32_ctz") COUNT_EXTERNAL_REFERENCE
(wasm_word32_popcnt, "wasm::word32_popcnt") COUNT_EXTERNAL_REFERENCE
(wasm_word32_rol, "wasm::word32_rol") COUNT_EXTERNAL_REFERENCE
(wasm_word32_ror, "wasm::word32_ror") COUNT_EXTERNAL_REFERENCE
(wasm_word64_rol, "wasm::word64_rol") COUNT_EXTERNAL_REFERENCE
(wasm_word64_ror, "wasm::word64_ror") COUNT_EXTERNAL_REFERENCE
(wasm_word64_ctz, "wasm::word64_ctz") COUNT_EXTERNAL_REFERENCE
(wasm_word64_popcnt, "wasm::word64_popcnt") COUNT_EXTERNAL_REFERENCE
(wasm_f64x2_ceil, "wasm::f64x2_ceil_wrapper") COUNT_EXTERNAL_REFERENCE
(wasm_f64x2_floor, "wasm::f64x2_floor_wrapper") COUNT_EXTERNAL_REFERENCE
(wasm_f64x2_trunc, "wasm::f64x2_trunc_wrapper") COUNT_EXTERNAL_REFERENCE
(wasm_f64x2_nearest_int, "wasm::f64x2_nearest_int_wrapper") COUNT_EXTERNAL_REFERENCE
(wasm_f32x4_ceil, "wasm::f32x4_ceil_wrapper") COUNT_EXTERNAL_REFERENCE
(wasm_f32x4_floor, "wasm::f32x4_floor_wrapper") COUNT_EXTERNAL_REFERENCE
(wasm_f32x4_trunc, "wasm::f32x4_trunc_wrapper") COUNT_EXTERNAL_REFERENCE
(wasm_f32x4_nearest_int, "wasm::f32x4_nearest_int_wrapper") COUNT_EXTERNAL_REFERENCE
(wasm_memory_init, "wasm::memory_init") COUNT_EXTERNAL_REFERENCE
(wasm_memory_copy, "wasm::memory_copy") COUNT_EXTERNAL_REFERENCE
(wasm_memory_fill, "wasm::memory_fill") COUNT_EXTERNAL_REFERENCE
(wasm_array_copy, "wasm::array_copy") COUNT_EXTERNAL_REFERENCE
(address_of_wasm_i8x16_swizzle_mask, "wasm_i8x16_swizzle_mask"
) COUNT_EXTERNAL_REFERENCE(address_of_wasm_i8x16_popcnt_mask,
"wasm_i8x16_popcnt_mask") COUNT_EXTERNAL_REFERENCE(address_of_wasm_i8x16_splat_0x01
, "wasm_i8x16_splat_0x01") COUNT_EXTERNAL_REFERENCE(address_of_wasm_i8x16_splat_0x0f
, "wasm_i8x16_splat_0x0f") COUNT_EXTERNAL_REFERENCE(address_of_wasm_i8x16_splat_0x33
, "wasm_i8x16_splat_0x33") COUNT_EXTERNAL_REFERENCE(address_of_wasm_i8x16_splat_0x55
, "wasm_i8x16_splat_0x55") COUNT_EXTERNAL_REFERENCE(address_of_wasm_i16x8_splat_0x0001
, "wasm_16x8_splat_0x0001") COUNT_EXTERNAL_REFERENCE(address_of_wasm_f64x2_convert_low_i32x4_u_int_mask
, "wasm_f64x2_convert_low_i32x4_u_int_mask") COUNT_EXTERNAL_REFERENCE
(supports_wasm_simd_128_address, "wasm::supports_wasm_simd_128_address"
) COUNT_EXTERNAL_REFERENCE(address_of_wasm_double_2_power_52,
"wasm_double_2_power_52") COUNT_EXTERNAL_REFERENCE(address_of_wasm_int32_max_as_double
, "wasm_int32_max_as_double") COUNT_EXTERNAL_REFERENCE(address_of_wasm_uint32_max_as_double
, "wasm_uint32_max_as_double") COUNT_EXTERNAL_REFERENCE(address_of_wasm_int32_overflow_as_float
, "wasm_int32_overflow_as_float") COUNT_EXTERNAL_REFERENCE(supports_cetss_address
, "CpuFeatures::supports_cetss_address") COUNT_EXTERNAL_REFERENCE
(write_barrier_marking_from_code_function, "WriteBarrier::MarkingFromCode"
) COUNT_EXTERNAL_REFERENCE(call_enqueue_microtask_function, "MicrotaskQueue::CallEnqueueMicrotask"
) COUNT_EXTERNAL_REFERENCE(call_enter_context_function, "call_enter_context_function"
) COUNT_EXTERNAL_REFERENCE(atomic_pair_load_function, "atomic_pair_load_function"
) COUNT_EXTERNAL_REFERENCE(atomic_pair_store_function, "atomic_pair_store_function"
) COUNT_EXTERNAL_REFERENCE(atomic_pair_add_function, "atomic_pair_add_function"
) COUNT_EXTERNAL_REFERENCE(atomic_pair_sub_function, "atomic_pair_sub_function"
) COUNT_EXTERNAL_REFERENCE(atomic_pair_and_function, "atomic_pair_and_function"
) COUNT_EXTERNAL_REFERENCE(atomic_pair_or_function, "atomic_pair_or_function"
) COUNT_EXTERNAL_REFERENCE(atomic_pair_xor_function, "atomic_pair_xor_function"
) COUNT_EXTERNAL_REFERENCE(atomic_pair_exchange_function, "atomic_pair_exchange_function"
) COUNT_EXTERNAL_REFERENCE(atomic_pair_compare_exchange_function
, "atomic_pair_compare_exchange_function") COUNT_EXTERNAL_REFERENCE
(js_finalization_registry_remove_cell_from_unregister_token_map
, "JSFinalizationRegistry::RemoveCellFromUnregisterTokenMap")
COUNT_EXTERNAL_REFERENCE(re_case_insensitive_compare_unicode
, "RegExpMacroAssembler::CaseInsensitiveCompareUnicode()") COUNT_EXTERNAL_REFERENCE
(re_case_insensitive_compare_non_unicode, "RegExpMacroAssembler::CaseInsensitiveCompareNonUnicode()"
) COUNT_EXTERNAL_REFERENCE(re_is_character_in_range_array, "RegExpMacroAssembler::IsCharacterInRangeArray()"
) COUNT_EXTERNAL_REFERENCE(re_check_stack_guard_state, "RegExpMacroAssembler*::CheckStackGuardState()"
) COUNT_EXTERNAL_REFERENCE(re_grow_stack, "NativeRegExpMacroAssembler::GrowStack()"
) COUNT_EXTERNAL_REFERENCE(re_word_character_map, "NativeRegExpMacroAssembler::word_character_map"
) COUNT_EXTERNAL_REFERENCE(re_match_for_call_from_js, "IrregexpInterpreter::MatchForCallFromJs"
) COUNT_EXTERNAL_REFERENCE(re_experimental_match_for_call_from_js
, "ExperimentalRegExp::MatchForCallFromJs") COUNT_EXTERNAL_REFERENCE
(intl_convert_one_byte_to_lower, "intl_convert_one_byte_to_lower"
) COUNT_EXTERNAL_REFERENCE(intl_to_latin1_lower_table, "intl_to_latin1_lower_table"
) COUNT_EXTERNAL_REFERENCE(intl_ascii_collation_weights_l1, "Intl::AsciiCollationWeightsL1"
) COUNT_EXTERNAL_REFERENCE(intl_ascii_collation_weights_l3, "Intl::AsciiCollationWeightsL3"
)
;
256 static constexpr uint32_t kNumExternalReferencesIntrinsics =
257 FOR_EACH_INTRINSIC(COUNT_EXTERNAL_REFERENCE)COUNT_EXTERNAL_REFERENCE(DebugBreakOnBytecode, 1, 2) COUNT_EXTERNAL_REFERENCE
(LoadLookupSlotForCall, 1, 2) COUNT_EXTERNAL_REFERENCE(ArrayIncludes_Slow
, 3, 1) COUNT_EXTERNAL_REFERENCE(ArrayIndexOf, 3, 1) COUNT_EXTERNAL_REFERENCE
(ArrayIsArray, 1, 1) COUNT_EXTERNAL_REFERENCE(ArraySpeciesConstructor
, 1, 1) COUNT_EXTERNAL_REFERENCE(GrowArrayElements, 2, 1) COUNT_EXTERNAL_REFERENCE
(IsArray, 1, 1) COUNT_EXTERNAL_REFERENCE(NewArray, -1 , 1) COUNT_EXTERNAL_REFERENCE
(NormalizeElements, 1, 1) COUNT_EXTERNAL_REFERENCE(TransitionElementsKind
, 2, 1) COUNT_EXTERNAL_REFERENCE(TransitionElementsKindWithKind
, 2, 1) COUNT_EXTERNAL_REFERENCE(AtomicsLoad64, 2, 1) COUNT_EXTERNAL_REFERENCE
(AtomicsStore64, 3, 1) COUNT_EXTERNAL_REFERENCE(AtomicsAdd, 3
, 1) COUNT_EXTERNAL_REFERENCE(AtomicsAnd, 3, 1) COUNT_EXTERNAL_REFERENCE
(AtomicsCompareExchange, 4, 1) COUNT_EXTERNAL_REFERENCE(AtomicsExchange
, 3, 1) COUNT_EXTERNAL_REFERENCE(AtomicsNumWaitersForTesting,
2, 1) COUNT_EXTERNAL_REFERENCE(AtomicsNumAsyncWaitersForTesting
, 0, 1) COUNT_EXTERNAL_REFERENCE(AtomicsNumUnresolvedAsyncPromisesForTesting
, 2, 1) COUNT_EXTERNAL_REFERENCE(AtomicsOr, 3, 1) COUNT_EXTERNAL_REFERENCE
(AtomicsSub, 3, 1) COUNT_EXTERNAL_REFERENCE(AtomicsXor, 3, 1)
COUNT_EXTERNAL_REFERENCE(SetAllowAtomicsWait, 1, 1) COUNT_EXTERNAL_REFERENCE
(AtomicsLoadSharedStructField, 2, 1) COUNT_EXTERNAL_REFERENCE
(AtomicsStoreSharedStructField, 3, 1) COUNT_EXTERNAL_REFERENCE
(AtomicsExchangeSharedStructField, 3, 1) COUNT_EXTERNAL_REFERENCE
(BigIntBinaryOp, 3, 1) COUNT_EXTERNAL_REFERENCE(BigIntCompareToBigInt
, 3, 1) COUNT_EXTERNAL_REFERENCE(BigIntCompareToNumber, 3, 1)
COUNT_EXTERNAL_REFERENCE(BigIntCompareToString, 3, 1) COUNT_EXTERNAL_REFERENCE
(BigIntEqualToBigInt, 2, 1) COUNT_EXTERNAL_REFERENCE(BigIntEqualToNumber
, 2, 1) COUNT_EXTERNAL_REFERENCE(BigIntEqualToString, 2, 1) COUNT_EXTERNAL_REFERENCE
(BigIntMaxLengthBits, 0, 1) COUNT_EXTERNAL_REFERENCE(BigIntToBoolean
, 1, 1) COUNT_EXTERNAL_REFERENCE(BigIntToNumber, 1, 1) COUNT_EXTERNAL_REFERENCE
(BigIntUnaryOp, 2, 1) COUNT_EXTERNAL_REFERENCE(ToBigInt, 1, 1
) COUNT_EXTERNAL_REFERENCE(DefineClass, -1 , 1) COUNT_EXTERNAL_REFERENCE
(LoadFromSuper, 3, 1) COUNT_EXTERNAL_REFERENCE(LoadKeyedFromSuper
, 3, 1) COUNT_EXTERNAL_REFERENCE(StoreKeyedToSuper, 4, 1) COUNT_EXTERNAL_REFERENCE
(StoreToSuper, 4, 1) COUNT_EXTERNAL_REFERENCE(ThrowConstructorNonCallableError
, 1, 1) COUNT_EXTERNAL_REFERENCE(ThrowNotSuperConstructor, 2,
1) COUNT_EXTERNAL_REFERENCE(ThrowStaticPrototypeError, 0, 1)
COUNT_EXTERNAL_REFERENCE(ThrowSuperAlreadyCalledError, 0, 1)
COUNT_EXTERNAL_REFERENCE(ThrowSuperNotCalled, 0, 1) COUNT_EXTERNAL_REFERENCE
(ThrowUnsupportedSuperError, 0, 1) COUNT_EXTERNAL_REFERENCE(MapGrow
, 1, 1) COUNT_EXTERNAL_REFERENCE(MapShrink, 1, 1) COUNT_EXTERNAL_REFERENCE
(SetGrow, 1, 1) COUNT_EXTERNAL_REFERENCE(SetShrink, 1, 1) COUNT_EXTERNAL_REFERENCE
(TheHole, 0, 1) COUNT_EXTERNAL_REFERENCE(WeakCollectionDelete
, 3, 1) COUNT_EXTERNAL_REFERENCE(WeakCollectionSet, 4, 1) COUNT_EXTERNAL_REFERENCE
(CompileOptimizedOSR, 0, 1) COUNT_EXTERNAL_REFERENCE(CompileLazy
, 1, 1) COUNT_EXTERNAL_REFERENCE(CompileBaseline, 1, 1) COUNT_EXTERNAL_REFERENCE
(CompileMaglev_Concurrent, 1, 1) COUNT_EXTERNAL_REFERENCE(CompileMaglev_Synchronous
, 1, 1) COUNT_EXTERNAL_REFERENCE(CompileTurbofan_Concurrent, 1
, 1) COUNT_EXTERNAL_REFERENCE(CompileTurbofan_Synchronous, 1,
1) COUNT_EXTERNAL_REFERENCE(InstallBaselineCode, 1, 1) COUNT_EXTERNAL_REFERENCE
(HealOptimizedCodeSlot, 1, 1) COUNT_EXTERNAL_REFERENCE(InstantiateAsmJs
, 4, 1) COUNT_EXTERNAL_REFERENCE(NotifyDeoptimized, 0, 1) COUNT_EXTERNAL_REFERENCE
(ObserveNode, 1, 1) COUNT_EXTERNAL_REFERENCE(ResolvePossiblyDirectEval
, 6, 1) COUNT_EXTERNAL_REFERENCE(VerifyType, 1, 1) COUNT_EXTERNAL_REFERENCE
(DateCurrentTime, 0, 1) COUNT_EXTERNAL_REFERENCE(ClearStepping
, 0, 1) COUNT_EXTERNAL_REFERENCE(CollectGarbage, 1, 1) COUNT_EXTERNAL_REFERENCE
(DebugAsyncFunctionSuspended, 4, 1) COUNT_EXTERNAL_REFERENCE(
DebugBreakAtEntry, 1, 1) COUNT_EXTERNAL_REFERENCE(DebugCollectCoverage
, 0, 1) COUNT_EXTERNAL_REFERENCE(DebugGetLoadedScriptIds, 0, 1
) COUNT_EXTERNAL_REFERENCE(DebugOnFunctionCall, 2, 1) COUNT_EXTERNAL_REFERENCE
(DebugPopPromise, 0, 1) COUNT_EXTERNAL_REFERENCE(DebugPrepareStepInSuspendedGenerator
, 0, 1) COUNT_EXTERNAL_REFERENCE(DebugPromiseThen, 1, 1) COUNT_EXTERNAL_REFERENCE
(DebugPushPromise, 1, 1) COUNT_EXTERNAL_REFERENCE(DebugToggleBlockCoverage
, 1, 1) COUNT_EXTERNAL_REFERENCE(DebugTogglePreciseCoverage, 1
, 1) COUNT_EXTERNAL_REFERENCE(FunctionGetInferredName, 1, 1) COUNT_EXTERNAL_REFERENCE
(GetBreakLocations, 1, 1) COUNT_EXTERNAL_REFERENCE(GetGeneratorScopeCount
, 1, 1) COUNT_EXTERNAL_REFERENCE(GetGeneratorScopeDetails, 2,
1) COUNT_EXTERNAL_REFERENCE(HandleDebuggerStatement, 0, 1) COUNT_EXTERNAL_REFERENCE
(IsBreakOnException, 1, 1) COUNT_EXTERNAL_REFERENCE(LiveEditPatchScript
, 2, 1) COUNT_EXTERNAL_REFERENCE(ProfileCreateSnapshotDataBlob
, 0, 1) COUNT_EXTERNAL_REFERENCE(ScheduleBreak, 0, 1) COUNT_EXTERNAL_REFERENCE
(ScriptLocationFromLine2, 4, 1) COUNT_EXTERNAL_REFERENCE(SetGeneratorScopeVariableValue
, 4, 1) COUNT_EXTERNAL_REFERENCE(IncBlockCounter, 2, 1) COUNT_EXTERNAL_REFERENCE
(ForInEnumerate, 1, 1) COUNT_EXTERNAL_REFERENCE(ForInHasProperty
, 2, 1) COUNT_EXTERNAL_REFERENCE(Call, -1 , 1) COUNT_EXTERNAL_REFERENCE
(FunctionGetScriptSource, 1, 1) COUNT_EXTERNAL_REFERENCE(FunctionGetScriptId
, 1, 1) COUNT_EXTERNAL_REFERENCE(FunctionGetScriptSourcePosition
, 1, 1) COUNT_EXTERNAL_REFERENCE(FunctionGetSourceCode, 1, 1)
COUNT_EXTERNAL_REFERENCE(FunctionIsAPIFunction, 1, 1) COUNT_EXTERNAL_REFERENCE
(IsFunction, 1, 1) COUNT_EXTERNAL_REFERENCE(AsyncFunctionAwaitCaught
, 2, 1) COUNT_EXTERNAL_REFERENCE(AsyncFunctionAwaitUncaught, 2
, 1) COUNT_EXTERNAL_REFERENCE(AsyncFunctionEnter, 2, 1) COUNT_EXTERNAL_REFERENCE
(AsyncFunctionReject, 2, 1) COUNT_EXTERNAL_REFERENCE(AsyncFunctionResolve
, 2, 1) COUNT_EXTERNAL_REFERENCE(AsyncGeneratorAwaitCaught, 2
, 1) COUNT_EXTERNAL_REFERENCE(AsyncGeneratorAwaitUncaught, 2,
1) COUNT_EXTERNAL_REFERENCE(AsyncGeneratorHasCatchHandlerForPC
, 1, 1) COUNT_EXTERNAL_REFERENCE(AsyncGeneratorReject, 2, 1) COUNT_EXTERNAL_REFERENCE
(AsyncGeneratorResolve, 3, 1) COUNT_EXTERNAL_REFERENCE(AsyncGeneratorYield
, 3, 1) COUNT_EXTERNAL_REFERENCE(CreateJSGeneratorObject, 2, 1
) COUNT_EXTERNAL_REFERENCE(GeneratorClose, 1, 1) COUNT_EXTERNAL_REFERENCE
(GeneratorGetFunction, 1, 1) COUNT_EXTERNAL_REFERENCE(GeneratorGetResumeMode
, 1, 1) COUNT_EXTERNAL_REFERENCE(ElementsTransitionAndStoreIC_Miss
, 6, 1) COUNT_EXTERNAL_REFERENCE(KeyedLoadIC_Miss, 4, 1) COUNT_EXTERNAL_REFERENCE
(KeyedStoreIC_Miss, 5, 1) COUNT_EXTERNAL_REFERENCE(DefineKeyedOwnIC_Miss
, 5, 1) COUNT_EXTERNAL_REFERENCE(StoreInArrayLiteralIC_Miss, 5
, 1) COUNT_EXTERNAL_REFERENCE(DefineNamedOwnIC_Slow, 3, 1) COUNT_EXTERNAL_REFERENCE
(KeyedStoreIC_Slow, 3, 1) COUNT_EXTERNAL_REFERENCE(DefineKeyedOwnIC_Slow
, 3, 1) COUNT_EXTERNAL_REFERENCE(LoadElementWithInterceptor, 2
, 1) COUNT_EXTERNAL_REFERENCE(LoadGlobalIC_Miss, 4, 1) COUNT_EXTERNAL_REFERENCE
(LoadGlobalIC_Slow, 3, 1) COUNT_EXTERNAL_REFERENCE(LoadIC_Miss
, 4, 1) COUNT_EXTERNAL_REFERENCE(LoadNoFeedbackIC_Miss, 4, 1)
COUNT_EXTERNAL_REFERENCE(LoadWithReceiverIC_Miss, 5, 1) COUNT_EXTERNAL_REFERENCE
(LoadWithReceiverNoFeedbackIC_Miss, 3, 1) COUNT_EXTERNAL_REFERENCE
(LoadPropertyWithInterceptor, 5, 1) COUNT_EXTERNAL_REFERENCE(
StoreCallbackProperty, 5, 1) COUNT_EXTERNAL_REFERENCE(StoreGlobalIC_Miss
, 4, 1) COUNT_EXTERNAL_REFERENCE(StoreGlobalICNoFeedback_Miss
, 2, 1) COUNT_EXTERNAL_REFERENCE(StoreGlobalIC_Slow, 5, 1) COUNT_EXTERNAL_REFERENCE
(StoreIC_Miss, 5, 1) COUNT_EXTERNAL_REFERENCE(DefineNamedOwnIC_Miss
, 5, 1) COUNT_EXTERNAL_REFERENCE(StoreInArrayLiteralIC_Slow, 5
, 1) COUNT_EXTERNAL_REFERENCE(StorePropertyWithInterceptor, 5
, 1) COUNT_EXTERNAL_REFERENCE(CloneObjectIC_Miss, 4, 1) COUNT_EXTERNAL_REFERENCE
(KeyedHasIC_Miss, 4, 1) COUNT_EXTERNAL_REFERENCE(HasElementWithInterceptor
, 2, 1) COUNT_EXTERNAL_REFERENCE(AccessCheck, 1, 1) COUNT_EXTERNAL_REFERENCE
(AllocateByteArray, 1, 1) COUNT_EXTERNAL_REFERENCE(AllocateInYoungGeneration
, 2, 1) COUNT_EXTERNAL_REFERENCE(AllocateInOldGeneration, 2, 1
) COUNT_EXTERNAL_REFERENCE(AllocateSeqOneByteString, 1, 1) COUNT_EXTERNAL_REFERENCE
(AllocateSeqTwoByteString, 1, 1) COUNT_EXTERNAL_REFERENCE(AllowDynamicFunction
, 1, 1) COUNT_EXTERNAL_REFERENCE(CreateAsyncFromSyncIterator,
1, 1) COUNT_EXTERNAL_REFERENCE(CreateListFromArrayLike, 1, 1
) COUNT_EXTERNAL_REFERENCE(DoubleToStringWithRadix, 2, 1) COUNT_EXTERNAL_REFERENCE
(FatalProcessOutOfMemoryInAllocateRaw, 0, 1) COUNT_EXTERNAL_REFERENCE
(FatalProcessOutOfMemoryInvalidArrayLength, 0, 1) COUNT_EXTERNAL_REFERENCE
(GetAndResetRuntimeCallStats, -1 , 1) COUNT_EXTERNAL_REFERENCE
(GetTemplateObject, 3, 1) COUNT_EXTERNAL_REFERENCE(IncrementUseCounter
, 1, 1) COUNT_EXTERNAL_REFERENCE(BytecodeBudgetInterrupt, 1, 1
) COUNT_EXTERNAL_REFERENCE(BytecodeBudgetInterruptWithStackCheck
, 1, 1) COUNT_EXTERNAL_REFERENCE(NewError, 2, 1) COUNT_EXTERNAL_REFERENCE
(NewForeign, 0, 1) COUNT_EXTERNAL_REFERENCE(NewReferenceError
, 2, 1) COUNT_EXTERNAL_REFERENCE(NewSyntaxError, 2, 1) COUNT_EXTERNAL_REFERENCE
(NewTypeError, -1 , 1) COUNT_EXTERNAL_REFERENCE(OrdinaryHasInstance
, 2, 1) COUNT_EXTERNAL_REFERENCE(PromoteScheduledException, 0
, 1) COUNT_EXTERNAL_REFERENCE(ReportMessageFromMicrotask, 1, 1
) COUNT_EXTERNAL_REFERENCE(ReThrow, 1, 1) COUNT_EXTERNAL_REFERENCE
(ReThrowWithMessage, 2, 1) COUNT_EXTERNAL_REFERENCE(RunMicrotaskCallback
, 2, 1) COUNT_EXTERNAL_REFERENCE(PerformMicrotaskCheckpoint, 0
, 1) COUNT_EXTERNAL_REFERENCE(SharedValueBarrierSlow, 1, 1) COUNT_EXTERNAL_REFERENCE
(StackGuard, 0, 1) COUNT_EXTERNAL_REFERENCE(StackGuardWithGap
, 1, 1) COUNT_EXTERNAL_REFERENCE(Throw, 1, 1) COUNT_EXTERNAL_REFERENCE
(ThrowApplyNonFunction, 1, 1) COUNT_EXTERNAL_REFERENCE(ThrowCalledNonCallable
, 1, 1) COUNT_EXTERNAL_REFERENCE(ThrowConstructedNonConstructable
, 1, 1) COUNT_EXTERNAL_REFERENCE(ThrowConstructorReturnedNonObject
, 0, 1) COUNT_EXTERNAL_REFERENCE(ThrowInvalidStringLength, 0,
1) COUNT_EXTERNAL_REFERENCE(ThrowInvalidTypedArrayAlignment,
2, 1) COUNT_EXTERNAL_REFERENCE(ThrowIteratorError, 1, 1) COUNT_EXTERNAL_REFERENCE
(ThrowSpreadArgError, 2, 1) COUNT_EXTERNAL_REFERENCE(ThrowIteratorResultNotAnObject
, 1, 1) COUNT_EXTERNAL_REFERENCE(ThrowNoAccess, 0, 1) COUNT_EXTERNAL_REFERENCE
(ThrowNotConstructor, 1, 1) COUNT_EXTERNAL_REFERENCE(ThrowPatternAssignmentNonCoercible
, 1, 1) COUNT_EXTERNAL_REFERENCE(ThrowRangeError, -1 , 1) COUNT_EXTERNAL_REFERENCE
(ThrowReferenceError, 1, 1) COUNT_EXTERNAL_REFERENCE(ThrowAccessedUninitializedVariable
, 1, 1) COUNT_EXTERNAL_REFERENCE(ThrowStackOverflow, 0, 1) COUNT_EXTERNAL_REFERENCE
(ThrowSymbolAsyncIteratorInvalid, 0, 1) COUNT_EXTERNAL_REFERENCE
(ThrowSymbolIteratorInvalid, 0, 1) COUNT_EXTERNAL_REFERENCE(ThrowThrowMethodMissing
, 0, 1) COUNT_EXTERNAL_REFERENCE(ThrowTypeError, -1 , 1) COUNT_EXTERNAL_REFERENCE
(ThrowTypeErrorIfStrict, -1 , 1) COUNT_EXTERNAL_REFERENCE(Typeof
, 1, 1) COUNT_EXTERNAL_REFERENCE(UnwindAndFindExceptionHandler
, 0, 1) COUNT_EXTERNAL_REFERENCE(FormatList, 2, 1) COUNT_EXTERNAL_REFERENCE
(FormatListToParts, 2, 1) COUNT_EXTERNAL_REFERENCE(StringToLowerCaseIntl
, 1, 1) COUNT_EXTERNAL_REFERENCE(StringToUpperCaseIntl, 1, 1)
COUNT_EXTERNAL_REFERENCE(CreateArrayLiteral, 4, 1) COUNT_EXTERNAL_REFERENCE
(CreateArrayLiteralWithoutAllocationSite, 2, 1) COUNT_EXTERNAL_REFERENCE
(CreateObjectLiteral, 4, 1) COUNT_EXTERNAL_REFERENCE(CreateObjectLiteralWithoutAllocationSite
, 2, 1) COUNT_EXTERNAL_REFERENCE(CreateRegExpLiteral, 4, 1) COUNT_EXTERNAL_REFERENCE
(DynamicImportCall, -1 , 1) COUNT_EXTERNAL_REFERENCE(GetImportMetaObject
, 0, 1) COUNT_EXTERNAL_REFERENCE(GetModuleNamespace, 1, 1) COUNT_EXTERNAL_REFERENCE
(ArrayBufferMaxByteLength, 0, 1) COUNT_EXTERNAL_REFERENCE(GetHoleNaNLower
, 0, 1) COUNT_EXTERNAL_REFERENCE(GetHoleNaNUpper, 0, 1) COUNT_EXTERNAL_REFERENCE
(IsSmi, 1, 1) COUNT_EXTERNAL_REFERENCE(MaxSmi, 0, 1) COUNT_EXTERNAL_REFERENCE
(NumberToStringSlow, 1, 1) COUNT_EXTERNAL_REFERENCE(StringParseFloat
, 1, 1) COUNT_EXTERNAL_REFERENCE(StringParseInt, 2, 1) COUNT_EXTERNAL_REFERENCE
(StringToNumber, 1, 1) COUNT_EXTERNAL_REFERENCE(TypedArrayMaxLength
, 0, 1) COUNT_EXTERNAL_REFERENCE(AddDictionaryProperty, 3, 1)
COUNT_EXTERNAL_REFERENCE(AddPrivateBrand, 4, 1) COUNT_EXTERNAL_REFERENCE
(AllocateHeapNumber, 0, 1) COUNT_EXTERNAL_REFERENCE(CollectTypeProfile
, 3, 1) COUNT_EXTERNAL_REFERENCE(CompleteInobjectSlackTrackingForMap
, 1, 1) COUNT_EXTERNAL_REFERENCE(CopyDataProperties, 2, 1) COUNT_EXTERNAL_REFERENCE
(CopyDataPropertiesWithExcludedPropertiesOnStack, -1 , 1) COUNT_EXTERNAL_REFERENCE
(CreateDataProperty, 3, 1) COUNT_EXTERNAL_REFERENCE(CreateIterResultObject
, 2, 1) COUNT_EXTERNAL_REFERENCE(CreatePrivateAccessors, 2, 1
) COUNT_EXTERNAL_REFERENCE(DefineAccessorPropertyUnchecked, 5
, 1) COUNT_EXTERNAL_REFERENCE(DefineKeyedOwnPropertyInLiteral
, 6, 1) COUNT_EXTERNAL_REFERENCE(DefineGetterPropertyUnchecked
, 4, 1) COUNT_EXTERNAL_REFERENCE(DefineSetterPropertyUnchecked
, 4, 1) COUNT_EXTERNAL_REFERENCE(DeleteProperty, 3, 1) COUNT_EXTERNAL_REFERENCE
(GetDerivedMap, 2, 1) COUNT_EXTERNAL_REFERENCE(GetFunctionName
, 1, 1) COUNT_EXTERNAL_REFERENCE(GetOwnPropertyDescriptor, 2,
1) COUNT_EXTERNAL_REFERENCE(GetOwnPropertyKeys, 2, 1) COUNT_EXTERNAL_REFERENCE
(GetProperty, -1 , 1) COUNT_EXTERNAL_REFERENCE(HasFastPackedElements
, 1, 1) COUNT_EXTERNAL_REFERENCE(HasInPrototypeChain, 2, 1) COUNT_EXTERNAL_REFERENCE
(HasProperty, 2, 1) COUNT_EXTERNAL_REFERENCE(InternalSetPrototype
, 2, 1) COUNT_EXTERNAL_REFERENCE(IsJSReceiver, 1, 1) COUNT_EXTERNAL_REFERENCE
(JSReceiverPreventExtensionsDontThrow, 1, 1) COUNT_EXTERNAL_REFERENCE
(JSReceiverPreventExtensionsThrow, 1, 1) COUNT_EXTERNAL_REFERENCE
(JSReceiverGetPrototypeOf, 1, 1) COUNT_EXTERNAL_REFERENCE(JSReceiverSetPrototypeOfDontThrow
, 2, 1) COUNT_EXTERNAL_REFERENCE(JSReceiverSetPrototypeOfThrow
, 2, 1) COUNT_EXTERNAL_REFERENCE(LoadPrivateGetter, 1, 1) COUNT_EXTERNAL_REFERENCE
(LoadPrivateSetter, 1, 1) COUNT_EXTERNAL_REFERENCE(NewObject,
2, 1) COUNT_EXTERNAL_REFERENCE(ObjectCreate, 2, 1) COUNT_EXTERNAL_REFERENCE
(ObjectEntries, 1, 1) COUNT_EXTERNAL_REFERENCE(ObjectEntriesSkipFastPath
, 1, 1) COUNT_EXTERNAL_REFERENCE(ObjectGetOwnPropertyNames, 1
, 1) COUNT_EXTERNAL_REFERENCE(ObjectGetOwnPropertyNamesTryFast
, 1, 1) COUNT_EXTERNAL_REFERENCE(ObjectHasOwnProperty, 2, 1) COUNT_EXTERNAL_REFERENCE
(ObjectIsExtensible, 1, 1) COUNT_EXTERNAL_REFERENCE(ObjectKeys
, 1, 1) COUNT_EXTERNAL_REFERENCE(ObjectValues, 1, 1) COUNT_EXTERNAL_REFERENCE
(ObjectValuesSkipFastPath, 1, 1) COUNT_EXTERNAL_REFERENCE(OptimizeObjectForAddingMultipleProperties
, 2, 1) COUNT_EXTERNAL_REFERENCE(SetDataProperties, 2, 1) COUNT_EXTERNAL_REFERENCE
(SetKeyedProperty, 3, 1) COUNT_EXTERNAL_REFERENCE(DefineObjectOwnProperty
, 3, 1) COUNT_EXTERNAL_REFERENCE(SetNamedProperty, 3, 1) COUNT_EXTERNAL_REFERENCE
(SetOwnPropertyIgnoreAttributes, 4, 1) COUNT_EXTERNAL_REFERENCE
(DefineKeyedOwnPropertyInLiteral_Simple, 3, 1) COUNT_EXTERNAL_REFERENCE
(ShrinkNameDictionary, 1, 1) COUNT_EXTERNAL_REFERENCE(ShrinkSwissNameDictionary
, 1, 1) COUNT_EXTERNAL_REFERENCE(ToFastProperties, 1, 1) COUNT_EXTERNAL_REFERENCE
(ToLength, 1, 1) COUNT_EXTERNAL_REFERENCE(ToName, 1, 1) COUNT_EXTERNAL_REFERENCE
(ToNumber, 1, 1) COUNT_EXTERNAL_REFERENCE(ToNumeric, 1, 1) COUNT_EXTERNAL_REFERENCE
(ToObject, 1, 1) COUNT_EXTERNAL_REFERENCE(ToString, 1, 1) COUNT_EXTERNAL_REFERENCE
(TryMigrateInstance, 1, 1) COUNT_EXTERNAL_REFERENCE(SwissTableAdd
, 4, 1) COUNT_EXTERNAL_REFERENCE(SwissTableAllocate, 1, 1) COUNT_EXTERNAL_REFERENCE
(SwissTableDelete, 2, 1) COUNT_EXTERNAL_REFERENCE(SwissTableDetailsAt
, 2, 1) COUNT_EXTERNAL_REFERENCE(SwissTableElementsCount, 1, 1
) COUNT_EXTERNAL_REFERENCE(SwissTableEquals, 2, 1) COUNT_EXTERNAL_REFERENCE
(SwissTableFindEntry, 2, 1) COUNT_EXTERNAL_REFERENCE(SwissTableUpdate
, 4, 1) COUNT_EXTERNAL_REFERENCE(SwissTableValueAt, 2, 1) COUNT_EXTERNAL_REFERENCE
(SwissTableKeyAt, 2, 1) COUNT_EXTERNAL_REFERENCE(Add, 2, 1) COUNT_EXTERNAL_REFERENCE
(Equal, 2, 1) COUNT_EXTERNAL_REFERENCE(GreaterThan, 2, 1) COUNT_EXTERNAL_REFERENCE
(GreaterThanOrEqual, 2, 1) COUNT_EXTERNAL_REFERENCE(LessThan,
2, 1) COUNT_EXTERNAL_REFERENCE(LessThanOrEqual, 2, 1) COUNT_EXTERNAL_REFERENCE
(NotEqual, 2, 1) COUNT_EXTERNAL_REFERENCE(StrictEqual, 2, 1) COUNT_EXTERNAL_REFERENCE
(StrictNotEqual, 2, 1) COUNT_EXTERNAL_REFERENCE(ReferenceEqual
, 2, 1) COUNT_EXTERNAL_REFERENCE(EnqueueMicrotask, 1, 1) COUNT_EXTERNAL_REFERENCE
(PromiseHookAfter, 1, 1) COUNT_EXTERNAL_REFERENCE(PromiseHookBefore
, 1, 1) COUNT_EXTERNAL_REFERENCE(PromiseHookInit, 2, 1) COUNT_EXTERNAL_REFERENCE
(PromiseRejectEventFromStack, 2, 1) COUNT_EXTERNAL_REFERENCE(
PromiseRevokeReject, 1, 1) COUNT_EXTERNAL_REFERENCE(PromiseStatus
, 1, 1) COUNT_EXTERNAL_REFERENCE(RejectPromise, 3, 1) COUNT_EXTERNAL_REFERENCE
(ResolvePromise, 2, 1) COUNT_EXTERNAL_REFERENCE(PromiseRejectAfterResolved
, 2, 1) COUNT_EXTERNAL_REFERENCE(PromiseResolveAfterResolved,
2, 1) COUNT_EXTERNAL_REFERENCE(ConstructAggregateErrorHelper
, 4, 1) COUNT_EXTERNAL_REFERENCE(ConstructInternalAggregateErrorHelper
, -1 , 1) COUNT_EXTERNAL_REFERENCE(CheckProxyGetSetTrapResult
, 2, 1) COUNT_EXTERNAL_REFERENCE(CheckProxyHasTrapResult, 2, 1
) COUNT_EXTERNAL_REFERENCE(CheckProxyDeleteTrapResult, 2, 1) COUNT_EXTERNAL_REFERENCE
(GetPropertyWithReceiver, 3, 1) COUNT_EXTERNAL_REFERENCE(IsJSProxy
, 1, 1) COUNT_EXTERNAL_REFERENCE(JSProxyGetHandler, 1, 1) COUNT_EXTERNAL_REFERENCE
(JSProxyGetTarget, 1, 1) COUNT_EXTERNAL_REFERENCE(SetPropertyWithReceiver
, 4, 1) COUNT_EXTERNAL_REFERENCE(IsRegExp, 1, 1) COUNT_EXTERNAL_REFERENCE
(RegExpBuildIndices, 3, 1) COUNT_EXTERNAL_REFERENCE(RegExpExec
, 4, 1) COUNT_EXTERNAL_REFERENCE(RegExpExecTreatMatchAtEndAsFailure
, 4, 1) COUNT_EXTERNAL_REFERENCE(RegExpExperimentalOneshotExec
, 4, 1) COUNT_EXTERNAL_REFERENCE(RegExpExperimentalOneshotExecTreatMatchAtEndAsFailure
, 4, 1) COUNT_EXTERNAL_REFERENCE(RegExpExecMultiple, 4, 1) COUNT_EXTERNAL_REFERENCE
(RegExpInitializeAndCompile, 3, 1) COUNT_EXTERNAL_REFERENCE(RegExpReplaceRT
, 3, 1) COUNT_EXTERNAL_REFERENCE(RegExpSplit, 3, 1) COUNT_EXTERNAL_REFERENCE
(RegExpStringFromFlags, 1, 1) COUNT_EXTERNAL_REFERENCE(StringReplaceNonGlobalRegExpWithFunction
, 3, 1) COUNT_EXTERNAL_REFERENCE(StringSplit, 3, 1) COUNT_EXTERNAL_REFERENCE
(DeclareEvalFunction, 2, 1) COUNT_EXTERNAL_REFERENCE(DeclareEvalVar
, 1, 1) COUNT_EXTERNAL_REFERENCE(DeclareGlobals, 2, 1) COUNT_EXTERNAL_REFERENCE
(DeclareModuleExports, 2, 1) COUNT_EXTERNAL_REFERENCE(DeleteLookupSlot
, 1, 1) COUNT_EXTERNAL_REFERENCE(LoadLookupSlot, 1, 1) COUNT_EXTERNAL_REFERENCE
(LoadLookupSlotInsideTypeof, 1, 1) COUNT_EXTERNAL_REFERENCE(NewClosure
, 2, 1) COUNT_EXTERNAL_REFERENCE(NewClosure_Tenured, 2, 1) COUNT_EXTERNAL_REFERENCE
(NewFunctionContext, 1, 1) COUNT_EXTERNAL_REFERENCE(NewRestParameter
, 1, 1) COUNT_EXTERNAL_REFERENCE(NewSloppyArguments, 1, 1) COUNT_EXTERNAL_REFERENCE
(NewStrictArguments, 1, 1) COUNT_EXTERNAL_REFERENCE(PushBlockContext
, 1, 1) COUNT_EXTERNAL_REFERENCE(PushCatchContext, 2, 1) COUNT_EXTERNAL_REFERENCE
(PushWithContext, 2, 1) COUNT_EXTERNAL_REFERENCE(StoreGlobalNoHoleCheckForReplLetOrConst
, 2, 1) COUNT_EXTERNAL_REFERENCE(StoreLookupSlot_Sloppy, 2, 1
) COUNT_EXTERNAL_REFERENCE(StoreLookupSlot_SloppyHoisting, 2,
1) COUNT_EXTERNAL_REFERENCE(StoreLookupSlot_Strict, 2, 1) COUNT_EXTERNAL_REFERENCE
(ThrowConstAssignError, 0, 1) COUNT_EXTERNAL_REFERENCE(ShadowRealmWrappedFunctionCreate
, 2, 1) COUNT_EXTERNAL_REFERENCE(FlattenString, 1, 1) COUNT_EXTERNAL_REFERENCE
(GetSubstitution, 5, 1) COUNT_EXTERNAL_REFERENCE(InternalizeString
, 1, 1) COUNT_EXTERNAL_REFERENCE(StringAdd, 2, 1) COUNT_EXTERNAL_REFERENCE
(StringBuilderConcat, 3, 1) COUNT_EXTERNAL_REFERENCE(StringCharCodeAt
, 2, 1) COUNT_EXTERNAL_REFERENCE(StringEqual, 2, 1) COUNT_EXTERNAL_REFERENCE
(StringEscapeQuotes, 1, 1) COUNT_EXTERNAL_REFERENCE(StringGreaterThan
, 2, 1) COUNT_EXTERNAL_REFERENCE(StringGreaterThanOrEqual, 2,
1) COUNT_EXTERNAL_REFERENCE(StringLastIndexOf, 2, 1) COUNT_EXTERNAL_REFERENCE
(StringLessThan, 2, 1) COUNT_EXTERNAL_REFERENCE(StringLessThanOrEqual
, 2, 1) COUNT_EXTERNAL_REFERENCE(StringMaxLength, 0, 1) COUNT_EXTERNAL_REFERENCE
(StringReplaceOneCharWithString, 3, 1) COUNT_EXTERNAL_REFERENCE
(StringSubstring, 3, 1) COUNT_EXTERNAL_REFERENCE(StringToArray
, 2, 1) COUNT_EXTERNAL_REFERENCE(CreatePrivateNameSymbol, 1, 1
) COUNT_EXTERNAL_REFERENCE(CreatePrivateBrandSymbol, 1, 1) COUNT_EXTERNAL_REFERENCE
(CreatePrivateSymbol, -1 , 1) COUNT_EXTERNAL_REFERENCE(SymbolDescriptiveString
, 1, 1) COUNT_EXTERNAL_REFERENCE(SymbolIsPrivate, 1, 1) COUNT_EXTERNAL_REFERENCE
(Abort, 1, 1) COUNT_EXTERNAL_REFERENCE(AbortCSADcheck, 1, 1) COUNT_EXTERNAL_REFERENCE
(AbortJS, 1, 1) COUNT_EXTERNAL_REFERENCE(ActiveTierIsMaglev, 1
, 1) COUNT_EXTERNAL_REFERENCE(ArrayIteratorProtector, 0, 1) COUNT_EXTERNAL_REFERENCE
(ArraySpeciesProtector, 0, 1) COUNT_EXTERNAL_REFERENCE(BaselineOsr
, -1, 1) COUNT_EXTERNAL_REFERENCE(BenchMaglev, 2, 1) COUNT_EXTERNAL_REFERENCE
(ClearFunctionFeedback, 1, 1) COUNT_EXTERNAL_REFERENCE(ClearMegamorphicStubCache
, 0, 1) COUNT_EXTERNAL_REFERENCE(CompleteInobjectSlackTracking
, 1, 1) COUNT_EXTERNAL_REFERENCE(ConstructConsString, 2, 1) COUNT_EXTERNAL_REFERENCE
(ConstructDouble, 2, 1) COUNT_EXTERNAL_REFERENCE(ConstructSlicedString
, 2, 1) COUNT_EXTERNAL_REFERENCE(DebugPrint, 1, 1) COUNT_EXTERNAL_REFERENCE
(DebugPrintPtr, 1, 1) COUNT_EXTERNAL_REFERENCE(DebugTrace, 0,
1) COUNT_EXTERNAL_REFERENCE(DebugTrackRetainingPath, -1, 1) COUNT_EXTERNAL_REFERENCE
(DeoptimizeFunction, 1, 1) COUNT_EXTERNAL_REFERENCE(DisableOptimizationFinalization
, 0, 1) COUNT_EXTERNAL_REFERENCE(DisallowCodegenFromStrings, 1
, 1) COUNT_EXTERNAL_REFERENCE(DisassembleFunction, 1, 1) COUNT_EXTERNAL_REFERENCE
(EnableCodeLoggingForTesting, 0, 1) COUNT_EXTERNAL_REFERENCE(
EnsureFeedbackVectorForFunction, 1, 1) COUNT_EXTERNAL_REFERENCE
(FinalizeOptimization, 0, 1) COUNT_EXTERNAL_REFERENCE(GetCallable
, 0, 1) COUNT_EXTERNAL_REFERENCE(GetInitializerFunction, 1, 1
) COUNT_EXTERNAL_REFERENCE(GetOptimizationStatus, 1, 1) COUNT_EXTERNAL_REFERENCE
(GetUndetectable, 0, 1) COUNT_EXTERNAL_REFERENCE(GlobalPrint,
1, 1) COUNT_EXTERNAL_REFERENCE(HasDictionaryElements, 1, 1) COUNT_EXTERNAL_REFERENCE
(HasDoubleElements, 1, 1) COUNT_EXTERNAL_REFERENCE(HasElementsInALargeObjectSpace
, 1, 1) COUNT_EXTERNAL_REFERENCE(HasFastElements, 1, 1) COUNT_EXTERNAL_REFERENCE
(HasFastProperties, 1, 1) COUNT_EXTERNAL_REFERENCE(HasFixedBigInt64Elements
, 1, 1) COUNT_EXTERNAL_REFERENCE(HasFixedBigUint64Elements, 1
, 1) COUNT_EXTERNAL_REFERENCE(HasFixedFloat32Elements, 1, 1) COUNT_EXTERNAL_REFERENCE
(HasFixedFloat64Elements, 1, 1) COUNT_EXTERNAL_REFERENCE(HasFixedInt16Elements
, 1, 1) COUNT_EXTERNAL_REFERENCE(HasFixedInt32Elements, 1, 1)
COUNT_EXTERNAL_REFERENCE(HasFixedInt8Elements, 1, 1) COUNT_EXTERNAL_REFERENCE
(HasFixedUint16Elements, 1, 1) COUNT_EXTERNAL_REFERENCE(HasFixedUint32Elements
, 1, 1) COUNT_EXTERNAL_REFERENCE(HasFixedUint8ClampedElements
, 1, 1) COUNT_EXTERNAL_REFERENCE(HasFixedUint8Elements, 1, 1)
COUNT_EXTERNAL_REFERENCE(HasHoleyElements, 1, 1) COUNT_EXTERNAL_REFERENCE
(HasObjectElements, 1, 1) COUNT_EXTERNAL_REFERENCE(HasOwnConstDataProperty
, 2, 1) COUNT_EXTERNAL_REFERENCE(HasPackedElements, 1, 1) COUNT_EXTERNAL_REFERENCE
(HasSloppyArgumentsElements, 1, 1) COUNT_EXTERNAL_REFERENCE(HasSmiElements
, 1, 1) COUNT_EXTERNAL_REFERENCE(HasSmiOrObjectElements, 1, 1
) COUNT_EXTERNAL_REFERENCE(HaveSameMap, 2, 1) COUNT_EXTERNAL_REFERENCE
(HeapObjectVerify, 1, 1) COUNT_EXTERNAL_REFERENCE(ICsAreEnabled
, 0, 1) COUNT_EXTERNAL_REFERENCE(InLargeObjectSpace, 1, 1) COUNT_EXTERNAL_REFERENCE
(InYoungGeneration, 1, 1) COUNT_EXTERNAL_REFERENCE(Is64Bit, 0
, 1) COUNT_EXTERNAL_REFERENCE(IsAtomicsWaitAllowed, 0, 1) COUNT_EXTERNAL_REFERENCE
(IsBeingInterpreted, 0, 1) COUNT_EXTERNAL_REFERENCE(IsConcatSpreadableProtector
, 0, 1) COUNT_EXTERNAL_REFERENCE(IsConcurrentRecompilationSupported
, 0, 1) COUNT_EXTERNAL_REFERENCE(IsDictPropertyConstTrackingEnabled
, 0, 1) COUNT_EXTERNAL_REFERENCE(IsSameHeapObject, 2, 1) COUNT_EXTERNAL_REFERENCE
(IsSharedString, 1, 1) COUNT_EXTERNAL_REFERENCE(MapIteratorProtector
, 0, 1) COUNT_EXTERNAL_REFERENCE(NeverOptimizeFunction, 1, 1)
COUNT_EXTERNAL_REFERENCE(NewRegExpWithBacktrackLimit, 3, 1) COUNT_EXTERNAL_REFERENCE
(NotifyContextDisposed, 0, 1) COUNT_EXTERNAL_REFERENCE(OptimizeMaglevOnNextCall
, 1, 1) COUNT_EXTERNAL_REFERENCE(OptimizeFunctionOnNextCall, -
1, 1) COUNT_EXTERNAL_REFERENCE(OptimizeOsr, -1, 1) COUNT_EXTERNAL_REFERENCE
(PrepareFunctionForOptimization, -1, 1) COUNT_EXTERNAL_REFERENCE
(PretenureAllocationSite, 1, 1) COUNT_EXTERNAL_REFERENCE(PrintWithNameForAssert
, 2, 1) COUNT_EXTERNAL_REFERENCE(PromiseSpeciesProtector, 0, 1
) COUNT_EXTERNAL_REFERENCE(RegExpSpeciesProtector, 0, 1) COUNT_EXTERNAL_REFERENCE
(RegexpHasBytecode, 2, 1) COUNT_EXTERNAL_REFERENCE(RegexpHasNativeCode
, 2, 1) COUNT_EXTERNAL_REFERENCE(RegexpIsUnmodified, 1, 1) COUNT_EXTERNAL_REFERENCE
(RegexpTypeTag, 1, 1) COUNT_EXTERNAL_REFERENCE(RunningInSimulator
, 0, 1) COUNT_EXTERNAL_REFERENCE(RuntimeEvaluateREPL, 1, 1) COUNT_EXTERNAL_REFERENCE
(ScheduleGCInStackCheck, 0, 1) COUNT_EXTERNAL_REFERENCE(SerializeDeserializeNow
, 0, 1) COUNT_EXTERNAL_REFERENCE(SetAllocationTimeout, -1 , 1
) COUNT_EXTERNAL_REFERENCE(SetForceSlowPath, 1, 1) COUNT_EXTERNAL_REFERENCE
(SetIteratorProtector, 0, 1) COUNT_EXTERNAL_REFERENCE(SharedGC
, 0, 1) COUNT_EXTERNAL_REFERENCE(SimulateNewspaceFull, 0, 1) COUNT_EXTERNAL_REFERENCE
(StringIteratorProtector, 0, 1) COUNT_EXTERNAL_REFERENCE(SystemBreak
, 0, 1) COUNT_EXTERNAL_REFERENCE(TakeHeapSnapshot, -1, 1) COUNT_EXTERNAL_REFERENCE
(TraceEnter, 0, 1) COUNT_EXTERNAL_REFERENCE(TraceExit, 1, 1) COUNT_EXTERNAL_REFERENCE
(TurbofanStaticAssert, 1, 1) COUNT_EXTERNAL_REFERENCE(TypedArraySpeciesProtector
, 0, 1) COUNT_EXTERNAL_REFERENCE(WaitForBackgroundOptimization
, 0, 1) COUNT_EXTERNAL_REFERENCE(WebSnapshotDeserialize, -1, 1
) COUNT_EXTERNAL_REFERENCE(WebSnapshotSerialize, -1, 1) COUNT_EXTERNAL_REFERENCE
(DeoptimizeNow, 0, 1) COUNT_EXTERNAL_REFERENCE(ArrayBufferDetach
, 1, 1) COUNT_EXTERNAL_REFERENCE(GrowableSharedArrayBufferByteLength
, 1, 1) COUNT_EXTERNAL_REFERENCE(TypedArrayCopyElements, 3, 1
) COUNT_EXTERNAL_REFERENCE(TypedArrayGetBuffer, 1, 1) COUNT_EXTERNAL_REFERENCE
(TypedArraySet, 2, 1) COUNT_EXTERNAL_REFERENCE(TypedArraySortFast
, 1, 1) COUNT_EXTERNAL_REFERENCE(ThrowWasmError, 1, 1) COUNT_EXTERNAL_REFERENCE
(ThrowWasmStackOverflow, 0, 1) COUNT_EXTERNAL_REFERENCE(WasmI32AtomicWait
, 4, 1) COUNT_EXTERNAL_REFERENCE(WasmI64AtomicWait, 5, 1) COUNT_EXTERNAL_REFERENCE
(WasmAtomicNotify, 3, 1) COUNT_EXTERNAL_REFERENCE(WasmMemoryGrow
, 2, 1) COUNT_EXTERNAL_REFERENCE(WasmStackGuard, 0, 1) COUNT_EXTERNAL_REFERENCE
(WasmThrow, 2, 1) COUNT_EXTERNAL_REFERENCE(WasmReThrow, 1, 1)
COUNT_EXTERNAL_REFERENCE(WasmThrowJSTypeError, 0, 1) COUNT_EXTERNAL_REFERENCE
(WasmRefFunc, 1, 1) COUNT_EXTERNAL_REFERENCE(WasmFunctionTableGet
, 3, 1) COUNT_EXTERNAL_REFERENCE(WasmFunctionTableSet, 4, 1) COUNT_EXTERNAL_REFERENCE
(WasmTableInit, 6, 1) COUNT_EXTERNAL_REFERENCE(WasmTableCopy,
6, 1) COUNT_EXTERNAL_REFERENCE(WasmTableGrow, 3, 1) COUNT_EXTERNAL_REFERENCE
(WasmTableFill, 5, 1) COUNT_EXTERNAL_REFERENCE(WasmIsValidRefValue
, 3, 1) COUNT_EXTERNAL_REFERENCE(WasmCompileLazy, 2, 1) COUNT_EXTERNAL_REFERENCE
(WasmCompileWrapper, 2, 1) COUNT_EXTERNAL_REFERENCE(WasmTriggerTierUp
, 1, 1) COUNT_EXTERNAL_REFERENCE(WasmDebugBreak, 0, 1) COUNT_EXTERNAL_REFERENCE
(WasmArrayCopy, 5, 1) COUNT_EXTERNAL_REFERENCE(WasmArrayInitFromData
, 5, 1) COUNT_EXTERNAL_REFERENCE(WasmAllocateContinuation, 1,
1) COUNT_EXTERNAL_REFERENCE(WasmSyncStackLimit, 0, 1) COUNT_EXTERNAL_REFERENCE
(WasmCreateResumePromise, 2, 1) COUNT_EXTERNAL_REFERENCE(DeserializeWasmModule
, 2, 1) COUNT_EXTERNAL_REFERENCE(DisallowWasmCodegen, 1, 1) COUNT_EXTERNAL_REFERENCE
(FreezeWasmLazyCompilation, 1, 1) COUNT_EXTERNAL_REFERENCE(GetWasmExceptionTagId
, 2, 1) COUNT_EXTERNAL_REFERENCE(GetWasmExceptionValues, 1, 1
) COUNT_EXTERNAL_REFERENCE(GetWasmRecoveredTrapCount, 0, 1) COUNT_EXTERNAL_REFERENCE
(IsAsmWasmCode, 1, 1) COUNT_EXTERNAL_REFERENCE(IsLiftoffFunction
, 1, 1) COUNT_EXTERNAL_REFERENCE(IsTurboFanFunction, 1, 1) COUNT_EXTERNAL_REFERENCE
(IsThreadInWasm, 0, 1) COUNT_EXTERNAL_REFERENCE(IsWasmCode, 1
, 1) COUNT_EXTERNAL_REFERENCE(IsWasmTrapHandlerEnabled, 0, 1)
COUNT_EXTERNAL_REFERENCE(SerializeWasmModule, 1, 1) COUNT_EXTERNAL_REFERENCE
(SetWasmCompileControls, 2, 1) COUNT_EXTERNAL_REFERENCE(SetWasmInstantiateControls
, 0, 1) COUNT_EXTERNAL_REFERENCE(WasmGetNumberOfInstances, 1,
1) COUNT_EXTERNAL_REFERENCE(WasmNumCodeSpaces, 1, 1) COUNT_EXTERNAL_REFERENCE
(WasmTierDown, 0, 1) COUNT_EXTERNAL_REFERENCE(WasmTierUp, 0, 1
) COUNT_EXTERNAL_REFERENCE(WasmTierUpFunction, 2, 1) COUNT_EXTERNAL_REFERENCE
(WasmTraceEnter, 0, 1) COUNT_EXTERNAL_REFERENCE(WasmTraceExit
, 1, 1) COUNT_EXTERNAL_REFERENCE(WasmTraceMemory, 1, 1) COUNT_EXTERNAL_REFERENCE
(JSFinalizationRegistryRegisterWeakCellWithUnregisterToken, 4
, 1) COUNT_EXTERNAL_REFERENCE(JSWeakRefAddToKeptObjects, 1, 1
) COUNT_EXTERNAL_REFERENCE(ShrinkFinalizationRegistryUnregisterTokenMap
, 1, 1)
;
258 static constexpr uint32_t kNumExternalReferences =
259 kNumExternalReferencesList + kNumExternalReferencesIntrinsics;
260#undef COUNT_EXTERNAL_REFERENCE
261
262 Address external_reference_by_tag_[kNumExternalReferences] = {
263#define EXT_REF_ADDR(name, desc) ExternalReference::name().address(),
264 EXTERNAL_REFERENCE_LIST(EXT_REF_ADDR)EXT_REF_ADDR(abort_with_reason, "abort_with_reason") EXT_REF_ADDR
(address_of_builtin_subclassing_flag, "FLAG_builtin_subclassing"
) EXT_REF_ADDR(address_of_double_abs_constant, "double_absolute_constant"
) EXT_REF_ADDR(address_of_double_neg_constant, "double_negate_constant"
) EXT_REF_ADDR(address_of_enable_experimental_regexp_engine, "address_of_enable_experimental_regexp_engine"
) EXT_REF_ADDR(address_of_float_abs_constant, "float_absolute_constant"
) EXT_REF_ADDR(address_of_float_neg_constant, "float_negate_constant"
) EXT_REF_ADDR(address_of_min_int, "LDoubleConstant::min_int"
) EXT_REF_ADDR(address_of_mock_arraybuffer_allocator_flag, "FLAG_mock_arraybuffer_allocator"
) EXT_REF_ADDR(address_of_one_half, "LDoubleConstant::one_half"
) EXT_REF_ADDR(address_of_runtime_stats_flag, "TracingFlags::runtime_stats"
) EXT_REF_ADDR(address_of_shared_string_table_flag, "FLAG_shared_string_table"
) EXT_REF_ADDR(address_of_the_hole_nan, "the_hole_nan") EXT_REF_ADDR
(address_of_uint32_bias, "uint32_bias") EXT_REF_ADDR(baseline_pc_for_bytecode_offset
, "BaselinePCForBytecodeOffset") EXT_REF_ADDR(baseline_pc_for_next_executed_bytecode
, "BaselinePCForNextExecutedBytecode") EXT_REF_ADDR(bytecode_size_table_address
, "Bytecodes::bytecode_size_table_address") EXT_REF_ADDR(check_object_type
, "check_object_type") EXT_REF_ADDR(compute_integer_hash, "ComputeSeededHash"
) EXT_REF_ADDR(compute_output_frames_function, "Deoptimizer::ComputeOutputFrames()"
) EXT_REF_ADDR(copy_fast_number_jsarray_elements_to_typed_array
, "copy_fast_number_jsarray_elements_to_typed_array") EXT_REF_ADDR
(copy_typed_array_elements_slice, "copy_typed_array_elements_slice"
) EXT_REF_ADDR(copy_typed_array_elements_to_typed_array, "copy_typed_array_elements_to_typed_array"
) EXT_REF_ADDR(cpu_features, "cpu_features") EXT_REF_ADDR(delete_handle_scope_extensions
, "HandleScope::DeleteExtensions") EXT_REF_ADDR(ephemeron_key_write_barrier_function
, "Heap::EphemeronKeyWriteBarrierFromCode") EXT_REF_ADDR(f64_acos_wrapper_function
, "f64_acos_wrapper") EXT_REF_ADDR(f64_asin_wrapper_function,
"f64_asin_wrapper") EXT_REF_ADDR(f64_mod_wrapper_function, "f64_mod_wrapper"
) EXT_REF_ADDR(get_date_field_function, "JSDate::GetField") EXT_REF_ADDR
(get_or_create_hash_raw, "get_or_create_hash_raw") EXT_REF_ADDR
(gsab_byte_length, "GsabByteLength") EXT_REF_ADDR(ieee754_acos_function
, "base::ieee754::acos") EXT_REF_ADDR(ieee754_acosh_function,
"base::ieee754::acosh") EXT_REF_ADDR(ieee754_asin_function, "base::ieee754::asin"
) EXT_REF_ADDR(ieee754_asinh_function, "base::ieee754::asinh"
) EXT_REF_ADDR(ieee754_atan_function, "base::ieee754::atan") EXT_REF_ADDR
(ieee754_atan2_function, "base::ieee754::atan2") EXT_REF_ADDR
(ieee754_atanh_function, "base::ieee754::atanh") EXT_REF_ADDR
(ieee754_cbrt_function, "base::ieee754::cbrt") EXT_REF_ADDR(ieee754_cos_function
, "base::ieee754::cos") EXT_REF_ADDR(ieee754_cosh_function, "base::ieee754::cosh"
) EXT_REF_ADDR(ieee754_exp_function, "base::ieee754::exp") EXT_REF_ADDR
(ieee754_expm1_function, "base::ieee754::expm1") EXT_REF_ADDR
(ieee754_log_function, "base::ieee754::log") EXT_REF_ADDR(ieee754_log10_function
, "base::ieee754::log10") EXT_REF_ADDR(ieee754_log1p_function
, "base::ieee754::log1p") EXT_REF_ADDR(ieee754_log2_function,
"base::ieee754::log2") EXT_REF_ADDR(ieee754_pow_function, "base::ieee754::pow"
) EXT_REF_ADDR(ieee754_sin_function, "base::ieee754::sin") EXT_REF_ADDR
(ieee754_sinh_function, "base::ieee754::sinh") EXT_REF_ADDR(ieee754_tan_function
, "base::ieee754::tan") EXT_REF_ADDR(ieee754_tanh_function, "base::ieee754::tanh"
) EXT_REF_ADDR(insert_remembered_set_function, "Heap::InsertIntoRememberedSetFromCode"
) EXT_REF_ADDR(invalidate_prototype_chains_function, "JSObject::InvalidatePrototypeChains()"
) EXT_REF_ADDR(invoke_accessor_getter_callback, "InvokeAccessorGetterCallback"
) EXT_REF_ADDR(invoke_function_callback, "InvokeFunctionCallback"
) EXT_REF_ADDR(jsarray_array_join_concat_to_sequential_string
, "jsarray_array_join_concat_to_sequential_string") EXT_REF_ADDR
(jsreceiver_create_identity_hash, "jsreceiver_create_identity_hash"
) EXT_REF_ADDR(libc_memchr_function, "libc_memchr") EXT_REF_ADDR
(libc_memcpy_function, "libc_memcpy") EXT_REF_ADDR(libc_memmove_function
, "libc_memmove") EXT_REF_ADDR(libc_memset_function, "libc_memset"
) EXT_REF_ADDR(relaxed_memcpy_function, "relaxed_memcpy") EXT_REF_ADDR
(relaxed_memmove_function, "relaxed_memmove") EXT_REF_ADDR(mod_two_doubles_operation
, "mod_two_doubles") EXT_REF_ADDR(mutable_big_int_absolute_add_and_canonicalize_function
, "MutableBigInt_AbsoluteAddAndCanonicalize") EXT_REF_ADDR(mutable_big_int_absolute_compare_function
, "MutableBigInt_AbsoluteCompare") EXT_REF_ADDR(mutable_big_int_absolute_sub_and_canonicalize_function
, "MutableBigInt_AbsoluteSubAndCanonicalize") EXT_REF_ADDR(new_deoptimizer_function
, "Deoptimizer::New()") EXT_REF_ADDR(orderedhashmap_gethash_raw
, "orderedhashmap_gethash_raw") EXT_REF_ADDR(printf_function,
"printf") EXT_REF_ADDR(refill_math_random, "MathRandom::RefillCache"
) EXT_REF_ADDR(search_string_raw_one_one, "search_string_raw_one_one"
) EXT_REF_ADDR(search_string_raw_one_two, "search_string_raw_one_two"
) EXT_REF_ADDR(search_string_raw_two_one, "search_string_raw_two_one"
) EXT_REF_ADDR(search_string_raw_two_two, "search_string_raw_two_two"
) EXT_REF_ADDR(string_write_to_flat_one_byte, "string_write_to_flat_one_byte"
) EXT_REF_ADDR(string_write_to_flat_two_byte, "string_write_to_flat_two_byte"
) EXT_REF_ADDR(external_one_byte_string_get_chars, "external_one_byte_string_get_chars"
) EXT_REF_ADDR(external_two_byte_string_get_chars, "external_two_byte_string_get_chars"
) EXT_REF_ADDR(smi_lexicographic_compare_function, "smi_lexicographic_compare_function"
) EXT_REF_ADDR(string_to_array_index_function, "String::ToArrayIndex"
) EXT_REF_ADDR(try_string_to_index_or_lookup_existing, "try_string_to_index_or_lookup_existing"
) EXT_REF_ADDR(wasm_call_trap_callback_for_testing, "wasm::call_trap_callback_for_testing"
) EXT_REF_ADDR(wasm_f32_ceil, "wasm::f32_ceil_wrapper") EXT_REF_ADDR
(wasm_f32_floor, "wasm::f32_floor_wrapper") EXT_REF_ADDR(wasm_f32_nearest_int
, "wasm::f32_nearest_int_wrapper") EXT_REF_ADDR(wasm_f32_trunc
, "wasm::f32_trunc_wrapper") EXT_REF_ADDR(wasm_f64_ceil, "wasm::f64_ceil_wrapper"
) EXT_REF_ADDR(wasm_f64_floor, "wasm::f64_floor_wrapper") EXT_REF_ADDR
(wasm_f64_nearest_int, "wasm::f64_nearest_int_wrapper") EXT_REF_ADDR
(wasm_f64_trunc, "wasm::f64_trunc_wrapper") EXT_REF_ADDR(wasm_float32_to_int64
, "wasm::float32_to_int64_wrapper") EXT_REF_ADDR(wasm_float32_to_uint64
, "wasm::float32_to_uint64_wrapper") EXT_REF_ADDR(wasm_float32_to_int64_sat
, "wasm::float32_to_int64_sat_wrapper") EXT_REF_ADDR(wasm_float32_to_uint64_sat
, "wasm::float32_to_uint64_sat_wrapper") EXT_REF_ADDR(wasm_float64_pow
, "wasm::float64_pow") EXT_REF_ADDR(wasm_float64_to_int64, "wasm::float64_to_int64_wrapper"
) EXT_REF_ADDR(wasm_float64_to_uint64, "wasm::float64_to_uint64_wrapper"
) EXT_REF_ADDR(wasm_float64_to_int64_sat, "wasm::float64_to_int64_sat_wrapper"
) EXT_REF_ADDR(wasm_float64_to_uint64_sat, "wasm::float64_to_uint64_sat_wrapper"
) EXT_REF_ADDR(wasm_int64_div, "wasm::int64_div") EXT_REF_ADDR
(wasm_int64_mod, "wasm::int64_mod") EXT_REF_ADDR(wasm_int64_to_float32
, "wasm::int64_to_float32_wrapper") EXT_REF_ADDR(wasm_int64_to_float64
, "wasm::int64_to_float64_wrapper") EXT_REF_ADDR(wasm_uint64_div
, "wasm::uint64_div") EXT_REF_ADDR(wasm_uint64_mod, "wasm::uint64_mod"
) EXT_REF_ADDR(wasm_uint64_to_float32, "wasm::uint64_to_float32_wrapper"
) EXT_REF_ADDR(wasm_uint64_to_float64, "wasm::uint64_to_float64_wrapper"
) EXT_REF_ADDR(wasm_word32_ctz, "wasm::word32_ctz") EXT_REF_ADDR
(wasm_word32_popcnt, "wasm::word32_popcnt") EXT_REF_ADDR(wasm_word32_rol
, "wasm::word32_rol") EXT_REF_ADDR(wasm_word32_ror, "wasm::word32_ror"
) EXT_REF_ADDR(wasm_word64_rol, "wasm::word64_rol") EXT_REF_ADDR
(wasm_word64_ror, "wasm::word64_ror") EXT_REF_ADDR(wasm_word64_ctz
, "wasm::word64_ctz") EXT_REF_ADDR(wasm_word64_popcnt, "wasm::word64_popcnt"
) EXT_REF_ADDR(wasm_f64x2_ceil, "wasm::f64x2_ceil_wrapper") EXT_REF_ADDR
(wasm_f64x2_floor, "wasm::f64x2_floor_wrapper") EXT_REF_ADDR(
wasm_f64x2_trunc, "wasm::f64x2_trunc_wrapper") EXT_REF_ADDR(wasm_f64x2_nearest_int
, "wasm::f64x2_nearest_int_wrapper") EXT_REF_ADDR(wasm_f32x4_ceil
, "wasm::f32x4_ceil_wrapper") EXT_REF_ADDR(wasm_f32x4_floor, "wasm::f32x4_floor_wrapper"
) EXT_REF_ADDR(wasm_f32x4_trunc, "wasm::f32x4_trunc_wrapper")
EXT_REF_ADDR(wasm_f32x4_nearest_int, "wasm::f32x4_nearest_int_wrapper"
) EXT_REF_ADDR(wasm_memory_init, "wasm::memory_init") EXT_REF_ADDR
(wasm_memory_copy, "wasm::memory_copy") EXT_REF_ADDR(wasm_memory_fill
, "wasm::memory_fill") EXT_REF_ADDR(wasm_array_copy, "wasm::array_copy"
) EXT_REF_ADDR(address_of_wasm_i8x16_swizzle_mask, "wasm_i8x16_swizzle_mask"
) EXT_REF_ADDR(address_of_wasm_i8x16_popcnt_mask, "wasm_i8x16_popcnt_mask"
) EXT_REF_ADDR(address_of_wasm_i8x16_splat_0x01, "wasm_i8x16_splat_0x01"
) EXT_REF_ADDR(address_of_wasm_i8x16_splat_0x0f, "wasm_i8x16_splat_0x0f"
) EXT_REF_ADDR(address_of_wasm_i8x16_splat_0x33, "wasm_i8x16_splat_0x33"
) EXT_REF_ADDR(address_of_wasm_i8x16_splat_0x55, "wasm_i8x16_splat_0x55"
) EXT_REF_ADDR(address_of_wasm_i16x8_splat_0x0001, "wasm_16x8_splat_0x0001"
) EXT_REF_ADDR(address_of_wasm_f64x2_convert_low_i32x4_u_int_mask
, "wasm_f64x2_convert_low_i32x4_u_int_mask") EXT_REF_ADDR(supports_wasm_simd_128_address
, "wasm::supports_wasm_simd_128_address") EXT_REF_ADDR(address_of_wasm_double_2_power_52
, "wasm_double_2_power_52") EXT_REF_ADDR(address_of_wasm_int32_max_as_double
, "wasm_int32_max_as_double") EXT_REF_ADDR(address_of_wasm_uint32_max_as_double
, "wasm_uint32_max_as_double") EXT_REF_ADDR(address_of_wasm_int32_overflow_as_float
, "wasm_int32_overflow_as_float") EXT_REF_ADDR(supports_cetss_address
, "CpuFeatures::supports_cetss_address") EXT_REF_ADDR(write_barrier_marking_from_code_function
, "WriteBarrier::MarkingFromCode") EXT_REF_ADDR(call_enqueue_microtask_function
, "MicrotaskQueue::CallEnqueueMicrotask") EXT_REF_ADDR(call_enter_context_function
, "call_enter_context_function") EXT_REF_ADDR(atomic_pair_load_function
, "atomic_pair_load_function") EXT_REF_ADDR(atomic_pair_store_function
, "atomic_pair_store_function") EXT_REF_ADDR(atomic_pair_add_function
, "atomic_pair_add_function") EXT_REF_ADDR(atomic_pair_sub_function
, "atomic_pair_sub_function") EXT_REF_ADDR(atomic_pair_and_function
, "atomic_pair_and_function") EXT_REF_ADDR(atomic_pair_or_function
, "atomic_pair_or_function") EXT_REF_ADDR(atomic_pair_xor_function
, "atomic_pair_xor_function") EXT_REF_ADDR(atomic_pair_exchange_function
, "atomic_pair_exchange_function") EXT_REF_ADDR(atomic_pair_compare_exchange_function
, "atomic_pair_compare_exchange_function") EXT_REF_ADDR(js_finalization_registry_remove_cell_from_unregister_token_map
, "JSFinalizationRegistry::RemoveCellFromUnregisterTokenMap")
EXT_REF_ADDR(re_case_insensitive_compare_unicode, "RegExpMacroAssembler::CaseInsensitiveCompareUnicode()"
) EXT_REF_ADDR(re_case_insensitive_compare_non_unicode, "RegExpMacroAssembler::CaseInsensitiveCompareNonUnicode()"
) EXT_REF_ADDR(re_is_character_in_range_array, "RegExpMacroAssembler::IsCharacterInRangeArray()"
) EXT_REF_ADDR(re_check_stack_guard_state, "RegExpMacroAssembler*::CheckStackGuardState()"
) EXT_REF_ADDR(re_grow_stack, "NativeRegExpMacroAssembler::GrowStack()"
) EXT_REF_ADDR(re_word_character_map, "NativeRegExpMacroAssembler::word_character_map"
) EXT_REF_ADDR(re_match_for_call_from_js, "IrregexpInterpreter::MatchForCallFromJs"
) EXT_REF_ADDR(re_experimental_match_for_call_from_js, "ExperimentalRegExp::MatchForCallFromJs"
) EXT_REF_ADDR(intl_convert_one_byte_to_lower, "intl_convert_one_byte_to_lower"
) EXT_REF_ADDR(intl_to_latin1_lower_table, "intl_to_latin1_lower_table"
) EXT_REF_ADDR(intl_ascii_collation_weights_l1, "Intl::AsciiCollationWeightsL1"
) EXT_REF_ADDR(intl_ascii_collation_weights_l3, "Intl::AsciiCollationWeightsL3"
)
265#undef EXT_REF_ADDR
266#define RUNTIME_ADDR(name, ...) \
267 ExternalReference::Create(Runtime::k##name).address(),
268 FOR_EACH_INTRINSIC(RUNTIME_ADDR)RUNTIME_ADDR(DebugBreakOnBytecode, 1, 2) RUNTIME_ADDR(LoadLookupSlotForCall
, 1, 2) RUNTIME_ADDR(ArrayIncludes_Slow, 3, 1) RUNTIME_ADDR(ArrayIndexOf
, 3, 1) RUNTIME_ADDR(ArrayIsArray, 1, 1) RUNTIME_ADDR(ArraySpeciesConstructor
, 1, 1) RUNTIME_ADDR(GrowArrayElements, 2, 1) RUNTIME_ADDR(IsArray
, 1, 1) RUNTIME_ADDR(NewArray, -1 , 1) RUNTIME_ADDR(NormalizeElements
, 1, 1) RUNTIME_ADDR(TransitionElementsKind, 2, 1) RUNTIME_ADDR
(TransitionElementsKindWithKind, 2, 1) RUNTIME_ADDR(AtomicsLoad64
, 2, 1) RUNTIME_ADDR(AtomicsStore64, 3, 1) RUNTIME_ADDR(AtomicsAdd
, 3, 1) RUNTIME_ADDR(AtomicsAnd, 3, 1) RUNTIME_ADDR(AtomicsCompareExchange
, 4, 1) RUNTIME_ADDR(AtomicsExchange, 3, 1) RUNTIME_ADDR(AtomicsNumWaitersForTesting
, 2, 1) RUNTIME_ADDR(AtomicsNumAsyncWaitersForTesting, 0, 1) RUNTIME_ADDR
(AtomicsNumUnresolvedAsyncPromisesForTesting, 2, 1) RUNTIME_ADDR
(AtomicsOr, 3, 1) RUNTIME_ADDR(AtomicsSub, 3, 1) RUNTIME_ADDR
(AtomicsXor, 3, 1) RUNTIME_ADDR(SetAllowAtomicsWait, 1, 1) RUNTIME_ADDR
(AtomicsLoadSharedStructField, 2, 1) RUNTIME_ADDR(AtomicsStoreSharedStructField
, 3, 1) RUNTIME_ADDR(AtomicsExchangeSharedStructField, 3, 1) RUNTIME_ADDR
(BigIntBinaryOp, 3, 1) RUNTIME_ADDR(BigIntCompareToBigInt, 3,
1) RUNTIME_ADDR(BigIntCompareToNumber, 3, 1) RUNTIME_ADDR(BigIntCompareToString
, 3, 1) RUNTIME_ADDR(BigIntEqualToBigInt, 2, 1) RUNTIME_ADDR(
BigIntEqualToNumber, 2, 1) RUNTIME_ADDR(BigIntEqualToString, 2
, 1) RUNTIME_ADDR(BigIntMaxLengthBits, 0, 1) RUNTIME_ADDR(BigIntToBoolean
, 1, 1) RUNTIME_ADDR(BigIntToNumber, 1, 1) RUNTIME_ADDR(BigIntUnaryOp
, 2, 1) RUNTIME_ADDR(ToBigInt, 1, 1) RUNTIME_ADDR(DefineClass
, -1 , 1) RUNTIME_ADDR(LoadFromSuper, 3, 1) RUNTIME_ADDR(LoadKeyedFromSuper
, 3, 1) RUNTIME_ADDR(StoreKeyedToSuper, 4, 1) RUNTIME_ADDR(StoreToSuper
, 4, 1) RUNTIME_ADDR(ThrowConstructorNonCallableError, 1, 1) RUNTIME_ADDR
(ThrowNotSuperConstructor, 2, 1) RUNTIME_ADDR(ThrowStaticPrototypeError
, 0, 1) RUNTIME_ADDR(ThrowSuperAlreadyCalledError, 0, 1) RUNTIME_ADDR
(ThrowSuperNotCalled, 0, 1) RUNTIME_ADDR(ThrowUnsupportedSuperError
, 0, 1) RUNTIME_ADDR(MapGrow, 1, 1) RUNTIME_ADDR(MapShrink, 1
, 1) RUNTIME_ADDR(SetGrow, 1, 1) RUNTIME_ADDR(SetShrink, 1, 1
) RUNTIME_ADDR(TheHole, 0, 1) RUNTIME_ADDR(WeakCollectionDelete
, 3, 1) RUNTIME_ADDR(WeakCollectionSet, 4, 1) RUNTIME_ADDR(CompileOptimizedOSR
, 0, 1) RUNTIME_ADDR(CompileLazy, 1, 1) RUNTIME_ADDR(CompileBaseline
, 1, 1) RUNTIME_ADDR(CompileMaglev_Concurrent, 1, 1) RUNTIME_ADDR
(CompileMaglev_Synchronous, 1, 1) RUNTIME_ADDR(CompileTurbofan_Concurrent
, 1, 1) RUNTIME_ADDR(CompileTurbofan_Synchronous, 1, 1) RUNTIME_ADDR
(InstallBaselineCode, 1, 1) RUNTIME_ADDR(HealOptimizedCodeSlot
, 1, 1) RUNTIME_ADDR(InstantiateAsmJs, 4, 1) RUNTIME_ADDR(NotifyDeoptimized
, 0, 1) RUNTIME_ADDR(ObserveNode, 1, 1) RUNTIME_ADDR(ResolvePossiblyDirectEval
, 6, 1) RUNTIME_ADDR(VerifyType, 1, 1) RUNTIME_ADDR(DateCurrentTime
, 0, 1) RUNTIME_ADDR(ClearStepping, 0, 1) RUNTIME_ADDR(CollectGarbage
, 1, 1) RUNTIME_ADDR(DebugAsyncFunctionSuspended, 4, 1) RUNTIME_ADDR
(DebugBreakAtEntry, 1, 1) RUNTIME_ADDR(DebugCollectCoverage, 0
, 1) RUNTIME_ADDR(DebugGetLoadedScriptIds, 0, 1) RUNTIME_ADDR
(DebugOnFunctionCall, 2, 1) RUNTIME_ADDR(DebugPopPromise, 0, 1
) RUNTIME_ADDR(DebugPrepareStepInSuspendedGenerator, 0, 1) RUNTIME_ADDR
(DebugPromiseThen, 1, 1) RUNTIME_ADDR(DebugPushPromise, 1, 1)
RUNTIME_ADDR(DebugToggleBlockCoverage, 1, 1) RUNTIME_ADDR(DebugTogglePreciseCoverage
, 1, 1) RUNTIME_ADDR(FunctionGetInferredName, 1, 1) RUNTIME_ADDR
(GetBreakLocations, 1, 1) RUNTIME_ADDR(GetGeneratorScopeCount
, 1, 1) RUNTIME_ADDR(GetGeneratorScopeDetails, 2, 1) RUNTIME_ADDR
(HandleDebuggerStatement, 0, 1) RUNTIME_ADDR(IsBreakOnException
, 1, 1) RUNTIME_ADDR(LiveEditPatchScript, 2, 1) RUNTIME_ADDR(
ProfileCreateSnapshotDataBlob, 0, 1) RUNTIME_ADDR(ScheduleBreak
, 0, 1) RUNTIME_ADDR(ScriptLocationFromLine2, 4, 1) RUNTIME_ADDR
(SetGeneratorScopeVariableValue, 4, 1) RUNTIME_ADDR(IncBlockCounter
, 2, 1) RUNTIME_ADDR(ForInEnumerate, 1, 1) RUNTIME_ADDR(ForInHasProperty
, 2, 1) RUNTIME_ADDR(Call, -1 , 1) RUNTIME_ADDR(FunctionGetScriptSource
, 1, 1) RUNTIME_ADDR(FunctionGetScriptId, 1, 1) RUNTIME_ADDR(
FunctionGetScriptSourcePosition, 1, 1) RUNTIME_ADDR(FunctionGetSourceCode
, 1, 1) RUNTIME_ADDR(FunctionIsAPIFunction, 1, 1) RUNTIME_ADDR
(IsFunction, 1, 1) RUNTIME_ADDR(AsyncFunctionAwaitCaught, 2, 1
) RUNTIME_ADDR(AsyncFunctionAwaitUncaught, 2, 1) RUNTIME_ADDR
(AsyncFunctionEnter, 2, 1) RUNTIME_ADDR(AsyncFunctionReject, 2
, 1) RUNTIME_ADDR(AsyncFunctionResolve, 2, 1) RUNTIME_ADDR(AsyncGeneratorAwaitCaught
, 2, 1) RUNTIME_ADDR(AsyncGeneratorAwaitUncaught, 2, 1) RUNTIME_ADDR
(AsyncGeneratorHasCatchHandlerForPC, 1, 1) RUNTIME_ADDR(AsyncGeneratorReject
, 2, 1) RUNTIME_ADDR(AsyncGeneratorResolve, 3, 1) RUNTIME_ADDR
(AsyncGeneratorYield, 3, 1) RUNTIME_ADDR(CreateJSGeneratorObject
, 2, 1) RUNTIME_ADDR(GeneratorClose, 1, 1) RUNTIME_ADDR(GeneratorGetFunction
, 1, 1) RUNTIME_ADDR(GeneratorGetResumeMode, 1, 1) RUNTIME_ADDR
(ElementsTransitionAndStoreIC_Miss, 6, 1) RUNTIME_ADDR(KeyedLoadIC_Miss
, 4, 1) RUNTIME_ADDR(KeyedStoreIC_Miss, 5, 1) RUNTIME_ADDR(DefineKeyedOwnIC_Miss
, 5, 1) RUNTIME_ADDR(StoreInArrayLiteralIC_Miss, 5, 1) RUNTIME_ADDR
(DefineNamedOwnIC_Slow, 3, 1) RUNTIME_ADDR(KeyedStoreIC_Slow,
3, 1) RUNTIME_ADDR(DefineKeyedOwnIC_Slow, 3, 1) RUNTIME_ADDR
(LoadElementWithInterceptor, 2, 1) RUNTIME_ADDR(LoadGlobalIC_Miss
, 4, 1) RUNTIME_ADDR(LoadGlobalIC_Slow, 3, 1) RUNTIME_ADDR(LoadIC_Miss
, 4, 1) RUNTIME_ADDR(LoadNoFeedbackIC_Miss, 4, 1) RUNTIME_ADDR
(LoadWithReceiverIC_Miss, 5, 1) RUNTIME_ADDR(LoadWithReceiverNoFeedbackIC_Miss
, 3, 1) RUNTIME_ADDR(LoadPropertyWithInterceptor, 5, 1) RUNTIME_ADDR
(StoreCallbackProperty, 5, 1) RUNTIME_ADDR(StoreGlobalIC_Miss
, 4, 1) RUNTIME_ADDR(StoreGlobalICNoFeedback_Miss, 2, 1) RUNTIME_ADDR
(StoreGlobalIC_Slow, 5, 1) RUNTIME_ADDR(StoreIC_Miss, 5, 1) RUNTIME_ADDR
(DefineNamedOwnIC_Miss, 5, 1) RUNTIME_ADDR(StoreInArrayLiteralIC_Slow
, 5, 1) RUNTIME_ADDR(StorePropertyWithInterceptor, 5, 1) RUNTIME_ADDR
(CloneObjectIC_Miss, 4, 1) RUNTIME_ADDR(KeyedHasIC_Miss, 4, 1
) RUNTIME_ADDR(HasElementWithInterceptor, 2, 1) RUNTIME_ADDR(
AccessCheck, 1, 1) RUNTIME_ADDR(AllocateByteArray, 1, 1) RUNTIME_ADDR
(AllocateInYoungGeneration, 2, 1) RUNTIME_ADDR(AllocateInOldGeneration
, 2, 1) RUNTIME_ADDR(AllocateSeqOneByteString, 1, 1) RUNTIME_ADDR
(AllocateSeqTwoByteString, 1, 1) RUNTIME_ADDR(AllowDynamicFunction
, 1, 1) RUNTIME_ADDR(CreateAsyncFromSyncIterator, 1, 1) RUNTIME_ADDR
(CreateListFromArrayLike, 1, 1) RUNTIME_ADDR(DoubleToStringWithRadix
, 2, 1) RUNTIME_ADDR(FatalProcessOutOfMemoryInAllocateRaw, 0,
1) RUNTIME_ADDR(FatalProcessOutOfMemoryInvalidArrayLength, 0
, 1) RUNTIME_ADDR(GetAndResetRuntimeCallStats, -1 , 1) RUNTIME_ADDR
(GetTemplateObject, 3, 1) RUNTIME_ADDR(IncrementUseCounter, 1
, 1) RUNTIME_ADDR(BytecodeBudgetInterrupt, 1, 1) RUNTIME_ADDR
(BytecodeBudgetInterruptWithStackCheck, 1, 1) RUNTIME_ADDR(NewError
, 2, 1) RUNTIME_ADDR(NewForeign, 0, 1) RUNTIME_ADDR(NewReferenceError
, 2, 1) RUNTIME_ADDR(NewSyntaxError, 2, 1) RUNTIME_ADDR(NewTypeError
, -1 , 1) RUNTIME_ADDR(OrdinaryHasInstance, 2, 1) RUNTIME_ADDR
(PromoteScheduledException, 0, 1) RUNTIME_ADDR(ReportMessageFromMicrotask
, 1, 1) RUNTIME_ADDR(ReThrow, 1, 1) RUNTIME_ADDR(ReThrowWithMessage
, 2, 1) RUNTIME_ADDR(RunMicrotaskCallback, 2, 1) RUNTIME_ADDR
(PerformMicrotaskCheckpoint, 0, 1) RUNTIME_ADDR(SharedValueBarrierSlow
, 1, 1) RUNTIME_ADDR(StackGuard, 0, 1) RUNTIME_ADDR(StackGuardWithGap
, 1, 1) RUNTIME_ADDR(Throw, 1, 1) RUNTIME_ADDR(ThrowApplyNonFunction
, 1, 1) RUNTIME_ADDR(ThrowCalledNonCallable, 1, 1) RUNTIME_ADDR
(ThrowConstructedNonConstructable, 1, 1) RUNTIME_ADDR(ThrowConstructorReturnedNonObject
, 0, 1) RUNTIME_ADDR(ThrowInvalidStringLength, 0, 1) RUNTIME_ADDR
(ThrowInvalidTypedArrayAlignment, 2, 1) RUNTIME_ADDR(ThrowIteratorError
, 1, 1) RUNTIME_ADDR(ThrowSpreadArgError, 2, 1) RUNTIME_ADDR(
ThrowIteratorResultNotAnObject, 1, 1) RUNTIME_ADDR(ThrowNoAccess
, 0, 1) RUNTIME_ADDR(ThrowNotConstructor, 1, 1) RUNTIME_ADDR(
ThrowPatternAssignmentNonCoercible, 1, 1) RUNTIME_ADDR(ThrowRangeError
, -1 , 1) RUNTIME_ADDR(ThrowReferenceError, 1, 1) RUNTIME_ADDR
(ThrowAccessedUninitializedVariable, 1, 1) RUNTIME_ADDR(ThrowStackOverflow
, 0, 1) RUNTIME_ADDR(ThrowSymbolAsyncIteratorInvalid, 0, 1) RUNTIME_ADDR
(ThrowSymbolIteratorInvalid, 0, 1) RUNTIME_ADDR(ThrowThrowMethodMissing
, 0, 1) RUNTIME_ADDR(ThrowTypeError, -1 , 1) RUNTIME_ADDR(ThrowTypeErrorIfStrict
, -1 , 1) RUNTIME_ADDR(Typeof, 1, 1) RUNTIME_ADDR(UnwindAndFindExceptionHandler
, 0, 1) RUNTIME_ADDR(FormatList, 2, 1) RUNTIME_ADDR(FormatListToParts
, 2, 1) RUNTIME_ADDR(StringToLowerCaseIntl, 1, 1) RUNTIME_ADDR
(StringToUpperCaseIntl, 1, 1) RUNTIME_ADDR(CreateArrayLiteral
, 4, 1) RUNTIME_ADDR(CreateArrayLiteralWithoutAllocationSite,
2, 1) RUNTIME_ADDR(CreateObjectLiteral, 4, 1) RUNTIME_ADDR(CreateObjectLiteralWithoutAllocationSite
, 2, 1) RUNTIME_ADDR(CreateRegExpLiteral, 4, 1) RUNTIME_ADDR(
DynamicImportCall, -1 , 1) RUNTIME_ADDR(GetImportMetaObject, 0
, 1) RUNTIME_ADDR(GetModuleNamespace, 1, 1) RUNTIME_ADDR(ArrayBufferMaxByteLength
, 0, 1) RUNTIME_ADDR(GetHoleNaNLower, 0, 1) RUNTIME_ADDR(GetHoleNaNUpper
, 0, 1) RUNTIME_ADDR(IsSmi, 1, 1) RUNTIME_ADDR(MaxSmi, 0, 1) RUNTIME_ADDR
(NumberToStringSlow, 1, 1) RUNTIME_ADDR(StringParseFloat, 1, 1
) RUNTIME_ADDR(StringParseInt, 2, 1) RUNTIME_ADDR(StringToNumber
, 1, 1) RUNTIME_ADDR(TypedArrayMaxLength, 0, 1) RUNTIME_ADDR(
AddDictionaryProperty, 3, 1) RUNTIME_ADDR(AddPrivateBrand, 4,
1) RUNTIME_ADDR(AllocateHeapNumber, 0, 1) RUNTIME_ADDR(CollectTypeProfile
, 3, 1) RUNTIME_ADDR(CompleteInobjectSlackTrackingForMap, 1, 1
) RUNTIME_ADDR(CopyDataProperties, 2, 1) RUNTIME_ADDR(CopyDataPropertiesWithExcludedPropertiesOnStack
, -1 , 1) RUNTIME_ADDR(CreateDataProperty, 3, 1) RUNTIME_ADDR
(CreateIterResultObject, 2, 1) RUNTIME_ADDR(CreatePrivateAccessors
, 2, 1) RUNTIME_ADDR(DefineAccessorPropertyUnchecked, 5, 1) RUNTIME_ADDR
(DefineKeyedOwnPropertyInLiteral, 6, 1) RUNTIME_ADDR(DefineGetterPropertyUnchecked
, 4, 1) RUNTIME_ADDR(DefineSetterPropertyUnchecked, 4, 1) RUNTIME_ADDR
(DeleteProperty, 3, 1) RUNTIME_ADDR(GetDerivedMap, 2, 1) RUNTIME_ADDR
(GetFunctionName, 1, 1) RUNTIME_ADDR(GetOwnPropertyDescriptor
, 2, 1) RUNTIME_ADDR(GetOwnPropertyKeys, 2, 1) RUNTIME_ADDR(GetProperty
, -1 , 1) RUNTIME_ADDR(HasFastPackedElements, 1, 1) RUNTIME_ADDR
(HasInPrototypeChain, 2, 1) RUNTIME_ADDR(HasProperty, 2, 1) RUNTIME_ADDR
(InternalSetPrototype, 2, 1) RUNTIME_ADDR(IsJSReceiver, 1, 1)
RUNTIME_ADDR(JSReceiverPreventExtensionsDontThrow, 1, 1) RUNTIME_ADDR
(JSReceiverPreventExtensionsThrow, 1, 1) RUNTIME_ADDR(JSReceiverGetPrototypeOf
, 1, 1) RUNTIME_ADDR(JSReceiverSetPrototypeOfDontThrow, 2, 1)
RUNTIME_ADDR(JSReceiverSetPrototypeOfThrow, 2, 1) RUNTIME_ADDR
(LoadPrivateGetter, 1, 1) RUNTIME_ADDR(LoadPrivateSetter, 1, 1
) RUNTIME_ADDR(NewObject, 2, 1) RUNTIME_ADDR(ObjectCreate, 2,
1) RUNTIME_ADDR(ObjectEntries, 1, 1) RUNTIME_ADDR(ObjectEntriesSkipFastPath
, 1, 1) RUNTIME_ADDR(ObjectGetOwnPropertyNames, 1, 1) RUNTIME_ADDR
(ObjectGetOwnPropertyNamesTryFast, 1, 1) RUNTIME_ADDR(ObjectHasOwnProperty
, 2, 1) RUNTIME_ADDR(ObjectIsExtensible, 1, 1) RUNTIME_ADDR(ObjectKeys
, 1, 1) RUNTIME_ADDR(ObjectValues, 1, 1) RUNTIME_ADDR(ObjectValuesSkipFastPath
, 1, 1) RUNTIME_ADDR(OptimizeObjectForAddingMultipleProperties
, 2, 1) RUNTIME_ADDR(SetDataProperties, 2, 1) RUNTIME_ADDR(SetKeyedProperty
, 3, 1) RUNTIME_ADDR(DefineObjectOwnProperty, 3, 1) RUNTIME_ADDR
(SetNamedProperty, 3, 1) RUNTIME_ADDR(SetOwnPropertyIgnoreAttributes
, 4, 1) RUNTIME_ADDR(DefineKeyedOwnPropertyInLiteral_Simple, 3
, 1) RUNTIME_ADDR(ShrinkNameDictionary, 1, 1) RUNTIME_ADDR(ShrinkSwissNameDictionary
, 1, 1) RUNTIME_ADDR(ToFastProperties, 1, 1) RUNTIME_ADDR(ToLength
, 1, 1) RUNTIME_ADDR(ToName, 1, 1) RUNTIME_ADDR(ToNumber, 1, 1
) RUNTIME_ADDR(ToNumeric, 1, 1) RUNTIME_ADDR(ToObject, 1, 1) RUNTIME_ADDR
(ToString, 1, 1) RUNTIME_ADDR(TryMigrateInstance, 1, 1) RUNTIME_ADDR
(SwissTableAdd, 4, 1) RUNTIME_ADDR(SwissTableAllocate, 1, 1) RUNTIME_ADDR
(SwissTableDelete, 2, 1) RUNTIME_ADDR(SwissTableDetailsAt, 2,
1) RUNTIME_ADDR(SwissTableElementsCount, 1, 1) RUNTIME_ADDR(
SwissTableEquals, 2, 1) RUNTIME_ADDR(SwissTableFindEntry, 2, 1
) RUNTIME_ADDR(SwissTableUpdate, 4, 1) RUNTIME_ADDR(SwissTableValueAt
, 2, 1) RUNTIME_ADDR(SwissTableKeyAt, 2, 1) RUNTIME_ADDR(Add,
2, 1) RUNTIME_ADDR(Equal, 2, 1) RUNTIME_ADDR(GreaterThan, 2,
1) RUNTIME_ADDR(GreaterThanOrEqual, 2, 1) RUNTIME_ADDR(LessThan
, 2, 1) RUNTIME_ADDR(LessThanOrEqual, 2, 1) RUNTIME_ADDR(NotEqual
, 2, 1) RUNTIME_ADDR(StrictEqual, 2, 1) RUNTIME_ADDR(StrictNotEqual
, 2, 1) RUNTIME_ADDR(ReferenceEqual, 2, 1) RUNTIME_ADDR(EnqueueMicrotask
, 1, 1) RUNTIME_ADDR(PromiseHookAfter, 1, 1) RUNTIME_ADDR(PromiseHookBefore
, 1, 1) RUNTIME_ADDR(PromiseHookInit, 2, 1) RUNTIME_ADDR(PromiseRejectEventFromStack
, 2, 1) RUNTIME_ADDR(PromiseRevokeReject, 1, 1) RUNTIME_ADDR(
PromiseStatus, 1, 1) RUNTIME_ADDR(RejectPromise, 3, 1) RUNTIME_ADDR
(ResolvePromise, 2, 1) RUNTIME_ADDR(PromiseRejectAfterResolved
, 2, 1) RUNTIME_ADDR(PromiseResolveAfterResolved, 2, 1) RUNTIME_ADDR
(ConstructAggregateErrorHelper, 4, 1) RUNTIME_ADDR(ConstructInternalAggregateErrorHelper
, -1 , 1) RUNTIME_ADDR(CheckProxyGetSetTrapResult, 2, 1) RUNTIME_ADDR
(CheckProxyHasTrapResult, 2, 1) RUNTIME_ADDR(CheckProxyDeleteTrapResult
, 2, 1) RUNTIME_ADDR(GetPropertyWithReceiver, 3, 1) RUNTIME_ADDR
(IsJSProxy, 1, 1) RUNTIME_ADDR(JSProxyGetHandler, 1, 1) RUNTIME_ADDR
(JSProxyGetTarget, 1, 1) RUNTIME_ADDR(SetPropertyWithReceiver
, 4, 1) RUNTIME_ADDR(IsRegExp, 1, 1) RUNTIME_ADDR(RegExpBuildIndices
, 3, 1) RUNTIME_ADDR(RegExpExec, 4, 1) RUNTIME_ADDR(RegExpExecTreatMatchAtEndAsFailure
, 4, 1) RUNTIME_ADDR(RegExpExperimentalOneshotExec, 4, 1) RUNTIME_ADDR
(RegExpExperimentalOneshotExecTreatMatchAtEndAsFailure, 4, 1)
RUNTIME_ADDR(RegExpExecMultiple, 4, 1) RUNTIME_ADDR(RegExpInitializeAndCompile
, 3, 1) RUNTIME_ADDR(RegExpReplaceRT, 3, 1) RUNTIME_ADDR(RegExpSplit
, 3, 1) RUNTIME_ADDR(RegExpStringFromFlags, 1, 1) RUNTIME_ADDR
(StringReplaceNonGlobalRegExpWithFunction, 3, 1) RUNTIME_ADDR
(StringSplit, 3, 1) RUNTIME_ADDR(DeclareEvalFunction, 2, 1) RUNTIME_ADDR
(DeclareEvalVar, 1, 1) RUNTIME_ADDR(DeclareGlobals, 2, 1) RUNTIME_ADDR
(DeclareModuleExports, 2, 1) RUNTIME_ADDR(DeleteLookupSlot, 1
, 1) RUNTIME_ADDR(LoadLookupSlot, 1, 1) RUNTIME_ADDR(LoadLookupSlotInsideTypeof
, 1, 1) RUNTIME_ADDR(NewClosure, 2, 1) RUNTIME_ADDR(NewClosure_Tenured
, 2, 1) RUNTIME_ADDR(NewFunctionContext, 1, 1) RUNTIME_ADDR(NewRestParameter
, 1, 1) RUNTIME_ADDR(NewSloppyArguments, 1, 1) RUNTIME_ADDR(NewStrictArguments
, 1, 1) RUNTIME_ADDR(PushBlockContext, 1, 1) RUNTIME_ADDR(PushCatchContext
, 2, 1) RUNTIME_ADDR(PushWithContext, 2, 1) RUNTIME_ADDR(StoreGlobalNoHoleCheckForReplLetOrConst
, 2, 1) RUNTIME_ADDR(StoreLookupSlot_Sloppy, 2, 1) RUNTIME_ADDR
(StoreLookupSlot_SloppyHoisting, 2, 1) RUNTIME_ADDR(StoreLookupSlot_Strict
, 2, 1) RUNTIME_ADDR(ThrowConstAssignError, 0, 1) RUNTIME_ADDR
(ShadowRealmWrappedFunctionCreate, 2, 1) RUNTIME_ADDR(FlattenString
, 1, 1) RUNTIME_ADDR(GetSubstitution, 5, 1) RUNTIME_ADDR(InternalizeString
, 1, 1) RUNTIME_ADDR(StringAdd, 2, 1) RUNTIME_ADDR(StringBuilderConcat
, 3, 1) RUNTIME_ADDR(StringCharCodeAt, 2, 1) RUNTIME_ADDR(StringEqual
, 2, 1) RUNTIME_ADDR(StringEscapeQuotes, 1, 1) RUNTIME_ADDR(StringGreaterThan
, 2, 1) RUNTIME_ADDR(StringGreaterThanOrEqual, 2, 1) RUNTIME_ADDR
(StringLastIndexOf, 2, 1) RUNTIME_ADDR(StringLessThan, 2, 1) RUNTIME_ADDR
(StringLessThanOrEqual, 2, 1) RUNTIME_ADDR(StringMaxLength, 0
, 1) RUNTIME_ADDR(StringReplaceOneCharWithString, 3, 1) RUNTIME_ADDR
(StringSubstring, 3, 1) RUNTIME_ADDR(StringToArray, 2, 1) RUNTIME_ADDR
(CreatePrivateNameSymbol, 1, 1) RUNTIME_ADDR(CreatePrivateBrandSymbol
, 1, 1) RUNTIME_ADDR(CreatePrivateSymbol, -1 , 1) RUNTIME_ADDR
(SymbolDescriptiveString, 1, 1) RUNTIME_ADDR(SymbolIsPrivate,
1, 1) RUNTIME_ADDR(Abort, 1, 1) RUNTIME_ADDR(AbortCSADcheck,
1, 1) RUNTIME_ADDR(AbortJS, 1, 1) RUNTIME_ADDR(ActiveTierIsMaglev
, 1, 1) RUNTIME_ADDR(ArrayIteratorProtector, 0, 1) RUNTIME_ADDR
(ArraySpeciesProtector, 0, 1) RUNTIME_ADDR(BaselineOsr, -1, 1
) RUNTIME_ADDR(BenchMaglev, 2, 1) RUNTIME_ADDR(ClearFunctionFeedback
, 1, 1) RUNTIME_ADDR(ClearMegamorphicStubCache, 0, 1) RUNTIME_ADDR
(CompleteInobjectSlackTracking, 1, 1) RUNTIME_ADDR(ConstructConsString
, 2, 1) RUNTIME_ADDR(ConstructDouble, 2, 1) RUNTIME_ADDR(ConstructSlicedString
, 2, 1) RUNTIME_ADDR(DebugPrint, 1, 1) RUNTIME_ADDR(DebugPrintPtr
, 1, 1) RUNTIME_ADDR(DebugTrace, 0, 1) RUNTIME_ADDR(DebugTrackRetainingPath
, -1, 1) RUNTIME_ADDR(DeoptimizeFunction, 1, 1) RUNTIME_ADDR(
DisableOptimizationFinalization, 0, 1) RUNTIME_ADDR(DisallowCodegenFromStrings
, 1, 1) RUNTIME_ADDR(DisassembleFunction, 1, 1) RUNTIME_ADDR(
EnableCodeLoggingForTesting, 0, 1) RUNTIME_ADDR(EnsureFeedbackVectorForFunction
, 1, 1) RUNTIME_ADDR(FinalizeOptimization, 0, 1) RUNTIME_ADDR
(GetCallable, 0, 1) RUNTIME_ADDR(GetInitializerFunction, 1, 1
) RUNTIME_ADDR(GetOptimizationStatus, 1, 1) RUNTIME_ADDR(GetUndetectable
, 0, 1) RUNTIME_ADDR(GlobalPrint, 1, 1) RUNTIME_ADDR(HasDictionaryElements
, 1, 1) RUNTIME_ADDR(HasDoubleElements, 1, 1) RUNTIME_ADDR(HasElementsInALargeObjectSpace
, 1, 1) RUNTIME_ADDR(HasFastElements, 1, 1) RUNTIME_ADDR(HasFastProperties
, 1, 1) RUNTIME_ADDR(HasFixedBigInt64Elements, 1, 1) RUNTIME_ADDR
(HasFixedBigUint64Elements, 1, 1) RUNTIME_ADDR(HasFixedFloat32Elements
, 1, 1) RUNTIME_ADDR(HasFixedFloat64Elements, 1, 1) RUNTIME_ADDR
(HasFixedInt16Elements, 1, 1) RUNTIME_ADDR(HasFixedInt32Elements
, 1, 1) RUNTIME_ADDR(HasFixedInt8Elements, 1, 1) RUNTIME_ADDR
(HasFixedUint16Elements, 1, 1) RUNTIME_ADDR(HasFixedUint32Elements
, 1, 1) RUNTIME_ADDR(HasFixedUint8ClampedElements, 1, 1) RUNTIME_ADDR
(HasFixedUint8Elements, 1, 1) RUNTIME_ADDR(HasHoleyElements, 1
, 1) RUNTIME_ADDR(HasObjectElements, 1, 1) RUNTIME_ADDR(HasOwnConstDataProperty
, 2, 1) RUNTIME_ADDR(HasPackedElements, 1, 1) RUNTIME_ADDR(HasSloppyArgumentsElements
, 1, 1) RUNTIME_ADDR(HasSmiElements, 1, 1) RUNTIME_ADDR(HasSmiOrObjectElements
, 1, 1) RUNTIME_ADDR(HaveSameMap, 2, 1) RUNTIME_ADDR(HeapObjectVerify
, 1, 1) RUNTIME_ADDR(ICsAreEnabled, 0, 1) RUNTIME_ADDR(InLargeObjectSpace
, 1, 1) RUNTIME_ADDR(InYoungGeneration, 1, 1) RUNTIME_ADDR(Is64Bit
, 0, 1) RUNTIME_ADDR(IsAtomicsWaitAllowed, 0, 1) RUNTIME_ADDR
(IsBeingInterpreted, 0, 1) RUNTIME_ADDR(IsConcatSpreadableProtector
, 0, 1) RUNTIME_ADDR(IsConcurrentRecompilationSupported, 0, 1
) RUNTIME_ADDR(IsDictPropertyConstTrackingEnabled, 0, 1) RUNTIME_ADDR
(IsSameHeapObject, 2, 1) RUNTIME_ADDR(IsSharedString, 1, 1) RUNTIME_ADDR
(MapIteratorProtector, 0, 1) RUNTIME_ADDR(NeverOptimizeFunction
, 1, 1) RUNTIME_ADDR(NewRegExpWithBacktrackLimit, 3, 1) RUNTIME_ADDR
(NotifyContextDisposed, 0, 1) RUNTIME_ADDR(OptimizeMaglevOnNextCall
, 1, 1) RUNTIME_ADDR(OptimizeFunctionOnNextCall, -1, 1) RUNTIME_ADDR
(OptimizeOsr, -1, 1) RUNTIME_ADDR(PrepareFunctionForOptimization
, -1, 1) RUNTIME_ADDR(PretenureAllocationSite, 1, 1) RUNTIME_ADDR
(PrintWithNameForAssert, 2, 1) RUNTIME_ADDR(PromiseSpeciesProtector
, 0, 1) RUNTIME_ADDR(RegExpSpeciesProtector, 0, 1) RUNTIME_ADDR
(RegexpHasBytecode, 2, 1) RUNTIME_ADDR(RegexpHasNativeCode, 2
, 1) RUNTIME_ADDR(RegexpIsUnmodified, 1, 1) RUNTIME_ADDR(RegexpTypeTag
, 1, 1) RUNTIME_ADDR(RunningInSimulator, 0, 1) RUNTIME_ADDR(RuntimeEvaluateREPL
, 1, 1) RUNTIME_ADDR(ScheduleGCInStackCheck, 0, 1) RUNTIME_ADDR
(SerializeDeserializeNow, 0, 1) RUNTIME_ADDR(SetAllocationTimeout
, -1 , 1) RUNTIME_ADDR(SetForceSlowPath, 1, 1) RUNTIME_ADDR(SetIteratorProtector
, 0, 1) RUNTIME_ADDR(SharedGC, 0, 1) RUNTIME_ADDR(SimulateNewspaceFull
, 0, 1) RUNTIME_ADDR(StringIteratorProtector, 0, 1) RUNTIME_ADDR
(SystemBreak, 0, 1) RUNTIME_ADDR(TakeHeapSnapshot, -1, 1) RUNTIME_ADDR
(TraceEnter, 0, 1) RUNTIME_ADDR(TraceExit, 1, 1) RUNTIME_ADDR
(TurbofanStaticAssert, 1, 1) RUNTIME_ADDR(TypedArraySpeciesProtector
, 0, 1) RUNTIME_ADDR(WaitForBackgroundOptimization, 0, 1) RUNTIME_ADDR
(WebSnapshotDeserialize, -1, 1) RUNTIME_ADDR(WebSnapshotSerialize
, -1, 1) RUNTIME_ADDR(DeoptimizeNow, 0, 1) RUNTIME_ADDR(ArrayBufferDetach
, 1, 1) RUNTIME_ADDR(GrowableSharedArrayBufferByteLength, 1, 1
) RUNTIME_ADDR(TypedArrayCopyElements, 3, 1) RUNTIME_ADDR(TypedArrayGetBuffer
, 1, 1) RUNTIME_ADDR(TypedArraySet, 2, 1) RUNTIME_ADDR(TypedArraySortFast
, 1, 1) RUNTIME_ADDR(ThrowWasmError, 1, 1) RUNTIME_ADDR(ThrowWasmStackOverflow
, 0, 1) RUNTIME_ADDR(WasmI32AtomicWait, 4, 1) RUNTIME_ADDR(WasmI64AtomicWait
, 5, 1) RUNTIME_ADDR(WasmAtomicNotify, 3, 1) RUNTIME_ADDR(WasmMemoryGrow
, 2, 1) RUNTIME_ADDR(WasmStackGuard, 0, 1) RUNTIME_ADDR(WasmThrow
, 2, 1) RUNTIME_ADDR(WasmReThrow, 1, 1) RUNTIME_ADDR(WasmThrowJSTypeError
, 0, 1) RUNTIME_ADDR(WasmRefFunc, 1, 1) RUNTIME_ADDR(WasmFunctionTableGet
, 3, 1) RUNTIME_ADDR(WasmFunctionTableSet, 4, 1) RUNTIME_ADDR
(WasmTableInit, 6, 1) RUNTIME_ADDR(WasmTableCopy, 6, 1) RUNTIME_ADDR
(WasmTableGrow, 3, 1) RUNTIME_ADDR(WasmTableFill, 5, 1) RUNTIME_ADDR
(WasmIsValidRefValue, 3, 1) RUNTIME_ADDR(WasmCompileLazy, 2, 1
) RUNTIME_ADDR(WasmCompileWrapper, 2, 1) RUNTIME_ADDR(WasmTriggerTierUp
, 1, 1) RUNTIME_ADDR(WasmDebugBreak, 0, 1) RUNTIME_ADDR(WasmArrayCopy
, 5, 1) RUNTIME_ADDR(WasmArrayInitFromData, 5, 1) RUNTIME_ADDR
(WasmAllocateContinuation, 1, 1) RUNTIME_ADDR(WasmSyncStackLimit
, 0, 1) RUNTIME_ADDR(WasmCreateResumePromise, 2, 1) RUNTIME_ADDR
(DeserializeWasmModule, 2, 1) RUNTIME_ADDR(DisallowWasmCodegen
, 1, 1) RUNTIME_ADDR(FreezeWasmLazyCompilation, 1, 1) RUNTIME_ADDR
(GetWasmExceptionTagId, 2, 1) RUNTIME_ADDR(GetWasmExceptionValues
, 1, 1) RUNTIME_ADDR(GetWasmRecoveredTrapCount, 0, 1) RUNTIME_ADDR
(IsAsmWasmCode, 1, 1) RUNTIME_ADDR(IsLiftoffFunction, 1, 1) RUNTIME_ADDR
(IsTurboFanFunction, 1, 1) RUNTIME_ADDR(IsThreadInWasm, 0, 1)
RUNTIME_ADDR(IsWasmCode, 1, 1) RUNTIME_ADDR(IsWasmTrapHandlerEnabled
, 0, 1) RUNTIME_ADDR(SerializeWasmModule, 1, 1) RUNTIME_ADDR(
SetWasmCompileControls, 2, 1) RUNTIME_ADDR(SetWasmInstantiateControls
, 0, 1) RUNTIME_ADDR(WasmGetNumberOfInstances, 1, 1) RUNTIME_ADDR
(WasmNumCodeSpaces, 1, 1) RUNTIME_ADDR(WasmTierDown, 0, 1) RUNTIME_ADDR
(WasmTierUp, 0, 1) RUNTIME_ADDR(WasmTierUpFunction, 2, 1) RUNTIME_ADDR
(WasmTraceEnter, 0, 1) RUNTIME_ADDR(WasmTraceExit, 1, 1) RUNTIME_ADDR
(WasmTraceMemory, 1, 1) RUNTIME_ADDR(JSFinalizationRegistryRegisterWeakCellWithUnregisterToken
, 4, 1) RUNTIME_ADDR(JSWeakRefAddToKeptObjects, 1, 1) RUNTIME_ADDR
(ShrinkFinalizationRegistryUnregisterTokenMap, 1, 1)
269#undef RUNTIME_ADDR
270 };
271 uint32_t tags_ordered_by_address_[kNumExternalReferences];
272};
273
274static_assert(std::is_trivially_destructible<ExternalReferenceList>::value,
275 "static destructors not allowed");
276
277} // namespace
278
279class V8_EXPORT_PRIVATE NativeModuleSerializer {
280 public:
281 NativeModuleSerializer(const NativeModule*, base::Vector<WasmCode* const>);
282 NativeModuleSerializer(const NativeModuleSerializer&) = delete;
283 NativeModuleSerializer& operator=(const NativeModuleSerializer&) = delete;
284
285 size_t Measure() const;
286 bool Write(Writer* writer);
287
288 private:
289 size_t MeasureCode(const WasmCode*) const;
290 void WriteHeader(Writer*, size_t total_code_size);
291 void WriteCode(const WasmCode*, Writer*);
292
293 const NativeModule* const native_module_;
294 const base::Vector<WasmCode* const> code_table_;
295 bool write_called_ = false;
296 size_t total_written_code_ = 0;
297 int num_turbofan_functions_ = 0;
298};
299
300NativeModuleSerializer::NativeModuleSerializer(
301 const NativeModule* module, base::Vector<WasmCode* const> code_table)
302 : native_module_(module), code_table_(code_table) {
303 DCHECK_NOT_NULL(native_module_)((void) 0);
304 // TODO(mtrofin): persist the export wrappers. Ideally, we'd only persist
305 // the unique ones, i.e. the cache.
306}
307
308size_t NativeModuleSerializer::MeasureCode(const WasmCode* code) const {
309 if (code == nullptr) return sizeof(uint8_t);
310 DCHECK_EQ(WasmCode::kWasmFunction, code->kind())((void) 0);
311 if (code->tier() != ExecutionTier::kTurbofan) {
312 return sizeof(uint8_t);
313 }
314 return kCodeHeaderSize + code->instructions().size() +
315 code->reloc_info().size() + code->source_positions().size() +
316 code->protected_instructions_data().size();
317}
318
319size_t NativeModuleSerializer::Measure() const {
320 size_t size = kHeaderSize;
321 for (WasmCode* code : code_table_) {
322 size += MeasureCode(code);
323 }
324 return size;
325}
326
327void NativeModuleSerializer::WriteHeader(Writer* writer,
328 size_t total_code_size) {
329 // TODO(eholk): We need to properly preserve the flag whether the trap
330 // handler was used or not when serializing.
331
332 writer->Write(total_code_size);
333}
334
335void NativeModuleSerializer::WriteCode(const WasmCode* code, Writer* writer) {
336 if (code == nullptr) {
337 writer->Write(kLazyFunction);
338 return;
339 }
340
341 DCHECK_EQ(WasmCode::kWasmFunction, code->kind())((void) 0);
342 // Only serialize TurboFan code, as Liftoff code can contain breakpoints or
343 // non-relocatable constants.
344 if (code->tier() != ExecutionTier::kTurbofan) {
345 // We check if the function has been executed already. If so, we serialize
346 // it as {kLiftoffFunction} so that upon deserialization the function will
347 // get compiled with Liftoff eagerly. If the function has not been executed
348 // yet, we serialize it as {kLazyFunction}, and the function will not get
349 // compiled upon deserialization.
350 NativeModule* native_module = code->native_module();
351 uint32_t budget =
352 native_module->tiering_budget_array()[declared_function_index(
353 native_module->module(), code->index())];
354 writer->Write(budget == static_cast<uint32_t>(FLAG_wasm_tiering_budget)
355 ? kLazyFunction
356 : kLiftoffFunction);
357 return;
358 }
359
360 ++num_turbofan_functions_;
361 writer->Write(kTurboFanFunction);
362 // Write the size of the entire code section, followed by the code header.
363 writer->Write(code->constant_pool_offset());
364 writer->Write(code->safepoint_table_offset());
365 writer->Write(code->handler_table_offset());
366 writer->Write(code->code_comments_offset());
367 writer->Write(code->unpadded_binary_size());
368 writer->Write(code->stack_slots());
369 writer->Write(code->raw_tagged_parameter_slots_for_serialization());
370 writer->Write(code->instructions().length());
371 writer->Write(code->reloc_info().length());
372 writer->Write(code->source_positions().length());
373 writer->Write(code->protected_instructions_data().length());
374 writer->Write(code->kind());
375 writer->Write(code->tier());
376
377 // Get a pointer to the destination buffer, to hold relocated code.
378 byte* serialized_code_start = writer->current_buffer().begin();
379 byte* code_start = serialized_code_start;
380 size_t code_size = code->instructions().size();
381 writer->Skip(code_size);
382 // Write the reloc info, source positions, and protected code.
383 writer->WriteVector(code->reloc_info());
384 writer->WriteVector(code->source_positions());
385 writer->WriteVector(code->protected_instructions_data());
386#if V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64 || V8_TARGET_ARCH_ARM || \
387 V8_TARGET_ARCH_PPC || V8_TARGET_ARCH_PPC64 || V8_TARGET_ARCH_S390X || \
388 V8_TARGET_ARCH_RISCV64
389 // On platforms that don't support misaligned word stores, copy to an aligned
390 // buffer if necessary so we can relocate the serialized code.
391 std::unique_ptr<byte[]> aligned_buffer;
392 if (!IsAligned(reinterpret_cast<Address>(serialized_code_start),
393 kSystemPointerSize)) {
394 // 'byte' does not guarantee an alignment but seems to work well enough in
395 // practice.
396 aligned_buffer.reset(new byte[code_size]);
397 code_start = aligned_buffer.get();
398 }
399#endif
400 memcpy(code_start, code->instructions().begin(), code_size);
401 // Relocate the code.
402 int mask = RelocInfo::ModeMask(RelocInfo::WASM_CALL) |
403 RelocInfo::ModeMask(RelocInfo::WASM_STUB_CALL) |
404 RelocInfo::ModeMask(RelocInfo::EXTERNAL_REFERENCE) |
405 RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE) |
406 RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE_ENCODED);
407 RelocIterator orig_iter(code->instructions(), code->reloc_info(),
408 code->constant_pool(), mask);
409 for (RelocIterator iter(
410 {code_start, code->instructions().size()}, code->reloc_info(),
411 reinterpret_cast<Address>(code_start) + code->constant_pool_offset(),
412 mask);
413 !iter.done(); iter.next(), orig_iter.next()) {
414 RelocInfo::Mode mode = orig_iter.rinfo()->rmode();
415 switch (mode) {
416 case RelocInfo::WASM_CALL: {
417 Address orig_target = orig_iter.rinfo()->wasm_call_address();
418 uint32_t tag =
419 native_module_->GetFunctionIndexFromJumpTableSlot(orig_target);
420 SetWasmCalleeTag(iter.rinfo(), tag);
421 } break;
422 case RelocInfo::WASM_STUB_CALL: {
423 Address target = orig_iter.rinfo()->wasm_stub_call_address();
424 uint32_t tag = native_module_->GetRuntimeStubId(target);
425 DCHECK_GT(WasmCode::kRuntimeStubCount, tag)((void) 0);
426 SetWasmCalleeTag(iter.rinfo(), tag);
427 } break;
428 case RelocInfo::EXTERNAL_REFERENCE: {
429 Address orig_target = orig_iter.rinfo()->target_external_reference();
430 uint32_t ext_ref_tag =
431 ExternalReferenceList::Get().tag_from_address(orig_target);
432 SetWasmCalleeTag(iter.rinfo(), ext_ref_tag);
433 } break;
434 case RelocInfo::INTERNAL_REFERENCE:
435 case RelocInfo::INTERNAL_REFERENCE_ENCODED: {
436 Address orig_target = orig_iter.rinfo()->target_internal_reference();
437 Address offset = orig_target - code->instruction_start();
438 Assembler::deserialization_set_target_internal_reference_at(
439 iter.rinfo()->pc(), offset, mode);
440 } break;
441 default:
442 UNREACHABLE()V8_Fatal("unreachable code");
443 }
444 }
445 // If we copied to an aligned buffer, copy code into serialized buffer.
446 if (code_start != serialized_code_start) {
447 memcpy(serialized_code_start, code_start, code_size);
448 }
449 total_written_code_ += code_size;
450}
451
452bool NativeModuleSerializer::Write(Writer* writer) {
453 DCHECK(!write_called_)((void) 0);
454 write_called_ = true;
455
456 size_t total_code_size = 0;
457 for (WasmCode* code : code_table_) {
458 if (code && code->tier() == ExecutionTier::kTurbofan) {
459 DCHECK(IsAligned(code->instructions().size(), kCodeAlignment))((void) 0);
460 total_code_size += code->instructions().size();
461 }
462 }
463 WriteHeader(writer, total_code_size);
464
465 for (WasmCode* code : code_table_) {
466 WriteCode(code, writer);
467 }
468 // If not a single function was written, serialization was not successful.
469 if (num_turbofan_functions_ == 0) return false;
470
471 // Make sure that the serialized total code size was correct.
472 CHECK_EQ(total_written_code_, total_code_size)do { bool _cmp = ::v8::base::CmpEQImpl< typename ::v8::base
::pass_value_or_ref<decltype(total_written_code_)>::type
, typename ::v8::base::pass_value_or_ref<decltype(total_code_size
)>::type>((total_written_code_), (total_code_size)); do
{ if ((__builtin_expect(!!(!(_cmp)), 0))) { V8_Fatal("Check failed: %s."
, "total_written_code_" " " "==" " " "total_code_size"); } } while
(false); } while (false)
;
473
474 return true;
475}
476
477WasmSerializer::WasmSerializer(NativeModule* native_module)
478 : native_module_(native_module),
479 code_table_(native_module->SnapshotCodeTable()) {}
480
481size_t WasmSerializer::GetSerializedNativeModuleSize() const {
482 NativeModuleSerializer serializer(native_module_,
483 base::VectorOf(code_table_));
484 return kHeaderSize + serializer.Measure();
485}
486
487bool WasmSerializer::SerializeNativeModule(base::Vector<byte> buffer) const {
488 NativeModuleSerializer serializer(native_module_,
489 base::VectorOf(code_table_));
490 size_t measured_size = kHeaderSize + serializer.Measure();
491 if (buffer.size() < measured_size) return false;
492
493 Writer writer(buffer);
494 WriteHeader(&writer);
495
496 if (!serializer.Write(&writer)) return false;
497 DCHECK_EQ(measured_size, writer.bytes_written())((void) 0);
498 return true;
499}
500
501struct DeserializationUnit {
502 base::Vector<const byte> src_code_buffer;
503 std::unique_ptr<WasmCode> code;
504 NativeModule::JumpTablesRef jump_tables;
505};
506
507class DeserializationQueue {
508 public:
509 void Add(std::vector<DeserializationUnit> batch) {
510 DCHECK(!batch.empty())((void) 0);
511 base::MutexGuard guard(&mutex_);
512 queue_.emplace(std::move(batch));
513 }
514
515 std::vector<DeserializationUnit> Pop() {
516 base::MutexGuard guard(&mutex_);
517 if (queue_.empty()) return {};
518 auto batch = std::move(queue_.front());
519 queue_.pop();
520 return batch;
521 }
522
523 std::vector<DeserializationUnit> PopAll() {
524 base::MutexGuard guard(&mutex_);
525 if (queue_.empty()) return {};
526 auto units = std::move(queue_.front());
527 queue_.pop();
528 while (!queue_.empty()) {
529 units.insert(units.end(), std::make_move_iterator(queue_.front().begin()),
530 std::make_move_iterator(queue_.front().end()));
531 queue_.pop();
532 }
533 return units;
534 }
535
536 size_t NumBatches() const {
537 base::MutexGuard guard(&mutex_);
538 return queue_.size();
539 }
540
541 private:
542 mutable base::Mutex mutex_;
543 std::queue<std::vector<DeserializationUnit>> queue_;
544};
545
546class V8_EXPORT_PRIVATE NativeModuleDeserializer {
547 public:
548 explicit NativeModuleDeserializer(NativeModule*);
549 NativeModuleDeserializer(const NativeModuleDeserializer&) = delete;
550 NativeModuleDeserializer& operator=(const NativeModuleDeserializer&) = delete;
551
552 bool Read(Reader* reader);
553
554 base::Vector<const int> lazy_functions() {
555 return base::VectorOf(lazy_functions_);
556 }
557
558 base::Vector<const int> liftoff_functions() {
559 return base::VectorOf(liftoff_functions_);
560 }
561
562 private:
563 friend class DeserializeCodeTask;
564
565 void ReadHeader(Reader* reader);
566 DeserializationUnit ReadCode(int fn_index, Reader* reader);
567 void CopyAndRelocate(const DeserializationUnit& unit);
568 void Publish(std::vector<DeserializationUnit> batch);
569
570 NativeModule* const native_module_;
571#ifdef DEBUG
572 bool read_called_ = false;
573#endif
574
575 // Updated in {ReadCode}.
576 size_t remaining_code_size_ = 0;
577 base::Vector<byte> current_code_space_;
578 NativeModule::JumpTablesRef current_jump_tables_;
579 std::vector<int> lazy_functions_;
580 std::vector<int> liftoff_functions_;
581};
582
583class DeserializeCodeTask : public JobTask {
584 public:
585 DeserializeCodeTask(NativeModuleDeserializer* deserializer,
586 DeserializationQueue* reloc_queue)
587 : deserializer_(deserializer), reloc_queue_(reloc_queue) {}
588
589 void Run(JobDelegate* delegate) override {
590 CodeSpaceWriteScope code_space_write_scope(deserializer_->native_module_);
591 do {
592 // Repeatedly publish everything that was copied already.
593 TryPublishing(delegate);
594
595 auto batch = reloc_queue_->Pop();
596 if (batch.empty()) break;
597 for (const auto& unit : batch) {
598 deserializer_->CopyAndRelocate(unit);
599 }
600 publish_queue_.Add(std::move(batch));
601 delegate->NotifyConcurrencyIncrease();
602 } while (!delegate->ShouldYield());
603 }
604
605 size_t GetMaxConcurrency(size_t /* worker_count */) const override {
606 // Number of copy&reloc batches, plus 1 if there is also something to
607 // publish.
608 bool publish = publishing_.load(std::memory_order_relaxed) == false &&
609 publish_queue_.NumBatches() > 0;
610 return reloc_queue_->NumBatches() + (publish ? 1 : 0);
611 }
612
613 private:
614 void TryPublishing(JobDelegate* delegate) {
615 // Publishing is sequential, so only start publishing if no one else is.
616 if (publishing_.exchange(true, std::memory_order_relaxed)) return;
617
618 WasmCodeRefScope code_scope;
619 while (true) {
620 bool yield = false;
621 while (!yield) {
622 auto to_publish = publish_queue_.PopAll();
623 if (to_publish.empty()) break;
624 deserializer_->Publish(std::move(to_publish));
625 yield = delegate->ShouldYield();
626 }
627 publishing_.store(false, std::memory_order_relaxed);
628 if (yield) break;
629 // After finishing publishing, check again if new work arrived in the mean
630 // time. If so, continue publishing.
631 if (publish_queue_.NumBatches() == 0) break;
632 if (publishing_.exchange(true, std::memory_order_relaxed)) break;
633 // We successfully reset {publishing_} from {false} to {true}.
634 }
635 }
636
637 NativeModuleDeserializer* const deserializer_;
638 DeserializationQueue* const reloc_queue_;
639 DeserializationQueue publish_queue_;
640 std::atomic<bool> publishing_{false};
641};
642
643NativeModuleDeserializer::NativeModuleDeserializer(NativeModule* native_module)
644 : native_module_(native_module) {}
645
646bool NativeModuleDeserializer::Read(Reader* reader) {
647 DCHECK(!read_called_)((void) 0);
648#ifdef DEBUG
649 read_called_ = true;
650#endif
651
652 ReadHeader(reader);
653 uint32_t total_fns = native_module_->num_functions();
654 uint32_t first_wasm_fn = native_module_->num_imported_functions();
655
656 WasmCodeRefScope wasm_code_ref_scope;
657
658 DeserializationQueue reloc_queue;
659
660 std::unique_ptr<JobHandle> job_handle = V8::GetCurrentPlatform()->PostJob(
661 TaskPriority::kUserVisible,
662 std::make_unique<DeserializeCodeTask>(this, &reloc_queue));
663
664 // Choose a batch size such that we do not create too small batches (>=100k
665 // code bytes), but also not too many (<=100 batches).
666 constexpr size_t kMinBatchSizeInBytes = 100000;
667 size_t batch_limit =
668 std::max(kMinBatchSizeInBytes, remaining_code_size_ / 100);
669
670 std::vector<DeserializationUnit> batch;
671 size_t batch_size = 0;
672 CodeSpaceWriteScope code_space_write_scope(native_module_);
673 for (uint32_t i = first_wasm_fn; i < total_fns; ++i) {
11
Assuming 'i' is < 'total_fns'
12
Loop condition is true. Entering loop body
17
Assuming 'i' is >= 'total_fns'
18
Loop condition is false. Execution continues on line 688
674 DeserializationUnit unit = ReadCode(i, reader);
675 if (!unit.code) continue;
13
Taking false branch
676 batch_size += unit.code->instructions().size();
677 batch.emplace_back(std::move(unit));
678 if (batch_size >= batch_limit) {
14
Assuming 'batch_size' is >= 'batch_limit'
15
Taking true branch
679 reloc_queue.Add(std::move(batch));
16
Object 'batch' of type 'std::vector' is left in a valid but unspecified state after move
680 DCHECK(batch.empty())((void) 0);
681 batch_size = 0;
682 job_handle->NotifyConcurrencyIncrease();
683 }
684 }
685
686 // We should have read the expected amount of code now, and should have fully
687 // utilized the allocated code space.
688 DCHECK_EQ(0, remaining_code_size_)((void) 0);
689 DCHECK_EQ(0, current_code_space_.size())((void) 0);
690
691 if (!batch.empty()) {
19
Assuming the condition is true
20
Taking true branch
692 reloc_queue.Add(std::move(batch));
21
Moved-from object 'batch' of type 'std::vector' is moved
693 job_handle->NotifyConcurrencyIncrease();
694 }
695
696 // Wait for all tasks to finish, while participating in their work.
697 job_handle->Join();
698
699 return reader->current_size() == 0;
700}
701
702void NativeModuleDeserializer::ReadHeader(Reader* reader) {
703 remaining_code_size_ = reader->Read<size_t>();
704}
705
706DeserializationUnit NativeModuleDeserializer::ReadCode(int fn_index,
707 Reader* reader) {
708 uint8_t code_kind = reader->Read<uint8_t>();
709 if (code_kind == kLazyFunction) {
710 lazy_functions_.push_back(fn_index);
711 return {};
712 }
713 if (code_kind == kLiftoffFunction) {
714 liftoff_functions_.push_back(fn_index);
715 return {};
716 }
717
718 int constant_pool_offset = reader->Read<int>();
719 int safepoint_table_offset = reader->Read<int>();
720 int handler_table_offset = reader->Read<int>();
721 int code_comment_offset = reader->Read<int>();
722 int unpadded_binary_size = reader->Read<int>();
723 int stack_slot_count = reader->Read<int>();
724 uint32_t tagged_parameter_slots = reader->Read<uint32_t>();
725 int code_size = reader->Read<int>();
726 int reloc_size = reader->Read<int>();
727 int source_position_size = reader->Read<int>();
728 int protected_instructions_size = reader->Read<int>();
729 WasmCode::Kind kind = reader->Read<WasmCode::Kind>();
730 ExecutionTier tier = reader->Read<ExecutionTier>();
731
732 DCHECK(IsAligned(code_size, kCodeAlignment))((void) 0);
733 DCHECK_GE(remaining_code_size_, code_size)((void) 0);
734 if (current_code_space_.size() < static_cast<size_t>(code_size)) {
735 // Allocate the next code space. Don't allocate more than 90% of
736 // {kMaxCodeSpaceSize}, to leave some space for jump tables.
737 constexpr size_t kMaxReservation =
738 RoundUp<kCodeAlignment>(WasmCodeAllocator::kMaxCodeSpaceSize * 9 / 10);
739 size_t code_space_size = std::min(kMaxReservation, remaining_code_size_);
740 std::tie(current_code_space_, current_jump_tables_) =
741 native_module_->AllocateForDeserializedCode(code_space_size);
742 DCHECK_EQ(current_code_space_.size(), code_space_size)((void) 0);
743 DCHECK(current_jump_tables_.is_valid())((void) 0);
744 }
745
746 DeserializationUnit unit;
747 unit.src_code_buffer = reader->ReadVector<byte>(code_size);
748 auto reloc_info = reader->ReadVector<byte>(reloc_size);
749 auto source_pos = reader->ReadVector<byte>(source_position_size);
750 auto protected_instructions =
751 reader->ReadVector<byte>(protected_instructions_size);
752
753 base::Vector<uint8_t> instructions =
754 current_code_space_.SubVector(0, code_size);
755 current_code_space_ += code_size;
756 remaining_code_size_ -= code_size;
757
758 unit.code = native_module_->AddDeserializedCode(
759 fn_index, instructions, stack_slot_count, tagged_parameter_slots,
760 safepoint_table_offset, handler_table_offset, constant_pool_offset,
761 code_comment_offset, unpadded_binary_size, protected_instructions,
762 reloc_info, source_pos, kind, tier);
763 unit.jump_tables = current_jump_tables_;
764 return unit;
765}
766
767void NativeModuleDeserializer::CopyAndRelocate(
768 const DeserializationUnit& unit) {
769 memcpy(unit.code->instructions().begin(), unit.src_code_buffer.begin(),
770 unit.src_code_buffer.size());
771
772 // Relocate the code.
773 int mask = RelocInfo::ModeMask(RelocInfo::WASM_CALL) |
774 RelocInfo::ModeMask(RelocInfo::WASM_STUB_CALL) |
775 RelocInfo::ModeMask(RelocInfo::EXTERNAL_REFERENCE) |
776 RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE) |
777 RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE_ENCODED);
778 for (RelocIterator iter(unit.code->instructions(), unit.code->reloc_info(),
779 unit.code->constant_pool(), mask);
780 !iter.done(); iter.next()) {
781 RelocInfo::Mode mode = iter.rinfo()->rmode();
782 switch (mode) {
783 case RelocInfo::WASM_CALL: {
784 uint32_t tag = GetWasmCalleeTag(iter.rinfo());
785 Address target =
786 native_module_->GetNearCallTargetForFunction(tag, unit.jump_tables);
787 iter.rinfo()->set_wasm_call_address(target, SKIP_ICACHE_FLUSH);
788 break;
789 }
790 case RelocInfo::WASM_STUB_CALL: {
791 uint32_t tag = GetWasmCalleeTag(iter.rinfo());
792 DCHECK_LT(tag, WasmCode::kRuntimeStubCount)((void) 0);
793 Address target = native_module_->GetNearRuntimeStubEntry(
794 static_cast<WasmCode::RuntimeStubId>(tag), unit.jump_tables);
795 iter.rinfo()->set_wasm_stub_call_address(target, SKIP_ICACHE_FLUSH);
796 break;
797 }
798 case RelocInfo::EXTERNAL_REFERENCE: {
799 uint32_t tag = GetWasmCalleeTag(iter.rinfo());
800 Address address = ExternalReferenceList::Get().address_from_tag(tag);
801 iter.rinfo()->set_target_external_reference(address, SKIP_ICACHE_FLUSH);
802 break;
803 }
804 case RelocInfo::INTERNAL_REFERENCE:
805 case RelocInfo::INTERNAL_REFERENCE_ENCODED: {
806 Address offset = iter.rinfo()->target_internal_reference();
807 Address target = unit.code->instruction_start() + offset;
808 Assembler::deserialization_set_target_internal_reference_at(
809 iter.rinfo()->pc(), target, mode);
810 break;
811 }
812 default:
813 UNREACHABLE()V8_Fatal("unreachable code");
814 }
815 }
816
817 // Finally, flush the icache for that code.
818 FlushInstructionCache(unit.code->instructions().begin(),
819 unit.code->instructions().size());
820}
821
822void NativeModuleDeserializer::Publish(std::vector<DeserializationUnit> batch) {
823 DCHECK(!batch.empty())((void) 0);
824 std::vector<std::unique_ptr<WasmCode>> codes;
825 codes.reserve(batch.size());
826 for (auto& unit : batch) {
827 codes.emplace_back(std::move(unit).code);
828 }
829 auto published_codes = native_module_->PublishCode(base::VectorOf(codes));
830 for (auto* wasm_code : published_codes) {
831 wasm_code->MaybePrint();
832 wasm_code->Validate();
833 }
834}
835
836bool IsSupportedVersion(base::Vector<const byte> header) {
837 if (header.size() < WasmSerializer::kHeaderSize) return false;
838 byte current_version[WasmSerializer::kHeaderSize];
839 Writer writer({current_version, WasmSerializer::kHeaderSize});
840 WriteHeader(&writer);
841 return memcmp(header.begin(), current_version, WasmSerializer::kHeaderSize) ==
842 0;
843}
844
845MaybeHandle<WasmModuleObject> DeserializeNativeModule(
846 Isolate* isolate, base::Vector<const byte> data,
847 base::Vector<const byte> wire_bytes_vec,
848 base::Vector<const char> source_url) {
849 if (!IsWasmCodegenAllowed(isolate, isolate->native_context())) return {};
1
Assuming the condition is false
2
Taking false branch
850 if (!IsSupportedVersion(data)) return {};
3
Taking false branch
851
852 // Make the copy of the wire bytes early, so we use the same memory for
853 // decoding, lookup in the native module cache, and insertion into the cache.
854 auto owned_wire_bytes = base::OwnedVector<uint8_t>::Of(wire_bytes_vec);
855
856 // TODO(titzer): module features should be part of the serialization format.
857 WasmEngine* wasm_engine = GetWasmEngine();
858 WasmFeatures enabled_features = WasmFeatures::FromIsolate(isolate);
859 ModuleResult decode_result = DecodeWasmModule(
860 enabled_features, owned_wire_bytes.start(), owned_wire_bytes.end(), false,
861 i::wasm::kWasmOrigin, isolate->counters(), isolate->metrics_recorder(),
862 isolate->GetOrRegisterRecorderContextId(isolate->native_context()),
863 DecodingMethod::kDeserialize, wasm_engine->allocator());
864 if (decode_result.failed()) return {};
4
Taking false branch
865 std::shared_ptr<WasmModule> module = std::move(decode_result).value();
866 CHECK_NOT_NULL(module)do { if ((__builtin_expect(!!(!((module) != nullptr)), 0))) {
V8_Fatal("Check failed: %s.", "(module) != nullptr"); } } while
(false)
;
5
Taking false branch
6
Loop condition is false. Exiting loop
867
868 auto shared_native_module = wasm_engine->MaybeGetNativeModule(
869 module->origin, owned_wire_bytes.as_vector(), isolate);
870 if (shared_native_module == nullptr) {
871 DynamicTiering dynamic_tiering = isolate->IsWasmDynamicTieringEnabled()
7
Taking true branch
8
Assuming the condition is false
9
'?' condition is false
872 ? DynamicTiering::kEnabled
873 : DynamicTiering::kDisabled;
874 const bool kIncludeLiftoff = dynamic_tiering == DynamicTiering::kDisabled;
875 size_t code_size_estimate =
876 wasm::WasmCodeManager::EstimateNativeModuleCodeSize(
877 module.get(), kIncludeLiftoff, dynamic_tiering);
878 shared_native_module = wasm_engine->NewNativeModule(
879 isolate, enabled_features, std::move(module), code_size_estimate);
880 // We have to assign a compilation ID here, as it is required for a
881 // potential re-compilation, e.g. triggered by
882 // {TierDownAllModulesPerIsolate}. The value is -2 so that it is different
883 // than the compilation ID of actual compilations, and also different than
884 // the sentinel value of the CompilationState.
885 shared_native_module->compilation_state()->set_compilation_id(-2);
886 shared_native_module->SetWireBytes(std::move(owned_wire_bytes));
887
888 NativeModuleDeserializer deserializer(shared_native_module.get());
889 Reader reader(data + WasmSerializer::kHeaderSize);
890 bool error = !deserializer.Read(&reader);
10
Calling 'NativeModuleDeserializer::Read'
891 if (error) {
892 wasm_engine->UpdateNativeModuleCache(error, &shared_native_module,
893 isolate);
894 return {};
895 }
896 shared_native_module->compilation_state()->InitializeAfterDeserialization(
897 deserializer.lazy_functions(), deserializer.liftoff_functions());
898 wasm_engine->UpdateNativeModuleCache(error, &shared_native_module, isolate);
899 }
900
901 Handle<FixedArray> export_wrappers;
902 CompileJsToWasmWrappers(isolate, shared_native_module->module(),
903 &export_wrappers);
904
905 Handle<Script> script =
906 wasm_engine->GetOrCreateScript(isolate, shared_native_module, source_url);
907 Handle<WasmModuleObject> module_object = WasmModuleObject::New(
908 isolate, shared_native_module, script, export_wrappers);
909
910 // Finish the Wasm script now and make it public to the debugger.
911 isolate->debug()->OnAfterCompile(script);
912
913 // Log the code within the generated module for profiling.
914 shared_native_module->LogWasmCodes(isolate, *script);
915
916 return module_object;
917}
918
919} // namespace wasm
920} // namespace internal
921} // namespace v8