| 504 | } |
| 505 | |
| 506 | std::list<std::pair<CFG::BasicBlock const*, CFG::BasicBlock const*>> StackLayoutGenerator::collectBackwardsJumps(CFG::BasicBlock const& _entry) const |
| 507 | { |
| 508 | std::list<std::pair<CFG::BasicBlock const*, CFG::BasicBlock const*>> backwardsJumps; |
| 509 | util::BreadthFirstSearch<CFG::BasicBlock const*>{{&_entry}}.run([&](CFG::BasicBlock const* _block, auto _addChild) { |
| 510 | std::visit(util::GenericVisitor{ |
| 511 | [&](CFG::BasicBlock::MainExit const&) {}, |
| 512 | [&](CFG::BasicBlock::Jump const& _jump) |
| 513 | { |
| 514 | if (_jump.backwards) |
| 515 | backwardsJumps.emplace_back(_block, _jump.target); |
| 516 | _addChild(_jump.target); |
| 517 | }, |
| 518 | [&](CFG::BasicBlock::ConditionalJump const& _conditionalJump) |
| 519 | { |
| 520 | _addChild(_conditionalJump.zero); |
| 521 | _addChild(_conditionalJump.nonZero); |
| 522 | }, |
| 523 | [&](CFG::BasicBlock::FunctionReturn const&) {}, |
| 524 | [&](CFG::BasicBlock::Terminated const&) {}, |
| 525 | }, _block->exit); |
| 526 | }); |
| 527 | return backwardsJumps; |
| 528 | } |
| 529 | |
| 530 | void StackLayoutGenerator::stitchConditionalJumps(CFG::BasicBlock const& _block) |
| 531 | { |