C-Breeze
C Compiler Infrastructure

[ Project home page]

dataflow.h

Go to the documentation of this file.
00001 // $Id: dataflow.h,v 1.6 2003/08/07 23:14:12 pnav Exp $
00002 // ----------------------------------------------------------------------
00003 //
00004 //  C-Breeze
00005 //  C Compiler Framework
00006 // 
00007 //  Copyright (c) 2000 University of Texas at Austin
00008 // 
00009 //  Samuel Z. Guyer
00010 //  Daniel A. Jimenez
00011 //  Calvin Lin
00012 // 
00013 //  Permission is hereby granted, free of charge, to any person
00014 //  obtaining a copy of this software and associated documentation
00015 //  files (the "Software"), to deal in the Software without
00016 //  restriction, including without limitation the rights to use, copy,
00017 //  modify, merge, publish, distribute, sublicense, and/or sell copies
00018 //  of the Software, and to permit persons to whom the Software is
00019 //  furnished to do so, subject to the following conditions:
00020 //  
00021 //  The above copyright notice and this permission notice shall be
00022 //  included in all copies or substantial portions of the Software.
00023 //  
00024 //  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
00025 //  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
00026 //  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
00027 //  NONINFRINGEMENT.  IN NO EVENT SHALL THE UNIVERSITY OF TEXAS AT
00028 //  AUSTIN BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
00029 //  IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
00030 //  OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
00031 //  THE SOFTWARE.
00032 //
00033 //  We acknowledge the C-to-C Translator from MIT Laboratory for
00034 //  Computer Science for inspiring parts of the C-Breeze design.
00035 //
00036 // ----------------------------------------------------------------------
00037 
00038 #ifndef CBZ_DATAFLOW_H
00039 #define CBZ_DATAFLOW_H
00040 
00041 
00042 class FlowProblem;
00043 
00046 class FlowVal
00047 {
00048 private:
00049 
00050 public:
00051 
00052   // -- Clone
00053 
00054   virtual FlowVal * clone() const =0;
00055 
00056   // -- Comparison
00057 
00058   virtual bool diff(FlowVal * other) const =0;
00059 
00060   // -- Meet "^" operator
00061   // Must satisfy the following:
00062   //    Associative: x ^ (y ^ z) = (x ^ y) ^ z
00063   //    Commutative: x ^ y = y ^ x
00064   //    Idempotent:  x ^ x = x
00065 
00066   virtual void meet(const FlowVal * other) =0;
00067 
00068   // -- "T" top element
00069   // Must satisfy : x ^ T = x
00070 
00071   virtual void to_top() =0;
00072 
00073   // -- Don't change this function...
00074 
00075   void meet_and_diff(const FlowVal * other, FlowProblem & fp);
00076 };
00077 
00078 
00081 class FlowProblem
00082 {
00083 
00084 public:
00085 
00087   void iterate(Node * n, FlowVal * initial = 0);
00088 
00089 private:
00090 
00091   bool _forward;
00092   bool _changed;
00093   bool _last;
00094   bool _basicblocks;
00095   FlowVal * _top;
00096 
00097 public:
00098 
00099   typedef enum { Entry, Exit } Point;
00100 
00101   // -- Constructor
00102 
00103   FlowProblem(bool forw, FlowVal * top)
00104     : _forward(forw),
00105       _changed(true),
00106       _last(false),
00107       _basicblocks(false),
00108       _top(top)
00109   {}
00110 
00114   /* @{*/
00115 
00116   inline bool forward() const { return _forward; }
00117 
00118   inline bool changed() const { return _changed; }
00119   inline void changed(bool ch) { _changed = ch; }
00120 
00121   inline bool last() const { return _last; }
00122   inline void last(bool l) { _last = l; }
00123 
00124   inline bool basicblocks() const { return _basicblocks; }
00125   inline void basicblocks(bool a) { _basicblocks = a; }
00126 
00127   inline FlowVal * top() const { return _top; }
00139   virtual void flow_basicblock(FlowVal * v, exprNode * the_expr, Point p)
00140      { flow_node(v, the_expr, p); }
00141 
00146   virtual void flow_node(FlowVal * v, Node * the_node, Point p)
00147      { // Default: do nothing
00148      }
00149 
00150   virtual void flow_unit(FlowVal * v, unitNode * the_unit, Point p)
00151      { flow_node(v, the_unit, p); }
00152 
00153   virtual void flow_def(FlowVal * v, defNode * the_def, Point p)
00154      { flow_node(v, the_def, p); }
00155 
00156   virtual void flow_decl(FlowVal * v, declNode * the_decl, Point p)
00157      { flow_def(v, the_decl, p); }
00158 
00159   virtual void flow_proc(FlowVal * v, procNode * the_proc, Point p)
00160      { flow_def(v, the_proc, p); }
00161 
00162   virtual void flow_type(FlowVal * v, typeNode * the_type, Point p)
00163      { flow_node(v, the_type, p); }
00164 
00165   virtual void flow_prim(FlowVal * v, primNode * the_prim, Point p)
00166      { flow_type(v, the_prim, p); }
00167 
00168   virtual void flow_tdef(FlowVal * v, tdefNode * the_tdef, Point p)
00169      { flow_type(v, the_tdef, p); }
00170 
00171   virtual void flow_ptr(FlowVal * v, ptrNode * the_ptr, Point p)
00172      { flow_type(v, the_ptr, p); }
00173 
00174   virtual void flow_array(FlowVal * v, arrayNode * the_array, Point p)
00175      { flow_type(v, the_array, p); }
00176 
00177   virtual void flow_func(FlowVal * v, funcNode * the_func, Point p)
00178      { flow_type(v, the_func, p); }
00179 
00180   virtual void flow_sue(FlowVal * v, sueNode * the_sue, Point p)
00181      { flow_type(v, the_sue, p); }
00182 
00183   virtual void flow_struct(FlowVal * v, structNode * the_struct, Point p)
00184      { flow_sue(v, the_struct, p); }
00185 
00186   virtual void flow_union(FlowVal * v, unionNode * the_union, Point p)
00187      { flow_sue(v, the_union, p); }
00188 
00189   virtual void flow_enum(FlowVal * v, enumNode * the_enum, Point p)
00190      { flow_sue(v, the_enum, p); }
00191 
00192   virtual void flow_suespec(FlowVal * v, suespecNode * the_suespec, Point p)
00193      { flow_type(v, the_suespec, p); }
00194 
00195   virtual void flow_expr(FlowVal * v, exprNode * the_expr, Point p)
00196      { flow_node(v, the_expr, p); }
00197 
00198   virtual void flow_const(FlowVal * v, constNode * the_const, Point p)
00199      { flow_expr(v, the_const, p); }
00200 
00201   virtual void flow_id(FlowVal * v, idNode * the_id, Point p)
00202      { flow_expr(v, the_id, p); }
00203 
00204   virtual void flow_binary(FlowVal * v, binaryNode * the_binary, Point p)
00205      { flow_expr(v, the_binary, p); }
00206 
00207   virtual void flow_unary(FlowVal * v, unaryNode * the_unary, Point p)
00208      { flow_expr(v, the_unary, p); }
00209 
00210   virtual void flow_cast(FlowVal * v, castNode * the_cast, Point p)
00211      { flow_expr(v, the_cast, p); }
00212 
00213   virtual void flow_comma(FlowVal * v, commaNode * the_comma, Point p)
00214      { flow_expr(v, the_comma, p); }
00215 
00216   virtual void flow_ternary(FlowVal * v, ternaryNode * the_ternary, Point p)
00217      { flow_expr(v, the_ternary, p); }
00218 
00219   virtual void flow_call(FlowVal * v, callNode * the_call, Point p)
00220      { flow_expr(v, the_call, p); }
00221 
00222   virtual void flow_initializer(FlowVal * v, initializerNode * the_initializer, Point p)
00223      { flow_expr(v, the_initializer, p); }
00224 
00225   virtual void flow_stmt(FlowVal * v, stmtNode * the_stmt, Point p)
00226      { flow_node(v, the_stmt, p); }
00227 
00228   virtual void flow_block(FlowVal * v, blockNode * the_block, Point p)
00229      { flow_stmt(v, the_block, p); }
00230 
00231   virtual void flow_exprstmt(FlowVal * v, exprstmtNode * the_exprstmt, Point p)
00232      { flow_stmt(v, the_exprstmt, p); }
00233 
00234   virtual void flow_target(FlowVal * v, targetNode * the_target, Point p)
00235      { flow_stmt(v, the_target, p); }
00236 
00237   virtual void flow_label(FlowVal * v, labelNode * the_label, Point p)
00238      { flow_target(v, the_label, p); }
00239 
00240   virtual void flow_case(FlowVal * v, caseNode * the_case, Point p)
00241      { flow_target(v, the_case, p); }
00242 
00243   virtual void flow_selection(FlowVal * v, selectionNode * the_selection, Point p)
00244      { flow_stmt(v, the_selection, p); }
00245 
00246   virtual void flow_if(FlowVal * v, ifNode * the_if, Point p)
00247      { flow_selection(v, the_if, p); }
00248 
00249   virtual void flow_switch(FlowVal * v, switchNode * the_switch, Point p)
00250      { flow_selection(v, the_switch, p); }
00251 
00252   virtual void flow_loop(FlowVal * v, loopNode * the_loop, Point p)
00253      { flow_stmt(v, the_loop, p); }
00254 
00255   virtual void flow_while(FlowVal * v, whileNode * the_while, Point p)
00256      { flow_loop(v, the_while, p); }
00257 
00258   virtual void flow_do(FlowVal * v, doNode * the_do, Point p)
00259      { flow_loop(v, the_do, p); }
00260 
00261   virtual void flow_for(FlowVal * v, forNode * the_for, Point p)
00262      { flow_loop(v, the_for, p); }
00263 
00264   virtual void flow_jump(FlowVal * v, jumpNode * the_jump, Point p)
00265      { flow_stmt(v, the_jump, p); }
00266 
00267   virtual void flow_goto(FlowVal * v, gotoNode * the_goto, Point p)
00268      { flow_jump(v, the_goto, p); }
00269 
00270   virtual void flow_continue(FlowVal * v, continueNode * the_continue, Point p)
00271      { flow_jump(v, the_continue, p); }
00272 
00273   virtual void flow_break(FlowVal * v, breakNode * the_break, Point p)
00274      { flow_jump(v, the_break, p); }
00275 
00276   virtual void flow_return(FlowVal * v, returnNode * the_return, Point p)
00277      { flow_jump(v, the_return, p); }
00278 
00279   virtual void flow_attrib(FlowVal * v, attribNode * the_attrib, Point p)
00280      { flow_stmt(v, the_attrib, p); }
00281 
00282   virtual void flow_text(FlowVal * v, textNode * the_text, Point p)
00283      { flow_node(v, the_text, p); }
00284 
00286 };
00287 
00288 
00289 
00290 
00291 
00292 #endif // CBZ_DATAFLOW_H

Generated on February 1, 2006
Back to the C-Breeze home page