diff options
author | Ben Smith <binjimin@gmail.com> | 2017-11-02 21:19:01 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-11-02 21:19:01 -0700 |
commit | 4d9849ffbde861e10193cb15cce502eb49e1cb68 (patch) | |
tree | d51a0c27a1b44760553b94940263a8165f92a942 /src/generate-names.cc | |
parent | 9c65b752bd12b55cbfb7cd5380fdf04614608c36 (diff) | |
download | wabt-4d9849ffbde861e10193cb15cce502eb49e1cb68.tar.gz wabt-4d9849ffbde861e10193cb15cce502eb49e1cb68.tar.bz2 wabt-4d9849ffbde861e10193cb15cce502eb49e1cb68.zip |
Fix bad folding w/ imports and generating names (#665)
The name generation pass was adding an entry to the function binding
hash, but using the import index instead of the function/global/etc.
index. As a result, subsequent lookups would return the wrong function.
In this case, it would cause the wat folding code to use a function with
the wrong number of parameters.
Diffstat (limited to 'src/generate-names.cc')
-rw-r--r-- | src/generate-names.cc | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/src/generate-names.cc b/src/generate-names.cc index 618aa25e..71601787 100644 --- a/src/generate-names.cc +++ b/src/generate-names.cc @@ -85,13 +85,19 @@ class NameGenerator : public ExprVisitor::DelegateNop { Result VisitTable(Index table_index, Table* table); Result VisitMemory(Index memory_index, Memory* memory); Result VisitExcept(Index except_index, Exception* except); - Result VisitImport(Index import_index, Import* import); - Result VisitExport(Index export_index, Export* export_); + Result VisitImport(Import* import); + Result VisitExport(Export* export_); Module* module_ = nullptr; ExprVisitor visitor_; std::vector<std::string> index_to_name_; Index label_count_ = 0; + + Index num_func_imports_ = 0; + Index num_table_imports_ = 0; + Index num_memory_imports_ = 0; + Index num_global_imports_ = 0; + Index num_exception_imports_ = 0; }; NameGenerator::NameGenerator() : visitor_(this) {} @@ -245,15 +251,17 @@ Result NameGenerator::VisitExcept(Index except_index, Exception* except) { return Result::Ok; } -Result NameGenerator::VisitImport(Index import_index, Import* import) { +Result NameGenerator::VisitImport(Import* import) { BindingHash* bindings = nullptr; std::string* name = nullptr; + Index index = kInvalidIndex; switch (import->kind()) { case ExternalKind::Func: if (auto* func_import = cast<FuncImport>(import)) { bindings = &module_->func_bindings; name = &func_import->func.name; + index = num_func_imports_++; } break; @@ -261,6 +269,7 @@ Result NameGenerator::VisitImport(Index import_index, Import* import) { if (auto* table_import = cast<TableImport>(import)) { bindings = &module_->table_bindings; name = &table_import->table.name; + index = num_table_imports_++; } break; @@ -268,6 +277,7 @@ Result NameGenerator::VisitImport(Index import_index, Import* import) { if (auto* memory_import = cast<MemoryImport>(import)) { bindings = &module_->memory_bindings; name = &memory_import->memory.name; + index = num_memory_imports_++; } break; @@ -275,6 +285,7 @@ Result NameGenerator::VisitImport(Index import_index, Import* import) { if (auto* global_import = cast<GlobalImport>(import)) { bindings = &module_->global_bindings; name = &global_import->global.name; + index = num_global_imports_++; } break; @@ -282,19 +293,21 @@ Result NameGenerator::VisitImport(Index import_index, Import* import) { if (auto* except_import = cast<ExceptionImport>(import)) { bindings = &module_->except_bindings; name = &except_import->except.name; + index = num_exception_imports_++; } break; } if (bindings && name) { + assert(index != kInvalidIndex); std::string new_name = '$' + import->module_name + '.' + import->field_name; - MaybeUseAndBindName(bindings, new_name.c_str(), import_index, name); + MaybeUseAndBindName(bindings, new_name.c_str(), index, name); } return Result::Ok; } -Result NameGenerator::VisitExport(Index export_index, Export* export_) { +Result NameGenerator::VisitExport(Export* export_) { BindingHash* bindings = nullptr; std::string* name = nullptr; Index index = kInvalidIndex; @@ -354,9 +367,9 @@ Result NameGenerator::VisitModule(Module* module) { // Visit imports and exports first to give better names, derived from the // import/export name. for (Index i = 0; i < module->imports.size(); ++i) - CHECK_RESULT(VisitImport(i, module->imports[i])); + CHECK_RESULT(VisitImport(module->imports[i])); for (Index i = 0; i < module->exports.size(); ++i) - CHECK_RESULT(VisitExport(i, module->exports[i])); + CHECK_RESULT(VisitExport(module->exports[i])); for (Index i = 0; i < module->globals.size(); ++i) CHECK_RESULT(VisitGlobal(i, module->globals[i])); |