Changes in / [c14cff1:ac1ed49]
- Location:
- src
- Files:
-
- 2 deleted
- 33 edited
-
CodeGen/CodeGenerator.cc (modified) (35 diffs)
-
CodeGen/OperatorTable.cc (modified) (2 diffs)
-
CodeGen/OperatorTable.h (modified) (2 diffs)
-
GenPoly/Box.cc (modified) (5 diffs)
-
GenPoly/Specialize.cc (modified) (2 diffs)
-
InitTweak/FixInit.cc (deleted)
-
InitTweak/FixInit.h (deleted)
-
InitTweak/InitModel.cc (modified) (3 diffs)
-
InitTweak/RemoveInit.cc (modified) (9 diffs)
-
InitTweak/RemoveInit.h (modified) (2 diffs)
-
InitTweak/module.mk (modified) (1 diff)
-
MakeLibCfa.cc (modified) (6 diffs)
-
Makefile.in (modified) (7 diffs)
-
Parser/DeclarationNode.cc (modified) (7 diffs)
-
Parser/InitializerNode.cc (modified) (5 diffs)
-
Parser/ParseNode.h (modified) (7 diffs)
-
Parser/TypeData.cc (modified) (3 diffs)
-
Parser/parser.cc (modified) (3 diffs)
-
Parser/parser.yy (modified) (3 diffs)
-
ResolvExpr/Resolver.cc (modified) (14 diffs)
-
SymTab/Validate.cc (modified) (14 diffs)
-
SynTree/Declaration.h (modified) (1 diff)
-
SynTree/Initializer.cc (modified) (5 diffs)
-
SynTree/Initializer.h (modified) (7 diffs)
-
SynTree/Mutator.cc (modified) (2 diffs)
-
SynTree/Mutator.h (modified) (3 diffs)
-
SynTree/ObjectDecl.cc (modified) (4 diffs)
-
SynTree/SynTree.h (modified) (2 diffs)
-
SynTree/Visitor.cc (modified) (2 diffs)
-
SynTree/Visitor.h (modified) (3 diffs)
-
initialization.txt (modified) (1 diff)
-
libcfa/Makefile.am (modified) (3 diffs)
-
libcfa/Makefile.in (modified) (4 diffs)
-
libcfa/prelude.cf (modified) (3 diffs)
-
main.cc (modified) (12 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/CodeGen/CodeGenerator.cc
rc14cff1 rac1ed49 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 : Rob Schluntz12 // Last Modified On : Tue Feb 09 13:24:40 201613 // Update Count : 2 5511 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Jan 25 21:22:00 2016 13 // Update Count : 242 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 or constructors or destructors260 // there are no intrinsic definitions of the function call operator 261 261 assert( false ); 262 262 break; 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 263 281 264 case OT_PREFIX: 282 265 case OT_PREFIXASSIGN: … … 287 270 output << ")"; 288 271 break; 289 272 290 273 case OT_POSTFIX: 291 274 case OT_POSTFIXASSIGN: … … 294 277 output << opInfo.symbol; 295 278 break; 296 297 279 298 280 case OT_INFIX: … … 305 287 output << ")"; 306 288 break; 307 289 308 290 case OT_CONSTANT: 309 291 case OT_LABELADDRESS: … … 324 306 } // if 325 307 } 326 308 327 309 void CodeGenerator::visit( UntypedExpr *untypedExpr ) { 328 310 if ( NameExpr *nameExpr = dynamic_cast< NameExpr* >( untypedExpr->get_function() ) ) { … … 338 320 output << "]"; 339 321 break; 340 322 341 323 case OT_CALL: 342 324 assert( false ); 343 344 case OT_CTOR: 345 case OT_DTOR: 346 // intrinsic constructors should never be called 347 // intrinsic destructors do nothing 348 break; 349 325 break; 326 350 327 case OT_PREFIX: 351 328 case OT_PREFIXASSIGN: … … 357 334 output << ")"; 358 335 break; 359 336 360 337 case OT_POSTFIX: 361 338 case OT_POSTFIXASSIGN: … … 364 341 output << opInfo.symbol; 365 342 break; 366 343 367 344 case OT_INFIX: 368 345 case OT_INFIXASSIGN: … … 374 351 output << ")"; 375 352 break; 376 353 377 354 case OT_CONSTANT: 378 355 // there are no intrinsic definitions of 0 or 1 as functions … … 392 369 } // if 393 370 } 394 371 395 372 void CodeGenerator::visit( NameExpr *nameExpr ) { 396 373 OperatorInfo opInfo; … … 402 379 } // if 403 380 } 404 381 405 382 void CodeGenerator::visit( AddressExpr *addressExpr ) { 406 383 output << "(&"; … … 431 408 output << ")"; 432 409 } 433 410 434 411 void CodeGenerator::visit( UntypedMemberExpr *memberExpr ) { 435 412 assert( false ); 436 413 } 437 414 438 415 void CodeGenerator::visit( MemberExpr *memberExpr ) { 439 416 memberExpr->get_aggregate()->accept( *this ); 440 417 output << "." << mangleName( memberExpr->get_member() ); 441 418 } 442 419 443 420 void CodeGenerator::visit( VariableExpr *variableExpr ) { 444 421 OperatorInfo opInfo; … … 449 426 } // if 450 427 } 451 428 452 429 void CodeGenerator::visit( ConstantExpr *constantExpr ) { 453 430 assert( constantExpr->get_constant() ); 454 431 constantExpr->get_constant()->accept( *this ); 455 432 } 456 433 457 434 void CodeGenerator::visit( SizeofExpr *sizeofExpr ) { 458 435 output << "sizeof("; … … 487 464 output << ")"; 488 465 } 489 466 490 467 void CodeGenerator::visit( LogicalExpr *logicalExpr ) { 491 468 output << "("; … … 499 476 output << ")"; 500 477 } 501 478 502 479 void CodeGenerator::visit( ConditionalExpr *conditionalExpr ) { 503 480 output << "("; … … 509 486 output << ")"; 510 487 } 511 488 512 489 void CodeGenerator::visit( CommaExpr *commaExpr ) { 513 490 output << "("; … … 517 494 output << ")"; 518 495 } 519 496 520 497 void CodeGenerator::visit( TupleExpr *tupleExpr ) {} 521 498 522 499 void CodeGenerator::visit( TypeExpr *typeExpr ) {} 523 500 … … 550 527 } 551 528 } 552 cur_indent -= CodeGenerator::tabsize; 529 cur_indent -= CodeGenerator::tabsize; 553 530 554 531 output << indent << "}"; … … 556 533 557 534 void CodeGenerator::visit( ExprStmt *exprStmt ) { 558 // I don't see why this check is necessary. 559 // If this starts to cause problems then put it back in, 535 // I don't see why this check is necessary. 536 // If this starts to cause problems then put it back in, 560 537 // with an explanation 561 538 assert( exprStmt ); … … 607 584 switchStmt->get_condition()->accept( *this ); 608 585 output << " ) "; 609 586 610 587 output << "{" << std::endl; 611 588 cur_indent += CodeGenerator::tabsize; … … 627 604 } // if 628 605 output << ":\n"; 629 606 630 607 std::list<Statement *> sts = caseStmt->get_statements(); 631 608 … … 644 621 if ( ! branchStmt->get_target().empty() ) 645 622 output << "goto " << branchStmt->get_target(); 646 else { 623 else { 647 624 if ( branchStmt->get_computedTarget() != 0 ) { 648 625 output << "goto *"; … … 695 672 696 673 void CodeGenerator::visit( ForStmt *forStmt ) { 697 // initialization is always hoisted, so don't 698 // bother doing anything with that 674 // initialization is always hoisted, so don't 675 // bother doing anything with that 699 676 output << "for (;"; 700 677 … … 720 697 void CodeGenerator::visit( DeclStmt *declStmt ) { 721 698 declStmt->get_decl()->accept( *this ); 722 699 723 700 if ( doSemicolon( declStmt->get_decl() ) ) { 724 701 output << ";"; -
src/CodeGen/OperatorTable.cc
rc14cff1 rac1ed49 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Tue Oct 06 15:26:34 201513 // Update Count : 911 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Jun 23 17:41:14 2015 13 // Update Count : 5 14 14 // 15 15 … … 21 21 const OperatorInfo tableValues[] = { 22 22 { "?[?]", "", "_operator_index", OT_INDEX }, 23 { "?{}", "", "_constructor", OT_CTOR },24 { "^?{}", "", "_destructor", OT_DTOR }, // ~?{}, -?{}, !?{}, $?{}, ??{}, ^?{}, ?destroy, ?delete25 23 { "?()", "", "_operator_call", OT_CALL }, 26 24 { "?++", "++", "_operator_postincr", OT_POSTFIXASSIGN }, -
src/CodeGen/OperatorTable.h
rc14cff1 rac1ed49 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Wed Jun 24 16:17:57 201513 // Update Count : 511 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Jun 23 16:09:27 2015 13 // Update Count : 3 14 14 // 15 15 … … 22 22 enum OperatorType { 23 23 OT_INDEX, 24 OT_CTOR,25 OT_DTOR,26 24 OT_CALL, 27 25 OT_PREFIX, -
src/GenPoly/Box.cc
rc14cff1 rac1ed49 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Tue Feb 09 14:39:52201613 // Update Count : 2 9511 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Feb 5 16:45:07 2016 13 // Update Count : 286 14 14 // 15 15 … … 401 401 402 402 Expression *Pass1::makeOffsetArray( StructInstType *ty ) { 403 std::list<Expression*> noDesignators;404 403 std::list< Declaration* > &baseMembers = ty->get_baseStruct()->get_members(); 405 404 … … 420 419 memberDecl = new ObjectDecl( (*member)->get_name(), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, offsetType->clone(), 0 ); 421 420 } 422 inits.push_back( new SingleInit( new OffsetofExpr( ty->clone(), memberDecl ) , noDesignators) );423 } 424 arrayTemp->set_init( new ListInit( inits , noDesignators) );421 inits.push_back( new SingleInit( new OffsetofExpr( ty->clone(), memberDecl ) ) ); 422 } 423 arrayTemp->set_init( new ListInit( inits ) ); 425 424 426 425 // return variable pointing to temporary … … 1372 1371 1373 1372 std::list<Expression*> designators; 1374 objectDecl->set_init( new SingleInit( alloc, designators , false ) ); // not constructed1373 objectDecl->set_init( new SingleInit( alloc, designators ) ); 1375 1374 } 1376 1375 } … … 1413 1412 return derefdVar; 1414 1413 } 1415 1414 1416 1415 Expression *MemberExprFixer::mutate( MemberExpr *memberExpr ) { 1417 1416 // mutate, exiting early if no longer MemberExpr -
src/GenPoly/Specialize.cc
rc14cff1 rac1ed49 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 3:00:00201613 // Update Count : 2412 // Last Modified On : Wed Jan 20 12:40:33 2016 13 // Update Count : 18 14 14 // 15 15 … … 142 142 143 143 Expression * Specialize::doSpecialization( Type *formalType, Expression *actual, InferredParams *inferParams ) { 144 assert( ! actual->get_results().empty() ); // using front, should have this assert144 assert( ! actual->get_results().empty() ); 145 145 if ( needsSpecialization( formalType, actual->get_results().front(), env ) ) { 146 146 FunctionType *funType; -
src/InitTweak/InitModel.cc
rc14cff1 rac1ed49 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 : Rob Schluntz12 // Last Modified On : T hu Jan 07 13:38:46 201613 // Update Count : 511 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue May 19 16:37:08 2015 13 // Update Count : 1 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 , false ); // cannot be constructed200 init = new SingleInit( single->get_expr(), empty ); 201 201 return; 202 202 } … … 214 214 } // if 215 215 216 std::list< Expression * > desig; 217 init = new ListInit( contents, desig, false ); // cannot be constructed 216 init = new ListInit( contents ); 218 217 return; 219 218 } -
src/InitTweak/RemoveInit.cc
rc14cff1 rac1ed49 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 : Rob Schluntz12 // Last Modified On : Tue Feb 09 15:12:29 201613 // Update Count : 1 6611 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Dec 15 15:37:26 2015 13 // Update Count : 15 14 14 // 15 15 16 #include <stack>17 #include <list>18 16 #include "RemoveInit.h" 19 17 #include "SynTree/Declaration.h" … … 23 21 #include "SynTree/Initializer.h" 24 22 #include "SynTree/Mutator.h" 25 #include "GenPoly/PolyMutator.h"26 23 27 24 namespace InitTweak { … … 29 26 const std::list<Label> noLabels; 30 27 } 31 32 class RemoveInit : public GenPoly::PolyMutator {28 29 class RemoveInit : public Mutator { 33 30 public: 34 /// removes and replaces initialization for polymorphic value objects35 /// with assignment (TODO: constructor) statements.36 /// also consistently allocates a temporary variable for the return value37 /// of a function so that anything which the resolver decides can be assigned38 /// into the return type of a function can be returned.39 static void removeInitializers( std::list< Declaration * > &translationUnit );40 41 31 RemoveInit(); 42 virtual ObjectDecl * mutate( ObjectDecl *objDecl);32 virtual ObjectDecl * mutate(ObjectDecl *objDecl); 43 33 virtual DeclarationWithType * mutate( FunctionDecl *functionDecl ); 44 34 45 35 virtual Statement * mutate( ReturnStmt * returnStmt ); 36 37 virtual CompoundStmt * mutate(CompoundStmt * compoundStmt); 38 39 protected: 40 std::list< Statement* > stmtsToAddBefore; 41 std::list< Statement* > stmtsToAddAfter; 42 void mutateStatementList( std::list< Statement* > &statements ); 46 43 47 protected:48 44 std::list<DeclarationWithType*> returnVals; 49 45 UniqueName tempNamer; … … 51 47 }; 52 48 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 ) { 49 void tweak( std::list< Declaration * > translationUnit ) { 87 50 RemoveInit remover; 88 51 mutateAll( translationUnit, remover ); … … 90 53 91 54 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 } // if 61 *i = (*i)->acceptMutator( *this ); 62 if ( ! stmtsToAddBefore.empty() ) { 63 statements.splice( i, stmtsToAddBefore ); 64 } // if 65 } // for 66 if ( ! stmtsToAddAfter.empty() ) { 67 statements.splice( statements.end(), stmtsToAddAfter ); 68 } // if 69 } 70 71 CompoundStmt *RemoveInit::mutate(CompoundStmt *compoundStmt) { 72 mutateStatementList( compoundStmt->get_kids() ); 73 return compoundStmt; 74 } 92 75 93 76 // in the case where an object has an initializer and a polymorphic type, insert an assignment immediately after the … … 96 79 if (objDecl->get_init() && dynamic_cast<TypeInstType*>(objDecl->get_type())) { 97 80 if (SingleInit * single = dynamic_cast<SingleInit*>(objDecl->get_init())) { 98 // xxx this can be more complicated - consider ListInit 99 UntypedExpr *assign = new UntypedExpr( new NameExpr( "?{}" ) ); 81 UntypedExpr *assign = new UntypedExpr( new NameExpr( "?=?" ) ); 100 82 assign->get_args().push_back( new AddressExpr (new NameExpr( objDecl->get_name() ) ) ); 101 83 assign->get_args().push_back( single->get_value()->clone() ); … … 111 93 // hands off if the function returns an lvalue - we don't want to allocate a temporary if a variable's address 112 94 // is being returned 113 // xxx - this should construct rather than assign114 95 if ( returnStmt->get_expr() && returnVals.size() == 1 && funcName != "?=?" && ! returnVals.front()->get_type()->get_isLvalue() ) { 115 96 ObjectDecl *newObj = new ObjectDecl( tempNamer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::C, 0, returnVals.front()->get_type()->clone(), 0 ); 116 stmtsToAdd .push_back( new DeclStmt( noLabels, newObj ) );117 97 stmtsToAddBefore.push_back( new DeclStmt( noLabels, newObj ) ); 98 118 99 UntypedExpr *assign = new UntypedExpr( new NameExpr( "?=?" ) ); 119 100 assign->get_args().push_back( new AddressExpr (new NameExpr( newObj->get_name() ) ) ); 120 101 assign->get_args().push_back( returnStmt->get_expr() ); 121 stmtsToAdd .push_back(new ExprStmt(noLabels, assign));102 stmtsToAddBefore.push_back(new ExprStmt(noLabels, assign)); 122 103 123 104 returnStmt->set_expr( new VariableExpr( newObj ) ); … … 129 110 std::list<DeclarationWithType*> oldReturnVals = returnVals; 130 111 std::string oldFuncName = funcName; 131 112 132 113 FunctionType * type = functionDecl->get_functionType(); 133 114 returnVals = type->get_returnVals(); … … 138 119 return decl; 139 120 } 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 designations150 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 inits177 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 exist198 // if ctor does exist, want to use ctor expression instead of init199 // push this decision to the resolver200 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 globals204 // hack: implicit "static" initialization routine for each struct type? or something similar?205 // --ties into module system206 }207 }208 return objDecl;209 }210 211 DeclarationWithType * CtorDtor::mutate( FunctionDecl *functionDecl ) {212 // parameters should not be constructed and destructed, so don't mutate FunctionType213 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, since226 // return/break/goto should trigger destructor when block is left.227 statements.splice( statements.end(), destructorStmts );228 } // if229 return ret;230 }231 232 // should not traverse into any of these declarations to find objects233 // that need to be constructed or destructed234 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 241 121 } // namespace InitTweak 242 122 -
src/InitTweak/RemoveInit.h
rc14cff1 rac1ed49 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 : Rob Schluntz12 // Last Modified On : Mon Jan 11 16:02:44 201613 // Update Count : 311 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Nov 27 17:00:47 2015 13 // Update Count : 2 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
rc14cff1 rac1ed49 11 11 ## Created On : Mon Jun 1 17:49:17 2015 12 12 ## Last Modified By : Rob Schluntz 13 ## Last Modified On : Wed Jan 13 16:29:03201614 ## Update Count : 313 ## Last Modified On : Mon Jan 11 14:40:16 2016 14 ## Update Count : 2 15 15 ############################################################################### 16 16 17 SRC += InitTweak/RemoveInit.cc \18 InitTweak/FixInit.cc 17 SRC += InitTweak/RemoveInit.cc 18 -
src/MakeLibCfa.cc
rc14cff1 rac1ed49 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 : Rob Schluntz12 // Last Modified On : Tue Jan 19 13:20:26 201613 // Update Count : 4014 // 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Jun 26 16:52:59 2015 13 // Update Count : 14 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 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 ); 56 if ( (*param)->get_name() == "" ) { 57 (*param)->set_name( paramNamer.newName() ); 58 (*param)->set_linkage( LinkageSpec::C ); 59 } // if 66 60 67 61 switch ( opInfo.type ) { … … 71 65 case CodeGen::OT_POSTFIX: 72 66 case CodeGen::OT_INFIX: 67 newExpr->get_args().push_back( new VariableExpr( *param ) ); 68 break; 73 69 case CodeGen::OT_PREFIXASSIGN: 74 70 case CodeGen::OT_POSTFIXASSIGN: 75 71 case CodeGen::OT_INFIXASSIGN: 76 funcDecl->get_statements()->get_kids().push_back( new ReturnStmt( std::list< Label >(), newExpr ) ); 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 ); 77 77 break; 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; 78 } 97 79 case CodeGen::OT_CONSTANT: 98 80 case CodeGen::OT_LABELADDRESS: … … 100 82 assert( false ); 101 83 } // 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 } // for 92 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 ); 102 95 } 103 96 104 97 void MakeLibCfa::visit( ObjectDecl* origObjDecl ) { 105 98 if ( origObjDecl->get_linkage() != LinkageSpec::Intrinsic ) return; 106 99 107 100 ObjectDecl *objDecl = origObjDecl->clone(); 108 101 assert( ! objDecl->get_init() ); 109 102 std::list< Expression* > noDesignators; 110 objDecl->set_init( new SingleInit( new NameExpr( objDecl->get_name() ), noDesignators , false ) ); // cannot be constructed103 objDecl->set_init( new SingleInit( new NameExpr( objDecl->get_name() ), noDesignators ) ); 111 104 newDecls.push_back( objDecl ); 112 105 } 113 106 } // namespace LibCfa 107 108 // Local Variables: // 109 // tab-width: 4 // 110 // mode: c++ // 111 // compile-command: "make install" // 112 // End: // -
src/Makefile.in
rc14cff1 rac1ed49 125 125 GenPoly/driver_cfa_cpp-DeclMutator.$(OBJEXT) \ 126 126 InitTweak/driver_cfa_cpp-RemoveInit.$(OBJEXT) \ 127 InitTweak/driver_cfa_cpp-FixInit.$(OBJEXT) \128 127 Parser/driver_cfa_cpp-parser.$(OBJEXT) \ 129 128 Parser/driver_cfa_cpp-lex.$(OBJEXT) \ … … 350 349 GenPoly/CopyParams.cc GenPoly/FindFunction.cc \ 351 350 GenPoly/InstantiateGeneric.cc GenPoly/DeclMutator.cc \ 352 InitTweak/RemoveInit.cc InitTweak/FixInit.cc Parser/parser.yy\353 Parser/ lex.ll Parser/TypedefTable.cc Parser/ParseNode.cc \351 InitTweak/RemoveInit.cc Parser/parser.yy Parser/lex.ll \ 352 Parser/TypedefTable.cc Parser/ParseNode.cc \ 354 353 Parser/DeclarationNode.cc Parser/ExpressionNode.cc \ 355 354 Parser/StatementNode.cc Parser/InitializerNode.cc \ … … 413 412 esac; \ 414 413 done; \ 415 echo ' cd $(top_srcdir) && $(AUTOMAKE) -- foreignsrc/Makefile'; \414 echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ 416 415 $(am__cd) $(top_srcdir) && \ 417 $(AUTOMAKE) -- foreignsrc/Makefile416 $(AUTOMAKE) --gnu src/Makefile 418 417 .PRECIOUS: Makefile 419 418 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status … … 571 570 InitTweak/driver_cfa_cpp-RemoveInit.$(OBJEXT): \ 572 571 InitTweak/$(am__dirstamp) InitTweak/$(DEPDIR)/$(am__dirstamp) 573 InitTweak/driver_cfa_cpp-FixInit.$(OBJEXT): InitTweak/$(am__dirstamp) \574 InitTweak/$(DEPDIR)/$(am__dirstamp)575 572 Parser/parser.h: Parser/parser.cc 576 573 @if test ! -f $@; then rm -f Parser/parser.cc; else :; fi … … 807 804 -rm -f GenPoly/driver_cfa_cpp-ScrubTyVars.$(OBJEXT) 808 805 -rm -f GenPoly/driver_cfa_cpp-Specialize.$(OBJEXT) 809 -rm -f InitTweak/driver_cfa_cpp-FixInit.$(OBJEXT)810 806 -rm -f InitTweak/driver_cfa_cpp-RemoveInit.$(OBJEXT) 811 807 -rm -f Parser/driver_cfa_cpp-DeclarationNode.$(OBJEXT) … … 916 912 @AMDEP_TRUE@@am__include@ @am__quote@GenPoly/$(DEPDIR)/driver_cfa_cpp-ScrubTyVars.Po@am__quote@ 917 913 @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@919 914 @AMDEP_TRUE@@am__include@ @am__quote@InitTweak/$(DEPDIR)/driver_cfa_cpp-RemoveInit.Po@am__quote@ 920 915 @AMDEP_TRUE@@am__include@ @am__quote@Parser/$(DEPDIR)/driver_cfa_cpp-DeclarationNode.Po@am__quote@ … … 1416 1411 @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` 1417 1412 1418 InitTweak/driver_cfa_cpp-FixInit.o: InitTweak/FixInit.cc1419 @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.cc1420 @am__fastdepCXX_TRUE@ $(am__mv) InitTweak/$(DEPDIR)/driver_cfa_cpp-FixInit.Tpo InitTweak/$(DEPDIR)/driver_cfa_cpp-FixInit.Po1421 @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.cc1424 1425 InitTweak/driver_cfa_cpp-FixInit.obj: InitTweak/FixInit.cc1426 @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.Po1428 @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 1432 1413 Parser/driver_cfa_cpp-parser.o: Parser/parser.cc 1433 1414 @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
rc14cff1 rac1ed49 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 : Rob Schluntz12 // Last Modified On : T hu Jan 07 13:18:02 201613 // Update Count : 1 3011 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Jul 14 14:46:32 2015 13 // Update Count : 126 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 100 98 } // if 101 99 … … 359 357 } // if 360 358 } 361 359 362 360 DeclarationNode *DeclarationNode::addQualifiers( DeclarationNode *q ) { 363 361 if ( q ) { … … 510 508 assert( false ); 511 509 } // switch 512 510 513 511 return this; 514 512 } … … 621 619 assert( a->type->kind == TypeData::Array ); 622 620 TypeData *lastArray = findLast( a->type ); 623 if ( type ) { 621 if ( type ) { 624 622 switch ( type->kind ) { 625 623 case TypeData::Aggregate: … … 665 663 } // if 666 664 } 667 665 668 666 DeclarationNode *DeclarationNode::addIdList( DeclarationNode *ids ) { 669 667 type = addIdListToType( type, ids ); … … 870 868 Type *DeclarationNode::buildType() const { 871 869 assert( type ); 872 870 873 871 switch ( type->kind ) { 874 872 case TypeData::Enum: -
src/Parser/InitializerNode.cc
rc14cff1 rac1ed49 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 : Rob Schluntz12 // Last Modified On : Thu Jan 07 13:32:57 201613 // Update Count : 1314 // 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Oct 8 17:18:55 2015 13 // Update Count : 4 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 ) , maybeConstructed( true ){25 : expr( _expr ), aggregate( aggrp ), designator( des ), kids( 0 ) { 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 ) , maybeConstructed( true ){34 : expr( 0 ), aggregate( aggrp ), designator( des ), kids( 0 ) { 35 35 if ( init != 0 ) 36 36 set_link(init); … … 91 91 } // if 92 92 93 return new ListInit( initlist, designlist , maybeConstructed);93 return new ListInit( initlist, designlist ); 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 , maybeConstructed);101 return new SingleInit( get_expression()->build(), designators ); 102 102 } // if 103 103 -
src/Parser/ParseNode.h
rc14cff1 rac1ed49 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 : Rob Schluntz12 // Last Modified On : Tue Feb 09 13:23:34201613 // Update Count : 18 511 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Feb 1 13:32:32 2016 13 // Update Count : 184 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,188 187 }; 189 188 … … 310 309 ValofExprNode( const ValofExprNode &other ); 311 310 ~ValofExprNode(); 312 311 313 312 virtual ValofExprNode *clone() const { return new ValofExprNode( *this ); } 314 313 … … 333 332 enum TypeClass { Type, Dtype, Ftype }; 334 333 335 static const char *storageName[]; 334 static const char *storageName[]; 336 335 static const char *qualifierName[]; 337 336 static const char *basicTypeName[]; … … 423 422 class StatementNode : public ParseNode { 424 423 public: 425 enum Type { Exp, If, Switch, Case, Default, Choose, Fallthru, 424 enum Type { Exp, If, Switch, Case, Default, Choose, Fallthru, 426 425 While, Do, For, 427 426 Goto, Continue, Break, Return, Throw, … … 521 520 ExpressionNode *get_designators() const { return designator; } 522 521 523 InitializerNode *set_maybeConstructed( bool value ) { maybeConstructed = value; return this; }524 bool get_maybeConstructed() const { return maybeConstructed; }525 526 522 InitializerNode *next_init() const { return kids; } 527 523 … … 535 531 ExpressionNode *designator; // may be list 536 532 InitializerNode *kids; 537 bool maybeConstructed;538 533 }; 539 534 -
src/Parser/TypeData.cc
rc14cff1 rac1ed49 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 : Rob Schluntz12 // Last Modified On : T hu Jan 14 10:43:42 201613 // Update Count : 3 611 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Jul 14 14:57:23 2015 13 // Update Count : 32 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' tyvars439 // add assignment operator: T * ?=?(T *, T)440 438 FunctionType *assignType = new FunctionType( Type::Qualifiers(), false ); 441 439 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 ) ); … … 443 441 assignType->get_returnVals().push_back( new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new TypeInstType( Type::Qualifiers(), (*i)->get_name(), *i ), 0 ) ); 444 442 (*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 ) );461 443 } // if 462 444 } // for -
src/Parser/parser.cc
rc14cff1 rac1ed49 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 84"parser.yy"7356 { (yyval.in) = (yyvsp[(2) - (2)].in) ->set_maybeConstructed( false ); }7355 #line 1690 "parser.yy" 7356 { (yyval.in) = (yyvsp[(2) - (2)].in); } 7357 7357 break; 7358 7358 -
src/Parser/parser.yy
rc14cff1 rac1ed49 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 ->set_maybeConstructed( false ); }1690 { $$ = $2; } 1691 1691 ; 1692 1692 -
src/ResolvExpr/Resolver.cc
rc14cff1 rac1ed49 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 : Rob Schluntz12 // Last Modified On : T hu Jan 14 16:45:32 201613 // Update Count : 20311 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Feb 9 21:57:52 2016 13 // Update Count : 179 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 );57 56 private: 58 57 typedef std::list< Initializer * >::iterator InitIterator; … … 60 59 void resolveAggrInit( AggregateDecl *, InitIterator &, InitIterator & ); 61 60 void resolveSingleAggrInit( Declaration *, InitIterator &, InitIterator & ); 62 void fallbackInit( ConstructorInit * ctorInit );63 61 64 62 std::list< Type * > functionReturn; … … 97 95 return newExpr; 98 96 } 99 97 100 98 Expression *findSingleExpression( Expression *untyped, const SymTab::Indexer &indexer ) { 101 99 TypeEnvironment env; … … 128 126 } // if 129 127 } 130 128 131 129 Expression *findIntegralExpression( Expression *untyped, const SymTab::Indexer &indexer ) { 132 130 TypeEnvironment env; … … 161 159 return newExpr; 162 160 } 163 164 } 165 161 162 } 163 166 164 void Resolver::visit( ObjectDecl *objectDecl ) { 167 165 Type *new_type = resolveTypeof( objectDecl->get_type(), *this ); … … 253 251 forStmt->set_condition( newExpr ); 254 252 } // if 255 253 256 254 if ( forStmt->get_increment() ) { 257 255 Expression * newExpr = findVoidExpression( forStmt->get_increment(), *this ); … … 267 265 delete switchStmt->get_condition(); 268 266 switchStmt->set_condition( newExpr ); 269 267 270 268 visitor.Visitor::visit( switchStmt ); 271 269 } … … 309 307 bool isCharType( T t ) { 310 308 if ( BasicType * bt = dynamic_cast< BasicType * >( t ) ) { 311 return bt->get_kind() == BasicType::Char || bt->get_kind() == BasicType::SignedChar || 309 return bt->get_kind() == BasicType::Char || bt->get_kind() == BasicType::SignedChar || 312 310 bt->get_kind() == BasicType::UnsignedChar; 313 311 } … … 321 319 string n = ne->get_name(); 322 320 if (n == "0") { 323 initContext = new BasicType(Type::Qualifiers(), 321 initContext = new BasicType(Type::Qualifiers(), 324 322 BasicType::SignedInt); 325 323 } else { … … 327 325 initContext = decl->get_type(); 328 326 } 329 } else if (ConstantExpr * e = 327 } else if (ConstantExpr * e = 330 328 dynamic_cast<ConstantExpr*>(singleInit->get_value())) { 331 329 Constant *c = e->get_constant(); … … 350 348 singleInit->set_value( ce->get_arg() ); 351 349 ce->set_arg( NULL ); 352 delete ce; 350 delete ce; 353 351 } 354 352 } … … 466 464 #endif 467 465 } 468 469 // ConstructorInit - fall back on C-style initializer470 void Resolver::fallbackInit( ConstructorInit * ctorInit ) {471 // could not find valid constructor, or found an intrinsic constructor472 // fall back on C-style initializer473 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-style491 // initializer so that code generation is easy to handle492 fallbackInit( ctorInit );493 return;494 }495 }496 }497 // found a constructor - can get rid of C-style initializer498 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 found505 assert(false);506 }507 }508 466 } // namespace ResolvExpr 509 467 -
src/SymTab/Validate.cc
rc14cff1 rac1ed49 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 21:50:04 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Mon Feb 22 12:26:37201613 // Update Count : 2 9711 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Jan 27 22:03:12 2016 13 // Update Count : 225 14 14 // 15 15 … … 202 202 }; 203 203 204 class VerifyCtorDtor : public Visitor {205 public:206 /// ensure that constructors and destructors have at least one207 /// parameter, the first of which must be a pointer, and no208 /// return values.209 static void verify( std::list< Declaration * > &translationUnit );210 211 // VerifyCtorDtor() {}212 213 virtual void visit( FunctionDecl *funcDecl );214 private:215 };216 217 204 void validate( std::list< Declaration * > &translationUnit, bool doDebug ) { 218 205 Pass1 pass1; … … 226 213 AutogenerateRoutines::autogenerateRoutines( translationUnit ); 227 214 acceptAll( translationUnit, pass3 ); 228 VerifyCtorDtor::verify( translationUnit );229 215 } 230 216 … … 535 521 536 522 template< typename OutputIterator > 537 void makeScalar Function( ObjectDecl *srcParam, ObjectDecl *dstParam, DeclarationWithType *member, std::string fname, OutputIterator out ) {523 void makeScalarAssignment( ObjectDecl *srcParam, ObjectDecl *dstParam, DeclarationWithType *member, OutputIterator out ) { 538 524 ObjectDecl *obj = dynamic_cast<ObjectDecl *>( member ); 539 525 // unnamed bit fields are not copied as they cannot be accessed 540 526 if ( obj != NULL && obj->get_name() == "" && obj->get_bitfieldWidth() != NULL ) return; 541 527 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 ) ); 528 UntypedExpr *assignExpr = new UntypedExpr( new NameExpr( "?=?" ) ); 545 529 546 530 UntypedExpr *derefExpr = new UntypedExpr( new NameExpr( "*?" ) ); … … 549 533 // do something special for unnamed members 550 534 Expression *dstselect = new AddressExpr( new MemberExpr( member, derefExpr ) ); 551 fExpr->get_args().push_back( dstselect );535 assignExpr->get_args().push_back( dstselect ); 552 536 553 537 Expression *srcselect = new MemberExpr( member, new VariableExpr( srcParam ) ); 554 fExpr->get_args().push_back( srcselect );555 556 *out++ = new ExprStmt( noLabels, fExpr );538 assignExpr->get_args().push_back( srcselect ); 539 540 *out++ = new ExprStmt( noLabels, assignExpr ); 557 541 } 558 542 559 543 template< typename OutputIterator > 560 void makeArray Function( ObjectDecl *srcParam, ObjectDecl *dstParam, DeclarationWithType *member, ArrayType *array, std::string fname, OutputIterator out ) {544 void makeArrayAssignment( ObjectDecl *srcParam, ObjectDecl *dstParam, DeclarationWithType *member, ArrayType *array, OutputIterator out ) { 561 545 static UniqueName indexName( "_index" ); 562 546 … … 581 565 inc->get_args().push_back( new AddressExpr( new VariableExpr( index ) ) ); 582 566 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 ) ); 567 UntypedExpr *assignExpr = new UntypedExpr( new NameExpr( "?=?" ) ); 586 568 587 569 UntypedExpr *derefExpr = new UntypedExpr( new NameExpr( "*?" ) ); … … 592 574 dstIndex->get_args().push_back( dstselect ); 593 575 dstIndex->get_args().push_back( new VariableExpr( index ) ); 594 fExpr->get_args().push_back( dstIndex );576 assignExpr->get_args().push_back( dstIndex ); 595 577 596 578 Expression *srcselect = new MemberExpr( member, new VariableExpr( srcParam ) ); … … 598 580 srcIndex->get_args().push_back( srcselect ); 599 581 srcIndex->get_args().push_back( new VariableExpr( index ) ); 600 fExpr->get_args().push_back( srcIndex );601 602 *out++ = new ForStmt( noLabels, initList, cond, inc, new ExprStmt( noLabels, fExpr ) );582 assignExpr->get_args().push_back( srcIndex ); 583 584 *out++ = new ForStmt( noLabels, initList, cond, inc, new ExprStmt( noLabels, assignExpr ) ); 603 585 } 604 586 … … 750 732 // assign to both destination and return value 751 733 if ( ArrayType *array = dynamic_cast< ArrayType * >( fixedMember->get_type() ) ) { 752 makeArray Function( srcParam, dstParam, fixedMember, array, "?=?", back_inserter( assignDecl->get_statements()->get_kids() ) );753 makeArray Function( srcParam, returnVal, fixedMember, array, "?=?", back_inserter( assignDecl->get_statements()->get_kids() ) );734 makeArrayAssignment( srcParam, dstParam, fixedMember, array, back_inserter( assignDecl->get_statements()->get_kids() ) ); 735 makeArrayAssignment( srcParam, returnVal, fixedMember, array, back_inserter( assignDecl->get_statements()->get_kids() ) ); 754 736 } else { 755 makeScalar Function( srcParam, dstParam, fixedMember, "?=?", back_inserter( assignDecl->get_statements()->get_kids() ) );756 makeScalar Function( srcParam, returnVal, fixedMember, "?=?", back_inserter( assignDecl->get_statements()->get_kids() ) );737 makeScalarAssignment( srcParam, dstParam, fixedMember, back_inserter( assignDecl->get_statements()->get_kids() ) ); 738 makeScalarAssignment( srcParam, returnVal, fixedMember, back_inserter( assignDecl->get_statements()->get_kids() ) ); 757 739 } // if 758 740 } else { 759 741 // assign to destination 760 742 if ( ArrayType *array = dynamic_cast< ArrayType * >( dwt->get_type() ) ) { 761 makeArray Function( srcParam, dstParam, dwt, array, "?=?", back_inserter( assignDecl->get_statements()->get_kids() ) );743 makeArrayAssignment( srcParam, dstParam, dwt, array, back_inserter( assignDecl->get_statements()->get_kids() ) ); 762 744 } else { 763 makeScalar Function( srcParam, dstParam, dwt, "?=?", back_inserter( assignDecl->get_statements()->get_kids() ) );745 makeScalarAssignment( srcParam, dstParam, dwt, back_inserter( assignDecl->get_statements()->get_kids() ) ); 764 746 } // if 765 747 } // if … … 771 753 } 772 754 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 ) { 755 Declaration *makeUnionAssignment( UnionDecl *aggregateDecl, UnionInstType *refType, unsigned int functionNesting ) { 837 756 FunctionType *assignType = new FunctionType( Type::Qualifiers(), false ); 838 757 … … 848 767 } 849 768 769 ObjectDecl *returnVal = new ObjectDecl( "_ret", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, cloneWithParams( refType, unionParams ), 0 ); 770 assignType->get_returnVals().push_back( returnVal ); 771 850 772 ObjectDecl *dstParam = new ObjectDecl( "_dst", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), cloneWithParams( refType, unionParams ) ), 0 ); 851 773 assignType->get_parameters().push_back( dstParam ); 852 774 853 // default ctor/dtor need only first parameter854 FunctionType * ctorType = assignType->clone();855 FunctionType * dtorType = assignType->clone();856 857 775 ObjectDecl *srcParam = new ObjectDecl( "_src", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, cloneWithParams( refType, unionParams ), 0 ); 858 776 assignType->get_parameters().push_back( srcParam ); 859 860 // copy ctor needs both parameters861 FunctionType * copyCtorType = assignType->clone();862 863 // assignment needs both and return value864 ObjectDecl *returnVal = new ObjectDecl( "_ret", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, cloneWithParams( refType, unionParams ), 0 );865 assignType->get_returnVals().push_back( returnVal );866 777 867 778 // Routines at global scope marked "static" to prevent multiple definitions is separate translation units 868 779 // because each unit generates copies of the default routines for each aggregate. 869 780 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 874 781 assignDecl->fixUniqueId(); 875 ctorDecl->fixUniqueId();876 copyCtorDecl->fixUniqueId();877 dtorDecl->fixUniqueId();878 782 879 783 makeUnionFieldsAssignment( srcParam, dstParam, cloneWithParams( refType, unionParams ), back_inserter( assignDecl->get_statements()->get_kids() ) ); 880 784 if ( isGeneric ) makeUnionFieldsAssignment( srcParam, returnVal, cloneWithParams( refType, unionParams ), back_inserter( assignDecl->get_statements()->get_kids() ) ); 881 785 882 786 if ( ! isGeneric ) assignDecl->get_statements()->get_kids().push_back( new ReturnStmt( noLabels, new VariableExpr( srcParam ) ) ); 883 787 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 ); 788 return assignDecl; 891 789 } 892 790 … … 904 802 StructInstType structInst( Type::Qualifiers(), structDecl->get_name() ); 905 803 structInst.set_baseStruct( structDecl ); 906 907 804 declsToAdd.push_back( makeStructAssignment( structDecl, &structInst, functionNesting ) ); 908 makeStructCtorDtor( structDecl, &structInst, functionNesting, declsToAdd );909 805 structsDone.insert( structDecl->get_name() ); 910 806 } // if … … 915 811 UnionInstType unionInst( Type::Qualifiers(), unionDecl->get_name() ); 916 812 unionInst.set_baseUnion( unionDecl ); 917 makeUnionFunctions( unionDecl, &unionInst, functionNesting, declsToAdd);813 declsToAdd.push_back( makeUnionAssignment( unionDecl, &unionInst, functionNesting ) ); 918 814 } // if 919 815 } … … 1184 1080 } 1185 1081 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 statements1210 // to cause desired behaviour1211 // 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 a1213 // complicated expression with side effects (see: malloc). idea: add temporary variable1214 // that is assigned address of constructed object in ctor argument position and1215 // return the temporary. It should also be done after all implicit ctors are1216 // added, so not in this pass!1217 }1218 1082 } // namespace SymTab 1219 1083 -
src/SynTree/Declaration.h
rc14cff1 rac1ed49 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 Jan 13 16:11:49 201613 // Update Count : 3 612 // Last Modified On : Wed Dec 09 14:08:22 2015 13 // Update Count : 32 14 14 // 15 15 -
src/SynTree/Initializer.cc
rc14cff1 rac1ed49 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 Jan 13 15:31:45 201613 // Update Count : 2812 // Last Modified On : Wed Aug 12 14:05:25 2015 13 // Update Count : 14 14 14 // 15 15 … … 18 18 #include "Common/utility.h" 19 19 20 Initializer::Initializer( bool maybeConstructed ) : maybeConstructed( maybeConstructed) {}20 Initializer::Initializer() {} 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 , bool maybeConstructed ) : Initializer( maybeConstructed ), value ( v ), designators( _designators ) {33 SingleInit::SingleInit( Expression *v, std::list< Expression *> &_designators ) : value ( v ), designators( _designators ) { 34 34 } 35 35 36 SingleInit::SingleInit( const SingleInit &other ) : Initializer(other),value ( other.value ) {36 SingleInit::SingleInit( const SingleInit &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 , bool maybeConstructed)57 : Initializer( maybeConstructed),initializers( _initializers ), designators( _designators ) {56 ListInit::ListInit( std::list<Initializer*> &_initializers, std::list<Expression *> &_designators ) 57 : 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 } // if99 100 if ( init ) {101 os << " with fallback C-style initializer: ";102 init->print( os, indent+2 );103 }104 }105 106 107 81 // Local Variables: // 108 82 // tab-width: 4 // -
src/SynTree/Initializer.h
rc14cff1 rac1ed49 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 : Rob Schluntz12 // Last Modified On : Tue Feb 09 14:40:15 201613 // Update Count : 1 911 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon May 18 09:03:48 2015 13 // Update Count : 1 14 14 // 15 15 … … 27 27 public: 28 28 // Initializer( std::string _name = std::string(""), int _pos = 0 ); 29 Initializer( bool maybeConstructed);29 Initializer( ); 30 30 virtual ~Initializer(); 31 31 … … 43 43 } 44 44 45 bool get_maybeConstructed() { return maybeConstructed; }46 47 45 virtual Initializer *clone() const = 0; 48 46 virtual void accept( Visitor &v ) = 0; … … 52 50 // std::string name; 53 51 // int pos; 54 bool maybeConstructed;55 52 }; 56 53 … … 58 55 class SingleInit : public Initializer { 59 56 public: 60 SingleInit( Expression *value, std::list< Expression *> &designators , bool maybeConstructed = false);57 SingleInit( Expression *value, std::list< Expression *> &designators = *(new std::list<Expression *>()) ); 61 58 SingleInit( const SingleInit &other ); 62 59 virtual ~SingleInit(); 63 60 64 61 Expression *get_value() { return value; } 65 62 void set_value( Expression *newValue ) { value = newValue; } … … 82 79 class ListInit : public Initializer { 83 80 public: 84 ListInit( std::list<Initializer*> &, 85 std::list<Expression *> &designators , bool maybeConstructed = false);81 ListInit( std::list<Initializer*> &, 82 std::list<Expression *> &designators = *(new std::list<Expression *>()) ); 86 83 virtual ~ListInit(); 87 84 … … 103 100 }; 104 101 105 // ConstructorInit represents an initializer that is either a constructor expression or106 // 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 fallback125 // if an appropriate constructor definition is not found by the resolver126 Initializer * init;127 };128 129 102 #endif // INITIALIZER_H 130 103 -
src/SynTree/Mutator.cc
rc14cff1 rac1ed49 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 : Rob Schluntz12 // Last Modified On : Wed Jan 13 15:32:29 201613 // Update Count : 1 511 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sat Jul 25 19:21:33 2015 13 // Update Count : 11 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 445 439 Subrange *Mutator::mutate( Subrange *subrange ) { 446 440 return subrange; -
src/SynTree/Mutator.h
rc14cff1 rac1ed49 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 : Rob Schluntz12 // Last Modified On : Wed Jan 13 15:24:26 201613 // Update Count : 911 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Nov 19 22:26:16 2015 13 // Update Count : 8 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 );97 96 98 97 virtual Subrange *mutate( Subrange *subrange ); -
src/SynTree/ObjectDecl.cc
rc14cff1 rac1ed49 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 Feb 09 13:21:03 201613 // Update Count : 3012 // Last Modified On : Tue Sep 29 14:13:01 2015 13 // Update Count : 18 14 14 // 15 15 … … 19 19 #include "Expression.h" 20 20 #include "Common/utility.h" 21 #include "Statement.h"22 21 23 22 ObjectDecl::ObjectDecl( const std::string &name, DeclarationNode::StorageClass sc, LinkageSpec::Type linkage, Expression *bitfieldWidth, Type *type, Initializer *init, bool isInline, bool isNoreturn ) … … 59 58 os << " with initializer "; 60 59 init->print( os, indent ); 61 os << std::string(indent, ' ') << "maybeConstructed? " << init->get_maybeConstructed();62 60 } // if 63 61 … … 71 69 #if 0 72 70 if ( get_mangleName() != "") { 73 os << get_mangleName() << ": "; 74 } else 71 os << get_mangleName() << ": "; 72 } else 75 73 #endif 76 74 if ( get_name() != "" ) { -
src/SynTree/SynTree.h
rc14cff1 rac1ed49 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 : Rob Schluntz12 // Last Modified On : Wed Jan 13 15:28:41 201613 // Update Count : 411 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Jul 23 23:25:04 2015 13 // Update Count : 3 14 14 // 15 15 … … 102 102 class SingleInit; 103 103 class ListInit; 104 class ConstructorInit;105 104 106 105 class Subrange; -
src/SynTree/Visitor.cc
rc14cff1 rac1ed49 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 : Rob Schluntz12 // Last Modified On : Wed Jan 13 15:27:23 201613 // Update Count : 1 811 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Jul 24 16:11:05 2015 13 // Update Count : 15 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 375 370 void Visitor::visit( Subrange *subrange ) {} 376 371 -
src/SynTree/Visitor.h
rc14cff1 rac1ed49 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 : Rob Schluntz12 // Last Modified On : Tue Feb 09 13:20:48201613 // Update Count : 611 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Jan 25 21:20:44 2016 13 // Update Count : 5 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 );97 96 98 97 virtual void visit( Subrange *subrange ); -
src/initialization.txt
rc14cff1 rac1ed49 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 correct42 > results from the unification engine is by feeding it an expression that43 > looks like "?=?( ((struct Y)x.y).a, 10 )", then picking out the pieces that44 > I need (namely the correct choice for a). Does this seem like a reasonable45 > 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 assignment49 operators that happen to be in scope (and which may include50 user-defined operators) to guide the type resolution.51 52 I don't think there is any way to rewrite an initializer as a single53 expression and have the resolver just do the right thing. I see the54 algorithm as:55 56 For each alternative interpretation of the designator:57 Construct an expression that casts the initializer to the type of58 the designator59 Construct an AlternativeFinder and use it to find the lowest cost60 interpretation of the expression61 Add this interpretation to a list of possibilities62 Go through the list of possibilities and pick the lowest cost63 64 As with many things in the resolver, it's conceptually simple but the65 implementation may be a bit of a pain. It fits in with functions like66 findSingleExpression, findIntegralExpression in Resolver.cc, although67 it will be significantly more complicated than any of the existing68 ones.69 70 71 -
src/libcfa/Makefile.am
rc14cff1 rac1ed49 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 iterator # temporarily getting rid of these until ctor/dtor autogen works62 libs = stdlib iostream fstream iterator 63 63 libcfa_a_SOURCES = libcfa-prelude.c ${libs:=.c} 64 64 -
src/libcfa/Makefile.in
rc14cff1 rac1ed49 83 83 libcfa_a_AR = $(AR) $(ARFLAGS) 84 84 libcfa_a_LIBADD = 85 am__objects_1 = 85 am__objects_1 = stdlib.$(OBJEXT) iostream.$(OBJEXT) fstream.$(OBJEXT) \ 86 iterator.$(OBJEXT) 86 87 am_libcfa_a_OBJECTS = libcfa-prelude.$(OBJEXT) $(am__objects_1) 87 88 libcfa_a_OBJECTS = $(am_libcfa_a_OBJECTS) … … 109 110 AWK = @AWK@ 110 111 BACKEND_CC = @BACKEND_CC@ 111 CC = ${abs_top_srcdir}/src/driver/cfa 112 CC = ${abs_top_srcdir}/src/driver/cfa 112 113 CCDEPMODE = @CCDEPMODE@ 113 114 CFA_BINDIR = @CFA_BINDIR@ … … 212 213 MAINTAINERCLEANFILES = ${addprefix ${libdir}/,${cfalib_DATA}} \ 213 214 ${addprefix ${libdir}/,${lib_LIBRARIES}} ${includedir}/* 214 libs = # stdlib iostream fstream iterator # temporarily getting rid of these until ctor/dtor autogen works215 libs = stdlib iostream fstream iterator 215 216 libcfa_a_SOURCES = libcfa-prelude.c ${libs:=.c} 216 217 cheaders = bfd bfdlink demangle dialog evdns evhttp evrpc expat fcntl form gcrypt math … … 292 293 -rm -f *.tab.c 293 294 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@ 294 298 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa-prelude.Po@am__quote@ 299 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stdlib.Po@am__quote@ 295 300 296 301 .c.obj: -
src/libcfa/prelude.cf
rc14cff1 rac1ed49 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 Destructors636 //637 // ------------------------------------------------------------638 639 // default ctor640 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 ctor656 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 // dtor672 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 ctor687 // 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 ctor693 // 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 // // dtor699 // 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 section705 // copy constructors706 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 ctors800 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 incomplete813 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 // dtors827 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 incomplete840 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
rc14cff1 rac1ed49 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 : Rob Schluntz12 // Last Modified On : Tue Feb 09 13:28:11201613 // Update Count : 20011 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Jan 27 22:20:20 2016 13 // Update Count : 199 14 14 // 15 15 … … 41 41 #include "InitTweak/Mutate.h" 42 42 #include "InitTweak/RemoveInit.h" 43 #include "InitTweak/FixInit.h"44 43 //#include "Explain/GenProlog.h" 45 44 //#include "Try/Visit.h" … … 61 60 astp = false, 62 61 bresolvep = false, 63 ctorinitp = false,64 62 exprp = false, 65 63 expraltp = false, … … 76 74 codegenp = false; 77 75 78 enum { Ast, Bresolver, CtorInitFix,Expr, ExprAlt, Grammar, LibCFA, Nopreamble, Parse, Prototypes, Resolver, Symbol, Tree, Validate, };76 enum { Ast, Bresolver, Expr, ExprAlt, Grammar, LibCFA, Nopreamble, Parse, Prototypes, Resolver, Symbol, Tree, Validate, }; 79 77 80 78 static struct option long_opts[] = { 81 79 { "ast", no_argument, 0, Ast }, 82 80 { "before-resolver", no_argument, 0, Bresolver }, 83 { "ctorinitfix", no_argument, 0, CtorInitFix },84 81 { "expr", no_argument, 0, Expr }, 85 82 { "expralt", no_argument, 0, ExprAlt }, … … 103 100 104 101 opterr = 0; // prevent getopt from printing error messages 105 102 106 103 int c; 107 while ( (c = getopt_long( argc, argv, "ab cefFglnpqrstvyzD:", long_opts, &long_index )) != -1 ) {104 while ( (c = getopt_long( argc, argv, "abefglnpqrstvyzD:", long_opts, &long_index )) != -1 ) { 108 105 switch ( c ) { 109 106 case Ast: … … 114 111 case 'b': // print before resolver steps 115 112 bresolvep = true; 116 break;117 case CtorInitFix:118 case 'c':119 ctorinitp = true;120 113 break; 121 114 case Expr: … … 194 187 output = new ofstream( argv[ optind ] ); 195 188 } // if 196 189 197 190 Parser::get_parser().set_debug( grammarp ); 198 191 … … 215 208 exit( 1 ); 216 209 } // if 217 210 218 211 parse( prelude, LinkageSpec::Intrinsic ); 219 212 } // if 220 213 } // if 221 214 222 parse( input, libcfap ? LinkageSpec::Intrinsic : LinkageSpec::Cforall, grammarp ); 223 215 parse( input, libcfap ? LinkageSpec::Intrinsic : LinkageSpec::Cforall, grammarp ); 216 224 217 if ( parsep ) { 225 218 Parser::get_parser().get_parseTree()->printList( std::cout ); … … 256 249 OPTPRINT( "mutate" ) 257 250 ControlStruct::mutate( translationUnit ); 258 OPTPRINT( "fixNames" ) 251 OPTPRINT( "fixNames" ) 259 252 CodeGen::fixNames( translationUnit ); 260 OPTPRINT( "tweak Init" )253 OPTPRINT( "tweak" ) 261 254 InitTweak::tweak( translationUnit ); 262 255 … … 275 268 if ( exprp ) { 276 269 dump( translationUnit ); 277 return 0;278 }279 280 OPTPRINT( "fixInit" )281 // fix ObjectDecl - replaces ConstructorInit nodes282 InitTweak::fix( translationUnit );283 if ( ctorinitp ) {284 dump ( translationUnit );285 return 0;286 270 } 287 271 … … 294 278 OPTPRINT( "box" ) 295 279 GenPoly::box( translationUnit ); 296 280 297 281 // print tree right before code generation 298 282 if ( codegenp ) { … … 350 334 std::list< Declaration * > decls; 351 335 if ( noprotop ) { 352 filter( translationUnit.begin(), translationUnit.end(), 336 filter( translationUnit.begin(), translationUnit.end(), 353 337 std::back_inserter( decls ), notPrelude ); 354 338 } else {
Note:
See TracChangeset
for help on using the changeset viewer.