gbf_core/decompiler/structure_analysis/
vbranch.rs

1#![deny(missing_docs)]
2
3use std::backtrace::Backtrace;
4
5use crate::decompiler::ast::new_virtual_branch;
6
7use super::{
8    RegionReducer, StructureAnalysis, StructureAnalysisError,
9    region::{RegionId, RegionType},
10};
11
12/// If the region has a jump, create a virtual branch
13pub struct VirtualBranchReducer;
14
15impl VirtualBranchReducer {}
16
17impl RegionReducer for VirtualBranchReducer {
18    fn reduce_region(
19        &mut self,
20        analysis: &mut StructureAnalysis,
21        region_id: RegionId,
22    ) -> Result<bool, StructureAnalysisError> {
23        // This logic applies to control flow regions only
24        if analysis.get_region_type(region_id)? != RegionType::Linear {
25            return Ok(false);
26        }
27
28        // Ensure that this linear region has one successor node
29        let successor_id = analysis.get_single_successor(region_id)?.ok_or_else(|| {
30            StructureAnalysisError::Other {
31                message: "Linear region does not have exactly one successor".to_string(),
32                backtrace: Backtrace::capture(),
33            }
34        })?;
35        // Insert the virtual branch
36        let vbranch = new_virtual_branch(successor_id);
37        let region = analysis.get_region_mut(region_id)?;
38        region.push_node(vbranch.into());
39        region.set_region_type(RegionType::Tail);
40        analysis.remove_edge(region_id, successor_id)?;
41        Ok(true)
42    }
43}