diff --git a/src/sksl/SkSLCompiler.cpp b/src/sksl/SkSLCompiler.cpp
index 789ca5d..a61b416 100644
--- a/src/sksl/SkSLCompiler.cpp
+++ b/src/sksl/SkSLCompiler.cpp
@@ -185,7 +185,7 @@
     // treat it as builtin (ie, no need to clone it into the Program).
     fPrivateSymbolTable->add(
             std::make_unique<Variable>(/*offset=*/-1,
-                                       fIRGenerator->fModifiers->addToPool(Modifiers()),
+                                       fIRGenerator->modifiersPool().add(Modifiers()),
                                        "sk_Caps",
                                        fContext->fTypes.fSkCaps.get(),
                                        /*builtin=*/false,
@@ -339,7 +339,7 @@
     fModifiers.push_back(std::move(ir.fModifiers));
 #else
     SkASSERT(data.fData && (data.fSize != 0));
-    Rehydrator rehydrator(fContext.get(), fIRGenerator->fModifiers.get(), base, this,
+    Rehydrator rehydrator(fContext.get(), fIRGenerator->fModifiers.get(), base,
                           data.fData, data.fSize);
     LoadedModule module = { kind, rehydrator.symbolTable(), rehydrator.elements() };
     fModifiers.push_back(fIRGenerator->releaseModifiers());
diff --git a/src/sksl/SkSLIRGenerator.cpp b/src/sksl/SkSLIRGenerator.cpp
index ce2edf8..67c9321 100644
--- a/src/sksl/SkSLIRGenerator.cpp
+++ b/src/sksl/SkSLIRGenerator.cpp
@@ -81,7 +81,7 @@
 
 IRGenerator::IRGenerator(const Context* context)
         : fContext(*context)
-        , fModifiers(new ModifiersPool()) {}
+        , fModifiers(std::make_unique<ModifiersPool>()) {}
 
 void IRGenerator::pushSymbolTable() {
     auto childSymTable = std::make_shared<SymbolTable>(std::move(fSymbolTable), fIsBuiltinCode);
@@ -358,8 +358,8 @@
         }
         type = fSymbolTable->addArrayDimension(type, arraySizeValue);
     }
-    return std::make_unique<Variable>(offset, fModifiers->addToPool(modifiers), name, type,
-                                      fIsBuiltinCode, storage);
+    return std::make_unique<Variable>(offset, this->modifiersPool().add(modifiers), name,
+                                      type, fIsBuiltinCode, storage);
 }
 
 std::unique_ptr<Statement> IRGenerator::convertVarDeclaration(std::unique_ptr<Variable> var,
@@ -489,7 +489,7 @@
         !this->caps().gsInvocationsSupport()) {
         modifiers.fLayout.fMaxVertices *= fInvocations;
     }
-    return std::make_unique<ModifiersDeclaration>(fModifiers->addToPool(modifiers));
+    return std::make_unique<ModifiersDeclaration>(this->modifiersPool().add(modifiers));
 }
 
 std::unique_ptr<Statement> IRGenerator::convertIf(const ASTNode& n) {
@@ -687,7 +687,7 @@
     Modifiers invokeModifiers(invokeLayout, Modifiers::kHasSideEffects_Flag);
     const FunctionDeclaration* invokeDecl = fSymbolTable->add(std::make_unique<FunctionDeclaration>(
             /*offset=*/-1,
-            fModifiers->addToPool(invokeModifiers),
+            this->modifiersPool().add(invokeModifiers),
             "_invoke",
             std::vector<const Variable*>(),
             fContext.fTypes.fVoid.get(),
@@ -1056,8 +1056,8 @@
         }
 
         const Variable* var = fSymbolTable->takeOwnershipOfSymbol(
-                std::make_unique<Variable>(param.fOffset, fModifiers->addToPool(m), pd.fName, type,
-                                           fIsBuiltinCode, Variable::Storage::kParameter));
+                std::make_unique<Variable>(param.fOffset, this->modifiersPool().add(m), pd.fName,
+                                           type, fIsBuiltinCode, Variable::Storage::kParameter));
         parameters.push_back(var);
     }
 
