12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697(**************************************************************************)(* *)(* SPDX-License-Identifier LGPL-2.1 *)(* Copyright (C) *)(* CEA (Commissariat à l'énergie atomique et aux énergies alternatives) *)(* *)(**************************************************************************)openLocationsmoduleTbl=Kernel_function.Make_Table(Eva.Assigns)(structletname="Functionwise dependencies"letsize=17letdependencies=[Eva.Analysis.self]end)let()=From_parameters.ForceDeps.set_output_dependencies[Tbl.self](* Forward reference to a function computing the from for a given function *)letforce_compute=ref(fun_->assertfalse)moduleTo_Use=structletstmt_requeststmt=Eva.Results.beforestmtletmemokf=Tbl.memo(funkf->!force_computekf;tryTbl.findkfwithNot_found->invalid_arg"could not compute dependencies")kfletget_from_callkf_=memokfletkeep_basekf=(* Eta-expansion required *)Eva.Logic_inout.accept_base~formals:false~locals:falsekfletcleanupkffroms=ifEva.Assigns.Memory.is_bottomfroms.Eva.Assigns.memorythenfromselseletaccept_base=Eva.Logic_inout.accept_base~formals:true~locals:falsekfinletfbintervs=ifaccept_basebthenZone.injectbintervselseZone.bottominletjoiner=Zone.joininletcache=Hptmap_sig.TemporaryCache"from cleanup"inletzone_substitution=Zone.cached_fold~cache~f~joiner~empty:Zone.bottominletzone_substitutionx=tryzone_substitutionxwithAbstract_interp.Error_Top->Zone.topinletmap_zone=Eva.Deps.mapzone_substitutionin{memory=From_memory.mapmap_zonefroms.memory;return=Eva.Deps.mapzone_substitutionfroms.return;}letcleanup_and_savekffroms=letfroms=cleanupkffromsinTbl.addkffroms;fromsendmoduleFrom=From_compute.Make(To_Use)let()=force_compute:=From.computeletself=Tbl.selfletcomputekf=ignore(To_Use.memokf)letforce_compute_all()=Eva.Analysis.compute();Callgraph.Uses.iter_in_rev_order@@funkf->letis_definition=Kernel_function.is_definitionkfinifis_definition&&Eva.Results.is_calledkfthencomputekfletcompute_all=letname="From.compute_all"inState_builder.apply_oncename[Tbl.self]force_compute_all|>fstletis_computed=Tbl.memletget=To_Use.memoletprettyfmtv=From_memory.pretty_with_type(Kernel_function.get_typev)fmt(getv)