00001 #ifndef _STATEMENT_H
00002 #define _STATEMENT_H
00003
00004 #ifdef POLARIS_GNU_PRAGMAS
00005 #pragma interface
00006 #endif
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 enum STMT_TYPE {
00017 UNDEFINED_STMT = 0,
00018
00019 DO_STMT,
00020 ENDDO_STMT,
00021 WHILE_STMT,
00022
00023 ASSIGNMENT_STMT,
00024
00025 IF_STMT,
00026 ELSEIF_STMT,
00027 IMPLIED_GOTO_STMT,
00028 ENDIF_STMT,
00029 ELSE_STMT,
00030
00031 ASSIGN_STMT,
00032
00033 READ_STMT,
00034 WRITE_STMT,
00035 PRINT_STMT,
00036 OPEN_STMT,
00037 CLOSE_STMT,
00038 REWIND_STMT,
00039 BACKSPACE_STMT,
00040 ENDFILE_STMT,
00041 INQUIRE_STMT,
00042
00043 STOP_STMT,
00044 PAUSE_STMT,
00045
00046 FLOW_ENTRY_STMT,
00047 FLOW_EXIT_STMT,
00048
00049 BLOCK_ENTRY_STMT,
00050 BLOCK_EXIT_STMT,
00051
00052 ENTRY_STMT,
00053 CALL_STMT,
00054 RETURN_STMT,
00055
00056 LABEL_STMT,
00057 GOTO_STMT,
00058 ARITHMETIC_IF_STMT,
00059 COMPUTED_GOTO_STMT,
00060 ASSIGNED_GOTO_STMT,
00061
00062 ALLOCATE_STMT,
00063 DEALLOCATE_STMT,
00064 NULLIFY_STMT,
00065
00066 DIRECTIVE_STMT,
00067
00068 STMT_PTR
00069 };
00070
00071 enum ASSIGN_TYPE {
00072 INVALID_ASSIGN,
00073 EXECUTABLE_ASSIGN,
00074 FORMAT_ASSIGN
00075 };
00076
00077 #include "ClassNames.h"
00078 #include <stream.h>
00079 #include <strstream.h>
00080
00081 #include "../AbstractAccess.h"
00082 #include "../BinRep.h"
00083 #include "../Collection/Iterator.h"
00084 #include "../Collection/Mutator.h"
00085 #include "../Collection/List.h"
00086 #include "../Collection/RefList.h"
00087 #include "../Collection/RefSet.h"
00088 #include "../debug.h"
00089 #include "../define.h"
00090 #include "../Dictionary.h"
00091 #include "../Directive/AssertionList.h"
00092 #include "../Expression/Expression.h"
00093 #include "../Relinkable.h"
00094 #include "../split_line.h"
00095 #include "../String.h"
00096 #include "../StringElem.h"
00097 #include "../Symbol/Symbol.h"
00098 #include "../SymbolAccess.h"
00099 #include "../SymbolAccessMap.h"
00100 #include "../VoidPtrDef.h"
00101 #include "../WorkSpaceStack.h"
00102
00103 class Symtab;
00104 class NamelistDict;
00105 class ExprTable;
00106 class VDL;
00107
00108 #ifdef PERFORMANCE_EVAL
00109 class PerformanceEstimator;
00110 #endif
00111
00112 #define DUMMY_EXPR (*((Expression *)0))
00113
00114 const int ROUTINE_EXPR = 0;
00115 const int PARAMETERS = 1;
00116 const int ALLOC_PARAMS = 0;
00117 const int ARITHIF_EXPR = 0;
00118 const int LHS = 0;
00119 const int ASSIGNEDGOTO_EXPR = 0;
00120 const int RHS = 1;
00121 const int COMPUTEDGOTO_EXPR = 0;
00122 const int DO_INDEX = 0;
00123 const int DO_INIT = 1;
00124 const int DO_LIMIT = 2;
00125 const int DO_STEP = 3;
00126 const int ELSEIF_EXPR = 0;
00127 const int IO_LIST = 0;
00128 const int IF_EXPR = 0;
00129 const int PAUSE_EXPR = 0;
00130 const int RETURN_EXPR = 0;
00131 const int STOP_EXPR = 0;
00132 const int WHILE_EXPR = 0;
00133
00134 class Statement;
00135 class StmtList;
00136
00137 void print_expr_list( ostream& o, const RefSet<Expression> &exprs);
00138 void print_expr_list( ostream& o, const RefList<Expression> &exprs);
00139 void print_expr_list( ostream& o, const List<Expression> &exprs);
00140
00141 void print_string_list(ostream& o, const List<StringElem>& strings);
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178 class s_control_type : public Listable {
00179 friend ostream & operator << (ostream & o, const s_control_type & sct);
00180 public:
00181 String keyword;
00182 List<Expression> expr;
00183
00184 s_control_type();
00185 s_control_type(String & key, Expression *expr);
00186 virtual ~s_control_type();
00187 virtual Listable *listable_clone() const;
00188 virtual int structures_OK() const;
00189 virtual void print(ostream & o) const;
00190 virtual void write(ostream & o) const;
00191 };
00192
00193
00194
00195
00196
00197
00198 class NextEntry : public Definition {
00199 protected:
00200 String _next;
00201
00202 public:
00203 virtual void print(ostream & o) const;
00204
00205 const char *next_ref() const
00206 { return (const char *) _next; }
00207
00208 void next(const char *n)
00209 { _next = n; }
00210
00211 NextEntry(const char *tag, BinRep & bstring)
00212 : Definition(tag) {
00213 p_assert(bstring.is_string(), "ERROR");
00214 String string_name;
00215 bstring.to_string(string_name);
00216
00217 _next = string_name;
00218 }
00219
00220 ~NextEntry();
00221
00222 virtual int structures_OK() const;
00223
00224 virtual Definition *definition_clone() const;
00225 };
00226
00227
00228
00229
00230
00231
00232
00233
00234 class FormatDB;
00235 class CDGNode;
00236
00237 class Statement : public Relinkable {
00238 friend class StmtList;
00239
00240 protected:
00241
00242 void make_overflow(Iterator<BinRep> & iter, const char *exname);
00243 void empty_overflow();
00244 int check_common_fields(String &field, BinRep & second,
00245 ExprTable & etable,
00246 Dictionary<NextEntry> *next_table,
00247 char *caller);
00248
00249 virtual void _setptrs(Dictionary<VoidPtrDef> &tags, const FormatDB &formats);
00250
00251
00252 void copy_base(const Statement & other);
00253
00254
00255
00256 STMT_TYPE _type;
00257
00258 List<Expression> _exprlist;
00259
00260
00261 List<Statement> _successors_list;
00262 RefSet<Statement> _successors;
00263 List<Statement> _predecessors_list;
00264 RefSet<Statement> _predecessors;
00265
00266 List<Expression> _in_refs_list;
00267 RefSet<Expression> _in_refs;
00268 List<Expression> _out_refs_list;
00269 RefSet<Expression> _out_refs;
00270 List<Expression> _act_refs_list;
00271 RefSet<Expression> _act_refs;
00272
00273 AssertionList _assertion_list;
00274
00275 Statement *_outer;
00276
00277 List<StringElem> _pre_directives;
00278 List<StringElem> _post_directives;
00279
00280 String _state;
00281 String _tag;
00282
00283
00284 int _line;
00285 WorkSpaceStack _work_stack;
00286 BinRep *_overflow;
00287
00288 SymbolAccessMap * _access_table;
00289
00290
00291
00292
00293 CDGNode* _cdgnode;
00294
00295 #ifdef PERFORMANCE_EVAL
00296 PerformanceEstimator *_perf_estimator;
00297 unsigned long _stmtProfile;
00298 #endif
00299
00300 void _add_act_refs (Expression &expr) ;
00301
00302
00303 void _add_act_params (Expression &expr) ;
00304
00305
00306
00307 void _add_in_refs (Expression &expr) ;
00308
00309
00310 void _add_out_refs (Expression &expr) ;
00311
00312
00313
00314 void _add_ioread_sets(Expression &expr) ;
00315
00316
00317
00318 inline RefSet<Statement> &modify_succ();
00319 inline RefSet<Statement> &modify_pred();
00320
00321
00322 #if 0
00323
00324 inline void tag(const char *s)
00325 { _tag = s; }
00326 #endif
00327
00328 ProgramUnit* _program_unit;
00329
00330 public:
00331
00332 virtual Mutator<Expression> iterate_expressions();
00333
00334
00335 virtual int iterate_in_exprs_valid() const;
00336
00337 virtual Mutator<Expression> iterate_in_exprs_guarded();
00338
00339
00340 virtual int iterate_out_exprs_valid() const;
00341
00342 virtual Mutator<Expression> iterate_out_exprs_guarded();
00343
00344
00345 virtual int iterate_in_out_exprs_valid() const;
00346
00347 virtual Mutator<Expression> iterate_in_out_exprs_guarded();
00348
00349
00350 void simplify_expressions();
00351
00352
00353
00354
00355
00356 Statement(const char *l, STMT_TYPE st);
00357
00358 virtual ~Statement();
00359
00360 virtual Listable *listable_clone() const;
00361
00362 virtual Statement *clone() const = 0;
00363 virtual int structures_OK() const = 0;
00364
00365 int in_out_refs_structures_OK() const;
00366
00367 virtual void convert(BinRep &stmt, ExprTable &etable, Symtab &symtab,
00368 const NamelistDict &namelists,
00369 const FormatDB &formats,
00370 Dictionary<NextEntry> *next_table);
00371
00372 virtual RefSet<Statement> *build_succ(const StmtList &stmts) const;
00373
00374 virtual void build_refs();
00375
00376
00377
00378
00379 inline STMT_TYPE stmt_class() const
00380 { return _type; }
00381
00382 inline const RefSet<Statement> &succ() const
00383 { return _successors; }
00384 inline const RefSet<Statement> &pred() const
00385 { return _predecessors;}
00386
00387 inline const RefSet<Expression> &in_refs() const
00388 { return _in_refs; }
00389 inline const RefSet<Expression> &out_refs() const
00390 { return _out_refs; }
00391 inline const RefSet<Expression> &act_refs() const
00392 { return _act_refs; }
00393
00394 inline Statement *next_ref() const
00395 { return (Statement *) Listable::next_ref(); }
00396
00397 inline Statement *prev_ref() const
00398 { return (Statement *) Listable::prev_ref(); }
00399
00400 inline Statement *outer_ref() const
00401 { return _outer; }
00402
00403 inline int line() const
00404 { return _line; }
00405
00406 inline BinRep *overflow() const
00407 { return _overflow; }
00408
00409 inline const char *tag() const
00410 { return (const char *) _tag; }
00411
00412 inline int tag_defined() const
00413 { return _tag.defined(); }
00414
00415 inline const char *state() const
00416 { return (const char *) _state; }
00417
00418 inline List<StringElem>&pre_directives() const
00419 { return (List<StringElem>&) _pre_directives; }
00420 inline List<StringElem>&post_directives() const
00421 { return (List<StringElem>&) _post_directives; }
00422
00423 inline AssertionList & assertions() const
00424 { return (AssertionList &) _assertion_list; }
00425
00426
00427
00428 inline void state(const char *s)
00429 { _state = s; }
00430
00431 inline void line(int l)
00432 { _line = l; }
00433
00434 virtual void relink_lptrs( ProgramUnit &p );
00435
00436
00437
00438 virtual void relink_sptrs( ProgramUnit &p );
00439
00440
00441
00442 inline WorkSpaceStack &work_stack() const
00443 { return (WorkSpaceStack &) _work_stack; }
00444
00445 #ifdef PERFORMANCE_EVAL
00446 inline PerformanceEstimator *perf_estimator();
00447 inline void set_perf_estimator(PerformanceEstimator *pe);
00448
00449
00450 unsigned long profile() { return _stmtProfile; }
00451 void set_profile(unsigned long profile) { _stmtProfile = profile; }
00452 #endif
00453
00454 virtual void access_table( SymbolAccessMap * map )
00455 { if (_access_table) { delete _access_table; } _access_table = map; }
00456
00457
00458 Boolean access_table_exists( );
00459
00460
00461 SymbolAccessMap & access_table( );
00462
00463
00464 KeyIterator<Symbol, SymbolAccess> iter_access_table_guarded( );
00465
00466
00467 void incorporate_access_table ( const SymbolAccessMap & sam );
00468
00469
00470 Boolean symbol_access_exists( Symbol & sym );
00471
00472
00473
00474 virtual Iterator<AbstractAccess> iter_read_guarded( Symbol & sym );
00475 virtual Iterator<AbstractAccess> iter_write_guarded( Symbol & sym );
00476 virtual Iterator<AbstractAccess> iter_readwrite_guarded( Symbol & sym );
00477
00478
00479 void ins_access( SymbolAccessMap & map );
00480
00481
00482 void ins_read_access( Symbol & sym, List<AbstractAccess> & readlist);
00483
00484
00485 void ins_write_access( Symbol & sym, List<AbstractAccess> & writelist);
00486
00487
00488 void ins_readwrite_access( Symbol & sym, List<AbstractAccess> & readwritelist);
00489
00490
00491 void ins_read_access( Symbol & sym, AbstractAccess * );
00492
00493
00494 void ins_write_access( Symbol & sym, AbstractAccess * );
00495
00496
00497 void ins_readwrite_access( Symbol & sym, AbstractAccess * );
00498
00499
00500 void fix_flow( StmtList & stmts );
00501
00502
00503 void del_flow( StmtList & stmts );
00504
00505
00506 void error(char *) const;
00507
00508 ProgramUnit* program_unit() {return _program_unit;};
00509 void program_unit(ProgramUnit* program_unit) {_program_unit=program_unit;};
00510
00511 Iterator<Expression> iterate_all_expressions();
00512
00513
00514
00515
00516 virtual const Expression & lhs() const;
00517 virtual Expression & lhs();
00518 virtual const Expression & rhs() const;
00519 virtual Expression & rhs();
00520
00521 virtual Statement *follow_ref() const;
00522 virtual Statement *lead_ref() const;
00523 virtual Statement *matching_if_ref() const;
00524 virtual Statement *matching_endif_ref() const;
00525 virtual const Expression & expr() const;
00526 virtual Expression & expr() ;
00527
00528 virtual const Expression & index() const;
00529 virtual Expression & index();
00530 virtual const Expression & init() const;
00531 virtual Expression & init();
00532 virtual const Expression & limit() const;
00533 virtual Expression & limit();
00534 virtual const Expression & step() const;
00535 virtual Expression & step();
00536 virtual const Expression & expr_guarded() const;
00537 virtual Expression & expr_guarded() ;
00538 virtual int expr_valid() const;
00539
00540 virtual String get_loop_name();
00541
00542 virtual const Statement *target_ref() const;
00543 virtual Statement *target_ref() ;
00544 virtual ASSIGN_TYPE atype() const;
00545 virtual const Format *format_ref() const;
00546 virtual Format *format_ref();
00547
00548 virtual const RefList<Statement> &label_list() const;
00549 virtual RefList<Statement> &label_list();
00550
00551 virtual const List<s_control_type> &s_control_guarded() const;
00552 virtual List<s_control_type> &s_control_guarded();
00553 virtual int s_control_valid() const;
00554
00555 virtual Boolean marked_parallel() const;
00556
00557 virtual Boolean marked_serial() const;
00558
00559 virtual RefSet<Symbol> *private_vars_ref() const;
00560
00561 virtual const Expression & io_list_guarded() const;
00562 virtual Expression & io_list_guarded();
00563 virtual int io_list_valid() const;
00564
00565 virtual const Expression & routine_guarded() const;
00566 virtual Expression & routine_guarded();
00567 virtual int routine_valid() const;
00568
00569 virtual const Expression & parameters_guarded() const;
00570 virtual Expression & parameters_guarded();
00571 virtual int parameters_valid() const;
00572
00573 virtual int value() const;
00574
00575
00576
00577
00578 virtual void lhs(Expression * e);
00579 virtual void rhs(Expression * e);
00580 virtual void index(Expression * e);
00581 virtual void init(Expression * e);
00582 virtual void limit(Expression * e);
00583 virtual void step(Expression * e);
00584 virtual void expr(Expression * e);
00585 virtual void target(Statement * s);
00586 virtual void io_list(Expression * e);
00587 virtual void routine(Expression * e);
00588 virtual void parameters(Expression * e);
00589 virtual void value(int i);
00590
00591
00592 virtual void print(ostream & o) const;
00593
00594 virtual void fortran_write(ostream & o, int &indent,
00595 char *type = "") const = 0;
00596 virtual void print_debug(ostream & o, int debug) const = 0;
00597
00598
00599
00600
00601
00602
00603
00604
00605 virtual void write(ostream & o, int &indent, char *type = "") const;
00606
00607
00608 void write_access_table( ostream & o );
00609
00610
00611
00612 void print_fields(ostream & o) const;
00613
00614
00615
00616
00617 virtual void exchange_convert( VDL &vdl );
00618
00619
00620 CDGNode* cdgnode();
00621 void cdgnode(CDGNode* n);
00622
00623 friend ostream & operator << (ostream & o, const Statement & st);
00624 };
00625
00626
00627 inline RefSet<Statement> &
00628 Statement::modify_succ()
00629 {
00630 return _successors;
00631 }
00632
00633 inline RefSet<Statement> &
00634 Statement::modify_pred()
00635 {
00636 return _predecessors;
00637 }
00638 inline CDGNode* Statement::cdgnode(){
00639 return _cdgnode;
00640 }
00641
00642 inline void Statement::cdgnode(CDGNode* n){
00643 _cdgnode=n;
00644 }
00645
00646 #ifdef PERFORMANCE_EVAL
00647 inline PerformanceEstimator *
00648 Statement::perf_estimator()
00649 {
00650 return _perf_estimator;
00651 }
00652
00653 inline void
00654 Statement::set_perf_estimator(PerformanceEstimator *pe)
00655 {
00656 _perf_estimator = pe;
00657 }
00658 #endif
00659
00660 inline Iterator<Expression>
00661 Statement::iterate_all_expressions()
00662 {
00663 return Iterator<Expression>(_exprlist);
00664 }
00665
00666 void print_target_labels(ostream& o, const RefSet<Statement>& stmts);
00667 void print_stmt_list(ostream& o, const RefSet<Statement>& stmts);
00668 void print_stmt_tags(ostream& o, const RefSet<Statement>& stmts);
00669
00670 void print_target_labels(ostream& o, const RefList<Statement>& stmts);
00671 void print_stmt_list(ostream& o, const RefList<Statement>& stmts);
00672 void print_stmt_tags(ostream& o, const RefList<Statement>& stmts);
00673
00674 void print_target_labels(ostream& o, const List<Statement>& stmts);
00675 void print_stmt_list(ostream& o, const List<Statement>& stmts);
00676 void print_stmt_tags(ostream& o, const List<Statement>& stmts);
00677
00678
00679
00680
00681
00682
00683
00684
00685
00686
00687
00688
00689
00690
00691
00692
00693
00694 #endif