- Timestamp:
- Apr 30, 2024, 12:08:46 PM (7 months ago)
- Branches:
- master
- Children:
- 35897fb
- Parents:
- caaf424 (diff), 0153dbd (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- src
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/CandidateFinder.cpp
rcaaf424 r69867ad9 906 906 } 907 907 CandidateRef & choice = winners.front(); 908 choice->cost.inc Var();908 choice->cost.incSafe(); 909 909 candidates.emplace_back( std::move(choice) ); 910 910 } … … 1376 1376 ast::Expr * newExpr = data.combine( nameExpr->location, cost ); 1377 1377 1378 bool bentConversion = false; 1379 if ( auto inst = newExpr->result.as<ast::EnumInstType>() ) { 1380 if ( inst->base && inst->base->base ) { 1381 bentConversion = true; 1382 } 1383 } 1384 1378 // bool bentConversion = false; 1379 // if ( auto inst = newExpr->result.as<ast::EnumInstType>() ) { 1380 // if ( inst->base && inst->base->base ) { 1381 // bentConversion = true; 1382 // } 1383 // } 1384 1385 // CandidateRef newCand = std::make_shared<Candidate>( 1386 // newExpr, copy( tenv ), ast::OpenVarSet{}, ast::AssertionSet{}, bentConversion? Cost::safe: Cost::zero, 1387 // cost ); 1385 1388 CandidateRef newCand = std::make_shared<Candidate>( 1386 newExpr, copy( tenv ), ast::OpenVarSet{}, ast::AssertionSet{}, bentConversion? Cost::safe:Cost::zero,1389 newExpr, copy( tenv ), ast::OpenVarSet{}, ast::AssertionSet{}, Cost::zero, 1387 1390 cost ); 1388 1389 1391 if (newCand->expr->env) { 1390 1392 newCand->env.add(*newCand->expr->env); … … 1829 1831 Cost cost = Cost::zero; 1830 1832 ast::Expr * newExpr = data.combine( expr->location, cost ); 1833 // CandidateRef newCand = 1834 // std::make_shared<Candidate>( 1835 // newExpr, copy( tenv ), ast::OpenVarSet{}, 1836 // ast::AssertionSet{}, Cost::safe, cost 1837 // ); 1831 1838 CandidateRef newCand = 1832 1839 std::make_shared<Candidate>( 1833 1840 newExpr, copy( tenv ), ast::OpenVarSet{}, 1834 ast::AssertionSet{}, Cost:: safe, cost1841 ast::AssertionSet{}, Cost::zero, cost 1835 1842 ); 1836 1837 1843 if (newCand->expr->env) { 1838 1844 newCand->env.add(*newCand->expr->env); -
src/ResolvExpr/CastCost.cc
rcaaf424 r69867ad9 53 53 } else { 54 54 cost = conversionCost( basicType, dst, srcIsLvalue, symtab, env ); 55 if ( Cost::unsafe < cost ) { 56 if (auto enumInst = dynamic_cast<const ast::EnumInstType *>(dst)) { 57 assert(enumInst->base->base); 58 cost = Cost::unsafe; 59 } 60 } 55 61 } 62 } 63 64 void postvisit( const ast::ZeroType * zero ) { 65 // auto ptr = dynamic_cast< const ast::PointerType * >( dst ); 66 // if ( ptr && basicType->isInteger() ) { 67 // // needed for, e.g. unsigned long => void * 68 // cost = Cost::unsafe; 69 // } else { 70 cost = conversionCost( zero, dst, srcIsLvalue, symtab, env ); 71 if ( Cost::unsafe < cost ) { 72 if (auto enumInst = dynamic_cast<const ast::EnumInstType *>(dst)) { 73 assert(enumInst->base->base); 74 cost = Cost::unsafe; 75 } 76 } 77 // } 78 } 79 80 void postvisit( const ast::OneType * one ) { 81 // auto ptr = dynamic_cast< const ast::PointerType * >( dst ); 82 // if ( ptr && basicType->isInteger() ) { 83 // // needed for, e.g. unsigned long => void * 84 // cost = Cost::unsafe; 85 // } else { 86 cost = conversionCost( one, dst, srcIsLvalue, symtab, env ); 87 if ( Cost::unsafe < cost ) { 88 if (auto enumInst = dynamic_cast<const ast::EnumInstType *>(dst)) { 89 assert(enumInst->base->base); 90 cost = Cost::unsafe; 91 } 92 } 93 // } 56 94 } 57 95 … … 80 118 cost = Cost::unsafe; 81 119 } 120 } 121 } 122 123 void postvist( const ast::EnumInstType * ) { 124 if ( auto basic = dynamic_cast< const ast::BasicType * >(dst) ) { 125 if ( basic->isInteger() ) cost = Cost::unsafe; 82 126 } 83 127 } -
src/ResolvExpr/ConversionCost.cc
rcaaf424 r69867ad9 284 284 } else if ( auto dstAsEnumInst = dynamic_cast< const ast::EnumInstType * >( dst ) ) { 285 285 if ( dstAsEnumInst->base && !dstAsEnumInst->base->base ) { 286 cost = Cost::zero; 287 cost.incUnsafe(); 286 cost = Cost::unsafe; 288 287 } 289 288 } … … 482 481 } else if ( auto dstAsEnumInst = dynamic_cast< const ast::EnumInstType * >( dst ) ) { 483 482 if ( dstAsEnumInst->base && !dstAsEnumInst->base->base ) { 484 cost = Cost::zero; 485 cost.incUnsafe(); 483 cost = Cost::unsafe; 486 484 } 487 485 } … … 504 502 } else if ( auto dstAsEnumInst = dynamic_cast< const ast::EnumInstType * >( dst ) ) { 505 503 if ( dstAsEnumInst->base && !dstAsEnumInst->base->base ) { 506 cost = Cost::zero; 507 cost.incUnsafe(); 504 cost = Cost::unsafe; 508 505 } 509 506 } -
src/Validate/HoistStruct.cpp
rcaaf424 r69867ad9 27 27 namespace { 28 28 29 /// Is this a declaration can appear in a struct/union and should be hoisted? 29 30 bool shouldHoist( ast::Decl const * decl ) { 30 31 return dynamic_cast< ast::StructDecl const * >( decl ) … … 34 35 } 35 36 36 /* This pass also does some renaming and internal field alteration, but the 37 * complex part is the actual hoisting. Hoisted declarations should always 37 /// Helper that updates an InstType if the base name could be updated. 38 template<typename InstType> 39 InstType const * preInstType( InstType const * type ) { 40 assert( type->base ); 41 if ( nullptr == type->base->parent ) return type; 42 auto mut = ast::mutate( type ); 43 mut->name = mut->base->name; 44 return mut; 45 } 46 47 /// Update StructInstType and UnionInstType names. 48 struct NameUpdater { 49 ast::StructInstType const * previsit( ast::StructInstType const * type ) { 50 return preInstType( type ); 51 } 52 53 ast::UnionInstType const * previsit( ast::UnionInstType const * type ) { 54 return preInstType( type ); 55 } 56 }; 57 58 ast::Decl const * updateNames( ast::Decl const * decl ) { 59 ast::Pass<NameUpdater> visitor; 60 return decl->accept( visitor ); 61 } 62 63 /* This pass hoists from structs/unions. Hoisted declarations should always 38 64 * appear before the declaration they are hoisted out of and if two types are 39 65 * nested in the same declaration their order should not change. 66 * It also sets up parent relationships, does name mangling of hoisted types 67 * and updates instance types of the hoisted types. 40 68 */ 41 69 struct HoistStructCore final : … … 96 124 auto mut = ast::mutate( decl ); 97 125 mut->parent = parent; 98 mut->name = qualifiedName( mut );99 126 extendParams( mut->params, parent->params ); 100 127 decl = mut; … … 116 143 } 117 144 } 145 // Is this a nested type? Then update the name, after the parent's name 146 // has been updated (hence the post visit). 147 if ( mut->parent ) { 148 mut->name = qualifiedName( mut ); 149 // Top level type that has hoisted? Then do a second pass subpass to make 150 // sure we update instance type names after the declaration is renamed. 151 } else if ( !declsToAddBefore.empty() ) { 152 for ( ast::ptr<ast::Decl> & member : mut->members ) { 153 member = updateNames( member.get() ); 154 } 155 for ( ast::ptr<ast::Decl> & declToAdd : declsToAddBefore ) { 156 declToAdd = updateNames( declToAdd ); 157 } 158 } 118 159 return mut; 119 160 } … … 167 208 } 168 209 169 template<typename InstType>170 InstType const * preInstType( InstType const * type ) {171 assert( type->base );172 auto mut = ast::mutate( type );173 mut->name = mut->base->name;174 return mut;175 }176 177 210 ast::StructInstType const * HoistStructCore::previsit( ast::StructInstType const * type ) { 178 211 return preInstType( preCollectionInstType( type ) ); -
src/Validate/ImplementEnumFunc.cpp
rcaaf424 r69867ad9 30 30 void genAttrFunctions(); 31 31 void genSuccPredPosn(); 32 void genSuccPredDecl();32 // void genSuccPredDecl(); 33 33 34 34 void appendReturnThis(ast::FunctionDecl* decl) { … … 73 73 const ast::Decl* getDecl() const { return decl; } 74 74 75 // Implement Bounded trait for enum 76 void genBoundedFunctions(); 77 // Implement Serial trait for enum 78 void genSerialTraitFuncs(); 79 80 // Bounded trait 81 ast::FunctionDecl* genLowerBoundProto() const; 82 ast::FunctionDecl* genUpperBoundProto() const; 83 void genLowerBoundBody(ast::FunctionDecl* func) const; 84 void genUpperBoundBody(ast::FunctionDecl* func) const; 85 75 86 ast::FunctionDecl* genPosnProto() const; 76 87 ast::FunctionDecl* genLabelProto() const; 77 88 ast::FunctionDecl* genValueProto() const; 89 90 // Serial trait 91 ast::FunctionDecl* genFromIntProto() const; 92 ast::FunctionDecl* genFromInstanceProto() const; 78 93 ast::FunctionDecl* genSuccProto() const; 79 94 ast::FunctionDecl* genPredProto() const; 95 96 void genFromIntBody(ast::FunctionDecl *) const; 97 void genFromInstanceBody(ast::FunctionDecl *) const; 98 //////////////// 80 99 81 100 ast::FunctionDecl* genSuccPosProto() const; … … 289 308 290 309 ast::FunctionDecl* EnumAttrFuncGenerator::genPosnProto() const { 291 292 293 294 295 310 return genProto( 311 "posE", 312 {new ast::ObjectDecl(getLocation(), "_i", new ast::EnumInstType(decl))}, 313 {new ast::ObjectDecl(getLocation(), "_ret", 314 new ast::BasicType(ast::BasicKind::UnsignedInt))}); 296 315 } 297 316 … … 313 332 } 314 333 334 ast::FunctionDecl* EnumAttrFuncGenerator::genFromIntProto() const { 335 return genProto( 336 "fromInt", 337 {new ast::ObjectDecl(getLocation(), "_i", new ast::BasicType(ast::BasicKind::UnsignedInt))}, 338 {new ast::ObjectDecl(getLocation(), "_ret", new ast::EnumInstType(decl))} 339 ); 340 } 341 342 ast::FunctionDecl* EnumAttrFuncGenerator::genFromInstanceProto() const { 343 return genProto( 344 "fromInstance", 345 {new ast::ObjectDecl(getLocation(), "_i", new ast::EnumInstType(decl))}, 346 {new ast::ObjectDecl(getLocation(), "_ret", new ast::BasicType(ast::BasicKind::UnsignedInt))} 347 ); 348 } 349 350 void EnumAttrFuncGenerator::genFromIntBody(ast::FunctionDecl* func) const { 351 auto params = func->params; 352 assert( params.size() == 1 ); 353 auto param = params.front(); 354 auto castExpr = new ast::CastExpr( 355 func->location, 356 new ast::VariableExpr(func->location, param), 357 new ast::EnumInstType(decl), 358 ast::GeneratedFlag::ExplicitCast 359 ); 360 func->stmts = new ast::CompoundStmt( 361 func->location, {new ast::ReturnStmt(func->location, castExpr)} 362 ); 363 } 364 365 void EnumAttrFuncGenerator::genFromInstanceBody(ast::FunctionDecl* func) const { 366 auto params = func->params; 367 assert( params.size() == 1 ); 368 auto param = params.front(); 369 ast::UntypedExpr* untyped = ast::UntypedExpr::createCall( 370 func->location, "posE", { new ast::VariableExpr(func->location, param) }); 371 func->stmts = new ast::CompoundStmt( 372 func->location, {new ast::ReturnStmt(func->location, untyped)} 373 ); 374 } 375 376 void EnumAttrFuncGenerator::genSerialTraitFuncs() { 377 auto fromIntProto = genFromIntProto(); 378 produceForwardDecl(fromIntProto); 379 genFromIntBody(fromIntProto); 380 produceDecl(fromIntProto); 381 382 auto fromInstanceProto = genFromInstanceProto(); 383 produceForwardDecl(fromInstanceProto); 384 genFromInstanceBody(fromInstanceProto); 385 produceDecl(fromInstanceProto); 386 387 auto succProto = genSuccProto(); 388 auto predProto = genPredProto(); 389 produceForwardDecl(succProto); 390 produceForwardDecl(predProto); 391 } 392 315 393 ast::FunctionDecl* EnumAttrFuncGenerator::genSuccProto() const { 316 394 return genProto( … … 327 405 {new ast::ObjectDecl(getLocation(), "_ret", 328 406 new ast::EnumInstType(decl))}); 407 } 408 409 ast::FunctionDecl* EnumAttrFuncGenerator::genLowerBoundProto() const { 410 return genProto("lowerBound", {}, { 411 new ast::ObjectDecl(getLocation(), "_i", new ast::EnumInstType(decl)) 412 }); 413 } 414 415 ast::FunctionDecl* EnumAttrFuncGenerator::genUpperBoundProto() const { 416 return genProto("upperBound", {}, { 417 new ast::ObjectDecl(getLocation(), "_i", new ast::EnumInstType(decl)) 418 }); 419 } 420 421 void EnumAttrFuncGenerator::genLowerBoundBody(ast::FunctionDecl* func) const { 422 const CodeLocation & loc = func->location; 423 auto mem = decl->members.front(); 424 // auto expr = new ast::QualifiedNameExpr( loc, decl, mem->name ); 425 // expr->result = new ast::EnumInstType( decl ); 426 auto expr = new ast::NameExpr( loc, mem->name ); 427 func->stmts = new ast::CompoundStmt( loc, {new ast::ReturnStmt(loc, expr)}); 428 } 429 430 void EnumAttrFuncGenerator::genUpperBoundBody(ast::FunctionDecl* func) const { 431 const CodeLocation & loc = func->location; 432 auto mem = decl->members.back(); 433 auto expr = new ast::NameExpr( loc, mem->name ); 434 // expr->result = new ast::EnumInstType( decl ); 435 func->stmts = new ast::CompoundStmt( loc, {new ast::ReturnStmt(loc, expr)}); 436 } 437 438 void EnumAttrFuncGenerator::genBoundedFunctions() { 439 ast::FunctionDecl * upperDecl = genUpperBoundProto(); 440 produceForwardDecl(upperDecl); 441 genUpperBoundBody(upperDecl); 442 produceDecl(upperDecl); 443 444 ast::FunctionDecl * lowerDecl = genLowerBoundProto(); 445 produceForwardDecl(lowerDecl); 446 genLowerBoundBody(lowerDecl); 447 produceDecl(lowerDecl); 329 448 } 330 449 … … 373 492 func->location, "?[?]", 374 493 {new ast::NameExpr(func->location, arrDecl->name), 375 376 377 378 379 494 new ast::CastExpr( 495 func->location, 496 new ast::VariableExpr( func->location, func->params.front() ), 497 new ast::EnumAttrType( new ast::EnumInstType(decl), 498 ast::EnumAttribute::Posn))}); 380 499 func->stmts = new ast::CompoundStmt( 381 500 func->location, {new ast::ReturnStmt(func->location, untyped)}); … … 450 569 451 570 void EnumAttrFuncGenerator::genAttrFunctions() { 452 if (decl->base) { 453 genAttributesDecls(ast::EnumAttribute::Value); 454 genAttributesDecls(ast::EnumAttribute::Label); 455 genAttributesDecls(ast::EnumAttribute::Posn); 456 } 457 } 458 459 void EnumAttrFuncGenerator::genSuccPredDecl() { 460 if (decl->base) { 461 auto succProto = genSuccProto(); 462 auto predProto = genPredProto(); 463 464 produceForwardDecl(succProto); 465 produceForwardDecl(predProto); 466 } 467 } 571 genAttributesDecls(ast::EnumAttribute::Value); 572 genAttributesDecls(ast::EnumAttribute::Label); 573 genAttributesDecls(ast::EnumAttribute::Posn); 574 } 575 576 // void EnumAttrFuncGenerator::genSuccPredDecl() { 577 // auto succProto = genSuccProto(); 578 // auto predProto = genPredProto(); 579 580 // produceForwardDecl(succProto); 581 // produceForwardDecl(predProto); 582 // } 468 583 469 584 void EnumAttrFuncGenerator::genSuccPredPosn() { 470 if (decl->base) { 471 ast::FunctionDecl* succ = genSuccPredFunc(true); 472 ast::FunctionDecl* pred = genSuccPredFunc(false); 473 474 produceDecl(succ); 475 produceDecl(pred); 476 } 585 ast::FunctionDecl* succ = genSuccPredFunc(true); 586 ast::FunctionDecl* pred = genSuccPredFunc(false); 587 588 produceDecl(succ); 589 produceDecl(pred); 477 590 } 478 591 … … 482 595 genAttrStandardFuncs(); 483 596 genAttrFunctions(); 484 genSuccPredDecl(); 485 genSuccPredPosn(); // Posn 597 genSerialTraitFuncs(); 598 genSuccPredPosn(); 599 // problematic 600 genBoundedFunctions(); 486 601 // Now export the lists contents. 487 602 decls.splice(decls.end(), forwards); -
src/main.cc
rcaaf424 r69867ad9 325 325 PASS( "Validate Generic Parameters", Validate::fillGenericParameters, transUnit ); 326 326 PASS( "Translate Dimensions", Validate::translateDimensionParameters, transUnit ); 327 // Need to happen before fixing returns because implementEnumFunc has ReturnStmt 328 329 PASS( "Generate Enum Attributes Functions", Validate::implementEnumFunc, transUnit ); 327 330 PASS( "Check Function Returns", Validate::checkReturnStatements, transUnit ); 328 331 PASS( "Fix Return Statements", InitTweak::fixReturnStatements, transUnit ); … … 333 336 334 337 PASS( "Generate Autogen Routines", Validate::autogenerateRoutines, transUnit ); 335 PASS( "Generate Enum Attributes Functions", Validate::implementEnumFunc, transUnit ); 336 338 337 339 PASS( "Implement Actors", Concurrency::implementActors, transUnit ); 338 340 PASS( "Implement Virtual Destructors", Virtual::implementVirtDtors, transUnit );
Note: See TracChangeset
for help on using the changeset viewer.