Changeset 16c95e3
- Timestamp:
- Jun 27, 2017, 10:35:11 PM (8 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, resolv-new, with_gc
- Children:
- fa4805f
- Parents:
- fda8168 (diff), 6385d62 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Files:
-
- 8 added
- 26 edited
Legend:
- Unmodified
- Added
- Removed
-
.gitignore
rfda8168 r16c95e3 31 31 32 32 src/prelude/builtins.cf 33 src/prelude/builtins.c 33 src/prelude/gcc-builtins.cf 34 src/prelude/gcc-builtins.c 34 35 src/prelude/extras.cf 35 36 src/prelude/bootloader.c -
doc/proposals/tagged-struct.txt
rfda8168 r16c95e3 14 14 say which of the possible values is currently stored in the union. The idea 15 15 here is similar, however the possibilities are more open ended. 16 17 Alternate names include virtual structure and abstract structure. 16 18 17 19 … … 36 38 their parent's fields to their field list so they can be upcast. 37 39 40 The type field may be public, if it is then it can be accessed through a 41 simple field access "instance.type". The type field would then be able to be 42 used to access the type object, which contains the information for the type. 43 It may just be a pointer to the type object "*instance.type", although a 44 lookup function could also be used. 45 46 47 Usage: 48 49 The central feature for tagged structs is a checked cast between pointer types 50 to the structures. A cast is successful if the true type of the pointed object 51 is of the type being cast to or any of its children, otherwise the cast 52 returns null. 53 54 The type field should also allow for equality comparison of types. 55 56 Currently, with only these operations (and similar features) the type field 57 could be hidden and the operations given through helper functions. However 58 if the type object has more complex (or even open ended) information in it 59 than providing direct access becomes very valuable. 60 38 61 39 62 Implemenation: 40 63 41 Adding to the field list is a simple matter, should be doable during 42 translation. The type field is just a pointer to a type object. With proper 43 linking we can create a single unique instance of the type object for each 44 declared tagged struct. The instance's address is used as an id for the type. 45 It also holds data about the type, such as its parent's id/a pointer to the 46 parent type object. 64 Adding to the field list would have to be handled during translation. The 65 simple act of adding declarations should not be difficult, althought it might 66 take a bit of work to find the parent's declarations. 47 67 48 The type field could be hidden (as best as C can hide it) or it could be 49 visible to the user with easy access to allow the user to examine the type 50 object directly. 51 52 Direct access is more useful if the data on the type-objects can change, other 53 wise the build in function could handle all cases. Perhaps each root object 54 can specify a type object to use or the type objects are themselves tagged, 55 although there may not be a base case with the latter. 56 57 In the simplest case the type object is a pointer to the parent type object. 58 Additional data could be added, such as a name, or a function pointer to the 59 destructor. 68 Type objects are also simple in to generate, they should just be global 69 (program lifetime) structures. Getting there to be exactly one instance of 70 each allows the pointer to the structure to be used as the type id, and that 71 should be possible to do during linking. 60 72 61 73 … … 94 106 If unions are declared tagged instead of creating a new tagged type, all 95 107 possible values of the union must be of that tagged type or a child type. 108 109 110 Custom Type Objects (Extention): 111 112 Some method to define type objects used within a tree of types. One option is 113 to allow the tree's type object to be specified by the tree root. It would 114 then have to be filled in for each type in the tree, including the root. 115 116 The only required field is the parent field, a pointer to the type object's 117 type. (This is also the only required field on the tagged structure itself.) 118 119 A further extention could allow expanding type objects, so child types could 120 append fields to their parent's feild list. They might need their own type 121 objects at that point, or maybe static checks will be enough to see the 122 minimum field list. -
doc/working/exception/translate.c
rfda8168 r16c95e3 1 1 /* Translation rules for exception handling code, from Cforall to C. 2 2 * 3 * Note that these are not final. Names, syntax and the exact translation 4 * will be updated. The first section is the shared definitions, not generated 5 * by the local translations but used by the translated code. 3 * Reminder: This is not final. Besides names and things it is also going very 4 * much for correctness and simplisity over efficiency. 5 * 6 * The first section is the shared definitions, not generated by the local 7 * translations but used by the translated code. 6 8 * 7 9 * Most of these exist only after translation (in C code). The first (the … … 16 18 typedef int exception; 17 19 20 // Will have to be availibe to user. Consider new name. Requires tagged types. 21 forall(dtype parent | tagged(parent), dtype child | tagged(child)) 22 parent *dynamic_cast(child *); 23 18 24 void __throw_terminate(exception except) __attribute__((noreturn)); 19 25 void __rethrow_terminate() __attribute__((noreturn)); … … 116 122 } 117 123 int match1(exception except) { 118 OtherException inner_except; 119 if (dynamic_cast__SomeException(except)) { 120 return 1; 121 } 122 else if ( (inner_except = dynamic_cast__OtherException(except)) && 123 inner_except.priority > 3) { 124 return 2; 125 } 126 else return 0; 124 { 125 if (dynamic_cast__SomeException(except)) { 126 return 1; 127 } 128 } 129 { 130 OtherException err; 131 if ( (err = dynamic_cast__OtherException(except)) && 132 err.priority > 3) { 133 return 2; 134 } 135 } 136 return 0; 127 137 } 128 138 __try_terminate(try1, catch1, match1); … … 151 161 { 152 162 bool handle1(exception except) { 153 OtherException inner_except; 154 if (dynamic_cast__SomeException(except)) { 155 fiddleThing(); 156 return true; 157 } else if (dynamic_cast__OtherException(except) && 158 inner_except.priority > 3) { 159 twiddleWidget(); 160 return true; 161 } else { 162 return false; 163 } 163 { 164 if (dynamic_cast__SomeException(except)) { 165 fiddleThing(); 166 return true; 167 } 168 } 169 { 170 OtherException err; 171 if ( ( err = dynamic_cast__OtherException(except) ) && 172 err.priority > 3) { 173 twiddleWidget(); 174 return true; 175 } 176 } 177 return false; 164 178 } 165 179 struct __try_resume_node data = … … 230 244 } 231 245 bool handle1(exception except) { 232 if (dynamic_cast__SomeException(except)) { 233 fiddleThing(); 234 return true; 235 } else { 236 return false; 237 } 246 { 247 if (dynamic_cast__SomeException(except)) { 248 fiddleThing(); 249 return true; 250 } 251 } 252 return false; 238 253 } 239 254 struct __cleanup_hook generated_name … … 273 288 { 274 289 bool handle1() { 275 if (dynamic_cast__OtherException(except)) { 276 twiddleWidget(); 277 return true; 290 { 291 if (dynamic_cast__OtherException(except)) { 292 twiddleWidget(); 293 return true; 294 } 278 295 } 279 296 return false; … … 297 314 } 298 315 int match1(exception except) { 299 if (dynamic_cast__SomeException(except)) { 300 return 1; 316 { 317 if (dynamic_cast__SomeException(except)) { 318 return 1; 319 } 301 320 } 302 321 return 0; -
src/Common/PassVisitor.h
rfda8168 r16c95e3 25 25 // | WithStmtsToAdd - provides the ability to insert statements before or after the current statement by adding new statements into 26 26 // stmtsToAddBefore or stmtsToAddAfter respectively. 27 // | WithShortCircuiting - provides the ability to skip visiting child nodes; set skip_children to true ifpre{visit,mutate} to skip visiting children27 // | WithShortCircuiting - provides the ability to skip visiting child nodes; set visit_children to false in pre{visit,mutate} to skip visiting children 28 28 // | WithScopes - provides the ability to save/restore data like a LIFO stack; to save, call GuardValue with the variable to save, the variable 29 29 // will automatically be restored to its previous value after the corresponding postvisit/postmutate teminates. … … 37 37 PassVisitor(Args &&... args) 38 38 : pass( std::forward<Args>( args )... ) 39 {} 39 { 40 typedef PassVisitor<pass_type> this_t; 41 this_t * const * visitor = visitor_impl(pass, 0); 42 if(visitor) { 43 *const_cast<this_t **>( visitor ) = this; 44 } 45 } 40 46 41 47 virtual ~PassVisitor() = default; … … 214 220 215 221 private: 222 template<typename pass_t> friend void acceptAll( std::list< Declaration* > &decls, PassVisitor< pass_t >& visitor ); 223 template<typename pass_t> friend void mutateAll( std::list< Declaration* > &decls, PassVisitor< pass_t >& visitor ); 224 216 225 template<typename node_type> void call_previsit ( node_type * node ) { previsit_impl ( pass, node, 0 ); } 217 226 template<typename node_type> void call_postvisit( node_type * node ) { postvisit_impl( pass, node, 0 ); } … … 225 234 void set_env( TypeSubstitution * env ) { set_env_impl( pass, env, 0); } 226 235 227 void visitStatementList( std::list< Statement* > &statements ); 236 template< typename func_t > 237 void handleStatementList( std::list< Statement * > & statements, func_t func ); 238 void visitStatementList ( std::list< Statement* > &statements ); 228 239 void mutateStatementList( std::list< Statement* > &statements ); 229 240 230 Statement * visitStatement( Statement * stmt ); 241 template< typename func_t > 242 Statement * handleStatement( Statement * stmt, func_t func ); 243 Statement * visitStatement ( Statement * stmt ); 231 244 Statement * mutateStatement( Statement * stmt ); 232 245 233 void visitExpression( Expression * expr ); 246 template< typename func_t > 247 Expression * handleExpression( Expression * expr, func_t func ); 248 Expression * visitExpression ( Expression * expr ); 234 249 Expression * mutateExpression( Expression * expr ); 235 250 … … 238 253 std::list< Statement* > * get_beforeStmts() { return stmtsToAddBefore_impl( pass, 0); } 239 254 std::list< Statement* > * get_afterStmts () { return stmtsToAddAfter_impl ( pass, 0); } 240 bool visit_children() { bool* skip = skip_children_impl(pass, 0); return ! (skip && *skip); } 241 void reset_visit() { bool* skip = skip_children_impl(pass, 0); if(skip) *skip = false; } 255 std::list< Declaration* > * get_beforeDecls() { return declsToAddBefore_impl( pass, 0); } 256 std::list< Declaration* > * get_afterDecls () { return declsToAddAfter_impl ( pass, 0); } 257 258 void set_visit_children( bool& ref ) { bool_ref * ptr = visit_children_impl(pass, 0); if(ptr) ptr->set( ref ); } 242 259 243 260 guard_value_impl init_guard() { … … 278 295 std::list< Statement* > stmtsToAddAfter; 279 296 }; 280 281 297 class WithShortCircuiting { 282 298 protected: … … 285 301 286 302 public: 287 bool skip_children;303 bool_ref visit_children; 288 304 }; 289 305 … … 304 320 }; 305 321 322 template<typename pass_type> 323 class WithVisitorRef { 324 protected: 325 WithVisitorRef() = default; 326 ~WithVisitorRef() = default; 327 328 public: 329 PassVisitor<pass_type> * const visitor; 330 }; 306 331 307 332 #include "PassVisitor.impl.h" -
src/Common/PassVisitor.impl.h
rfda8168 r16c95e3 4 4 __attribute__((unused)) \ 5 5 const auto & guard = init_guard(); \ 6 bool visit_children = true; \ 7 set_visit_children( visit_children ); \ 6 8 call_previsit( node ); \ 7 if( visit_children () ) {\9 if( visit_children ) { \ 8 10 9 11 #define VISIT_END( node ) \ 10 12 } \ 11 reset_visit(); \12 13 call_postvisit( node ); \ 13 14 … … 15 16 __attribute__((unused)) \ 16 17 const auto & guard = init_guard(); \ 18 bool visit_children = true; \ 19 set_visit_children( visit_children ); \ 17 20 call_premutate( node ); \ 18 if( visit_children () ) {\21 if( visit_children ) { \ 19 22 20 23 #define MUTATE_END( type, node ) \ 21 24 } \ 22 reset_visit(); \23 25 return call_postmutate< type * >( node ); \ 24 26 … … 42 44 } 43 45 44 typedef std::list< Statement * > StmtList_t; 45 46 template< typename pass_type > 47 void PassVisitor< pass_type >::visitStatementList( std::list< Statement * > & statements ) { 46 typedef std::list< Statement * > StmtList_t; 47 typedef std::list< Declaration * > DeclList_t; 48 49 template<typename iterator_t> 50 static inline void splice( iterator_t it, DeclList_t * decls ) { 51 std::transform( 52 decls->begin(), 53 decls->end(), 54 it, 55 [](Declaration * decl) -> auto { 56 return new DeclStmt( noLabels, decl ); 57 } 58 ); 59 decls->clear(); 60 } 61 62 template< typename pass_type > 63 static inline void acceptAll( std::list< Declaration* > &decls, PassVisitor< pass_type >& visitor ) { 64 65 DeclList_t* beforeDecls = visitor.get_beforeDecls(); 66 DeclList_t* afterDecls = visitor.get_afterDecls(); 67 68 for ( std::list< Declaration* >::iterator i = decls.begin(); ; ++i ) { 69 // splice in new declarations after previous decl 70 if ( !empty( afterDecls ) ) { decls.splice( i, *afterDecls ); } 71 72 if ( i == decls.end() ) break; 73 74 // run mutator on declaration 75 maybeAccept( *i, visitor ); 76 77 // splice in new declarations before current decl 78 if ( !empty( beforeDecls ) ) { decls.splice( i, *beforeDecls ); } 79 } 80 } 81 82 template< typename pass_type > 83 static inline void mutateAll( std::list< Declaration* > &decls, PassVisitor< pass_type >& mutator ) { 84 85 DeclList_t* beforeDecls = mutator.get_beforeDecls(); 86 DeclList_t* afterDecls = mutator.get_afterDecls(); 87 88 for ( std::list< Declaration* >::iterator i = decls.begin(); ; ++i ) { 89 // splice in new declarations after previous decl 90 if ( !empty( afterDecls ) ) { decls.splice( i, *afterDecls ); } 91 92 if ( i == decls.end() ) break; 93 94 // run mutator on declaration 95 *i = maybeMutate( *i, mutator ); 96 97 // splice in new declarations before current decl 98 if ( !empty( beforeDecls ) ) { decls.splice( i, *beforeDecls ); } 99 } 100 } 101 102 template< typename pass_type > 103 template< typename func_t > 104 void PassVisitor< pass_type >::handleStatementList( std::list< Statement * > & statements, func_t func ) { 48 105 SemanticError errors; 49 106 50 107 StmtList_t* beforeStmts = get_beforeStmts(); 51 108 StmtList_t* afterStmts = get_afterStmts(); 109 DeclList_t* beforeDecls = get_beforeDecls(); 110 DeclList_t* afterDecls = get_afterDecls(); 52 111 53 112 for ( std::list< Statement* >::iterator i = statements.begin(); i != statements.end(); ++i ) { 113 114 if ( !empty( afterDecls ) ) { splice( std::inserter( statements, i ), afterDecls ); } 54 115 if ( !empty( afterStmts ) ) { statements.splice( i, *afterStmts ); } 116 55 117 try { 56 (*i)->accept( *this ); 118 func( *i ); 119 assert(( empty( beforeStmts ) && empty( afterStmts )) 120 || ( empty( beforeDecls ) && empty( afterDecls )) ); 121 57 122 } catch ( SemanticError &e ) { 58 123 errors.append( e ); 59 124 } 125 126 if ( !empty( beforeDecls ) ) { splice( std::inserter( statements, i ), beforeDecls ); } 60 127 if ( !empty( beforeStmts ) ) { statements.splice( i, *beforeStmts ); } 61 128 } 62 129 130 if ( !empty( afterDecls ) ) { splice( std::back_inserter( statements ), afterDecls); } 63 131 if ( !empty( afterStmts ) ) { statements.splice( statements.end(), *afterStmts ); } 64 132 if ( !errors.isEmpty() ) { throw errors; } … … 66 134 67 135 template< typename pass_type > 136 void PassVisitor< pass_type >::visitStatementList( std::list< Statement * > & statements ) { 137 handleStatementList( statements, [this]( Statement * stmt) { 138 stmt->accept( *this ); 139 }); 140 } 141 142 template< typename pass_type > 68 143 void PassVisitor< pass_type >::mutateStatementList( std::list< Statement * > & statements ) { 69 SemanticError errors; 144 handleStatementList( statements, [this]( Statement *& stmt) { 145 stmt = stmt->acceptMutator( *this ); 146 }); 147 } 148 149 150 template< typename pass_type > 151 template< typename func_t > 152 Statement * PassVisitor< pass_type >::handleStatement( Statement * stmt, func_t func ) { 153 // don't want statements from outer CompoundStmts to be added to this CompoundStmt 154 ValueGuardPtr< TypeSubstitution * > oldEnv ( get_env_ptr () ); 155 ValueGuardPtr< DeclList_t > oldBeforeDecls( get_beforeDecls() ); 156 ValueGuardPtr< DeclList_t > oldAfterDecls ( get_afterDecls () ); 157 ValueGuardPtr< StmtList_t > oldBeforeStmts( get_beforeStmts() ); 158 ValueGuardPtr< StmtList_t > oldAfterStmts ( get_afterStmts () ); 159 160 Statement *newStmt = func( stmt ); 70 161 71 162 StmtList_t* beforeStmts = get_beforeStmts(); 72 163 StmtList_t* afterStmts = get_afterStmts(); 73 74 for ( std::list< Statement* >::iterator i = statements.begin(); i != statements.end(); ++i ) { 75 if ( !empty( afterStmts ) ) { statements.splice( i, *afterStmts ); } 76 try { 77 *i = (*i)->acceptMutator( *this ); 78 } catch ( SemanticError &e ) { 79 errors.append( e ); 80 } 81 if ( !empty( beforeStmts ) ) { statements.splice( i, *beforeStmts ); } 82 } 83 84 if ( !empty( afterStmts ) ) { statements.splice( statements.end(), *afterStmts ); } 85 if ( !errors.isEmpty() ) { throw errors; } 86 } 87 88 template< typename pass_type > 89 Statement * PassVisitor< pass_type >::visitStatement( Statement * stmt ) { 90 // don't want statements from outer CompoundStmts to be added to this CompoundStmt 91 ValueGuardPtr< TypeSubstitution * > oldEnv ( get_env_ptr() ); 92 ValueGuardPtr< std::list< Statement* > > oldBeforeStmts( get_beforeStmts() ); 93 ValueGuardPtr< std::list< Statement* > > oldAfterStmts ( get_afterStmts () ); 94 95 maybeAccept( stmt, *this ); 96 97 StmtList_t* beforeStmts = get_beforeStmts(); 98 StmtList_t* afterStmts = get_afterStmts(); 99 100 if( empty(beforeStmts) && empty(afterStmts) ) { return stmt; } 164 DeclList_t* beforeDecls = get_beforeDecls(); 165 DeclList_t* afterDecls = get_afterDecls(); 166 167 if( empty(beforeStmts) && empty(afterStmts) && empty(beforeDecls) && empty(afterDecls) ) { return newStmt; } 168 assert(( empty( beforeStmts ) && empty( afterStmts )) 169 || ( empty( beforeDecls ) && empty( afterDecls )) ); 101 170 102 171 CompoundStmt *compound = new CompoundStmt( noLabels ); 172 if( !empty(beforeDecls) ) { splice( std::back_inserter( compound->get_kids() ), beforeDecls ); } 103 173 if( !empty(beforeStmts) ) { compound->get_kids().splice( compound->get_kids().end(), *beforeStmts ); } 104 compound->get_kids().push_back( stmt ); 174 compound->get_kids().push_back( newStmt ); 175 if( !empty(afterDecls) ) { splice( std::back_inserter( compound->get_kids() ), afterDecls ); } 105 176 if( !empty(afterStmts) ) { compound->get_kids().splice( compound->get_kids().end(), *afterStmts ); } 106 177 return compound; … … 108 179 109 180 template< typename pass_type > 181 Statement * PassVisitor< pass_type >::visitStatement( Statement * stmt ) { 182 return handleStatement( stmt, [this]( Statement * stmt ) { 183 maybeAccept( stmt, *this ); 184 return stmt; 185 }); 186 } 187 188 template< typename pass_type > 110 189 Statement * PassVisitor< pass_type >::mutateStatement( Statement * stmt ) { 111 // don't want statements from outer CompoundStmts to be added to this CompoundStmt 112 ValueGuardPtr< TypeSubstitution * > oldEnv ( get_env_ptr() ); 113 ValueGuardPtr< std::list< Statement* > > oldBeforeStmts( get_beforeStmts() ); 114 ValueGuardPtr< std::list< Statement* > > oldAfterStmts ( get_afterStmts () ); 115 116 Statement *newStmt = maybeMutate( stmt, *this ); 117 118 StmtList_t* beforeStmts = get_beforeStmts(); 119 StmtList_t* afterStmts = get_afterStmts(); 120 121 if( empty(beforeStmts) && empty(afterStmts) ) { return newStmt; } 122 123 CompoundStmt *compound = new CompoundStmt( noLabels ); 124 if( !empty(beforeStmts) ) { compound->get_kids().splice( compound->get_kids().end(), *beforeStmts ); } 125 compound->get_kids().push_back( newStmt ); 126 if( !empty(afterStmts) ) { compound->get_kids().splice( compound->get_kids().end(), *afterStmts ); } 127 return compound; 128 } 129 130 131 132 template< typename pass_type > 133 void PassVisitor< pass_type >::visitExpression( Expression * expr ) { 134 if( !expr ) return; 190 return handleStatement( stmt, [this]( Statement * stmt ) { 191 return maybeMutate( stmt, *this ); 192 }); 193 } 194 195 template< typename pass_type > 196 template< typename func_t > 197 Expression * PassVisitor< pass_type >::handleExpression( Expression * expr, func_t func ) { 198 if( !expr ) return nullptr; 135 199 136 200 auto env_ptr = get_env_ptr(); … … 138 202 *env_ptr = expr->get_env(); 139 203 } 140 // xxx - should env be cloned (or moved) onto the result of the mutate? 141 expr->accept( *this ); 204 205 // should env be cloned (or moved) onto the result of the mutate? 206 return func( expr ); 207 } 208 209 template< typename pass_type > 210 Expression * PassVisitor< pass_type >::visitExpression( Expression * expr ) { 211 return handleExpression(expr, [this]( Expression * expr ) { 212 expr->accept( *this ); 213 return expr; 214 }); 142 215 } 143 216 144 217 template< typename pass_type > 145 218 Expression * PassVisitor< pass_type >::mutateExpression( Expression * expr ) { 146 if( !expr ) return nullptr; 147 148 auto env_ptr = get_env_ptr(); 149 if ( env_ptr && expr->get_env() ) { 150 *env_ptr = expr->get_env(); 151 } 152 // xxx - should env be cloned (or moved) onto the result of the mutate? 153 return expr->acceptMutator( *this ); 154 } 155 219 return handleExpression(expr, [this]( Expression * expr ) { 220 return expr->acceptMutator( *this ); 221 }); 222 } 156 223 157 224 //------------------------------------------------------------------------------------------------------------------------------------------------------------------------ … … 231 298 void PassVisitor< pass_type >::visit( ExprStmt * node ) { 232 299 VISIT_START( node ); 233 call_beginScope();234 300 235 301 visitExpression( node->get_expr() ); 236 302 237 call_endScope();238 303 VISIT_END( node ); 239 304 } … … 248 313 } 249 314 315 //-------------------------------------------------------------------------- 316 // AsmStmt 250 317 template< typename pass_type > 251 318 void PassVisitor< pass_type >::visit( AsmStmt * node ) { 252 319 VISIT_BODY( node ); 320 } 321 322 template< typename pass_type > 323 Statement * PassVisitor< pass_type >::mutate( AsmStmt * node ) { 324 MUTATE_BODY( Statement, node ); 253 325 } 254 326 … … 300 372 301 373 //-------------------------------------------------------------------------- 302 // WhileStmt374 // ForStmt 303 375 template< typename pass_type > 304 376 void PassVisitor< pass_type >::visit( ForStmt * node ) { … … 348 420 349 421 //-------------------------------------------------------------------------- 350 // SwitchStmt422 // CaseStmt 351 423 template< typename pass_type > 352 424 void PassVisitor< pass_type >::visit( CaseStmt * node ) { … … 369 441 } 370 442 443 //-------------------------------------------------------------------------- 444 // BranchStmt 371 445 template< typename pass_type > 372 446 void PassVisitor< pass_type >::visit( BranchStmt * node ) { 373 447 VISIT_BODY( node ); 448 } 449 450 template< typename pass_type > 451 Statement * PassVisitor< pass_type >::mutate( BranchStmt * node ) { 452 MUTATE_BODY( Statement, node ); 374 453 } 375 454 … … 415 494 maybeAccept( node->get_block(), *this ); 416 495 acceptAll( node->get_catchers(), *this ); 496 maybeAccept( node->get_finally(), *this ); 417 497 418 498 VISIT_END( node ); … … 425 505 node->set_block( maybeMutate( node->get_block(), *this ) ); 426 506 mutateAll( node->get_catchers(), *this ); 507 node->set_finally( maybeMutate( node->get_finally(), *this ) ); 427 508 428 509 MUTATE_END( Statement, node ); … … 435 516 VISIT_START( node ); 436 517 518 maybeAccept( node->get_decl(), *this ); 519 node->set_cond( visitExpression( node->get_cond() ) ); 437 520 node->set_body( visitStatement( node->get_body() ) ); 438 maybeAccept( node->get_decl(), *this );439 521 440 522 VISIT_END( node ); … … 445 527 MUTATE_START( node ); 446 528 447 node->set_body( mutateStatement( node->get_body() ) ); 448 node->set_decl( maybeMutate( node->get_decl(), *this ) ); 529 node->set_decl( maybeMutate( node->get_decl(), *this ) ); 530 node->set_cond( mutateExpression( node->get_cond() ) ); 531 node->set_body( mutateStatement( node->get_body() ) ); 449 532 450 533 MUTATE_END( Statement, node ); … … 838 921 839 922 template< typename pass_type > 840 Statement * PassVisitor< pass_type >::mutate( AsmStmt * node ) {841 MUTATE_BODY( Statement, node );842 }843 844 template< typename pass_type >845 Statement * PassVisitor< pass_type >::mutate( BranchStmt * node ) {846 MUTATE_BODY( Statement, node );847 }848 849 template< typename pass_type >850 923 Statement * PassVisitor< pass_type >::mutate( FinallyStmt * node ) { 851 924 MUTATE_BODY( Statement, node ); -
src/Common/PassVisitor.proto.h
rfda8168 r16c95e3 1 1 #pragma once 2 3 template<typename pass_type> 4 class PassVisitor; 2 5 3 6 typedef std::function<void( void * )> cleanup_func_t; … … 31 34 32 35 typedef std::function< void( cleanup_func_t, void * ) > at_cleanup_t; 36 37 class bool_ref { 38 public: 39 bool_ref() = default; 40 ~bool_ref() = default; 41 42 operator bool() { return *m_ref; } 43 bool operator=( bool val ) { return *m_ref = val; } 44 45 private: 46 47 template<typename pass> 48 friend class PassVisitor; 49 50 void set( bool & val ) { m_ref = &val; }; 51 52 bool * m_ref; 53 }; 33 54 34 55 //------------------------------------------------------------------------------------------------------------------------------------------------------------------------- … … 112 133 FIELD_PTR( std::list< Statement* >, stmtsToAddBefore ) 113 134 FIELD_PTR( std::list< Statement* >, stmtsToAddAfter ) 114 FIELD_PTR( bool, skip_children ) 135 FIELD_PTR( std::list< Declaration* >, declsToAddBefore ) 136 FIELD_PTR( std::list< Declaration* >, declsToAddAfter ) 137 FIELD_PTR( bool_ref, visit_children ) 115 138 FIELD_PTR( at_cleanup_t, at_cleanup ) 139 FIELD_PTR( PassVisitor<pass_type> * const, visitor ) -
src/GenPoly/DeclMutator.cc
rfda8168 r16c95e3 9 9 // Author : Aaron B. Moss 10 10 // Created On : Fri Nov 27 14:44:00 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Thu Aug 4 11:16:43 201613 // Update Count : 311 // Last Modified By : Andrew Beach 12 // Last Modified On : Thu Jun 22 13:49:00 2017 13 // Update Count : 4 14 14 // 15 15 … … 178 178 Statement* DeclMutator::mutate(CatchStmt *catchStmt) { 179 179 catchStmt->set_decl( maybeMutate( catchStmt->get_decl(), *this ) ); 180 catchStmt->set_cond( maybeMutate( catchStmt->get_cond(), *this ) ); 180 181 catchStmt->set_body( mutateStatement( catchStmt->get_body() ) ); 181 182 return catchStmt; -
src/GenPoly/PolyMutator.cc
rfda8168 r16c95e3 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Thu Aug 4 11:26:22 201613 // Update Count : 1 611 // Last Modified By : Andrew Beach 12 // Last Modified On : Thu Jun 22 13:47:00 2017 13 // Update Count : 17 14 14 // 15 15 … … 123 123 124 124 Statement * PolyMutator::mutate(TryStmt *tryStmt) { 125 tryStmt->set_block( 125 tryStmt->set_block( maybeMutate( tryStmt->get_block(), *this ) ); 126 126 mutateAll( tryStmt->get_catchers(), *this ); 127 tryStmt->set_finally( maybeMutate( tryStmt->get_finally(), *this ) ); 127 128 return tryStmt; 128 129 } 129 130 130 131 Statement * PolyMutator::mutate(CatchStmt *cathStmt) { 131 cathStmt->set_body( mutateStatement( cathStmt->get_body() ) ); 132 cathStmt->set_decl( maybeMutate( cathStmt->get_decl(), *this ) ); 132 cathStmt->set_body( mutateStatement( cathStmt->get_body() ) ); 133 cathStmt->set_cond( maybeMutate( cathStmt->get_cond(), *this ) ); 134 cathStmt->set_decl( maybeMutate( cathStmt->get_decl(), *this ) ); 133 135 return cathStmt; 134 136 } -
src/GenPoly/Specialize.cc
rfda8168 r16c95e3 99 99 if ( FunctionType * fftype = getFunctionType( formalType ) ) { 100 100 if ( fftype->isTtype() ) return true; 101 // conversion of 0 (null) to function type does not require tuple specialization 102 if ( dynamic_cast< ZeroType * >( actualType ) ) return false; 101 103 FunctionType * aftype = getFunctionType( actualType ); 102 104 assertf( aftype, "formal type is a function type, but actual type is not." ); -
src/InitTweak/InitTweak.cc
rfda8168 r16c95e3 474 474 public: 475 475 ConstExprChecker() : isConstExpr( true ) {} 476 477 using Visitor::visit; 476 478 477 479 virtual void visit( __attribute((unused)) ApplicationExpr *applicationExpr ) { isConstExpr = false; } -
src/Parser/StatementNode.cc
rfda8168 r16c95e3 168 168 169 169 Statement *build_resume_at( ExpressionNode *ctl, ExpressionNode *target ) { 170 std::list< Expression * > exps; 171 buildMoveList( ctl, exps ); 172 assertf( exps.size() < 2, "This means we are leaking memory"); 173 return new ThrowStmt( noLabels, ThrowStmt::Resume, !exps.empty() ? exps.back() : nullptr ); 170 (void)ctl; 171 (void)target; 172 assertf( false, "resume at (non-local throw) is not yet supported," ); 174 173 } 175 174 -
src/SynTree/Constant.cc
rfda8168 r16c95e3 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Wed Jun 21 16:44:48201713 // Update Count : 2 711 // Last Modified By : Andrew Beach 12 // Last Modified On : Thr Jun 22 10:11:00 2017 13 // Update Count : 28 14 14 // 15 15 … … 29 29 30 30 Constant::~Constant() { delete type; } 31 32 Constant Constant::from_bool( bool b ) { 33 return Constant( new BasicType( Type::Qualifiers(), BasicType::Bool ), b ? "1" : "0" , (unsigned long long int)b ); 34 } 31 35 32 36 Constant Constant::from_int( int i ) { -
src/SynTree/Constant.h
rfda8168 r16c95e3 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Wed Jun 21 16:44:48201713 // Update Count : 1 411 // Last Modified By : Andrew Beach 12 // Last Modified On : Thr Jun 22 10:13:00 2017 13 // Update Count : 15 14 14 // 15 15 … … 33 33 void set_value( std::string newValue ) { rep = newValue; } 34 34 35 /// generates a boolean constant of the given bool 36 static Constant from_bool( bool b ); 35 37 /// generates an integer constant of the given int 36 38 static Constant from_int( int i ); -
src/SynTree/Mutator.cc
rfda8168 r16c95e3 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Thu Mar 8 16:36:00 201713 // Update Count : 2 312 // Last Modified On : Thu Jun 22 13:43:00 2017 13 // Update Count : 24 14 14 // 15 15 … … 162 162 tryStmt->set_block( maybeMutate( tryStmt->get_block(), *this ) ); 163 163 mutateAll( tryStmt->get_catchers(), *this ); 164 tryStmt->set_finally( maybeMutate( tryStmt->get_finally(), *this ) ); 164 165 return tryStmt; 165 166 } … … 167 168 Statement *Mutator::mutate( CatchStmt *catchStmt ) { 168 169 catchStmt->set_decl( maybeMutate( catchStmt->get_decl(), *this ) ); 170 catchStmt->set_cond( maybeMutate( catchStmt->get_cond(), *this ) ); 169 171 catchStmt->set_body( maybeMutate( catchStmt->get_body(), *this ) ); 170 172 return catchStmt; -
src/SynTree/Visitor.cc
rfda8168 r16c95e3 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Thu Jun 8 16:31:00 201713 // Update Count : 2 512 // Last Modified On : Thu Jun 22 13:41:00 2017 13 // Update Count : 26 14 14 // 15 15 … … 137 137 maybeAccept( tryStmt->get_block(), *this ); 138 138 acceptAll( tryStmt->get_catchers(), *this ); 139 maybeAccept( tryStmt->get_finally(), *this ); 139 140 } 140 141 141 142 void Visitor::visit( CatchStmt *catchStmt ) { 142 143 maybeAccept( catchStmt->get_decl(), *this ); 144 maybeAccept( catchStmt->get_cond(), *this ); 143 145 maybeAccept( catchStmt->get_body(), *this ); 144 146 } -
src/libcfa/Makefile.am
rfda8168 r16c95e3 72 72 libcfa_a_CFLAGS = -nodebug -O2 73 73 libcfa_d_a_SOURCES = ${libsrc} 74 libcfa_d_a_CFLAGS = -debug -O0 74 libcfa_d_a_CFLAGS = -debug -O0 #No need for __CFA_DEBUG__ since we pass -debug 75 75 76 76 stdhdr = ${shell echo stdhdr/*} -
src/libcfa/Makefile.in
rfda8168 r16c95e3 332 332 libcfa_a_CFLAGS = -nodebug -O2 333 333 libcfa_d_a_SOURCES = ${libsrc} 334 libcfa_d_a_CFLAGS = -debug -O0 334 libcfa_d_a_CFLAGS = -debug -O0 #No need for __CFA_DEBUG__ since we pass -debug 335 335 stdhdr = ${shell echo stdhdr/*} 336 336 cfa_includedir = $(CFA_INCDIR) -
src/main.cc
rfda8168 r16c95e3 186 186 if ( ! nopreludep ) { // include gcc builtins 187 187 // -l is for initial build ONLY and builtins.cf is not in the lib directory so access it here. 188 // Read to cfa builtins, if not generating the cfa library 188 189 FILE * builtins = fopen( libcfap | treep ? "../prelude/builtins.cf" : CFA_LIBDIR "/builtins.cf", "r" ); 189 190 assertf( builtins, "cannot open builtins.cf\n" ); 190 191 parse( builtins, LinkageSpec::Compiler ); 192 193 // Read to gcc builtins, if not generating the cfa library 194 FILE * gcc_builtins = fopen( libcfap | treep ? "../prelude/gcc-builtins.cf" : CFA_LIBDIR "/gcc-builtins.cf", "r" ); 195 assertf( gcc_builtins, "cannot open gcc-builtins.cf\n" ); 196 parse( gcc_builtins, LinkageSpec::Compiler ); 191 197 192 198 // read the extra prelude in, if not generating the cfa library -
src/prelude/Makefile.am
rfda8168 r16c95e3 20 20 # put into lib for now 21 21 cfalibdir = ${CFA_LIBDIR} 22 cfalib_DATA = builtins.cf extras.cf prelude.cf bootloader.c22 cfalib_DATA = gcc-builtins.cf builtins.cf extras.cf prelude.cf bootloader.c 23 23 noinst_DATA = ../libcfa/libcfa-prelude.c 24 24 … … 28 28 29 29 # create forward declarations for gcc builtins 30 builtins.cf :builtins.c prototypes.sed30 gcc-builtins.cf : gcc-builtins.c prototypes.sed 31 31 ${AM_V_GEN}@BACKEND_CC@ -E -P $< | sed -f prototypes.sed > $@ 32 32 33 builtins.c : builtins.def prototypes.awk33 gcc-builtins.c : builtins.def prototypes.awk 34 34 ${AM_V_GEN}@BACKEND_CC@ -E prototypes.c | awk -f prototypes.awk > $@ 35 35 … … 38 38 prototypes.awk : 39 39 40 ../libcfa/libcfa-prelude.c : prelude.cf extras.cf builtins.cf ${abs_top_srcdir}/src/driver/cfa-cpp 40 # create forward declarations for cfa builtins 41 builtins.cf : builtins.c 42 ${AM_V_GEN}@BACKEND_CC@ -E -P ${<} -o ${@} 43 44 ../libcfa/libcfa-prelude.c : prelude.cf extras.cf gcc-builtins.cf builtins.cf ${abs_top_srcdir}/src/driver/cfa-cpp 41 45 ${AM_V_GEN}${abs_top_srcdir}/src/driver/cfa-cpp -l prelude.cf $@ # use src/cfa-cpp as not in lib until after install 42 46 43 bootloader.c : bootloader.cf prelude.cf extras.cf builtins.cf ${abs_top_srcdir}/src/driver/cfa-cpp47 bootloader.c : bootloader.cf prelude.cf extras.cf gcc-builtins.cf builtins.cf ${abs_top_srcdir}/src/driver/cfa-cpp 44 48 ${AM_V_GEN}${abs_top_srcdir}/src/driver/cfa-cpp -tpmL bootloader.cf $@ # use src/cfa-cpp as not in lib until after install 45 49 46 MAINTAINERCLEANFILES = builtins.cbuiltins.cf extras.cf bootloader.c ${addprefix ${libdir}/,${cfalib_DATA}} ${addprefix ${libdir}/,${lib_LIBRARIES}}50 MAINTAINERCLEANFILES = gcc-builtins.c gcc-builtins.cf builtins.cf extras.cf bootloader.c ${addprefix ${libdir}/,${cfalib_DATA}} ${addprefix ${libdir}/,${lib_LIBRARIES}} -
src/prelude/Makefile.in
rfda8168 r16c95e3 211 211 # put into lib for now 212 212 cfalibdir = ${CFA_LIBDIR} 213 cfalib_DATA = builtins.cf extras.cf prelude.cf bootloader.c213 cfalib_DATA = gcc-builtins.cf builtins.cf extras.cf prelude.cf bootloader.c 214 214 noinst_DATA = ../libcfa/libcfa-prelude.c 215 MAINTAINERCLEANFILES = builtins.cbuiltins.cf extras.cf bootloader.c ${addprefix ${libdir}/,${cfalib_DATA}} ${addprefix ${libdir}/,${lib_LIBRARIES}}215 MAINTAINERCLEANFILES = gcc-builtins.c gcc-builtins.cf builtins.cf extras.cf bootloader.c ${addprefix ${libdir}/,${cfalib_DATA}} ${addprefix ${libdir}/,${lib_LIBRARIES}} 216 216 all: all-am 217 217 … … 425 425 426 426 # create forward declarations for gcc builtins 427 builtins.cf :builtins.c prototypes.sed427 gcc-builtins.cf : gcc-builtins.c prototypes.sed 428 428 ${AM_V_GEN}@BACKEND_CC@ -E -P $< | sed -f prototypes.sed > $@ 429 429 430 builtins.c : builtins.def prototypes.awk430 gcc-builtins.c : builtins.def prototypes.awk 431 431 ${AM_V_GEN}@BACKEND_CC@ -E prototypes.c | awk -f prototypes.awk > $@ 432 432 … … 435 435 prototypes.awk : 436 436 437 ../libcfa/libcfa-prelude.c : prelude.cf extras.cf builtins.cf ${abs_top_srcdir}/src/driver/cfa-cpp 437 # create forward declarations for cfa builtins 438 builtins.cf : builtins.c 439 ${AM_V_GEN}@BACKEND_CC@ -E -P ${<} -o ${@} 440 441 ../libcfa/libcfa-prelude.c : prelude.cf extras.cf gcc-builtins.cf builtins.cf ${abs_top_srcdir}/src/driver/cfa-cpp 438 442 ${AM_V_GEN}${abs_top_srcdir}/src/driver/cfa-cpp -l prelude.cf $@ # use src/cfa-cpp as not in lib until after install 439 443 440 bootloader.c : bootloader.cf prelude.cf extras.cf builtins.cf ${abs_top_srcdir}/src/driver/cfa-cpp444 bootloader.c : bootloader.cf prelude.cf extras.cf gcc-builtins.cf builtins.cf ${abs_top_srcdir}/src/driver/cfa-cpp 441 445 ${AM_V_GEN}${abs_top_srcdir}/src/driver/cfa-cpp -tpmL bootloader.cf $@ # use src/cfa-cpp as not in lib until after install 442 446 -
src/tests/preempt_longrun/Makefile.am
rfda8168 r16c95e3 26 26 CC = @CFA_BINDIR@/@CFA_NAME@ 27 27 28 TESTS = create stackyield28 TESTS = barge block create disjoint processor stack wait yield 29 29 30 30 .INTERMEDIATE: ${TESTS} -
src/tests/preempt_longrun/Makefile.in
rfda8168 r16c95e3 183 183 REPEAT = ${abs_top_srcdir}/tools/repeat -s 184 184 BUILD_FLAGS = -g -Wall -Wno-unused-function -quiet @CFA_FLAGS@ -debug -O2 -DN=${N} -DPREEMPTION_RATE=${preempt} 185 TESTS = create stackyield185 TESTS = barge block create disjoint processor stack wait yield 186 186 all: all-am 187 187 -
src/tests/sched-int-block.c
rfda8168 r16c95e3 5 5 #include <thread> 6 6 7 static const unsigned N = 100_000; 7 #ifndef N 8 #define N 100_000 9 #endif 8 10 9 11 enum state_t { WAITED, SIGNAL, BARGE }; -
src/tests/sched-int-disjoint.c
rfda8168 r16c95e3 4 4 #include <thread> 5 5 6 #ifndef N 6 7 #define N 100_000 8 #endif 7 9 8 10 enum state_t { WAIT, SIGNAL, BARGE }; -
src/tests/sched-int-wait.c
rfda8168 r16c95e3 5 5 #include <thread> 6 6 7 static const int N = 10_000; 7 #ifndef N 8 #define N 10_000 9 #endif 8 10 9 11 monitor global_t {}; -
tools/repeat
rfda8168 r16c95e3 20 20 for (( i = 0; i < ITERATION; i ++ )); do 21 21 echo -ne "\r$i / $ITERATION" 22 $@ &22 $@ > /dev/null & 23 23 child=$! 24 24 wait "$child"
Note: See TracChangeset
for help on using the changeset viewer.