示例#1
0
    Block createBlockWithLabel(std::string label = "") {
        if (not label.empty())
            return Block{label, {}};
        else
            return Block{labelPrefix + std::to_string(getNextLabel()), {}};

    }
示例#2
0
int cs6300::Expression::getLabel() const
{
  if (label == -1)
  {
    label = getNextLabel();
  }
  return label;
}
void CBasicBlocksBuilder::SortBlocks()
{
	assert( blocks.size() > 0 );
	std::vector<bool> used( blocks.size(), false );
	CBasicBlock currBlock = blocks[labelToBlock[firstLabel->label]];
	used[labelToBlock[firstLabel->label]] = true;
	sortedBlocks.push_back( currBlock );
	const IIRStm* jump = currBlock.Last();
	size_t numOfFreeBlocks = used.size() - 1;
	while( numOfFreeBlocks > 0 ) {
		if( IsInstanceOf<CIRJump>( const_cast< IIRStm* >( jump ) ) ) {
			// За ним просто должен идти блок с меткой, куда прыгаем
			const Temp::CLabel* nextLabel = getNextLabel( jump );
			if( nextLabel->Name() == "done_label" || used[labelToBlock[nextLabel]] ) {
				// Если блок конца фрейма, или же след ведет в посещенный блок
				// Значит нужно взять непосещенный и с ним строить след
				int position = 0;
				if( getNextFreeBlock( used, currBlock, position ) ) {
					sortedBlocks.push_back( currBlock );
					used[position] = true;
					--numOfFreeBlocks;
					jump = currBlock.Last();
					continue;
				} else {
					// Свободных блоков не осталось
					break;
				}
			}
			currBlock = blocks[labelToBlock[nextLabel]];
			sortedBlocks.push_back( currBlock );
			used[labelToBlock[nextLabel]] = true;
			--numOfFreeBlocks;
		} else if( IsInstanceOf<CIRCJump>( const_cast< IIRStm* >( jump ) ) ) {
			// За ним должен идти блок с меткой на false
			const Temp::CLabel* nextLabel = getNextConditionalLabel( jump );
			if( nextLabel->Name() == "done_label" || used[labelToBlock[nextLabel]] ) {
				int position = 0;
				if( getNextFreeBlock( used, currBlock, position ) ) {
					sortedBlocks.push_back( currBlock );
					used[position] = true;
					--numOfFreeBlocks;
					jump = currBlock.Last();
					continue;
				} else {
					// Свободных блоков не осталось
					break;
				}
			}
			currBlock = blocks[labelToBlock[nextLabel]];
			sortedBlocks.push_back( currBlock );
			used[labelToBlock[nextLabel]] = true;
			--numOfFreeBlocks;
		} else {
			assert( false );
		}
		jump = currBlock.Last();
	}
}