12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394(**************************************************************************)(* *)(* SPDX-License-Identifier LGPL-2.1 *)(* Copyright (C) *)(* CEA (Commissariat à l'énergie atomique et aux énergies alternatives) *)(* *)(**************************************************************************)openCil_typesclassvirtualdo_it_=object(self)inherit[Memory_zone.t]Cumulative_analysis.cumulative_visitorvalmutablederefs=Memory_zone.bottommethodbottom=Memory_zone.bottommethodresult=derefsmethodjoinnew_=derefs<-Memory_zone.joinnew_derefs;method!vlval(base,_aslv)=beginmatchbasewith|Var_->()|Meme->letstmt=Option.getself#current_stmtinletr=Eva.Results.(beforestmt|>eval_expe|>as_cvalue)inletaddr=Addresses.Bits.of_bytesrinletsize=Bit_utils.sizeof_lvallvinself#join(Locations.enumerate_valid_bitsRead(Locations.makeaddrsize))end;DoChildrenmethodcompute_funspec(_:kernel_function)=Memory_zone.bottommethodclean_kf_result(_:kernel_function)(r:Memory_zone.t)=rendmoduleAnalysis=Cumulative_analysis.Make(structletanalysis_name="derefs"typet=Memory_zone.tmoduleT=Memory_zoneclassvirtualdo_it=do_it_end)letget_internal=Analysis.kernel_functionletexternalize_returnfundecx=Memory_zone.filter_base(funv->not(Base.is_formal_or_localvfundec))xmoduleExternals=Kernel_function.Make_Table(Memory_zone)(structletname="Inout.Derefs.Externals"letdependencies=[Analysis.Memo.self]letsize=17end)letget_external=Externals.memo(funkf->Eva.Analysis.compute();ifKernel_function.is_definitionkfthentryexternalize(Kernel_function.find_returnkf)(Kernel_function.get_definitionkf)(get_internalkf)withKernel_function.No_Statement->assertfalseelse(* assume there is no deref for leaf functions *)Memory_zone.bottom)letcompute_externalkf=ignore(get_externalkf)let_pretty_internalfmtkf=Format.fprintffmt"@[Derefs (internal) for function %a:@\n@[<hov 2> %a@]@]@\n"Kernel_function.prettykfMemory_zone.pretty(get_internalkf)letpretty_externalfmtkf=Format.fprintffmt"@[Derefs for function %a:@\n@[<hov 2> %a@]@]@\n"Kernel_function.prettykfMemory_zone.pretty(get_externalkf)