Changes in / [ac1ed49:c14cff1]
- Location:
- src
- Files:
-
- 2 added
- 33 edited
Legend:
- Unmodified
- Added
- Removed
-
src/CodeGen/CodeGenerator.cc
rac1ed49 rc14cff1 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // CodeGenerator.cc -- 7 // CodeGenerator.cc -- 8 8 // 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 : Mon Jan 25 21:22:00 201613 // Update Count : 2 4211 // Last Modified By : Rob Schluntz 12 // Last Modified On : Tue Feb 09 13:24:40 2016 13 // Update Count : 255 14 14 // 15 15 … … 98 98 handleStorageClass( objectDecl ); 99 99 output << genType( objectDecl->get_type(), mangleName( objectDecl ) ); 100 100 101 101 if ( objectDecl->get_init() ) { 102 102 output << " = "; … … 112 112 if ( aggDecl->get_name() != "" ) 113 113 output << aggDecl->get_name(); 114 114 115 115 std::list< Declaration * > &memb = aggDecl->get_members(); 116 116 … … 118 118 output << " {" << endl; 119 119 120 cur_indent += CodeGenerator::tabsize; 120 cur_indent += CodeGenerator::tabsize; 121 121 for ( std::list< Declaration* >::iterator i = memb.begin(); i != memb.end(); i++) { 122 output << indent; 122 output << indent; 123 123 (*i)->accept( *this ); 124 124 output << ";" << endl; 125 125 } 126 126 127 cur_indent -= CodeGenerator::tabsize; 127 cur_indent -= CodeGenerator::tabsize; 128 128 129 129 output << indent << "}"; … … 140 140 handleAggregate( aggregateDecl ); 141 141 } 142 142 143 143 void CodeGenerator::visit( EnumDecl *aggDecl ) { 144 144 output << "enum "; … … 146 146 if ( aggDecl->get_name() != "" ) 147 147 output << aggDecl->get_name(); 148 148 149 149 std::list< Declaration* > &memb = aggDecl->get_members(); 150 150 … … 152 152 output << " {" << endl; 153 153 154 cur_indent += CodeGenerator::tabsize; 154 cur_indent += CodeGenerator::tabsize; 155 155 for ( std::list< Declaration* >::iterator i = memb.begin(); i != memb.end(); i++) { 156 156 ObjectDecl *obj = dynamic_cast< ObjectDecl* >( *i ); 157 157 assert( obj ); 158 output << indent << mangleName( obj ); 158 output << indent << mangleName( obj ); 159 159 if ( obj->get_init() ) { 160 160 output << " = "; … … 164 164 } // for 165 165 166 cur_indent -= CodeGenerator::tabsize; 166 cur_indent -= CodeGenerator::tabsize; 167 167 168 168 output << indent << "}"; 169 169 } // if 170 170 } 171 171 172 172 void CodeGenerator::visit( ContextDecl *aggregateDecl ) {} 173 173 174 174 void CodeGenerator::visit( TypedefDecl *typeDecl ) { 175 175 output << "typedef "; 176 176 output << genType( typeDecl->get_base(), typeDecl->get_name() ); 177 177 } 178 178 179 179 void CodeGenerator::visit( TypeDecl *typeDecl ) { 180 180 // really, we should mutate this into something that isn't a TypeDecl but that requires large-scale changes, … … 216 216 } 217 217 218 void CodeGenerator::visit( Constant *constant ) { 218 void CodeGenerator::visit( Constant *constant ) { 219 219 output << constant->get_value() ; 220 220 } … … 233 233 assert( arg != applicationExpr->get_args().end() ); 234 234 if ( AddressExpr *addrExpr = dynamic_cast< AddressExpr * >( *arg ) ) { 235 235 236 236 *arg = addrExpr->get_arg(); 237 237 } else { … … 242 242 break; 243 243 } 244 244 245 245 default: 246 246 // do nothing 247 247 ; 248 248 } 249 249 250 250 switch ( opInfo.type ) { 251 251 case OT_INDEX: … … 256 256 output << "]"; 257 257 break; 258 258 259 259 case OT_CALL: 260 // there are no intrinsic definitions of the function call operator 260 // there are no intrinsic definitions of the function call operator or constructors or destructors 261 261 assert( false ); 262 262 break; 263 263 264 case OT_CTOR: 265 // it's just an optimization to disallow this, so for now let it through 266 // since it makes autogenerating constructors a lot easier 267 varExpr->accept( *this ); 268 output << "("; 269 genCommaList( applicationExpr->get_args().begin(), applicationExpr->get_args().end() ); 270 output << ")"; 271 272 // intrinsic constructors should never be called directly - they should be transformed back into Initializer nodes 273 // assert(false); 274 break; 275 276 case OT_DTOR: 277 // intrinsic destructors do nothing - don't generate any code 278 output << " // " << dynamic_cast<VariableExpr*>(applicationExpr->get_function())->get_var()->get_name() << endl; 279 break; 280 264 281 case OT_PREFIX: 265 282 case OT_PREFIXASSIGN: … … 270 287 output << ")"; 271 288 break; 272 289 273 290 case OT_POSTFIX: 274 291 case OT_POSTFIXASSIGN: … … 277 294 output << opInfo.symbol; 278 295 break; 296 279 297 280 298 case OT_INFIX: … … 287 305 output << ")"; 288 306 break; 289 307 290 308 case OT_CONSTANT: 291 309 case OT_LABELADDRESS: … … 306 324 } // if 307 325 } 308 326 309 327 void CodeGenerator::visit( UntypedExpr *untypedExpr ) { 310 328 if ( NameExpr *nameExpr = dynamic_cast< NameExpr* >( untypedExpr->get_function() ) ) { … … 320 338 output << "]"; 321 339 break; 322 340 323 341 case OT_CALL: 324 342 assert( false ); 325 break; 326 343 344 case OT_CTOR: 345 case OT_DTOR: 346 // intrinsic constructors should never be called 347 // intrinsic destructors do nothing 348 break; 349 327 350 case OT_PREFIX: 328 351 case OT_PREFIXASSIGN: … … 334 357 output << ")"; 335 358 break; 336 359 337 360 case OT_POSTFIX: 338 361 case OT_POSTFIXASSIGN: … … 341 364 output << opInfo.symbol; 342 365 break; 343 366 344 367 case OT_INFIX: 345 368 case OT_INFIXASSIGN: … … 351 374 output << ")"; 352 375 break; 353 376 354 377 case OT_CONSTANT: 355 378 // there are no intrinsic definitions of 0 or 1 as functions … … 369 392 } // if 370 393 } 371 394 372 395 void CodeGenerator::visit( NameExpr *nameExpr ) { 373 396 OperatorInfo opInfo; … … 379 402 } // if 380 403 } 381 404 382 405 void CodeGenerator::visit( AddressExpr *addressExpr ) { 383 406 output << "(&"; … … 408 431 output << ")"; 409 432 } 410 433 411 434 void CodeGenerator::visit( UntypedMemberExpr *memberExpr ) { 412 435 assert( false ); 413 436 } 414 437 415 438 void CodeGenerator::visit( MemberExpr *memberExpr ) { 416 439 memberExpr->get_aggregate()->accept( *this ); 417 440 output << "." << mangleName( memberExpr->get_member() ); 418 441 } 419 442 420 443 void CodeGenerator::visit( VariableExpr *variableExpr ) { 421 444 OperatorInfo opInfo; … … 426 449 } // if 427 450 } 428 451 429 452 void CodeGenerator::visit( ConstantExpr *constantExpr ) { 430 453 assert( constantExpr->get_constant() ); 431 454 constantExpr->get_constant()->accept( *this ); 432 455 } 433 456 434 457 void CodeGenerator::visit( SizeofExpr *sizeofExpr ) { 435 458 output << "sizeof("; … … 464 487 output << ")"; 465 488 } 466 489 467 490 void CodeGenerator::visit( LogicalExpr *logicalExpr ) { 468 491 output << "("; … … 476 499 output << ")"; 477 500 } 478 501 479 502 void CodeGenerator::visit( ConditionalExpr *conditionalExpr ) { 480 503 output << "("; … … 486 509 output << ")"; 487 510 } 488 511 489 512 void CodeGenerator::visit( CommaExpr *commaExpr ) { 490 513 output << "("; … … 494 517 output << ")"; 495 518 } 496 519 497 520 void CodeGenerator::visit( TupleExpr *tupleExpr ) {} 498 521 499 522 void CodeGenerator::visit( TypeExpr *typeExpr ) {} 500 523 … … 527 550 } 528 551 } 529 cur_indent -= CodeGenerator::tabsize; 552 cur_indent -= CodeGenerator::tabsize; 530 553 531 554 output << indent << "}"; … … 533 556 534 557 void CodeGenerator::visit( ExprStmt *exprStmt ) { 535 // I don't see why this check is necessary. 536 // If this starts to cause problems then put it back in, 558 // I don't see why this check is necessary. 559 // If this starts to cause problems then put it back in, 537 560 // with an explanation 538 561 assert( exprStmt ); … … 584 607 switchStmt->get_condition()->accept( *this ); 585 608 output << " ) "; 586 609 587 610 output << "{" << std::endl; 588 611 cur_indent += CodeGenerator::tabsize; … … 604 627 } // if 605 628 output << ":\n"; 606 629 607 630 std::list<Statement *> sts = caseStmt->get_statements(); 608 631 … … 621 644 if ( ! branchStmt->get_target().empty() ) 622 645 output << "goto " << branchStmt->get_target(); 623 else { 646 else { 624 647 if ( branchStmt->get_computedTarget() != 0 ) { 625 648 output << "goto *"; … … 672 695 673 696 void CodeGenerator::visit( ForStmt *forStmt ) { 674 // initialization is always hoisted, so don't 675 // bother doing anything with that 697 // initialization is always hoisted, so don't 698 // bother doing anything with that 676 699 output << "for (;"; 677 700 … … 697 720 void CodeGenerator::visit( DeclStmt *declStmt ) { 698 721 declStmt->get_decl()->accept( *this ); 699 722 700 723 if ( doSemicolon( declStmt->get_decl() ) ) { 701 724 output << ";"; -
src/CodeGen/OperatorTable.cc
rac1ed49 rc14cff1 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 : Tue Jun 23 17:41:14 201513 // Update Count : 511 // Last Modified By : Rob Schluntz 12 // Last Modified On : Tue Oct 06 15:26:34 2015 13 // Update Count : 9 14 14 // 15 15 … … 21 21 const OperatorInfo tableValues[] = { 22 22 { "?[?]", "", "_operator_index", OT_INDEX }, 23 { "?{}", "", "_constructor", OT_CTOR }, 24 { "^?{}", "", "_destructor", OT_DTOR }, // ~?{}, -?{}, !?{}, $?{}, ??{}, ^?{}, ?destroy, ?delete 23 25 { "?()", "", "_operator_call", OT_CALL }, 24 26 { "?++", "++", "_operator_postincr", OT_POSTFIXASSIGN }, -
src/CodeGen/OperatorTable.h
rac1ed49 rc14cff1 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 : Tue Jun 23 16:09:27 201513 // Update Count : 311 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Jun 24 16:17:57 2015 13 // Update Count : 5 14 14 // 15 15 … … 22 22 enum OperatorType { 23 23 OT_INDEX, 24 OT_CTOR, 25 OT_DTOR, 24 26 OT_CALL, 25 27 OT_PREFIX, -
src/GenPoly/Box.cc
rac1ed49 rc14cff1 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 : Fri Feb 5 16:45:07201613 // Update Count : 2 8611 // Last Modified By : Rob Schluntz 12 // Last Modified On : Tue Feb 09 14:39:52 2016 13 // Update Count : 295 14 14 // 15 15 … … 401 401 402 402 Expression *Pass1::makeOffsetArray( StructInstType *ty ) { 403 std::list<Expression*> noDesignators; 403 404 std::list< Declaration* > &baseMembers = ty->get_baseStruct()->get_members(); 404 405 … … 419 420 memberDecl = new ObjectDecl( (*member)->get_name(), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, offsetType->clone(), 0 ); 420 421 } 421 inits.push_back( new SingleInit( new OffsetofExpr( ty->clone(), memberDecl ) ) );422 } 423 arrayTemp->set_init( new ListInit( inits ) );422 inits.push_back( new SingleInit( new OffsetofExpr( ty->clone(), memberDecl ), noDesignators ) ); 423 } 424 arrayTemp->set_init( new ListInit( inits, noDesignators ) ); 424 425 425 426 // return variable pointing to temporary … … 1371 1372 1372 1373 std::list<Expression*> designators; 1373 objectDecl->set_init( new SingleInit( alloc, designators ) );1374 objectDecl->set_init( new SingleInit( alloc, designators, false ) ); // not constructed 1374 1375 } 1375 1376 } … … 1412 1413 return derefdVar; 1413 1414 } 1414 1415 1415 1416 Expression *MemberExprFixer::mutate( MemberExpr *memberExpr ) { 1416 1417 // mutate, exiting early if no longer MemberExpr -
src/GenPoly/Specialize.cc
rac1ed49 rc14cff1 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Jan 20 1 2:40:33201613 // Update Count : 1812 // Last Modified On : Wed Jan 20 13:00:00 2016 13 // Update Count : 24 14 14 // 15 15 … … 142 142 143 143 Expression * Specialize::doSpecialization( Type *formalType, Expression *actual, InferredParams *inferParams ) { 144 assert( ! actual->get_results().empty() ); 144 assert( ! actual->get_results().empty() ); // using front, should have this assert 145 145 if ( needsSpecialization( formalType, actual->get_results().front(), env ) ) { 146 146 FunctionType *funType; -
src/InitTweak/InitModel.cc
rac1ed49 rc14cff1 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // InitModel.cc -- 7 // InitModel.cc -- 8 8 // 9 9 // Author : Rodolfo G. Esteves 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : T ue May 19 16:37:08 201513 // Update Count : 111 // Last Modified By : Rob Schluntz 12 // Last Modified On : Thu Jan 07 13:38:46 2016 13 // Update Count : 5 14 14 // 15 15 … … 198 198 assert(init == 0 && single != 0); 199 199 std::list< Expression * > empty; 200 init = new SingleInit( single->get_expr(), empty );200 init = new SingleInit( single->get_expr(), empty, false ); // cannot be constructed 201 201 return; 202 202 } … … 214 214 } // if 215 215 216 init = new ListInit( contents ); 216 std::list< Expression * > desig; 217 init = new ListInit( contents, desig, false ); // cannot be constructed 217 218 return; 218 219 } -
src/InitTweak/RemoveInit.cc
rac1ed49 rc14cff1 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // RemoveInit.cc -- 7 // RemoveInit.cc -- 8 8 // 9 9 // Author : Rob Schluntz 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Dec 15 15:37:26 2015 13 // Update Count : 15 14 // 15 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Tue Feb 09 15:12:29 2016 13 // Update Count : 166 14 // 15 16 #include <stack> 17 #include <list> 16 18 #include "RemoveInit.h" 17 19 #include "SynTree/Declaration.h" … … 21 23 #include "SynTree/Initializer.h" 22 24 #include "SynTree/Mutator.h" 25 #include "GenPoly/PolyMutator.h" 23 26 24 27 namespace InitTweak { … … 26 29 const std::list<Label> noLabels; 27 30 } 28 29 class RemoveInit : public Mutator {31 32 class RemoveInit : public GenPoly::PolyMutator { 30 33 public: 34 /// removes and replaces initialization for polymorphic value objects 35 /// with assignment (TODO: constructor) statements. 36 /// also consistently allocates a temporary variable for the return value 37 /// of a function so that anything which the resolver decides can be assigned 38 /// into the return type of a function can be returned. 39 static void removeInitializers( std::list< Declaration * > &translationUnit ); 40 31 41 RemoveInit(); 32 virtual ObjectDecl * mutate( ObjectDecl *objDecl);42 virtual ObjectDecl * mutate( ObjectDecl *objDecl ); 33 43 virtual DeclarationWithType * mutate( FunctionDecl *functionDecl ); 34 44 35 45 virtual Statement * mutate( ReturnStmt * returnStmt ); 36 37 virtual CompoundStmt * mutate(CompoundStmt * compoundStmt); 38 46 39 47 protected: 40 std::list< Statement* > stmtsToAddBefore;41 std::list< Statement* > stmtsToAddAfter;42 void mutateStatementList( std::list< Statement* > &statements );43 44 48 std::list<DeclarationWithType*> returnVals; 45 49 UniqueName tempNamer; … … 47 51 }; 48 52 49 void tweak( std::list< Declaration * > translationUnit ) { 53 class CtorDtor : public GenPoly::PolyMutator { 54 public: 55 /// create constructor and destructor statements for object declarations. 56 /// Destructors are inserted directly into the code, whereas constructors 57 /// will be added in after the resolver has run so that the initializer expression 58 /// is only removed if a constructor is found 59 static void generateCtorDtor( std::list< Declaration * > &translationUnit ); 60 61 CtorDtor() : inFunction( false ) {} 62 63 virtual ObjectDecl * mutate( ObjectDecl * ); 64 virtual DeclarationWithType * mutate( FunctionDecl *functionDecl ); 65 virtual Declaration* mutate( StructDecl *aggregateDecl ); 66 virtual Declaration* mutate( UnionDecl *aggregateDecl ); 67 virtual Declaration* mutate( EnumDecl *aggregateDecl ); 68 virtual Declaration* mutate( ContextDecl *aggregateDecl ); 69 virtual TypeDecl* mutate( TypeDecl *typeDecl ); 70 virtual Declaration* mutate( TypedefDecl *typeDecl ); 71 72 virtual CompoundStmt * mutate( CompoundStmt * compoundStmt ); 73 74 protected: 75 bool inFunction; 76 77 // to be added before block ends - use push_front so order is correct 78 std::list< Statement * > destructorStmts; 79 }; 80 81 void tweak( std::list< Declaration * > & translationUnit ) { 82 RemoveInit::removeInitializers( translationUnit ); 83 CtorDtor::generateCtorDtor( translationUnit ); 84 } 85 86 void RemoveInit::removeInitializers( std::list< Declaration * > & translationUnit ) { 50 87 RemoveInit remover; 51 88 mutateAll( translationUnit, remover ); … … 53 90 54 91 RemoveInit::RemoveInit() : tempNamer( "_retVal" ) {} 55 56 void RemoveInit::mutateStatementList( std::list< Statement* > &statements ) {57 for ( std::list< Statement* >::iterator i = statements.begin(); i != statements.end(); ++i ) {58 if ( ! stmtsToAddAfter.empty() ) {59 statements.splice( i, stmtsToAddAfter );60 } // if61 *i = (*i)->acceptMutator( *this );62 if ( ! stmtsToAddBefore.empty() ) {63 statements.splice( i, stmtsToAddBefore );64 } // if65 } // for66 if ( ! stmtsToAddAfter.empty() ) {67 statements.splice( statements.end(), stmtsToAddAfter );68 } // if69 }70 71 CompoundStmt *RemoveInit::mutate(CompoundStmt *compoundStmt) {72 mutateStatementList( compoundStmt->get_kids() );73 return compoundStmt;74 }75 92 76 93 // in the case where an object has an initializer and a polymorphic type, insert an assignment immediately after the … … 79 96 if (objDecl->get_init() && dynamic_cast<TypeInstType*>(objDecl->get_type())) { 80 97 if (SingleInit * single = dynamic_cast<SingleInit*>(objDecl->get_init())) { 81 UntypedExpr *assign = new UntypedExpr( new NameExpr( "?=?" ) ); 98 // xxx this can be more complicated - consider ListInit 99 UntypedExpr *assign = new UntypedExpr( new NameExpr( "?{}" ) ); 82 100 assign->get_args().push_back( new AddressExpr (new NameExpr( objDecl->get_name() ) ) ); 83 101 assign->get_args().push_back( single->get_value()->clone() ); … … 93 111 // hands off if the function returns an lvalue - we don't want to allocate a temporary if a variable's address 94 112 // is being returned 113 // xxx - this should construct rather than assign 95 114 if ( returnStmt->get_expr() && returnVals.size() == 1 && funcName != "?=?" && ! returnVals.front()->get_type()->get_isLvalue() ) { 96 115 ObjectDecl *newObj = new ObjectDecl( tempNamer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::C, 0, returnVals.front()->get_type()->clone(), 0 ); 97 stmtsToAdd Before.push_back( new DeclStmt( noLabels, newObj ) );98 116 stmtsToAdd.push_back( new DeclStmt( noLabels, newObj ) ); 117 99 118 UntypedExpr *assign = new UntypedExpr( new NameExpr( "?=?" ) ); 100 119 assign->get_args().push_back( new AddressExpr (new NameExpr( newObj->get_name() ) ) ); 101 120 assign->get_args().push_back( returnStmt->get_expr() ); 102 stmtsToAdd Before.push_back(new ExprStmt(noLabels, assign));121 stmtsToAdd.push_back(new ExprStmt(noLabels, assign)); 103 122 104 123 returnStmt->set_expr( new VariableExpr( newObj ) ); … … 110 129 std::list<DeclarationWithType*> oldReturnVals = returnVals; 111 130 std::string oldFuncName = funcName; 112 131 113 132 FunctionType * type = functionDecl->get_functionType(); 114 133 returnVals = type->get_returnVals(); … … 119 138 return decl; 120 139 } 140 141 142 void CtorDtor::generateCtorDtor( std::list< Declaration * > & translationUnit ) { 143 CtorDtor ctordtor; 144 mutateAll( translationUnit, ctordtor ); 145 } 146 147 namespace { 148 bool tryConstruct( ObjectDecl * objDecl ) { 149 // xxx - handle designations 150 return ! LinkageSpec::isBuiltin( objDecl->get_linkage() ) && 151 (objDecl->get_init() == NULL || 152 ( objDecl->get_init() != NULL && objDecl->get_init()->get_maybeConstructed() )); 153 } 154 155 Expression * makeCtorDtorExpr( std::string name, ObjectDecl * objDecl, std::list< Expression * > args ) { 156 UntypedExpr * expr = new UntypedExpr( new NameExpr( name ) ); 157 expr->get_args().push_back( new AddressExpr( new VariableExpr( objDecl ) ) ); 158 expr->get_args().splice( expr->get_args().end(), args ); 159 return expr; 160 } 161 162 class InitExpander : public Visitor { 163 public: 164 InitExpander() {} 165 // ~InitExpander() {} 166 virtual void visit( SingleInit * singleInit ); 167 virtual void visit( ListInit * listInit ); 168 std::list< Expression * > argList; 169 }; 170 171 void InitExpander::visit( SingleInit * singleInit ) { 172 argList.push_back( singleInit->get_value()->clone() ); 173 } 174 175 void InitExpander::visit( ListInit * listInit ) { 176 // xxx - for now, assume no nested list inits 177 std::list<Initializer*>::iterator it = listInit->begin_initializers(); 178 for ( ; it != listInit->end_initializers(); ++it ) { 179 (*it)->accept( *this ); 180 } 181 } 182 183 std::list< Expression * > makeInitList( Initializer * init ) { 184 InitExpander expander; 185 maybeAccept( init, expander ); 186 return expander.argList; 187 } 188 } 189 190 ObjectDecl * CtorDtor::mutate( ObjectDecl * objDecl ) { 191 // hands off if designated or if @= 192 if ( tryConstruct( objDecl ) ) { 193 if ( inFunction ) { 194 Expression * ctor = makeCtorDtorExpr( "?{}", objDecl, makeInitList( objDecl->get_init() ) ); 195 Expression * dtor = makeCtorDtorExpr( "^?{}", objDecl, std::list< Expression * >() ); 196 197 // need to remember init expression, in case no ctors exist 198 // if ctor does exist, want to use ctor expression instead of init 199 // push this decision to the resolver 200 objDecl->set_init( new ConstructorInit( ctor, objDecl->get_init() ) ); 201 destructorStmts.push_front( new ExprStmt( noLabels, dtor ) ); 202 } else { 203 // xxx - find a way to construct/destruct globals 204 // hack: implicit "static" initialization routine for each struct type? or something similar? 205 // --ties into module system 206 } 207 } 208 return objDecl; 209 } 210 211 DeclarationWithType * CtorDtor::mutate( FunctionDecl *functionDecl ) { 212 // parameters should not be constructed and destructed, so don't mutate FunctionType 213 bool oldInFunc = inFunction; 214 mutateAll( functionDecl->get_oldDecls(), *this ); 215 inFunction = true; 216 functionDecl->set_statements( maybeMutate( functionDecl->get_statements(), *this ) ); 217 inFunction = oldInFunc; 218 return functionDecl; 219 } 220 221 CompoundStmt * CtorDtor::mutate( CompoundStmt * compoundStmt ) { 222 CompoundStmt * ret = PolyMutator::mutate( compoundStmt ); 223 std::list< Statement * > &statements = ret->get_kids(); 224 if ( ! destructorStmts.empty() ) { 225 // TODO: adding to the end of a block isn't sufficient, since 226 // return/break/goto should trigger destructor when block is left. 227 statements.splice( statements.end(), destructorStmts ); 228 } // if 229 return ret; 230 } 231 232 // should not traverse into any of these declarations to find objects 233 // that need to be constructed or destructed 234 Declaration* CtorDtor::mutate( StructDecl *aggregateDecl ) { return aggregateDecl; } 235 Declaration* CtorDtor::mutate( UnionDecl *aggregateDecl ) { return aggregateDecl; } 236 Declaration* CtorDtor::mutate( EnumDecl *aggregateDecl ) { return aggregateDecl; } 237 Declaration* CtorDtor::mutate( ContextDecl *aggregateDecl ) { return aggregateDecl; } 238 TypeDecl* CtorDtor::mutate( TypeDecl *typeDecl ) { return typeDecl; } 239 Declaration* CtorDtor::mutate( TypedefDecl *typeDecl ) { return typeDecl; } 240 121 241 } // namespace InitTweak 122 242 -
src/InitTweak/RemoveInit.h
rac1ed49 rc14cff1 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // RemoveInit.h -- 7 // RemoveInit.h -- 8 8 // 9 9 // Author : Rodolfo G. Esteves 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Fri Nov 27 17:00:47 201513 // Update Count : 211 // Last Modified By : Rob Schluntz 12 // Last Modified On : Mon Jan 11 16:02:44 2016 13 // Update Count : 3 14 14 // 15 15 … … 26 26 namespace InitTweak { 27 27 /// Adds assignment statements for polymorphic type initializers 28 void tweak( std::list< Declaration * > translationUnit );29 } // namespace 28 void tweak( std::list< Declaration * > & translationUnit ); 29 } // namespace 30 30 31 31 #endif // GENPOLY_POLYMUTATOR_H -
src/InitTweak/module.mk
rac1ed49 rc14cff1 11 11 ## Created On : Mon Jun 1 17:49:17 2015 12 12 ## Last Modified By : Rob Schluntz 13 ## Last Modified On : Mon Jan 11 14:40:16201614 ## Update Count : 213 ## Last Modified On : Wed Jan 13 16:29:03 2016 14 ## Update Count : 3 15 15 ############################################################################### 16 16 17 SRC += InitTweak/RemoveInit.cc 18 17 SRC += InitTweak/RemoveInit.cc \ 18 InitTweak/FixInit.cc -
src/MakeLibCfa.cc
rac1ed49 rc14cff1 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // MakeLibCfa.cc -- 7 // MakeLibCfa.cc -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sat May 16 10:33:33 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Fri Jun 26 16:52:59 201513 // Update Count : 1414 // 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Tue Jan 19 13:20:26 2016 13 // Update Count : 40 14 // 15 15 16 16 #include "MakeLibCfa.h" … … 29 29 void visit( FunctionDecl* funcDecl ); 30 30 void visit( ObjectDecl* objDecl ); 31 31 32 32 std::list< Declaration* > &get_newDecls() { return newDecls; } 33 33 private: … … 43 43 void MakeLibCfa::visit( FunctionDecl* origFuncDecl ) { 44 44 if ( origFuncDecl->get_linkage() != LinkageSpec::Intrinsic ) return; 45 45 46 46 FunctionDecl *funcDecl = origFuncDecl->clone(); 47 47 CodeGen::OperatorInfo opInfo; … … 54 54 assert( param != funcDecl->get_functionType()->get_parameters().end() ); 55 55 56 if ( (*param)->get_name() == "" ) { 57 (*param)->set_name( paramNamer.newName() ); 58 (*param)->set_linkage( LinkageSpec::C ); 59 } // if 56 for ( ; param != funcDecl->get_functionType()->get_parameters().end(); ++param ) { 57 if ( (*param)->get_name() == "" ) { 58 (*param)->set_name( paramNamer.newName() ); 59 (*param)->set_linkage( LinkageSpec::C ); 60 } 61 newExpr->get_args().push_back( new VariableExpr( *param ) ); 62 } // for 63 64 funcDecl->set_statements( new CompoundStmt( std::list< Label >() ) ); 65 newDecls.push_back( funcDecl ); 60 66 61 67 switch ( opInfo.type ) { … … 65 71 case CodeGen::OT_POSTFIX: 66 72 case CodeGen::OT_INFIX: 67 newExpr->get_args().push_back( new VariableExpr( *param ) );68 break;69 73 case CodeGen::OT_PREFIXASSIGN: 70 74 case CodeGen::OT_POSTFIXASSIGN: 71 75 case CodeGen::OT_INFIXASSIGN: 72 { 73 newExpr->get_args().push_back( new VariableExpr( *param ) ); 74 // UntypedExpr *deref = new UntypedExpr( new NameExpr( "*?" ) ); 75 // deref->get_args().push_back( new VariableExpr( *param ) ); 76 // newExpr->get_args().push_back( deref ); 76 funcDecl->get_statements()->get_kids().push_back( new ReturnStmt( std::list< Label >(), newExpr ) ); 77 77 break; 78 } 78 case CodeGen::OT_CTOR: 79 // ctors don't return a value 80 if ( funcDecl->get_functionType()->get_parameters().size() == 1 ) { 81 // intrinsic default constructors should do nothing 82 // delete newExpr; 83 break; 84 } else { 85 assert( funcDecl->get_functionType()->get_parameters().size() == 2 ); 86 // anything else is a single parameter constructor that is effectively a C-style assignment 87 // delete newExpr->get_function(); 88 assert(newExpr->get_args().size()==2); 89 newExpr->set_function( new NameExpr( "?=?" ) ); 90 funcDecl->get_statements()->get_kids().push_back( new ExprStmt( std::list< Label >(), newExpr ) ); 91 } 92 break; 93 case CodeGen::OT_DTOR: 94 // intrinsic destructors should do nothing 95 // delete newExpr; 96 break; 79 97 case CodeGen::OT_CONSTANT: 80 98 case CodeGen::OT_LABELADDRESS: … … 82 100 assert( false ); 83 101 } // switch 84 85 for ( param++; param != funcDecl->get_functionType()->get_parameters().end(); ++param ) {86 if ( (*param)->get_name() == "" ) {87 (*param)->set_name( paramNamer.newName() );88 (*param)->set_linkage( LinkageSpec::C );89 }90 newExpr->get_args().push_back( new VariableExpr( *param ) );91 } // for92 funcDecl->set_statements( new CompoundStmt( std::list< Label >() ) );93 funcDecl->get_statements()->get_kids().push_back( new ReturnStmt( std::list< Label >(), newExpr ) );94 newDecls.push_back( funcDecl );95 102 } 96 103 97 104 void MakeLibCfa::visit( ObjectDecl* origObjDecl ) { 98 105 if ( origObjDecl->get_linkage() != LinkageSpec::Intrinsic ) return; 99 106 100 107 ObjectDecl *objDecl = origObjDecl->clone(); 101 108 assert( ! objDecl->get_init() ); 102 109 std::list< Expression* > noDesignators; 103 objDecl->set_init( new SingleInit( new NameExpr( objDecl->get_name() ), noDesignators ) );110 objDecl->set_init( new SingleInit( new NameExpr( objDecl->get_name() ), noDesignators, false ) ); // cannot be constructed 104 111 newDecls.push_back( objDecl ); 105 112 } 106 113 } // namespace LibCfa 107 108 // Local Variables: //109 // tab-width: 4 //110 // mode: c++ //111 // compile-command: "make install" //112 // End: // -
src/Makefile.in
rac1ed49 rc14cff1 125 125 GenPoly/driver_cfa_cpp-DeclMutator.$(OBJEXT) \ 126 126 InitTweak/driver_cfa_cpp-RemoveInit.$(OBJEXT) \ 127 InitTweak/driver_cfa_cpp-FixInit.$(OBJEXT) \ 127 128 Parser/driver_cfa_cpp-parser.$(OBJEXT) \ 128 129 Parser/driver_cfa_cpp-lex.$(OBJEXT) \ … … 349 350 GenPoly/CopyParams.cc GenPoly/FindFunction.cc \ 350 351 GenPoly/InstantiateGeneric.cc GenPoly/DeclMutator.cc \ 351 InitTweak/RemoveInit.cc Parser/parser.yy Parser/lex.ll\352 Parser/ TypedefTable.cc Parser/ParseNode.cc \352 InitTweak/RemoveInit.cc InitTweak/FixInit.cc Parser/parser.yy \ 353 Parser/lex.ll Parser/TypedefTable.cc Parser/ParseNode.cc \ 353 354 Parser/DeclarationNode.cc Parser/ExpressionNode.cc \ 354 355 Parser/StatementNode.cc Parser/InitializerNode.cc \ … … 412 413 esac; \ 413 414 done; \ 414 echo ' cd $(top_srcdir) && $(AUTOMAKE) -- gnusrc/Makefile'; \415 echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ 415 416 $(am__cd) $(top_srcdir) && \ 416 $(AUTOMAKE) -- gnusrc/Makefile417 $(AUTOMAKE) --foreign src/Makefile 417 418 .PRECIOUS: Makefile 418 419 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status … … 570 571 InitTweak/driver_cfa_cpp-RemoveInit.$(OBJEXT): \ 571 572 InitTweak/$(am__dirstamp) InitTweak/$(DEPDIR)/$(am__dirstamp) 573 InitTweak/driver_cfa_cpp-FixInit.$(OBJEXT): InitTweak/$(am__dirstamp) \ 574 InitTweak/$(DEPDIR)/$(am__dirstamp) 572 575 Parser/parser.h: Parser/parser.cc 573 576 @if test ! -f $@; then rm -f Parser/parser.cc; else :; fi … … 804 807 -rm -f GenPoly/driver_cfa_cpp-ScrubTyVars.$(OBJEXT) 805 808 -rm -f GenPoly/driver_cfa_cpp-Specialize.$(OBJEXT) 809 -rm -f InitTweak/driver_cfa_cpp-FixInit.$(OBJEXT) 806 810 -rm -f InitTweak/driver_cfa_cpp-RemoveInit.$(OBJEXT) 807 811 -rm -f Parser/driver_cfa_cpp-DeclarationNode.$(OBJEXT) … … 912 916 @AMDEP_TRUE@@am__include@ @am__quote@GenPoly/$(DEPDIR)/driver_cfa_cpp-ScrubTyVars.Po@am__quote@ 913 917 @AMDEP_TRUE@@am__include@ @am__quote@GenPoly/$(DEPDIR)/driver_cfa_cpp-Specialize.Po@am__quote@ 918 @AMDEP_TRUE@@am__include@ @am__quote@InitTweak/$(DEPDIR)/driver_cfa_cpp-FixInit.Po@am__quote@ 914 919 @AMDEP_TRUE@@am__include@ @am__quote@InitTweak/$(DEPDIR)/driver_cfa_cpp-RemoveInit.Po@am__quote@ 915 920 @AMDEP_TRUE@@am__include@ @am__quote@Parser/$(DEPDIR)/driver_cfa_cpp-DeclarationNode.Po@am__quote@ … … 1411 1416 @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o InitTweak/driver_cfa_cpp-RemoveInit.obj `if test -f 'InitTweak/RemoveInit.cc'; then $(CYGPATH_W) 'InitTweak/RemoveInit.cc'; else $(CYGPATH_W) '$(srcdir)/InitTweak/RemoveInit.cc'; fi` 1412 1417 1418 InitTweak/driver_cfa_cpp-FixInit.o: InitTweak/FixInit.cc 1419 @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT InitTweak/driver_cfa_cpp-FixInit.o -MD -MP -MF InitTweak/$(DEPDIR)/driver_cfa_cpp-FixInit.Tpo -c -o InitTweak/driver_cfa_cpp-FixInit.o `test -f 'InitTweak/FixInit.cc' || echo '$(srcdir)/'`InitTweak/FixInit.cc 1420 @am__fastdepCXX_TRUE@ $(am__mv) InitTweak/$(DEPDIR)/driver_cfa_cpp-FixInit.Tpo InitTweak/$(DEPDIR)/driver_cfa_cpp-FixInit.Po 1421 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='InitTweak/FixInit.cc' object='InitTweak/driver_cfa_cpp-FixInit.o' libtool=no @AMDEPBACKSLASH@ 1422 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 1423 @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o InitTweak/driver_cfa_cpp-FixInit.o `test -f 'InitTweak/FixInit.cc' || echo '$(srcdir)/'`InitTweak/FixInit.cc 1424 1425 InitTweak/driver_cfa_cpp-FixInit.obj: InitTweak/FixInit.cc 1426 @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT InitTweak/driver_cfa_cpp-FixInit.obj -MD -MP -MF InitTweak/$(DEPDIR)/driver_cfa_cpp-FixInit.Tpo -c -o InitTweak/driver_cfa_cpp-FixInit.obj `if test -f 'InitTweak/FixInit.cc'; then $(CYGPATH_W) 'InitTweak/FixInit.cc'; else $(CYGPATH_W) '$(srcdir)/InitTweak/FixInit.cc'; fi` 1427 @am__fastdepCXX_TRUE@ $(am__mv) InitTweak/$(DEPDIR)/driver_cfa_cpp-FixInit.Tpo InitTweak/$(DEPDIR)/driver_cfa_cpp-FixInit.Po 1428 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='InitTweak/FixInit.cc' object='InitTweak/driver_cfa_cpp-FixInit.obj' libtool=no @AMDEPBACKSLASH@ 1429 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 1430 @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o InitTweak/driver_cfa_cpp-FixInit.obj `if test -f 'InitTweak/FixInit.cc'; then $(CYGPATH_W) 'InitTweak/FixInit.cc'; else $(CYGPATH_W) '$(srcdir)/InitTweak/FixInit.cc'; fi` 1431 1413 1432 Parser/driver_cfa_cpp-parser.o: Parser/parser.cc 1414 1433 @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT Parser/driver_cfa_cpp-parser.o -MD -MP -MF Parser/$(DEPDIR)/driver_cfa_cpp-parser.Tpo -c -o Parser/driver_cfa_cpp-parser.o `test -f 'Parser/parser.cc' || echo '$(srcdir)/'`Parser/parser.cc -
src/Parser/DeclarationNode.cc
rac1ed49 rc14cff1 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // DeclarationNode.cc -- 7 // DeclarationNode.cc -- 8 8 // 9 9 // Author : Rodolfo G. Esteves 10 10 // Created On : Sat May 16 12:34:05 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : T ue Jul 14 14:46:32 201513 // Update Count : 1 2611 // Last Modified By : Rob Schluntz 12 // Last Modified On : Thu Jan 07 13:18:02 2016 13 // Update Count : 130 14 14 // 15 15 … … 96 96 os << endl << string( indent + 2, ' ' ) << "with initializer "; 97 97 initializer->printOneLine( os ); 98 os << " maybe constructed? " << initializer->get_maybeConstructed(); 99 98 100 } // if 99 101 … … 357 359 } // if 358 360 } 359 361 360 362 DeclarationNode *DeclarationNode::addQualifiers( DeclarationNode *q ) { 361 363 if ( q ) { … … 508 510 assert( false ); 509 511 } // switch 510 512 511 513 return this; 512 514 } … … 619 621 assert( a->type->kind == TypeData::Array ); 620 622 TypeData *lastArray = findLast( a->type ); 621 if ( type ) { 623 if ( type ) { 622 624 switch ( type->kind ) { 623 625 case TypeData::Aggregate: … … 663 665 } // if 664 666 } 665 667 666 668 DeclarationNode *DeclarationNode::addIdList( DeclarationNode *ids ) { 667 669 type = addIdListToType( type, ids ); … … 868 870 Type *DeclarationNode::buildType() const { 869 871 assert( type ); 870 872 871 873 switch ( type->kind ) { 872 874 case TypeData::Enum: -
src/Parser/InitializerNode.cc
rac1ed49 rc14cff1 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // InitializerNode.cc -- 8 // 7 // InitializerNode.cc -- 8 // 9 9 // Author : Rodolfo G. Esteves 10 10 // Created On : Sat May 16 13:20:24 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Thu Oct 8 17:18:55 201513 // Update Count : 414 // 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Thu Jan 07 13:32:57 2016 13 // Update Count : 13 14 // 15 15 16 16 #include <cassert> … … 23 23 24 24 InitializerNode::InitializerNode( ExpressionNode *_expr, bool aggrp, ExpressionNode *des ) 25 : expr( _expr ), aggregate( aggrp ), designator( des ), kids( 0 ) {25 : expr( _expr ), aggregate( aggrp ), designator( des ), kids( 0 ), maybeConstructed( true ) { 26 26 if ( aggrp ) 27 27 kids = dynamic_cast< InitializerNode *>( get_link() ); … … 32 32 33 33 InitializerNode::InitializerNode( InitializerNode *init, bool aggrp, ExpressionNode *des ) 34 : expr( 0 ), aggregate( aggrp ), designator( des ), kids( 0 ) {34 : expr( 0 ), aggregate( aggrp ), designator( des ), kids( 0 ), maybeConstructed( true ) { 35 35 if ( init != 0 ) 36 36 set_link(init); … … 91 91 } // if 92 92 93 return new ListInit( initlist, designlist );93 return new ListInit( initlist, designlist, maybeConstructed ); 94 94 } else { 95 95 std::list< Expression *> designators; … … 99 99 100 100 if ( get_expression() != 0) 101 return new SingleInit( get_expression()->build(), designators );101 return new SingleInit( get_expression()->build(), designators, maybeConstructed ); 102 102 } // if 103 103 -
src/Parser/ParseNode.h
rac1ed49 rc14cff1 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // ParseNode.h -- 7 // ParseNode.h -- 8 8 // 9 9 // Author : Rodolfo G. Esteves 10 10 // Created On : Sat May 16 13:28:16 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Mon Feb 1 13:32:32201613 // Update Count : 18 411 // Last Modified By : Rob Schluntz 12 // Last Modified On : Tue Feb 09 13:23:34 2016 13 // Update Count : 185 14 14 // 15 15 … … 177 177 enum Type { TupleC, Comma, TupleFieldSel, // n-adic 178 178 // triadic 179 Cond, NCond, 179 Cond, NCond, 180 180 // diadic 181 SizeOf, AlignOf, OffsetOf, Attr, CompLit, Plus, Minus, Mul, Div, Mod, Or, And, 182 BitOr, BitAnd, Xor, Cast, LShift, RShift, LThan, GThan, LEThan, GEThan, Eq, Neq, 181 SizeOf, AlignOf, OffsetOf, Attr, CompLit, Plus, Minus, Mul, Div, Mod, Or, And, 182 BitOr, BitAnd, Xor, Cast, LShift, RShift, LThan, GThan, LEThan, GEThan, Eq, Neq, 183 183 Assign, MulAssn, DivAssn, ModAssn, PlusAssn, MinusAssn, LSAssn, RSAssn, AndAssn, ERAssn, OrAssn, 184 184 Index, FieldSel, PFieldSel, Range, 185 185 // monadic 186 186 UnPlus, UnMinus, AddressOf, PointTo, Neg, BitNeg, Incr, IncrPost, Decr, DecrPost, LabelAddress, 187 Ctor, Dtor, 187 188 }; 188 189 … … 309 310 ValofExprNode( const ValofExprNode &other ); 310 311 ~ValofExprNode(); 311 312 312 313 virtual ValofExprNode *clone() const { return new ValofExprNode( *this ); } 313 314 … … 332 333 enum TypeClass { Type, Dtype, Ftype }; 333 334 334 static const char *storageName[]; 335 static const char *storageName[]; 335 336 static const char *qualifierName[]; 336 337 static const char *basicTypeName[]; … … 422 423 class StatementNode : public ParseNode { 423 424 public: 424 enum Type { Exp, If, Switch, Case, Default, Choose, Fallthru, 425 enum Type { Exp, If, Switch, Case, Default, Choose, Fallthru, 425 426 While, Do, For, 426 427 Goto, Continue, Break, Return, Throw, … … 520 521 ExpressionNode *get_designators() const { return designator; } 521 522 523 InitializerNode *set_maybeConstructed( bool value ) { maybeConstructed = value; return this; } 524 bool get_maybeConstructed() const { return maybeConstructed; } 525 522 526 InitializerNode *next_init() const { return kids; } 523 527 … … 531 535 ExpressionNode *designator; // may be list 532 536 InitializerNode *kids; 537 bool maybeConstructed; 533 538 }; 534 539 -
src/Parser/TypeData.cc
rac1ed49 rc14cff1 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // TypeData.cc -- 7 // TypeData.cc -- 8 8 // 9 9 // Author : Rodolfo G. Esteves 10 10 // Created On : Sat May 16 15:12:51 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : T ue Jul 14 14:57:23 201513 // Update Count : 3 211 // Last Modified By : Rob Schluntz 12 // Last Modified On : Thu Jan 14 10:43:42 2016 13 // Update Count : 36 14 14 // 15 15 … … 436 436 for ( std::list< TypeDecl* >::iterator i = outputList.begin(); i != outputList.end(); ++i ) { 437 437 if ( (*i)->get_kind() == TypeDecl::Any ) { 438 // add assertion parameters to `type' tyvars 439 // add assignment operator: T * ?=?(T *, T) 438 440 FunctionType *assignType = new FunctionType( Type::Qualifiers(), false ); 439 441 assignType->get_parameters().push_back( new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), new TypeInstType( Type::Qualifiers(), (*i)->get_name(), *i ) ), 0 ) ); … … 441 443 assignType->get_returnVals().push_back( new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new TypeInstType( Type::Qualifiers(), (*i)->get_name(), *i ), 0 ) ); 442 444 (*i)->get_assertions().push_front( new FunctionDecl( "?=?", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, assignType, 0, false, false ) ); 445 446 // add default ctor: void ?{}(T *) 447 FunctionType *ctorType = new FunctionType( Type::Qualifiers(), false ); 448 ctorType->get_parameters().push_back( new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), new TypeInstType( Type::Qualifiers(), (*i)->get_name(), *i ) ), 0 ) ); 449 (*i)->get_assertions().push_front( new FunctionDecl( "?{}", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, ctorType, 0, false, false ) ); 450 451 // add copy ctor: void ?{}(T *, T) 452 FunctionType *copyCtorType = new FunctionType( Type::Qualifiers(), false ); 453 copyCtorType->get_parameters().push_back( new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), new TypeInstType( Type::Qualifiers(), (*i)->get_name(), *i ) ), 0 ) ); 454 copyCtorType->get_parameters().push_back( new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new TypeInstType( Type::Qualifiers(), (*i)->get_name(), *i ), 0 ) ); 455 (*i)->get_assertions().push_front( new FunctionDecl( "?{}", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, copyCtorType, 0, false, false ) ); 456 457 // add dtor: void ^?{}(T *) 458 FunctionType *dtorType = new FunctionType( Type::Qualifiers(), false ); 459 dtorType->get_parameters().push_back( new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), new TypeInstType( Type::Qualifiers(), (*i)->get_name(), *i ) ), 0 ) ); 460 (*i)->get_assertions().push_front( new FunctionDecl( "^?{}", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, dtorType, 0, false, false ) ); 443 461 } // if 444 462 } // for -
src/Parser/parser.cc
rac1ed49 rc14cff1 2 2 3 3 /* Bison implementation for Yacc-like parsers in C 4 4 5 5 Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc. 6 6 7 7 This program is free software: you can redistribute it and/or modify 8 8 it under the terms of the GNU General Public License as published by 9 9 the Free Software Foundation, either version 3 of the License, or 10 10 (at your option) any later version. 11 11 12 12 This program is distributed in the hope that it will be useful, 13 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 15 GNU General Public License for more details. 16 16 17 17 You should have received a copy of the GNU General Public License 18 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */ … … 27 27 Bison output files to be licensed under the GNU General Public 28 28 License without this special exception. 29 29 30 30 This special exception was added by the Free Software Foundation in 31 31 version 2.2 of Bison. */ … … 7353 7353 7354 7354 /* Line 1806 of yacc.c */ 7355 #line 16 90"parser.yy"7356 { (yyval.in) = (yyvsp[(2) - (2)].in) ; }7355 #line 1684 "parser.yy" 7356 { (yyval.in) = (yyvsp[(2) - (2)].in)->set_maybeConstructed( false ); } 7357 7357 break; 7358 7358 -
src/Parser/parser.yy
rac1ed49 rc14cff1 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // cfa.y -- 8 // 7 // cfa.y -- 8 // 9 9 // Author : Peter A. Buhr 10 10 // Created On : Sat Sep 1 20:22:55 2001 … … 12 12 // Last Modified On : Mon Feb 1 18:22:42 2016 13 13 // Update Count : 1483 14 // 14 // 15 15 16 16 // This grammar is based on the ANSI99/11 C grammar, specifically parts of EXPRESSION and STATEMENTS, and on the C … … 1688 1688 { $$ = $2; } 1689 1689 | ATassign initializer 1690 { $$ = $2 ; }1690 { $$ = $2->set_maybeConstructed( false ); } 1691 1691 ; 1692 1692 -
src/ResolvExpr/Resolver.cc
rac1ed49 rc14cff1 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Resolver.cc -- 7 // Resolver.cc -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 12:17:01 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : T ue Feb 9 21:57:52 201613 // Update Count : 17911 // Last Modified By : Rob Schluntz 12 // Last Modified On : Thu Jan 14 16:45:32 2016 13 // Update Count : 203 14 14 // 15 15 … … 33 33 public: 34 34 Resolver() : SymTab::Indexer( false ), switchType( 0 ) {} 35 35 36 36 virtual void visit( FunctionDecl *functionDecl ); 37 37 virtual void visit( ObjectDecl *functionDecl ); … … 54 54 virtual void visit( SingleInit *singleInit ); 55 55 virtual void visit( ListInit *listInit ); 56 virtual void visit( ConstructorInit *ctorInit ); 56 57 private: 57 58 typedef std::list< Initializer * >::iterator InitIterator; … … 59 60 void resolveAggrInit( AggregateDecl *, InitIterator &, InitIterator & ); 60 61 void resolveSingleAggrInit( Declaration *, InitIterator &, InitIterator & ); 62 void fallbackInit( ConstructorInit * ctorInit ); 61 63 62 64 std::list< Type * > functionReturn; … … 95 97 return newExpr; 96 98 } 97 99 98 100 Expression *findSingleExpression( Expression *untyped, const SymTab::Indexer &indexer ) { 99 101 TypeEnvironment env; … … 126 128 } // if 127 129 } 128 130 129 131 Expression *findIntegralExpression( Expression *untyped, const SymTab::Indexer &indexer ) { 130 132 TypeEnvironment env; … … 159 161 return newExpr; 160 162 } 161 162 } 163 163 164 } 165 164 166 void Resolver::visit( ObjectDecl *objectDecl ) { 165 167 Type *new_type = resolveTypeof( objectDecl->get_type(), *this ); … … 251 253 forStmt->set_condition( newExpr ); 252 254 } // if 253 255 254 256 if ( forStmt->get_increment() ) { 255 257 Expression * newExpr = findVoidExpression( forStmt->get_increment(), *this ); … … 265 267 delete switchStmt->get_condition(); 266 268 switchStmt->set_condition( newExpr ); 267 269 268 270 visitor.Visitor::visit( switchStmt ); 269 271 } … … 307 309 bool isCharType( T t ) { 308 310 if ( BasicType * bt = dynamic_cast< BasicType * >( t ) ) { 309 return bt->get_kind() == BasicType::Char || bt->get_kind() == BasicType::SignedChar || 311 return bt->get_kind() == BasicType::Char || bt->get_kind() == BasicType::SignedChar || 310 312 bt->get_kind() == BasicType::UnsignedChar; 311 313 } … … 319 321 string n = ne->get_name(); 320 322 if (n == "0") { 321 initContext = new BasicType(Type::Qualifiers(), 323 initContext = new BasicType(Type::Qualifiers(), 322 324 BasicType::SignedInt); 323 325 } else { … … 325 327 initContext = decl->get_type(); 326 328 } 327 } else if (ConstantExpr * e = 329 } else if (ConstantExpr * e = 328 330 dynamic_cast<ConstantExpr*>(singleInit->get_value())) { 329 331 Constant *c = e->get_constant(); … … 348 350 singleInit->set_value( ce->get_arg() ); 349 351 ce->set_arg( NULL ); 350 delete ce; 352 delete ce; 351 353 } 352 354 } … … 464 466 #endif 465 467 } 468 469 // ConstructorInit - fall back on C-style initializer 470 void Resolver::fallbackInit( ConstructorInit * ctorInit ) { 471 // could not find valid constructor, or found an intrinsic constructor 472 // fall back on C-style initializer 473 delete ctorInit->get_ctor(); 474 ctorInit->set_ctor( NULL ); 475 maybeAccept( ctorInit->get_init(), *this ); 476 } 477 478 void Resolver::visit( ConstructorInit *ctorInit ) { 479 TypeEnvironment env; 480 AlternativeFinder finder( *this, env ); 481 finder.find( ctorInit->get_ctor() ); 482 483 if ( finder.get_alternatives().size() == 0 ) { 484 fallbackInit( ctorInit ); 485 } else if ( finder.get_alternatives().size() == 1 ) { 486 Alternative &choice = finder.get_alternatives().front(); 487 if ( ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * >( choice.expr ) ) { 488 if ( VariableExpr * function = dynamic_cast< VariableExpr * > ( appExpr->get_function() ) ) { 489 if ( LinkageSpec::isOverridable( function->get_var()->get_linkage() ) ) { 490 // if the constructor that was found is intrinsic or autogenerated, reset to C-style 491 // initializer so that code generation is easy to handle 492 fallbackInit( ctorInit ); 493 return; 494 } 495 } 496 } 497 // found a constructor - can get rid of C-style initializer 498 Expression *newExpr = choice.expr->clone(); 499 finishExpr( newExpr, choice.env ); 500 ctorInit->set_ctor( newExpr ); 501 delete ctorInit->get_init(); 502 ctorInit->set_init( NULL ); 503 } else { 504 // too many constructors found 505 assert(false); 506 } 507 } 466 508 } // namespace ResolvExpr 467 509 -
src/SymTab/Validate.cc
rac1ed49 rc14cff1 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 21:50:04 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Wed Jan 27 22:03:12201613 // Update Count : 2 2511 // Last Modified By : Rob Schluntz 12 // Last Modified On : Mon Feb 22 12:26:37 2016 13 // Update Count : 297 14 14 // 15 15 … … 202 202 }; 203 203 204 class VerifyCtorDtor : public Visitor { 205 public: 206 /// ensure that constructors and destructors have at least one 207 /// parameter, the first of which must be a pointer, and no 208 /// return values. 209 static void verify( std::list< Declaration * > &translationUnit ); 210 211 // VerifyCtorDtor() {} 212 213 virtual void visit( FunctionDecl *funcDecl ); 214 private: 215 }; 216 204 217 void validate( std::list< Declaration * > &translationUnit, bool doDebug ) { 205 218 Pass1 pass1; … … 213 226 AutogenerateRoutines::autogenerateRoutines( translationUnit ); 214 227 acceptAll( translationUnit, pass3 ); 228 VerifyCtorDtor::verify( translationUnit ); 215 229 } 216 230 … … 521 535 522 536 template< typename OutputIterator > 523 void makeScalar Assignment( ObjectDecl *srcParam, ObjectDecl *dstParam, DeclarationWithType *member, OutputIterator out ) {537 void makeScalarFunction( ObjectDecl *srcParam, ObjectDecl *dstParam, DeclarationWithType *member, std::string fname, OutputIterator out ) { 524 538 ObjectDecl *obj = dynamic_cast<ObjectDecl *>( member ); 525 539 // unnamed bit fields are not copied as they cannot be accessed 526 540 if ( obj != NULL && obj->get_name() == "" && obj->get_bitfieldWidth() != NULL ) return; 527 541 528 UntypedExpr *assignExpr = new UntypedExpr( new NameExpr( "?=?" ) ); 542 // want to be able to generate assignment, ctor, and dtor generically, 543 // so fname is either ?=?, ?{}, or ^?{} 544 UntypedExpr *fExpr = new UntypedExpr( new NameExpr( fname ) ); 529 545 530 546 UntypedExpr *derefExpr = new UntypedExpr( new NameExpr( "*?" ) ); … … 533 549 // do something special for unnamed members 534 550 Expression *dstselect = new AddressExpr( new MemberExpr( member, derefExpr ) ); 535 assignExpr->get_args().push_back( dstselect );551 fExpr->get_args().push_back( dstselect ); 536 552 537 553 Expression *srcselect = new MemberExpr( member, new VariableExpr( srcParam ) ); 538 assignExpr->get_args().push_back( srcselect );539 540 *out++ = new ExprStmt( noLabels, assignExpr );554 fExpr->get_args().push_back( srcselect ); 555 556 *out++ = new ExprStmt( noLabels, fExpr ); 541 557 } 542 558 543 559 template< typename OutputIterator > 544 void makeArray Assignment( ObjectDecl *srcParam, ObjectDecl *dstParam, DeclarationWithType *member, ArrayType *array, OutputIterator out ) {560 void makeArrayFunction( ObjectDecl *srcParam, ObjectDecl *dstParam, DeclarationWithType *member, ArrayType *array, std::string fname, OutputIterator out ) { 545 561 static UniqueName indexName( "_index" ); 546 562 … … 565 581 inc->get_args().push_back( new AddressExpr( new VariableExpr( index ) ) ); 566 582 567 UntypedExpr *assignExpr = new UntypedExpr( new NameExpr( "?=?" ) ); 583 // want to be able to generate assignment, ctor, and dtor generically, 584 // so fname is either ?=?, ?{}, or ^?{} 585 UntypedExpr *fExpr = new UntypedExpr( new NameExpr( fname ) ); 568 586 569 587 UntypedExpr *derefExpr = new UntypedExpr( new NameExpr( "*?" ) ); … … 574 592 dstIndex->get_args().push_back( dstselect ); 575 593 dstIndex->get_args().push_back( new VariableExpr( index ) ); 576 assignExpr->get_args().push_back( dstIndex );594 fExpr->get_args().push_back( dstIndex ); 577 595 578 596 Expression *srcselect = new MemberExpr( member, new VariableExpr( srcParam ) ); … … 580 598 srcIndex->get_args().push_back( srcselect ); 581 599 srcIndex->get_args().push_back( new VariableExpr( index ) ); 582 assignExpr->get_args().push_back( srcIndex );583 584 *out++ = new ForStmt( noLabels, initList, cond, inc, new ExprStmt( noLabels, assignExpr ) );600 fExpr->get_args().push_back( srcIndex ); 601 602 *out++ = new ForStmt( noLabels, initList, cond, inc, new ExprStmt( noLabels, fExpr ) ); 585 603 } 586 604 … … 732 750 // assign to both destination and return value 733 751 if ( ArrayType *array = dynamic_cast< ArrayType * >( fixedMember->get_type() ) ) { 734 makeArray Assignment( srcParam, dstParam, fixedMember, array, back_inserter( assignDecl->get_statements()->get_kids() ) );735 makeArray Assignment( srcParam, returnVal, fixedMember, array, back_inserter( assignDecl->get_statements()->get_kids() ) );752 makeArrayFunction( srcParam, dstParam, fixedMember, array, "?=?", back_inserter( assignDecl->get_statements()->get_kids() ) ); 753 makeArrayFunction( srcParam, returnVal, fixedMember, array, "?=?", back_inserter( assignDecl->get_statements()->get_kids() ) ); 736 754 } else { 737 makeScalar Assignment( srcParam, dstParam, fixedMember, back_inserter( assignDecl->get_statements()->get_kids() ) );738 makeScalar Assignment( srcParam, returnVal, fixedMember, back_inserter( assignDecl->get_statements()->get_kids() ) );755 makeScalarFunction( srcParam, dstParam, fixedMember, "?=?", back_inserter( assignDecl->get_statements()->get_kids() ) ); 756 makeScalarFunction( srcParam, returnVal, fixedMember, "?=?", back_inserter( assignDecl->get_statements()->get_kids() ) ); 739 757 } // if 740 758 } else { 741 759 // assign to destination 742 760 if ( ArrayType *array = dynamic_cast< ArrayType * >( dwt->get_type() ) ) { 743 makeArray Assignment( srcParam, dstParam, dwt, array, back_inserter( assignDecl->get_statements()->get_kids() ) );761 makeArrayFunction( srcParam, dstParam, dwt, array, "?=?", back_inserter( assignDecl->get_statements()->get_kids() ) ); 744 762 } else { 745 makeScalar Assignment( srcParam, dstParam, dwt, back_inserter( assignDecl->get_statements()->get_kids() ) );763 makeScalarFunction( srcParam, dstParam, dwt, "?=?", back_inserter( assignDecl->get_statements()->get_kids() ) ); 746 764 } // if 747 765 } // if … … 753 771 } 754 772 755 Declaration *makeUnionAssignment( UnionDecl *aggregateDecl, UnionInstType *refType, unsigned int functionNesting ) { 773 void makeStructCtorDtor( StructDecl *aggregateDecl, StructInstType *refType, unsigned int functionNesting, std::list< Declaration * > & declsToAdd ) { 774 FunctionType *ctorType = new FunctionType( Type::Qualifiers(), false ); 775 776 // Make function polymorphic in same parameters as generic struct, if applicable 777 bool isGeneric = false; // NOTE this flag is an incredibly ugly kludge; we should fix the assignment signature instead (ditto for union) 778 std::list< TypeDecl* >& genericParams = aggregateDecl->get_parameters(); 779 std::list< Expression* > structParams; // List of matching parameters to put on types 780 for ( std::list< TypeDecl* >::const_iterator param = genericParams.begin(); param != genericParams.end(); ++param ) { 781 isGeneric = true; 782 TypeDecl *typeParam = (*param)->clone(); 783 ctorType->get_forall().push_back( typeParam ); 784 structParams.push_back( new TypeExpr( new TypeInstType( Type::Qualifiers(), typeParam->get_name(), typeParam ) ) ); 785 } 786 787 ObjectDecl *thisParam = new ObjectDecl( "_this", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), cloneWithParams( refType, structParams ) ), 0 ); 788 ctorType->get_parameters().push_back( thisParam ); 789 790 // Routines at global scope marked "static" to prevent multiple definitions is separate translation units 791 // because each unit generates copies of the default routines for each aggregate. 792 FunctionDecl *ctorDecl = new FunctionDecl( "?{}", functionNesting > 0 ? DeclarationNode::NoStorageClass : DeclarationNode::Static, LinkageSpec::AutoGen, ctorType, 0, true, false ); 793 FunctionDecl *copyCtorDecl = new FunctionDecl( "?{}", functionNesting > 0 ? DeclarationNode::NoStorageClass : DeclarationNode::Static, LinkageSpec::AutoGen, ctorType->clone(), 0, true, false ); 794 FunctionDecl *dtorDecl = new FunctionDecl( "^?{}", functionNesting > 0 ? DeclarationNode::NoStorageClass : DeclarationNode::Static, LinkageSpec::AutoGen, ctorType->clone(), 0, true, false ); 795 ctorDecl->fixUniqueId(); 796 copyCtorDecl->fixUniqueId(); 797 dtorDecl->fixUniqueId(); 798 799 // add definitions 800 // TODO: add in calls to default constructors and destructors for fields 801 ctorDecl->set_statements( new CompoundStmt( noLabels ) ); 802 copyCtorDecl->set_statements( new CompoundStmt( noLabels ) ); 803 dtorDecl->set_statements( new CompoundStmt( noLabels ) ); 804 declsToAdd.push_back( ctorDecl ); 805 declsToAdd.push_back( copyCtorDecl ); 806 declsToAdd.push_back( dtorDecl ); 807 808 ObjectDecl * srcParam = new ObjectDecl( "_other", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, cloneWithParams( refType, structParams ), 0 ); 809 copyCtorDecl->get_functionType()->get_parameters().push_back( srcParam ); 810 for ( std::list< Declaration * >::const_iterator member = aggregateDecl->get_members().begin(); member != aggregateDecl->get_members().end(); ++member ) { 811 if ( DeclarationWithType *dwt = dynamic_cast< DeclarationWithType * >( *member ) ) { 812 // query the type qualifiers of this field and skip assigning it if it is marked const. 813 // If it is an array type, we need to strip off the array layers to find its qualifiers. 814 Type * type = dwt->get_type(); 815 while ( ArrayType * at = dynamic_cast< ArrayType * >( type ) ) { 816 type = at->get_base(); 817 } 818 819 if ( type->get_qualifiers().isConst ) { 820 // don't assign const members 821 continue; 822 } 823 824 if ( ArrayType *array = dynamic_cast< ArrayType * >( dwt->get_type() ) ) { 825 makeArrayFunction( srcParam, thisParam, dwt, array, "?{}", back_inserter( copyCtorDecl->get_statements()->get_kids() ) ); 826 // if ( isGeneric ) makeArrayFunction( srcParam, returnVal, dwt, array, back_inserter( copyCtorDecl->get_statements()->get_kids() ) ); 827 } else { 828 makeScalarFunction( srcParam, thisParam, dwt, "?{}", back_inserter( copyCtorDecl->get_statements()->get_kids() ) ); 829 // if ( isGeneric ) makeScalarCtor( srcParam, returnVal, dwt, back_inserter( copyCtorDecl->get_statements()->get_kids() ) ); 830 } // if 831 } // if 832 } // for 833 // if ( ! isGeneric ) assignDecl->get_statements()->get_kids().push_back( new ReturnStmt( noLabels, new VariableExpr( srcParam ) ) ); 834 } 835 836 void makeUnionFunctions( UnionDecl *aggregateDecl, UnionInstType *refType, unsigned int functionNesting, std::list< Declaration * > & declsToAdd ) { 756 837 FunctionType *assignType = new FunctionType( Type::Qualifiers(), false ); 757 838 … … 767 848 } 768 849 850 ObjectDecl *dstParam = new ObjectDecl( "_dst", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), cloneWithParams( refType, unionParams ) ), 0 ); 851 assignType->get_parameters().push_back( dstParam ); 852 853 // default ctor/dtor need only first parameter 854 FunctionType * ctorType = assignType->clone(); 855 FunctionType * dtorType = assignType->clone(); 856 857 ObjectDecl *srcParam = new ObjectDecl( "_src", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, cloneWithParams( refType, unionParams ), 0 ); 858 assignType->get_parameters().push_back( srcParam ); 859 860 // copy ctor needs both parameters 861 FunctionType * copyCtorType = assignType->clone(); 862 863 // assignment needs both and return value 769 864 ObjectDecl *returnVal = new ObjectDecl( "_ret", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, cloneWithParams( refType, unionParams ), 0 ); 770 865 assignType->get_returnVals().push_back( returnVal ); 771 772 ObjectDecl *dstParam = new ObjectDecl( "_dst", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), cloneWithParams( refType, unionParams ) ), 0 );773 assignType->get_parameters().push_back( dstParam );774 775 ObjectDecl *srcParam = new ObjectDecl( "_src", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, cloneWithParams( refType, unionParams ), 0 );776 assignType->get_parameters().push_back( srcParam );777 866 778 867 // Routines at global scope marked "static" to prevent multiple definitions is separate translation units 779 868 // because each unit generates copies of the default routines for each aggregate. 780 869 FunctionDecl *assignDecl = new FunctionDecl( "?=?", functionNesting > 0 ? DeclarationNode::NoStorageClass : DeclarationNode::Static, LinkageSpec::AutoGen, assignType, new CompoundStmt( noLabels ), true, false ); 870 FunctionDecl *ctorDecl = new FunctionDecl( "?{}", functionNesting > 0 ? DeclarationNode::NoStorageClass : DeclarationNode::Static, LinkageSpec::AutoGen, ctorType, new CompoundStmt( noLabels ), true, false ); 871 FunctionDecl *copyCtorDecl = new FunctionDecl( "?{}", functionNesting > 0 ? DeclarationNode::NoStorageClass : DeclarationNode::Static, LinkageSpec::AutoGen, copyCtorType, NULL, true, false ); 872 FunctionDecl *dtorDecl = new FunctionDecl( "^?{}", functionNesting > 0 ? DeclarationNode::NoStorageClass : DeclarationNode::Static, LinkageSpec::AutoGen, dtorType, new CompoundStmt( noLabels ), true, false ); 873 781 874 assignDecl->fixUniqueId(); 875 ctorDecl->fixUniqueId(); 876 copyCtorDecl->fixUniqueId(); 877 dtorDecl->fixUniqueId(); 782 878 783 879 makeUnionFieldsAssignment( srcParam, dstParam, cloneWithParams( refType, unionParams ), back_inserter( assignDecl->get_statements()->get_kids() ) ); 784 880 if ( isGeneric ) makeUnionFieldsAssignment( srcParam, returnVal, cloneWithParams( refType, unionParams ), back_inserter( assignDecl->get_statements()->get_kids() ) ); 785 881 786 882 if ( ! isGeneric ) assignDecl->get_statements()->get_kids().push_back( new ReturnStmt( noLabels, new VariableExpr( srcParam ) ) ); 787 883 788 return assignDecl; 884 // body of assignment and copy ctor is the same 885 copyCtorDecl->set_statements( assignDecl->get_statements()->clone() ); 886 887 declsToAdd.push_back( assignDecl ); 888 declsToAdd.push_back( ctorDecl ); 889 declsToAdd.push_back( copyCtorDecl ); 890 declsToAdd.push_back( dtorDecl ); 789 891 } 790 892 … … 802 904 StructInstType structInst( Type::Qualifiers(), structDecl->get_name() ); 803 905 structInst.set_baseStruct( structDecl ); 906 804 907 declsToAdd.push_back( makeStructAssignment( structDecl, &structInst, functionNesting ) ); 908 makeStructCtorDtor( structDecl, &structInst, functionNesting, declsToAdd ); 805 909 structsDone.insert( structDecl->get_name() ); 806 910 } // if … … 811 915 UnionInstType unionInst( Type::Qualifiers(), unionDecl->get_name() ); 812 916 unionInst.set_baseUnion( unionDecl ); 813 declsToAdd.push_back( makeUnionAssignment( unionDecl, &unionInst, functionNesting ));917 makeUnionFunctions( unionDecl, &unionInst, functionNesting, declsToAdd ); 814 918 } // if 815 919 } … … 1080 1184 } 1081 1185 1186 void VerifyCtorDtor::verify( std::list< Declaration * > & translationUnit ) { 1187 VerifyCtorDtor verifier; 1188 acceptAll( translationUnit, verifier ); 1189 } 1190 1191 void VerifyCtorDtor::visit( FunctionDecl * funcDecl ) { 1192 FunctionType * funcType = funcDecl->get_functionType(); 1193 std::list< DeclarationWithType * > &returnVals = funcType->get_returnVals(); 1194 std::list< DeclarationWithType * > ¶ms = funcType->get_parameters(); 1195 1196 if ( funcDecl->get_name() == "?{}" || funcDecl->get_name() == "^?{}" ) { 1197 if ( params.size() == 0 ) { 1198 throw SemanticError( "Constructors and destructors require at least one parameter ", funcDecl ); 1199 } 1200 if ( ! dynamic_cast< PointerType * >( params.front()->get_type() ) ) { 1201 throw SemanticError( "First parameter of a constructor or destructor must be a pointer ", funcDecl ); 1202 } 1203 if ( returnVals.size() != 0 ) { 1204 throw SemanticError( "Constructors and destructors cannot have explicit return values ", funcDecl ); 1205 } 1206 } 1207 1208 Visitor::visit( funcDecl ); 1209 // original idea: modify signature of ctor/dtors and insert appropriate return statements 1210 // to cause desired behaviour 1211 // new idea: add comma exprs to every ctor call to produce first parameter. 1212 // this requires some memoization of the first parameter, because it can be a 1213 // complicated expression with side effects (see: malloc). idea: add temporary variable 1214 // that is assigned address of constructed object in ctor argument position and 1215 // return the temporary. It should also be done after all implicit ctors are 1216 // added, so not in this pass! 1217 } 1082 1218 } // namespace SymTab 1083 1219 -
src/SynTree/Declaration.h
rac1ed49 rc14cff1 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Declaration.h -- 7 // Declaration.h -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Dec 09 14:08:22 201513 // Update Count : 3 212 // Last Modified On : Wed Jan 13 16:11:49 2016 13 // Update Count : 36 14 14 // 15 15 -
src/SynTree/Initializer.cc
rac1ed49 rc14cff1 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Initializer.cc -- 7 // Initializer.cc -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Aug 12 14:05:25 201513 // Update Count : 1412 // Last Modified On : Wed Jan 13 15:31:45 2016 13 // Update Count : 28 14 14 // 15 15 … … 18 18 #include "Common/utility.h" 19 19 20 Initializer::Initializer( ) {}20 Initializer::Initializer( bool maybeConstructed ) : maybeConstructed( maybeConstructed ) {} 21 21 22 22 Initializer::~Initializer() {} … … 31 31 void Initializer::print( std::ostream &os, int indent ) {} 32 32 33 SingleInit::SingleInit( Expression *v, std::list< Expression *> &_designators ) : value ( v ), designators( _designators ) {33 SingleInit::SingleInit( Expression *v, std::list< Expression *> &_designators, bool maybeConstructed ) : Initializer( maybeConstructed ), value ( v ), designators( _designators ) { 34 34 } 35 35 36 SingleInit::SingleInit( const SingleInit &other ) : value ( other.value ) {36 SingleInit::SingleInit( const SingleInit &other ) : Initializer(other), value ( other.value ) { 37 37 cloneAll(other.designators, designators ); 38 38 } … … 54 54 } 55 55 56 ListInit::ListInit( std::list<Initializer*> &_initializers, std::list<Expression *> &_designators )57 : initializers( _initializers ), designators( _designators ) {56 ListInit::ListInit( std::list<Initializer*> &_initializers, std::list<Expression *> &_designators, bool maybeConstructed ) 57 : Initializer( maybeConstructed), initializers( _initializers ), designators( _designators ) { 58 58 } 59 59 … … 65 65 66 66 void ListInit::print( std::ostream &os, int indent ) { 67 os << std::endl << std::string(indent, ' ') << "Compound initializer: "; 67 os << std::endl << std::string(indent, ' ') << "Compound initializer: "; 68 68 if ( ! designators.empty() ) { 69 69 os << std::string(indent + 2, ' ' ) << "designated by: ["; 70 70 for ( std::list < Expression * >::iterator i = designators.begin(); 71 71 i != designators.end(); i++ ) { 72 ( *i )->print(os, indent + 4 ); 72 ( *i )->print(os, indent + 4 ); 73 73 } // for 74 74 75 75 os << std::string(indent + 2, ' ' ) << "]"; 76 76 } // if 77 77 78 for ( std::list<Initializer *>::iterator i = initializers.begin(); i != initializers.end(); i++ ) 78 for ( std::list<Initializer *>::iterator i = initializers.begin(); i != initializers.end(); i++ ) 79 79 (*i)->print( os, indent + 2 ); 80 80 } 81 82 83 ConstructorInit::ConstructorInit( Expression * ctor, Initializer * init ) : Initializer( true ), ctor( ctor ), init( init ) {} 84 ConstructorInit::~ConstructorInit() { 85 delete ctor; 86 delete init; 87 } 88 89 ConstructorInit *ConstructorInit::clone() const { 90 return new ConstructorInit( *this ); 91 } 92 93 void ConstructorInit::print( std::ostream &os, int indent ) { 94 os << std::endl << std::string(indent, ' ') << "Constructor initializer: "; 95 if ( ctor ) { 96 os << " initially constructed with "; 97 ctor->print( os, indent+2 ); 98 } // if 99 100 if ( init ) { 101 os << " with fallback C-style initializer: "; 102 init->print( os, indent+2 ); 103 } 104 } 105 106 81 107 // Local Variables: // 82 108 // tab-width: 4 // -
src/SynTree/Initializer.h
rac1ed49 rc14cff1 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Initializer.h -- 7 // Initializer.h -- 8 8 // 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 : Mon May 18 09:03:48 201513 // Update Count : 1 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Tue Feb 09 14:40:15 2016 13 // Update Count : 19 14 14 // 15 15 … … 27 27 public: 28 28 // Initializer( std::string _name = std::string(""), int _pos = 0 ); 29 Initializer( );29 Initializer( bool maybeConstructed ); 30 30 virtual ~Initializer(); 31 31 … … 43 43 } 44 44 45 bool get_maybeConstructed() { return maybeConstructed; } 46 45 47 virtual Initializer *clone() const = 0; 46 48 virtual void accept( Visitor &v ) = 0; … … 50 52 // std::string name; 51 53 // int pos; 54 bool maybeConstructed; 52 55 }; 53 56 … … 55 58 class SingleInit : public Initializer { 56 59 public: 57 SingleInit( Expression *value, std::list< Expression *> &designators = *(new std::list<Expression *>()));60 SingleInit( Expression *value, std::list< Expression *> &designators, bool maybeConstructed = false ); 58 61 SingleInit( const SingleInit &other ); 59 62 virtual ~SingleInit(); 60 63 61 64 Expression *get_value() { return value; } 62 65 void set_value( Expression *newValue ) { value = newValue; } … … 79 82 class ListInit : public Initializer { 80 83 public: 81 ListInit( std::list<Initializer*> &, 82 std::list<Expression *> &designators = *(new std::list<Expression *>()));84 ListInit( std::list<Initializer*> &, 85 std::list<Expression *> &designators, bool maybeConstructed = false ); 83 86 virtual ~ListInit(); 84 87 … … 100 103 }; 101 104 105 // ConstructorInit represents an initializer that is either a constructor expression or 106 // a C-style initializer. 107 class ConstructorInit : public Initializer { 108 public: 109 ConstructorInit( Expression * ctor, Initializer * init ); 110 virtual ~ConstructorInit(); 111 112 void set_ctor( Expression * newValue ) { ctor = newValue; } 113 Expression * get_ctor() const { return ctor; } 114 void set_init( Initializer * newValue ) { init = newValue; } 115 Initializer * get_init() const { return init; } 116 117 virtual ConstructorInit *clone() const; 118 virtual void accept( Visitor &v ) { v.visit( this ); } 119 virtual Initializer *acceptMutator( Mutator &m ) { return m.mutate( this ); } 120 virtual void print( std::ostream &os, int indent = 0 ); 121 122 private: 123 Expression * ctor; 124 // C-style initializer made up of SingleInit and ListInit nodes to use as a fallback 125 // if an appropriate constructor definition is not found by the resolver 126 Initializer * init; 127 }; 128 102 129 #endif // INITIALIZER_H 103 130 -
src/SynTree/Mutator.cc
rac1ed49 rc14cff1 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Mutator.cc -- 7 // Mutator.cc -- 8 8 // 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 : Sat Jul 25 19:21:33 201513 // Update Count : 1 111 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Jan 13 15:32:29 2016 13 // Update Count : 15 14 14 // 15 15 … … 437 437 } 438 438 439 Initializer *Mutator::mutate( ConstructorInit *ctorInit ) { 440 ctorInit->set_ctor( maybeMutate( ctorInit->get_ctor(), *this ) ); 441 ctorInit->set_init( maybeMutate( ctorInit->get_init(), *this ) ); 442 return ctorInit; 443 } 444 439 445 Subrange *Mutator::mutate( Subrange *subrange ) { 440 446 return subrange; -
src/SynTree/Mutator.h
rac1ed49 rc14cff1 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Mutator.h -- 7 // Mutator.h -- 8 8 // 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 Nov 19 22:26:16 201513 // Update Count : 811 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Jan 13 15:24:26 2016 13 // Update Count : 9 14 14 // 15 15 #include <cassert> … … 62 62 virtual Expression* mutate( MemberExpr *memberExpr ); 63 63 virtual Expression* mutate( VariableExpr *variableExpr ); 64 virtual Expression* mutate( ConstantExpr *constantExpr ); 64 virtual Expression* mutate( ConstantExpr *constantExpr ); 65 65 virtual Expression* mutate( SizeofExpr *sizeofExpr ); 66 66 virtual Expression* mutate( AlignofExpr *alignofExpr ); … … 94 94 virtual Initializer* mutate( SingleInit *singleInit ); 95 95 virtual Initializer* mutate( ListInit *listInit ); 96 virtual Initializer* mutate( ConstructorInit *ctorInit ); 96 97 97 98 virtual Subrange *mutate( Subrange *subrange ); -
src/SynTree/ObjectDecl.cc
rac1ed49 rc14cff1 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // ObjectDecl.cc -- 7 // ObjectDecl.cc -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Tue Sep 29 14:13:01 201513 // Update Count : 1812 // Last Modified On : Tue Feb 09 13:21:03 2016 13 // Update Count : 30 14 14 // 15 15 … … 19 19 #include "Expression.h" 20 20 #include "Common/utility.h" 21 #include "Statement.h" 21 22 22 23 ObjectDecl::ObjectDecl( const std::string &name, DeclarationNode::StorageClass sc, LinkageSpec::Type linkage, Expression *bitfieldWidth, Type *type, Initializer *init, bool isInline, bool isNoreturn ) … … 58 59 os << " with initializer "; 59 60 init->print( os, indent ); 61 os << std::string(indent, ' ') << "maybeConstructed? " << init->get_maybeConstructed(); 60 62 } // if 61 63 … … 69 71 #if 0 70 72 if ( get_mangleName() != "") { 71 os << get_mangleName() << ": "; 72 } else 73 os << get_mangleName() << ": "; 74 } else 73 75 #endif 74 76 if ( get_name() != "" ) { -
src/SynTree/SynTree.h
rac1ed49 rc14cff1 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // SynTree.h -- 7 // SynTree.h -- 8 8 // 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 Jul 23 23:25:04 201513 // Update Count : 311 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Jan 13 15:28:41 2016 13 // Update Count : 4 14 14 // 15 15 … … 102 102 class SingleInit; 103 103 class ListInit; 104 class ConstructorInit; 104 105 105 106 class Subrange; -
src/SynTree/Visitor.cc
rac1ed49 rc14cff1 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Visitor.cc -- 7 // Visitor.cc -- 8 8 // 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 : Fri Jul 24 16:11:05 201513 // Update Count : 1 511 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Jan 13 15:27:23 2016 13 // Update Count : 18 14 14 // 15 15 … … 368 368 } 369 369 370 void Visitor::visit( ConstructorInit *ctorInit ) { 371 maybeAccept( ctorInit->get_ctor(), *this ); 372 maybeAccept( ctorInit->get_init(), *this ); 373 } 374 370 375 void Visitor::visit( Subrange *subrange ) {} 371 376 -
src/SynTree/Visitor.h
rac1ed49 rc14cff1 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Visitor.h -- 7 // Visitor.h -- 8 8 // 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 : Mon Jan 25 21:20:44201613 // Update Count : 511 // Last Modified By : Rob Schluntz 12 // Last Modified On : Tue Feb 09 13:20:48 2016 13 // Update Count : 6 14 14 // 15 15 … … 62 62 virtual void visit( MemberExpr *memberExpr ); 63 63 virtual void visit( VariableExpr *variableExpr ); 64 virtual void visit( ConstantExpr *constantExpr ); 64 virtual void visit( ConstantExpr *constantExpr ); 65 65 virtual void visit( SizeofExpr *sizeofExpr ); 66 66 virtual void visit( AlignofExpr *alignofExpr ); … … 94 94 virtual void visit( SingleInit *singleInit ); 95 95 virtual void visit( ListInit *listInit ); 96 virtual void visit( ConstructorInit *ctorInit ); 96 97 97 98 virtual void visit( Subrange *subrange ); -
src/initialization.txt
rac1ed49 rc14cff1 34 34 sure that resolved initializers for all declarations are being 35 35 generated. 36 37 38 ------ 39 40 More recent email: (I am quoted; Richard is the responder) 41 > As far as I'm aware, the only way that I could currently get the correct 42 > results from the unification engine is by feeding it an expression that 43 > looks like "?=?( ((struct Y)x.y).a, 10 )", then picking out the pieces that 44 > I need (namely the correct choice for a). Does this seem like a reasonable 45 > approach to solve this problem? 46 47 No, unfortunately. Initialization isn't being rewritten as assignment, 48 so you shouldn't allow the particular selection of assignment 49 operators that happen to be in scope (and which may include 50 user-defined operators) to guide the type resolution. 51 52 I don't think there is any way to rewrite an initializer as a single 53 expression and have the resolver just do the right thing. I see the 54 algorithm as: 55 56 For each alternative interpretation of the designator: 57 Construct an expression that casts the initializer to the type of 58 the designator 59 Construct an AlternativeFinder and use it to find the lowest cost 60 interpretation of the expression 61 Add this interpretation to a list of possibilities 62 Go through the list of possibilities and pick the lowest cost 63 64 As with many things in the resolver, it's conceptually simple but the 65 implementation may be a bit of a pain. It fits in with functions like 66 findSingleExpression, findIntegralExpression in Resolver.cc, although 67 it will be significantly more complicated than any of the existing 68 ones. 69 70 71 -
src/libcfa/Makefile.am
rac1ed49 rc14cff1 6 6 ## file "LICENCE" distributed with Cforall. 7 7 ## 8 ## Makefile.am -- 8 ## Makefile.am -- 9 9 ## 10 10 ## Author : Peter A. Buhr … … 51 51 52 52 CFLAGS = -g -Wall -Wno-unused-function -B${abs_top_srcdir}/src/driver -XCFA -t # TEMPORARY: does not build with -O2 53 CC = ${abs_top_srcdir}/src/driver/cfa 53 CC = ${abs_top_srcdir}/src/driver/cfa 54 54 55 55 # extension-less header files are overridden by default make rules => explicitly override rule … … 60 60 ${CC} ${CFLAGS} -c -o $@ $< 61 61 62 libs = stdlib iostream fstream iterator62 libs = # stdlib iostream fstream iterator # temporarily getting rid of these until ctor/dtor autogen works 63 63 libcfa_a_SOURCES = libcfa-prelude.c ${libs:=.c} 64 64 -
src/libcfa/Makefile.in
rac1ed49 rc14cff1 83 83 libcfa_a_AR = $(AR) $(ARFLAGS) 84 84 libcfa_a_LIBADD = 85 am__objects_1 = stdlib.$(OBJEXT) iostream.$(OBJEXT) fstream.$(OBJEXT) \ 86 iterator.$(OBJEXT) 85 am__objects_1 = 87 86 am_libcfa_a_OBJECTS = libcfa-prelude.$(OBJEXT) $(am__objects_1) 88 87 libcfa_a_OBJECTS = $(am_libcfa_a_OBJECTS) … … 110 109 AWK = @AWK@ 111 110 BACKEND_CC = @BACKEND_CC@ 112 CC = ${abs_top_srcdir}/src/driver/cfa 111 CC = ${abs_top_srcdir}/src/driver/cfa 113 112 CCDEPMODE = @CCDEPMODE@ 114 113 CFA_BINDIR = @CFA_BINDIR@ … … 213 212 MAINTAINERCLEANFILES = ${addprefix ${libdir}/,${cfalib_DATA}} \ 214 213 ${addprefix ${libdir}/,${lib_LIBRARIES}} ${includedir}/* 215 libs = stdlib iostream fstream iterator214 libs = # stdlib iostream fstream iterator # temporarily getting rid of these until ctor/dtor autogen works 216 215 libcfa_a_SOURCES = libcfa-prelude.c ${libs:=.c} 217 216 cheaders = bfd bfdlink demangle dialog evdns evhttp evrpc expat fcntl form gcrypt math … … 293 292 -rm -f *.tab.c 294 293 295 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fstream.Po@am__quote@296 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iostream.Po@am__quote@297 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iterator.Po@am__quote@298 294 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa-prelude.Po@am__quote@ 299 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stdlib.Po@am__quote@300 295 301 296 .c.obj: -
src/libcfa/prelude.cf
rac1ed49 rc14cff1 1 // -*- Mode: C -*- 2 // 1 // -*- Mode: C -*- 2 // 3 3 // Copyright (C) Glen Ditchfield 1994, 1999 4 // 4 // 5 5 // prelude.cf -- Standard Cforall Preample for C99 6 // 6 // 7 7 // Author : Glen Ditchfield 8 8 // Created On : Sat Nov 29 07:23:41 2014 … … 116 116 forall( ftype FT ) lvalue FT *?( FT * ); 117 117 118 _Bool +?( _Bool ), -?( _Bool ), ~?( _Bool ); 119 signed int +?( signed int ), -?( signed int ), ~?( signed int ); 120 unsigned int +?( unsigned int ), -?( unsigned int ), ~?( unsigned int ); 121 signed long int +?( signed long int ), -?( signed long int ), ~?( signed long int ); 122 unsigned long int +?( unsigned long int ), -?( unsigned long int ), ~?( unsigned long int ); 123 signed long long int +?( signed long long int ), -?( signed long long int ), ~?( signed long long int ); 124 unsigned long long int +?( unsigned long long int ), -?( unsigned long long int ), ~?( unsigned long long int ); 118 _Bool +?( _Bool ), -?( _Bool ), ~?( _Bool ); 119 signed int +?( signed int ), -?( signed int ), ~?( signed int ); 120 unsigned int +?( unsigned int ), -?( unsigned int ), ~?( unsigned int ); 121 signed long int +?( signed long int ), -?( signed long int ), ~?( signed long int ); 122 unsigned long int +?( unsigned long int ), -?( unsigned long int ), ~?( unsigned long int ); 123 signed long long int +?( signed long long int ), -?( signed long long int ), ~?( signed long long int ); 124 unsigned long long int +?( unsigned long long int ), -?( unsigned long long int ), ~?( unsigned long long int ); 125 125 float +?( float ), -?( float ); 126 126 double +?( double ), -?( double ); … … 626 626 ?+=?( long double _Complex *, long double _Complex ), ?+=?( volatile long double _Complex *, long double _Complex ), 627 627 ?-=?( long double _Complex *, long double _Complex ), ?-=?( volatile long double _Complex *, long double _Complex ); 628 629 630 631 632 633 // ------------------------------------------------------------ 634 // 635 // Section ??? Constructors and Destructors 636 // 637 // ------------------------------------------------------------ 638 639 // default ctor 640 void ?{}( _Bool * ), ?{}( volatile _Bool * ); 641 void ?{}( unsigned char * ), ?{}( volatile unsigned char * ); 642 void ?{}( signed int * ), ?{}( volatile signed int * ); 643 void ?{}( unsigned int * ), ?{}( volatile unsigned int * ); 644 void ?{}( signed long int * ), ?{}( volatile signed long int * ); 645 void ?{}( unsigned long int * ), ?{}( volatile unsigned long int * ); 646 void ?{}( signed long long int * ), ?{}( volatile signed long long int * ); 647 void ?{}( unsigned long long int * ), ?{}( volatile unsigned long long int * ); 648 void ?{}( float * ), ?{}( volatile float * ); 649 void ?{}( double * ), ?{}( volatile double * ); 650 void ?{}( long double * ), ?{}( volatile long double * ); 651 void ?{}( float _Complex * ), ?{}( volatile float _Complex * ); 652 void ?{}( double _Complex * ), ?{}( volatile double _Complex * ); 653 void ?{}( long double _Complex * ), ?{}( volatile long double _Complex * ); 654 655 // copy ctor 656 void ?{}( _Bool *, _Bool ), ?{}( volatile _Bool *, _Bool ); 657 void ?{}( unsigned char *, unsigned char ), ?{}( volatile unsigned char *, unsigned char ); 658 void ?{}( signed int *, signed int), ?{}( volatile signed int *, signed int ); 659 void ?{}( unsigned int *, unsigned int), ?{}( volatile unsigned int *, unsigned int ); 660 void ?{}( signed long int *, signed long int), ?{}( volatile signed long int *, signed long int ); 661 void ?{}( unsigned long int *, unsigned long int), ?{}( volatile unsigned long int *, unsigned long int ); 662 void ?{}( signed long long int *, signed long long int), ?{}( volatile signed long long int *, signed long long int ); 663 void ?{}( unsigned long long int *, unsigned long long int), ?{}( volatile unsigned long long int *, unsigned long long int ); 664 void ?{}( float *, float), ?{}( volatile float *, float ); 665 void ?{}( double *, double), ?{}( volatile double *, double ); 666 void ?{}( long double *, long double), ?{}( volatile long double *, long double ); 667 void ?{}( float _Complex *, float _Complex), ?{}( volatile float _Complex *, float _Complex ); 668 void ?{}( double _Complex *, double _Complex), ?{}( volatile double _Complex *, double _Complex ); 669 void ?{}( long double _Complex *, long double _Complex), ?{}( volatile long double _Complex *, long double _Complex ); 670 671 // dtor 672 void ^?{}( _Bool * ), ^?{}( volatile _Bool * ); 673 void ^?{}( signed int * ), ^?{}( volatile signed int * ); 674 void ^?{}( unsigned int * ), ^?{}( volatile unsigned int * ); 675 void ^?{}( signed long int * ), ^?{}( volatile signed long int * ); 676 void ^?{}( unsigned long int * ), ^?{}( volatile unsigned long int * ); 677 void ^?{}( signed long long int * ), ^?{}( volatile signed long long int * ); 678 void ^?{}( unsigned long long int * ), ^?{}( volatile unsigned long long int * ); 679 void ^?{}( float * ), ^?{}( volatile float * ); 680 void ^?{}( double * ), ^?{}( volatile double * ); 681 void ^?{}( long double * ), ^?{}( volatile long double * ); 682 void ^?{}( float _Complex * ), ^?{}( volatile float _Complex * ); 683 void ^?{}( double _Complex * ), ^?{}( volatile double _Complex * ); 684 void ^?{}( long double _Complex * ), ^?{}( volatile long double _Complex * ); 685 686 // // default ctor 687 // forall( dtype DT ) void ?{}( DT ** ); 688 // forall( dtype DT ) void ?{}( const DT ** ); 689 // forall( dtype DT ) void ?{}( volatile DT ** ); 690 // forall( dtype DT ) void ?{}( const volatile DT ** ); 691 692 // // copy ctor 693 // forall( dtype DT ) void ?{}( DT **, DT* ); 694 // forall( dtype DT ) void ?{}( const DT **, DT* ); 695 // forall( dtype DT ) void ?{}( volatile DT **, DT* ); 696 // forall( dtype DT ) void ?{}( const volatile DT **, DT* ); 697 698 // // dtor 699 // forall( dtype DT ) void ^?{}( DT ** ); 700 // forall( dtype DT ) void ^?{}( const DT ** ); 701 // forall( dtype DT ) void ^?{}( volatile DT ** ); 702 // forall( dtype DT ) void ^?{}( const volatile DT ** ); 703 704 // copied from assignment section 705 // copy constructors 706 forall( ftype FT ) void ?{}( FT **, FT * ); 707 forall( ftype FT ) void ?{}( FT * volatile *, FT * ); 708 709 forall( dtype DT ) void ?{}( DT * *, DT * ); 710 forall( dtype DT ) void ?{}( DT * volatile *, DT * ); 711 forall( dtype DT ) void ?{}( const DT * *, DT * ); 712 forall( dtype DT ) void ?{}( const DT * volatile *, DT * ); 713 forall( dtype DT ) void ?{}( const DT * *, const DT * ); 714 forall( dtype DT ) void ?{}( const DT * volatile *, const DT * ); 715 forall( dtype DT ) void ?{}( volatile DT * *, DT * ); 716 forall( dtype DT ) void ?{}( volatile DT * volatile *, DT * ); 717 forall( dtype DT ) void ?{}( volatile DT * *, volatile DT * ); 718 forall( dtype DT ) void ?{}( volatile DT * volatile *, volatile DT * ); 719 720 forall( dtype DT ) void ?{}( const volatile DT * *, DT * ); 721 forall( dtype DT ) void ?{}( const volatile DT * volatile *, DT * ); 722 forall( dtype DT ) void ?{}( const volatile DT * *, const DT * ); 723 forall( dtype DT ) void ?{}( const volatile DT * volatile *, const DT * ); 724 forall( dtype DT ) void ?{}( const volatile DT * *, volatile DT * ); 725 forall( dtype DT ) void ?{}( const volatile DT * volatile *, volatile DT * ); 726 forall( dtype DT ) void ?{}( const volatile DT * *, const volatile DT * ); 727 forall( dtype DT ) void ?{}( const volatile DT * volatile *, const volatile DT * ); 728 729 forall( dtype DT ) void ?{}( DT * *, void * ); 730 forall( dtype DT ) void ?{}( DT * volatile *, void * ); 731 forall( dtype DT ) void ?{}( const DT * *, void * ); 732 forall( dtype DT ) void ?{}( const DT * volatile *, void * ); 733 forall( dtype DT ) void ?{}( const DT * *, const void * ); 734 forall( dtype DT ) void ?{}( const DT * volatile *, const void * ); 735 forall( dtype DT ) void ?{}( volatile DT * *, void * ); 736 forall( dtype DT ) void ?{}( volatile DT * volatile *, void * ); 737 forall( dtype DT ) void ?{}( volatile DT * *, volatile void * ); 738 forall( dtype DT ) void ?{}( volatile DT * volatile *, volatile void * ); 739 740 forall( dtype DT ) void ?{}( const volatile DT * *, void * ); 741 forall( dtype DT ) void ?{}( const volatile DT * volatile *, void * ); 742 forall( dtype DT ) void ?{}( const volatile DT * *, const void * ); 743 forall( dtype DT ) void ?{}( const volatile DT * volatile *, const void * ); 744 forall( dtype DT ) void ?{}( const volatile DT * *, volatile void * ); 745 forall( dtype DT ) void ?{}( const volatile DT * volatile *, volatile void * ); 746 forall( dtype DT ) void ?{}( const volatile DT * *, const volatile void * ); 747 forall( dtype DT ) void ?{}( const volatile DT * volatile *, const volatile void * ); 748 749 forall( dtype DT ) void ?{}( void * *, DT * ); 750 forall( dtype DT ) void ?{}( void * volatile *, DT * ); 751 forall( dtype DT ) void ?{}( const void * *, DT * ); 752 forall( dtype DT ) void ?{}( const void * volatile *, DT * ); 753 forall( dtype DT ) void ?{}( const void * *, const DT * ); 754 forall( dtype DT ) void ?{}( const void * volatile *, const DT * ); 755 forall( dtype DT ) void ?{}( volatile void * *, DT * ); 756 forall( dtype DT ) void ?{}( volatile void * volatile *, DT * ); 757 forall( dtype DT ) void ?{}( volatile void * *, volatile DT * ); 758 forall( dtype DT ) void ?{}( volatile void * volatile *, volatile DT * ); 759 forall( dtype DT ) void ?{}( const volatile void * *, DT * ); 760 forall( dtype DT ) void ?{}( const volatile void * volatile *, DT * ); 761 forall( dtype DT ) void ?{}( const volatile void * *, const DT * ); 762 forall( dtype DT ) void ?{}( const volatile void * volatile *, const DT * ); 763 forall( dtype DT ) void ?{}( const volatile void * *, volatile DT * ); 764 forall( dtype DT ) void ?{}( const volatile void * volatile *, volatile DT * ); 765 forall( dtype DT ) void ?{}( const volatile void * *, const volatile DT * ); 766 forall( dtype DT ) void ?{}( const volatile void * volatile *, const volatile DT * ); 767 768 void ?{}( void * *, void * ); 769 void ?{}( void * volatile *, void * ); 770 void ?{}( const void * *, void * ); 771 void ?{}( const void * volatile *, void * ); 772 void ?{}( const void * *, const void * ); 773 void ?{}( const void * volatile *, const void * ); 774 void ?{}( volatile void * *, void * ); 775 void ?{}( volatile void * volatile *, void * ); 776 void ?{}( volatile void * *, volatile void * ); 777 void ?{}( volatile void * volatile *, volatile void * ); 778 void ?{}( const volatile void * *, void * ); 779 void ?{}( const volatile void * volatile *, void * ); 780 void ?{}( const volatile void * *, const void * ); 781 void ?{}( const volatile void * volatile *, const void * ); 782 void ?{}( const volatile void * *, volatile void * ); 783 void ?{}( const volatile void * volatile *, volatile void * ); 784 void ?{}( const volatile void * *, const volatile void * ); 785 void ?{}( const volatile void * volatile *, const volatile void * ); 786 787 //forall( dtype DT ) void ?{}( DT * *, forall( dtype DT2 ) const DT2 * ); 788 //forall( dtype DT ) void ?{}( DT * volatile *, forall( dtype DT2 ) const DT2 * ); 789 forall( dtype DT ) void ?{}( const DT * *, forall( dtype DT2 ) const DT2 * ); 790 forall( dtype DT ) void ?{}( const DT * volatile *, forall( dtype DT2 ) const DT2 * ); 791 //forall( dtype DT ) void ?{}( volatile DT * *, forall( dtype DT2 ) const DT2 * ); 792 //forall( dtype DT ) void ?{}( volatile DT * volatile *, forall( dtype DT2 ) const DT2 * ); 793 forall( dtype DT ) void ?{}( const volatile DT * *, forall( dtype DT2 ) const DT2 * ); 794 forall( dtype DT ) void ?{}( const volatile DT * volatile *, forall( dtype DT2 ) const DT2 * ); 795 796 forall( ftype FT ) void ?{}( FT * *, forall( ftype FT2 ) FT2 * ); 797 forall( ftype FT ) void ?{}( FT * volatile *, forall( ftype FT2 ) FT2 * ); 798 799 // default ctors 800 forall( ftype FT ) void ?{}( FT * * ); 801 forall( ftype FT ) void ?{}( FT * volatile * ); 802 803 forall( dtype DT ) void ?{}( DT * *); 804 forall( dtype DT ) void ?{}( DT * volatile *); 805 forall( dtype DT ) void ?{}( const DT * *); 806 forall( dtype DT ) void ?{}( const DT * volatile *); 807 forall( dtype DT ) void ?{}( volatile DT * *); 808 forall( dtype DT ) void ?{}( volatile DT * volatile *); 809 forall( dtype DT ) void ?{}( const volatile DT * *); 810 forall( dtype DT ) void ?{}( const volatile DT * volatile *); 811 812 forall( dtype DT ) void ?{}( DT (*)[] ); // xxx - probably incomplete 813 forall( dtype DT ) void ?{}( const DT (*)[] ); 814 forall( dtype DT ) void ?{}( volatile DT (*)[] ); 815 forall( dtype DT ) void ?{}( const volatile DT (*)[] ); 816 817 void ?{}( void * *); 818 void ?{}( void * volatile *); 819 void ?{}( const void * *); 820 void ?{}( const void * volatile *); 821 void ?{}( volatile void * *); 822 void ?{}( volatile void * volatile *); 823 void ?{}( const volatile void * *); 824 void ?{}( const volatile void * volatile *); 825 826 // dtors 827 forall( ftype FT ) void ^?{}( FT * * ); 828 forall( ftype FT ) void ^?{}( FT * volatile * ); 829 830 forall( dtype DT ) void ^?{}( DT * *); 831 forall( dtype DT ) void ^?{}( DT * volatile *); 832 forall( dtype DT ) void ^?{}( const DT * *); 833 forall( dtype DT ) void ^?{}( const DT * volatile *); 834 forall( dtype DT ) void ^?{}( volatile DT * *); 835 forall( dtype DT ) void ^?{}( volatile DT * volatile *); 836 forall( dtype DT ) void ^?{}( const volatile DT * *); 837 forall( dtype DT ) void ^?{}( const volatile DT * volatile *); 838 839 forall( dtype DT ) void ^?{}( DT (*) [] ); // xxx - probably incomplete 840 forall( dtype DT ) void ^?{}( const DT (*)[] ); 841 forall( dtype DT ) void ^?{}( volatile DT (*)[] ); 842 forall( dtype DT ) void ^?{}( const volatile DT (*)[] ); 843 844 845 void ^?{}( void * *); 846 void ^?{}( void * volatile *); 847 void ^?{}( const void * *); 848 void ^?{}( const void * volatile *); 849 void ^?{}( volatile void * *); 850 void ^?{}( volatile void * volatile *); 851 void ^?{}( const volatile void * *); 852 void ^?{}( const volatile void * volatile *); -
src/main.cc
rac1ed49 rc14cff1 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // main.cc -- 7 // main.cc -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Fri May 15 23:12:02 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Wed Jan 27 22:20:20201613 // Update Count : 19911 // Last Modified By : Rob Schluntz 12 // Last Modified On : Tue Feb 09 13:28:11 2016 13 // Update Count : 200 14 14 // 15 15 … … 41 41 #include "InitTweak/Mutate.h" 42 42 #include "InitTweak/RemoveInit.h" 43 #include "InitTweak/FixInit.h" 43 44 //#include "Explain/GenProlog.h" 44 45 //#include "Try/Visit.h" … … 60 61 astp = false, 61 62 bresolvep = false, 63 ctorinitp = false, 62 64 exprp = false, 63 65 expraltp = false, … … 74 76 codegenp = false; 75 77 76 enum { Ast, Bresolver, Expr, ExprAlt, Grammar, LibCFA, Nopreamble, Parse, Prototypes, Resolver, Symbol, Tree, Validate, };78 enum { Ast, Bresolver, CtorInitFix, Expr, ExprAlt, Grammar, LibCFA, Nopreamble, Parse, Prototypes, Resolver, Symbol, Tree, Validate, }; 77 79 78 80 static struct option long_opts[] = { 79 81 { "ast", no_argument, 0, Ast }, 80 82 { "before-resolver", no_argument, 0, Bresolver }, 83 { "ctorinitfix", no_argument, 0, CtorInitFix }, 81 84 { "expr", no_argument, 0, Expr }, 82 85 { "expralt", no_argument, 0, ExprAlt }, … … 100 103 101 104 opterr = 0; // prevent getopt from printing error messages 102 105 103 106 int c; 104 while ( (c = getopt_long( argc, argv, "ab efglnpqrstvyzD:", long_opts, &long_index )) != -1 ) {107 while ( (c = getopt_long( argc, argv, "abcefFglnpqrstvyzD:", long_opts, &long_index )) != -1 ) { 105 108 switch ( c ) { 106 109 case Ast: … … 111 114 case 'b': // print before resolver steps 112 115 bresolvep = true; 116 break; 117 case CtorInitFix: 118 case 'c': 119 ctorinitp = true; 113 120 break; 114 121 case Expr: … … 187 194 output = new ofstream( argv[ optind ] ); 188 195 } // if 189 196 190 197 Parser::get_parser().set_debug( grammarp ); 191 198 … … 208 215 exit( 1 ); 209 216 } // if 210 217 211 218 parse( prelude, LinkageSpec::Intrinsic ); 212 219 } // if 213 220 } // if 214 221 215 parse( input, libcfap ? LinkageSpec::Intrinsic : LinkageSpec::Cforall, grammarp ); 216 222 parse( input, libcfap ? LinkageSpec::Intrinsic : LinkageSpec::Cforall, grammarp ); 223 217 224 if ( parsep ) { 218 225 Parser::get_parser().get_parseTree()->printList( std::cout ); … … 249 256 OPTPRINT( "mutate" ) 250 257 ControlStruct::mutate( translationUnit ); 251 OPTPRINT( "fixNames" ) 258 OPTPRINT( "fixNames" ) 252 259 CodeGen::fixNames( translationUnit ); 253 OPTPRINT( "tweak " )260 OPTPRINT( "tweakInit" ) 254 261 InitTweak::tweak( translationUnit ); 255 262 … … 268 275 if ( exprp ) { 269 276 dump( translationUnit ); 277 return 0; 278 } 279 280 OPTPRINT( "fixInit" ) 281 // fix ObjectDecl - replaces ConstructorInit nodes 282 InitTweak::fix( translationUnit ); 283 if ( ctorinitp ) { 284 dump ( translationUnit ); 285 return 0; 270 286 } 271 287 … … 278 294 OPTPRINT( "box" ) 279 295 GenPoly::box( translationUnit ); 280 296 281 297 // print tree right before code generation 282 298 if ( codegenp ) { … … 334 350 std::list< Declaration * > decls; 335 351 if ( noprotop ) { 336 filter( translationUnit.begin(), translationUnit.end(), 352 filter( translationUnit.begin(), translationUnit.end(), 337 353 std::back_inserter( decls ), notPrelude ); 338 354 } else {
Note: See TracChangeset
for help on using the changeset viewer.