Use accessors to refer to the ModifiersPool.

This is a first step towards moving the ModifiersPool out of the
IRGenerator and into the Context.

Change-Id: I8000923f32a9e3cc1878a09464680884b950e513
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/404216
Commit-Queue: John Stiles <johnstiles@google.com>
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
Auto-Submit: John Stiles <johnstiles@google.com>
Reviewed-by: Ethan Nicholas <ethannicholas@google.com>
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.