Changeset 720a007 for src/ControlStruct/MLEMutator.h
- Timestamp:
- Mar 14, 2018, 2:06:29 PM (7 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, with_gc
- Children:
- 753f13c9
- Parents:
- 6a276a0
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ControlStruct/MLEMutator.h
r6a276a0 r720a007 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sat Jul 22 09:19:59 201713 // Update Count : 3512 // Last Modified On : Thu Mar 8 16:42:32 2018 13 // Update Count : 41 14 14 // 15 15 … … 19 19 #include <map> // for map 20 20 #include <string> // for string 21 #include <set> // for unordered_set 21 22 22 23 #include "Common/PassVisitor.h" … … 29 30 class LabelGenerator; 30 31 31 class MLEMutator : public WithVisitorRef<MLEMutator>, public WithShortCircuiting { 32 class MLEMutator : public WithVisitorRef<MLEMutator>, public WithShortCircuiting, public WithGuards { 33 public: 32 34 class Entry; 33 34 public:35 35 MLEMutator( std::map<Label, Statement *> *t, LabelGenerator *gen = 0 ) : targetTable( t ), breakLabel(std::string("")), generator( gen ) {} 36 36 ~MLEMutator(); … … 52 52 Label &get_breakLabel() { return breakLabel; } 53 53 void set_breakLabel( Label newValue ) { breakLabel = newValue; } 54 private: 54 55 55 class Entry { 56 56 public: 57 explicit Entry( Statement *_loop, Label _breakExit, Label _contExit = Label("") ) : 58 loop( _loop ), breakExit( _breakExit ), contExit( _contExit ), breakUsed(false), contUsed(false) {} 57 // specialized constructors for each combination of statement with labelled break/continue/fallthrough that is valid to cleanup the use cases 58 explicit Entry( ForStmt *stmt, Label breakExit, Label contExit ) : 59 stmt( stmt ), breakExit( breakExit ), contExit( contExit ) {} 59 60 60 bool operator==( const Statement *stmt ) { return loop == stmt; }61 bool operator!=( const Statement *stmt ) { return loop != stmt;}61 explicit Entry( WhileStmt *stmt, Label breakExit, Label contExit ) : 62 stmt( stmt ), breakExit( breakExit ), contExit( contExit ) {} 62 63 63 bool operator==( const Entry &other ) { return loop == other.get_controlStructure(); } 64 explicit Entry( CompoundStmt *stmt, Label breakExit ) : 65 stmt( stmt ), breakExit( breakExit ) {} 64 66 65 Statement *get_controlStructure() const { return loop; } 67 explicit Entry( IfStmt *stmt, Label breakExit ) : 68 stmt( stmt ), breakExit( breakExit ) {} 69 70 explicit Entry( CaseStmt *stmt, Label fallExit ) : 71 stmt( stmt ), fallExit( fallExit ) {} 72 73 explicit Entry( SwitchStmt *stmt, Label breakExit, Label fallDefaultExit ) : 74 stmt( stmt ), breakExit( breakExit ), fallDefaultExit( fallDefaultExit ) {} 75 76 bool operator==( const Statement *other ) { return stmt == other; } 77 bool operator!=( const Statement *other ) { return stmt != other; } 78 79 bool operator==( const Entry &other ) { return stmt == other.get_controlStructure(); } 80 81 Statement *get_controlStructure() const { return stmt; } 66 82 67 83 Label useContExit() { contUsed = true; return contExit; } 68 84 Label useBreakExit() { breakUsed = true; return breakExit; } 85 Label useFallExit() { fallUsed = true; return fallExit; } 86 Label useFallDefaultExit() { fallDefaultUsed = true; return fallDefaultExit; } 69 87 70 88 bool isContUsed() const { return contUsed; } 71 89 bool isBreakUsed() const { return breakUsed; } 90 bool isFallUsed() const { return fallUsed; } 91 bool isFallDefaultUsed() const { return fallDefaultUsed; } 92 void seenDefault() { fallDefaultValid = false; } 93 bool isFallDefaultValid() const { return fallDefaultValid; } 72 94 private: 73 Statement *loop; 74 Label breakExit, contExit; 75 bool breakUsed, contUsed; 95 Statement *stmt; 96 Label breakExit, contExit, fallExit, fallDefaultExit; 97 bool breakUsed = false, contUsed = false, fallUsed = false, fallDefaultUsed = false; 98 bool fallDefaultValid = true; 76 99 }; 77 100 101 private: 78 102 std::map< Label, Statement * > *targetTable; 103 std::set< Label > fallthroughLabels; 79 104 std::list< Entry > enclosingControlStructures; 80 105 Label breakLabel; … … 87 112 Statement * posthandleLoopStmt( LoopClass * loopStmt ); 88 113 89 void fixBlock( std::list< Statement * > &kids );114 void fixBlock( std::list< Statement * > &kids, bool caseClause = false ); 90 115 }; 91 116 } // namespace ControlStruct
Note: See TracChangeset
for help on using the changeset viewer.