diff options
Diffstat (limited to 'src/passes/NameManager.cpp')
-rw-r--r-- | src/passes/NameManager.cpp | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/src/passes/NameManager.cpp b/src/passes/NameManager.cpp new file mode 100644 index 000000000..13a6dd9f9 --- /dev/null +++ b/src/passes/NameManager.cpp @@ -0,0 +1,68 @@ +// +// NameManager +// + +#include <wasm.h> +#include <pass.h> + +namespace wasm { + +Name NameManager::getUnique(std::string prefix) { + while (1) { + Name curr = cashew::IString((prefix + std::to_string(counter++)).c_str(), false); + if (names.find(curr) == names.end()) { + names.insert(curr); + return curr; + } + } +} + +void NameManager::visitBlock(Block* curr) { + names.insert(curr->name); +} +void NameManager::visitLoop(Loop* curr) { + names.insert(curr->out); + names.insert(curr->in); +} +void NameManager::visitLabel(Label* curr) { + names.insert(curr->name); +} +void NameManager::visitBreak(Break* curr) { + names.insert(curr->name); +} +void NameManager::visitSwitch(Switch* curr) { + names.insert(curr->name); + names.insert(curr->default_); + for (auto& target : curr->targets) { + names.insert(target); + } +} +void NameManager::visitCall(Call* curr) { + names.insert(curr->target); +} +void NameManager::visitCallImport(CallImport* curr) { + names.insert(curr->target); +} +void NameManager::visitFunctionType(FunctionType* curr) { + names.insert(curr->name); +} +void NameManager::visitFunction(Function* curr) { + names.insert(curr->name); + for (auto& param : curr->params) { + names.insert(param.name); + } + for (auto& local : curr->locals) { + names.insert(local.name); + } +} +void NameManager::visitImport(Import* curr) { + names.insert(curr->name); +} +void NameManager::visitExport(Export* curr) { + names.insert(curr->name); +} + +static RegisterPass<NameManager> registerPass; + +} // namespace wasm + |