• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2016 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef SKSL_VARIABLE
9 #define SKSL_VARIABLE
10 
11 #include "SkSLModifiers.h"
12 #include "SkSLPosition.h"
13 #include "SkSLSymbol.h"
14 #include "SkSLType.h"
15 
16 namespace SkSL {
17 
18 struct Expression;
19 
20 /**
21  * Represents a variable, whether local, global, or a function parameter. This represents the
22  * variable itself (the storage location), which is shared between all VariableReferences which
23  * read or write that storage location.
24  */
25 struct Variable : public Symbol {
26     enum Storage {
27         kGlobal_Storage,
28         kLocal_Storage,
29         kParameter_Storage
30     };
31 
32     Variable(int offset, Modifiers modifiers, StringFragment name, const Type& type,
33              Storage storage, Expression* initialValue = nullptr)
INHERITEDVariable34     : INHERITED(offset, kVariable_Kind, name)
35     , fModifiers(modifiers)
36     , fType(type)
37     , fStorage(storage)
38     , fInitialValue(initialValue)
39     , fReadCount(0)
40     , fWriteCount(0) {}
41 
descriptionVariable42     virtual String description() const override {
43         return fModifiers.description() + fType.fName + " " + fName;
44     }
45 
deadVariable46     bool dead() const {
47         return !fWriteCount || (!fReadCount && !(fModifiers.fFlags & Modifiers::kOut_Flag));
48     }
49 
50     mutable Modifiers fModifiers;
51     const Type& fType;
52     const Storage fStorage;
53 
54     Expression* fInitialValue = nullptr;
55 
56     // Tracks how many sites read from the variable. If this is zero for a non-out variable (or
57     // becomes zero during optimization), the variable is dead and may be eliminated.
58     mutable int fReadCount;
59     // Tracks how many sites write to the variable. If this is zero, the variable is dead and may be
60     // eliminated.
61     mutable int fWriteCount;
62 
63     typedef Symbol INHERITED;
64 };
65 
66 } // namespace SkSL
67 
68 #endif
69