diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/passes/NameTypes.cpp | 25 | ||||
-rw-r--r-- | src/passes/TypeSSA.cpp | 2 |
2 files changed, 25 insertions, 2 deletions
diff --git a/src/passes/NameTypes.cpp b/src/passes/NameTypes.cpp index fcf6df5ab..0e18f3094 100644 --- a/src/passes/NameTypes.cpp +++ b/src/passes/NameTypes.cpp @@ -34,13 +34,36 @@ struct NameTypes : public Pass { // Find all the types. std::vector<HeapType> types = ModuleUtils::collectHeapTypes(*module); + std::unordered_set<Name> used; + // Ensure simple names. If a name already exists, and is short enough, keep // it. size_t i = 0; for (auto& type : types) { if (module->typeNames.count(type) == 0 || module->typeNames[type].name.size() >= NameLenLimit) { - module->typeNames[type].name = "type$" + std::to_string(i++); + module->typeNames[type].name = "type_" + std::to_string(i++); + } + used.insert(module->typeNames[type].name); + } + + // "Lint" the names a little. In particular a name with a "_7" or such + // suffix, as TypeSSA creates, can be removed if it does not cause a + // collision. This keeps the names unique while removing 'noise.' + // + // Note we must iterate in a deterministic order here, so do it on |types|. + for (auto& type : types) { + auto& names = module->typeNames[type]; + std::string name = names.name.toString(); + while (name.size() > 1 && isdigit(name.back())) { + name.pop_back(); + } + if (name.size() > 1 && name.back() == '_') { + name.pop_back(); + if (!used.count(name)) { + names.name = name; + used.insert(name); + } } } } diff --git a/src/passes/TypeSSA.cpp b/src/passes/TypeSSA.cpp index cb8f0f049..6c50cb2a9 100644 --- a/src/passes/TypeSSA.cpp +++ b/src/passes/TypeSSA.cpp @@ -285,7 +285,7 @@ struct TypeSSA : public Pass { // If the old type has a nice name, make a nice name for the new one. if (typeNames.count(oldType)) { - auto intendedName = typeNames[oldType].name.toString() + '$' + + auto intendedName = typeNames[oldType].name.toString() + '_' + std::to_string(++nameCounter); auto newName = Names::getValidNameGivenExisting(intendedName, existingTypeNames); |