Changes in / [0638c44:a1d6d80]
- Location:
- src
- Files:
-
- 6 added
- 2 deleted
- 59 edited
Legend:
- Unmodified
- Added
- Removed
-
src/CodeGen/CodeGenerator.cc
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // CodeGenerator.cc -- 7 // CodeGenerator.cc -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Wed Mar 2 17:32:16 201613 // Update Count : 2 4311 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Apr 27 11:59:36 2016 13 // Update Count : 255 14 14 // 15 15 … … 67 67 string mangleName( DeclarationWithType *decl ) { 68 68 if ( decl->get_mangleName() != "" ) { 69 return decl->get_mangleName(); 69 // need to incorporate scope level in order to differentiate names for destructors 70 return decl->get_scopedMangleName(); 70 71 } else { 71 72 return decl->get_name(); … … 99 100 handleStorageClass( objectDecl ); 100 101 output << genType( objectDecl->get_type(), mangleName( objectDecl ) ); 101 102 102 103 if ( objectDecl->get_init() ) { 103 104 output << " = "; … … 113 114 if ( aggDecl->get_name() != "" ) 114 115 output << aggDecl->get_name(); 115 116 116 117 std::list< Declaration * > &memb = aggDecl->get_members(); 117 118 … … 119 120 output << " {" << endl; 120 121 121 cur_indent += CodeGenerator::tabsize; 122 cur_indent += CodeGenerator::tabsize; 122 123 for ( std::list< Declaration* >::iterator i = memb.begin(); i != memb.end(); i++) { 123 output << indent; 124 output << indent; 124 125 (*i)->accept( *this ); 125 126 output << ";" << endl; 126 127 } 127 128 128 cur_indent -= CodeGenerator::tabsize; 129 cur_indent -= CodeGenerator::tabsize; 129 130 130 131 output << indent << "}"; … … 141 142 handleAggregate( aggregateDecl ); 142 143 } 143 144 144 145 void CodeGenerator::visit( EnumDecl *aggDecl ) { 145 146 output << "enum "; … … 147 148 if ( aggDecl->get_name() != "" ) 148 149 output << aggDecl->get_name(); 149 150 150 151 std::list< Declaration* > &memb = aggDecl->get_members(); 151 152 … … 153 154 output << " {" << endl; 154 155 155 cur_indent += CodeGenerator::tabsize; 156 cur_indent += CodeGenerator::tabsize; 156 157 for ( std::list< Declaration* >::iterator i = memb.begin(); i != memb.end(); i++) { 157 158 ObjectDecl *obj = dynamic_cast< ObjectDecl* >( *i ); 158 159 assert( obj ); 159 output << indent << mangleName( obj ); 160 output << indent << mangleName( obj ); 160 161 if ( obj->get_init() ) { 161 162 output << " = "; … … 165 166 } // for 166 167 167 cur_indent -= CodeGenerator::tabsize; 168 cur_indent -= CodeGenerator::tabsize; 168 169 169 170 output << indent << "}"; 170 171 } // if 171 172 } 172 173 173 174 void CodeGenerator::visit( TraitDecl *aggregateDecl ) {} 174 175 175 176 void CodeGenerator::visit( TypedefDecl *typeDecl ) { 176 177 output << "typedef "; 177 178 output << genType( typeDecl->get_base(), typeDecl->get_name() ); 178 179 } 179 180 180 181 void CodeGenerator::visit( TypeDecl *typeDecl ) { 181 182 // really, we should mutate this into something that isn't a TypeDecl but that requires large-scale changes, … … 213 214 printDesignators( init->get_designators() ); 214 215 output << "{ "; 215 genCommaList( init->begin_initializers(), init->end_initializers() ); 216 if ( init->begin_initializers() == init->end_initializers() ) { 217 // illegal to leave initializer list empty for scalar initializers, 218 // but always legal to have 0 219 output << "0"; 220 } else { 221 genCommaList( init->begin_initializers(), init->end_initializers() ); 222 } 216 223 output << " }"; 217 224 } 218 225 219 void CodeGenerator::visit( Constant *constant ) { 226 void CodeGenerator::visit( Constant *constant ) { 220 227 output << constant->get_value() ; 221 228 } … … 231 238 case OT_POSTFIXASSIGN: 232 239 case OT_INFIXASSIGN: 240 case OT_CTOR: 241 case OT_DTOR: 233 242 { 234 243 assert( arg != applicationExpr->get_args().end() ); 235 244 if ( AddressExpr *addrExpr = dynamic_cast< AddressExpr * >( *arg ) ) { 236 245 // remove & from first assignment/ctor argument 237 246 *arg = addrExpr->get_arg(); 238 247 } else { 248 // no address-of operator, so must be a pointer - add dereference 239 249 UntypedExpr *newExpr = new UntypedExpr( new NameExpr( "*?" ) ); 240 250 newExpr->get_args().push_back( *arg ); … … 243 253 break; 244 254 } 245 255 246 256 default: 247 257 // do nothing 248 258 ; 249 259 } 250 260 251 261 switch ( opInfo.type ) { 252 262 case OT_INDEX: … … 257 267 output << "]"; 258 268 break; 259 269 260 270 case OT_CALL: 261 271 // there are no intrinsic definitions of the function call operator 262 272 assert( false ); 263 273 break; 264 274 275 case OT_CTOR: 276 case OT_DTOR: 277 if ( applicationExpr->get_args().size() == 1 ) { 278 // the expression fed into a single parameter constructor or destructor 279 // may contain side effects - output as a void expression 280 output << "((void)("; 281 (*arg++)->accept( *this ); 282 output << ")) /* " << opInfo.inputName << " */"; 283 } else if ( applicationExpr->get_args().size() == 2 ) { 284 // intrinsic two parameter constructors are essentially bitwise assignment 285 output << "("; 286 (*arg++)->accept( *this ); 287 output << opInfo.symbol; 288 (*arg)->accept( *this ); 289 output << ") /* " << opInfo.inputName << " */"; 290 } else { 291 // no constructors with 0 or more than 2 parameters 292 assert( false ); 293 } 294 break; 295 265 296 case OT_PREFIX: 266 297 case OT_PREFIXASSIGN: … … 271 302 output << ")"; 272 303 break; 273 304 274 305 case OT_POSTFIX: 275 306 case OT_POSTFIXASSIGN: … … 278 309 output << opInfo.symbol; 279 310 break; 311 280 312 281 313 case OT_INFIX: … … 288 320 output << ")"; 289 321 break; 290 322 291 323 case OT_CONSTANT: 292 324 case OT_LABELADDRESS: … … 307 339 } // if 308 340 } 309 341 310 342 void CodeGenerator::visit( UntypedExpr *untypedExpr ) { 311 343 if ( NameExpr *nameExpr = dynamic_cast< NameExpr* >( untypedExpr->get_function() ) ) { … … 321 353 output << "]"; 322 354 break; 323 355 324 356 case OT_CALL: 325 357 assert( false ); 326 break; 327 358 359 360 case OT_CTOR: 361 case OT_DTOR: 362 if ( untypedExpr->get_args().size() == 1 ) { 363 // the expression fed into a single parameter constructor or destructor 364 // may contain side effects - output as a void expression 365 output << "((void)("; 366 (*arg++)->accept( *this ); 367 output << ")) /* " << opInfo.inputName << " */"; 368 } else if ( untypedExpr->get_args().size() == 2 ) { 369 // intrinsic two parameter constructors are essentially bitwise assignment 370 output << "("; 371 (*arg++)->accept( *this ); 372 output << opInfo.symbol; 373 (*arg)->accept( *this ); 374 output << ") /* " << opInfo.inputName << " */"; 375 } else { 376 // no constructors with 0 or more than 2 parameters 377 assert( false ); 378 } 379 break; 380 328 381 case OT_PREFIX: 329 382 case OT_PREFIXASSIGN: … … 335 388 output << ")"; 336 389 break; 337 390 338 391 case OT_POSTFIX: 339 392 case OT_POSTFIXASSIGN: … … 342 395 output << opInfo.symbol; 343 396 break; 344 397 345 398 case OT_INFIX: 346 399 case OT_INFIXASSIGN: … … 352 405 output << ")"; 353 406 break; 354 407 355 408 case OT_CONSTANT: 356 409 // there are no intrinsic definitions of 0 or 1 as functions … … 370 423 } // if 371 424 } 372 425 373 426 void CodeGenerator::visit( NameExpr *nameExpr ) { 374 427 OperatorInfo opInfo; … … 380 433 } // if 381 434 } 382 435 383 436 void CodeGenerator::visit( AddressExpr *addressExpr ) { 384 437 output << "(&"; … … 409 462 output << ")"; 410 463 } 411 464 412 465 void CodeGenerator::visit( UntypedMemberExpr *memberExpr ) { 413 466 assert( false ); 414 467 } 415 468 416 469 void CodeGenerator::visit( MemberExpr *memberExpr ) { 417 470 memberExpr->get_aggregate()->accept( *this ); 418 471 output << "." << mangleName( memberExpr->get_member() ); 419 472 } 420 473 421 474 void CodeGenerator::visit( VariableExpr *variableExpr ) { 422 475 OperatorInfo opInfo; … … 427 480 } // if 428 481 } 429 482 430 483 void CodeGenerator::visit( ConstantExpr *constantExpr ) { 431 484 assert( constantExpr->get_constant() ); 432 485 constantExpr->get_constant()->accept( *this ); 433 486 } 434 487 435 488 void CodeGenerator::visit( SizeofExpr *sizeofExpr ) { 436 489 output << "sizeof("; … … 469 522 assert( false && "OffsetPackExpr should not reach code generation" ); 470 523 } 471 524 472 525 void CodeGenerator::visit( LogicalExpr *logicalExpr ) { 473 526 output << "("; … … 481 534 output << ")"; 482 535 } 483 536 484 537 void CodeGenerator::visit( ConditionalExpr *conditionalExpr ) { 485 538 output << "("; … … 491 544 output << ")"; 492 545 } 493 546 494 547 void CodeGenerator::visit( CommaExpr *commaExpr ) { 495 548 output << "("; … … 499 552 output << ")"; 500 553 } 501 554 502 555 void CodeGenerator::visit( TupleExpr *tupleExpr ) {} 503 556 504 557 void CodeGenerator::visit( TypeExpr *typeExpr ) {} 505 558 … … 532 585 } 533 586 } 534 cur_indent -= CodeGenerator::tabsize; 587 cur_indent -= CodeGenerator::tabsize; 535 588 536 589 output << indent << "}"; … … 538 591 539 592 void CodeGenerator::visit( ExprStmt *exprStmt ) { 540 // I don't see why this check is necessary. 541 // If this starts to cause problems then put it back in, 593 // I don't see why this check is necessary. 594 // If this starts to cause problems then put it back in, 542 595 // with an explanation 543 596 assert( exprStmt ); … … 589 642 switchStmt->get_condition()->accept( *this ); 590 643 output << " ) "; 591 644 592 645 output << "{" << std::endl; 593 646 cur_indent += CodeGenerator::tabsize; … … 609 662 } // if 610 663 output << ":\n"; 611 664 612 665 std::list<Statement *> sts = caseStmt->get_statements(); 613 666 … … 626 679 if ( ! branchStmt->get_target().empty() ) 627 680 output << "goto " << branchStmt->get_target(); 628 else { 681 else { 629 682 if ( branchStmt->get_computedTarget() != 0 ) { 630 683 output << "goto *"; … … 677 730 678 731 void CodeGenerator::visit( ForStmt *forStmt ) { 679 // initialization is always hoisted, so don't 680 // bother doing anything with that 732 // initialization is always hoisted, so don't 733 // bother doing anything with that 681 734 output << "for (;"; 682 735 … … 702 755 void CodeGenerator::visit( DeclStmt *declStmt ) { 703 756 declStmt->get_decl()->accept( *this ); 704 757 705 758 if ( doSemicolon( declStmt->get_decl() ) ) { 706 759 output << ";"; -
src/CodeGen/FixNames.cc
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // FixNames.cc -- 7 // FixNames.cc -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Mon May 18 23:36:42 201511 // Last Modified By : Rob Schluntz 12 // Last Modified On : Mon Apr 11 15:38:10 2016 13 13 // Update Count : 1 14 14 // … … 26 26 virtual void visit( ObjectDecl *objectDecl ); 27 27 virtual void visit( FunctionDecl *functionDecl ); 28 29 virtual void visit( CompoundStmt *compoundStmt ); 30 31 private: 32 int scopeLevel = 1; 33 34 void fixDWT( DeclarationWithType *dwt ); 28 35 }; 29 36 … … 33 40 } 34 41 35 void fixDWT( DeclarationWithType *dwt ) {42 void FixNames::fixDWT( DeclarationWithType *dwt ) { 36 43 if ( dwt->get_name() != "" ) { 37 44 if ( LinkageSpec::isDecoratable( dwt->get_linkage() ) ) { 38 45 dwt->set_mangleName( SymTab::Mangler::mangle( dwt ) ); 46 dwt->set_scopeLevel( scopeLevel ); 39 47 } // if 40 48 } // if … … 50 58 fixDWT( functionDecl ); 51 59 } 60 61 void FixNames::visit( CompoundStmt *compoundStmt ) { 62 scopeLevel++; 63 Visitor::visit( compoundStmt ); 64 scopeLevel--; 65 } 52 66 } // namespace CodeGen 53 67 -
src/CodeGen/OperatorTable.cc
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // OperatorTable.cc -- 7 // OperatorTable.cc -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : T ue Jun 23 17:41:14 201513 // Update Count : 511 // Last Modified By : Rob Schluntz 12 // Last Modified On : Thu Apr 14 16:48:27 2016 13 // Update Count : 9 14 14 // 15 15 … … 21 21 const OperatorInfo tableValues[] = { 22 22 { "?[?]", "", "_operator_index", OT_INDEX }, 23 { "?{}", "=", "_constructor", OT_CTOR }, 24 { "^?{}", "", "_destructor", OT_DTOR }, 23 25 { "?()", "", "_operator_call", OT_CALL }, 24 26 { "?++", "++", "_operator_postincr", OT_POSTFIXASSIGN }, -
src/CodeGen/OperatorTable.h
r0638c44 ra1d6d80 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Tue Jun 23 16:09:27 201513 // Update Count : 311 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Jun 24 16:17:57 2015 13 // Update Count : 5 14 14 // 15 15 … … 22 22 enum OperatorType { 23 23 OT_INDEX, 24 OT_CTOR, 25 OT_DTOR, 24 26 OT_CALL, 25 27 OT_PREFIX, -
src/Common/utility.h
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // utility.h -- 7 // utility.h -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Thu Jul 2 18:04:41 201511 // Last Modified By : Rob Schluntz 12 // Last Modified On : Thu Apr 28 13:18:24 2016 13 13 // Update Count : 16 14 14 // … … 62 62 os << std::string( indent, ' ' ); 63 63 (*i)->print( os, indent + 2 ); 64 // need an endl after each element because it's not easy to know when each individual item should end 64 65 os << std::endl; 65 66 } // if … … 128 129 } 129 130 130 template < typename T > 131 template < typename T > 131 132 std::string toString ( T value ) { 132 133 std::ostringstream os; -
src/GenPoly/Box.cc
r0638c44 ra1d6d80 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Fri Feb 5 16:45:07 201613 // Update Count : 2 8611 // Last Modified By : Rob Schluntz 12 // Last Modified On : Tue May 03 16:44:47 2016 13 // Update Count : 295 14 14 // 15 15 … … 133 133 Value *lookup( Key *key, const std::list< TypeExpr* >& params ) const { 134 134 TypeList typeList( params ); 135 135 136 136 // scan scopes for matches to the key 137 137 for ( typename InnerMap::const_iterator insts = instantiations.find( key ); insts != instantiations.end(); insts = instantiations.findNext( insts, key ) ) { … … 160 160 virtual Declaration *mutate( UnionDecl *unionDecl ); 161 161 }; 162 162 163 163 /// Replaces polymorphic return types with out-parameters, replaces calls to polymorphic functions with adapter calls as needed, and adds appropriate type variables to the function call 164 164 class Pass1 : public PolyMutator { … … 208 208 ResolvExpr::TypeMap< DeclarationWithType > scopedAssignOps; ///< Currently known assignment operators 209 209 ScopedMap< std::string, DeclarationWithType* > adapters; ///< Set of adapter functions in the current scope 210 210 211 211 DeclarationWithType *retval; 212 212 bool useRetval; … … 226 226 virtual Type *mutate( PointerType *pointerType ); 227 227 virtual Type *mutate( FunctionType *funcType ); 228 228 229 229 private: 230 230 void addAdapters( FunctionType *functionType ); … … 297 297 /// Exits the type-variable scope 298 298 void endTypeScope(); 299 299 300 300 ScopedSet< std::string > knownLayouts; ///< Set of generic type layouts known in the current scope, indexed by sizeofName 301 301 ScopedSet< std::string > knownOffsets; ///< Set of non-generic types for which the offset array exists in the current scope, indexed by offsetofName … … 351 351 PolyGenericCalculator polyCalculator; 352 352 Pass3 pass3; 353 353 354 354 layoutBuilder.mutateDeclarationList( translationUnit ); 355 355 mutateTranslationUnit/*All*/( translationUnit, pass1 ); … … 370 370 return functionDecl; 371 371 } 372 372 373 373 /// Get a list of type declarations that will affect a layout function 374 374 std::list< TypeDecl* > takeOtypeOnly( std::list< TypeDecl* > &decls ) { … … 380 380 } 381 381 } 382 382 383 383 return otypeDecls; 384 384 } … … 387 387 void addOtypeParams( FunctionType *layoutFnType, std::list< TypeDecl* > &otypeParams ) { 388 388 BasicType sizeAlignType( Type::Qualifiers(), BasicType::LongUnsignedInt ); 389 389 390 390 for ( std::list< TypeDecl* >::const_iterator param = otypeParams.begin(); param != otypeParams.end(); ++param ) { 391 391 TypeInstType paramType( Type::Qualifiers(), (*param)->get_name(), *param ); … … 444 444 return makeCond( ifCond, ifExpr ); 445 445 } 446 446 447 447 /// adds an expression to a compound statement 448 448 void addExpr( CompoundStmt *stmts, Expression *expr ) { … … 454 454 stmts->get_kids().push_back( stmt ); 455 455 } 456 456 457 457 Declaration *LayoutFunctionBuilder::mutate( StructDecl *structDecl ) { 458 458 // do not generate layout function for "empty" tag structs … … 467 467 BasicType *sizeAlignType = new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ); 468 468 PointerType *sizeAlignOutType = new PointerType( Type::Qualifiers(), sizeAlignType ); 469 469 470 470 ObjectDecl *sizeParam = new ObjectDecl( sizeofName( structDecl->get_name() ), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, sizeAlignOutType, 0 ); 471 471 layoutFnType->get_parameters().push_back( sizeParam ); … … 497 497 addStmt( layoutDecl->get_statements(), makeAlignTo( derefVar( sizeParam ), new AlignofExpr( memberType->clone() ) ) ); 498 498 } 499 499 500 500 // place current size in the current offset index 501 501 addExpr( layoutDecl->get_statements(), makeOp( "?=?", makeOp( "?[?]", new VariableExpr( offsetParam ), new ConstantExpr( Constant::from( n_members ) ) ), … … 505 505 // add member size to current size 506 506 addExpr( layoutDecl->get_statements(), makeOp( "?+=?", derefVar( sizeParam ), new SizeofExpr( memberType->clone() ) ) ); 507 507 508 508 // take max of member alignment and global alignment 509 509 addStmt( layoutDecl->get_statements(), makeAssignMax( derefVar( alignParam ), new AlignofExpr( memberType->clone() ) ) ); … … 515 515 return structDecl; 516 516 } 517 517 518 518 Declaration *LayoutFunctionBuilder::mutate( UnionDecl *unionDecl ) { 519 519 // do not generate layout function for "empty" tag unions 520 520 if ( unionDecl->get_members().empty() ) return unionDecl; 521 521 522 522 // get parameters that can change layout, exiting early if none 523 523 std::list< TypeDecl* > otypeParams = takeOtypeOnly( unionDecl->get_parameters() ); … … 528 528 BasicType *sizeAlignType = new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ); 529 529 PointerType *sizeAlignOutType = new PointerType( Type::Qualifiers(), sizeAlignType ); 530 530 531 531 ObjectDecl *sizeParam = new ObjectDecl( sizeofName( unionDecl->get_name() ), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, sizeAlignOutType, 0 ); 532 532 layoutFnType->get_parameters().push_back( sizeParam ); … … 545 545 assert( dwt ); 546 546 Type *memberType = dwt->get_type(); 547 547 548 548 // take max member size and global size 549 549 addStmt( layoutDecl->get_statements(), makeAssignMax( derefVar( sizeParam ), new SizeofExpr( memberType->clone() ) ) ); 550 550 551 551 // take max of member alignment and global alignment 552 552 addStmt( layoutDecl->get_statements(), makeAssignMax( derefVar( alignParam ), new AlignofExpr( memberType->clone() ) ) ); … … 558 558 return unionDecl; 559 559 } 560 560 561 561 ////////////////////////////////////////// Pass1 //////////////////////////////////////////////////// 562 562 … … 619 619 return 0; 620 620 } 621 621 622 622 /// returns T if the given declaration is: (*?=?)(T *, T) for some type T (return not checked, but maybe should be), NULL otherwise 623 623 /// Only picks assignments where neither parameter is cv-qualified … … 631 631 Type *paramType2 = funType->get_parameters().back()->get_type(); 632 632 if ( paramType2->get_qualifiers() != defaultQualifiers ) return 0; 633 633 634 634 if ( PointerType *pointerType = dynamic_cast< PointerType* >( paramType1 ) ) { 635 635 Type *baseType1 = pointerType->get_base(); … … 784 784 arg++; 785 785 } else { 786 throw SemanticError( "unbound type variable in application ", appExpr ); 786 /// xxx - should this be an assertion? 787 throw SemanticError( "unbound type variable: " + tyParm->first + " in application ", appExpr ); 787 788 } // if 788 789 } // if … … 803 804 passArgTypeVars( appExpr, polyRetType, concRetType, arg, exprTyVars, seenTypes ); 804 805 } 805 806 806 807 // add type information args for presently unseen types in parameter list 807 808 for ( ; fnParm != funcType->get_parameters().end() && fnArg != appExpr->get_args().end(); ++fnParm, ++fnArg ) { … … 882 883 assert( env ); 883 884 Type *concrete = replaceWithConcrete( appExpr, polyType ); 884 // add out-parameter for return value 885 // add out-parameter for return value 885 886 return addRetParam( appExpr, function, concrete, arg ); 886 887 } … … 910 911 } else if ( arg->get_results().front()->get_isLvalue() ) { 911 912 // VariableExpr and MemberExpr are lvalues; need to check this isn't coming from the second arg of a comma expression though (not an lvalue) 913 // xxx - need to test that this code is still reachable 912 914 if ( CommaExpr *commaArg = dynamic_cast< CommaExpr* >( arg ) ) { 913 915 commaArg->set_arg2( new AddressExpr( commaArg->get_arg2() ) ); … … 1291 1293 } else if ( needsAdapter( function, scopeTyVars ) ) { 1292 1294 // std::cerr << "needs adapter: "; 1293 // for ( TyVarMap::iterator i = scopeTyVars.begin(); i != scopeTyVars.end(); ++i ) { 1294 // std::cerr << i->first << " "; 1295 // } 1296 // std::cerr << "\n"; 1295 // printTyVarMap( std::cerr, scopeTyVars ); 1296 // std::cerr << *env << std::endl; 1297 1297 // change the application so it calls the adapter rather than the passed function 1298 1298 ret = applyAdapter( appExpr, function, arg, scopeTyVars ); … … 1345 1345 } // if 1346 1346 } // if 1347 // isPolyType check needs to happen before mutating addrExpr arg, so pull it forward 1348 // out of the if condition. 1349 bool polytype = isPolyType( addrExpr->get_arg()->get_results().front(), scopeTyVars, env ); 1347 1350 addrExpr->set_arg( mutateExpression( addrExpr->get_arg() ) ); 1348 if ( isPolyType( addrExpr->get_arg()->get_results().front(), scopeTyVars, env )|| needs ) {1351 if ( polytype || needs ) { 1349 1352 Expression *ret = addrExpr->get_arg(); 1350 1353 delete ret->get_results().front(); … … 1366 1369 return new VariableExpr( functionObj ); 1367 1370 } 1368 1371 1369 1372 Statement * Pass1::mutate( ReturnStmt *returnStmt ) { 1370 1373 if ( retval && returnStmt->get_expr() ) { … … 1886 1889 } 1887 1890 } 1888 1891 1889 1892 Type *ret = Mutator::mutate( funcType ); 1890 1893 … … 1905 1908 1906 1909 std::list<Expression*> designators; 1907 objectDecl->set_init( new SingleInit( alloc, designators ) );1910 objectDecl->set_init( new SingleInit( alloc, designators, false ) ); // not constructed 1908 1911 } 1909 1912 } … … 1946 1949 return derefdVar; 1947 1950 } 1948 1951 1949 1952 Expression *PolyGenericCalculator::mutate( MemberExpr *memberExpr ) { 1950 1953 // mutate, exiting early if no longer MemberExpr … … 2144 2147 Type *ty = offsetofExpr->get_type(); 2145 2148 if ( ! findGeneric( ty ) ) return offsetofExpr; 2146 2149 2147 2150 if ( StructInstType *structType = dynamic_cast< StructInstType* >( ty ) ) { 2148 2151 // replace offsetof expression by index into offset array -
src/GenPoly/CopyParams.cc
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // CopyParams.cc -- 7 // CopyParams.cc -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr11 // Last Modified By : Rob Schluntz 12 12 // Last Modified On : Tue May 19 07:33:31 2015 13 13 // Update Count : 1 … … 29 29 public: 30 30 CopyParams(); 31 31 32 32 virtual void visit( FunctionDecl *funcDecl ); 33 33 virtual void visit( AddressExpr *addrExpr ); … … 50 50 if ( funcDecl->get_statements() ) { 51 51 funcDecl->get_statements()->accept( *this ); 52 52 53 53 if ( ! modVars.empty() ) { 54 54 std::map< std::string, DeclarationWithType* > assignOps; … … 57 57 if ( (*tyVar)->get_kind() == TypeDecl::Any ) { 58 58 assert( !(*tyVar)->get_assertions().empty() ); 59 assert( (*tyVar)->get_assertions().front()->get_name() == "?=?" ); 59 60 assignOps[ (*tyVar)->get_name() ] = (*tyVar)->get_assertions().front(); 60 61 } // if -
src/GenPoly/GenPoly.cc
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // GenPoly.cc -- 7 // GenPoly.cc -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Tue Dec 15 16:11:18 201511 // Last Modified By : Rob Schluntz 12 // Last Modified On : Mon May 02 14:53:33 2016 13 13 // Update Count : 13 14 14 // … … 81 81 return 0; 82 82 } 83 83 84 84 Type *isPolyType( Type *type, const TyVarMap &tyVars, const TypeSubstitution *env ) { 85 85 if ( TypeInstType *typeInst = dynamic_cast< TypeInstType * >( type ) ) { … … 112 112 return 0; 113 113 } 114 114 115 115 Type *isPolyPtr( Type *type, const TyVarMap &tyVars, const TypeSubstitution *env ) { 116 116 if ( PointerType *ptr = dynamic_cast< PointerType *>( type ) ) { … … 146 146 return isPolyType( type, env ); 147 147 } 148 148 149 149 Type * hasPolyBase( Type *type, const TyVarMap &tyVars, int *levels, const TypeSubstitution *env ) { 150 150 int dummy; … … 192 192 if ( ! fn || fn->get_name() != std::string("*?") ) return 0; 193 193 expr = *untypedExpr->begin_args(); 194 } else if ( CommaExpr *commaExpr = dynamic_cast< CommaExpr* >( expr ) ) { 195 // copy constructors insert comma exprs, look at second argument which contains the variable 196 expr = commaExpr->get_arg2(); 197 continue; 194 198 } else break; 195 199 … … 209 213 } 210 214 } 211 215 212 216 void printTyVarMap( std::ostream &os, const TyVarMap &tyVarMap ) { 213 217 for ( TyVarMap::const_iterator i = tyVarMap.begin(); i != tyVarMap.end(); ++i ) { -
src/GenPoly/PolyMutator.cc
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // PolyMutator.cc -- 7 // PolyMutator.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 : Fri Aug 14 15:28:50 201512 // Last Modified On : Mon May 02 14:50:58 2016 13 13 // Update Count : 11 14 14 // … … 63 63 env = expr->get_env(); 64 64 } 65 // xxx - should env be cloned (or moved) onto the result of the mutate? 65 66 return expr->acceptMutator( *this ); 66 67 } else { … … 144 145 return untypedExpr; 145 146 } 146 147 147 148 148 149 Initializer *PolyMutator::mutate( SingleInit *singleInit ) { 149 150 singleInit->set_value( mutateExpression( singleInit->get_value() ) ); -
src/GenPoly/Specialize.cc
r0638c44 ra1d6d80 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 12:40:33201613 // Update Count : 1812 // Last Modified On : Thu Apr 28 15:17:45 2016 13 // Update Count : 24 14 14 // 15 15 … … 41 41 virtual Expression * mutate( AddressExpr *castExpr ); 42 42 virtual Expression * mutate( CastExpr *castExpr ); 43 virtual Expression * mutate( LogicalExpr *logicalExpr );44 virtual Expression * mutate( ConditionalExpr *conditionalExpr );45 virtual Expression * mutate( CommaExpr *commaExpr );43 // virtual Expression * mutate( LogicalExpr *logicalExpr ); 44 // virtual Expression * mutate( ConditionalExpr *conditionalExpr ); 45 // virtual Expression * mutate( CommaExpr *commaExpr ); 46 46 47 47 private: … … 142 142 143 143 Expression * Specialize::doSpecialization( Type *formalType, Expression *actual, InferredParams *inferParams ) { 144 assert( ! actual->get_results().empty() ); 144 assert( ! actual->get_results().empty() ); // using front, should have this assert 145 145 if ( needsSpecialization( formalType, actual->get_results().front(), env ) ) { 146 146 FunctionType *funType; … … 212 212 } 213 213 214 Expression * Specialize::mutate( LogicalExpr *logicalExpr ) { 215 return logicalExpr; 216 } 217 218 Expression * Specialize::mutate( ConditionalExpr *condExpr ) { 219 return condExpr; 220 } 221 222 Expression * Specialize::mutate( CommaExpr *commaExpr ) { 223 return commaExpr; 224 } 214 // Removing these for now. Richard put these in for some reason, but it's not clear why. 215 // In particular, copy constructors produce a comma expression, and with this code the parts 216 // of that comma expression are not specialized, which causes problems. 217 218 // Expression * Specialize::mutate( LogicalExpr *logicalExpr ) { 219 // return logicalExpr; 220 // } 221 222 // Expression * Specialize::mutate( ConditionalExpr *condExpr ) { 223 // return condExpr; 224 // } 225 226 // Expression * Specialize::mutate( CommaExpr *commaExpr ) { 227 // return commaExpr; 228 // } 225 229 } // namespace GenPoly 226 230 -
src/InitTweak/InitModel.cc
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // InitModel.cc -- 7 // InitModel.cc -- 8 8 // 9 9 // Author : Rodolfo G. Esteves 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : T ue May 19 16:37:08 201513 // Update Count : 111 // Last Modified By : Rob Schluntz 12 // Last Modified On : Thu Jan 07 13:38:46 2016 13 // Update Count : 5 14 14 // 15 15 … … 198 198 assert(init == 0 && single != 0); 199 199 std::list< Expression * > empty; 200 init = new SingleInit( single->get_expr(), empty );200 init = new SingleInit( single->get_expr(), empty, false ); // cannot be constructed 201 201 return; 202 202 } … … 214 214 } // if 215 215 216 init = new ListInit( contents ); 216 std::list< Expression * > desig; 217 init = new ListInit( contents, desig, false ); // cannot be constructed 217 218 return; 218 219 } -
src/InitTweak/module.mk
r0638c44 ra1d6d80 11 11 ## Created On : Mon Jun 1 17:49:17 2015 12 12 ## Last Modified By : Rob Schluntz 13 ## Last Modified On : Mon Jan 11 14:40:16201614 ## Update Count : 213 ## Last Modified On : Thu Apr 28 12:23:17 2016 14 ## Update Count : 3 15 15 ############################################################################### 16 16 17 SRC += InitTweak/ RemoveInit.cc18 17 SRC += InitTweak/GenInit.cc \ 18 InitTweak/FixInit.cc -
src/MakeLibCfa.cc
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // MakeLibCfa.cc -- 7 // MakeLibCfa.cc -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sat May 16 10:33:33 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Fri Jun 26 16:52:59 201513 // Update Count : 1414 // 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Fri Apr 22 13:54:15 2016 13 // Update Count : 40 14 // 15 15 16 16 #include "MakeLibCfa.h" … … 29 29 void visit( FunctionDecl* funcDecl ); 30 30 void visit( ObjectDecl* objDecl ); 31 31 32 32 std::list< Declaration* > &get_newDecls() { return newDecls; } 33 33 private: … … 43 43 void MakeLibCfa::visit( FunctionDecl* origFuncDecl ) { 44 44 if ( origFuncDecl->get_linkage() != LinkageSpec::Intrinsic ) return; 45 45 if ( origFuncDecl->get_statements() ) return; 46 46 47 FunctionDecl *funcDecl = origFuncDecl->clone(); 47 48 CodeGen::OperatorInfo opInfo; … … 54 55 assert( param != funcDecl->get_functionType()->get_parameters().end() ); 55 56 56 if ( (*param)->get_name() == "" ) { 57 (*param)->set_name( paramNamer.newName() ); 58 (*param)->set_linkage( LinkageSpec::C ); 59 } // if 57 for ( ; param != funcDecl->get_functionType()->get_parameters().end(); ++param ) { 58 if ( (*param)->get_name() == "" ) { 59 (*param)->set_name( paramNamer.newName() ); 60 (*param)->set_linkage( LinkageSpec::C ); 61 } 62 newExpr->get_args().push_back( new VariableExpr( *param ) ); 63 } // for 64 65 funcDecl->set_statements( new CompoundStmt( std::list< Label >() ) ); 66 newDecls.push_back( funcDecl ); 60 67 61 68 switch ( opInfo.type ) { … … 65 72 case CodeGen::OT_POSTFIX: 66 73 case CodeGen::OT_INFIX: 67 newExpr->get_args().push_back( new VariableExpr( *param ) );68 break;69 74 case CodeGen::OT_PREFIXASSIGN: 70 75 case CodeGen::OT_POSTFIXASSIGN: 71 76 case CodeGen::OT_INFIXASSIGN: 72 { 73 newExpr->get_args().push_back( new VariableExpr( *param ) ); 74 // UntypedExpr *deref = new UntypedExpr( new NameExpr( "*?" ) ); 75 // deref->get_args().push_back( new VariableExpr( *param ) ); 76 // newExpr->get_args().push_back( deref ); 77 funcDecl->get_statements()->get_kids().push_back( new ReturnStmt( std::list< Label >(), newExpr ) ); 77 78 break; 78 } 79 case CodeGen::OT_CTOR: 80 // ctors don't return a value 81 if ( funcDecl->get_functionType()->get_parameters().size() == 1 ) { 82 // intrinsic default constructors should do nothing 83 // delete newExpr; 84 break; 85 } else { 86 assert( funcDecl->get_functionType()->get_parameters().size() == 2 ); 87 // anything else is a single parameter constructor that is effectively a C-style assignment 88 // delete newExpr->get_function(); 89 assert(newExpr->get_args().size()==2); 90 newExpr->set_function( new NameExpr( "?=?" ) ); 91 funcDecl->get_statements()->get_kids().push_back( new ExprStmt( std::list< Label >(), newExpr ) ); 92 } 93 break; 94 case CodeGen::OT_DTOR: 95 // intrinsic destructors should do nothing 96 // delete newExpr; 97 break; 79 98 case CodeGen::OT_CONSTANT: 80 99 case CodeGen::OT_LABELADDRESS: … … 82 101 assert( false ); 83 102 } // switch 84 85 for ( param++; param != funcDecl->get_functionType()->get_parameters().end(); ++param ) {86 if ( (*param)->get_name() == "" ) {87 (*param)->set_name( paramNamer.newName() );88 (*param)->set_linkage( LinkageSpec::C );89 }90 newExpr->get_args().push_back( new VariableExpr( *param ) );91 } // for92 funcDecl->set_statements( new CompoundStmt( std::list< Label >() ) );93 funcDecl->get_statements()->get_kids().push_back( new ReturnStmt( std::list< Label >(), newExpr ) );94 newDecls.push_back( funcDecl );95 103 } 96 104 97 105 void MakeLibCfa::visit( ObjectDecl* origObjDecl ) { 98 106 if ( origObjDecl->get_linkage() != LinkageSpec::Intrinsic ) return; 99 107 100 108 ObjectDecl *objDecl = origObjDecl->clone(); 101 109 assert( ! objDecl->get_init() ); 102 110 std::list< Expression* > noDesignators; 103 objDecl->set_init( new SingleInit( new NameExpr( objDecl->get_name() ), noDesignators ) );111 objDecl->set_init( new SingleInit( new NameExpr( objDecl->get_name() ), noDesignators, false ) ); // cannot be constructed 104 112 newDecls.push_back( objDecl ); 105 113 } 106 114 } // namespace LibCfa 107 108 // Local Variables: //109 // tab-width: 4 //110 // mode: c++ //111 // compile-command: "make install" //112 // End: // -
src/Makefile.in
r0638c44 ra1d6d80 123 123 GenPoly/driver_cfa_cpp-FindFunction.$(OBJEXT) \ 124 124 GenPoly/driver_cfa_cpp-DeclMutator.$(OBJEXT) \ 125 InitTweak/driver_cfa_cpp-RemoveInit.$(OBJEXT) \ 125 InitTweak/driver_cfa_cpp-GenInit.$(OBJEXT) \ 126 InitTweak/driver_cfa_cpp-FixInit.$(OBJEXT) \ 126 127 Parser/driver_cfa_cpp-parser.$(OBJEXT) \ 127 128 Parser/driver_cfa_cpp-lex.$(OBJEXT) \ … … 159 160 SymTab/driver_cfa_cpp-ImplementationType.$(OBJEXT) \ 160 161 SymTab/driver_cfa_cpp-TypeEquality.$(OBJEXT) \ 162 SymTab/driver_cfa_cpp-Autogen.$(OBJEXT) \ 161 163 SynTree/driver_cfa_cpp-Type.$(OBJEXT) \ 162 164 SynTree/driver_cfa_cpp-VoidType.$(OBJEXT) \ … … 345 347 GenPoly/ScrubTyVars.cc GenPoly/Lvalue.cc GenPoly/Specialize.cc \ 346 348 GenPoly/CopyParams.cc GenPoly/FindFunction.cc \ 347 GenPoly/DeclMutator.cc InitTweak/RemoveInit.cc \ 348 Parser/parser.yy Parser/lex.ll Parser/TypedefTable.cc \ 349 Parser/ParseNode.cc Parser/DeclarationNode.cc \ 350 Parser/ExpressionNode.cc Parser/StatementNode.cc \ 351 Parser/InitializerNode.cc Parser/TypeData.cc \ 352 Parser/LinkageSpec.cc Parser/parseutility.cc Parser/Parser.cc \ 349 GenPoly/DeclMutator.cc InitTweak/GenInit.cc \ 350 InitTweak/FixInit.cc Parser/parser.yy Parser/lex.ll \ 351 Parser/TypedefTable.cc Parser/ParseNode.cc \ 352 Parser/DeclarationNode.cc Parser/ExpressionNode.cc \ 353 Parser/StatementNode.cc Parser/InitializerNode.cc \ 354 Parser/TypeData.cc Parser/LinkageSpec.cc \ 355 Parser/parseutility.cc Parser/Parser.cc \ 353 356 ResolvExpr/AlternativeFinder.cc ResolvExpr/Alternative.cc \ 354 357 ResolvExpr/Unify.cc ResolvExpr/PtrsAssignable.cc \ … … 362 365 SymTab/Mangler.cc SymTab/Validate.cc SymTab/FixFunction.cc \ 363 366 SymTab/ImplementationType.cc SymTab/TypeEquality.cc \ 364 SynTree/Type.cc SynTree/VoidType.cc SynTree/BasicType.cc \ 365 SynTree/PointerType.cc SynTree/ArrayType.cc \ 366 SynTree/FunctionType.cc SynTree/ReferenceToType.cc \ 367 SynTree/TupleType.cc SynTree/TypeofType.cc SynTree/AttrType.cc \ 367 SymTab/Autogen.cc SynTree/Type.cc SynTree/VoidType.cc \ 368 SynTree/BasicType.cc SynTree/PointerType.cc \ 369 SynTree/ArrayType.cc SynTree/FunctionType.cc \ 370 SynTree/ReferenceToType.cc SynTree/TupleType.cc \ 371 SynTree/TypeofType.cc SynTree/AttrType.cc \ 368 372 SynTree/VarArgsType.cc SynTree/Constant.cc \ 369 373 SynTree/Expression.cc SynTree/TupleExpr.cc \ … … 561 565 @$(MKDIR_P) InitTweak/$(DEPDIR) 562 566 @: > InitTweak/$(DEPDIR)/$(am__dirstamp) 563 InitTweak/driver_cfa_cpp-RemoveInit.$(OBJEXT): \ 564 InitTweak/$(am__dirstamp) InitTweak/$(DEPDIR)/$(am__dirstamp) 567 InitTweak/driver_cfa_cpp-GenInit.$(OBJEXT): InitTweak/$(am__dirstamp) \ 568 InitTweak/$(DEPDIR)/$(am__dirstamp) 569 InitTweak/driver_cfa_cpp-FixInit.$(OBJEXT): InitTweak/$(am__dirstamp) \ 570 InitTweak/$(DEPDIR)/$(am__dirstamp) 565 571 Parser/parser.h: Parser/parser.cc 566 572 @if test ! -f $@; then rm -f Parser/parser.cc; else :; fi … … 670 676 SymTab/driver_cfa_cpp-TypeEquality.$(OBJEXT): SymTab/$(am__dirstamp) \ 671 677 SymTab/$(DEPDIR)/$(am__dirstamp) 678 SymTab/driver_cfa_cpp-Autogen.$(OBJEXT): SymTab/$(am__dirstamp) \ 679 SymTab/$(DEPDIR)/$(am__dirstamp) 672 680 SynTree/$(am__dirstamp): 673 681 @$(MKDIR_P) SynTree … … 792 800 -rm -f GenPoly/driver_cfa_cpp-ScrubTyVars.$(OBJEXT) 793 801 -rm -f GenPoly/driver_cfa_cpp-Specialize.$(OBJEXT) 794 -rm -f InitTweak/driver_cfa_cpp-RemoveInit.$(OBJEXT) 802 -rm -f InitTweak/driver_cfa_cpp-FixInit.$(OBJEXT) 803 -rm -f InitTweak/driver_cfa_cpp-GenInit.$(OBJEXT) 795 804 -rm -f Parser/driver_cfa_cpp-DeclarationNode.$(OBJEXT) 796 805 -rm -f Parser/driver_cfa_cpp-ExpressionNode.$(OBJEXT) … … 822 831 -rm -f ResolvExpr/driver_cfa_cpp-TypeEnvironment.$(OBJEXT) 823 832 -rm -f ResolvExpr/driver_cfa_cpp-Unify.$(OBJEXT) 833 -rm -f SymTab/driver_cfa_cpp-Autogen.$(OBJEXT) 824 834 -rm -f SymTab/driver_cfa_cpp-FixFunction.$(OBJEXT) 825 835 -rm -f SymTab/driver_cfa_cpp-ImplementationType.$(OBJEXT) … … 897 907 @AMDEP_TRUE@@am__include@ @am__quote@GenPoly/$(DEPDIR)/driver_cfa_cpp-ScrubTyVars.Po@am__quote@ 898 908 @AMDEP_TRUE@@am__include@ @am__quote@GenPoly/$(DEPDIR)/driver_cfa_cpp-Specialize.Po@am__quote@ 899 @AMDEP_TRUE@@am__include@ @am__quote@InitTweak/$(DEPDIR)/driver_cfa_cpp-RemoveInit.Po@am__quote@ 909 @AMDEP_TRUE@@am__include@ @am__quote@InitTweak/$(DEPDIR)/driver_cfa_cpp-FixInit.Po@am__quote@ 910 @AMDEP_TRUE@@am__include@ @am__quote@InitTweak/$(DEPDIR)/driver_cfa_cpp-GenInit.Po@am__quote@ 900 911 @AMDEP_TRUE@@am__include@ @am__quote@Parser/$(DEPDIR)/driver_cfa_cpp-DeclarationNode.Po@am__quote@ 901 912 @AMDEP_TRUE@@am__include@ @am__quote@Parser/$(DEPDIR)/driver_cfa_cpp-ExpressionNode.Po@am__quote@ … … 927 938 @AMDEP_TRUE@@am__include@ @am__quote@ResolvExpr/$(DEPDIR)/driver_cfa_cpp-TypeEnvironment.Po@am__quote@ 928 939 @AMDEP_TRUE@@am__include@ @am__quote@ResolvExpr/$(DEPDIR)/driver_cfa_cpp-Unify.Po@am__quote@ 940 @AMDEP_TRUE@@am__include@ @am__quote@SymTab/$(DEPDIR)/driver_cfa_cpp-Autogen.Po@am__quote@ 929 941 @AMDEP_TRUE@@am__include@ @am__quote@SymTab/$(DEPDIR)/driver_cfa_cpp-FixFunction.Po@am__quote@ 930 942 @AMDEP_TRUE@@am__include@ @am__quote@SymTab/$(DEPDIR)/driver_cfa_cpp-ImplementationType.Po@am__quote@ … … 1366 1378 @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o GenPoly/driver_cfa_cpp-DeclMutator.obj `if test -f 'GenPoly/DeclMutator.cc'; then $(CYGPATH_W) 'GenPoly/DeclMutator.cc'; else $(CYGPATH_W) '$(srcdir)/GenPoly/DeclMutator.cc'; fi` 1367 1379 1368 InitTweak/driver_cfa_cpp-RemoveInit.o: InitTweak/RemoveInit.cc 1369 @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT InitTweak/driver_cfa_cpp-RemoveInit.o -MD -MP -MF InitTweak/$(DEPDIR)/driver_cfa_cpp-RemoveInit.Tpo -c -o InitTweak/driver_cfa_cpp-RemoveInit.o `test -f 'InitTweak/RemoveInit.cc' || echo '$(srcdir)/'`InitTweak/RemoveInit.cc 1370 @am__fastdepCXX_TRUE@ $(am__mv) InitTweak/$(DEPDIR)/driver_cfa_cpp-RemoveInit.Tpo InitTweak/$(DEPDIR)/driver_cfa_cpp-RemoveInit.Po 1371 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='InitTweak/RemoveInit.cc' object='InitTweak/driver_cfa_cpp-RemoveInit.o' libtool=no @AMDEPBACKSLASH@ 1372 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 1373 @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o InitTweak/driver_cfa_cpp-RemoveInit.o `test -f 'InitTweak/RemoveInit.cc' || echo '$(srcdir)/'`InitTweak/RemoveInit.cc 1374 1375 InitTweak/driver_cfa_cpp-RemoveInit.obj: InitTweak/RemoveInit.cc 1376 @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT InitTweak/driver_cfa_cpp-RemoveInit.obj -MD -MP -MF InitTweak/$(DEPDIR)/driver_cfa_cpp-RemoveInit.Tpo -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` 1377 @am__fastdepCXX_TRUE@ $(am__mv) InitTweak/$(DEPDIR)/driver_cfa_cpp-RemoveInit.Tpo InitTweak/$(DEPDIR)/driver_cfa_cpp-RemoveInit.Po 1378 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='InitTweak/RemoveInit.cc' object='InitTweak/driver_cfa_cpp-RemoveInit.obj' libtool=no @AMDEPBACKSLASH@ 1379 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 1380 @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` 1380 InitTweak/driver_cfa_cpp-GenInit.o: InitTweak/GenInit.cc 1381 @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT InitTweak/driver_cfa_cpp-GenInit.o -MD -MP -MF InitTweak/$(DEPDIR)/driver_cfa_cpp-GenInit.Tpo -c -o InitTweak/driver_cfa_cpp-GenInit.o `test -f 'InitTweak/GenInit.cc' || echo '$(srcdir)/'`InitTweak/GenInit.cc 1382 @am__fastdepCXX_TRUE@ $(am__mv) InitTweak/$(DEPDIR)/driver_cfa_cpp-GenInit.Tpo InitTweak/$(DEPDIR)/driver_cfa_cpp-GenInit.Po 1383 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='InitTweak/GenInit.cc' object='InitTweak/driver_cfa_cpp-GenInit.o' libtool=no @AMDEPBACKSLASH@ 1384 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 1385 @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o InitTweak/driver_cfa_cpp-GenInit.o `test -f 'InitTweak/GenInit.cc' || echo '$(srcdir)/'`InitTweak/GenInit.cc 1386 1387 InitTweak/driver_cfa_cpp-GenInit.obj: InitTweak/GenInit.cc 1388 @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT InitTweak/driver_cfa_cpp-GenInit.obj -MD -MP -MF InitTweak/$(DEPDIR)/driver_cfa_cpp-GenInit.Tpo -c -o InitTweak/driver_cfa_cpp-GenInit.obj `if test -f 'InitTweak/GenInit.cc'; then $(CYGPATH_W) 'InitTweak/GenInit.cc'; else $(CYGPATH_W) '$(srcdir)/InitTweak/GenInit.cc'; fi` 1389 @am__fastdepCXX_TRUE@ $(am__mv) InitTweak/$(DEPDIR)/driver_cfa_cpp-GenInit.Tpo InitTweak/$(DEPDIR)/driver_cfa_cpp-GenInit.Po 1390 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='InitTweak/GenInit.cc' object='InitTweak/driver_cfa_cpp-GenInit.obj' libtool=no @AMDEPBACKSLASH@ 1391 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 1392 @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o InitTweak/driver_cfa_cpp-GenInit.obj `if test -f 'InitTweak/GenInit.cc'; then $(CYGPATH_W) 'InitTweak/GenInit.cc'; else $(CYGPATH_W) '$(srcdir)/InitTweak/GenInit.cc'; fi` 1393 1394 InitTweak/driver_cfa_cpp-FixInit.o: InitTweak/FixInit.cc 1395 @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT InitTweak/driver_cfa_cpp-FixInit.o -MD -MP -MF InitTweak/$(DEPDIR)/driver_cfa_cpp-FixInit.Tpo -c -o InitTweak/driver_cfa_cpp-FixInit.o `test -f 'InitTweak/FixInit.cc' || echo '$(srcdir)/'`InitTweak/FixInit.cc 1396 @am__fastdepCXX_TRUE@ $(am__mv) InitTweak/$(DEPDIR)/driver_cfa_cpp-FixInit.Tpo InitTweak/$(DEPDIR)/driver_cfa_cpp-FixInit.Po 1397 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='InitTweak/FixInit.cc' object='InitTweak/driver_cfa_cpp-FixInit.o' libtool=no @AMDEPBACKSLASH@ 1398 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 1399 @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o InitTweak/driver_cfa_cpp-FixInit.o `test -f 'InitTweak/FixInit.cc' || echo '$(srcdir)/'`InitTweak/FixInit.cc 1400 1401 InitTweak/driver_cfa_cpp-FixInit.obj: InitTweak/FixInit.cc 1402 @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` 1403 @am__fastdepCXX_TRUE@ $(am__mv) InitTweak/$(DEPDIR)/driver_cfa_cpp-FixInit.Tpo InitTweak/$(DEPDIR)/driver_cfa_cpp-FixInit.Po 1404 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='InitTweak/FixInit.cc' object='InitTweak/driver_cfa_cpp-FixInit.obj' libtool=no @AMDEPBACKSLASH@ 1405 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 1406 @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` 1381 1407 1382 1408 Parser/driver_cfa_cpp-parser.o: Parser/parser.cc … … 1869 1895 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 1870 1896 @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o SymTab/driver_cfa_cpp-TypeEquality.obj `if test -f 'SymTab/TypeEquality.cc'; then $(CYGPATH_W) 'SymTab/TypeEquality.cc'; else $(CYGPATH_W) '$(srcdir)/SymTab/TypeEquality.cc'; fi` 1897 1898 SymTab/driver_cfa_cpp-Autogen.o: SymTab/Autogen.cc 1899 @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT SymTab/driver_cfa_cpp-Autogen.o -MD -MP -MF SymTab/$(DEPDIR)/driver_cfa_cpp-Autogen.Tpo -c -o SymTab/driver_cfa_cpp-Autogen.o `test -f 'SymTab/Autogen.cc' || echo '$(srcdir)/'`SymTab/Autogen.cc 1900 @am__fastdepCXX_TRUE@ $(am__mv) SymTab/$(DEPDIR)/driver_cfa_cpp-Autogen.Tpo SymTab/$(DEPDIR)/driver_cfa_cpp-Autogen.Po 1901 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SymTab/Autogen.cc' object='SymTab/driver_cfa_cpp-Autogen.o' libtool=no @AMDEPBACKSLASH@ 1902 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 1903 @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o SymTab/driver_cfa_cpp-Autogen.o `test -f 'SymTab/Autogen.cc' || echo '$(srcdir)/'`SymTab/Autogen.cc 1904 1905 SymTab/driver_cfa_cpp-Autogen.obj: SymTab/Autogen.cc 1906 @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT SymTab/driver_cfa_cpp-Autogen.obj -MD -MP -MF SymTab/$(DEPDIR)/driver_cfa_cpp-Autogen.Tpo -c -o SymTab/driver_cfa_cpp-Autogen.obj `if test -f 'SymTab/Autogen.cc'; then $(CYGPATH_W) 'SymTab/Autogen.cc'; else $(CYGPATH_W) '$(srcdir)/SymTab/Autogen.cc'; fi` 1907 @am__fastdepCXX_TRUE@ $(am__mv) SymTab/$(DEPDIR)/driver_cfa_cpp-Autogen.Tpo SymTab/$(DEPDIR)/driver_cfa_cpp-Autogen.Po 1908 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SymTab/Autogen.cc' object='SymTab/driver_cfa_cpp-Autogen.obj' libtool=no @AMDEPBACKSLASH@ 1909 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 1910 @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o SymTab/driver_cfa_cpp-Autogen.obj `if test -f 'SymTab/Autogen.cc'; then $(CYGPATH_W) 'SymTab/Autogen.cc'; else $(CYGPATH_W) '$(srcdir)/SymTab/Autogen.cc'; fi` 1871 1911 1872 1912 SynTree/driver_cfa_cpp-Type.o: SynTree/Type.cc -
src/Parser/DeclarationNode.cc
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // DeclarationNode.cc -- 7 // DeclarationNode.cc -- 8 8 // 9 9 // Author : Rodolfo G. Esteves 10 10 // Created On : Sat May 16 12:34:05 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Wed Apr 13 16:53:17201611 // Last Modified By : Rob Schluntz 12 // Last Modified On : Thu Apr 14 15:38:09 2016 13 13 // Update Count : 161 14 14 // … … 97 97 os << endl << string( indent + 2, ' ' ) << "with initializer "; 98 98 initializer->printOneLine( os ); 99 os << " maybe constructed? " << initializer->get_maybeConstructed(); 100 99 101 } // if 100 102 … … 353 355 } // if 354 356 } 355 357 356 358 DeclarationNode *DeclarationNode::addQualifiers( DeclarationNode *q ) { 357 359 if ( q ) { … … 504 506 assert( false ); 505 507 } // switch 506 508 507 509 return this; 508 510 } … … 615 617 assert( a->type->kind == TypeData::Array ); 616 618 TypeData *lastArray = findLast( a->type ); 617 if ( type ) { 619 if ( type ) { 618 620 switch ( type->kind ) { 619 621 case TypeData::Aggregate: … … 659 661 } // if 660 662 } 661 663 662 664 DeclarationNode *DeclarationNode::addIdList( DeclarationNode *ids ) { 663 665 type = addIdListToType( type, ids ); … … 864 866 Type *DeclarationNode::buildType() const { 865 867 assert( type ); 866 868 867 869 switch ( type->kind ) { 868 870 case TypeData::Enum: -
src/Parser/InitializerNode.cc
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // InitializerNode.cc -- 8 // 7 // InitializerNode.cc -- 8 // 9 9 // Author : Rodolfo G. Esteves 10 10 // Created On : Sat May 16 13:20:24 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Thu Oct 8 17:18:55 201513 // Update Count : 414 // 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Thu Jan 07 13:32:57 2016 13 // Update Count : 13 14 // 15 15 16 16 #include <cassert> … … 23 23 24 24 InitializerNode::InitializerNode( ExpressionNode *_expr, bool aggrp, ExpressionNode *des ) 25 : expr( _expr ), aggregate( aggrp ), designator( des ), kids( 0 ) {25 : expr( _expr ), aggregate( aggrp ), designator( des ), kids( 0 ), maybeConstructed( true ) { 26 26 if ( aggrp ) 27 27 kids = dynamic_cast< InitializerNode *>( get_link() ); … … 32 32 33 33 InitializerNode::InitializerNode( InitializerNode *init, bool aggrp, ExpressionNode *des ) 34 : expr( 0 ), aggregate( aggrp ), designator( des ), kids( 0 ) {34 : expr( 0 ), aggregate( aggrp ), designator( des ), kids( 0 ), maybeConstructed( true ) { 35 35 if ( init != 0 ) 36 36 set_link(init); … … 91 91 } // if 92 92 93 return new ListInit( initlist, designlist );93 return new ListInit( initlist, designlist, maybeConstructed ); 94 94 } else { 95 95 std::list< Expression *> designators; … … 99 99 100 100 if ( get_expression() != 0) 101 return new SingleInit( get_expression()->build(), designators );101 return new SingleInit( get_expression()->build(), designators, maybeConstructed ); 102 102 } // if 103 103 -
src/Parser/ParseNode.h
r0638c44 ra1d6d80 10 10 // Created On : Sat May 16 13:28:16 2015 11 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Mon Apr 11 11:50:52 201612 // Last Modified On : Thu Apr 14 15:37:52 2016 13 13 // Update Count : 205 14 14 // … … 185 185 // monadic 186 186 UnPlus, UnMinus, AddressOf, PointTo, Neg, BitNeg, Incr, IncrPost, Decr, DecrPost, LabelAddress, 187 Ctor, Dtor, 187 188 }; 188 189 … … 525 526 ExpressionNode *get_designators() const { return designator; } 526 527 528 InitializerNode *set_maybeConstructed( bool value ) { maybeConstructed = value; return this; } 529 bool get_maybeConstructed() const { return maybeConstructed; } 530 527 531 InitializerNode *next_init() const { return kids; } 528 532 … … 536 540 ExpressionNode *designator; // may be list 537 541 InitializerNode *kids; 542 bool maybeConstructed; 538 543 }; 539 544 -
src/Parser/TypeData.cc
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // TypeData.cc -- 7 // TypeData.cc -- 8 8 // 9 9 // Author : Rodolfo G. Esteves 10 10 // Created On : Sat May 16 15:12:51 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Wed Mar 2 17:26:45201611 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Apr 06 16:57:53 2016 13 13 // Update Count : 49 14 14 // … … 449 449 for ( std::list< TypeDecl* >::iterator i = outputList.begin(); i != outputList.end(); ++i ) { 450 450 if ( (*i)->get_kind() == TypeDecl::Any ) { 451 // add assertion parameters to `type' tyvars in reverse order 452 // add dtor: void ^?{}(T *) 453 FunctionType *dtorType = new FunctionType( Type::Qualifiers(), false ); 454 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 ) ); 455 (*i)->get_assertions().push_front( new FunctionDecl( "^?{}", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, dtorType, 0, false, false ) ); 456 457 // add copy ctor: void ?{}(T *, T) 458 FunctionType *copyCtorType = new FunctionType( Type::Qualifiers(), false ); 459 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 ) ); 460 copyCtorType->get_parameters().push_back( new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new TypeInstType( Type::Qualifiers(), (*i)->get_name(), *i ), 0 ) ); 461 (*i)->get_assertions().push_front( new FunctionDecl( "?{}", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, copyCtorType, 0, false, false ) ); 462 463 // add default ctor: void ?{}(T *) 464 FunctionType *ctorType = new FunctionType( Type::Qualifiers(), false ); 465 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 ) ); 466 (*i)->get_assertions().push_front( new FunctionDecl( "?{}", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, ctorType, 0, false, false ) ); 467 468 // add assignment operator: T * ?=?(T *, T) 451 469 FunctionType *assignType = new FunctionType( Type::Qualifiers(), false ); 452 470 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 ) ); … … 902 920 if ( cur->get_enumeratorValue() != NULL ) { 903 921 ObjectDecl *member = dynamic_cast<ObjectDecl *>(*members); 904 member->set_init( new SingleInit( maybeBuild< Expression >( cur->get_enumeratorValue() ) ) );922 member->set_init( new SingleInit( maybeBuild< Expression >( cur->get_enumeratorValue() ), std::list< Expression * >() ) ); 905 923 } // if 906 924 } // for -
src/Parser/parser.cc
r0638c44 ra1d6d80 7468 7468 /* Line 1806 of yacc.c */ 7469 7469 #line 1704 "parser.yy" 7470 { (yyval.in) = (yyvsp[(2) - (2)].in) ; }7470 { (yyval.in) = (yyvsp[(2) - (2)].in)->set_maybeConstructed( false ); } 7471 7471 break; 7472 7472 -
src/Parser/parser.yy
r0638c44 ra1d6d80 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 : Wed Apr 13 16:58:43 2016 13 13 // Update Count : 1519 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 … … 1702 1702 { $$ = $2; } 1703 1703 | ATassign initializer 1704 { $$ = $2 ; }1704 { $$ = $2->set_maybeConstructed( false ); } 1705 1705 ; 1706 1706 -
src/ResolvExpr/AlternativeFinder.cc
r0638c44 ra1d6d80 10 10 // Created On : Sat May 16 23:52:08 2015 11 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Feb 10 17:00:04201612 // Last Modified On : Wed Apr 20 14:24:03 2016 13 13 // Update Count : 24 14 14 // … … 982 982 } // for 983 983 } 984 985 void AlternativeFinder::visit( ImplicitCopyCtorExpr * impCpCtorExpr ) { 986 alternatives.push_back( Alternative( impCpCtorExpr->clone(), env, Cost::zero ) ); 987 } 984 988 } // namespace ResolvExpr 985 989 -
src/ResolvExpr/AlternativeFinder.h
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // AlternativeFinder.h -- 7 // AlternativeFinder.h -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sat May 16 23:56:12 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Sat May 16 23:58:43 201511 // Last Modified By : Rob Schluntz 12 // Last Modified On : Tue Apr 19 11:44:53 2016 13 13 // Update Count : 2 14 // 14 // 15 15 16 16 #ifndef ALTERNATIVEFINDER_H … … 54 54 virtual void visit( NameExpr *variableExpr ); 55 55 virtual void visit( VariableExpr *variableExpr ); 56 virtual void visit( ConstantExpr *constantExpr ); 56 virtual void visit( ConstantExpr *constantExpr ); 57 57 virtual void visit( SizeofExpr *sizeofExpr ); 58 58 virtual void visit( AlignofExpr *alignofExpr ); … … 65 65 virtual void visit( CommaExpr *commaExpr ); 66 66 virtual void visit( TupleExpr *tupleExpr ); 67 virtual void visit( ImplicitCopyCtorExpr * impCpCtorExpr ); 67 68 public: // xxx - temporary hack - should make Tuples::TupleAssignment a friend 68 69 template< typename InputIterator, typename OutputIterator > -
src/ResolvExpr/Resolver.cc
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Resolver.cc -- 7 // Resolver.cc -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 12:17:01 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : T hu Mar 24 16:43:11 201613 // Update Count : 18111 // Last Modified By : Rob Schluntz 12 // Last Modified On : Tue Apr 26 16:08:21 2016 13 // Update Count : 203 14 14 // 15 15 … … 33 33 public: 34 34 Resolver() : SymTab::Indexer( false ), switchType( 0 ) {} 35 35 36 36 virtual void visit( FunctionDecl *functionDecl ); 37 37 virtual void visit( ObjectDecl *functionDecl ); … … 54 54 virtual void visit( SingleInit *singleInit ); 55 55 virtual void visit( ListInit *listInit ); 56 virtual void visit( ConstructorInit *ctorInit ); 56 57 private: 57 58 typedef std::list< Initializer * >::iterator InitIterator; … … 59 60 void resolveAggrInit( AggregateDecl *, InitIterator &, InitIterator & ); 60 61 void resolveSingleAggrInit( Declaration *, InitIterator &, InitIterator & ); 61 62 void fallbackInit( ConstructorInit * ctorInit ); 62 63 std::list< Type * > functionReturn; 63 64 Type *initContext; … … 82 83 } 83 84 85 84 86 namespace { 85 87 void finishExpr( Expression *expr, const TypeEnvironment &env ) { … … 87 89 env.makeSubstitution( *expr->get_env() ); 88 90 } 89 90 Expression *findVoidExpression( Expression *untyped, const SymTab::Indexer &indexer ) { 91 global_renamer.reset(); 92 TypeEnvironment env; 93 Expression *newExpr = resolveInVoidContext( untyped, indexer, env ); 94 finishExpr( newExpr, env ); 95 return newExpr; 96 } 97 91 } // namespace 92 93 Expression *findVoidExpression( Expression *untyped, const SymTab::Indexer &indexer ) { 94 global_renamer.reset(); 95 TypeEnvironment env; 96 Expression *newExpr = resolveInVoidContext( untyped, indexer, env ); 97 finishExpr( newExpr, env ); 98 return newExpr; 99 } 100 101 namespace { 98 102 Expression *findSingleExpression( Expression *untyped, const SymTab::Indexer &indexer ) { 99 103 TypeEnvironment env; … … 126 130 } // if 127 131 } 128 132 129 133 Expression *findIntegralExpression( Expression *untyped, const SymTab::Indexer &indexer ) { 130 134 TypeEnvironment env; … … 159 163 return newExpr; 160 164 } 161 162 } 163 165 166 } 167 164 168 void Resolver::visit( ObjectDecl *objectDecl ) { 165 169 Type *new_type = resolveTypeof( objectDecl->get_type(), *this ); … … 258 262 forStmt->set_condition( newExpr ); 259 263 } // if 260 264 261 265 if ( forStmt->get_increment() ) { 262 266 Expression * newExpr = findVoidExpression( forStmt->get_increment(), *this ); … … 272 276 delete switchStmt->get_condition(); 273 277 switchStmt->set_condition( newExpr ); 274 278 275 279 visitor.Visitor::visit( switchStmt ); 276 280 } … … 314 318 bool isCharType( T t ) { 315 319 if ( BasicType * bt = dynamic_cast< BasicType * >( t ) ) { 316 return bt->get_kind() == BasicType::Char || bt->get_kind() == BasicType::SignedChar || 320 return bt->get_kind() == BasicType::Char || bt->get_kind() == BasicType::SignedChar || 317 321 bt->get_kind() == BasicType::UnsignedChar; 318 322 } … … 326 330 string n = ne->get_name(); 327 331 if (n == "0") { 328 initContext = new BasicType(Type::Qualifiers(), 332 initContext = new BasicType(Type::Qualifiers(), 329 333 BasicType::SignedInt); 330 334 } else { … … 332 336 initContext = decl->get_type(); 333 337 } 334 } else if (ConstantExpr * e = 338 } else if (ConstantExpr * e = 335 339 dynamic_cast<ConstantExpr*>(singleInit->get_value())) { 336 340 Constant *c = e->get_constant(); … … 355 359 singleInit->set_value( ce->get_arg() ); 356 360 ce->set_arg( NULL ); 357 delete ce; 361 delete ce; 358 362 } 359 363 } … … 471 475 #endif 472 476 } 477 478 // ConstructorInit - fall back on C-style initializer 479 void Resolver::fallbackInit( ConstructorInit * ctorInit ) { 480 // could not find valid constructor, or found an intrinsic constructor 481 // fall back on C-style initializer 482 delete ctorInit->get_ctor(); 483 ctorInit->set_ctor( NULL ); 484 maybeAccept( ctorInit->get_init(), *this ); 485 } 486 487 void Resolver::visit( ConstructorInit *ctorInit ) { 488 try { 489 maybeAccept( ctorInit->get_ctor(), *this ); 490 maybeAccept( ctorInit->get_dtor(), *this ); 491 } catch ( SemanticError ) { 492 // no alternatives for the constructor initializer - fallback on C-style initializer 493 // xxx- not sure if this makes a ton of sense - should maybe never be able to have this situation? 494 fallbackInit( ctorInit ); 495 return; 496 } 497 498 // found a constructor - can get rid of C-style initializer 499 delete ctorInit->get_init(); 500 ctorInit->set_init( NULL ); 501 } 473 502 } // namespace ResolvExpr 474 503 -
src/ResolvExpr/Resolver.h
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Resolver.h -- 7 // Resolver.h -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 12:18:34 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Sun May 17 12:19:32 201511 // Last Modified By : Rob Schluntz 12 // Last Modified On : Thu Apr 14 15:06:53 2016 13 13 // Update Count : 2 14 14 // … … 24 24 void resolve( std::list< Declaration * > translationUnit ); 25 25 Expression *resolveInVoidContext( Expression *expr, const SymTab::Indexer &indexer ); 26 Expression *findVoidExpression( Expression *untyped, const SymTab::Indexer &indexer ); 26 27 } // namespace ResolvExpr 27 28 -
src/SymTab/AddVisit.h
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // AddVisit.h -- 7 // AddVisit.h -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 16:14:32 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Thu Apr 7 14:42:21201611 // Last Modified By : Rob Schluntz 12 // Last Modified On : Thu Apr 14 15:52:42 2016 13 13 // Update Count : 5 14 14 // … … 48 48 // maybeAccept( caseStmt->get_condition(), visitor ); 49 49 // } 50 51 template< typename Visitor > 52 void acceptAndAdd( std::list< Declaration * > &translationUnit, Visitor &visitor, bool addBefore ) { 53 std::list< Declaration * >::iterator i = translationUnit.begin(); 54 while ( i != translationUnit.end() ) { 55 (*i)->accept( visitor ); 56 std::list< Declaration * >::iterator next = i; 57 next++; 58 if ( ! visitor.get_declsToAdd().empty() ) { 59 translationUnit.splice( addBefore ? i : next, visitor.get_declsToAdd() ); 60 } // if 61 i = next; 62 } // while 63 } 64 50 65 } // namespace SymTab 51 66 -
src/SymTab/Validate.cc
r0638c44 ra1d6d80 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 21:50:04 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Wed Apr 13 16:39:30201613 // Update Count : 2 5111 // Last Modified By : Rob Schluntz 12 // Last Modified On : Thu Apr 14 15:37:23 2016 13 // Update Count : 297 14 14 // 15 15 … … 56 56 #include "MakeLibCfa.h" 57 57 #include "TypeEquality.h" 58 #include "Autogen.h" 58 59 #include "ResolvExpr/typeops.h" 59 60 … … 122 123 123 124 const Indexer *indexer; 124 };125 126 class AutogenerateRoutines : public Visitor {127 public:128 /// Generates assignment operators for aggregate types as required129 static void autogenerateRoutines( std::list< Declaration * > &translationUnit );130 131 std::list< Declaration * > &get_declsToAdd() { return declsToAdd; }132 133 virtual void visit( EnumDecl *enumDecl );134 virtual void visit( StructDecl *structDecl );135 virtual void visit( UnionDecl *structDecl );136 virtual void visit( TypeDecl *typeDecl );137 virtual void visit( TraitDecl *ctxDecl );138 virtual void visit( FunctionDecl *functionDecl );139 140 virtual void visit( FunctionType *ftype );141 virtual void visit( PointerType *ftype );142 143 virtual void visit( CompoundStmt *compoundStmt );144 virtual void visit( SwitchStmt *switchStmt );145 virtual void visit( ChooseStmt *chooseStmt );146 // virtual void visit( CaseStmt *caseStmt );147 148 AutogenerateRoutines() : functionNesting( 0 ) {}149 private:150 template< typename StmtClass > void visitStatement( StmtClass *stmt );151 152 std::list< Declaration * > declsToAdd;153 std::set< std::string > structsDone;154 unsigned int functionNesting; // current level of nested functions155 125 }; 156 126 … … 192 162 template<typename AggDecl> 193 163 void addImplicitTypedef( AggDecl * aggDecl ); 194 164 195 165 typedef std::map< std::string, std::pair< TypedefDecl *, int > > TypedefMap; 196 166 TypedefMap typedefNames; 197 167 int scopeLevel; 198 168 }; 169 170 class VerifyCtorDtor : public Visitor { 171 public: 172 /// ensure that constructors and destructors have at least one 173 /// parameter, the first of which must be a pointer, and no 174 /// return values. 175 static void verify( std::list< Declaration * > &translationUnit ); 176 177 virtual void visit( FunctionDecl *funcDecl ); 178 }; 199 179 200 180 class CompoundLiteral : public GenPoly::DeclMutator { … … 217 197 ReturnChecker::checkFunctionReturns( translationUnit ); 218 198 mutateAll( translationUnit, compoundliteral ); 219 AutogenerateRoutines::autogenerateRoutines( translationUnit );199 autogenerateRoutines( translationUnit ); 220 200 acceptAll( translationUnit, pass3 ); 201 VerifyCtorDtor::verify( translationUnit ); 221 202 } 222 203 … … 228 209 type->accept( pass2 ); 229 210 type->accept( pass3 ); 230 }231 232 template< typename Visitor >233 void acceptAndAdd( std::list< Declaration * > &translationUnit, Visitor &visitor, bool addBefore ) {234 std::list< Declaration * >::iterator i = translationUnit.begin();235 while ( i != translationUnit.end() ) {236 (*i)->accept( visitor );237 std::list< Declaration * >::iterator next = i;238 next++;239 if ( ! visitor.get_declsToAdd().empty() ) {240 translationUnit.splice( addBefore ? i : next, visitor.get_declsToAdd() );241 } // if242 i = next;243 } // while244 211 } 245 212 … … 503 470 } 504 471 505 static const std::list< std::string > noLabels;506 507 void AutogenerateRoutines::autogenerateRoutines( std::list< Declaration * > &translationUnit ) {508 AutogenerateRoutines visitor;509 acceptAndAdd( translationUnit, visitor, false );510 }511 512 template< typename OutputIterator >513 void makeScalarAssignment( ObjectDecl *srcParam, ObjectDecl *dstParam, DeclarationWithType *member, OutputIterator out ) {514 ObjectDecl *obj = dynamic_cast<ObjectDecl *>( member );515 // unnamed bit fields are not copied as they cannot be accessed516 if ( obj != NULL && obj->get_name() == "" && obj->get_bitfieldWidth() != NULL ) return;517 518 UntypedExpr *assignExpr = new UntypedExpr( new NameExpr( "?=?" ) );519 520 UntypedExpr *derefExpr = new UntypedExpr( new NameExpr( "*?" ) );521 derefExpr->get_args().push_back( new VariableExpr( dstParam ) );522 523 // do something special for unnamed members524 Expression *dstselect = new AddressExpr( new MemberExpr( member, derefExpr ) );525 assignExpr->get_args().push_back( dstselect );526 527 Expression *srcselect = new MemberExpr( member, new VariableExpr( srcParam ) );528 assignExpr->get_args().push_back( srcselect );529 530 *out++ = new ExprStmt( noLabels, assignExpr );531 }532 533 template< typename OutputIterator >534 void makeArrayAssignment( ObjectDecl *srcParam, ObjectDecl *dstParam, DeclarationWithType *member, ArrayType *array, OutputIterator out ) {535 static UniqueName indexName( "_index" );536 537 // for a flexible array member nothing is done -- user must define own assignment538 if ( ! array->get_dimension() ) return;539 540 ObjectDecl *index = new ObjectDecl( indexName.newName(), DeclarationNode::NoStorageClass, LinkageSpec::C, 0, new BasicType( Type::Qualifiers(), BasicType::SignedInt ), 0 );541 *out++ = new DeclStmt( noLabels, index );542 543 UntypedExpr *init = new UntypedExpr( new NameExpr( "?=?" ) );544 init->get_args().push_back( new AddressExpr( new VariableExpr( index ) ) );545 init->get_args().push_back( new NameExpr( "0" ) );546 Statement *initStmt = new ExprStmt( noLabels, init );547 std::list<Statement *> initList;548 initList.push_back( initStmt );549 550 UntypedExpr *cond = new UntypedExpr( new NameExpr( "?<?" ) );551 cond->get_args().push_back( new VariableExpr( index ) );552 cond->get_args().push_back( array->get_dimension()->clone() );553 554 UntypedExpr *inc = new UntypedExpr( new NameExpr( "++?" ) );555 inc->get_args().push_back( new AddressExpr( new VariableExpr( index ) ) );556 557 UntypedExpr *assignExpr = new UntypedExpr( new NameExpr( "?=?" ) );558 559 UntypedExpr *derefExpr = new UntypedExpr( new NameExpr( "*?" ) );560 derefExpr->get_args().push_back( new VariableExpr( dstParam ) );561 562 Expression *dstselect = new MemberExpr( member, derefExpr );563 UntypedExpr *dstIndex = new UntypedExpr( new NameExpr( "?+?" ) );564 dstIndex->get_args().push_back( dstselect );565 dstIndex->get_args().push_back( new VariableExpr( index ) );566 assignExpr->get_args().push_back( dstIndex );567 568 Expression *srcselect = new MemberExpr( member, new VariableExpr( srcParam ) );569 UntypedExpr *srcIndex = new UntypedExpr( new NameExpr( "?[?]" ) );570 srcIndex->get_args().push_back( srcselect );571 srcIndex->get_args().push_back( new VariableExpr( index ) );572 assignExpr->get_args().push_back( srcIndex );573 574 *out++ = new ForStmt( noLabels, initList, cond, inc, new ExprStmt( noLabels, assignExpr ) );575 }576 577 template< typename OutputIterator >578 void makeUnionFieldsAssignment( ObjectDecl *srcParam, ObjectDecl *dstParam, UnionInstType *unionType, OutputIterator out ) {579 UntypedExpr *copy = new UntypedExpr( new NameExpr( "__builtin_memcpy" ) );580 copy->get_args().push_back( new VariableExpr( dstParam ) );581 copy->get_args().push_back( new AddressExpr( new VariableExpr( srcParam ) ) );582 copy->get_args().push_back( new SizeofExpr( unionType ) );583 584 *out++ = new ExprStmt( noLabels, copy );585 }586 587 //E ?=?(E volatile*, int),588 // ?=?(E _Atomic volatile*, int);589 void makeEnumAssignment( EnumDecl *enumDecl, EnumInstType *refType, unsigned int functionNesting, std::list< Declaration * > &declsToAdd ) {590 FunctionType *assignType = new FunctionType( Type::Qualifiers(), false );591 592 ObjectDecl *returnVal = new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, refType->clone(), 0 );593 assignType->get_returnVals().push_back( returnVal );594 595 // need two assignment operators with different types596 FunctionType * assignType2 = assignType->clone();597 598 // E ?=?(E volatile *, E)599 Type *etype = refType->clone();600 // etype->get_qualifiers() += Type::Qualifiers(false, true, false, false, false, false);601 602 ObjectDecl *dstParam = new ObjectDecl( "_dst", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), etype ), 0 );603 assignType->get_parameters().push_back( dstParam );604 605 ObjectDecl *srcParam = new ObjectDecl( "_src", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, etype->clone(), 0 );606 assignType->get_parameters().push_back( srcParam );607 608 // E ?=?(E volatile *, int)609 assignType2->get_parameters().push_back( dstParam->clone() );610 BasicType * paramType = new BasicType(Type::Qualifiers(), BasicType::SignedInt);611 ObjectDecl *srcParam2 = new ObjectDecl( "_src", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, paramType, 0 );612 assignType2->get_parameters().push_back( srcParam2 );613 614 // Routines at global scope marked "static" to prevent multiple definitions is separate translation units615 // because each unit generates copies of the default routines for each aggregate.616 617 // since there is no definition, these should not be inline618 // make these intrinsic so that the code generator does not make use of them619 FunctionDecl *assignDecl = new FunctionDecl( "?=?", functionNesting > 0 ? DeclarationNode::NoStorageClass : DeclarationNode::Static, LinkageSpec::Intrinsic, assignType, 0, false, false );620 assignDecl->fixUniqueId();621 FunctionDecl *assignDecl2 = new FunctionDecl( "?=?", functionNesting > 0 ? DeclarationNode::NoStorageClass : DeclarationNode::Static, LinkageSpec::Intrinsic, assignType2, 0, false, false );622 assignDecl2->fixUniqueId();623 624 // these should be built in the same way that the prelude625 // functions are, so build a list containing the prototypes626 // and allow MakeLibCfa to autogenerate the bodies.627 std::list< Declaration * > assigns;628 assigns.push_back( assignDecl );629 assigns.push_back( assignDecl2 );630 631 LibCfa::makeLibCfa( assigns );632 633 // need to remove the prototypes, since this may be nested in a routine634 for (int start = 0, end = assigns.size()/2; start < end; start++) {635 delete assigns.front();636 assigns.pop_front();637 } // for638 639 declsToAdd.insert( declsToAdd.begin(), assigns.begin(), assigns.end() );640 }641 642 /// Clones a reference type, replacing any parameters it may have with a clone of the provided list643 template< typename GenericInstType >644 GenericInstType *cloneWithParams( GenericInstType *refType, const std::list< Expression* >& params ) {645 GenericInstType *clone = refType->clone();646 clone->get_parameters().clear();647 cloneAll( params, clone->get_parameters() );648 return clone;649 }650 651 /// Creates a new type decl that's the same as src, but renamed and with only the ?=? assertion (for complete types only)652 TypeDecl *cloneAndRename( TypeDecl *src, const std::string &name ) {653 TypeDecl *dst = new TypeDecl( name, src->get_storageClass(), 0, src->get_kind() );654 655 if ( src->get_kind() == TypeDecl::Any ) {656 // just include assignment operator assertion657 TypeInstType *assignParamType = new TypeInstType( Type::Qualifiers(), name, dst );658 FunctionType *assignFunctionType = new FunctionType( Type::Qualifiers(), false );659 assignFunctionType->get_returnVals().push_back(660 new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, assignParamType->clone(), 0 ) );661 assignFunctionType->get_parameters().push_back(662 new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), assignParamType->clone() ), 0 ) );663 assignFunctionType->get_parameters().push_back(664 new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, assignParamType, 0 ) );665 FunctionDecl *assignAssert = new FunctionDecl( "?=?", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, assignFunctionType, 0, false, false );666 dst->get_assertions().push_back( assignAssert );667 }668 669 return dst;670 }671 672 Declaration *makeStructAssignment( StructDecl *aggregateDecl, StructInstType *refType, unsigned int functionNesting ) {673 FunctionType *assignType = new FunctionType( Type::Qualifiers(), false );674 675 // Make function polymorphic in same parameters as generic struct, if applicable676 bool isGeneric = false; // NOTE this flag is an incredibly ugly kludge; we should fix the assignment signature instead (ditto for union)677 std::list< TypeDecl* >& genericParams = aggregateDecl->get_parameters();678 std::list< Expression* > structParams; // List of matching parameters to put on types679 TypeSubstitution genericSubs; // Substitutions to make to member types of struct680 for ( std::list< TypeDecl* >::const_iterator param = genericParams.begin(); param != genericParams.end(); ++param ) {681 isGeneric = true;682 TypeDecl *typeParam = cloneAndRename( *param, "_autoassign_" + aggregateDecl->get_name() + "_" + (*param)->get_name() );683 assignType->get_forall().push_back( typeParam );684 TypeInstType *newParamType = new TypeInstType( Type::Qualifiers(), typeParam->get_name(), typeParam );685 genericSubs.add( (*param)->get_name(), newParamType );686 structParams.push_back( new TypeExpr( newParamType ) );687 }688 689 ObjectDecl *returnVal = new ObjectDecl( "_ret", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, cloneWithParams( refType, structParams ), 0 );690 assignType->get_returnVals().push_back( returnVal );691 692 ObjectDecl *dstParam = new ObjectDecl( "_dst", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), cloneWithParams( refType, structParams ) ), 0 );693 assignType->get_parameters().push_back( dstParam );694 695 ObjectDecl *srcParam = new ObjectDecl( "_src", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, cloneWithParams( refType, structParams ), 0 );696 assignType->get_parameters().push_back( srcParam );697 698 // Routines at global scope marked "static" to prevent multiple definitions is separate translation units699 // because each unit generates copies of the default routines for each aggregate.700 FunctionDecl *assignDecl = new FunctionDecl( "?=?", functionNesting > 0 ? DeclarationNode::NoStorageClass : DeclarationNode::Static, LinkageSpec::AutoGen, assignType, new CompoundStmt( noLabels ), true, false );701 assignDecl->fixUniqueId();702 703 for ( std::list< Declaration * >::const_iterator member = aggregateDecl->get_members().begin(); member != aggregateDecl->get_members().end(); ++member ) {704 if ( DeclarationWithType *dwt = dynamic_cast< DeclarationWithType * >( *member ) ) {705 // query the type qualifiers of this field and skip assigning it if it is marked const.706 // If it is an array type, we need to strip off the array layers to find its qualifiers.707 Type * type = dwt->get_type();708 while ( ArrayType * at = dynamic_cast< ArrayType * >( type ) ) {709 type = at->get_base();710 }711 712 if ( type->get_qualifiers().isConst ) {713 // don't assign const members714 continue;715 }716 717 if ( isGeneric ) {718 // rewrite member type in terms of the type variables on this operator719 DeclarationWithType *fixedMember = dwt->clone();720 genericSubs.apply( fixedMember );721 722 // assign to both destination and return value723 if ( ArrayType *array = dynamic_cast< ArrayType * >( fixedMember->get_type() ) ) {724 makeArrayAssignment( srcParam, dstParam, fixedMember, array, back_inserter( assignDecl->get_statements()->get_kids() ) );725 makeArrayAssignment( srcParam, returnVal, fixedMember, array, back_inserter( assignDecl->get_statements()->get_kids() ) );726 } else {727 makeScalarAssignment( srcParam, dstParam, fixedMember, back_inserter( assignDecl->get_statements()->get_kids() ) );728 makeScalarAssignment( srcParam, returnVal, fixedMember, back_inserter( assignDecl->get_statements()->get_kids() ) );729 } // if730 } else {731 // assign to destination732 if ( ArrayType *array = dynamic_cast< ArrayType * >( dwt->get_type() ) ) {733 makeArrayAssignment( srcParam, dstParam, dwt, array, back_inserter( assignDecl->get_statements()->get_kids() ) );734 } else {735 makeScalarAssignment( srcParam, dstParam, dwt, back_inserter( assignDecl->get_statements()->get_kids() ) );736 } // if737 } // if738 } // if739 } // for740 if ( ! isGeneric ) assignDecl->get_statements()->get_kids().push_back( new ReturnStmt( noLabels, new VariableExpr( srcParam ) ) );741 742 return assignDecl;743 }744 745 Declaration *makeUnionAssignment( UnionDecl *aggregateDecl, UnionInstType *refType, unsigned int functionNesting ) {746 FunctionType *assignType = new FunctionType( Type::Qualifiers(), false );747 748 // Make function polymorphic in same parameters as generic union, if applicable749 bool isGeneric = false; // NOTE this flag is an incredibly ugly kludge; we should fix the assignment signature instead (ditto for struct)750 std::list< TypeDecl* >& genericParams = aggregateDecl->get_parameters();751 std::list< Expression* > unionParams; // List of matching parameters to put on types752 for ( std::list< TypeDecl* >::const_iterator param = genericParams.begin(); param != genericParams.end(); ++param ) {753 isGeneric = true;754 TypeDecl *typeParam = cloneAndRename( *param, "_autoassign_" + aggregateDecl->get_name() + "_" + (*param)->get_name() );755 assignType->get_forall().push_back( typeParam );756 unionParams.push_back( new TypeExpr( new TypeInstType( Type::Qualifiers(), typeParam->get_name(), typeParam ) ) );757 }758 759 ObjectDecl *returnVal = new ObjectDecl( "_ret", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, cloneWithParams( refType, unionParams ), 0 );760 assignType->get_returnVals().push_back( returnVal );761 762 ObjectDecl *dstParam = new ObjectDecl( "_dst", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), cloneWithParams( refType, unionParams ) ), 0 );763 assignType->get_parameters().push_back( dstParam );764 765 ObjectDecl *srcParam = new ObjectDecl( "_src", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, cloneWithParams( refType, unionParams ), 0 );766 assignType->get_parameters().push_back( srcParam );767 768 // Routines at global scope marked "static" to prevent multiple definitions is separate translation units769 // because each unit generates copies of the default routines for each aggregate.770 FunctionDecl *assignDecl = new FunctionDecl( "?=?", functionNesting > 0 ? DeclarationNode::NoStorageClass : DeclarationNode::Static, LinkageSpec::AutoGen, assignType, new CompoundStmt( noLabels ), true, false );771 assignDecl->fixUniqueId();772 773 makeUnionFieldsAssignment( srcParam, dstParam, cloneWithParams( refType, unionParams ), back_inserter( assignDecl->get_statements()->get_kids() ) );774 if ( isGeneric ) makeUnionFieldsAssignment( srcParam, returnVal, cloneWithParams( refType, unionParams ), back_inserter( assignDecl->get_statements()->get_kids() ) );775 776 if ( ! isGeneric ) assignDecl->get_statements()->get_kids().push_back( new ReturnStmt( noLabels, new VariableExpr( srcParam ) ) );777 778 return assignDecl;779 }780 781 void AutogenerateRoutines::visit( EnumDecl *enumDecl ) {782 if ( ! enumDecl->get_members().empty() ) {783 EnumInstType *enumInst = new EnumInstType( Type::Qualifiers(), enumDecl->get_name() );784 // enumInst->set_baseEnum( enumDecl );785 // declsToAdd.push_back(786 makeEnumAssignment( enumDecl, enumInst, functionNesting, declsToAdd );787 }788 }789 790 void AutogenerateRoutines::visit( StructDecl *structDecl ) {791 if ( ! structDecl->get_members().empty() && structsDone.find( structDecl->get_name() ) == structsDone.end() ) {792 StructInstType structInst( Type::Qualifiers(), structDecl->get_name() );793 structInst.set_baseStruct( structDecl );794 declsToAdd.push_back( makeStructAssignment( structDecl, &structInst, functionNesting ) );795 structsDone.insert( structDecl->get_name() );796 } // if797 }798 799 void AutogenerateRoutines::visit( UnionDecl *unionDecl ) {800 if ( ! unionDecl->get_members().empty() ) {801 UnionInstType unionInst( Type::Qualifiers(), unionDecl->get_name() );802 unionInst.set_baseUnion( unionDecl );803 declsToAdd.push_back( makeUnionAssignment( unionDecl, &unionInst, functionNesting ) );804 } // if805 }806 807 void AutogenerateRoutines::visit( TypeDecl *typeDecl ) {808 CompoundStmt *stmts = 0;809 TypeInstType *typeInst = new TypeInstType( Type::Qualifiers(), typeDecl->get_name(), false );810 typeInst->set_baseType( typeDecl );811 ObjectDecl *src = new ObjectDecl( "_src", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, typeInst->clone(), 0 );812 ObjectDecl *dst = new ObjectDecl( "_dst", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), typeInst->clone() ), 0 );813 if ( typeDecl->get_base() ) {814 stmts = new CompoundStmt( std::list< Label >() );815 UntypedExpr *assign = new UntypedExpr( new NameExpr( "?=?" ) );816 assign->get_args().push_back( new CastExpr( new VariableExpr( dst ), new PointerType( Type::Qualifiers(), typeDecl->get_base()->clone() ) ) );817 assign->get_args().push_back( new CastExpr( new VariableExpr( src ), typeDecl->get_base()->clone() ) );818 stmts->get_kids().push_back( new ReturnStmt( std::list< Label >(), assign ) );819 } // if820 FunctionType *type = new FunctionType( Type::Qualifiers(), false );821 type->get_returnVals().push_back( new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, typeInst, 0 ) );822 type->get_parameters().push_back( dst );823 type->get_parameters().push_back( src );824 FunctionDecl *func = new FunctionDecl( "?=?", DeclarationNode::NoStorageClass, LinkageSpec::AutoGen, type, stmts, false, false );825 declsToAdd.push_back( func );826 }827 828 void addDecls( std::list< Declaration * > &declsToAdd, std::list< Statement * > &statements, std::list< Statement * >::iterator i ) {829 for ( std::list< Declaration * >::iterator decl = declsToAdd.begin(); decl != declsToAdd.end(); ++decl ) {830 statements.insert( i, new DeclStmt( noLabels, *decl ) );831 } // for832 declsToAdd.clear();833 }834 835 void AutogenerateRoutines::visit( FunctionType *) {836 // ensure that we don't add assignment ops for types defined as part of the function837 }838 839 void AutogenerateRoutines::visit( PointerType *) {840 // ensure that we don't add assignment ops for types defined as part of the pointer841 }842 843 void AutogenerateRoutines::visit( TraitDecl *) {844 // ensure that we don't add assignment ops for types defined as part of the context845 }846 847 template< typename StmtClass >848 inline void AutogenerateRoutines::visitStatement( StmtClass *stmt ) {849 std::set< std::string > oldStructs = structsDone;850 addVisit( stmt, *this );851 structsDone = oldStructs;852 }853 854 void AutogenerateRoutines::visit( FunctionDecl *functionDecl ) {855 maybeAccept( functionDecl->get_functionType(), *this );856 acceptAll( functionDecl->get_oldDecls(), *this );857 functionNesting += 1;858 maybeAccept( functionDecl->get_statements(), *this );859 functionNesting -= 1;860 }861 862 void AutogenerateRoutines::visit( CompoundStmt *compoundStmt ) {863 visitStatement( compoundStmt );864 }865 866 void AutogenerateRoutines::visit( SwitchStmt *switchStmt ) {867 visitStatement( switchStmt );868 }869 870 void AutogenerateRoutines::visit( ChooseStmt *switchStmt ) {871 visitStatement( switchStmt );872 }873 874 // void AutogenerateRoutines::visit( CaseStmt *caseStmt ) {875 // visitStatement( caseStmt );876 // }877 878 472 void ReturnChecker::checkFunctionReturns( std::list< Declaration * > & translationUnit ) { 879 473 ReturnChecker checker; … … 1033 627 return aggDecl; 1034 628 } 1035 629 1036 630 template<typename AggDecl> 1037 631 void EliminateTypedef::addImplicitTypedef( AggDecl * aggDecl ) { … … 1072 666 } 1073 667 668 void VerifyCtorDtor::verify( std::list< Declaration * > & translationUnit ) { 669 VerifyCtorDtor verifier; 670 acceptAll( translationUnit, verifier ); 671 } 672 673 void VerifyCtorDtor::visit( FunctionDecl * funcDecl ) { 674 FunctionType * funcType = funcDecl->get_functionType(); 675 std::list< DeclarationWithType * > &returnVals = funcType->get_returnVals(); 676 std::list< DeclarationWithType * > ¶ms = funcType->get_parameters(); 677 678 if ( funcDecl->get_name() == "?{}" || funcDecl->get_name() == "^?{}" ) { 679 if ( params.size() == 0 ) { 680 throw SemanticError( "Constructors and destructors require at least one parameter ", funcDecl ); 681 } 682 if ( ! dynamic_cast< PointerType * >( params.front()->get_type() ) ) { 683 throw SemanticError( "First parameter of a constructor or destructor must be a pointer ", funcDecl ); 684 } 685 if ( returnVals.size() != 0 ) { 686 throw SemanticError( "Constructors and destructors cannot have explicit return values ", funcDecl ); 687 } 688 } 689 690 Visitor::visit( funcDecl ); 691 // original idea: modify signature of ctor/dtors and insert appropriate return statements 692 // to cause desired behaviour 693 // new idea: add comma exprs to every ctor call to produce first parameter. 694 // this requires some memoization of the first parameter, because it can be a 695 // complicated expression with side effects (see: malloc). idea: add temporary variable 696 // that is assigned address of constructed object in ctor argument position and 697 // return the temporary. It should also be done after all implicit ctors are 698 // added, so not in this pass! 699 } 700 1074 701 DeclarationWithType * CompoundLiteral::mutate( ObjectDecl *objectDecl ) { 1075 702 storageclass = objectDecl->get_storageClass(); -
src/SymTab/module.mk
r0638c44 ra1d6d80 6 6 ## file "LICENCE" distributed with Cforall. 7 7 ## 8 ## module.mk -- 8 ## module.mk -- 9 9 ## 10 10 ## Author : Richard C. Bilson … … 20 20 SymTab/FixFunction.cc \ 21 21 SymTab/ImplementationType.cc \ 22 SymTab/TypeEquality.cc 22 SymTab/TypeEquality.cc \ 23 SymTab/Autogen.cc -
src/SynTree/AddressExpr.cc
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // AddressExpr.cc -- 7 // AddressExpr.cc -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 23:54:44 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Tue May 19 16:52:51 201511 // Last Modified By : Rob Schluntz 12 // Last Modified On : Tue Apr 26 12:35:13 2016 13 13 // Update Count : 6 14 14 // … … 32 32 33 33 void AddressExpr::print( std::ostream &os, int indent ) const { 34 os << std::string( indent, ' ' ) <<"Address of:" << std::endl;34 os << "Address of:" << std::endl; 35 35 if ( arg ) { 36 arg->print( os, indent+2 ); 36 os << std::string( indent+2, ' ' ); 37 arg->print( os, indent+2 ); 37 38 } // if 38 39 } -
src/SynTree/ApplicationExpr.cc
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // ApplicationExpr.cc.cc -- 7 // ApplicationExpr.cc.cc -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Mon May 18 07:54:17 201511 // Last Modified By : Rob Schluntz 12 // Last Modified On : Tue Apr 26 12:41:06 2016 13 13 // Update Count : 4 14 14 // … … 47 47 FunctionType *function = dynamic_cast< FunctionType* >( pointer->get_base() ); 48 48 assert( function ); 49 49 50 50 for ( std::list< DeclarationWithType* >::const_iterator i = function->get_returnVals().begin(); i != function->get_returnVals().end(); ++i ) { 51 51 get_results().push_back( (*i)->get_type()->clone() ); … … 64 64 65 65 void ApplicationExpr::print( std::ostream &os, int indent ) const { 66 os << std::string( indent, ' ' ) << "Application of" << std::endl;66 os << "Application of" << std::endl << std::string(indent, ' '); 67 67 function->print( os, indent+2 ); 68 68 if ( ! args.empty() ) { -
src/SynTree/CommaExpr.cc
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // CommaExpr.cc -- 7 // CommaExpr.cc -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Mon May 18 08:09:58 201511 // Last Modified By : Rob Schluntz 12 // Last Modified On : Mon May 02 15:19:44 2016 13 13 // Update Count : 1 14 14 // … … 20 20 CommaExpr::CommaExpr( Expression *arg1, Expression *arg2, Expression *_aname ) 21 21 : Expression( _aname ), arg1( arg1 ), arg2( arg2 ) { 22 // xxx - result of a comma expression is never an lvalue, so should set lvalue 23 // to false on all result types. Actually doing this causes some strange things 24 // to happen in later passes (particularly, Specialize, Lvalue, and Box). This needs to be looked into. 22 25 cloneAll( arg2->get_results(), get_results() ); 26 // for ( Type *& type : get_results() ) { 27 // type->set_isLvalue( false ); 28 // } 23 29 } 24 30 … … 33 39 34 40 void CommaExpr::print( std::ostream &os, int indent ) const { 35 os << std::string( indent, ' ' ) << "Comma Expression:" << std::endl; 41 os << "Comma Expression:" << std::endl; 42 os << std::string( indent+2, ' ' ); 36 43 arg1->print( os, indent+2 ); 37 44 os << std::endl; 45 os << std::string( indent+2, ' ' ); 38 46 arg2->print( os, indent+2 ); 39 47 Expression::print( os, indent ); -
src/SynTree/CompoundStmt.cc
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // XXX.cc -- 7 // XXX.cc -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Tue Jun 23 11:37:49 201511 // Last Modified By : Rob Schluntz 12 // Last Modified On : Mon May 02 15:19:17 2016 13 13 // Update Count : 3 14 14 // … … 18 18 #include <algorithm> 19 19 #include <functional> 20 #include "Expression.h" 21 #include "Declaration.h" 20 22 21 23 using std::string; 22 24 using std::endl; 25 26 class VarExprReplacer : public Visitor { 27 public: 28 typedef std::map< DeclarationWithType *, DeclarationWithType * > DeclMap; 29 private: 30 const DeclMap & declMap; 31 public: 32 VarExprReplacer( const DeclMap & declMap ) : declMap( declMap ) {} 33 34 // replace variable with new node from decl map 35 virtual void visit( VariableExpr * varExpr ) { 36 if ( declMap.count( varExpr->get_var() ) ) { 37 varExpr->set_var( declMap.at( varExpr->get_var() ) ); 38 } 39 } 40 }; 41 23 42 24 43 CompoundStmt::CompoundStmt( std::list<Label> labels ) : Statement( labels ) { … … 27 46 CompoundStmt::CompoundStmt( const CompoundStmt &other ) : Statement( other ) { 28 47 cloneAll( other.kids, kids ); 48 49 // when cloning a compound statement, we may end up cloning declarations which 50 // are referred to by VariableExprs throughout the block. Cloning a VariableExpr 51 // does a shallow copy, so the VariableExpr will end up pointing to the original 52 // declaration. If the original declaration is deleted, e.g. because the original 53 // CompoundStmt is deleted, then we have a dangling pointer. To avoid this case, 54 // find all DeclarationWithType nodes (since a VariableExpr must point to a 55 // DeclarationWithType) in the original CompoundStmt and map them to the cloned 56 // node in the new CompoundStmt ('this'), then replace the Declarations referred to 57 // by each VariableExpr according to the constructed map. Note that only the declarations 58 // in the current level are collected into the map, because child CompoundStmts will 59 // recursively execute this routine. There may be more efficient ways of doing 60 // this. 61 VarExprReplacer::DeclMap declMap; 62 std::list< Statement * >::const_iterator origit = other.kids.begin(); 63 for ( Statement * s : kids ) { 64 assert( origit != other.kids.end() ); 65 if ( DeclStmt * declStmt = dynamic_cast< DeclStmt * >( s ) ) { 66 DeclStmt * origDeclStmt = dynamic_cast< DeclStmt * >( *origit ); 67 assert( origDeclStmt ); 68 if ( DeclarationWithType * dwt = dynamic_cast< DeclarationWithType * > ( declStmt->get_decl() ) ) { 69 DeclarationWithType * origdwt = dynamic_cast< DeclarationWithType * > ( origDeclStmt->get_decl() ); 70 assert( origdwt ); 71 declMap[ origdwt ] = dwt; 72 } 73 } 74 } 75 if ( ! declMap.empty() ) { 76 VarExprReplacer replacer( declMap ); 77 accept( replacer ); 78 } 29 79 } 30 80 … … 34 84 35 85 void CompoundStmt::print( std::ostream &os, int indent ) const { 36 os << string( indent, ' ' ) <<"CompoundStmt" << endl ;86 os << "CompoundStmt" << endl ; 37 87 printAll( kids, os, indent + 2 ); 38 88 } -
src/SynTree/Declaration.h
r0638c44 ra1d6d80 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 // Last Modified By : Peter A. Buhr12 // Last Modified On : Wed Mar 2 17:28:11201613 // Update Count : 3 311 // Last Modified By : Rob Schluntz 12 // Last Modified On : Mon Apr 11 16:55:12 2016 13 // Update Count : 36 14 14 // 15 15 … … 22 22 #include "Parser/LinkageSpec.h" 23 23 #include "Parser/ParseNode.h" 24 #include <string> 24 25 25 26 class Declaration { … … 67 68 void set_mangleName( std::string newValue ) { mangleName = newValue; } 68 69 70 std::string get_scopedMangleName() const { return mangleName + "_" + std::to_string(scopeLevel); } 71 72 int get_scopeLevel() const { return scopeLevel; } 73 void set_scopeLevel( int newValue ) { scopeLevel = newValue; } 74 69 75 virtual DeclarationWithType *clone() const = 0; 70 76 virtual DeclarationWithType *acceptMutator( Mutator &m ) = 0; … … 75 81 // this represents the type with all types and typedefs expanded it is generated by SymTab::Validate::Pass2 76 82 std::string mangleName; 83 // need to remember the scope level at which the variable was declared, so that 84 // shadowed identifiers can be accessed 85 int scopeLevel = 0; 77 86 }; 78 87 -
src/SynTree/DeclarationWithType.cc
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // DeclarationWithType.cc -- 7 // DeclarationWithType.cc -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Sat Jun 13 08:08:07 201511 // Last Modified By : Rob Schluntz 12 // Last Modified On : Mon Apr 11 15:35:27 2016 13 13 // Update Count : 3 14 14 // … … 23 23 24 24 DeclarationWithType::DeclarationWithType( const DeclarationWithType &other ) 25 : Declaration( other ), mangleName( other.mangleName ) {25 : Declaration( other ), mangleName( other.mangleName ), scopeLevel( other.scopeLevel ) { 26 26 } 27 27 -
src/SynTree/Expression.cc
r0638c44 ra1d6d80 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Fri Apr 8 17:16:23201611 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed May 04 12:17:51 2016 13 13 // Update Count : 40 14 14 // … … 72 72 73 73 void ConstantExpr::print( std::ostream &os, int indent ) const { 74 os << std::string( indent, ' ' ) <<"constant expression " ;74 os << "constant expression " ; 75 75 constant.print( os ); 76 76 Expression::print( os, indent ); … … 79 79 80 80 VariableExpr::VariableExpr( DeclarationWithType *_var, Expression *_aname ) : Expression( _aname ), var( _var ) { 81 assert( var ); 82 assert( var->get_type() ); 81 83 add_result( var->get_type()->clone() ); 82 84 for ( std::list< Type* >::iterator i = get_results().begin(); i != get_results().end(); ++i ) { … … 93 95 94 96 void VariableExpr::print( std::ostream &os, int indent ) const { 95 os << std::string( indent, ' ' ) <<"Variable Expression: ";97 os << "Variable Expression: "; 96 98 97 99 Declaration *decl = get_var(); … … 122 124 123 125 void SizeofExpr::print( std::ostream &os, int indent) const { 124 os << std::string( indent, ' ' ) <<"Sizeof Expression on: ";126 os << "Sizeof Expression on: "; 125 127 126 128 if (isType) … … 295 297 296 298 void CastExpr::print( std::ostream &os, int indent ) const { 297 os << std::string( indent, ' ' ) << "Cast of:" << std::endl;299 os << "Cast of:" << std::endl << std::string( indent+2, ' ' ); 298 300 arg->print(os, indent+2); 299 301 os << std::endl << std::string( indent, ' ' ) << "to:" << std::endl; … … 318 320 319 321 void UntypedMemberExpr::print( std::ostream &os, int indent ) const { 320 os << std::string( indent, ' ' ) << "Member Expression, with field: " << get_member();322 os << "Untyped Member Expression, with field: " << get_member(); 321 323 322 324 Expression *agg = get_aggregate(); 323 os << std::string( indent, ' ' ) << "from aggregate: "; 324 if (agg != 0) agg->print(os, indent + 2); 325 os << ", from aggregate: "; 326 if (agg != 0) { 327 agg->print(os, indent + 2); 328 } 329 os << std::string( indent+2, ' ' ); 325 330 Expression::print( os, indent ); 326 331 } … … 345 350 346 351 void MemberExpr::print( std::ostream &os, int indent ) const { 347 os << std::string( indent, ' ' ) <<"Member Expression, with field: " << std::endl;352 os << "Member Expression, with field: " << std::endl; 348 353 349 354 assert( member ); … … 354 359 Expression *agg = get_aggregate(); 355 360 os << std::string( indent, ' ' ) << "from aggregate: " << std::endl; 356 if (agg != 0) agg->print(os, indent + 2); 361 if (agg != 0) { 362 agg->print(os, indent + 2); 363 } 364 os << std::string( indent+2, ' ' ); 357 365 Expression::print( os, indent ); 358 366 } … … 372 380 373 381 void UntypedExpr::print( std::ostream &os, int indent ) const { 374 os << std::string( indent, ' ' ) << "Applying untyped: " << std::endl; 382 os << "Applying untyped: " << std::endl; 383 os << std::string( indent+4, ' ' ); 375 384 function->print(os, indent + 4); 376 385 os << std::string( indent, ' ' ) << "...to: " << std::endl; 377 printA rgs(os, indent + 4);386 printAll(args, os, indent + 4); 378 387 Expression::print( os, indent ); 379 388 } … … 381 390 void UntypedExpr::printArgs( std::ostream &os, int indent ) const { 382 391 std::list<Expression *>::const_iterator i; 383 for (i = args.begin(); i != args.end(); i++) 392 for (i = args.begin(); i != args.end(); i++) { 393 os << std::string(indent, ' ' ); 384 394 (*i)->print(os, indent); 395 } 385 396 } 386 397 … … 393 404 394 405 void NameExpr::print( std::ostream &os, int indent ) const { 395 os << std::string( indent, ' ' ) <<"Name: " << get_name() << std::endl;406 os << "Name: " << get_name() << std::endl; 396 407 Expression::print( os, indent ); 397 408 } … … 454 465 } 455 466 467 468 ImplicitCopyCtorExpr::ImplicitCopyCtorExpr( ApplicationExpr * callExpr ) : callExpr( callExpr ) { 469 assert( callExpr ); 470 cloneAll( callExpr->get_results(), results ); 471 } 472 473 ImplicitCopyCtorExpr::ImplicitCopyCtorExpr( const ImplicitCopyCtorExpr & other ) : Expression( other ), callExpr( maybeClone( other.callExpr ) ) { 474 cloneAll( other.tempDecls, tempDecls ); 475 cloneAll( other.returnDecls, returnDecls ); 476 cloneAll( other.dtors, dtors ); 477 } 478 479 ImplicitCopyCtorExpr::~ImplicitCopyCtorExpr() { 480 delete callExpr; 481 deleteAll( tempDecls ); 482 deleteAll( returnDecls ); 483 deleteAll( dtors ); 484 } 485 486 void ImplicitCopyCtorExpr::print( std::ostream &os, int indent ) const { 487 os << std::string( indent, ' ' ) << "Implicit Copy Constructor Expression: " << std::endl; 488 assert( callExpr ); 489 callExpr->print( os, indent + 2 ); 490 os << std::endl << std::string( indent, ' ' ) << "with temporaries:" << std::endl; 491 printAll(tempDecls, os, indent+2); 492 os << std::endl << std::string( indent, ' ' ) << "with return temporaries:" << std::endl; 493 printAll(returnDecls, os, indent+2); 494 Expression::print( os, indent ); 495 } 496 456 497 UntypedValofExpr::UntypedValofExpr( const UntypedValofExpr & other ) : Expression( other ), body ( maybeClone( other.body ) ) {} 457 498 -
src/SynTree/Expression.h
r0638c44 ra1d6d80 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Fri Apr 8 17:18:06201611 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Apr 27 17:06:49 2016 13 13 // Update Count : 21 14 14 // … … 22 22 #include "Mutator.h" 23 23 #include "Constant.h" 24 #include "Common/UniqueName.h" 24 25 25 26 /// Expression is the root type for all expressions … … 559 560 }; 560 561 562 /// ImplicitCopyCtorExpr represents the application of a function to a set of parameters, 563 /// along with a set of copy constructor calls, one for each argument. 564 class ImplicitCopyCtorExpr : public Expression { 565 public: 566 ImplicitCopyCtorExpr( ApplicationExpr * callExpr ); 567 ImplicitCopyCtorExpr( const ImplicitCopyCtorExpr & other ); 568 virtual ~ImplicitCopyCtorExpr(); 569 570 ApplicationExpr *get_callExpr() const { return callExpr; } 571 void set_callExpr( ApplicationExpr *newValue ) { callExpr = newValue; } 572 573 std::list< ObjectDecl * > & get_tempDecls() { return tempDecls; } 574 void set_tempDecls( std::list< ObjectDecl * > newValue ) { tempDecls = newValue; } 575 576 std::list< ObjectDecl * > & get_returnDecls() { return returnDecls; } 577 void set_returnDecls( std::list< ObjectDecl * > newValue ) { returnDecls = newValue; } 578 579 std::list< Expression * > & get_dtors() { return dtors; } 580 void set_dtors( std::list< Expression * > newValue ) { dtors = newValue; } 581 582 virtual ImplicitCopyCtorExpr *clone() const { return new ImplicitCopyCtorExpr( *this ); } 583 virtual void accept( Visitor &v ) { v.visit( this ); } 584 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); } 585 virtual void print( std::ostream &os, int indent = 0 ) const; 586 private: 587 ApplicationExpr * callExpr; 588 std::list< ObjectDecl * > tempDecls; 589 std::list< ObjectDecl * > returnDecls; 590 std::list< Expression * > dtors; 591 }; 592 561 593 /// ValofExpr represents a GCC 'lambda expression' 562 594 class UntypedValofExpr : public Expression { -
src/SynTree/FunctionDecl.cc
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // FunctionDecl.cc -- 7 // FunctionDecl.cc -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Mon Jul 13 18:11:44 201511 // Last Modified By : Rob Schluntz 12 // Last Modified On : Tue May 03 15:37:43 2016 13 13 // Update Count : 19 14 14 // … … 52 52 using std::endl; 53 53 using std::string; 54 54 55 55 if ( get_name() != "" ) { 56 56 os << get_name() << ": "; … … 87 87 if ( statements ) { 88 88 os << string( indent + 2, ' ' ) << "with body " << endl; 89 os << string( indent + 4, ' ' ); 89 90 statements->print( os, indent + 4 ); 90 91 } // if … … 94 95 using std::endl; 95 96 using std::string; 96 97 97 98 if ( get_name() != "" ) { 98 99 os << get_name() << ": "; -
src/SynTree/Initializer.cc
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Initializer.cc -- 7 // Initializer.cc -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Aug 12 14:05:25 201513 // Update Count : 1412 // Last Modified On : Tue Apr 26 15:51:35 2016 13 // Update Count : 28 14 14 // 15 15 16 16 #include "Initializer.h" 17 17 #include "Expression.h" 18 #include "Statement.h" 18 19 #include "Common/utility.h" 19 20 20 Initializer::Initializer( ) {}21 Initializer::Initializer( bool maybeConstructed ) : maybeConstructed( maybeConstructed ) {} 21 22 22 23 Initializer::~Initializer() {} … … 31 32 void Initializer::print( std::ostream &os, int indent ) {} 32 33 33 SingleInit::SingleInit( Expression *v, std::list< Expression *> &_designators ) : value ( v ), designators( _designators ) {34 SingleInit::SingleInit( Expression *v, const std::list< Expression *> &_designators, bool maybeConstructed ) : Initializer( maybeConstructed ), value ( v ), designators( _designators ) { 34 35 } 35 36 36 SingleInit::SingleInit( const SingleInit &other ) : value ( other.value) {37 SingleInit::SingleInit( const SingleInit &other ) : Initializer(other), value ( maybeClone( other.value ) ) { 37 38 cloneAll(other.designators, designators ); 38 39 } … … 44 45 void SingleInit::print( std::ostream &os, int indent ) { 45 46 os << std::endl << std::string(indent, ' ' ) << "Simple Initializer: " << std::endl; 47 os << std::string(indent+4, ' ' ); 46 48 value->print( os, indent+4 ); 47 49 … … 54 56 } 55 57 56 ListInit::ListInit( std::list<Initializer*> &_initializers, std::list<Expression *> &_designators)57 : initializers( _initializers ), designators( _designators ) {58 ListInit::ListInit( const std::list<Initializer*> &_initializers, const std::list<Expression *> &_designators, bool maybeConstructed ) 59 : Initializer( maybeConstructed), initializers( _initializers ), designators( _designators ) { 58 60 } 59 61 … … 65 67 66 68 void ListInit::print( std::ostream &os, int indent ) { 67 os << std::endl << std::string(indent, ' ') << "Compound initializer: "; 69 os << std::endl << std::string(indent, ' ') << "Compound initializer: "; 68 70 if ( ! designators.empty() ) { 69 71 os << std::string(indent + 2, ' ' ) << "designated by: ["; 70 72 for ( std::list < Expression * >::iterator i = designators.begin(); 71 73 i != designators.end(); i++ ) { 72 ( *i )->print(os, indent + 4 ); 74 ( *i )->print(os, indent + 4 ); 73 75 } // for 74 76 75 77 os << std::string(indent + 2, ' ' ) << "]"; 76 78 } // if 77 79 78 for ( std::list<Initializer *>::iterator i = initializers.begin(); i != initializers.end(); i++ ) 80 for ( std::list<Initializer *>::iterator i = initializers.begin(); i != initializers.end(); i++ ) 79 81 (*i)->print( os, indent + 2 ); 80 82 } 83 84 85 ConstructorInit::ConstructorInit( Statement * ctor, Statement * dtor, Initializer * init ) : Initializer( true ), ctor( ctor ), dtor( dtor ), init( init ) {} 86 ConstructorInit::~ConstructorInit() { 87 delete ctor; 88 delete init; 89 } 90 91 ConstructorInit *ConstructorInit::clone() const { 92 return new ConstructorInit( *this ); 93 } 94 95 void ConstructorInit::print( std::ostream &os, int indent ) { 96 os << std::endl << std::string(indent, ' ') << "Constructor initializer: " << std::endl; 97 if ( ctor ) { 98 os << std::string(indent+2, ' '); 99 os << "initially constructed with "; 100 ctor->print( os, indent+4 ); 101 } // if 102 103 if ( dtor ) { 104 os << std::string(indent+2, ' '); 105 os << "destructed with "; 106 dtor->print( os, indent+4 ); 107 } 108 109 if ( init ) { 110 os << std::string(indent+2, ' '); 111 os << "with fallback C-style initializer: "; 112 init->print( os, indent+4 ); 113 } 114 } 115 116 std::ostream & operator<<( std::ostream & out, Initializer * init ) { 117 init->print( out ); 118 return out; 119 } 120 81 121 // Local Variables: // 82 122 // tab-width: 4 // -
src/SynTree/Initializer.h
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Initializer.h -- 7 // Initializer.h -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Mon May 18 09:03:48 201513 // Update Count : 1 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Tue Apr 12 13:49:13 2016 13 // Update Count : 19 14 14 // 15 15 … … 27 27 public: 28 28 // Initializer( std::string _name = std::string(""), int _pos = 0 ); 29 Initializer( );29 Initializer( bool maybeConstructed ); 30 30 virtual ~Initializer(); 31 31 … … 43 43 } 44 44 45 bool get_maybeConstructed() { return maybeConstructed; } 46 45 47 virtual Initializer *clone() const = 0; 46 48 virtual void accept( Visitor &v ) = 0; … … 50 52 // std::string name; 51 53 // int pos; 54 bool maybeConstructed; 52 55 }; 53 56 … … 55 58 class SingleInit : public Initializer { 56 59 public: 57 SingleInit( Expression *value, std::list< Expression *> &designators = *(new std::list<Expression *>()));60 SingleInit( Expression *value, const std::list< Expression *> &designators = std::list< Expression * >(), bool maybeConstructed = false ); 58 61 SingleInit( const SingleInit &other ); 59 62 virtual ~SingleInit(); 60 63 61 64 Expression *get_value() { return value; } 62 65 void set_value( Expression *newValue ) { value = newValue; } … … 79 82 class ListInit : public Initializer { 80 83 public: 81 ListInit( std::list<Initializer*> &,82 std::list<Expression *> &designators = *(new std::list<Expression *>()));84 ListInit( const std::list<Initializer*> &initializers, 85 const std::list<Expression *> &designators = std::list< Expression * >(), bool maybeConstructed = false ); 83 86 virtual ~ListInit(); 84 87 … … 100 103 }; 101 104 105 // ConstructorInit represents an initializer that is either a constructor expression or 106 // a C-style initializer. 107 class ConstructorInit : public Initializer { 108 public: 109 ConstructorInit( Statement * ctor, Statement * dtor, Initializer * init ); 110 virtual ~ConstructorInit(); 111 112 void set_ctor( Statement * newValue ) { ctor = newValue; } 113 Statement * get_ctor() const { return ctor; } 114 void set_dtor( Statement * newValue ) { dtor = newValue; } 115 Statement * get_dtor() const { return dtor; } 116 void set_init( Initializer * newValue ) { init = newValue; } 117 Initializer * get_init() const { return init; } 118 119 virtual ConstructorInit *clone() const; 120 virtual void accept( Visitor &v ) { v.visit( this ); } 121 virtual Initializer *acceptMutator( Mutator &m ) { return m.mutate( this ); } 122 virtual void print( std::ostream &os, int indent = 0 ); 123 124 private: 125 Statement * ctor; 126 Statement * dtor; 127 // C-style initializer made up of SingleInit and ListInit nodes to use as a fallback 128 // if an appropriate constructor definition is not found by the resolver 129 Initializer * init; 130 }; 131 132 std::ostream & operator<<( std::ostream & out, Initializer * init ); 133 102 134 #endif // INITIALIZER_H 103 135 -
src/SynTree/Mutator.cc
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Mutator.cc -- 7 // Mutator.cc -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Fri Apr 1 18:05:16201611 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Apr 27 17:07:29 2016 13 13 // Update Count : 16 14 14 // … … 337 337 } 338 338 339 Expression* Mutator::mutate( ImplicitCopyCtorExpr *impCpCtorExpr ) { 340 impCpCtorExpr->set_callExpr( maybeMutate( impCpCtorExpr->get_callExpr(), *this ) ); 341 mutateAll( impCpCtorExpr->get_tempDecls(), *this ); 342 mutateAll( impCpCtorExpr->get_returnDecls(), *this ); 343 return impCpCtorExpr; 344 } 345 339 346 Expression *Mutator::mutate( UntypedValofExpr *valofExpr ) { 340 347 mutateAll( valofExpr->get_results(), *this ); … … 450 457 } 451 458 459 Initializer *Mutator::mutate( ConstructorInit *ctorInit ) { 460 ctorInit->set_ctor( maybeMutate( ctorInit->get_ctor(), *this ) ); 461 ctorInit->set_init( maybeMutate( ctorInit->get_init(), *this ) ); 462 return ctorInit; 463 } 464 452 465 Subrange *Mutator::mutate( Subrange *subrange ) { 453 466 return subrange; -
src/SynTree/Mutator.h
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Mutator.h -- 7 // Mutator.h -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Fri Apr 1 17:26:56201611 // Last Modified By : Rob Schluntz 12 // Last Modified On : Thu Apr 14 15:32:00 2016 13 13 // Update Count : 10 14 14 // … … 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 ); … … 76 76 virtual Expression* mutate( TypeExpr *typeExpr ); 77 77 virtual Expression* mutate( AsmExpr *asmExpr ); 78 virtual Expression* mutate( ImplicitCopyCtorExpr *impCpCtorExpr ); 78 79 virtual Expression* mutate( UntypedValofExpr *valofExpr ); 79 80 virtual Expression* mutate( CompoundLiteralExpr *compLitExpr ); … … 96 97 virtual Initializer* mutate( SingleInit *singleInit ); 97 98 virtual Initializer* mutate( ListInit *listInit ); 99 virtual Initializer* mutate( ConstructorInit *ctorInit ); 98 100 99 101 virtual Subrange *mutate( Subrange *subrange ); -
src/SynTree/ObjectDecl.cc
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // ObjectDecl.cc -- 7 // ObjectDecl.cc -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Tue Sep 29 14:13:01 201513 // Update Count : 1812 // Last Modified On : Wed May 04 12:18:28 2016 13 // Update Count : 30 14 14 // 15 15 … … 19 19 #include "Expression.h" 20 20 #include "Common/utility.h" 21 #include "Statement.h" 21 22 22 23 ObjectDecl::ObjectDecl( const std::string &name, DeclarationNode::StorageClass sc, LinkageSpec::Type linkage, Expression *bitfieldWidth, Type *type, Initializer *init, bool isInline, bool isNoreturn ) … … 56 57 57 58 if ( init ) { 59 os << std::string(indent, ' '); 58 60 os << " with initializer "; 59 61 init->print( os, indent ); 62 os << std::string(indent, ' ') << "maybeConstructed? " << init->get_maybeConstructed(); 60 63 } // if 61 64 62 65 if ( bitfieldWidth ) { 66 os << std::string(indent, ' '); 63 67 os << " with bitfield width "; 64 68 bitfieldWidth->print( os ); … … 69 73 #if 0 70 74 if ( get_mangleName() != "") { 71 os << get_mangleName() << ": "; 72 } else 75 os << get_mangleName() << ": "; 76 } else 73 77 #endif 74 78 if ( get_name() != "" ) { -
src/SynTree/Statement.cc
r0638c44 ra1d6d80 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Dec 09 14:09:34 201512 // Last Modified On : Thu Apr 28 13:34:32 2016 13 13 // Update Count : 54 14 14 // … … 43 43 44 44 void ExprStmt::print( std::ostream &os, int indent ) const { 45 os << string( indent, ' ' ) << "Expression Statement:" << endl;45 os << "Expression Statement:" << endl << std::string( indent, ' ' ); 46 46 expr->print( os, indent + 2 ); 47 47 } … … 110 110 111 111 void ReturnStmt::print( std::ostream &os, int indent ) const { 112 os << std::string( indent, ' ' ) << string ( isThrow? "Throw":"Return" ) << " Statement, returning: "; 113 if ( expr != 0 ) expr->print( os ); 112 os << string ( isThrow? "Throw":"Return" ) << " Statement, returning: "; 113 if ( expr != 0 ) { 114 os << endl << string( indent+2, ' ' ); 115 expr->print( os, indent + 2 ); 116 } 114 117 os << endl; 115 118 } … … 124 127 125 128 void IfStmt::print( std::ostream &os, int indent ) const { 126 os << string( indent, ' ' ) << "If on condition: " << endl ; 129 os << "If on condition: " << endl ; 130 os << string( indent+4, ' ' ); 127 131 condition->print( os, indent + 4 ); 128 132 129 os << string( indent, ' ' ) << ".... and branches: " << endl; 130 133 os << string( indent+2, ' ' ) << "... then: " << endl; 134 135 os << string( indent+4, ' ' ); 131 136 thenPart->print( os, indent + 4 ); 132 137 133 138 if ( elsePart != 0 ) { 139 os << string( indent+2, ' ' ) << "... else: " << endl; 140 os << string( indent+4, ' ' ); 134 141 elsePart->print( os, indent + 4 ); 135 142 } // if … … 153 160 154 161 void SwitchStmt::print( std::ostream &os, int indent ) const { 155 os << string( indent, ' ' ) <<"Switch on condition: ";162 os << "Switch on condition: "; 156 163 condition->print( os ); 157 164 os << endl; … … 218 225 219 226 void ChooseStmt::print( std::ostream &os, int indent ) const { 220 os << string( indent, ' ' ) <<"Choose on condition: ";227 os << "Choose on condition: "; 221 228 condition->print( os ); 222 229 os << endl; … … 247 254 248 255 void WhileStmt::print( std::ostream &os, int indent ) const { 249 os << string( indent, ' ' ) <<"While on condition: " << endl ;256 os << "While on condition: " << endl ; 250 257 condition->print( os, indent + 4 ); 251 258 … … 273 280 274 281 void ForStmt::print( std::ostream &os, int indent ) const { 275 os << string( indent, ' ' ) <<"Labels: {";282 os << "Labels: {"; 276 283 for ( std::list<Label>::const_iterator it = get_labels().begin(); it != get_labels().end(); ++it) { 277 284 os << *it << ","; … … 314 321 315 322 void TryStmt::print( std::ostream &os, int indent ) const { 316 os << string( indent, ' ' ) <<"Try Statement" << endl;323 os << "Try Statement" << endl; 317 324 os << string( indent + 2, ' ' ) << "with block: " << endl; 318 325 block->print( os, indent + 4 ); … … 378 385 379 386 void NullStmt::print( std::ostream &os, int indent ) const { 380 os << string( indent, ' ' ) <<"Null Statement" << endl ;387 os << "Null Statement" << endl ; 381 388 } 382 389 -
src/SynTree/SynTree.h
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // SynTree.h -- 7 // SynTree.h -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Fri Apr 1 16:47:44201611 // Last Modified By : Rob Schluntz 12 // Last Modified On : Thu Apr 14 15:31:36 2016 13 13 // Update Count : 5 14 14 // … … 81 81 class TypeExpr; 82 82 class AsmExpr; 83 class ImplicitCopyCtorExpr; 83 84 class UntypedValofExpr; 84 85 class CompoundLiteralExpr; … … 104 105 class SingleInit; 105 106 class ListInit; 107 class ConstructorInit; 106 108 107 109 class Subrange; -
src/SynTree/TypeSubstitution.cc
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // TypeSubstitution.cc -- 7 // TypeSubstitution.cc -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Wed Mar 2 17:29:15201611 // Last Modified By : Rob Schluntz 12 // Last Modified On : Tue Apr 26 11:15:29 2016 13 13 // Update Count : 3 14 14 // … … 96 96 BoundVarsType::const_iterator bound = boundVars.find( inst->get_name() ); 97 97 if ( bound != boundVars.end() ) return inst; 98 98 99 99 TypeEnvType::const_iterator i = typeEnv.find( inst->get_name() ); 100 100 if ( i == typeEnv.end() ) { … … 217 217 } 218 218 219 std::ostream & operator<<( std::ostream & out, const TypeSubstitution & sub ) { 220 sub.print( out ); 221 return out; 222 } 223 224 219 225 // Local Variables: // 220 226 // tab-width: 4 // -
src/SynTree/TypeSubstitution.h
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // TypeSubstitution.h -- 7 // TypeSubstitution.h -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Wed Mar 2 17:33:19201611 // Last Modified By : Rob Schluntz 12 // Last Modified On : Fri Apr 29 15:00:20 2016 13 13 // Update Count : 2 14 14 // … … 33 33 TypeSubstitution( const TypeSubstitution &other ); 34 34 virtual ~TypeSubstitution(); 35 35 36 36 TypeSubstitution &operator=( const TypeSubstitution &other ); 37 37 38 38 template< typename SynTreeClass > int apply( SynTreeClass *&input ); 39 39 template< typename SynTreeClass > int applyFree( SynTreeClass *&input ); 40 40 41 41 void add( std::string formalType, Type *actualType ); 42 42 void add( const TypeSubstitution &other ); … … 44 44 Type *lookup( std::string formalType ) const; 45 45 bool empty() const; 46 46 47 47 template< typename FormalIterator, typename ActualIterator > 48 48 void add( FormalIterator formalBegin, FormalIterator formalEnd, ActualIterator actualBegin ); 49 49 50 /// this function is unused... 50 51 template< typename TypeInstListIterator > 51 52 void extract( TypeInstListIterator begin, TypeInstListIterator end, TypeSubstitution &result ); 52 53 53 54 void normalize(); 54 55 … … 63 64 /// Records type variable bindings from forall-statements and instantiations of generic types 64 65 template< typename TypeClass > Type *handleAggregateType( TypeClass *type ); 65 66 66 67 virtual Type* mutate(VoidType *basicType); 67 68 virtual Type* mutate(BasicType *basicType); … … 75 76 virtual Type* mutate(TupleType *tupleType); 76 77 virtual Type* mutate(VarArgsType *varArgsType); 77 78 78 79 // TODO: worry about traversing into a forall-qualified function type or type decl with assertions 79 80 80 81 void initialize( const TypeSubstitution &src, TypeSubstitution &dest ); 81 82 … … 136 137 return subCount; 137 138 } 138 139 139 140 template< typename SynTreeClass > 140 141 int TypeSubstitution::applyFree( SynTreeClass *&input ) { … … 149 150 return subCount; 150 151 } 151 152 152 153 template< typename TypeInstListIterator > 153 154 void TypeSubstitution::extract( TypeInstListIterator begin, TypeInstListIterator end, TypeSubstitution &result ) { 155 // xxx - this function doesn't extract varEnv - is this intentional? 154 156 while ( begin != end ) { 155 157 TypeEnvType::iterator cur = typeEnv.find( (*begin++)->get_name() ); … … 173 175 } 174 176 177 std::ostream & operator<<( std::ostream & out, const TypeSubstitution & sub ); 178 175 179 #endif // TYPESUBSTITUTION_H 176 180 -
src/SynTree/Visitor.cc
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Visitor.cc -- 7 // Visitor.cc -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Fri Apr 1 18:05:13201611 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Apr 27 17:07:40 2016 13 13 // Update Count : 18 14 14 // … … 284 284 } 285 285 286 void Visitor::visit( ImplicitCopyCtorExpr *impCpCtorExpr ) { 287 maybeAccept( impCpCtorExpr->get_callExpr(), *this ); 288 acceptAll( impCpCtorExpr->get_tempDecls(), *this ); 289 acceptAll( impCpCtorExpr->get_returnDecls(), *this ); 290 } 291 286 292 void Visitor::visit( UntypedValofExpr *valofExpr ) { 287 293 acceptAll( valofExpr->get_results(), *this ); … … 379 385 } 380 386 387 void Visitor::visit( ConstructorInit *ctorInit ) { 388 maybeAccept( ctorInit->get_ctor(), *this ); 389 maybeAccept( ctorInit->get_init(), *this ); 390 } 391 381 392 void Visitor::visit( Subrange *subrange ) {} 382 393 -
src/SynTree/Visitor.h
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Visitor.h -- 7 // Visitor.h -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Fri Apr 1 17:26:55201611 // Last Modified By : Rob Schluntz 12 // Last Modified On : Thu Apr 14 15:30:58 2016 13 13 // Update Count : 7 14 14 // … … 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 ); … … 76 76 virtual void visit( TypeExpr *typeExpr ); 77 77 virtual void visit( AsmExpr *asmExpr ); 78 virtual void visit( ImplicitCopyCtorExpr *impCpCtorExpr ); 78 79 virtual void visit( UntypedValofExpr *valofExpr ); 79 80 virtual void visit( CompoundLiteralExpr *compLitExpr ); … … 96 97 virtual void visit( SingleInit *singleInit ); 97 98 virtual void visit( ListInit *listInit ); 99 virtual void visit( ConstructorInit *ctorInit ); 98 100 99 101 virtual void visit( Subrange *subrange ); -
src/examples/array.c
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // array.c -- 7 // array.c -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Wed May 27 17:56:53 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Wed Mar 2 18:13:52 201611 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Apr 27 17:21:52 2016 13 13 // Update Count : 3 14 14 // … … 26 26 // The first element is always at index 0. 27 27 forall( otype array_type, otype elt_type | bounded_array( array_type, elt_type ) ) 28 elt_type * begin( array_type array ) {28 elt_type * begin( array_type * array ) { 29 29 return &array[ 0 ]; 30 30 } … … 32 32 // The end iterator should point one past the last element. 33 33 forall( otype array_type, otype elt_type | bounded_array( array_type, elt_type ) ) 34 elt_type * end( array_type array ) {34 elt_type * end( array_type * array ) { 35 35 return &array[ last( array ) ] + 1; 36 36 } -
src/examples/array.h
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // array.h -- 7 // array.h -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Wed May 27 17:56:53 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Wed Mar 2 18:13:35201611 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Apr 27 17:26:04 2016 13 13 // Update Count : 5 14 14 // … … 26 26 27 27 // A bounded array is an array that carries its maximum index with it. 28 trait bounded_array( otype array_type, otype elt_type | array( array_type , elt_type ) ) {29 int last( array_type );28 trait bounded_array( otype array_type, otype elt_type | array( array_type *, elt_type ) ) { 29 int last( array_type * ); 30 30 }; 31 31 … … 41 41 // return iterators corresponding to the first element and the one-past-the-end element, STL-style. 42 42 forall( otype array_type, otype elt_type | bounded_array( array_type, elt_type ) ) 43 elt_type * begin( array_type);43 elt_type * begin( array_type * array ); 44 44 45 // The end iterator should point one past the last element. 45 46 forall( otype array_type, otype elt_type | bounded_array( array_type, elt_type ) ) 46 elt_type * end( array_type);47 elt_type * end( array_type * array ); 47 48 48 49 #endif // ARRAY_H -
src/examples/vector_int.c
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // vector_int.c -- 7 // vector_int.c -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Wed May 27 17:56:53 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Wed May 27 18:38:05 201511 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Apr 27 17:27:12 2016 13 13 // Update Count : 3 14 14 // … … 22 22 #define DEFAULT_CAPACITY 20 23 23 24 v ector_int vector_int_allocate() {25 return vector_int_allocate( DEFAULT_CAPACITY );24 void ?{}( vector_int * vec ) { 25 vec { DEFAULT_CAPACITY }; 26 26 } 27 27 28 vector_int vector_int_allocate( int reserve ) { 29 vector_int new_vector; 30 new_vector.last = -1; 31 new_vector.capacity = reserve; 32 new_vector.data = malloc( sizeof( int ) * reserve ); 33 return new_vector; 28 void ?{}( vector_int * vec, int reserve ) { 29 vec->last = -1; 30 vec->capacity = reserve; 31 vec->data = malloc( sizeof( int ) * reserve ); 34 32 } 35 33 36 void vector_int_deallocate( vector_int vec ) { 37 free( vec.data ); 34 void ?{}( vector_int * vec, vector_int other ) { 35 vec->last = other.last; 36 vec->capacity = other.capacity; 37 vec->data = malloc( sizeof( int ) * other.capacity ); 38 for (int i = 0; i < vec->last; i++) { 39 vec->data[i] = other.data[i]; 40 } 41 } 42 43 void ^?{}( vector_int * vec ) { 44 free( vec->data ); 38 45 } 39 46 … … 56 63 // implement bounded_array 57 64 58 lvalue int ?[?]( vector_int vec, int index ) {59 return vec .data[ index ];65 lvalue int ?[?]( vector_int * vec, int index ) { 66 return vec->data[ index ]; 60 67 } 61 68 62 int last( vector_int vec ) {63 return vec .last;69 int last( vector_int * vec ) { 70 return vec->last; 64 71 } 65 72 -
src/examples/vector_int.h
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // vector_int.h -- 7 // vector_int.h -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Wed May 27 17:56:53 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Wed May 27 18:39:05 201511 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Apr 27 17:26:59 2016 13 13 // Update Count : 2 14 14 // … … 25 25 } vector_int; 26 26 27 vector_int vector_int_allocate(); // allocate vector with default capacity 28 vector_int vector_int_allocate( int reserve ); // allocate vector with specified capacity 29 void vector_int_deallocate( vector_int ); // deallocate vector's storage 27 void ?{}( vector_int * ); // allocate vector with default capacity 28 void ?{}( vector_int *, int reserve ); // allocate vector with specified capacity 29 void ?{}( vector_int * vec, vector_int other ); // copy constructor 30 void ^?{}( vector_int * ); // deallocate vector's storage 30 31 31 32 void reserve( vector_int *vec, int reserve ); // reserve more capacity … … 34 35 // implement bounded_array 35 36 36 lvalue int ?[?]( vector_int vec, int index ); // access to arbitrary element (does not resize)37 int last( vector_int vec ); // return last element37 lvalue int ?[?]( vector_int * vec, int index ); // access to arbitrary element (does not resize) 38 int last( vector_int * vec ); // return last element 38 39 39 40 #endif // VECTOR_INT_H -
src/examples/vector_test.c
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // vector_test.c -- 7 // vector_test.c -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Wed May 27 17:56:53 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Wed Feb 17 12:23:55201611 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Apr 27 17:31:27 2016 13 13 // Update Count : 18 14 14 // … … 20 20 21 21 int main( void ) { 22 vector_int vec = vector_int_allocate();22 vector_int vec; 23 23 24 24 // read in numbers until EOF or error … … 34 34 35 35 sout | "Array elements:" | endl; 36 write( begin( vec ), end(vec ), sout );36 write( begin( &vec ), end( &vec ), sout ); 37 37 sout | endl; 38 38 39 39 sout | "Array elements reversed:" | endl; 40 write_reverse( begin( vec ), end(vec ), sout );40 write_reverse( begin( &vec ), end( &vec ), sout ); 41 41 sout | endl; 42 42 } -
src/initialization.txt
r0638c44 ra1d6d80 34 34 sure that resolved initializers for all declarations are being 35 35 generated. 36 37 38 ------ 39 40 More recent email: (I am quoted; Richard is the responder) 41 > As far as I'm aware, the only way that I could currently get the correct 42 > results from the unification engine is by feeding it an expression that 43 > looks like "?=?( ((struct Y)x.y).a, 10 )", then picking out the pieces that 44 > I need (namely the correct choice for a). Does this seem like a reasonable 45 > approach to solve this problem? 46 47 No, unfortunately. Initialization isn't being rewritten as assignment, 48 so you shouldn't allow the particular selection of assignment 49 operators that happen to be in scope (and which may include 50 user-defined operators) to guide the type resolution. 51 52 I don't think there is any way to rewrite an initializer as a single 53 expression and have the resolver just do the right thing. I see the 54 algorithm as: 55 56 For each alternative interpretation of the designator: 57 Construct an expression that casts the initializer to the type of 58 the designator 59 Construct an AlternativeFinder and use it to find the lowest cost 60 interpretation of the expression 61 Add this interpretation to a list of possibilities 62 Go through the list of possibilities and pick the lowest cost 63 64 As with many things in the resolver, it's conceptually simple but the 65 implementation may be a bit of a pain. It fits in with functions like 66 findSingleExpression, findIntegralExpression in Resolver.cc, although 67 it will be significantly more complicated than any of the existing 68 ones. 69 70 71 -
src/libcfa/Makefile.am
r0638c44 ra1d6d80 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 … … 67 67 include_HEADERS = ${cheaders:=.h} ${libs} ${cfaheaders} 68 68 69 CLEANFILES = libcfa-prelude.c 69 70 MAINTAINERCLEANFILES += ${includedir}/* -
src/libcfa/Makefile.in
r0638c44 ra1d6d80 111 111 AWK = @AWK@ 112 112 BACKEND_CC = @BACKEND_CC@ 113 CC = ${abs_top_srcdir}/src/driver/cfa 113 CC = ${abs_top_srcdir}/src/driver/cfa 114 114 CCDEPMODE = @CCDEPMODE@ 115 115 CFA_BINDIR = @CFA_BINDIR@ … … 219 219 cfaheaders = # limits 220 220 include_HEADERS = ${cheaders:=.h} ${libs} ${cfaheaders} 221 CLEANFILES = libcfa-prelude.c 221 222 all: all-am 222 223 … … 457 458 458 459 clean-generic: 460 -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) 459 461 460 462 distclean-generic: -
src/libcfa/fstream.c
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // fstream.c -- 7 // fstream.c -- 8 8 // 9 9 // Author : Peter A. Buhr 10 10 // Created On : Wed May 27 17:56:53 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Wed Apr 27 18:20:30201611 // Last Modified By : Rob Schluntz 12 // Last Modified On : Mon May 02 15:14:52 2016 13 13 // Update Count : 187 14 14 // … … 75 75 if ( fclose( (FILE *)(os->file) ) == EOF ) { 76 76 perror( IO_MSG "close output" ); 77 } // if 77 } // if 78 78 } // close 79 79 … … 140 140 if ( fclose( (FILE *)(is->file) ) == EOF ) { 141 141 perror( IO_MSG "close input" ); 142 } // if 142 } // if 143 143 } // close 144 144 … … 155 155 return is; 156 156 } // read 157 157 158 158 ifstream *ungetc( ifstream * is, char c ) { 159 159 if ( fail( is ) ) { -
src/libcfa/iostream.c
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // iostream.c -- 7 // iostream.c -- 8 8 // 9 9 // Author : Peter A. Buhr 10 10 // Created On : Wed May 27 17:56:53 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Sat Apr 30 14:00:53201611 // Last Modified By : Rob Schluntz 12 // Last Modified On : Mon May 02 15:13:55 2016 13 13 // Update Count : 302 14 14 // … … 184 184 } // ?|? 185 185 186 forall( dtype ostype | ostream( ostype ) ) 186 187 forall( dtype ostype | ostream( ostype ) ) 187 188 ostype * ?|?( ostype *os, ostype * (* manip)( ostype * ) ) { 188 189 return manip( os ); 189 190 } // ?|? 190 191 191 forall( dtype ostype | ostream( ostype ) ) 192 forall( dtype ostype | ostream( ostype ) ) 192 193 ostype * endl( ostype * os ) { 193 194 os | '\n'; … … 197 198 } // endl 198 199 199 forall( dtype ostype | ostream( ostype ) ) 200 forall( dtype ostype | ostream( ostype ) ) 200 201 ostype * sepOn( ostype * os ) { 201 202 sepOn( os ); … … 203 204 } // sepOn 204 205 205 forall( dtype ostype | ostream( ostype ) ) 206 forall( dtype ostype | ostream( ostype ) ) 206 207 ostype * sepOff( ostype * os ) { 207 208 sepOff( os ); … … 209 210 } // sepOff 210 211 211 forall( dtype ostype | ostream( ostype ) ) 212 forall( dtype ostype | ostream( ostype ) ) 212 213 ostype * sepEnable( ostype * os ) { 213 214 sepEnable( os ); … … 215 216 } // sepEnable 216 217 217 forall( dtype ostype | ostream( ostype ) ) 218 forall( dtype ostype | ostream( ostype ) ) 218 219 ostype * sepDisable( ostype * os ) { 219 220 sepDisable( os ); … … 335 336 } // ?|? 336 337 337 _Istream_cstrUC cstr( char * s ) { _Istream_cstrUC s = { s}; return s; }338 _Istream_cstrUC cstr( char * str ) { _Istream_cstrUC s = { str }; return s; } 338 339 forall( dtype istype | istream( istype ) ) 339 340 istype * ?|?( istype * is, _Istream_cstrUC cstr ) { … … 342 343 } // cstr 343 344 344 _Istream_cstrC cstr( char * s , int size ) { _Istream_cstrC s = { s, size }; return s; }345 _Istream_cstrC cstr( char * str, int size ) { _Istream_cstrC s = { str, size }; return s; } 345 346 forall( dtype istype | istream( istype ) ) 346 347 istype * ?|?( istype * is, _Istream_cstrC cstr ) { -
src/libcfa/prelude.cf
r0638c44 ra1d6d80 1 1 # 2 "prelude.cf" // needed for error messages from this file 2 // -*- Mode: C -*- 3 // 2 // -*- Mode: C -*- 3 // 4 4 // Copyright (C) Glen Ditchfield 1994, 1999 5 // 5 // 6 6 // prelude.cf -- Standard Cforall Preample for C99 7 // 7 // 8 8 // Author : Glen Ditchfield 9 9 // Created On : Sat Nov 29 07:23:41 2014 … … 117 117 forall( ftype FT ) lvalue FT *?( FT * ); 118 118 119 _Bool +?( _Bool ), -?( _Bool ), ~?( _Bool ); 120 signed int +?( signed int ), -?( signed int ), ~?( signed int ); 121 unsigned int +?( unsigned int ), -?( unsigned int ), ~?( unsigned int ); 122 signed long int +?( signed long int ), -?( signed long int ), ~?( signed long int ); 123 unsigned long int +?( unsigned long int ), -?( unsigned long int ), ~?( unsigned long int ); 124 signed long long int +?( signed long long int ), -?( signed long long int ), ~?( signed long long int ); 125 unsigned long long int +?( unsigned long long int ), -?( unsigned long long int ), ~?( unsigned long long int ); 119 _Bool +?( _Bool ), -?( _Bool ), ~?( _Bool ); 120 signed int +?( signed int ), -?( signed int ), ~?( signed int ); 121 unsigned int +?( unsigned int ), -?( unsigned int ), ~?( unsigned int ); 122 signed long int +?( signed long int ), -?( signed long int ), ~?( signed long int ); 123 unsigned long int +?( unsigned long int ), -?( unsigned long int ), ~?( unsigned long int ); 124 signed long long int +?( signed long long int ), -?( signed long long int ), ~?( signed long long int ); 125 unsigned long long int +?( unsigned long long int ), -?( unsigned long long int ), ~?( unsigned long long int ); 126 126 float +?( float ), -?( float ); 127 127 double +?( double ), -?( double ); … … 627 627 ?+=?( long double _Complex *, long double _Complex ), ?+=?( volatile long double _Complex *, long double _Complex ), 628 628 ?-=?( long double _Complex *, long double _Complex ), ?-=?( volatile long double _Complex *, long double _Complex ); 629 630 631 632 633 634 // ------------------------------------------------------------ 635 // 636 // Section ??? Constructors and Destructors 637 // 638 // ------------------------------------------------------------ 639 640 // default ctor 641 void ?{}( _Bool * ), ?{}( volatile _Bool * ); 642 void ?{}( char * ), ?{}( volatile char * ); 643 void ?{}( unsigned char * ), ?{}( volatile unsigned char * ); 644 void ?{}( char signed * ), ?{}( volatile char signed * ); 645 void ?{}( int short * ), ?{}( volatile int short * ); 646 void ?{}( int short unsigned * ), ?{}( volatile int short unsigned * ); 647 void ?{}( signed int * ), ?{}( volatile signed int * ); 648 void ?{}( unsigned int * ), ?{}( volatile unsigned int * ); 649 void ?{}( signed long int * ), ?{}( volatile signed long int * ); 650 void ?{}( unsigned long int * ), ?{}( volatile unsigned long int * ); 651 void ?{}( signed long long int * ), ?{}( volatile signed long long int * ); 652 void ?{}( unsigned long long int * ), ?{}( volatile unsigned long long int * ); 653 void ?{}( float * ), ?{}( volatile float * ); 654 void ?{}( double * ), ?{}( volatile double * ); 655 void ?{}( long double * ), ?{}( volatile long double * ); 656 void ?{}( float _Complex * ), ?{}( volatile float _Complex * ); 657 void ?{}( double _Complex * ), ?{}( volatile double _Complex * ); 658 void ?{}( long double _Complex * ), ?{}( volatile long double _Complex * ); 659 660 // copy ctor 661 void ?{}( _Bool *, _Bool ), ?{}( volatile _Bool *, _Bool ); 662 void ?{}( char *, char ), ?{}( volatile char *, char ); 663 void ?{}( unsigned char *, unsigned char ), ?{}( volatile unsigned char *, unsigned char ); 664 void ?{}( char signed *, char signed ), ?{}( volatile char signed *, char signed ); 665 void ?{}( int short *, int short ), ?{}( volatile int short *, int short ); 666 void ?{}( int short unsigned *, int short unsigned ), ?{}( volatile int short unsigned *, int short unsigned ); 667 void ?{}( signed int *, signed int), ?{}( volatile signed int *, signed int ); 668 void ?{}( unsigned int *, unsigned int), ?{}( volatile unsigned int *, unsigned int ); 669 void ?{}( signed long int *, signed long int), ?{}( volatile signed long int *, signed long int ); 670 void ?{}( unsigned long int *, unsigned long int), ?{}( volatile unsigned long int *, unsigned long int ); 671 void ?{}( signed long long int *, signed long long int), ?{}( volatile signed long long int *, signed long long int ); 672 void ?{}( unsigned long long int *, unsigned long long int), ?{}( volatile unsigned long long int *, unsigned long long int ); 673 void ?{}( float *, float), ?{}( volatile float *, float ); 674 void ?{}( double *, double), ?{}( volatile double *, double ); 675 void ?{}( long double *, long double), ?{}( volatile long double *, long double ); 676 void ?{}( float _Complex *, float _Complex), ?{}( volatile float _Complex *, float _Complex ); 677 void ?{}( double _Complex *, double _Complex), ?{}( volatile double _Complex *, double _Complex ); 678 void ?{}( long double _Complex *, long double _Complex), ?{}( volatile long double _Complex *, long double _Complex ); 679 680 // dtor 681 void ^?{}( _Bool * ), ^?{}( volatile _Bool * ); 682 void ^?{}( char * ), ^?{}( volatile char * ); 683 void ^?{}( char unsigned * ), ^?{}( volatile char unsigned * ); 684 void ^?{}( char signed * ), ^?{}( volatile char signed * ); 685 void ^?{}( int short * ), ^?{}( volatile int short * ); 686 void ^?{}( int short unsigned * ), ^?{}( volatile int short unsigned * ); 687 void ^?{}( signed int * ), ^?{}( volatile signed int * ); 688 void ^?{}( unsigned int * ), ^?{}( volatile unsigned int * ); 689 void ^?{}( signed long int * ), ^?{}( volatile signed long int * ); 690 void ^?{}( unsigned long int * ), ^?{}( volatile unsigned long int * ); 691 void ^?{}( signed long long int * ), ^?{}( volatile signed long long int * ); 692 void ^?{}( unsigned long long int * ), ^?{}( volatile unsigned long long int * ); 693 void ^?{}( float * ), ^?{}( volatile float * ); 694 void ^?{}( double * ), ^?{}( volatile double * ); 695 void ^?{}( long double * ), ^?{}( volatile long double * ); 696 void ^?{}( float _Complex * ), ^?{}( volatile float _Complex * ); 697 void ^?{}( double _Complex * ), ^?{}( volatile double _Complex * ); 698 void ^?{}( long double _Complex * ), ^?{}( volatile long double _Complex * ); 699 700 // // default ctor 701 // forall( dtype DT ) void ?{}( DT ** ); 702 // forall( dtype DT ) void ?{}( const DT ** ); 703 // forall( dtype DT ) void ?{}( volatile DT ** ); 704 // forall( dtype DT ) void ?{}( const volatile DT ** ); 705 706 // // copy ctor 707 // forall( dtype DT ) void ?{}( DT **, DT* ); 708 // forall( dtype DT ) void ?{}( const DT **, DT* ); 709 // forall( dtype DT ) void ?{}( volatile DT **, DT* ); 710 // forall( dtype DT ) void ?{}( const volatile DT **, DT* ); 711 712 // // dtor 713 // forall( dtype DT ) void ^?{}( DT ** ); 714 // forall( dtype DT ) void ^?{}( const DT ** ); 715 // forall( dtype DT ) void ^?{}( volatile DT ** ); 716 // forall( dtype DT ) void ^?{}( const volatile DT ** ); 717 718 // copied from assignment section 719 // copy constructors 720 forall( ftype FT ) void ?{}( FT **, FT * ); 721 forall( ftype FT ) void ?{}( FT * volatile *, FT * ); 722 723 forall( dtype DT ) void ?{}( DT * *, DT * ); 724 forall( dtype DT ) void ?{}( DT * volatile *, DT * ); 725 forall( dtype DT ) void ?{}( const DT * *, DT * ); 726 forall( dtype DT ) void ?{}( const DT * volatile *, DT * ); 727 forall( dtype DT ) void ?{}( const DT * *, const DT * ); 728 forall( dtype DT ) void ?{}( const DT * volatile *, const DT * ); 729 forall( dtype DT ) void ?{}( volatile DT * *, DT * ); 730 forall( dtype DT ) void ?{}( volatile DT * volatile *, DT * ); 731 forall( dtype DT ) void ?{}( volatile DT * *, volatile DT * ); 732 forall( dtype DT ) void ?{}( volatile DT * volatile *, volatile DT * ); 733 734 forall( dtype DT ) void ?{}( const volatile DT * *, DT * ); 735 forall( dtype DT ) void ?{}( const volatile DT * volatile *, DT * ); 736 forall( dtype DT ) void ?{}( const volatile DT * *, const DT * ); 737 forall( dtype DT ) void ?{}( const volatile DT * volatile *, const DT * ); 738 forall( dtype DT ) void ?{}( const volatile DT * *, volatile DT * ); 739 forall( dtype DT ) void ?{}( const volatile DT * volatile *, volatile DT * ); 740 forall( dtype DT ) void ?{}( const volatile DT * *, const volatile DT * ); 741 forall( dtype DT ) void ?{}( const volatile DT * volatile *, const volatile DT * ); 742 743 forall( dtype DT ) void ?{}( DT * *, void * ); 744 forall( dtype DT ) void ?{}( DT * volatile *, void * ); 745 forall( dtype DT ) void ?{}( const DT * *, void * ); 746 forall( dtype DT ) void ?{}( const DT * volatile *, void * ); 747 forall( dtype DT ) void ?{}( const DT * *, const void * ); 748 forall( dtype DT ) void ?{}( const DT * volatile *, const void * ); 749 forall( dtype DT ) void ?{}( volatile DT * *, void * ); 750 forall( dtype DT ) void ?{}( volatile DT * volatile *, void * ); 751 forall( dtype DT ) void ?{}( volatile DT * *, volatile void * ); 752 forall( dtype DT ) void ?{}( volatile DT * volatile *, volatile void * ); 753 754 forall( dtype DT ) void ?{}( const volatile DT * *, void * ); 755 forall( dtype DT ) void ?{}( const volatile DT * volatile *, void * ); 756 forall( dtype DT ) void ?{}( const volatile DT * *, const void * ); 757 forall( dtype DT ) void ?{}( const volatile DT * volatile *, const void * ); 758 forall( dtype DT ) void ?{}( const volatile DT * *, volatile void * ); 759 forall( dtype DT ) void ?{}( const volatile DT * volatile *, volatile void * ); 760 forall( dtype DT ) void ?{}( const volatile DT * *, const volatile void * ); 761 forall( dtype DT ) void ?{}( const volatile DT * volatile *, const volatile void * ); 762 763 forall( dtype DT ) void ?{}( void * *, DT * ); 764 forall( dtype DT ) void ?{}( void * volatile *, DT * ); 765 forall( dtype DT ) void ?{}( const void * *, DT * ); 766 forall( dtype DT ) void ?{}( const void * volatile *, DT * ); 767 forall( dtype DT ) void ?{}( const void * *, const DT * ); 768 forall( dtype DT ) void ?{}( const void * volatile *, const DT * ); 769 forall( dtype DT ) void ?{}( volatile void * *, DT * ); 770 forall( dtype DT ) void ?{}( volatile void * volatile *, DT * ); 771 forall( dtype DT ) void ?{}( volatile void * *, volatile DT * ); 772 forall( dtype DT ) void ?{}( volatile void * volatile *, volatile DT * ); 773 forall( dtype DT ) void ?{}( const volatile void * *, DT * ); 774 forall( dtype DT ) void ?{}( const volatile void * volatile *, DT * ); 775 forall( dtype DT ) void ?{}( const volatile void * *, const DT * ); 776 forall( dtype DT ) void ?{}( const volatile void * volatile *, const DT * ); 777 forall( dtype DT ) void ?{}( const volatile void * *, volatile DT * ); 778 forall( dtype DT ) void ?{}( const volatile void * volatile *, volatile DT * ); 779 forall( dtype DT ) void ?{}( const volatile void * *, const volatile DT * ); 780 forall( dtype DT ) void ?{}( const volatile void * volatile *, const volatile DT * ); 781 782 void ?{}( void * *, void * ); 783 void ?{}( void * volatile *, void * ); 784 void ?{}( const void * *, void * ); 785 void ?{}( const void * volatile *, void * ); 786 void ?{}( const void * *, const void * ); 787 void ?{}( const void * volatile *, const void * ); 788 void ?{}( volatile void * *, void * ); 789 void ?{}( volatile void * volatile *, void * ); 790 void ?{}( volatile void * *, volatile void * ); 791 void ?{}( volatile void * volatile *, volatile void * ); 792 void ?{}( const volatile void * *, void * ); 793 void ?{}( const volatile void * volatile *, void * ); 794 void ?{}( const volatile void * *, const void * ); 795 void ?{}( const volatile void * volatile *, const void * ); 796 void ?{}( const volatile void * *, volatile void * ); 797 void ?{}( const volatile void * volatile *, volatile void * ); 798 void ?{}( const volatile void * *, const volatile void * ); 799 void ?{}( const volatile void * volatile *, const volatile void * ); 800 801 //forall( dtype DT ) void ?{}( DT * *, forall( dtype DT2 ) const DT2 * ); 802 //forall( dtype DT ) void ?{}( DT * volatile *, forall( dtype DT2 ) const DT2 * ); 803 forall( dtype DT ) void ?{}( const DT * *, forall( dtype DT2 ) const DT2 * ); 804 forall( dtype DT ) void ?{}( const DT * volatile *, forall( dtype DT2 ) const DT2 * ); 805 //forall( dtype DT ) void ?{}( volatile DT * *, forall( dtype DT2 ) const DT2 * ); 806 //forall( dtype DT ) void ?{}( volatile DT * volatile *, forall( dtype DT2 ) const DT2 * ); 807 forall( dtype DT ) void ?{}( const volatile DT * *, forall( dtype DT2 ) const DT2 * ); 808 forall( dtype DT ) void ?{}( const volatile DT * volatile *, forall( dtype DT2 ) const DT2 * ); 809 810 forall( ftype FT ) void ?{}( FT * *, forall( ftype FT2 ) FT2 * ); 811 forall( ftype FT ) void ?{}( FT * volatile *, forall( ftype FT2 ) FT2 * ); 812 813 // default ctors 814 forall( ftype FT ) void ?{}( FT * * ); 815 forall( ftype FT ) void ?{}( FT * volatile * ); 816 817 forall( dtype DT ) void ?{}( DT * *); 818 forall( dtype DT ) void ?{}( DT * volatile *); 819 forall( dtype DT ) void ?{}( const DT * *); 820 forall( dtype DT ) void ?{}( const DT * volatile *); 821 forall( dtype DT ) void ?{}( volatile DT * *); 822 forall( dtype DT ) void ?{}( volatile DT * volatile *); 823 forall( dtype DT ) void ?{}( const volatile DT * *); 824 forall( dtype DT ) void ?{}( const volatile DT * volatile *); 825 826 void ?{}( void * *); 827 void ?{}( void * volatile *); 828 void ?{}( const void * *); 829 void ?{}( const void * volatile *); 830 void ?{}( volatile void * *); 831 void ?{}( volatile void * volatile *); 832 void ?{}( const volatile void * *); 833 void ?{}( const volatile void * volatile *); 834 835 // dtors 836 forall( ftype FT ) void ^?{}( FT * * ); 837 forall( ftype FT ) void ^?{}( FT * volatile * ); 838 839 forall( dtype DT ) void ^?{}( DT * *); 840 forall( dtype DT ) void ^?{}( DT * volatile *); 841 forall( dtype DT ) void ^?{}( const DT * *); 842 forall( dtype DT ) void ^?{}( const DT * volatile *); 843 forall( dtype DT ) void ^?{}( volatile DT * *); 844 forall( dtype DT ) void ^?{}( volatile DT * volatile *); 845 forall( dtype DT ) void ^?{}( const volatile DT * *); 846 forall( dtype DT ) void ^?{}( const volatile DT * volatile *); 847 848 void ^?{}( void * *); 849 void ^?{}( void * volatile *); 850 void ^?{}( const void * *); 851 void ^?{}( const void * volatile *); 852 void ^?{}( volatile void * *); 853 void ^?{}( volatile void * volatile *); 854 void ^?{}( const volatile void * *); 855 void ^?{}( const volatile void * volatile *); -
src/main.cc
r0638c44 ra1d6d80 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // main.cc -- 7 // main.cc -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Fri May 15 23:12:02 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Wed Jan 27 22:20:20201613 // Update Count : 19911 // Last Modified By : Rob Schluntz 12 // Last Modified On : Fri Apr 29 12:02:21 2016 13 // Update Count : 200 14 14 // 15 15 … … 40 40 #include "MakeLibCfa.h" 41 41 #include "InitTweak/Mutate.h" 42 #include "InitTweak/RemoveInit.h" 42 #include "InitTweak/GenInit.h" 43 #include "InitTweak/FixInit.h" 43 44 //#include "Explain/GenProlog.h" 44 45 //#include "Try/Visit.h" … … 55 56 56 57 static void parse( FILE * input, LinkageSpec::Type t, bool shouldExit = false ); 57 static void dump( std::list< Declaration * > & translationUnit );58 static void dump( std::list< Declaration * > & translationUnit, std::ostream & out = std::cout ); 58 59 59 60 bool 60 61 astp = false, 61 62 bresolvep = false, 63 bboxp = false, 64 ctorinitp = false, 62 65 exprp = false, 63 66 expraltp = false, … … 74 77 codegenp = false; 75 78 76 enum { Ast, B resolver, Expr, ExprAlt, Grammar, LibCFA, Nopreamble, Parse, Prototypes, Resolver, Symbol, Tree, Validate, };79 enum { Ast, Bbox, Bresolver, CtorInitFix, Expr, ExprAlt, Grammar, LibCFA, Nopreamble, Parse, Prototypes, Resolver, Symbol, Tree, Validate, }; 77 80 78 81 static struct option long_opts[] = { 79 82 { "ast", no_argument, 0, Ast }, 83 { "before-box", no_argument, 0, Bbox }, 80 84 { "before-resolver", no_argument, 0, Bresolver }, 85 { "ctorinitfix", no_argument, 0, CtorInitFix }, 81 86 { "expr", no_argument, 0, Expr }, 82 87 { "expralt", no_argument, 0, ExprAlt }, … … 100 105 101 106 opterr = 0; // prevent getopt from printing error messages 102 107 103 108 int c; 104 while ( (c = getopt_long( argc, argv, "ab efglnpqrstvyzD:", long_opts, &long_index )) != -1 ) {109 while ( (c = getopt_long( argc, argv, "abBcefFglnpqrstvyzD:", long_opts, &long_index )) != -1 ) { 105 110 switch ( c ) { 106 111 case Ast: … … 111 116 case 'b': // print before resolver steps 112 117 bresolvep = true; 118 break; 119 case 'B': // print before resolver steps 120 bboxp = true; 121 break; 122 case CtorInitFix: 123 case 'c': 124 ctorinitp = true; 113 125 break; 114 126 case Expr: … … 187 199 output = new ofstream( argv[ optind ] ); 188 200 } // if 189 201 190 202 Parser::get_parser().set_debug( grammarp ); 191 203 … … 208 220 exit( 1 ); 209 221 } // if 210 222 211 223 parse( prelude, LinkageSpec::Intrinsic ); 212 224 } // if 213 225 } // if 214 226 215 parse( input, libcfap ? LinkageSpec::Intrinsic : LinkageSpec::Cforall, grammarp ); 216 227 parse( input, libcfap ? LinkageSpec::Intrinsic : LinkageSpec::Cforall, grammarp ); 228 217 229 if ( parsep ) { 218 230 Parser::get_parser().get_parseTree()->printList( std::cout ); … … 249 261 OPTPRINT( "mutate" ) 250 262 ControlStruct::mutate( translationUnit ); 251 OPTPRINT( "fixNames" ) 263 OPTPRINT( "fixNames" ) 252 264 CodeGen::fixNames( translationUnit ); 253 OPTPRINT( "tweak " )254 InitTweak:: tweak( translationUnit );265 OPTPRINT( "tweakInit" ) 266 InitTweak::genInit( translationUnit ); 255 267 256 268 if ( libcfap ) { … … 268 280 if ( exprp ) { 269 281 dump( translationUnit ); 282 return 0; 283 } 284 285 OPTPRINT( "fixInit" ) 286 // fix ObjectDecl - replaces ConstructorInit nodes 287 InitTweak::fix( translationUnit ); 288 if ( ctorinitp ) { 289 dump ( translationUnit ); 290 return 0; 270 291 } 271 292 … … 276 297 OPTPRINT( "convertLvalue" ) 277 298 GenPoly::convertLvalue( translationUnit ); 299 300 if ( bboxp ) { 301 dump( translationUnit ); 302 return 0; 303 } 278 304 OPTPRINT( "box" ) 279 305 GenPoly::box( translationUnit ); 280 306 281 307 // print tree right before code generation 282 308 if ( codegenp ) { … … 292 318 } catch ( SemanticError &e ) { 293 319 if ( errorp ) { 294 dump( translationUnit ); 320 std::cerr << "---AST at error:---" << std::endl; 321 dump( translationUnit, std::cerr ); 322 std::cerr << std::endl << "---End of AST, begin error message:---\n" << std::endl; 295 323 } 296 324 e.print( std::cerr ); … … 314 342 } // try 315 343 344 deleteAll( translationUnit ); 316 345 return 0; 317 346 } // main … … 331 360 } 332 361 333 static void dump( std::list< Declaration * > & translationUnit ) {362 static void dump( std::list< Declaration * > & translationUnit, std::ostream & out ) { 334 363 std::list< Declaration * > decls; 335 364 if ( noprotop ) { 336 filter( translationUnit.begin(), translationUnit.end(), 365 filter( translationUnit.begin(), translationUnit.end(), 337 366 std::back_inserter( decls ), notPrelude ); 338 367 } else { … … 340 369 } 341 370 342 printAll( decls, std::cout );371 printAll( decls, out ); 343 372 deleteAll( translationUnit ); 344 373 }
Note: See TracChangeset
for help on using the changeset viewer.