diff options
Diffstat (limited to 'deps/v8/src/wasm/wasm-module-builder.cc')
-rw-r--r-- | deps/v8/src/wasm/wasm-module-builder.cc | 118 |
1 files changed, 68 insertions, 50 deletions
diff --git a/deps/v8/src/wasm/wasm-module-builder.cc b/deps/v8/src/wasm/wasm-module-builder.cc index 290e98ecf8..cd83d46d3e 100644 --- a/deps/v8/src/wasm/wasm-module-builder.cc +++ b/deps/v8/src/wasm/wasm-module-builder.cc @@ -8,7 +8,7 @@ #include "src/v8.h" #include "src/zone/zone-containers.h" -#include "src/wasm/ast-decoder.h" +#include "src/wasm/function-body-decoder.h" #include "src/wasm/leb-helper.h" #include "src/wasm/wasm-macro-gen.h" #include "src/wasm/wasm-module-builder.h" @@ -50,11 +50,10 @@ WasmFunctionBuilder::WasmFunctionBuilder(WasmModuleBuilder* builder) : builder_(builder), locals_(builder->zone()), signature_index_(0), - exported_(0), func_index_(static_cast<uint32_t>(builder->functions_.size())), body_(builder->zone()), name_(builder->zone()), - exported_name_(builder->zone()), + exported_names_(builder->zone()), i32_temps_(builder->zone()), i64_temps_(builder->zone()), f32_temps_(builder->zone()), @@ -77,7 +76,7 @@ void WasmFunctionBuilder::SetSignature(FunctionSig* sig) { signature_index_ = builder_->AddSignature(sig); } -uint32_t WasmFunctionBuilder::AddLocal(LocalType type) { +uint32_t WasmFunctionBuilder::AddLocal(ValueType type) { DCHECK(locals_.has_sig()); return locals_.AddLocals(1, type); } @@ -123,10 +122,10 @@ void WasmFunctionBuilder::EmitWithVarInt(WasmOpcode opcode, } void WasmFunctionBuilder::EmitI32Const(int32_t value) { - // TODO(titzer): variable-length signed and unsigned i32 constants. - if (-128 <= value && value <= 127) { - EmitWithU8(kExprI8Const, static_cast<byte>(value)); + if (-64 <= value && value <= 63) { + EmitWithU8(kExprI32Const, static_cast<byte>(value & 0x7F)); } else { + // TODO(titzer): variable-length signed and unsigned i32 constants. byte code[] = {WASM_I32V_5(value)}; EmitCode(code, sizeof(code)); } @@ -141,12 +140,9 @@ void WasmFunctionBuilder::EmitDirectCallIndex(uint32_t index) { EmitCode(code, sizeof(code)); } -void WasmFunctionBuilder::Export() { exported_ = true; } - void WasmFunctionBuilder::ExportAs(Vector<const char> name) { - exported_ = true; - exported_name_.resize(name.length()); - memcpy(exported_name_.data(), name.start(), name.length()); + exported_names_.push_back(ZoneVector<char>( + name.start(), name.start() + name.length(), builder_->zone())); } void WasmFunctionBuilder::SetName(Vector<const char> name) { @@ -154,8 +150,9 @@ 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: +void WasmFunctionBuilder::AddAsmWasmOffset(int call_position, + int to_number_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); @@ -163,22 +160,31 @@ void WasmFunctionBuilder::AddAsmWasmOffset(int asm_position) { 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; + DCHECK_GE(call_position, 0); + asm_offsets_.write_i32v(call_position - last_asm_source_position_); + + DCHECK_GE(to_number_position, 0); + asm_offsets_.write_i32v(to_number_position - call_position); + last_asm_source_position_ = to_number_position; +} + +void WasmFunctionBuilder::SetAsmFunctionStartPosition(int position) { + DCHECK_EQ(0, asm_func_start_source_position_); + DCHECK_LE(0, position); + // Must be called before emitting any asm.js source position. + DCHECK_EQ(0, asm_offsets_.size()); + asm_func_start_source_position_ = position; + last_asm_source_position_ = position; } void WasmFunctionBuilder::WriteSignature(ZoneBuffer& buffer) const { buffer.write_u32v(signature_index_); } -void WasmFunctionBuilder::WriteExport(ZoneBuffer& buffer) const { - if (exported_) { - const ZoneVector<char>* exported_name = - exported_name_.size() == 0 ? &name_ : &exported_name_; - buffer.write_size(exported_name->size()); - buffer.write(reinterpret_cast<const byte*>(exported_name->data()), - exported_name->size()); +void WasmFunctionBuilder::WriteExports(ZoneBuffer& buffer) const { + for (auto name : exported_names_) { + buffer.write_size(name.size()); + buffer.write(reinterpret_cast<const byte*>(name.data()), name.size()); buffer.write_u8(kExternalFunction); buffer.write_u32v(func_index_ + static_cast<uint32_t>(builder_->imports_.size())); @@ -204,14 +210,19 @@ void WasmFunctionBuilder::WriteBody(ZoneBuffer& buffer) const { } void WasmFunctionBuilder::WriteAsmWasmOffsetTable(ZoneBuffer& buffer) const { - if (asm_offsets_.size() == 0) { + if (asm_func_start_source_position_ == 0 && asm_offsets_.size() == 0) { buffer.write_size(0); return; } - buffer.write_size(asm_offsets_.size() + kInt32Size); + size_t locals_enc_size = LEBHelper::sizeof_u32v(locals_.Size()); + size_t func_start_size = + LEBHelper::sizeof_u32v(asm_func_start_source_position_); + buffer.write_size(asm_offsets_.size() + locals_enc_size + func_start_size); // Offset of the recorded byte offsets. DCHECK_GE(kMaxUInt32, locals_.Size()); - buffer.write_u32(static_cast<uint32_t>(locals_.Size())); + buffer.write_u32v(static_cast<uint32_t>(locals_.Size())); + // Start position of the function. + buffer.write_u32v(asm_func_start_source_position_); buffer.write(asm_offsets_.begin(), asm_offsets_.size()); } @@ -271,8 +282,15 @@ uint32_t WasmModuleBuilder::AddSignature(FunctionSig* sig) { } } -void WasmModuleBuilder::AddIndirectFunction(uint32_t index) { - indirect_functions_.push_back(index); +uint32_t WasmModuleBuilder::AllocateIndirectFunctions(uint32_t count) { + uint32_t ret = static_cast<uint32_t>(indirect_functions_.size()); + indirect_functions_.resize(indirect_functions_.size() + count); + return ret; +} + +void WasmModuleBuilder::SetIndirectFunction(uint32_t indirect, + uint32_t direct) { + indirect_functions_[indirect] = direct; } uint32_t WasmModuleBuilder::AddImport(const char* name, int name_length, @@ -285,7 +303,7 @@ void WasmModuleBuilder::MarkStartFunction(WasmFunctionBuilder* function) { start_function_index_ = function->func_index(); } -uint32_t WasmModuleBuilder::AddGlobal(LocalType type, bool exported, +uint32_t WasmModuleBuilder::AddGlobal(ValueType type, bool exported, bool mutability, const WasmInitExpr& init) { globals_.push_back({type, exported, mutability, init}); @@ -309,11 +327,11 @@ void WasmModuleBuilder::WriteTo(ZoneBuffer& buffer) const { buffer.write_u8(kWasmFunctionTypeForm); buffer.write_size(sig->parameter_count()); for (size_t j = 0; j < sig->parameter_count(); j++) { - buffer.write_u8(WasmOpcodes::LocalTypeCodeFor(sig->GetParam(j))); + buffer.write_u8(WasmOpcodes::ValueTypeCodeFor(sig->GetParam(j))); } buffer.write_size(sig->return_count()); for (size_t j = 0; j < sig->return_count(); j++) { - buffer.write_u8(WasmOpcodes::LocalTypeCodeFor(sig->GetReturn(j))); + buffer.write_u8(WasmOpcodes::ValueTypeCodeFor(sig->GetReturn(j))); } } FixupSection(buffer, start); @@ -324,10 +342,10 @@ void WasmModuleBuilder::WriteTo(ZoneBuffer& buffer) const { size_t start = EmitSection(kImportSectionCode, buffer); buffer.write_size(imports_.size()); for (auto import : imports_) { - buffer.write_u32v(import.name_length); // module name length - buffer.write(reinterpret_cast<const byte*>(import.name), // module name + buffer.write_u32v(0); // module name length + buffer.write_u32v(import.name_length); // field name length + buffer.write(reinterpret_cast<const byte*>(import.name), // field name import.name_length); - buffer.write_u32v(0); // field name length buffer.write_u8(kExternalFunction); buffer.write_u32v(import.sig_index); } @@ -341,7 +359,7 @@ void WasmModuleBuilder::WriteTo(ZoneBuffer& buffer) const { buffer.write_size(functions_.size()); for (auto function : functions_) { function->WriteSignature(buffer); - if (function->exported()) exports++; + exports += function->exported_names_.size(); if (function->name_.size() > 0) has_names = true; } FixupSection(buffer, start); @@ -374,29 +392,29 @@ void WasmModuleBuilder::WriteTo(ZoneBuffer& buffer) const { buffer.write_size(globals_.size()); for (auto global : globals_) { - buffer.write_u8(WasmOpcodes::LocalTypeCodeFor(global.type)); + buffer.write_u8(WasmOpcodes::ValueTypeCodeFor(global.type)); buffer.write_u8(global.mutability ? 1 : 0); switch (global.init.kind) { case WasmInitExpr::kI32Const: { - DCHECK_EQ(kAstI32, global.type); + DCHECK_EQ(kWasmI32, global.type); const byte code[] = {WASM_I32V_5(global.init.val.i32_const)}; buffer.write(code, sizeof(code)); break; } case WasmInitExpr::kI64Const: { - DCHECK_EQ(kAstI64, global.type); + DCHECK_EQ(kWasmI64, global.type); const byte code[] = {WASM_I64V_10(global.init.val.i64_const)}; buffer.write(code, sizeof(code)); break; } case WasmInitExpr::kF32Const: { - DCHECK_EQ(kAstF32, global.type); + DCHECK_EQ(kWasmF32, global.type); const byte code[] = {WASM_F32(global.init.val.f32_const)}; buffer.write(code, sizeof(code)); break; } case WasmInitExpr::kF64Const: { - DCHECK_EQ(kAstF64, global.type); + DCHECK_EQ(kWasmF64, global.type); const byte code[] = {WASM_F64(global.init.val.f64_const)}; buffer.write(code, sizeof(code)); break; @@ -410,22 +428,22 @@ void WasmModuleBuilder::WriteTo(ZoneBuffer& buffer) const { default: { // No initializer, emit a default value. switch (global.type) { - case kAstI32: { + case kWasmI32: { const byte code[] = {WASM_I32V_1(0)}; buffer.write(code, sizeof(code)); break; } - case kAstI64: { + case kWasmI64: { const byte code[] = {WASM_I64V_1(0)}; buffer.write(code, sizeof(code)); break; } - case kAstF32: { + case kWasmF32: { const byte code[] = {WASM_F32(0.0)}; buffer.write(code, sizeof(code)); break; } - case kAstF64: { + case kWasmF64: { const byte code[] = {WASM_F64(0.0)}; buffer.write(code, sizeof(code)); break; @@ -444,7 +462,7 @@ void WasmModuleBuilder::WriteTo(ZoneBuffer& buffer) const { if (exports > 0) { size_t start = EmitSection(kExportSectionCode, buffer); buffer.write_u32v(exports); - for (auto function : functions_) function->WriteExport(buffer); + for (auto function : functions_) function->WriteExports(buffer); FixupSection(buffer, start); } @@ -517,10 +535,8 @@ void WasmModuleBuilder::WriteTo(ZoneBuffer& buffer) const { } for (auto function : functions_) { buffer.write_size(function->name_.size()); - if (function->name_.size() > 0) { - buffer.write(reinterpret_cast<const byte*>(&function->name_[0]), - function->name_.size()); - } + buffer.write(reinterpret_cast<const byte*>(function->name_.data()), + function->name_.size()); buffer.write_u8(0); } FixupSection(buffer, start); @@ -534,6 +550,8 @@ void WasmModuleBuilder::WriteAsmJsOffsetTable(ZoneBuffer& buffer) const { for (auto function : functions_) { function->WriteAsmWasmOffsetTable(buffer); } + // Append a 0 to indicate that this is an encoded table. + buffer.write_u8(0); } } // namespace wasm } // namespace internal |