Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(632)

Unified Diff: src/wasm/wasm-module-builder.cc

Issue 2384623003: [wasm] [asm.js] Track direct function indices and fixup. (Closed)
Patch Set: fix Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/wasm/wasm-module-builder.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/wasm/wasm-module-builder.cc
diff --git a/src/wasm/wasm-module-builder.cc b/src/wasm/wasm-module-builder.cc
index 81c34d43eb6b03ec3b1687aad4f2952a5c7b1a38..084f5a0c1a08185d4c0021c86adc93957a93a9a1 100644
--- a/src/wasm/wasm-module-builder.cc
+++ b/src/wasm/wasm-module-builder.cc
@@ -51,14 +51,14 @@ WasmFunctionBuilder::WasmFunctionBuilder(WasmModuleBuilder* builder)
locals_(builder->zone()),
signature_index_(0),
exported_(0),
- func_index_(static_cast<uint32_t>(builder->imports_.size() +
- builder->functions_.size())),
+ func_index_(static_cast<uint32_t>(builder->functions_.size())),
body_(builder->zone()),
name_(builder->zone()),
i32_temps_(builder->zone()),
i64_temps_(builder->zone()),
f32_temps_(builder->zone()),
- f64_temps_(builder->zone()) {}
+ f64_temps_(builder->zone()),
+ direct_calls_(builder->zone()) {}
void WasmFunctionBuilder::EmitVarInt(uint32_t val) {
byte buffer[8];
@@ -130,6 +130,15 @@ void WasmFunctionBuilder::EmitI32Const(int32_t value) {
}
}
+void WasmFunctionBuilder::EmitDirectCallIndex(uint32_t index) {
+ DirectCallIndex call;
+ call.offset = body_.size();
+ call.direct_index = index;
+ direct_calls_.push_back(call);
+ byte code[] = {U32V_5(0)};
+ EmitCode(code, sizeof(code));
+}
+
void WasmFunctionBuilder::SetExported() { exported_ = true; }
void WasmFunctionBuilder::SetName(const char* name, int name_length) {
@@ -152,7 +161,8 @@ void WasmFunctionBuilder::WriteExport(ZoneBuffer& buffer) const {
buffer.write(reinterpret_cast<const byte*>(&name_[0]), name_.size());
}
buffer.write_u8(kExternalFunction);
- buffer.write_u32v(func_index_);
+ buffer.write_u32v(func_index_ +
+ static_cast<uint32_t>(builder_->imports_.size()));
}
}
@@ -164,7 +174,13 @@ void WasmFunctionBuilder::WriteBody(ZoneBuffer& buffer) const {
locals_.Emit(*ptr);
(*ptr) += locals_size; // UGLY: manual bump of position pointer
if (body_.size() > 0) {
+ size_t base = buffer.offset();
buffer.write(&body_[0], body_.size());
+ for (DirectCallIndex call : direct_calls_) {
+ buffer.patch_u32v(
+ base + call.offset,
+ call.direct_index + static_cast<uint32_t>(builder_->imports_.size()));
+ }
}
}
@@ -230,7 +246,6 @@ void WasmModuleBuilder::AddIndirectFunction(uint32_t index) {
uint32_t WasmModuleBuilder::AddImport(const char* name, int name_length,
FunctionSig* sig) {
- DCHECK_EQ(0, functions_.size()); // imports must be added before functions!
imports_.push_back({AddSignature(sig), name, name_length});
return static_cast<uint32_t>(imports_.size() - 1);
}
@@ -369,7 +384,8 @@ void WasmModuleBuilder::WriteTo(ZoneBuffer& buffer) const {
// == emit start function index ==============================================
if (start_function_index_ >= 0) {
size_t start = EmitSection(kStartSectionCode, buffer);
- buffer.write_u32v(start_function_index_);
+ buffer.write_u32v(start_function_index_ +
+ static_cast<uint32_t>(imports_.size()));
FixupSection(buffer, start);
}
@@ -384,7 +400,7 @@ void WasmModuleBuilder::WriteTo(ZoneBuffer& buffer) const {
buffer.write_size(indirect_functions_.size()); // element count
for (auto index : indirect_functions_) {
- buffer.write_u32v(index);
+ buffer.write_u32v(index + static_cast<uint32_t>(imports_.size()));
}
FixupSection(buffer, start);
« no previous file with comments | « src/wasm/wasm-module-builder.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698