Skip to content

Commit d980871

Browse files
committed
Promote machine CFG into layout plan
1 parent 7fae754 commit d980871

1 file changed

Lines changed: 11 additions & 8 deletions

File tree

‎src/codegen/mod.rs‎

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5158,6 +5158,7 @@ impl SectionLayout {
51585158
struct MachineLayoutPlan {
51595159
parsed: ParsedAssembly,
51605160
layout: SectionLayout,
5161+
cfg: MachineCfg,
51615162
metrics: BackendLayoutMetrics,
51625163
}
51635164

@@ -5266,6 +5267,8 @@ fn assemble_elf_internal(lines: &[String]) -> Result<Vec<u8>> {
52665267
plan.metrics.labeled_machine_block_count,
52675268
plan.metrics.machine_cfg_edge_count,
52685269
plan.metrics.unreachable_machine_block_count,
5270+
plan.cfg.blocks.len(),
5271+
plan.cfg.edges.len(),
52695272
);
52705273
let entry_label = parsed.entry_label.as_deref().ok_or_else(|| {
52715274
CompileError::new("ELF target requires at least one action or lock entry point", crate::error::Span::default())
@@ -5719,8 +5722,9 @@ impl MachineLayoutPlan {
57195722
let preliminary_layout = SectionLayout::for_text_user_size(preliminary.section_size(SectionKind::Text));
57205723
let parsed = ParsedAssembly::from_lines_relaxed(lines, &preliminary_layout)?;
57215724
let layout = SectionLayout::for_text_user_size(parsed.section_size(SectionKind::Text));
5722-
let metrics = parsed.layout_metrics(&layout)?;
5723-
Ok(Self { parsed, layout, metrics })
5725+
let cfg = machine_cfg(&parsed)?;
5726+
let metrics = parsed.layout_metrics(&layout, &cfg)?;
5727+
Ok(Self { parsed, layout, cfg, metrics })
57245728
}
57255729
}
57265730

@@ -5917,7 +5921,7 @@ fn instruction_terminator(op: &AsmOp) -> Option<MachineTerminator> {
59175921
}
59185922

59195923
impl ParsedAssembly {
5920-
fn layout_metrics(&self, layout: &SectionLayout) -> Result<BackendLayoutMetrics> {
5924+
fn layout_metrics(&self, layout: &SectionLayout, machine_cfg: &MachineCfg) -> Result<BackendLayoutMetrics> {
59215925
let text_op_layouts = text_op_layouts(self);
59225926
let text_size = text_op_layouts.iter().map(|op| op.size).sum();
59235927
let mut max_cond_branch_abs_distance = 0u64;
@@ -5931,14 +5935,13 @@ impl ParsedAssembly {
59315935
let distance = relative_offset(pc, target)?.unsigned_abs();
59325936
max_cond_branch_abs_distance = max_cond_branch_abs_distance.max(distance);
59335937
}
5934-
let machine_cfg = machine_cfg(self)?;
59355938
let machine_block_count = machine_cfg.blocks.len();
59365939
let max_machine_block_size = machine_cfg.blocks.iter().map(|block| block.byte_size).max().unwrap_or_default();
59375940
let conditional_branch_block_count =
59385941
machine_cfg.blocks.iter().filter(|block| matches!(block.terminator, MachineTerminator::ConditionalBranch { .. })).count();
59395942
let labeled_machine_block_count = machine_cfg.blocks.iter().filter(|block| block.label.is_some()).count();
59405943
let machine_cfg_edge_count = machine_cfg.edges.len();
5941-
let unreachable_machine_block_count = unreachable_machine_block_count(&machine_cfg);
5944+
let unreachable_machine_block_count = unreachable_machine_block_count(machine_cfg);
59425945
let _covered_text_ops = machine_cfg.blocks.iter().map(|block| block.op_end.saturating_sub(block.op_start)).sum::<usize>();
59435946
let _first_block_byte_start = machine_cfg.blocks.first().map(|block| block.byte_start).unwrap_or_default();
59445947
Ok(BackendLayoutMetrics {
@@ -6663,15 +6666,15 @@ mod tests {
66636666
];
66646667

66656668
let plan = MachineLayoutPlan::build(&lines).expect("machine layout plan");
6666-
let blocks = machine_blocks(&plan.parsed);
6669+
let cfg = &plan.cfg;
6670+
let blocks = &cfg.blocks;
66676671
assert_eq!(blocks.len(), 3, "expected entry, fallthrough, and done blocks: {:?}", blocks);
66686672
assert_eq!(blocks[0].label.as_deref(), Some("entry"));
66696673
assert_eq!(blocks[0].terminator, MachineTerminator::ConditionalBranch { target: "done".to_string() });
66706674
assert_eq!(blocks[1].terminator, MachineTerminator::Jump { target: "done".to_string() });
66716675
assert_eq!(blocks[2].label.as_deref(), Some("done"));
66726676
assert_eq!(blocks[2].terminator, MachineTerminator::Return);
66736677

6674-
let cfg = machine_cfg(&plan.parsed).expect("machine cfg");
66756678
assert_eq!(cfg.blocks.len(), 3);
66766679
assert_eq!(
66776680
cfg.edges,
@@ -6681,7 +6684,7 @@ mod tests {
66816684
MachineCfgEdge { from: 1, to: 2, kind: MachineCfgEdgeKind::Jump },
66826685
]
66836686
);
6684-
assert_eq!(unreachable_machine_block_count(&cfg), 0);
6687+
assert_eq!(unreachable_machine_block_count(cfg), 0);
66856688
}
66866689

66876690
#[test]

0 commit comments

Comments
 (0)