help
diff --git a/src/passes/hash-stringify-walker.cpp b/src/passes/hash-stringify-walker.cpp
index 3df01b2..b843033 100644
--- a/src/passes/hash-stringify-walker.cpp
+++ b/src/passes/hash-stringify-walker.cpp
@@ -57,15 +57,22 @@
   // for Expressions
   assert((uint32_t)nextSeparatorVal >= nextVal);
   hashString.push_back((uint32_t)nextSeparatorVal);
+  exprs.push_back(NULL);
   nextSeparatorVal--;
 }
 
 void HashStringifyWalker::visitExpression(Expression* curr) {
   auto [it, inserted] = exprToCounter.insert({curr, nextVal});
   hashString.push_back(it->second);
+  exprs.push_back(curr);
   if (inserted) {
     nextVal++;
   }
 }
 
+void HashStringifyWalker::markFunctionBegin(Name func) {
+  idxToFuncName.insert({hashString.size(), func});
+  funcIdx.insert(hashString.size());
+}
+
 } // namespace wasm
diff --git a/src/passes/stringify-walker-impl.h b/src/passes/stringify-walker-impl.h
index e856773..a27b5ea 100644
--- a/src/passes/stringify-walker-impl.h
+++ b/src/passes/stringify-walker-impl.h
@@ -31,6 +31,7 @@
 
 template<typename SubType>
 inline void StringifyWalker<SubType>::doWalkFunction(Function* func) {
+  this->doMarkFunctionBegin(func->name);
   walk(func->body);
   /*
    * We add a unique symbol after walking the function body to separate the
@@ -74,7 +75,8 @@
 
 // This dequeueControlFlow is responsible for visiting the children expressions
 // of control flow.
-template<typename SubType> void StringifyWalker<SubType>::dequeueControlFlow() {
+template<typename SubType>
+void StringifyWalker<SubType>::dequeueControlFlow() {
   auto& queue = controlFlowQueue;
   if (queue.empty()) {
     return;
@@ -134,12 +136,20 @@
 inline void StringifyWalker<SubType>::addUniqueSymbol() {
   // TODO: Add the following static_assert when the compilers running our GitHub
   // actions are updated enough to know that this is a constant condition:
-  // static_assert(&StringifyWalker<SubType>::addUniqueSymbol !=
-  // &SubType::addUniqueSymbol);
+  static_assert(&StringifyWalker<SubType>::addUniqueSymbol !=
+  &SubType::addUniqueSymbol);
   auto self = static_cast<SubType*>(this);
   self->addUniqueSymbol();
 }
 
+template<typename SubType>
+inline void StringifyWalker<SubType>::doMarkFunctionBegin(Name func) {
+  //static_assert(&StringifyWalker<SubType>::doMarkFunctionBegin !=
+  //&SubType::markFunctionBegin);
+  auto self = static_cast<SubType*>(this);
+  self->markFunctionBegin(func);
+}
+
 } // namespace wasm
 
 #endif // wasm_passes_stringify_walker_impl_h
diff --git a/src/passes/stringify-walker.h b/src/passes/stringify-walker.h
index 7e18d3d..b73ef53 100644
--- a/src/passes/stringify-walker.h
+++ b/src/passes/stringify-walker.h
@@ -21,6 +21,7 @@
 #include "ir/module-utils.h"
 #include "ir/utils.h"
 #include "wasm-traversal.h"
+#include "wasm.h"
 #include <queue>
 
 namespace wasm {
@@ -84,6 +85,7 @@
   static void scan(SubType* self, Expression** currp);
   static void doVisitExpression(SubType* self, Expression** currp);
 
+  void doMarkFunctionBegin(Name func);
 private:
   void dequeueControlFlow();
 };
@@ -128,9 +130,19 @@
   // when evaluating if expressions.
   std::unordered_map<Expression*, uint32_t, StringifyHasher, StringifyEquator>
     exprToCounter;
+  // This map is for keeping track of where each function begins in terms of
+  // index of index relative to the hashString
+  //
+  // The plan is to do a binary search of the keys of the unordered_map in order
+  // to determine which function needs to be iterated through to find the
+  // Expressions represented in the repeat substring
+  std::unordered_map<uint32_t, Name> idxToFuncName;
+  std::set<uint32_t>funcIdx;
 
   void addUniqueSymbol();
   void visitExpression(Expression* curr);
+  void markFunctionBegin(Name func);
+  std::vector<Expression *> exprs;
 };
 
 } // namespace wasm
diff --git a/test/gtest/stringify.cpp b/test/gtest/stringify.cpp
index 42f4e12..575a30b 100644
--- a/test/gtest/stringify.cpp
+++ b/test/gtest/stringify.cpp
@@ -253,3 +253,35 @@
       // 7, 6 appears at idx 11 and again at 24
       SuffixTree::RepeatedSubstring{2u, (std::vector<unsigned>{11, 24})}}));
 }
+
+TEST_F(StringifyTest, FuncMap) {
+  auto dupFuncModuleText = R"wasm(
+    (module
+    (func $a
+      (block
+        (drop (i32.const 20))
+      )
+    )
+    (func $b
+        (drop (i32.const 5))
+    )
+   )
+  )wasm";
+  Module wasm;
+  parseWast(wasm, dupFuncModuleText);
+
+  HashStringifyWalker stringify = HashStringifyWalker();
+  stringify.walkModule(&wasm);
+  EXPECT_EQ(stringify.hashString,
+            (std::vector<uint32_t>{8}));
+
+  for (size_t i = 0; i < stringify.exprs.size(); i++) {
+    std::cout << i << ": (";
+    if (stringify.exprs[i]) {
+      std::cout << ShallowExpression{stringify.exprs[i], &wasm} << ")";
+    } else {
+      std::cout << "separator)";
+    }
+    std::cout << std::endl;
+  }
+}