1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2022 Google LLC 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SKSL_PROGRAMUSAGE 9*c8dee2aaSAndroid Build Coastguard Worker #define SKSL_PROGRAMUSAGE 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkTHash.h" 13*c8dee2aaSAndroid Build Coastguard Worker 14*c8dee2aaSAndroid Build Coastguard Worker namespace SkSL { 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard Worker class Expression; 17*c8dee2aaSAndroid Build Coastguard Worker class FunctionDeclaration; 18*c8dee2aaSAndroid Build Coastguard Worker class ProgramElement; 19*c8dee2aaSAndroid Build Coastguard Worker class Statement; 20*c8dee2aaSAndroid Build Coastguard Worker class Symbol; 21*c8dee2aaSAndroid Build Coastguard Worker class Variable; 22*c8dee2aaSAndroid Build Coastguard Worker 23*c8dee2aaSAndroid Build Coastguard Worker /** 24*c8dee2aaSAndroid Build Coastguard Worker * Side-car class holding mutable information about a Program's IR 25*c8dee2aaSAndroid Build Coastguard Worker */ 26*c8dee2aaSAndroid Build Coastguard Worker class ProgramUsage { 27*c8dee2aaSAndroid Build Coastguard Worker public: 28*c8dee2aaSAndroid Build Coastguard Worker struct VariableCounts { 29*c8dee2aaSAndroid Build Coastguard Worker int fVarExists = 0; // if this is zero, the Variable might have already been deleted 30*c8dee2aaSAndroid Build Coastguard Worker int fRead = 0; 31*c8dee2aaSAndroid Build Coastguard Worker int fWrite = 0; 32*c8dee2aaSAndroid Build Coastguard Worker }; 33*c8dee2aaSAndroid Build Coastguard Worker VariableCounts get(const Variable&) const; 34*c8dee2aaSAndroid Build Coastguard Worker bool isDead(const Variable&) const; 35*c8dee2aaSAndroid Build Coastguard Worker 36*c8dee2aaSAndroid Build Coastguard Worker int get(const FunctionDeclaration&) const; 37*c8dee2aaSAndroid Build Coastguard Worker 38*c8dee2aaSAndroid Build Coastguard Worker void add(const Expression* expr); 39*c8dee2aaSAndroid Build Coastguard Worker void add(const Statement* stmt); 40*c8dee2aaSAndroid Build Coastguard Worker void add(const ProgramElement& element); 41*c8dee2aaSAndroid Build Coastguard Worker void remove(const Expression* expr); 42*c8dee2aaSAndroid Build Coastguard Worker void remove(const Statement* stmt); 43*c8dee2aaSAndroid Build Coastguard Worker void remove(const ProgramElement& element); 44*c8dee2aaSAndroid Build Coastguard Worker 45*c8dee2aaSAndroid Build Coastguard Worker bool operator==(const ProgramUsage& that) const; 46*c8dee2aaSAndroid Build Coastguard Worker bool operator!=(const ProgramUsage& that) const { return !(*this == that); } 47*c8dee2aaSAndroid Build Coastguard Worker 48*c8dee2aaSAndroid Build Coastguard Worker // All Symbol* objects in fStructCounts must be StructType*. 49*c8dee2aaSAndroid Build Coastguard Worker skia_private::THashMap<const Symbol*, int> fStructCounts; 50*c8dee2aaSAndroid Build Coastguard Worker // All Symbol* objects in fCallCounts must be FunctionDeclaration*. 51*c8dee2aaSAndroid Build Coastguard Worker skia_private::THashMap<const Symbol*, int> fCallCounts; 52*c8dee2aaSAndroid Build Coastguard Worker skia_private::THashMap<const Variable*, VariableCounts> fVariableCounts; 53*c8dee2aaSAndroid Build Coastguard Worker }; 54*c8dee2aaSAndroid Build Coastguard Worker 55*c8dee2aaSAndroid Build Coastguard Worker } // namespace SkSL 56*c8dee2aaSAndroid Build Coastguard Worker 57*c8dee2aaSAndroid Build Coastguard Worker #endif 58