Changes in / [d63eeb0:bd85400]
- Location:
- src
- Files:
-
- 2 deleted
- 33 edited
Legend:
- Unmodified
- Added
- Removed
-
src/CodeGen/CodeGenerator.cc
rd63eeb0 rbd85400 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // CodeGenerator.cc -- 7 // CodeGenerator.cc -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Tue Feb 09 13:24:40 201613 // Update Count : 2 5511 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Jan 25 21:22:00 2016 13 // Update Count : 242 14 14 // 15 15 … … 98 98 handleStorageClass( objectDecl ); 99 99 output << genType( objectDecl->get_type(), mangleName( objectDecl ) ); 100 100 101 101 if ( objectDecl->get_init() ) { 102 102 output << " = "; … … 112 112 if ( aggDecl->get_name() != "" ) 113 113 output << aggDecl->get_name(); 114 114 115 115 std::list< Declaration * > &memb = aggDecl->get_members(); 116 116 … … 118 118 output << " {" << endl; 119 119 120 cur_indent += CodeGenerator::tabsize; 120 cur_indent += CodeGenerator::tabsize; 121 121 for ( std::list< Declaration* >::iterator i = memb.begin(); i != memb.end(); i++) { 122 output << indent; 122 output << indent; 123 123 (*i)->accept( *this ); 124 124 output << ";" << endl; 125 125 } 126 126 127 cur_indent -= CodeGenerator::tabsize; 127 cur_indent -= CodeGenerator::tabsize; 128 128 129 129 output << indent << "}"; … … 140 140 handleAggregate( aggregateDecl ); 141 141 } 142 142 143 143 void CodeGenerator::visit( EnumDecl *aggDecl ) { 144 144 output << "enum "; … … 146 146 if ( aggDecl->get_name() != "" ) 147 147 output << aggDecl->get_name(); 148 148 149 149 std::list< Declaration* > &memb = aggDecl->get_members(); 150 150 … … 152 152 output << " {" << endl; 153 153 154 cur_indent += CodeGenerator::tabsize; 154 cur_indent += CodeGenerator::tabsize; 155 155 for ( std::list< Declaration* >::iterator i = memb.begin(); i != memb.end(); i++) { 156 156 ObjectDecl *obj = dynamic_cast< ObjectDecl* >( *i ); 157 157 assert( obj ); 158 output << indent << mangleName( obj ); 158 output << indent << mangleName( obj ); 159 159 if ( obj->get_init() ) { 160 160 output << " = "; … … 164 164 } // for 165 165 166 cur_indent -= CodeGenerator::tabsize; 166 cur_indent -= CodeGenerator::tabsize; 167 167 168 168 output << indent << "}"; 169 169 } // if 170 170 } 171 171 172 172 void CodeGenerator::visit( ContextDecl *aggregateDecl ) {} 173 173 174 174 void CodeGenerator::visit( TypedefDecl *typeDecl ) { 175 175 output << "typedef "; 176 176 output << genType( typeDecl->get_base(), typeDecl->get_name() ); 177 177 } 178 178 179 179 void CodeGenerator::visit( TypeDecl *typeDecl ) { 180 180 // really, we should mutate this into something that isn't a TypeDecl but that requires large-scale changes, … … 216 216 } 217 217 218 void CodeGenerator::visit( Constant *constant ) { 218 void CodeGenerator::visit( Constant *constant ) { 219 219 output << constant->get_value() ; 220 220 } … … 233 233 assert( arg != applicationExpr->get_args().end() ); 234 234 if ( AddressExpr *addrExpr = dynamic_cast< AddressExpr * >( *arg ) ) { 235 235 236 236 *arg = addrExpr->get_arg(); 237 237 } else { … … 242 242 break; 243 243 } 244 244 245 245 default: 246 246 // do nothing 247 247 ; 248 248 } 249 249 250 250 switch ( opInfo.type ) { 251 251 case OT_INDEX: … … 256 256 output << "]"; 257 257 break; 258 258 259 259 case OT_CALL: 260 // there are no intrinsic definitions of the function call operator or constructors or destructors260 // there are no intrinsic definitions of the function call operator 261 261 assert( false ); 262 262 break; 263 264 case OT_CTOR: 265 // intrinsic constructors should never be called directly - they should be transformed back into Initializer nodes 266 assert(false); 267 break; 268 269 case OT_DTOR: 270 // intrinsic destructors do nothing - don't generate any code 271 output << " // " << dynamic_cast<VariableExpr*>(applicationExpr->get_function())->get_var()->get_name() << endl; 272 break; 273 263 274 264 case OT_PREFIX: 275 265 case OT_PREFIXASSIGN: … … 280 270 output << ")"; 281 271 break; 282 272 283 273 case OT_POSTFIX: 284 274 case OT_POSTFIXASSIGN: … … 287 277 output << opInfo.symbol; 288 278 break; 289 290 279 291 280 case OT_INFIX: … … 298 287 output << ")"; 299 288 break; 300 289 301 290 case OT_CONSTANT: 302 291 case OT_LABELADDRESS: … … 317 306 } // if 318 307 } 319 308 320 309 void CodeGenerator::visit( UntypedExpr *untypedExpr ) { 321 310 if ( NameExpr *nameExpr = dynamic_cast< NameExpr* >( untypedExpr->get_function() ) ) { … … 331 320 output << "]"; 332 321 break; 333 322 334 323 case OT_CALL: 335 324 assert( false ); 336 337 case OT_CTOR: 338 case OT_DTOR: 339 // intrinsic constructors should never be called 340 // intrinsic destructors do nothing 341 break; 342 325 break; 326 343 327 case OT_PREFIX: 344 328 case OT_PREFIXASSIGN: … … 350 334 output << ")"; 351 335 break; 352 336 353 337 case OT_POSTFIX: 354 338 case OT_POSTFIXASSIGN: … … 357 341 output << opInfo.symbol; 358 342 break; 359 343 360 344 case OT_INFIX: 361 345 case OT_INFIXASSIGN: … … 367 351 output << ")"; 368 352 break; 369 353 370 354 case OT_CONSTANT: 371 355 // there are no intrinsic definitions of 0 or 1 as functions … … 385 369 } // if 386 370 } 387 371 388 372 void CodeGenerator::visit( NameExpr *nameExpr ) { 389 373 OperatorInfo opInfo; … … 395 379 } // if 396 380 } 397 381 398 382 void CodeGenerator::visit( AddressExpr *addressExpr ) { 399 383 output << "(&"; … … 424 408 output << ")"; 425 409 } 426 410 427 411 void CodeGenerator::visit( UntypedMemberExpr *memberExpr ) { 428 412 assert( false ); 429 413 } 430 414 431 415 void CodeGenerator::visit( MemberExpr *memberExpr ) { 432 416 memberExpr->get_aggregate()->accept( *this ); 433 417 output << "." << mangleName( memberExpr->get_member() ); 434 418 } 435 419 436 420 void CodeGenerator::visit( VariableExpr *variableExpr ) { 437 421 OperatorInfo opInfo; … … 442 426 } // if 443 427 } 444 428 445 429 void CodeGenerator::visit( ConstantExpr *constantExpr ) { 446 430 assert( constantExpr->get_constant() ); 447 431 constantExpr->get_constant()->accept( *this ); 448 432 } 449 433 450 434 void CodeGenerator::visit( SizeofExpr *sizeofExpr ) { 451 435 output << "sizeof("; … … 480 464 output << ")"; 481 465 } 482 466 483 467 void CodeGenerator::visit( LogicalExpr *logicalExpr ) { 484 468 output << "("; … … 492 476 output << ")"; 493 477 } 494 478 495 479 void CodeGenerator::visit( ConditionalExpr *conditionalExpr ) { 496 480 output << "("; … … 502 486 output << ")"; 503 487 } 504 488 505 489 void CodeGenerator::visit( CommaExpr *commaExpr ) { 506 490 output << "("; … … 510 494 output << ")"; 511 495 } 512 496 513 497 void CodeGenerator::visit( TupleExpr *tupleExpr ) {} 514 498 515 499 void CodeGenerator::visit( TypeExpr *typeExpr ) {} 516 500 … … 543 527 } 544 528 } 545 cur_indent -= CodeGenerator::tabsize; 529 cur_indent -= CodeGenerator::tabsize; 546 530 547 531 output << indent << "}"; … … 549 533 550 534 void CodeGenerator::visit( ExprStmt *exprStmt ) { 551 // I don't see why this check is necessary. 552 // If this starts to cause problems then put it back in, 535 // I don't see why this check is necessary. 536 // If this starts to cause problems then put it back in, 553 537 // with an explanation 554 538 assert( exprStmt ); … … 600 584 switchStmt->get_condition()->accept( *this ); 601 585 output << " ) "; 602 586 603 587 output << "{" << std::endl; 604 588 cur_indent += CodeGenerator::tabsize; … … 620 604 } // if 621 605 output << ":\n"; 622 606 623 607 std::list<Statement *> sts = caseStmt->get_statements(); 624 608 … … 637 621 if ( ! branchStmt->get_target().empty() ) 638 622 output << "goto " << branchStmt->get_target(); 639 else { 623 else { 640 624 if ( branchStmt->get_computedTarget() != 0 ) { 641 625 output << "goto *"; … … 688 672 689 673 void CodeGenerator::visit( ForStmt *forStmt ) { 690 // initialization is always hoisted, so don't 691 // bother doing anything with that 674 // initialization is always hoisted, so don't 675 // bother doing anything with that 692 676 output << "for (;"; 693 677 … … 713 697 void CodeGenerator::visit( DeclStmt *declStmt ) { 714 698 declStmt->get_decl()->accept( *this ); 715 699 716 700 if ( doSemicolon( declStmt->get_decl() ) ) { 717 701 output << ";"; -
src/CodeGen/OperatorTable.cc
rd63eeb0 rbd85400 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Tue Oct 06 15:26:34 201513 // Update Count : 911 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Jun 23 17:41:14 2015 13 // Update Count : 5 14 14 // 15 15 … … 21 21 const OperatorInfo tableValues[] = { 22 22 { "?[?]", "", "_operator_index", OT_INDEX }, 23 { "?{}", "", "_constructor", OT_CTOR },24 { "^?{}", "", "_destructor", OT_DTOR }, // ~?{}, -?{}, !?{}, $?{}, ??{}, ^?{}, ?destroy, ?delete25 23 { "?()", "", "_operator_call", OT_CALL }, 26 24 { "?++", "++", "_operator_postincr", OT_POSTFIXASSIGN }, -
src/CodeGen/OperatorTable.h
rd63eeb0 rbd85400 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Wed Jun 24 16:17:57 201513 // Update Count : 511 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Jun 23 16:09:27 2015 13 // Update Count : 3 14 14 // 15 15 … … 22 22 enum OperatorType { 23 23 OT_INDEX, 24 OT_CTOR,25 OT_DTOR,26 24 OT_CALL, 27 25 OT_PREFIX, -
src/GenPoly/Box.cc
rd63eeb0 rbd85400 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Tue Feb 09 14:39:52201613 // Update Count : 2 9511 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Feb 5 16:45:07 2016 13 // Update Count : 286 14 14 // 15 15 … … 372 372 373 373 Expression *Pass1::makeOffsetArray( StructInstType *ty ) { 374 std::list<Expression*> noDesignators;375 374 std::list< Declaration* > &baseMembers = ty->get_baseStruct()->get_members(); 376 375 … … 391 390 memberDecl = new ObjectDecl( (*member)->get_name(), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, offsetType->clone(), 0 ); 392 391 } 393 inits.push_back( new SingleInit( new OffsetofExpr( ty->clone(), memberDecl ) , noDesignators) );392 inits.push_back( new SingleInit( new OffsetofExpr( ty->clone(), memberDecl ) ) ); 394 393 } 395 arrayTemp->set_init( new ListInit( inits , noDesignators) );394 arrayTemp->set_init( new ListInit( inits ) ); 396 395 397 396 // return variable pointing to temporary … … 1283 1282 1284 1283 std::list<Expression*> designators; 1285 objectDecl->set_init( new SingleInit( alloc, designators , false ) ); // not constructed1284 objectDecl->set_init( new SingleInit( alloc, designators ) ); 1286 1285 } 1287 1286 } … … 1323 1322 return derefdVar; 1324 1323 } 1325 1324 1326 1325 Expression *MemberExprFixer::mutate( MemberExpr *memberExpr ) { 1327 1326 // mutate, exiting early if no longer MemberExpr -
src/GenPoly/Specialize.cc
rd63eeb0 rbd85400 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Jan 20 1 3:00:00201613 // Update Count : 2412 // Last Modified On : Wed Jan 20 12:40:33 2016 13 // Update Count : 18 14 14 // 15 15 … … 142 142 143 143 Expression * Specialize::doSpecialization( Type *formalType, Expression *actual, InferredParams *inferParams ) { 144 assert( ! actual->get_results().empty() ); // using front, should have this assert144 assert( ! actual->get_results().empty() ); 145 145 if ( needsSpecialization( formalType, actual->get_results().front(), env ) ) { 146 146 FunctionType *funType; -
src/InitTweak/InitModel.cc
rd63eeb0 rbd85400 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // InitModel.cc -- 7 // InitModel.cc -- 8 8 // 9 9 // Author : Rodolfo G. Esteves 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : T hu Jan 07 13:38:46 201613 // Update Count : 511 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue May 19 16:37:08 2015 13 // Update Count : 1 14 14 // 15 15 … … 198 198 assert(init == 0 && single != 0); 199 199 std::list< Expression * > empty; 200 init = new SingleInit( single->get_expr(), empty , false ); // cannot be constructed200 init = new SingleInit( single->get_expr(), empty ); 201 201 return; 202 202 } … … 214 214 } // if 215 215 216 std::list< Expression * > desig; 217 init = new ListInit( contents, desig, false ); // cannot be constructed 216 init = new ListInit( contents ); 218 217 return; 219 218 } -
src/InitTweak/RemoveInit.cc
rd63eeb0 rbd85400 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // RemoveInit.cc -- 7 // RemoveInit.cc -- 8 8 // 9 9 // Author : Rob Schluntz 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Tue Feb 09 15:12:29 201613 // Update Count : 1 6611 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Dec 15 15:37:26 2015 13 // Update Count : 15 14 14 // 15 15 16 #include <stack>17 #include <list>18 16 #include "RemoveInit.h" 19 17 #include "SynTree/Declaration.h" … … 23 21 #include "SynTree/Initializer.h" 24 22 #include "SynTree/Mutator.h" 25 #include "GenPoly/PolyMutator.h"26 23 27 24 namespace InitTweak { … … 29 26 const std::list<Label> noLabels; 30 27 } 31 32 class RemoveInit : public GenPoly::PolyMutator {28 29 class RemoveInit : public Mutator { 33 30 public: 34 /// removes and replaces initialization for polymorphic value objects35 /// with assignment (TODO: constructor) statements.36 /// also consistently allocates a temporary variable for the return value37 /// of a function so that anything which the resolver decides can be assigned38 /// into the return type of a function can be returned.39 static void removeInitializers( std::list< Declaration * > &translationUnit );40 41 31 RemoveInit(); 42 virtual ObjectDecl * mutate( ObjectDecl *objDecl);32 virtual ObjectDecl * mutate(ObjectDecl *objDecl); 43 33 virtual DeclarationWithType * mutate( FunctionDecl *functionDecl ); 44 34 45 35 virtual Statement * mutate( ReturnStmt * returnStmt ); 36 37 virtual CompoundStmt * mutate(CompoundStmt * compoundStmt); 38 39 protected: 40 std::list< Statement* > stmtsToAddBefore; 41 std::list< Statement* > stmtsToAddAfter; 42 void mutateStatementList( std::list< Statement* > &statements ); 46 43 47 protected:48 44 std::list<DeclarationWithType*> returnVals; 49 45 UniqueName tempNamer; … … 51 47 }; 52 48 53 class CtorDtor : public GenPoly::PolyMutator { 54 public: 55 /// create constructor and destructor statements for object declarations. 56 /// Destructors are inserted directly into the code, whereas constructors 57 /// will be added in after the resolver has run so that the initializer expression 58 /// is only removed if a constructor is found 59 static void generateCtorDtor( std::list< Declaration * > &translationUnit ); 60 61 CtorDtor() : inFunction( false ) {} 62 63 virtual ObjectDecl * mutate( ObjectDecl * ); 64 virtual DeclarationWithType * mutate( FunctionDecl *functionDecl ); 65 virtual Declaration* mutate( StructDecl *aggregateDecl ); 66 virtual Declaration* mutate( UnionDecl *aggregateDecl ); 67 virtual Declaration* mutate( EnumDecl *aggregateDecl ); 68 virtual Declaration* mutate( ContextDecl *aggregateDecl ); 69 virtual TypeDecl* mutate( TypeDecl *typeDecl ); 70 virtual Declaration* mutate( TypedefDecl *typeDecl ); 71 72 virtual CompoundStmt * mutate( CompoundStmt * compoundStmt ); 73 74 protected: 75 bool inFunction; 76 77 // to be added before block ends - use push_front so order is correct 78 std::list< Statement * > destructorStmts; 79 }; 80 81 void tweak( std::list< Declaration * > & translationUnit ) { 82 RemoveInit::removeInitializers( translationUnit ); 83 CtorDtor::generateCtorDtor( translationUnit ); 84 } 85 86 void RemoveInit::removeInitializers( std::list< Declaration * > & translationUnit ) { 49 void tweak( std::list< Declaration * > translationUnit ) { 87 50 RemoveInit remover; 88 51 mutateAll( translationUnit, remover ); … … 90 53 91 54 RemoveInit::RemoveInit() : tempNamer( "_retVal" ) {} 55 56 void RemoveInit::mutateStatementList( std::list< Statement* > &statements ) { 57 for ( std::list< Statement* >::iterator i = statements.begin(); i != statements.end(); ++i ) { 58 if ( ! stmtsToAddAfter.empty() ) { 59 statements.splice( i, stmtsToAddAfter ); 60 } // if 61 *i = (*i)->acceptMutator( *this ); 62 if ( ! stmtsToAddBefore.empty() ) { 63 statements.splice( i, stmtsToAddBefore ); 64 } // if 65 } // for 66 if ( ! stmtsToAddAfter.empty() ) { 67 statements.splice( statements.end(), stmtsToAddAfter ); 68 } // if 69 } 70 71 CompoundStmt *RemoveInit::mutate(CompoundStmt *compoundStmt) { 72 mutateStatementList( compoundStmt->get_kids() ); 73 return compoundStmt; 74 } 92 75 93 76 // in the case where an object has an initializer and a polymorphic type, insert an assignment immediately after the … … 96 79 if (objDecl->get_init() && dynamic_cast<TypeInstType*>(objDecl->get_type())) { 97 80 if (SingleInit * single = dynamic_cast<SingleInit*>(objDecl->get_init())) { 98 // xxx this can be more complicated - consider ListInit 99 UntypedExpr *assign = new UntypedExpr( new NameExpr( "?{}" ) ); 81 UntypedExpr *assign = new UntypedExpr( new NameExpr( "?=?" ) ); 100 82 assign->get_args().push_back( new AddressExpr (new NameExpr( objDecl->get_name() ) ) ); 101 83 assign->get_args().push_back( single->get_value()->clone() ); … … 111 93 // hands off if the function returns an lvalue - we don't want to allocate a temporary if a variable's address 112 94 // is being returned 113 // xxx - this should construct rather than assign114 95 if ( returnStmt->get_expr() && returnVals.size() == 1 && funcName != "?=?" && ! returnVals.front()->get_type()->get_isLvalue() ) { 115 96 ObjectDecl *newObj = new ObjectDecl( tempNamer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::C, 0, returnVals.front()->get_type()->clone(), 0 ); 116 stmtsToAdd .push_back( new DeclStmt( noLabels, newObj ) );117 97 stmtsToAddBefore.push_back( new DeclStmt( noLabels, newObj ) ); 98 118 99 UntypedExpr *assign = new UntypedExpr( new NameExpr( "?=?" ) ); 119 100 assign->get_args().push_back( new AddressExpr (new NameExpr( newObj->get_name() ) ) ); 120 101 assign->get_args().push_back( returnStmt->get_expr() ); 121 stmtsToAdd .push_back(new ExprStmt(noLabels, assign));102 stmtsToAddBefore.push_back(new ExprStmt(noLabels, assign)); 122 103 123 104 returnStmt->set_expr( new VariableExpr( newObj ) ); … … 129 110 std::list<DeclarationWithType*> oldReturnVals = returnVals; 130 111 std::string oldFuncName = funcName; 131 112 132 113 FunctionType * type = functionDecl->get_functionType(); 133 114 returnVals = type->get_returnVals(); … … 138 119 return decl; 139 120 } 140 141 142 void CtorDtor::generateCtorDtor( std::list< Declaration * > & translationUnit ) {143 CtorDtor ctordtor;144 mutateAll( translationUnit, ctordtor );145 }146 147 namespace {148 bool tryConstruct( ObjectDecl * objDecl ) {149 // xxx - handle designations150 return ! LinkageSpec::isBuiltin( objDecl->get_linkage() ) &&151 (objDecl->get_init() == NULL ||152 ( objDecl->get_init() != NULL && objDecl->get_init()->get_maybeConstructed() ));153 }154 155 Expression * makeCtorDtorExpr( std::string name, ObjectDecl * objDecl, std::list< Expression * > args ) {156 UntypedExpr * expr = new UntypedExpr( new NameExpr( name ) );157 expr->get_args().push_back( new AddressExpr( new VariableExpr( objDecl ) ) );158 expr->get_args().splice( expr->get_args().end(), args );159 return expr;160 }161 162 class InitExpander : public Visitor {163 public:164 InitExpander() {}165 // ~InitExpander() {}166 virtual void visit( SingleInit * singleInit );167 virtual void visit( ListInit * listInit );168 std::list< Expression * > argList;169 };170 171 void InitExpander::visit( SingleInit * singleInit ) {172 argList.push_back( singleInit->get_value()->clone() );173 }174 175 void InitExpander::visit( ListInit * listInit ) {176 // xxx - for now, assume no nested list inits177 std::list<Initializer*>::iterator it = listInit->begin_initializers();178 for ( ; it != listInit->end_initializers(); ++it ) {179 (*it)->accept( *this );180 }181 }182 183 std::list< Expression * > makeInitList( Initializer * init ) {184 InitExpander expander;185 maybeAccept( init, expander );186 return expander.argList;187 }188 }189 190 ObjectDecl * CtorDtor::mutate( ObjectDecl * objDecl ) {191 // hands off if designated or if @=192 if ( tryConstruct( objDecl ) ) {193 if ( inFunction ) {194 Expression * ctor = makeCtorDtorExpr( "?{}", objDecl, makeInitList( objDecl->get_init() ) );195 Expression * dtor = makeCtorDtorExpr( "^?{}", objDecl, std::list< Expression * >() );196 197 // need to remember init expression, in case no ctors exist198 // if ctor does exist, want to use ctor expression instead of init199 // push this decision to the resolver200 objDecl->set_init( new ConstructorInit( ctor, objDecl->get_init() ) );201 destructorStmts.push_front( new ExprStmt( noLabels, dtor ) );202 } else {203 // xxx - find a way to construct/destruct globals204 // hack: implicit "static" initialization routine for each struct type? or something similar?205 // --ties into module system206 }207 }208 return objDecl;209 }210 211 DeclarationWithType * CtorDtor::mutate( FunctionDecl *functionDecl ) {212 // parameters should not be constructed and destructed, so don't mutate FunctionType213 bool oldInFunc = inFunction;214 mutateAll( functionDecl->get_oldDecls(), *this );215 inFunction = true;216 functionDecl->set_statements( maybeMutate( functionDecl->get_statements(), *this ) );217 inFunction = oldInFunc;218 return functionDecl;219 }220 221 CompoundStmt * CtorDtor::mutate( CompoundStmt * compoundStmt ) {222 CompoundStmt * ret = PolyMutator::mutate( compoundStmt );223 std::list< Statement * > &statements = ret->get_kids();224 if ( ! destructorStmts.empty() ) {225 // TODO: adding to the end of a block isn't sufficient, since226 // return/break/goto should trigger destructor when block is left.227 statements.splice( statements.end(), destructorStmts );228 } // if229 return ret;230 }231 232 // should not traverse into any of these declarations to find objects233 // that need to be constructed or destructed234 Declaration* CtorDtor::mutate( StructDecl *aggregateDecl ) { return aggregateDecl; }235 Declaration* CtorDtor::mutate( UnionDecl *aggregateDecl ) { return aggregateDecl; }236 Declaration* CtorDtor::mutate( EnumDecl *aggregateDecl ) { return aggregateDecl; }237 Declaration* CtorDtor::mutate( ContextDecl *aggregateDecl ) { return aggregateDecl; }238 TypeDecl* CtorDtor::mutate( TypeDecl *typeDecl ) { return typeDecl; }239 Declaration* CtorDtor::mutate( TypedefDecl *typeDecl ) { return typeDecl; }240 241 121 } // namespace InitTweak 242 122 -
src/InitTweak/RemoveInit.h
rd63eeb0 rbd85400 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // RemoveInit.h -- 7 // RemoveInit.h -- 8 8 // 9 9 // Author : Rodolfo G. Esteves 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Mon Jan 11 16:02:44 201613 // Update Count : 311 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Nov 27 17:00:47 2015 13 // Update Count : 2 14 14 // 15 15 … … 26 26 namespace InitTweak { 27 27 /// Adds assignment statements for polymorphic type initializers 28 void tweak( std::list< Declaration * > &translationUnit );29 } // namespace 28 void tweak( std::list< Declaration * > translationUnit ); 29 } // namespace 30 30 31 31 #endif // GENPOLY_POLYMUTATOR_H -
src/InitTweak/module.mk
rd63eeb0 rbd85400 11 11 ## Created On : Mon Jun 1 17:49:17 2015 12 12 ## Last Modified By : Rob Schluntz 13 ## Last Modified On : Wed Jan 13 16:29:03201614 ## Update Count : 313 ## Last Modified On : Mon Jan 11 14:40:16 2016 14 ## Update Count : 2 15 15 ############################################################################### 16 16 17 SRC += InitTweak/RemoveInit.cc \18 InitTweak/FixInit.cc 17 SRC += InitTweak/RemoveInit.cc 18 -
src/MakeLibCfa.cc
rd63eeb0 rbd85400 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // MakeLibCfa.cc -- 7 // MakeLibCfa.cc -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sat May 16 10:33:33 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Tue Jan 19 13:20:26 201613 // Update Count : 4014 // 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Jun 26 16:52:59 2015 13 // Update Count : 14 14 // 15 15 16 16 #include "MakeLibCfa.h" … … 29 29 void visit( FunctionDecl* funcDecl ); 30 30 void visit( ObjectDecl* objDecl ); 31 31 32 32 std::list< Declaration* > &get_newDecls() { return newDecls; } 33 33 private: … … 43 43 void MakeLibCfa::visit( FunctionDecl* origFuncDecl ) { 44 44 if ( origFuncDecl->get_linkage() != LinkageSpec::Intrinsic ) return; 45 45 46 46 FunctionDecl *funcDecl = origFuncDecl->clone(); 47 47 CodeGen::OperatorInfo opInfo; … … 54 54 assert( param != funcDecl->get_functionType()->get_parameters().end() ); 55 55 56 for ( ; param != funcDecl->get_functionType()->get_parameters().end(); ++param ) { 57 if ( (*param)->get_name() == "" ) { 58 (*param)->set_name( paramNamer.newName() ); 59 (*param)->set_linkage( LinkageSpec::C ); 60 } 61 newExpr->get_args().push_back( new VariableExpr( *param ) ); 62 } // for 63 64 funcDecl->set_statements( new CompoundStmt( std::list< Label >() ) ); 65 newDecls.push_back( funcDecl ); 56 if ( (*param)->get_name() == "" ) { 57 (*param)->set_name( paramNamer.newName() ); 58 (*param)->set_linkage( LinkageSpec::C ); 59 } // if 66 60 67 61 switch ( opInfo.type ) { … … 71 65 case CodeGen::OT_POSTFIX: 72 66 case CodeGen::OT_INFIX: 67 newExpr->get_args().push_back( new VariableExpr( *param ) ); 68 break; 73 69 case CodeGen::OT_PREFIXASSIGN: 74 70 case CodeGen::OT_POSTFIXASSIGN: 75 71 case CodeGen::OT_INFIXASSIGN: 76 funcDecl->get_statements()->get_kids().push_back( new ReturnStmt( std::list< Label >(), newExpr ) ); 72 { 73 newExpr->get_args().push_back( new VariableExpr( *param ) ); 74 // UntypedExpr *deref = new UntypedExpr( new NameExpr( "*?" ) ); 75 // deref->get_args().push_back( new VariableExpr( *param ) ); 76 // newExpr->get_args().push_back( deref ); 77 77 break; 78 case CodeGen::OT_CTOR: 79 // ctors don't return a value 80 if ( funcDecl->get_functionType()->get_parameters().size() == 1 ) { 81 // intrinsic default constructors should do nothing 82 // delete newExpr; 83 break; 84 } else { 85 assert( funcDecl->get_functionType()->get_parameters().size() == 2 ); 86 // anything else is a single parameter constructor that is effectively a C-style assignment 87 // delete newExpr->get_function(); 88 assert(newExpr->get_args().size()==2); 89 newExpr->set_function( new NameExpr( "?=?" ) ); 90 funcDecl->get_statements()->get_kids().push_back( new ExprStmt( std::list< Label >(), newExpr ) ); 91 } 92 break; 93 case CodeGen::OT_DTOR: 94 // intrinsic destructors should do nothing 95 // delete newExpr; 96 break; 78 } 97 79 case CodeGen::OT_CONSTANT: 98 80 case CodeGen::OT_LABELADDRESS: … … 100 82 assert( false ); 101 83 } // switch 84 85 for ( param++; param != funcDecl->get_functionType()->get_parameters().end(); ++param ) { 86 if ( (*param)->get_name() == "" ) { 87 (*param)->set_name( paramNamer.newName() ); 88 (*param)->set_linkage( LinkageSpec::C ); 89 } 90 newExpr->get_args().push_back( new VariableExpr( *param ) ); 91 } // for 92 funcDecl->set_statements( new CompoundStmt( std::list< Label >() ) ); 93 funcDecl->get_statements()->get_kids().push_back( new ReturnStmt( std::list< Label >(), newExpr ) ); 94 newDecls.push_back( funcDecl ); 102 95 } 103 96 104 97 void MakeLibCfa::visit( ObjectDecl* origObjDecl ) { 105 98 if ( origObjDecl->get_linkage() != LinkageSpec::Intrinsic ) return; 106 99 107 100 ObjectDecl *objDecl = origObjDecl->clone(); 108 101 assert( ! objDecl->get_init() ); 109 102 std::list< Expression* > noDesignators; 110 objDecl->set_init( new SingleInit( new NameExpr( objDecl->get_name() ), noDesignators , false ) ); // cannot be constructed103 objDecl->set_init( new SingleInit( new NameExpr( objDecl->get_name() ), noDesignators ) ); 111 104 newDecls.push_back( objDecl ); 112 105 } 113 106 } // namespace LibCfa 107 108 // Local Variables: // 109 // tab-width: 4 // 110 // mode: c++ // 111 // compile-command: "make install" // 112 // End: // -
src/Makefile.in
rd63eeb0 rbd85400 125 125 GenPoly/driver_cfa_cpp-DeclMutator.$(OBJEXT) \ 126 126 InitTweak/driver_cfa_cpp-RemoveInit.$(OBJEXT) \ 127 InitTweak/driver_cfa_cpp-FixInit.$(OBJEXT) \128 127 Parser/driver_cfa_cpp-parser.$(OBJEXT) \ 129 128 Parser/driver_cfa_cpp-lex.$(OBJEXT) \ … … 349 348 GenPoly/CopyParams.cc GenPoly/FindFunction.cc \ 350 349 GenPoly/InstantiateGeneric.cc GenPoly/DeclMutator.cc \ 351 InitTweak/RemoveInit.cc InitTweak/FixInit.cc Parser/parser.yy\352 Parser/ lex.ll Parser/TypedefTable.cc Parser/ParseNode.cc \350 InitTweak/RemoveInit.cc Parser/parser.yy Parser/lex.ll \ 351 Parser/TypedefTable.cc Parser/ParseNode.cc \ 353 352 Parser/DeclarationNode.cc Parser/ExpressionNode.cc \ 354 353 Parser/StatementNode.cc Parser/InitializerNode.cc \ … … 411 410 esac; \ 412 411 done; \ 413 echo ' cd $(top_srcdir) && $(AUTOMAKE) -- foreignsrc/Makefile'; \412 echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ 414 413 $(am__cd) $(top_srcdir) && \ 415 $(AUTOMAKE) -- foreignsrc/Makefile414 $(AUTOMAKE) --gnu src/Makefile 416 415 .PRECIOUS: Makefile 417 416 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status … … 569 568 InitTweak/driver_cfa_cpp-RemoveInit.$(OBJEXT): \ 570 569 InitTweak/$(am__dirstamp) InitTweak/$(DEPDIR)/$(am__dirstamp) 571 InitTweak/driver_cfa_cpp-FixInit.$(OBJEXT): InitTweak/$(am__dirstamp) \572 InitTweak/$(DEPDIR)/$(am__dirstamp)573 570 Parser/parser.h: Parser/parser.cc 574 571 @if test ! -f $@; then rm -f Parser/parser.cc; else :; fi … … 803 800 -rm -f GenPoly/driver_cfa_cpp-ScrubTyVars.$(OBJEXT) 804 801 -rm -f GenPoly/driver_cfa_cpp-Specialize.$(OBJEXT) 805 -rm -f InitTweak/driver_cfa_cpp-FixInit.$(OBJEXT)806 802 -rm -f InitTweak/driver_cfa_cpp-RemoveInit.$(OBJEXT) 807 803 -rm -f Parser/driver_cfa_cpp-DeclarationNode.$(OBJEXT) … … 911 907 @AMDEP_TRUE@@am__include@ @am__quote@GenPoly/$(DEPDIR)/driver_cfa_cpp-ScrubTyVars.Po@am__quote@ 912 908 @AMDEP_TRUE@@am__include@ @am__quote@GenPoly/$(DEPDIR)/driver_cfa_cpp-Specialize.Po@am__quote@ 913 @AMDEP_TRUE@@am__include@ @am__quote@InitTweak/$(DEPDIR)/driver_cfa_cpp-FixInit.Po@am__quote@914 909 @AMDEP_TRUE@@am__include@ @am__quote@InitTweak/$(DEPDIR)/driver_cfa_cpp-RemoveInit.Po@am__quote@ 915 910 @AMDEP_TRUE@@am__include@ @am__quote@Parser/$(DEPDIR)/driver_cfa_cpp-DeclarationNode.Po@am__quote@ … … 1410 1405 @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` 1411 1406 1412 InitTweak/driver_cfa_cpp-FixInit.o: InitTweak/FixInit.cc1413 @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.cc1414 @am__fastdepCXX_TRUE@ $(am__mv) InitTweak/$(DEPDIR)/driver_cfa_cpp-FixInit.Tpo InitTweak/$(DEPDIR)/driver_cfa_cpp-FixInit.Po1415 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='InitTweak/FixInit.cc' object='InitTweak/driver_cfa_cpp-FixInit.o' libtool=no @AMDEPBACKSLASH@1416 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@1417 @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.cc1418 1419 InitTweak/driver_cfa_cpp-FixInit.obj: InitTweak/FixInit.cc1420 @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`1421 @am__fastdepCXX_TRUE@ $(am__mv) InitTweak/$(DEPDIR)/driver_cfa_cpp-FixInit.Tpo InitTweak/$(DEPDIR)/driver_cfa_cpp-FixInit.Po1422 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='InitTweak/FixInit.cc' object='InitTweak/driver_cfa_cpp-FixInit.obj' libtool=no @AMDEPBACKSLASH@1423 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@1424 @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`1425 1426 1407 Parser/driver_cfa_cpp-parser.o: Parser/parser.cc 1427 1408 @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT Parser/driver_cfa_cpp-parser.o -MD -MP -MF Parser/$(DEPDIR)/driver_cfa_cpp-parser.Tpo -c -o Parser/driver_cfa_cpp-parser.o `test -f 'Parser/parser.cc' || echo '$(srcdir)/'`Parser/parser.cc -
src/Parser/DeclarationNode.cc
rd63eeb0 rbd85400 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // DeclarationNode.cc -- 7 // DeclarationNode.cc -- 8 8 // 9 9 // Author : Rodolfo G. Esteves 10 10 // Created On : Sat May 16 12:34:05 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : T hu Jan 07 13:18:02 201613 // Update Count : 1 3011 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Jul 14 14:46:32 2015 13 // Update Count : 126 14 14 // 15 15 … … 96 96 os << endl << string( indent + 2, ' ' ) << "with initializer "; 97 97 initializer->printOneLine( os ); 98 os << " maybe constructed? " << initializer->get_maybeConstructed();99 100 98 } // if 101 99 … … 359 357 } // if 360 358 } 361 359 362 360 DeclarationNode *DeclarationNode::addQualifiers( DeclarationNode *q ) { 363 361 if ( q ) { … … 510 508 assert( false ); 511 509 } // switch 512 510 513 511 return this; 514 512 } … … 621 619 assert( a->type->kind == TypeData::Array ); 622 620 TypeData *lastArray = findLast( a->type ); 623 if ( type ) { 621 if ( type ) { 624 622 switch ( type->kind ) { 625 623 case TypeData::Aggregate: … … 665 663 } // if 666 664 } 667 665 668 666 DeclarationNode *DeclarationNode::addIdList( DeclarationNode *ids ) { 669 667 type = addIdListToType( type, ids ); … … 870 868 Type *DeclarationNode::buildType() const { 871 869 assert( type ); 872 870 873 871 switch ( type->kind ) { 874 872 case TypeData::Enum: -
src/Parser/InitializerNode.cc
rd63eeb0 rbd85400 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // InitializerNode.cc -- 8 // 7 // InitializerNode.cc -- 8 // 9 9 // Author : Rodolfo G. Esteves 10 10 // Created On : Sat May 16 13:20:24 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Thu Jan 07 13:32:57 201613 // Update Count : 1314 // 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Oct 8 17:18:55 2015 13 // Update Count : 4 14 // 15 15 16 16 #include <cassert> … … 23 23 24 24 InitializerNode::InitializerNode( ExpressionNode *_expr, bool aggrp, ExpressionNode *des ) 25 : expr( _expr ), aggregate( aggrp ), designator( des ), kids( 0 ) , maybeConstructed( true ){25 : expr( _expr ), aggregate( aggrp ), designator( des ), kids( 0 ) { 26 26 if ( aggrp ) 27 27 kids = dynamic_cast< InitializerNode *>( get_link() ); … … 32 32 33 33 InitializerNode::InitializerNode( InitializerNode *init, bool aggrp, ExpressionNode *des ) 34 : expr( 0 ), aggregate( aggrp ), designator( des ), kids( 0 ) , maybeConstructed( true ){34 : expr( 0 ), aggregate( aggrp ), designator( des ), kids( 0 ) { 35 35 if ( init != 0 ) 36 36 set_link(init); … … 91 91 } // if 92 92 93 return new ListInit( initlist, designlist , maybeConstructed);93 return new ListInit( initlist, designlist ); 94 94 } else { 95 95 std::list< Expression *> designators; … … 99 99 100 100 if ( get_expression() != 0) 101 return new SingleInit( get_expression()->build(), designators , maybeConstructed);101 return new SingleInit( get_expression()->build(), designators ); 102 102 } // if 103 103 -
src/Parser/ParseNode.h
rd63eeb0 rbd85400 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // ParseNode.h -- 7 // ParseNode.h -- 8 8 // 9 9 // Author : Rodolfo G. Esteves 10 10 // Created On : Sat May 16 13:28:16 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Tue Feb 09 13:23:34201613 // Update Count : 18 511 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Feb 1 13:32:32 2016 13 // Update Count : 184 14 14 // 15 15 … … 177 177 enum Type { TupleC, Comma, TupleFieldSel, // n-adic 178 178 // triadic 179 Cond, NCond, 179 Cond, NCond, 180 180 // diadic 181 SizeOf, AlignOf, OffsetOf, Attr, CompLit, Plus, Minus, Mul, Div, Mod, Or, And, 182 BitOr, BitAnd, Xor, Cast, LShift, RShift, LThan, GThan, LEThan, GEThan, Eq, Neq, 181 SizeOf, AlignOf, OffsetOf, Attr, CompLit, Plus, Minus, Mul, Div, Mod, Or, And, 182 BitOr, BitAnd, Xor, Cast, LShift, RShift, LThan, GThan, LEThan, GEThan, Eq, Neq, 183 183 Assign, MulAssn, DivAssn, ModAssn, PlusAssn, MinusAssn, LSAssn, RSAssn, AndAssn, ERAssn, OrAssn, 184 184 Index, FieldSel, PFieldSel, Range, 185 185 // monadic 186 186 UnPlus, UnMinus, AddressOf, PointTo, Neg, BitNeg, Incr, IncrPost, Decr, DecrPost, LabelAddress, 187 Ctor, Dtor,188 187 }; 189 188 … … 310 309 ValofExprNode( const ValofExprNode &other ); 311 310 ~ValofExprNode(); 312 311 313 312 virtual ValofExprNode *clone() const { return new ValofExprNode( *this ); } 314 313 … … 333 332 enum TypeClass { Type, Dtype, Ftype }; 334 333 335 static const char *storageName[]; 334 static const char *storageName[]; 336 335 static const char *qualifierName[]; 337 336 static const char *basicTypeName[]; … … 423 422 class StatementNode : public ParseNode { 424 423 public: 425 enum Type { Exp, If, Switch, Case, Default, Choose, Fallthru, 424 enum Type { Exp, If, Switch, Case, Default, Choose, Fallthru, 426 425 While, Do, For, 427 426 Goto, Continue, Break, Return, Throw, … … 521 520 ExpressionNode *get_designators() const { return designator; } 522 521 523 InitializerNode *set_maybeConstructed( bool value ) { maybeConstructed = value; return this; }524 bool get_maybeConstructed() const { return maybeConstructed; }525 526 522 InitializerNode *next_init() const { return kids; } 527 523 … … 535 531 ExpressionNode *designator; // may be list 536 532 InitializerNode *kids; 537 bool maybeConstructed;538 533 }; 539 534 -
src/Parser/TypeData.cc
rd63eeb0 rbd85400 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // TypeData.cc -- 7 // TypeData.cc -- 8 8 // 9 9 // Author : Rodolfo G. Esteves 10 10 // Created On : Sat May 16 15:12:51 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : T hu Jan 14 10:43:42 201613 // Update Count : 3 611 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Jul 14 14:57:23 2015 13 // Update Count : 32 14 14 // 15 15 … … 436 436 for ( std::list< TypeDecl* >::iterator i = outputList.begin(); i != outputList.end(); ++i ) { 437 437 if ( (*i)->get_kind() == TypeDecl::Any ) { 438 // add assertion parameters to `type' tyvars439 // add: T * ?=?(T *, T)440 438 FunctionType *assignType = new FunctionType( Type::Qualifiers(), false ); 441 439 assignType->get_parameters().push_back( new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), new TypeInstType( Type::Qualifiers(), (*i)->get_name(), *i ) ), 0 ) ); … … 443 441 assignType->get_returnVals().push_back( new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new TypeInstType( Type::Qualifiers(), (*i)->get_name(), *i ), 0 ) ); 444 442 (*i)->get_assertions().push_front( new FunctionDecl( "?=?", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, assignType, 0, false, false ) ); 445 446 // add: void ?{}(T *)447 FunctionType *ctorType = new FunctionType( Type::Qualifiers(), false );448 ctorType->get_parameters().push_back( new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), new TypeInstType( Type::Qualifiers(), (*i)->get_name(), *i ) ), 0 ) );449 (*i)->get_assertions().push_front( new FunctionDecl( "?{}", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, ctorType, 0, false, false ) );450 451 // add: void ^?{}(T *)452 FunctionType *dtorType = new FunctionType( Type::Qualifiers(), false );453 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 ) );454 (*i)->get_assertions().push_front( new FunctionDecl( "^?{}", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, dtorType, 0, false, false ) );455 443 } // if 456 444 } // for -
src/Parser/parser.cc
rd63eeb0 rbd85400 2 2 3 3 /* Bison implementation for Yacc-like parsers in C 4 4 5 5 Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc. 6 6 7 7 This program is free software: you can redistribute it and/or modify 8 8 it under the terms of the GNU General Public License as published by 9 9 the Free Software Foundation, either version 3 of the License, or 10 10 (at your option) any later version. 11 11 12 12 This program is distributed in the hope that it will be useful, 13 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 15 GNU General Public License for more details. 16 16 17 17 You should have received a copy of the GNU General Public License 18 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */ … … 27 27 Bison output files to be licensed under the GNU General Public 28 28 License without this special exception. 29 29 30 30 This special exception was added by the Free Software Foundation in 31 31 version 2.2 of Bison. */ … … 7353 7353 7354 7354 /* Line 1806 of yacc.c */ 7355 #line 16 84"parser.yy"7356 { (yyval.in) = (yyvsp[(2) - (2)].in) ->set_maybeConstructed( false ); }7355 #line 1690 "parser.yy" 7356 { (yyval.in) = (yyvsp[(2) - (2)].in); } 7357 7357 break; 7358 7358 -
src/Parser/parser.yy
rd63eeb0 rbd85400 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // cfa.y -- 8 // 7 // cfa.y -- 8 // 9 9 // Author : Peter A. Buhr 10 10 // Created On : Sat Sep 1 20:22:55 2001 … … 12 12 // Last Modified On : Mon Feb 1 18:22:42 2016 13 13 // Update Count : 1483 14 // 14 // 15 15 16 16 // This grammar is based on the ANSI99/11 C grammar, specifically parts of EXPRESSION and STATEMENTS, and on the C … … 1688 1688 { $$ = $2; } 1689 1689 | ATassign initializer 1690 { $$ = $2 ->set_maybeConstructed( false ); }1690 { $$ = $2; } 1691 1691 ; 1692 1692 -
src/ResolvExpr/Resolver.cc
rd63eeb0 rbd85400 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Resolver.cc -- 7 // Resolver.cc -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 12:17:01 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Thu Jan 14 16:45:32 201613 // Update Count : 20311 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Jul 24 17:33:54 2015 13 // Update Count : 178 14 14 // 15 15 … … 33 33 public: 34 34 Resolver() : SymTab::Indexer( false ), switchType( 0 ) {} 35 35 36 36 virtual void visit( FunctionDecl *functionDecl ); 37 37 virtual void visit( ObjectDecl *functionDecl ); … … 54 54 virtual void visit( SingleInit *singleInit ); 55 55 virtual void visit( ListInit *listInit ); 56 virtual void visit( ConstructorInit *ctorInit );57 56 private: 58 57 typedef std::list< Initializer * >::iterator InitIterator; … … 60 59 void resolveAggrInit( AggregateDecl *, InitIterator &, InitIterator & ); 61 60 void resolveSingleAggrInit( Declaration *, InitIterator &, InitIterator & ); 62 void fallbackInit( ConstructorInit * ctorInit );63 61 64 62 std::list< Type * > functionReturn; … … 97 95 return newExpr; 98 96 } 99 97 100 98 Expression *findSingleExpression( Expression *untyped, const SymTab::Indexer &indexer ) { 101 99 TypeEnvironment env; … … 128 126 } // if 129 127 } 130 128 131 129 Expression *findIntegralExpression( Expression *untyped, const SymTab::Indexer &indexer ) { 132 130 TypeEnvironment env; … … 161 159 return newExpr; 162 160 } 163 164 } 165 161 162 } 163 166 164 void Resolver::visit( ObjectDecl *objectDecl ) { 167 165 Type *new_type = resolveTypeof( objectDecl->get_type(), *this ); … … 253 251 forStmt->set_condition( newExpr ); 254 252 } // if 255 253 256 254 if ( forStmt->get_increment() ) { 257 255 Expression * newExpr = findVoidExpression( forStmt->get_increment(), *this ); … … 267 265 delete switchStmt->get_condition(); 268 266 switchStmt->set_condition( newExpr ); 269 267 270 268 visitor.Visitor::visit( switchStmt ); 271 269 } … … 309 307 bool isCharType( T t ) { 310 308 if ( BasicType * bt = dynamic_cast< BasicType * >( t ) ) { 311 return bt->get_kind() == BasicType::Char || bt->get_kind() == BasicType::SignedChar || 309 return bt->get_kind() == BasicType::Char || bt->get_kind() == BasicType::SignedChar || 312 310 bt->get_kind() == BasicType::UnsignedChar; 313 311 } … … 321 319 string n = ne->get_name(); 322 320 if (n == "0") { 323 initContext = new BasicType(Type::Qualifiers(), 321 initContext = new BasicType(Type::Qualifiers(), 324 322 BasicType::SignedInt); 325 323 } else { … … 327 325 initContext = decl->get_type(); 328 326 } 329 } else if (ConstantExpr * e = 327 } else if (ConstantExpr * e = 330 328 dynamic_cast<ConstantExpr*>(singleInit->get_value())) { 331 329 Constant *c = e->get_constant(); … … 351 349 singleInit->set_value( ce->get_arg() ); 352 350 ce->set_arg( NULL ); 353 delete ce; 351 delete ce; 354 352 } 355 353 } … … 467 465 #endif 468 466 } 469 470 // ConstructorInit - fall back on C-style initializer471 void Resolver::fallbackInit( ConstructorInit * ctorInit ) {472 // could not find valid constructor, or found an intrinsic constructor473 // fall back on C-style initializer474 delete ctorInit->get_ctor();475 ctorInit->set_ctor( NULL );476 maybeAccept( ctorInit->get_init(), *this );477 }478 479 void Resolver::visit( ConstructorInit *ctorInit ) {480 TypeEnvironment env;481 AlternativeFinder finder( *this, env );482 finder.find( ctorInit->get_ctor() );483 484 if ( finder.get_alternatives().size() == 0 ) {485 fallbackInit( ctorInit );486 } else if ( finder.get_alternatives().size() == 1 ) {487 Alternative &choice = finder.get_alternatives().front();488 if ( ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * >( choice.expr ) ) {489 if ( VariableExpr * function = dynamic_cast< VariableExpr * > ( appExpr->get_function() ) ) {490 if ( function->get_var()->get_linkage() == LinkageSpec::Intrinsic ) {491 // if the constructor that was found is intrinsic, reset to C-style492 // initializer so that code generation is easy to handle493 fallbackInit( ctorInit );494 return;495 }496 }497 }498 // found a constructor - can get rid of C-style initializer499 Expression *newExpr = choice.expr->clone();500 finishExpr( newExpr, choice.env );501 ctorInit->set_ctor( newExpr );502 delete ctorInit->get_init();503 ctorInit->set_init( NULL );504 } else {505 // too many constructors found506 assert(false);507 }508 }509 467 } // namespace ResolvExpr 510 468 -
src/SymTab/Validate.cc
rd63eeb0 rbd85400 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 21:50:04 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Tue Feb 09 13:21:56201613 // Update Count : 2 7011 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Jan 27 22:03:12 2016 13 // Update Count : 225 14 14 // 15 15 … … 202 202 }; 203 203 204 class VerifyCtorDtor : public Visitor {205 public:206 /// ensure that constructors and destructors have at least one207 /// parameter, the first of which must be a pointer, and no208 /// return values.209 static void verify( std::list< Declaration * > &translationUnit );210 211 // VerifyCtorDtor() {}212 213 virtual void visit( FunctionDecl *funcDecl );214 private:215 };216 217 204 void validate( std::list< Declaration * > &translationUnit, bool doDebug ) { 218 205 Pass1 pass1; … … 226 213 AutogenerateRoutines::autogenerateRoutines( translationUnit ); 227 214 acceptAll( translationUnit, pass3 ); 228 VerifyCtorDtor::verify( translationUnit );229 215 } 230 216 … … 759 745 makeUnionFieldsAssignment( srcParam, dstParam, cloneWithParams( refType, unionParams ), back_inserter( assignDecl->get_statements()->get_kids() ) ); 760 746 if ( isGeneric ) makeUnionFieldsAssignment( srcParam, returnVal, cloneWithParams( refType, unionParams ), back_inserter( assignDecl->get_statements()->get_kids() ) ); 761 747 762 748 if ( ! isGeneric ) assignDecl->get_statements()->get_kids().push_back( new ReturnStmt( noLabels, new VariableExpr( srcParam ) ) ); 763 749 … … 1056 1042 } 1057 1043 1058 void VerifyCtorDtor::verify( std::list< Declaration * > & translationUnit ) {1059 VerifyCtorDtor verifier;1060 acceptAll( translationUnit, verifier );1061 }1062 1063 void VerifyCtorDtor::visit( FunctionDecl * funcDecl ) {1064 FunctionType * funcType = funcDecl->get_functionType();1065 std::list< DeclarationWithType * > &returnVals = funcType->get_returnVals();1066 std::list< DeclarationWithType * > ¶ms = funcType->get_parameters();1067 1068 if ( funcDecl->get_name() == "?{}" || funcDecl->get_name() == "^?{}" ) {1069 if ( params.size() == 0 ) {1070 throw SemanticError( "Constructors and destructors require at least one parameter ", funcDecl );1071 }1072 if ( ! dynamic_cast< PointerType * >( params.front()->get_type() ) ) {1073 throw SemanticError( "First parameter of a constructor or destructor must be a pointer ", funcDecl );1074 }1075 if ( returnVals.size() != 0 ) {1076 throw SemanticError( "Constructors and destructors cannot have explicit return values ", funcDecl );1077 }1078 }1079 1080 Visitor::visit( funcDecl );1081 // original idea: modify signature of ctor/dtors and insert appropriate return statements1082 // to cause desired behaviour1083 // new idea: add comma exprs to every ctor call to produce first parameter.1084 // this requires some memoization of the first parameter, because it can be a1085 // complicated expression with side effects (see: malloc). idea: add temporary variable1086 // that is assigned address of constructed object in ctor argument position and1087 // return the temporary. It should also be done after all implicit ctors are1088 // added, so not in this pass!1089 }1090 1044 } // namespace SymTab 1091 1045 -
src/SynTree/Declaration.h
rd63eeb0 rbd85400 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Declaration.h -- 7 // Declaration.h -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Jan 13 16:11:49 201613 // Update Count : 3 612 // Last Modified On : Wed Dec 09 14:08:22 2015 13 // Update Count : 32 14 14 // 15 15 -
src/SynTree/Initializer.cc
rd63eeb0 rbd85400 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Initializer.cc -- 7 // Initializer.cc -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed Jan 13 15:31:45 201613 // Update Count : 2812 // Last Modified On : Wed Aug 12 14:05:25 2015 13 // Update Count : 14 14 14 // 15 15 … … 18 18 #include "Common/utility.h" 19 19 20 Initializer::Initializer( bool maybeConstructed ) : maybeConstructed( maybeConstructed) {}20 Initializer::Initializer() {} 21 21 22 22 Initializer::~Initializer() {} … … 31 31 void Initializer::print( std::ostream &os, int indent ) {} 32 32 33 SingleInit::SingleInit( Expression *v, std::list< Expression *> &_designators , bool maybeConstructed ) : Initializer( maybeConstructed ), value ( v ), designators( _designators ) {33 SingleInit::SingleInit( Expression *v, std::list< Expression *> &_designators ) : value ( v ), designators( _designators ) { 34 34 } 35 35 36 SingleInit::SingleInit( const SingleInit &other ) : Initializer(other),value ( other.value ) {36 SingleInit::SingleInit( const SingleInit &other ) : value ( other.value ) { 37 37 cloneAll(other.designators, designators ); 38 38 } … … 54 54 } 55 55 56 ListInit::ListInit( std::list<Initializer*> &_initializers, std::list<Expression *> &_designators , bool maybeConstructed)57 : Initializer( maybeConstructed),initializers( _initializers ), designators( _designators ) {56 ListInit::ListInit( std::list<Initializer*> &_initializers, std::list<Expression *> &_designators ) 57 : initializers( _initializers ), designators( _designators ) { 58 58 } 59 59 … … 65 65 66 66 void ListInit::print( std::ostream &os, int indent ) { 67 os << std::endl << std::string(indent, ' ') << "Compound initializer: "; 67 os << std::endl << std::string(indent, ' ') << "Compound initializer: "; 68 68 if ( ! designators.empty() ) { 69 69 os << std::string(indent + 2, ' ' ) << "designated by: ["; 70 70 for ( std::list < Expression * >::iterator i = designators.begin(); 71 71 i != designators.end(); i++ ) { 72 ( *i )->print(os, indent + 4 ); 72 ( *i )->print(os, indent + 4 ); 73 73 } // for 74 74 75 75 os << std::string(indent + 2, ' ' ) << "]"; 76 76 } // if 77 77 78 for ( std::list<Initializer *>::iterator i = initializers.begin(); i != initializers.end(); i++ ) 78 for ( std::list<Initializer *>::iterator i = initializers.begin(); i != initializers.end(); i++ ) 79 79 (*i)->print( os, indent + 2 ); 80 80 } 81 82 83 ConstructorInit::ConstructorInit( Expression * ctor, Initializer * init ) : Initializer( true ), ctor( ctor ), init( init ) {}84 ConstructorInit::~ConstructorInit() {85 delete ctor;86 delete init;87 }88 89 ConstructorInit *ConstructorInit::clone() const {90 return new ConstructorInit( *this );91 }92 93 void ConstructorInit::print( std::ostream &os, int indent ) {94 os << std::endl << std::string(indent, ' ') << "Constructor initializer: ";95 if ( ctor ) {96 os << " initially constructed with ";97 ctor->print( os, indent+2 );98 } // if99 100 if ( init ) {101 os << " with fallback C-style initializer: ";102 init->print( os, indent+2 );103 }104 }105 106 107 81 // Local Variables: // 108 82 // tab-width: 4 // -
src/SynTree/Initializer.h
rd63eeb0 rbd85400 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Initializer.h -- 7 // Initializer.h -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Tue Feb 09 14:40:15 201613 // Update Count : 1 911 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon May 18 09:03:48 2015 13 // Update Count : 1 14 14 // 15 15 … … 27 27 public: 28 28 // Initializer( std::string _name = std::string(""), int _pos = 0 ); 29 Initializer( bool maybeConstructed);29 Initializer( ); 30 30 virtual ~Initializer(); 31 31 … … 43 43 } 44 44 45 bool get_maybeConstructed() { return maybeConstructed; }46 47 45 virtual Initializer *clone() const = 0; 48 46 virtual void accept( Visitor &v ) = 0; … … 52 50 // std::string name; 53 51 // int pos; 54 bool maybeConstructed;55 52 }; 56 53 … … 58 55 class SingleInit : public Initializer { 59 56 public: 60 SingleInit( Expression *value, std::list< Expression *> &designators , bool maybeConstructed = false);57 SingleInit( Expression *value, std::list< Expression *> &designators = *(new std::list<Expression *>()) ); 61 58 SingleInit( const SingleInit &other ); 62 59 virtual ~SingleInit(); 63 60 64 61 Expression *get_value() { return value; } 65 62 void set_value( Expression *newValue ) { value = newValue; } … … 82 79 class ListInit : public Initializer { 83 80 public: 84 ListInit( std::list<Initializer*> &, 85 std::list<Expression *> &designators , bool maybeConstructed = false);81 ListInit( std::list<Initializer*> &, 82 std::list<Expression *> &designators = *(new std::list<Expression *>()) ); 86 83 virtual ~ListInit(); 87 84 … … 103 100 }; 104 101 105 // ConstructorInit represents an initializer that is either a constructor expression or106 // a C-style initializer.107 class ConstructorInit : public Initializer {108 public:109 ConstructorInit( Expression * ctor, Initializer * init );110 virtual ~ConstructorInit();111 112 void set_ctor( Expression * newValue ) { ctor = newValue; }113 Expression * get_ctor() const { return ctor; }114 void set_init( Initializer * newValue ) { init = newValue; }115 Initializer * get_init() const { return init; }116 117 virtual ConstructorInit *clone() const;118 virtual void accept( Visitor &v ) { v.visit( this ); }119 virtual Initializer *acceptMutator( Mutator &m ) { return m.mutate( this ); }120 virtual void print( std::ostream &os, int indent = 0 );121 122 private:123 Expression * ctor;124 // C-style initializer made up of SingleInit and ListInit nodes to use as a fallback125 // if an appropriate constructor definition is not found by the resolver126 Initializer * init;127 };128 129 102 #endif // INITIALIZER_H 130 103 -
src/SynTree/Mutator.cc
rd63eeb0 rbd85400 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Mutator.cc -- 7 // Mutator.cc -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Wed Jan 13 15:32:29 201613 // Update Count : 1 511 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sat Jul 25 19:21:33 2015 13 // Update Count : 11 14 14 // 15 15 … … 432 432 } 433 433 434 Initializer *Mutator::mutate( ConstructorInit *ctorInit ) {435 ctorInit->set_ctor( maybeMutate( ctorInit->get_ctor(), *this ) );436 ctorInit->set_init( maybeMutate( ctorInit->get_init(), *this ) );437 return ctorInit;438 }439 440 434 Subrange *Mutator::mutate( Subrange *subrange ) { 441 435 return subrange; -
src/SynTree/Mutator.h
rd63eeb0 rbd85400 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Mutator.h -- 7 // Mutator.h -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Wed Jan 13 15:24:26 201613 // Update Count : 911 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Nov 19 22:26:16 2015 13 // Update Count : 8 14 14 // 15 15 #include <cassert> … … 62 62 virtual Expression* mutate( MemberExpr *memberExpr ); 63 63 virtual Expression* mutate( VariableExpr *variableExpr ); 64 virtual Expression* mutate( ConstantExpr *constantExpr ); 64 virtual Expression* mutate( ConstantExpr *constantExpr ); 65 65 virtual Expression* mutate( SizeofExpr *sizeofExpr ); 66 66 virtual Expression* mutate( AlignofExpr *alignofExpr ); … … 93 93 virtual Initializer* mutate( SingleInit *singleInit ); 94 94 virtual Initializer* mutate( ListInit *listInit ); 95 virtual Initializer* mutate( ConstructorInit *ctorInit );96 95 97 96 virtual Subrange *mutate( Subrange *subrange ); -
src/SynTree/ObjectDecl.cc
rd63eeb0 rbd85400 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // ObjectDecl.cc -- 7 // ObjectDecl.cc -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Tue Feb 09 13:21:03 201613 // Update Count : 3012 // Last Modified On : Tue Sep 29 14:13:01 2015 13 // Update Count : 18 14 14 // 15 15 … … 19 19 #include "Expression.h" 20 20 #include "Common/utility.h" 21 #include "Statement.h"22 21 23 22 ObjectDecl::ObjectDecl( const std::string &name, DeclarationNode::StorageClass sc, LinkageSpec::Type linkage, Expression *bitfieldWidth, Type *type, Initializer *init, bool isInline, bool isNoreturn ) … … 59 58 os << " with initializer "; 60 59 init->print( os, indent ); 61 os << std::string(indent, ' ') << "maybeConstructed? " << init->get_maybeConstructed();62 60 } // if 63 61 … … 71 69 #if 0 72 70 if ( get_mangleName() != "") { 73 os << get_mangleName() << ": "; 74 } else 71 os << get_mangleName() << ": "; 72 } else 75 73 #endif 76 74 if ( get_name() != "" ) { -
src/SynTree/SynTree.h
rd63eeb0 rbd85400 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // SynTree.h -- 7 // SynTree.h -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Wed Jan 13 15:28:41 201613 // Update Count : 411 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Jul 23 23:25:04 2015 13 // Update Count : 3 14 14 // 15 15 … … 101 101 class SingleInit; 102 102 class ListInit; 103 class ConstructorInit;104 103 105 104 class Subrange; -
src/SynTree/Visitor.cc
rd63eeb0 rbd85400 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Visitor.cc -- 7 // Visitor.cc -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Wed Jan 13 15:27:23 201613 // Update Count : 1 811 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Jul 24 16:11:05 2015 13 // Update Count : 15 14 14 // 15 15 … … 364 364 } 365 365 366 void Visitor::visit( ConstructorInit *ctorInit ) {367 maybeAccept( ctorInit->get_ctor(), *this );368 maybeAccept( ctorInit->get_init(), *this );369 }370 371 366 void Visitor::visit( Subrange *subrange ) {} 372 367 -
src/SynTree/Visitor.h
rd63eeb0 rbd85400 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Visitor.h -- 7 // Visitor.h -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Tue Feb 09 13:20:48201613 // Update Count : 611 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Jan 25 21:20:44 2016 13 // Update Count : 5 14 14 // 15 15 … … 62 62 virtual void visit( MemberExpr *memberExpr ); 63 63 virtual void visit( VariableExpr *variableExpr ); 64 virtual void visit( ConstantExpr *constantExpr ); 64 virtual void visit( ConstantExpr *constantExpr ); 65 65 virtual void visit( SizeofExpr *sizeofExpr ); 66 66 virtual void visit( AlignofExpr *alignofExpr ); … … 93 93 virtual void visit( SingleInit *singleInit ); 94 94 virtual void visit( ListInit *listInit ); 95 virtual void visit( ConstructorInit *ctorInit );96 95 97 96 virtual void visit( Subrange *subrange ); -
src/initialization.txt
rd63eeb0 rbd85400 34 34 sure that resolved initializers for all declarations are being 35 35 generated. 36 37 38 ------39 40 More recent email: (I am quoted; Richard is the responder)41 > As far as I'm aware, the only way that I could currently get the correct42 > results from the unification engine is by feeding it an expression that43 > looks like "?=?( ((struct Y)x.y).a, 10 )", then picking out the pieces that44 > I need (namely the correct choice for a). Does this seem like a reasonable45 > approach to solve this problem?46 47 No, unfortunately. Initialization isn't being rewritten as assignment,48 so you shouldn't allow the particular selection of assignment49 operators that happen to be in scope (and which may include50 user-defined operators) to guide the type resolution.51 52 I don't think there is any way to rewrite an initializer as a single53 expression and have the resolver just do the right thing. I see the54 algorithm as:55 56 For each alternative interpretation of the designator:57 Construct an expression that casts the initializer to the type of58 the designator59 Construct an AlternativeFinder and use it to find the lowest cost60 interpretation of the expression61 Add this interpretation to a list of possibilities62 Go through the list of possibilities and pick the lowest cost63 64 As with many things in the resolver, it's conceptually simple but the65 implementation may be a bit of a pain. It fits in with functions like66 findSingleExpression, findIntegralExpression in Resolver.cc, although67 it will be significantly more complicated than any of the existing68 ones.69 70 71 -
src/libcfa/Makefile.am
rd63eeb0 rbd85400 6 6 ## file "LICENCE" distributed with Cforall. 7 7 ## 8 ## Makefile.am -- 8 ## Makefile.am -- 9 9 ## 10 10 ## Author : Peter A. Buhr … … 51 51 52 52 CFLAGS = -g -Wall -Wno-unused-function -B${abs_top_srcdir}/src/driver -XCFA -t # TEMPORARY: does not build with -O2 53 CC = ${abs_top_srcdir}/src/driver/cfa 53 CC = ${abs_top_srcdir}/src/driver/cfa 54 54 55 55 # extension-less header files are overridden by default make rules => explicitly override rule … … 60 60 ${CC} ${CFLAGS} -c -o $@ $< 61 61 62 libs = # stdlib iostream fstream iterator # temporarily getting rid of these until ctor/dtor autogen works62 libs = stdlib iostream fstream iterator 63 63 libcfa_a_SOURCES = libcfa-prelude.c ${libs:=.c} 64 64 -
src/libcfa/Makefile.in
rd63eeb0 rbd85400 83 83 libcfa_a_AR = $(AR) $(ARFLAGS) 84 84 libcfa_a_LIBADD = 85 am__objects_1 = 85 am__objects_1 = stdlib.$(OBJEXT) iostream.$(OBJEXT) fstream.$(OBJEXT) \ 86 iterator.$(OBJEXT) 86 87 am_libcfa_a_OBJECTS = libcfa-prelude.$(OBJEXT) $(am__objects_1) 87 88 libcfa_a_OBJECTS = $(am_libcfa_a_OBJECTS) … … 109 110 AWK = @AWK@ 110 111 BACKEND_CC = @BACKEND_CC@ 111 CC = ${abs_top_srcdir}/src/driver/cfa 112 CC = ${abs_top_srcdir}/src/driver/cfa 112 113 CCDEPMODE = @CCDEPMODE@ 113 114 CFA_BINDIR = @CFA_BINDIR@ … … 212 213 MAINTAINERCLEANFILES = ${addprefix ${libdir}/,${cfalib_DATA}} \ 213 214 ${addprefix ${libdir}/,${lib_LIBRARIES}} ${includedir}/* 214 libs = # stdlib iostream fstream iterator # temporarily getting rid of these until ctor/dtor autogen works215 libs = stdlib iostream fstream iterator 215 216 libcfa_a_SOURCES = libcfa-prelude.c ${libs:=.c} 216 217 cheaders = bfd bfdlink demangle dialog evdns evhttp evrpc expat fcntl form gcrypt math … … 292 293 -rm -f *.tab.c 293 294 295 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fstream.Po@am__quote@ 296 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iostream.Po@am__quote@ 297 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iterator.Po@am__quote@ 294 298 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa-prelude.Po@am__quote@ 299 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stdlib.Po@am__quote@ 295 300 296 301 .c.obj: -
src/libcfa/prelude.cf
rd63eeb0 rbd85400 1 // -*- Mode: C -*- 2 // 1 // -*- Mode: C -*- 2 // 3 3 // Copyright (C) Glen Ditchfield 1994, 1999 4 // 4 // 5 5 // prelude.cf -- Standard Cforall Preample for C99 6 // 6 // 7 7 // Author : Glen Ditchfield 8 8 // Created On : Sat Nov 29 07:23:41 2014 … … 116 116 forall( ftype FT ) lvalue FT *?( FT * ); 117 117 118 _Bool +?( _Bool ), -?( _Bool ), ~?( _Bool ); 119 signed int +?( signed int ), -?( signed int ), ~?( signed int ); 120 unsigned int +?( unsigned int ), -?( unsigned int ), ~?( unsigned int ); 121 signed long int +?( signed long int ), -?( signed long int ), ~?( signed long int ); 122 unsigned long int +?( unsigned long int ), -?( unsigned long int ), ~?( unsigned long int ); 123 signed long long int +?( signed long long int ), -?( signed long long int ), ~?( signed long long int ); 124 unsigned long long int +?( unsigned long long int ), -?( unsigned long long int ), ~?( unsigned long long int ); 118 _Bool +?( _Bool ), -?( _Bool ), ~?( _Bool ); 119 signed int +?( signed int ), -?( signed int ), ~?( signed int ); 120 unsigned int +?( unsigned int ), -?( unsigned int ), ~?( unsigned int ); 121 signed long int +?( signed long int ), -?( signed long int ), ~?( signed long int ); 122 unsigned long int +?( unsigned long int ), -?( unsigned long int ), ~?( unsigned long int ); 123 signed long long int +?( signed long long int ), -?( signed long long int ), ~?( signed long long int ); 124 unsigned long long int +?( unsigned long long int ), -?( unsigned long long int ), ~?( unsigned long long int ); 125 125 float +?( float ), -?( float ); 126 126 double +?( double ), -?( double ); … … 626 626 ?+=?( long double _Complex *, long double _Complex ), ?+=?( volatile long double _Complex *, long double _Complex ), 627 627 ?-=?( long double _Complex *, long double _Complex ), ?-=?( volatile long double _Complex *, long double _Complex ); 628 629 630 631 632 633 // ------------------------------------------------------------634 //635 // Section ??? Constructors and Destructors636 //637 // ------------------------------------------------------------638 639 // default ctor640 void ?{}( _Bool * ), ?{}( volatile _Bool * );641 void ?{}( unsigned char * ), ?{}( volatile unsigned char * );642 void ?{}( signed int * ), ?{}( volatile signed int * );643 void ?{}( unsigned int * ), ?{}( volatile unsigned int * );644 void ?{}( signed long int * ), ?{}( volatile signed long int * );645 void ?{}( unsigned long int * ), ?{}( volatile unsigned long int * );646 void ?{}( signed long long int * ), ?{}( volatile signed long long int * );647 void ?{}( unsigned long long int * ), ?{}( volatile unsigned long long int * );648 void ?{}( float * ), ?{}( volatile float * );649 void ?{}( double * ), ?{}( volatile double * );650 void ?{}( long double * ), ?{}( volatile long double * );651 void ?{}( float _Complex * ), ?{}( volatile float _Complex * );652 void ?{}( double _Complex * ), ?{}( volatile double _Complex * );653 void ?{}( long double _Complex * ), ?{}( volatile long double _Complex * );654 655 // copy ctor656 void ?{}( _Bool *, _Bool ), ?{}( volatile _Bool *, _Bool );657 void ?{}( unsigned char *, unsigned char ), ?{}( volatile unsigned char *, unsigned char );658 void ?{}( signed int *, signed int), ?{}( volatile signed int *, signed int );659 void ?{}( unsigned int *, unsigned int), ?{}( volatile unsigned int *, unsigned int );660 void ?{}( signed long int *, signed long int), ?{}( volatile signed long int *, signed long int );661 void ?{}( unsigned long int *, unsigned long int), ?{}( volatile unsigned long int *, unsigned long int );662 void ?{}( signed long long int *, signed long long int), ?{}( volatile signed long long int *, signed long long int );663 void ?{}( unsigned long long int *, unsigned long long int), ?{}( volatile unsigned long long int *, unsigned long long int );664 void ?{}( float *, float), ?{}( volatile float *, float );665 void ?{}( double *, double), ?{}( volatile double *, double );666 void ?{}( long double *, long double), ?{}( volatile long double *, long double );667 void ?{}( float _Complex *, float _Complex), ?{}( volatile float _Complex *, float _Complex );668 void ?{}( double _Complex *, double _Complex), ?{}( volatile double _Complex *, double _Complex );669 void ?{}( long double _Complex *, long double _Complex), ?{}( volatile long double _Complex *, long double _Complex );670 671 // dtor672 void ^?{}( _Bool * ), ^?{}( volatile _Bool * );673 void ^?{}( signed int * ), ^?{}( volatile signed int * );674 void ^?{}( unsigned int * ), ^?{}( volatile unsigned int * );675 void ^?{}( signed long int * ), ^?{}( volatile signed long int * );676 void ^?{}( unsigned long int * ), ^?{}( volatile unsigned long int * );677 void ^?{}( signed long long int * ), ^?{}( volatile signed long long int * );678 void ^?{}( unsigned long long int * ), ^?{}( volatile unsigned long long int * );679 void ^?{}( float * ), ^?{}( volatile float * );680 void ^?{}( double * ), ^?{}( volatile double * );681 void ^?{}( long double * ), ^?{}( volatile long double * );682 void ^?{}( float _Complex * ), ^?{}( volatile float _Complex * );683 void ^?{}( double _Complex * ), ^?{}( volatile double _Complex * );684 void ^?{}( long double _Complex * ), ^?{}( volatile long double _Complex * );685 686 // // default ctor687 // forall( dtype DT ) void ?{}( DT ** );688 // forall( dtype DT ) void ?{}( const DT ** );689 // forall( dtype DT ) void ?{}( volatile DT ** );690 // forall( dtype DT ) void ?{}( const volatile DT ** );691 692 // // copy ctor693 // forall( dtype DT ) void ?{}( DT **, DT* );694 // forall( dtype DT ) void ?{}( const DT **, DT* );695 // forall( dtype DT ) void ?{}( volatile DT **, DT* );696 // forall( dtype DT ) void ?{}( const volatile DT **, DT* );697 698 // // dtor699 // forall( dtype DT ) void ^?{}( DT ** );700 // forall( dtype DT ) void ^?{}( const DT ** );701 // forall( dtype DT ) void ^?{}( volatile DT ** );702 // forall( dtype DT ) void ^?{}( const volatile DT ** );703 704 // copied from assignment section705 // copy constructors706 forall( ftype FT ) void ?{}( FT **, FT * );707 forall( ftype FT ) void ?{}( FT * volatile *, FT * );708 709 forall( dtype DT ) void ?{}( DT * *, DT * );710 forall( dtype DT ) void ?{}( DT * volatile *, DT * );711 forall( dtype DT ) void ?{}( const DT * *, DT * );712 forall( dtype DT ) void ?{}( const DT * volatile *, DT * );713 forall( dtype DT ) void ?{}( const DT * *, const DT * );714 forall( dtype DT ) void ?{}( const DT * volatile *, const DT * );715 forall( dtype DT ) void ?{}( volatile DT * *, DT * );716 forall( dtype DT ) void ?{}( volatile DT * volatile *, DT * );717 forall( dtype DT ) void ?{}( volatile DT * *, volatile DT * );718 forall( dtype DT ) void ?{}( volatile DT * volatile *, volatile DT * );719 720 forall( dtype DT ) void ?{}( const volatile DT * *, DT * );721 forall( dtype DT ) void ?{}( const volatile DT * volatile *, DT * );722 forall( dtype DT ) void ?{}( const volatile DT * *, const DT * );723 forall( dtype DT ) void ?{}( const volatile DT * volatile *, const DT * );724 forall( dtype DT ) void ?{}( const volatile DT * *, volatile DT * );725 forall( dtype DT ) void ?{}( const volatile DT * volatile *, volatile DT * );726 forall( dtype DT ) void ?{}( const volatile DT * *, const volatile DT * );727 forall( dtype DT ) void ?{}( const volatile DT * volatile *, const volatile DT * );728 729 forall( dtype DT ) void ?{}( DT * *, void * );730 forall( dtype DT ) void ?{}( DT * volatile *, void * );731 forall( dtype DT ) void ?{}( const DT * *, void * );732 forall( dtype DT ) void ?{}( const DT * volatile *, void * );733 forall( dtype DT ) void ?{}( const DT * *, const void * );734 forall( dtype DT ) void ?{}( const DT * volatile *, const void * );735 forall( dtype DT ) void ?{}( volatile DT * *, void * );736 forall( dtype DT ) void ?{}( volatile DT * volatile *, void * );737 forall( dtype DT ) void ?{}( volatile DT * *, volatile void * );738 forall( dtype DT ) void ?{}( volatile DT * volatile *, volatile void * );739 740 forall( dtype DT ) void ?{}( const volatile DT * *, void * );741 forall( dtype DT ) void ?{}( const volatile DT * volatile *, void * );742 forall( dtype DT ) void ?{}( const volatile DT * *, const void * );743 forall( dtype DT ) void ?{}( const volatile DT * volatile *, const void * );744 forall( dtype DT ) void ?{}( const volatile DT * *, volatile void * );745 forall( dtype DT ) void ?{}( const volatile DT * volatile *, volatile void * );746 forall( dtype DT ) void ?{}( const volatile DT * *, const volatile void * );747 forall( dtype DT ) void ?{}( const volatile DT * volatile *, const volatile void * );748 749 forall( dtype DT ) void ?{}( void * *, DT * );750 forall( dtype DT ) void ?{}( void * volatile *, DT * );751 forall( dtype DT ) void ?{}( const void * *, DT * );752 forall( dtype DT ) void ?{}( const void * volatile *, DT * );753 forall( dtype DT ) void ?{}( const void * *, const DT * );754 forall( dtype DT ) void ?{}( const void * volatile *, const DT * );755 forall( dtype DT ) void ?{}( volatile void * *, DT * );756 forall( dtype DT ) void ?{}( volatile void * volatile *, DT * );757 forall( dtype DT ) void ?{}( volatile void * *, volatile DT * );758 forall( dtype DT ) void ?{}( volatile void * volatile *, volatile DT * );759 forall( dtype DT ) void ?{}( const volatile void * *, DT * );760 forall( dtype DT ) void ?{}( const volatile void * volatile *, DT * );761 forall( dtype DT ) void ?{}( const volatile void * *, const DT * );762 forall( dtype DT ) void ?{}( const volatile void * volatile *, const DT * );763 forall( dtype DT ) void ?{}( const volatile void * *, volatile DT * );764 forall( dtype DT ) void ?{}( const volatile void * volatile *, volatile DT * );765 forall( dtype DT ) void ?{}( const volatile void * *, const volatile DT * );766 forall( dtype DT ) void ?{}( const volatile void * volatile *, const volatile DT * );767 768 void ?{}( void * *, void * );769 void ?{}( void * volatile *, void * );770 void ?{}( const void * *, void * );771 void ?{}( const void * volatile *, void * );772 void ?{}( const void * *, const void * );773 void ?{}( const void * volatile *, const void * );774 void ?{}( volatile void * *, void * );775 void ?{}( volatile void * volatile *, void * );776 void ?{}( volatile void * *, volatile void * );777 void ?{}( volatile void * volatile *, volatile void * );778 void ?{}( const volatile void * *, void * );779 void ?{}( const volatile void * volatile *, void * );780 void ?{}( const volatile void * *, const void * );781 void ?{}( const volatile void * volatile *, const void * );782 void ?{}( const volatile void * *, volatile void * );783 void ?{}( const volatile void * volatile *, volatile void * );784 void ?{}( const volatile void * *, const volatile void * );785 void ?{}( const volatile void * volatile *, const volatile void * );786 787 //forall( dtype DT ) void ?{}( DT * *, forall( dtype DT2 ) const DT2 * );788 //forall( dtype DT ) void ?{}( DT * volatile *, forall( dtype DT2 ) const DT2 * );789 forall( dtype DT ) void ?{}( const DT * *, forall( dtype DT2 ) const DT2 * );790 forall( dtype DT ) void ?{}( const DT * volatile *, forall( dtype DT2 ) const DT2 * );791 //forall( dtype DT ) void ?{}( volatile DT * *, forall( dtype DT2 ) const DT2 * );792 //forall( dtype DT ) void ?{}( volatile DT * volatile *, forall( dtype DT2 ) const DT2 * );793 forall( dtype DT ) void ?{}( const volatile DT * *, forall( dtype DT2 ) const DT2 * );794 forall( dtype DT ) void ?{}( const volatile DT * volatile *, forall( dtype DT2 ) const DT2 * );795 796 forall( ftype FT ) void ?{}( FT * *, forall( ftype FT2 ) FT2 * );797 forall( ftype FT ) void ?{}( FT * volatile *, forall( ftype FT2 ) FT2 * );798 799 // default ctors800 forall( ftype FT ) void ?{}( FT * * );801 forall( ftype FT ) void ?{}( FT * volatile * );802 803 forall( dtype DT ) void ?{}( DT * *);804 forall( dtype DT ) void ?{}( DT * volatile *);805 forall( dtype DT ) void ?{}( const DT * *);806 forall( dtype DT ) void ?{}( const DT * volatile *);807 forall( dtype DT ) void ?{}( volatile DT * *);808 forall( dtype DT ) void ?{}( volatile DT * volatile *);809 forall( dtype DT ) void ?{}( const volatile DT * *);810 forall( dtype DT ) void ?{}( const volatile DT * volatile *);811 812 void ?{}( void * *);813 void ?{}( void * volatile *);814 void ?{}( const void * *);815 void ?{}( const void * volatile *);816 void ?{}( volatile void * *);817 void ?{}( volatile void * volatile *);818 void ?{}( const volatile void * *);819 void ?{}( const volatile void * volatile *);820 821 // dtors822 forall( ftype FT ) void ^?{}( FT * * );823 forall( ftype FT ) void ^?{}( FT * volatile * );824 825 forall( dtype DT ) void ^?{}( DT * *);826 forall( dtype DT ) void ^?{}( DT * volatile *);827 forall( dtype DT ) void ^?{}( const DT * *);828 forall( dtype DT ) void ^?{}( const DT * volatile *);829 forall( dtype DT ) void ^?{}( volatile DT * *);830 forall( dtype DT ) void ^?{}( volatile DT * volatile *);831 forall( dtype DT ) void ^?{}( const volatile DT * *);832 forall( dtype DT ) void ^?{}( const volatile DT * volatile *);833 834 void ^?{}( void * *);835 void ^?{}( void * volatile *);836 void ^?{}( const void * *);837 void ^?{}( const void * volatile *);838 void ^?{}( volatile void * *);839 void ^?{}( volatile void * volatile *);840 void ^?{}( const volatile void * *);841 void ^?{}( const volatile void * volatile *); -
src/main.cc
rd63eeb0 rbd85400 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // main.cc -- 7 // main.cc -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Fri May 15 23:12:02 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Tue Feb 09 13:28:11201613 // Update Count : 20011 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Jan 27 22:20:20 2016 13 // Update Count : 199 14 14 // 15 15 … … 41 41 #include "InitTweak/Mutate.h" 42 42 #include "InitTweak/RemoveInit.h" 43 #include "InitTweak/FixInit.h"44 43 //#include "Explain/GenProlog.h" 45 44 //#include "Try/Visit.h" … … 61 60 astp = false, 62 61 bresolvep = false, 63 ctorinitp = false,64 62 exprp = false, 65 63 expraltp = false, … … 76 74 codegenp = false; 77 75 78 enum { Ast, Bresolver, CtorInitFix,Expr, ExprAlt, Grammar, LibCFA, Nopreamble, Parse, Prototypes, Resolver, Symbol, Tree, Validate, };76 enum { Ast, Bresolver, Expr, ExprAlt, Grammar, LibCFA, Nopreamble, Parse, Prototypes, Resolver, Symbol, Tree, Validate, }; 79 77 80 78 static struct option long_opts[] = { 81 79 { "ast", no_argument, 0, Ast }, 82 80 { "before-resolver", no_argument, 0, Bresolver }, 83 { "ctorinitfix", no_argument, 0, CtorInitFix },84 81 { "expr", no_argument, 0, Expr }, 85 82 { "expralt", no_argument, 0, ExprAlt }, … … 103 100 104 101 opterr = 0; // prevent getopt from printing error messages 105 102 106 103 int c; 107 while ( (c = getopt_long( argc, argv, "ab cefFglnpqrstvyzD:", long_opts, &long_index )) != -1 ) {104 while ( (c = getopt_long( argc, argv, "abefglnpqrstvyzD:", long_opts, &long_index )) != -1 ) { 108 105 switch ( c ) { 109 106 case Ast: … … 114 111 case 'b': // print before resolver steps 115 112 bresolvep = true; 116 break;117 case CtorInitFix:118 case 'c':119 ctorinitp = true;120 113 break; 121 114 case Expr: … … 194 187 output = new ofstream( argv[ optind ] ); 195 188 } // if 196 189 197 190 Parser::get_parser().set_debug( grammarp ); 198 191 … … 215 208 exit( 1 ); 216 209 } // if 217 210 218 211 parse( prelude, LinkageSpec::Intrinsic ); 219 212 } // if 220 213 } // if 221 214 222 parse( input, libcfap ? LinkageSpec::Intrinsic : LinkageSpec::Cforall, grammarp ); 223 215 parse( input, libcfap ? LinkageSpec::Intrinsic : LinkageSpec::Cforall, grammarp ); 216 224 217 if ( parsep ) { 225 218 Parser::get_parser().get_parseTree()->printList( std::cout ); … … 256 249 OPTPRINT( "mutate" ) 257 250 ControlStruct::mutate( translationUnit ); 258 OPTPRINT( "fixNames" ) 251 OPTPRINT( "fixNames" ) 259 252 CodeGen::fixNames( translationUnit ); 260 OPTPRINT( "tweak Init" )253 OPTPRINT( "tweak" ) 261 254 InitTweak::tweak( translationUnit ); 262 255 … … 275 268 if ( exprp ) { 276 269 dump( translationUnit ); 277 return 0;278 }279 280 OPTPRINT( "fixInit" )281 // fix ObjectDecl - replaces ConstructorInit nodes282 InitTweak::fix( translationUnit );283 if ( ctorinitp ) {284 dump ( translationUnit );285 return 0;286 270 } 287 271 … … 294 278 OPTPRINT( "box" ) 295 279 GenPoly::box( translationUnit ); 296 280 297 281 // print tree right before code generation 298 282 if ( codegenp ) { … … 350 334 std::list< Declaration * > decls; 351 335 if ( noprotop ) { 352 filter( translationUnit.begin(), translationUnit.end(), 336 filter( translationUnit.begin(), translationUnit.end(), 353 337 std::back_inserter( decls ), notPrelude ); 354 338 } else {
Note:
See TracChangeset
for help on using the changeset viewer.