#include "src/wasm/basic-block-calculator.h"
#include "src/wasm/function-body-decoder.h"
namespace v8::internal::wasm {
void BasicBlockCalculator::StartNewBlock(Decoder* decoder) {
current_basic_block_++;
current_basic_block_start_pos_ = decoder->position();
}
void BasicBlockCalculator::EndCurrentBlock(Decoder* decoder) {
DCHECK_GE(current_basic_block_, 0);
DCHECK_GE(decoder->position(), current_basic_block_start_pos_);
int final_instruction_length = OpcodeLength(decoder->pc(), decoder->end());
basic_block_ranges_.emplace_back(
current_basic_block_start_pos_,
decoder->position() + final_instruction_length - 1);
}
void BasicBlockCalculator::ComputeBasicBlocks() {
DCHECK(basic_block_ranges_.empty());
BodyLocalDecls locals;
BytecodeIterator iterator(start_, end_, &locals, zone_);
DCHECK_LT(0, locals.encoded_size);
current_basic_block_ = 0;
current_basic_block_start_pos_ = 0;
bool at_block_end = false;
for (; iterator.has_next(); iterator.next()) {
WasmOpcode opcode = iterator.current();
if (at_block_end) {
StartNewBlock(&iterator);
at_block_end = false;
}
switch (opcode) {
case kExprLoop:
DCHECK_GE(current_basic_block_, 0);
if (iterator.position() > current_basic_block_start_pos_) {
basic_block_ranges_.emplace_back(current_basic_block_start_pos_,
iterator.position() - 1);
StartNewBlock(&iterator);
}
break;
case kExprEnd:
case kExprIf:
case kExprElse:
case kExprUnreachable:
case kExprBr:
case kExprBrTable:
case kExprReturn:
case kExprDelegate:
case kExprRethrow:
case kExprThrow:
case kExprThrowRef:
case kExprCatch:
case kExprCatchAll:
case kExprBrIf:
case kExprBrOnNull:
case kExprBrOnNonNull:
case kExprBrOnCast:
case kExprBrOnCastFail:
case kExprBrOnCastDesc:
case kExprBrOnCastDescFail:
case kExprReturnCall:
case kExprReturnCallIndirect:
case kExprReturnCallRef:
case kExprCallFunction:
case kExprCallIndirect:
case kExprCallRef:
EndCurrentBlock(&iterator);
at_block_end = true;
break;
default:
break;
}
}
if (!at_block_end) {
basic_block_ranges_.emplace_back(current_basic_block_start_pos_,
iterator.position() - 1);
}
}
}