|
||
Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages
dataflow.hGo 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