// dataflow.h -- Go frontend dataflow. -*- C++ -*- // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. #ifndef GO_DATAFLOW_H #define GO_DATAFLOW_H class Expression; class Named_object; class Statement; // Dataflow information about the Go program. class Dataflow { public: // A variable definition. struct Def { // The statement where the variable is defined. Statement* statement; // The value to which the variable is set. This may be NULL. Expression* val; // Whether this is an initialization of the variable. bool is_init; }; // A variable reference. struct Ref { // The statement where the variable is referenced. Statement* statement; }; // A list of defs. typedef std::vector Defs; // A list of refs. typedef std::vector Refs; Dataflow(); // Initialize the dataflow information. void initialize(Gogo*); // Add a definition of a variable. STATEMENT assigns a value to // VAR. VAL is the value if it is known, NULL otherwise. void add_def(Named_object* var, Expression* val, Statement* statement, bool is_init); // Add a reference to a variable. VAR is the variable, and // STATEMENT is the statement which refers to it. void add_ref(Named_object* var, Statement* statement); // Return the definitions of VAR--the places where it is set. const Defs* find_defs(Named_object* var) const; // Return the references to VAR--the places where it is used. const Refs* find_refs(Named_object* var) const; private: // Order variables in the map. struct Compare_vars { bool operator()(const Named_object*, const Named_object*) const; }; // Map from variables to a list of defs of the variable. We use a // map rather than a hash table because the order in which we // process variables may affect the resulting code. typedef std::map Defmap; // Map from variables to a list of refs to the vairable. typedef std::map Refmap; // Variable defs. Defmap defs_; // Variable refs; Refmap refs_; }; #endif // !defined(GO_DATAFLOW_H)