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

Unified Diff: src/asmjs/asm-wasm-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 | « no previous file | src/wasm/wasm-module-builder.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/asmjs/asm-wasm-builder.cc
diff --git a/src/asmjs/asm-wasm-builder.cc b/src/asmjs/asm-wasm-builder.cc
index fa448cf54ac2af59b63439e727714df0a0134265..60bdd9a5a8473311ae54c694fd1ec53783f33e63 100644
--- a/src/asmjs/asm-wasm-builder.cc
+++ b/src/asmjs/asm-wasm-builder.cc
@@ -108,20 +108,7 @@ class AsmWasmBuilderImpl final : public AstVisitor<AsmWasmBuilderImpl> {
return ret;
}
- void BuildImports() {
- for (const AsmTyper::FFIUseSignature& ffi : typer_->FFIUseSignatures()) {
- size_t ret_count = ffi.return_type_ == AsmType::Void() ? 0 : 1;
- FunctionSig::Builder b(zone_, ret_count, ffi.arg_types_.size());
- for (AsmType* arg : ffi.arg_types_) b.AddParam(TypeFrom(arg));
- if (ffi.return_type_ != AsmType::Void()) {
- b.AddReturn(TypeFrom(ffi.return_type_));
- }
- imported_function_table_.AddFunction(ffi.var, b.Build());
- }
- }
-
void Build() {
- BuildImports();
InitializeInitFunction();
RECURSE(VisitFunctionLiteral(literal_));
BuildForeignInitFunction();
@@ -733,11 +720,12 @@ class AsmWasmBuilderImpl final : public AstVisitor<AsmWasmBuilderImpl> {
private:
class ImportedFunctionIndices : public ZoneObject {
public:
- bool has_name_;
+ const char* name_;
+ int name_length_;
WasmModuleBuilder::SignatureMap signature_to_index_;
- explicit ImportedFunctionIndices(Zone* zone)
- : has_name_(false), signature_to_index_(zone) {}
+ ImportedFunctionIndices(const char* name, int name_length, Zone* zone)
+ : name_(name), name_length_(name_length), signature_to_index_(zone) {}
};
ZoneHashMap table_;
AsmWasmBuilderImpl* builder_;
@@ -748,51 +736,31 @@ class AsmWasmBuilderImpl final : public AstVisitor<AsmWasmBuilderImpl> {
ZoneAllocationPolicy(builder->zone())),
builder_(builder) {}
- // Set the imported name of a variable. Must happen after all signatures
- // (and thus import indices) are added for a given variable.
- void SetImportName(Variable* v, const char* name, int name_length) {
- auto indices = GetEntry(v);
- if (indices) {
- for (auto entry : indices->signature_to_index_) {
- uint32_t index = entry.second;
- builder_->builder_->SetImportName(index, name, name_length);
- }
- indices->has_name_ = true;
- }
- }
-
- // Get a function's index. Does not insert new entries.
- uint32_t GetFunctionIndex(Variable* v, FunctionSig* sig) {
- auto indices = GetEntry(v);
- DCHECK_NOT_NULL(indices);
- auto pos = indices->signature_to_index_.find(sig);
- DCHECK(pos != indices->signature_to_index_.end());
- return pos->second;
- }
-
- // Add a function and register it as an import with the builder.
- void AddFunction(Variable* v, FunctionSig* sig) {
- auto entry = table_.LookupOrInsert(
+ void AddImport(Variable* v, const char* name, int name_length) {
+ ImportedFunctionIndices* indices = new (builder_->zone())
+ ImportedFunctionIndices(name, name_length, builder_->zone());
+ auto* entry = table_.LookupOrInsert(
v, ComputePointerHash(v), ZoneAllocationPolicy(builder_->zone()));
- if (entry->value == nullptr) {
- entry->value =
- new (builder_->zone()) ImportedFunctionIndices(builder_->zone());
- }
- auto indices = reinterpret_cast<ImportedFunctionIndices*>(entry->value);
- DCHECK(!indices->has_name_);
- auto pos = indices->signature_to_index_.find(sig);
- if (pos == indices->signature_to_index_.end()) {
- // A new import. Name is not known up front.
- uint32_t index = builder_->builder_->AddImport(nullptr, 0, sig);
+ entry->value = indices;
+ }
+
+ // Get a function's index (or allocate if new).
+ uint32_t LookupOrInsertImport(Variable* v, FunctionSig* sig) {
+ ZoneHashMap::Entry* entry = table_.Lookup(v, ComputePointerHash(v));
+ DCHECK_NOT_NULL(entry);
+ ImportedFunctionIndices* indices =
+ reinterpret_cast<ImportedFunctionIndices*>(entry->value);
+ WasmModuleBuilder::SignatureMap::iterator pos =
+ indices->signature_to_index_.find(sig);
+ if (pos != indices->signature_to_index_.end()) {
+ return pos->second;
+ } else {
+ uint32_t index = builder_->builder_->AddImport(
+ indices->name_, indices->name_length_, sig);
indices->signature_to_index_[sig] = index;
+ return index;
}
}
-
- ImportedFunctionIndices* GetEntry(Variable* v) {
- auto entry = table_.Lookup(v, ComputePointerHash(v));
- if (entry == nullptr) return nullptr;
- return reinterpret_cast<ImportedFunctionIndices*>(entry->value);
- }
};
void EmitAssignmentLhs(Expression* target, MachineType* mtype) {
@@ -942,7 +910,7 @@ class AsmWasmBuilderImpl final : public AstVisitor<AsmWasmBuilderImpl> {
if (typer_->TypeOf(target)->AsFFIType() != nullptr) {
const AstRawString* name =
prop->key()->AsLiteral()->AsRawPropertyName();
- imported_function_table_.SetImportName(
+ imported_function_table_.AddImport(
target->var(), reinterpret_cast<const char*>(name->raw_data()),
name->length());
}
@@ -1393,8 +1361,8 @@ class AsmWasmBuilderImpl final : public AstVisitor<AsmWasmBuilderImpl> {
for (int i = 0; i < args->length(); ++i) {
sig.AddParam(TypeOf(args->at(i)));
}
- uint32_t index =
- imported_function_table_.GetFunctionIndex(vp->var(), sig.Build());
+ uint32_t index = imported_function_table_.LookupOrInsertImport(
+ vp->var(), sig.Build());
VisitCallArgs(expr);
current_function_builder_->Emit(kExprCallFunction);
current_function_builder_->EmitVarInt(index);
@@ -1402,7 +1370,8 @@ class AsmWasmBuilderImpl final : public AstVisitor<AsmWasmBuilderImpl> {
WasmFunctionBuilder* function = LookupOrInsertFunction(vp->var());
VisitCallArgs(expr);
current_function_builder_->Emit(kExprCallFunction);
- current_function_builder_->EmitVarInt(function->func_index());
+ current_function_builder_->EmitDirectCallIndex(
+ function->func_index());
returns_value = function->signature()->return_count() > 0;
}
break;
« no previous file with comments | « no previous file | src/wasm/wasm-module-builder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698