| Index: src/wasm/wasm-module-builder.cc
|
| diff --git a/src/wasm/wasm-module-builder.cc b/src/wasm/wasm-module-builder.cc
|
| index 3efcb090aa62796aafb82473775f4a4aa4e08b74..57281c02a277a913ff73e77ee9be939a2f5bfbbe 100644
|
| --- a/src/wasm/wasm-module-builder.cc
|
| +++ b/src/wasm/wasm-module-builder.cc
|
| @@ -59,7 +59,8 @@ WasmFunctionBuilder::WasmFunctionBuilder(WasmModuleBuilder* builder)
|
| i64_temps_(builder->zone()),
|
| f32_temps_(builder->zone()),
|
| f64_temps_(builder->zone()),
|
| - direct_calls_(builder->zone()) {}
|
| + direct_calls_(builder->zone()),
|
| + asm_offsets_(builder->zone(), 8) {}
|
|
|
| void WasmFunctionBuilder::EmitVarInt(uint32_t val) {
|
| byte buffer[8];
|
| @@ -153,6 +154,20 @@ void WasmFunctionBuilder::SetName(Vector<const char> name) {
|
| memcpy(name_.data(), name.start(), name.length());
|
| }
|
|
|
| +void WasmFunctionBuilder::AddAsmWasmOffset(int asm_position) {
|
| + // We only want to emit one mapping per byte offset:
|
| + DCHECK(asm_offsets_.size() == 0 || body_.size() > last_asm_byte_offset_);
|
| +
|
| + DCHECK_LE(body_.size(), kMaxUInt32);
|
| + uint32_t byte_offset = static_cast<uint32_t>(body_.size());
|
| + asm_offsets_.write_u32v(byte_offset - last_asm_byte_offset_);
|
| + last_asm_byte_offset_ = byte_offset;
|
| +
|
| + DCHECK_GE(asm_position, 0);
|
| + asm_offsets_.write_i32v(asm_position - last_asm_source_position_);
|
| + last_asm_source_position_ = asm_position;
|
| +}
|
| +
|
| void WasmFunctionBuilder::WriteSignature(ZoneBuffer& buffer) const {
|
| buffer.write_u32v(signature_index_);
|
| }
|
| @@ -188,6 +203,18 @@ void WasmFunctionBuilder::WriteBody(ZoneBuffer& buffer) const {
|
| }
|
| }
|
|
|
| +void WasmFunctionBuilder::WriteAsmWasmOffsetTable(ZoneBuffer& buffer) const {
|
| + if (asm_offsets_.size() == 0) {
|
| + buffer.write_size(0);
|
| + return;
|
| + }
|
| + buffer.write_size(asm_offsets_.size() + kInt32Size);
|
| + // Offset of the recorded byte offsets.
|
| + DCHECK_GE(kMaxUInt32, locals_.Size());
|
| + buffer.write_u32(static_cast<uint32_t>(locals_.Size()));
|
| + buffer.write(asm_offsets_.begin(), asm_offsets_.size());
|
| +}
|
| +
|
| WasmModuleBuilder::WasmModuleBuilder(Zone* zone)
|
| : zone_(zone),
|
| signatures_(zone),
|
| @@ -494,6 +521,15 @@ void WasmModuleBuilder::WriteTo(ZoneBuffer& buffer) const {
|
| FixupSection(buffer, start);
|
| }
|
| }
|
| +
|
| +void WasmModuleBuilder::WriteAsmJsOffsetTable(ZoneBuffer& buffer) const {
|
| + // == Emit asm.js offset table ===============================================
|
| + buffer.write_size(functions_.size());
|
| + // Emit the offset table per function.
|
| + for (auto function : functions_) {
|
| + function->WriteAsmWasmOffsetTable(buffer);
|
| + }
|
| +}
|
| } // namespace wasm
|
| } // namespace internal
|
| } // namespace v8
|
|
|