diff options
Diffstat (limited to 'src/ir/hashed.h')
-rw-r--r-- | src/ir/hashed.h | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/src/ir/hashed.h b/src/ir/hashed.h index 99488dcfb..b1fd659bc 100644 --- a/src/ir/hashed.h +++ b/src/ir/hashed.h @@ -20,6 +20,7 @@ #include "ir/utils.h" #include "support/hash.h" #include "wasm.h" +#include <functional> namespace wasm { @@ -30,9 +31,14 @@ struct FunctionHasher : public WalkerPass<PostWalker<FunctionHasher>> { struct Map : public std::map<Function*, size_t> {}; - FunctionHasher(Map* output) : output(output) {} + FunctionHasher(Map* output, ExpressionAnalyzer::ExprHasher customHasher) + : output(output), customHasher(customHasher) {} + FunctionHasher(Map* output) + : output(output), customHasher(ExpressionAnalyzer::nothingHasher) {} - FunctionHasher* create() override { return new FunctionHasher(output); } + FunctionHasher* create() override { + return new FunctionHasher(output, customHasher); + } static Map createMap(Module* module) { Map hashes; @@ -44,19 +50,29 @@ struct FunctionHasher : public WalkerPass<PostWalker<FunctionHasher>> { return hashes; } - void doWalkFunction(Function* func) { output->at(func) = hashFunction(func); } + void doWalkFunction(Function* func) { + output->at(func) = flexibleHashFunction(func, customHasher); + } - static size_t hashFunction(Function* func) { + static size_t + flexibleHashFunction(Function* func, + ExpressionAnalyzer::ExprHasher customHasher) { auto digest = hash(func->type); for (auto type : func->vars) { rehash(digest, type.getID()); } - hash_combine(digest, ExpressionAnalyzer::hash(func->body)); + hash_combine(digest, + ExpressionAnalyzer::flexibleHash(func->body, customHasher)); return digest; } + static size_t hashFunction(Function* func) { + return flexibleHashFunction(func, ExpressionAnalyzer::nothingHasher); + } + private: Map* output; + ExpressionAnalyzer::ExprHasher customHasher; }; } // namespace wasm |