2323 LinkOpts ,
2424 ProveOpts ,
2525 PruneOpts ,
26+ ReduceOpts ,
2627 RunOpts ,
2728 SectionEdgeOpts ,
2829 ShowOpts ,
@@ -251,6 +252,17 @@ def _kmir_link(opts: LinkOpts) -> None:
251252 result .dump (opts .output_file )
252253
253254
255+ def _kmir_reduce (opts : ReduceOpts ) -> None :
256+ smir_info = SMIRInfo .from_file (opts .smir_file )
257+ original = len (smir_info .items )
258+ reduced = smir_info .reduce_to (opts .roots )
259+ reduced .dump (opts .output_file )
260+ _LOGGER .info (
261+ f'Reduced { original } -> { len (reduced .items )} items'
262+ f' ({ original - len (reduced .items )} pruned), written to { opts .output_file } '
263+ )
264+
265+
254266def kmir (args : Sequence [str ]) -> None :
255267 ns = _arg_parser ().parse_args (args )
256268 opts = _parse_args (ns )
@@ -272,6 +284,8 @@ def kmir(args: Sequence[str]) -> None:
272284 _kmir_prove (opts )
273285 case LinkOpts ():
274286 _kmir_link (opts )
287+ case ReduceOpts ():
288+ _kmir_reduce (opts )
275289 case _:
276290 raise AssertionError ()
277291
@@ -575,6 +589,27 @@ def _arg_parser() -> ArgumentParser:
575589 default = 'linker_output.smir.json' ,
576590 )
577591
592+ reduce_parser = command_parser .add_parser (
593+ 'reduce' ,
594+ help = 'Reduce SMIR to functions reachable from given roots' ,
595+ parents = [kcli_args .logging_args ],
596+ )
597+ reduce_parser .add_argument ('smir_file' , metavar = 'SMIR_JSON' , help = 'SMIR JSON file to reduce' )
598+ reduce_parser .add_argument (
599+ '--roots' ,
600+ '-r' ,
601+ required = True ,
602+ metavar = 'ROOTS' ,
603+ help = 'Comma-separated root function names, or @file for newline-separated file' ,
604+ )
605+ reduce_parser .add_argument (
606+ '--output-file' ,
607+ '-o' ,
608+ metavar = 'FILE' ,
609+ help = 'Output file (default: reduced.smir.json)' ,
610+ default = 'reduced.smir.json' ,
611+ )
612+
578613 return parser
579614
580615
@@ -677,6 +712,12 @@ def _parse_args(ns: Namespace) -> KMirOpts:
677712 smir_files = ns .smir_files ,
678713 output_file = ns .output_file ,
679714 )
715+ case 'reduce' :
716+ return ReduceOpts (
717+ smir_file = ns .smir_file ,
718+ roots = ns .roots ,
719+ output_file = ns .output_file ,
720+ )
680721 case _:
681722 raise AssertionError ()
682723
0 commit comments