moved SkSL ModifiersDeclaration data into IRNode

Change-Id: Iebe59b32a965e383d2b032258d7731645e0bd1a4
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/325622
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
Commit-Queue: John Stiles <johnstiles@google.com>
Reviewed-by: John Stiles <johnstiles@google.com>
diff --git a/src/sksl/SkSLGLSLCodeGenerator.cpp b/src/sksl/SkSLGLSLCodeGenerator.cpp
index 07a4d6f..422dbd0 100644
--- a/src/sksl/SkSLGLSLCodeGenerator.cpp
+++ b/src/sksl/SkSLGLSLCodeGenerator.cpp
@@ -1515,7 +1515,7 @@
             this->writeFunction(e.as<FunctionDefinition>());
             break;
         case ProgramElement::Kind::kModifiers: {
-            const Modifiers& modifiers = e.as<ModifiersDeclaration>().fModifiers;
+            const Modifiers& modifiers = e.as<ModifiersDeclaration>().modifiers();
             if (!fFoundGSInvocations && modifiers.fLayout.fInvocations >= 0) {
                 if (fProgram.fSettings.fCaps->gsInvocationsExtensionString()) {
                     this->writeExtension(fProgram.fSettings.fCaps->gsInvocationsExtensionString());
diff --git a/src/sksl/SkSLIRGenerator.cpp b/src/sksl/SkSLIRGenerator.cpp
index eaffba5..67dd678 100644
--- a/src/sksl/SkSLIRGenerator.cpp
+++ b/src/sksl/SkSLIRGenerator.cpp
@@ -469,7 +469,7 @@
         !fSettings->fCaps->gsInvocationsSupport()) {
         modifiers.fLayout.fMaxVertices *= fInvocations;
     }
-    return std::make_unique<ModifiersDeclaration>(modifiers);
+    return std::make_unique<ModifiersDeclaration>(fModifiers->handle(modifiers));
 }
 
 std::unique_ptr<Statement> IRGenerator::convertIf(const ASTNode& n) {
diff --git a/src/sksl/SkSLMetalCodeGenerator.cpp b/src/sksl/SkSLMetalCodeGenerator.cpp
index 70e5882..8abe2b9 100644
--- a/src/sksl/SkSLMetalCodeGenerator.cpp
+++ b/src/sksl/SkSLMetalCodeGenerator.cpp
@@ -1658,7 +1658,7 @@
             this->writeFunction(e.as<FunctionDefinition>());
             break;
         case ProgramElement::Kind::kModifiers:
-            this->writeModifiers(e.as<ModifiersDeclaration>().fModifiers, true);
+            this->writeModifiers(e.as<ModifiersDeclaration>().modifiers(), true);
             this->writeLine(";");
             break;
         default:
diff --git a/src/sksl/SkSLSPIRVCodeGenerator.cpp b/src/sksl/SkSLSPIRVCodeGenerator.cpp
index 9a328da..2fdc037 100644
--- a/src/sksl/SkSLSPIRVCodeGenerator.cpp
+++ b/src/sksl/SkSLSPIRVCodeGenerator.cpp
@@ -2717,7 +2717,7 @@
     if (intfModifiers.fLayout.fBuiltin == SK_IN_BUILTIN) {
         for (const auto& e : fProgram.elements()) {
             if (e->is<ModifiersDeclaration>()) {
-                const Modifiers& m = e->as<ModifiersDeclaration>().fModifiers;
+                const Modifiers& m = e->as<ModifiersDeclaration>().modifiers();
                 update_sk_in_count(m, &fSkInCount);
             }
         }
@@ -3094,7 +3094,7 @@
     int invocations = 1;
     for (const auto& e : fProgram.elements()) {
         if (e->is<ModifiersDeclaration>()) {
-            const Modifiers& m = e->as<ModifiersDeclaration>().fModifiers;
+            const Modifiers& m = e->as<ModifiersDeclaration>().modifiers();
             if (m.fFlags & Modifiers::kIn_Flag) {
                 if (m.fLayout.fInvocations != -1) {
                     invocations = m.fLayout.fInvocations;
@@ -3169,7 +3169,7 @@
                 break;
             }
             case ProgramElement::Kind::kModifiers: {
-                Modifiers& m = e->as<ModifiersDeclaration>().fModifiers;
+                const Modifiers& m = e->as<ModifiersDeclaration>().modifiers();
                 if (m.fFlags & Modifiers::kIn_Flag) {
                     switch (m.fLayout.fPrimitive) {
                         case Layout::kPoints_Primitive: // break
diff --git a/src/sksl/ir/SkSLIRNode.cpp b/src/sksl/ir/SkSLIRNode.cpp
index f6859fe..a2113eb 100644
--- a/src/sksl/ir/SkSLIRNode.cpp
+++ b/src/sksl/ir/SkSLIRNode.cpp
@@ -83,6 +83,11 @@
 , fKind(kind)
 , fData(data) {}
 
+IRNode::IRNode(int offset, int kind, const ModifiersDeclarationData& data)
+: fOffset(offset)
+, fKind(kind)
+, fData(data) {}
+
 IRNode::IRNode(int offset, int kind, const SectionData& data)
 : fOffset(offset)
 , fKind(kind)
diff --git a/src/sksl/ir/SkSLIRNode.h b/src/sksl/ir/SkSLIRNode.h
index 470551a..da5db8a 100644
--- a/src/sksl/ir/SkSLIRNode.h
+++ b/src/sksl/ir/SkSLIRNode.h
@@ -152,6 +152,10 @@
         const FunctionDeclaration* fFunction;
     };
 
+    struct ModifiersDeclarationData {
+        ModifiersPool::Handle fModifiersHandle;
+    };
+
     struct SectionData {
         String fName;
         String fArgument;
@@ -230,6 +234,7 @@
             kIfStatement,
             kInlineMarker,
             kIntLiteral,
+            kModifiersDeclaration,
             kSection,
             kSetting,
             kString,
@@ -260,6 +265,7 @@
             IfStatementData fIfStatement;
             InlineMarkerData fInlineMarker;
             IntLiteralData fIntLiteral;
+            ModifiersDeclarationData fModifiersDeclaration;
             SectionData fSection;
             SettingData fSetting;
             String fString;
@@ -348,6 +354,11 @@
             *(new(&fContents) IntLiteralData) = data;
         }
 
+        NodeData(ModifiersDeclarationData data)
+            : fKind(Kind::kModifiersDeclaration) {
+            *(new(&fContents) ModifiersDeclarationData) = data;
+        }
+
         NodeData(const SectionData& data)
             : fKind(Kind::kSection) {
             *(new(&fContents) SectionData) = data;
@@ -459,6 +470,10 @@
                 case Kind::kIntLiteral:
                     *(new(&fContents) IntLiteralData) = other.fContents.fIntLiteral;
                     break;
+                case Kind::kModifiersDeclaration:
+                    *(new(&fContents) ModifiersDeclarationData) =
+                                                              other.fContents.fModifiersDeclaration;
+                    break;
                 case Kind::kSection:
                     *(new(&fContents) SectionData) = other.fContents.fSection;
                     break;
@@ -548,6 +563,9 @@
                 case Kind::kIntLiteral:
                     fContents.fIntLiteral.~IntLiteralData();
                     break;
+                case Kind::kModifiersDeclaration:
+                    fContents.fModifiersDeclaration.~ModifiersDeclarationData();
+                    break;
                 case Kind::kSection:
                     fContents.fSection.~SectionData();
                     break;
@@ -616,6 +634,8 @@
 
     IRNode(int offset, int kind, const IntLiteralData& data);
 
+    IRNode(int offset, int kind, const ModifiersDeclarationData& data);
+
     IRNode(int offset, int kind, const SectionData& data);
 
     IRNode(int offset, int kind, const SettingData& data);
@@ -759,6 +779,11 @@
         return fData.fContents.fIntLiteral;
     }
 
+    const ModifiersDeclarationData& modifiersDeclarationData() const {
+        SkASSERT(fData.fKind == NodeData::Kind::kModifiersDeclaration);
+        return fData.fContents.fModifiersDeclaration;
+    }
+
     const SectionData& sectionData() const {
         SkASSERT(fData.fKind == NodeData::Kind::kSection);
         return fData.fContents.fSection;
diff --git a/src/sksl/ir/SkSLModifiersDeclaration.h b/src/sksl/ir/SkSLModifiersDeclaration.h
index 72e78d3..13c87e9 100644
--- a/src/sksl/ir/SkSLModifiersDeclaration.h
+++ b/src/sksl/ir/SkSLModifiersDeclaration.h
@@ -21,20 +21,25 @@
 struct ModifiersDeclaration : public ProgramElement {
     static constexpr Kind kProgramElementKind = Kind::kModifiers;
 
-    ModifiersDeclaration(Modifiers modifiers)
-    : INHERITED(-1, kProgramElementKind)
-    , fModifiers(modifiers) {}
+    ModifiersDeclaration(ModifiersPool::Handle modifiers)
+    : INHERITED(-1, ModifiersDeclarationData{modifiers}) {}
+
+    const Modifiers& modifiers() const {
+        return *this->modifiersDeclarationData().fModifiersHandle;
+    }
+
+    const ModifiersPool::Handle& modifiersHandle() const {
+        return this->modifiersDeclarationData().fModifiersHandle;
+    }
 
     std::unique_ptr<ProgramElement> clone() const override {
-        return std::unique_ptr<ProgramElement>(new ModifiersDeclaration(fModifiers));
+        return std::unique_ptr<ProgramElement>(new ModifiersDeclaration(this->modifiersHandle()));
     }
 
     String description() const override {
-        return fModifiers.description() + ";";
+        return this->modifiers().description() + ";";
     }
 
-    Modifiers fModifiers;
-
     using INHERITED = ProgramElement;
 };
 
diff --git a/src/sksl/ir/SkSLProgramElement.h b/src/sksl/ir/SkSLProgramElement.h
index da3e1a6..2ea4fd3 100644
--- a/src/sksl/ir/SkSLProgramElement.h
+++ b/src/sksl/ir/SkSLProgramElement.h
@@ -40,6 +40,9 @@
     ProgramElement(int offset, const EnumData& enumData)
     : INHERITED(offset, (int) Kind::kEnum, enumData) {}
 
+    ProgramElement(int offset, const ModifiersDeclarationData& enumData)
+    : INHERITED(offset, (int) Kind::kModifiers, enumData) {}
+
     ProgramElement(int offset, Kind kind, const String& data)
     : INHERITED(offset, (int) kind, data) {
         SkASSERT(kind >= Kind::kFirst && kind <= Kind::kLast);