31 std::map<int, int> token_idx_to_block_idx;
33 int current_token_idx = 0;
34 while (
static_cast<size_t>(current_token_idx) < tokens.size()) {
35 int block_idx =
static_cast<int>(result.
cfg_blocks.size());
39 int block_start_idx = current_token_idx;
40 token_idx_to_block_idx[block_start_idx] = block_idx;
45 std::get<TokenPayloadLabel>(tokens[current_token_idx].payload);
48 std::format(
"Duplicate label: {}", payload.name),
55 int scan_idx = current_token_idx;
56 while (
static_cast<size_t>(scan_idx) < tokens.size()) {
57 const auto& token = tokens[scan_idx];
62 if (scan_idx > block_start_idx &&
70 current_token_idx = scan_idx;
74 for (
size_t i = 0; i < result.
cfg_blocks.size(); ++i) {
80 std::get<TokenPayloadLabel>(last_token.payload);
84 std::format(
"Undefined label for jump: {}", payload.name),
90 result.
cfg_blocks[target_block_idx].predecessors.push_back(
93 if (
static_cast<size_t>(block.
end_token_idx) < tokens.size()) {
94 int fallthrough_block_idx =
96 block.
successors.push_back(fallthrough_block_idx);
97 result.
cfg_blocks[fallthrough_block_idx].predecessors.push_back(
101 if (
static_cast<size_t>(block.
end_token_idx) < tokens.size()) {
102 int fallthrough_block_idx =
104 block.
successors.push_back(fallthrough_block_idx);
105 result.
cfg_blocks[fallthrough_block_idx].predecessors.push_back(
106 static_cast<int>(i));