@@ -1177,7 +1177,7 @@
                 if (match) {
                     if (*returnType != other->returnType()) {
                         FunctionDeclaration newDecl(f.fOffset,
-                                                    fModifiers->addToPool(funcData.fModifiers),
+                                                    this->modifiersPool().add(funcData.fModifiers),
                                                     funcData.fName,
                                                     parameters,
                                                     returnType,
@@ -1224,7 +1224,7 @@
         // Create a new declaration.
         decl = fSymbolTable->add(
                 std::make_unique<FunctionDeclaration>(f.fOffset,
-                                                      fModifiers->addToPool(declModifiers),
+                                                      this->modifiersPool().add(declModifiers),
                                                       funcData.fName,
                                                       parameters,
                                                       returnType,
@@ -1344,7 +1344,7 @@
     }
     const Variable* var = old->takeOwnershipOfSymbol(
             std::make_unique<Variable>(intf.fOffset,
-                                       fModifiers->addToPool(id.fModifiers),
+                                       this->modifiersPool().add(id.fModifiers),
                                        id.fInstanceName.fLength ? id.fInstanceName : id.fTypeName,
                                        type,
                                        fIsBuiltinCode,
@@ -1415,7 +1415,7 @@
         }
         value = IntLiteral::Make(fContext, e.fOffset, currentValue);
         ++currentValue;
-        auto var = std::make_unique<Variable>(e.fOffset, fModifiers->addToPool(modifiers),
+        auto var = std::make_unique<Variable>(e.fOffset, this->modifiersPool().add(modifiers),
                                               child.getString(), type, fIsBuiltinCode,
                                               Variable::Storage::kGlobal);
         // enum variables aren't really 'declared', but we have to create a declaration to store
@@ -2121,7 +2121,7 @@
             m.fFlags = Modifiers::kIn_Flag;
             m.fLayout.fBuiltin = SK_INVOCATIONID_BUILTIN;
         }
-        auto var = std::make_unique<Variable>(/*offset=*/-1, fModifiers->addToPool(m),
+        auto var = std::make_unique<Variable>(/*offset=*/-1, this->modifiersPool().add(m),
                                               "sk_InvocationID", fContext.fTypes.fInt.get(),
                                               /*builtin=*/false, Variable::Storage::kGlobal);
         auto decl = VarDeclaration::Make(fContext, var.get(), fContext.fTypes.fInt.get(),
@@ -2171,10 +2171,11 @@
         }
     }
 
-    IRBundle result{std::move(*fProgramElements), std::move(*fSharedElements),
-                    this->releaseModifiers(), fSymbolTable, fInputs};
-    fSymbolTable = nullptr;
-    return result;
+    return IRBundle{std::move(*fProgramElements),
+                    std::move(*fSharedElements),
+                    this->releaseModifiers(),
+                    std::move(fSymbolTable),
+                    fInputs};
 }
 
 IRGenerator::IRBundle IRGenerator::convertProgram(
diff --git a/src/sksl/SkSLIRGenerator.h b/src/sksl/SkSLIRGenerator.h
index 9f2efad..0691d00 100644
--- a/src/sksl/SkSLIRGenerator.h
+++ b/src/sksl/SkSLIRGenerator.h
@@ -257,6 +257,10 @@
         return fContext.fCaps;
     }
 
+    ModifiersPool& modifiersPool() const {
+        return *fModifiers;
+    }
+
     Program::Inputs fInputs;
 
     std::unique_ptr<ASTFile> fFile;
diff --git a/src/sksl/SkSLInliner.cpp b/src/sksl/SkSLInliner.cpp
index ae92cc6..cba019a 100644
--- a/src/sksl/SkSLInliner.cpp
+++ b/src/sksl/SkSLInliner.cpp
@@ -589,7 +589,7 @@
     // Create our new variable and add it to the symbol table.
     InlineVariable result;
     auto var = std::make_unique<Variable>(/*offset=*/-1,
-                                          fModifiers->addToPool(Modifiers()),
+                                          this->modifiersPool().add(Modifiers{}),
                                           name->c_str(),
                                           type,
                                           isBuiltinCode,
diff --git a/src/sksl/SkSLInliner.h b/src/sksl/SkSLInliner.h
index 29186db..ab8eecf 100644
--- a/src/sksl/SkSLInliner.h
+++ b/src/sksl/SkSLInliner.h
@@ -114,6 +114,8 @@
     /** Checks whether inlining is viable for a FunctionCall, modulo recursion and function size. */
     bool isSafeToInline(const FunctionDefinition* functionDef);
 
+    ModifiersPool& modifiersPool() const { return *fModifiers; }
+
     const Context* fContext = nullptr;
     ModifiersPool* fModifiers = nullptr;
     Mangler fMangler;
diff --git a/src/sksl/SkSLModifiersPool.h b/src/sksl/SkSLModifiersPool.h
index 79d6ce8..798fa7c 100644
--- a/src/sksl/SkSLModifiersPool.h
+++ b/src/sksl/SkSLModifiersPool.h
@@ -20,7 +20,7 @@
  */
 class ModifiersPool {
 public:
-    const Modifiers* addToPool(const Modifiers& modifiers) {
+    const Modifiers* add(const Modifiers& modifiers) {
         auto [iter, wasInserted] = fModifiersSet.insert(modifiers);
         return &*iter;
     }
diff --git a/src/sksl/SkSLRehydrator.cpp b/src/sksl/SkSLRehydrator.cpp
index 46adfc7..44fba39 100644
--- a/src/sksl/SkSLRehydrator.cpp
+++ b/src/sksl/SkSLRehydrator.cpp
@@ -78,11 +78,10 @@
 };
 
 Rehydrator::Rehydrator(const Context* context, ModifiersPool* modifiers,
-                       std::shared_ptr<SymbolTable> symbolTable, ErrorReporter* errorReporter,
+                       std::shared_ptr<SymbolTable> symbolTable,
                        const uint8_t* src, size_t length)
                 : fContext(*context)
                 , fModifiers(*modifiers)
-                , fErrors(errorReporter)
                 , fSymbolTable(std::move(symbolTable))
                 , fStart(src)
     SkDEBUGCODE(, fEnd(fStart + length)) {
@@ -184,8 +183,12 @@
             const Type* returnType = this->type();
             const FunctionDeclaration* result =
                     fSymbolTable->takeOwnershipOfSymbol(std::make_unique<FunctionDeclaration>(
-                                              /*offset=*/-1, fModifiers.addToPool(modifiers), name,
-                                              std::move(parameters), returnType, /*builtin=*/true));
+                            /*offset=*/-1,
+                            this->modifiersPool().add(modifiers),
+                            name,
+                            std::move(parameters),
+                            returnType,
+                            /*builtin=*/true));
             this->addSymbol(id, result);
             return result;
         }
@@ -252,7 +255,7 @@
         }
         case kVariable_Command: {
             uint16_t id = this->readU16();
-            const Modifiers* m = fModifiers.addToPool(this->modifiers());
+            const Modifiers* m = this->modifiersPool().add(this->modifiers());
             StringFragment name = this->readString();
             const Type* type = this->type();
             Variable::Storage storage = (Variable::Storage) this->readU8();
@@ -585,7 +588,7 @@
     std::shared_ptr<SymbolTable> oldTable = fSymbolTable;
     std::shared_ptr<SymbolTable> result =
             inherit ? std::make_shared<SymbolTable>(fSymbolTable, /*builtin=*/true)
-                    : std::make_shared<SymbolTable>(fErrors, /*builtin=*/true);
+                    : std::make_shared<SymbolTable>(this->errorReporter(), /*builtin=*/true);
     fSymbolTable = result;
     std::vector<const Symbol*> ownedSymbols;
     ownedSymbols.reserve(ownedCount);
diff --git a/src/sksl/SkSLRehydrator.h b/src/sksl/SkSLRehydrator.h
index 09917f4..cdcad1d 100644
--- a/src/sksl/SkSLRehydrator.h
+++ b/src/sksl/SkSLRehydrator.h
@@ -11,6 +11,7 @@
 #include "include/private/SkSLDefines.h"
 #include "include/private/SkSLModifiers.h"
 #include "include/private/SkSLSymbol.h"
+#include "src/sksl/SkSLContext.h"
 
 #include <vector>
 
@@ -151,7 +152,7 @@
 
     // src must remain in memory as long as the objects created from it do
     Rehydrator(const Context* context, ModifiersPool* modifiers,
-               std::shared_ptr<SymbolTable> symbolTable, ErrorReporter* errorReporter,
+               std::shared_ptr<SymbolTable> symbolTable,
                const uint8_t* src, size_t length);
 
     std::vector<std::unique_ptr<ProgramElement>> elements();
@@ -227,9 +228,12 @@
 
     const Type* type();
 
+    ErrorReporter* errorReporter() { return &fContext.fErrors; }
+
+    ModifiersPool& modifiersPool() const { return fModifiers; }
+
     const Context& fContext;
     ModifiersPool& fModifiers;
-    ErrorReporter* fErrors;
     std::shared_ptr<SymbolTable> fSymbolTable;
     std::vector<const Symbol*> fSymbols;
 
diff --git a/src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp b/src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp
index 13138c2..8ff7279 100644
--- a/src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp
+++ b/src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp
@@ -2078,7 +2078,7 @@
                         Modifiers::kUniform_Flag);
                 const Variable* intfVar = fSynthetics.takeOwnershipOfSymbol(
                         std::make_unique<Variable>(/*offset=*/-1,
-                                                   fProgram.fModifiers->addToPool(modifiers),
+                                                   fProgram.fModifiers->add(modifiers),
                                                    name,
                                                    intfStruct.get(),
                                                    /*builtin=*/false,
@@ -3494,7 +3494,7 @@
     Modifiers modifiers{layout, Modifiers::kUniform_Flag};
 
     fUniformBuffer.fInnerVariable = std::make_unique<Variable>(
-            /*offset=*/-1, fProgram.fModifiers->addToPool(modifiers), kUniformBufferName,
+            /*offset=*/-1, fProgram.fModifiers->add(modifiers), kUniformBufferName,
             fUniformBuffer.fStruct.get(), /*builtin=*/false, Variable::Storage::kGlobal);
 
     // Create an interface block object for this global variable.
diff --git a/src/sksl/dsl/DSLVar.cpp b/src/sksl/dsl/DSLVar.cpp
index ce5bca0..0f18abc 100644
--- a/src/sksl/dsl/DSLVar.cpp
+++ b/src/sksl/dsl/DSLVar.cpp
@@ -37,7 +37,7 @@
         fVar = DSLWriter::SymbolTable()->takeOwnershipOfIRNode(
                 std::make_unique<SkSL::Variable>(
                         /*offset=*/-1,
-                        DSLWriter::IRGenerator().fModifiers->addToPool(
+                        DSLWriter::IRGenerator().modifiersPool().add(
                                 SkSL::Modifiers(
                                         SkSL::Layout(/*flags=*/0, /*location=*/-1, /*offset=*/-1,
                                                      /*binding=*/-1, /*index=*/-1, /*set=*/-1,
diff --git a/src/sksl/dsl/priv/DSLWriter.cpp b/src/sksl/dsl/priv/DSLWriter.cpp
index 9121c3f..d0de74c 100644
--- a/src/sksl/dsl/priv/DSLWriter.cpp
+++ b/src/sksl/dsl/priv/DSLWriter.cpp
@@ -79,8 +79,8 @@
     ProgramElements().clear();
 }
 
-const SkSL::Modifiers* DSLWriter::Modifiers(SkSL::Modifiers modifiers) {
-    return IRGenerator().fModifiers->addToPool(modifiers);
+const SkSL::Modifiers* DSLWriter::Modifiers(const SkSL::Modifiers& modifiers) {
+    return IRGenerator().modifiersPool().add(modifiers);
 }
 
 const char* DSLWriter::Name(const char* name) {
diff --git a/src/sksl/dsl/priv/DSLWriter.h b/src/sksl/dsl/priv/DSLWriter.h
index 154849c..3c379d0 100644
--- a/src/sksl/dsl/priv/DSLWriter.h
+++ b/src/sksl/dsl/priv/DSLWriter.h
@@ -83,7 +83,7 @@
      * Returns the final pointer to a pooled Modifiers object that should be used to represent the
      * given modifiers.
      */
-    static const SkSL::Modifiers* Modifiers(SkSL::Modifiers modifiers);
+    static const SkSL::Modifiers* Modifiers(const SkSL::Modifiers& modifiers);
 
     /**
      * Returns the SkSL variable corresponding to a DSLVar.
