1// dataflow.h -- Go frontend dataflow. -*- C++ -*- 2 3// Copyright 2009 The Go Authors. All rights reserved. 4// Use of this source code is governed by a BSD-style 5// license that can be found in the LICENSE file. 6 7#ifndef GO_DATAFLOW_H 8#define GO_DATAFLOW_H 9 10class Expression; 11class Named_object; 12class Statement; 13 14// Dataflow information about the Go program. 15 16class Dataflow 17{ 18 public: 19 // A variable definition. 20 struct Def 21 { 22 // The statement where the variable is defined. 23 Statement* statement; 24 // The value to which the variable is set. This may be NULL. 25 Expression* val; 26 // Whether this is an initialization of the variable. 27 bool is_init; 28 }; 29 30 // A variable reference. 31 struct Ref 32 { 33 // The statement where the variable is referenced. 34 Statement* statement; 35 }; 36 37 // A list of defs. 38 typedef std::vector<Def> Defs; 39 40 // A list of refs. 41 typedef std::vector<Ref> Refs; 42 43 Dataflow(); 44 45 // Initialize the dataflow information. 46 void 47 initialize(Gogo*); 48 49 // Add a definition of a variable. STATEMENT assigns a value to 50 // VAR. VAL is the value if it is known, NULL otherwise. 51 void 52 add_def(Named_object* var, Expression* val, Statement* statement, 53 bool is_init); 54 55 // Add a reference to a variable. VAR is the variable, and 56 // STATEMENT is the statement which refers to it. 57 void 58 add_ref(Named_object* var, Statement* statement); 59 60 // Return the definitions of VAR--the places where it is set. 61 const Defs* 62 find_defs(Named_object* var) const; 63 64 // Return the references to VAR--the places where it is used. 65 const Refs* 66 find_refs(Named_object* var) const; 67 68 private: 69 // Order variables in the map. 70 struct Compare_vars 71 { 72 bool 73 operator()(const Named_object*, const Named_object*) const; 74 }; 75 76 // Map from variables to a list of defs of the variable. We use a 77 // map rather than a hash table because the order in which we 78 // process variables may affect the resulting code. 79 typedef std::map<Named_object*, Defs*, Compare_vars> Defmap; 80 81 // Map from variables to a list of refs to the vairable. 82 typedef std::map<Named_object*, Refs*, Compare_vars> Refmap; 83 84 // Variable defs. 85 Defmap defs_; 86 // Variable refs; 87 Refmap refs_; 88}; 89 90 91#endif // !defined(GO_DATAFLOW_H) 92