1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980(**************************************************************************)(* *)(* SPDX-License-Identifier LGPL-2.1 *)(* Copyright (C) *)(* CEA (Commissariat à l'énergie atomique et aux énergies alternatives) *)(* *)(**************************************************************************)openMetrics_parameters;;let()=Enabled.set_output_dependencies[Ast.self;AstType.self;OutputFile.self;SyntacticallyReachable.self;Libc.self];;letsyntactic?(libc=Metrics_parameters.Libc.get())()=beginmatchAstType.get()with|"cil"->Metrics_cilast.compute_on_cilast~libc(* Cabs metrics are experimental. unregistered *)|"cabs"->Metrics_cabs.compute_on_cabs()|"acsl"->Metrics_acsl.dump()|_->assertfalse(* the possible values are checked by the kernel*)end;SyntacticallyReachable.iter(funkf->letreachable=Metrics_coverage.compute_syntactic~libckfinletcov_printer=newMetrics_coverage.syntactic_printer~libcreachableinMetrics_parameters.result"%a"cov_printer#pp_reached_from_functionkf)let()=ValueCoverage.set_output_dependencies[Eva.Analysis.self;Libc.self]letdkey_eva_coverage=Metrics_parameters.register_category"eva:coverage"~default:true~help:"print messages about Eva coverage"letdkey_eva_unreached=Metrics_parameters.register_category"eva:unreached"~default:true~help:"print messages about function calls not reached by Eva"letdkey_eva_reached_stmts=Metrics_parameters.register_category"eva:reached-stmts"~default:true~help:"print messages about statements reached by Eva"letvalue~libc()=Eva.Analysis.compute();ifEva.Analysis.is_computed()thenbeginletcov_metrics=Metrics_coverage.compute~libcinletcov_printer=newMetrics_coverage.semantic_printer~libccov_metricsinMetrics_parameters.result~dkey:dkey_eva_coverage"%t"cov_printer#pp_value_coverage;Metrics_parameters.result~dkey:dkey_eva_unreached"%t"cov_printer#pp_unreached_calls;Metrics_parameters.result~dkey:dkey_eva_reached_stmts"%t"cov_printer#pp_stmts_reached_by_function;end;;letmain()=letlibc=Libc.get()inifEnabled.get()thenEnabled.output(syntactic~libc);ifValueCoverage.get()thenValueCoverage.output(value~libc);ifLocalsSize.is_set()thenbeginAst.compute();Metrics_parameters.result"function\tlocals_size_no_temps\t\
locals_size_with_temps\t\
max_call_size_no_temps\t\
max_call_size_with_temps";LocalsSize.iter(funkf->Metrics_cilast.compute_locals_sizekf);end;ifUsedFiles.get()thenbeginletused_files=Metrics_cilast.used_files()inMetrics_cilast.pretty_used_filesused_filesend;;(* Register main entry points *)let()=Boot.Main.extendmain