@@ -5158,6 +5158,7 @@ impl SectionLayout {
51585158struct 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
59195923impl 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