1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283(**************************************************************************)(* *)(* SPDX-License-Identifier LGPL-2.1 *)(* Copyright (C) *)(* CEA (Commissariat à l'énergie atomique et aux énergies alternatives) *)(* *)(**************************************************************************)openRangesopenCil_typesmoduleDomain=Cil_datatype.Compinfo.Settypefield=fieldinforangetypedomain=Domain.t(* support for associating offsets to field name *)letiter=Domain.iterletunion=Domain.unionletempty=Domain.emptyletsingleton(fd:fieldinfo)=Domain.singletonfd.fcomp(* minimal offset first, then minimal length, then largest struct *)letcompare(a:field)(b:field)=letcmp=a.offset-b.offsetinifcmp<>0thencmpelseletcmp=a.length-b.lengthinifcmp<>0thencmpelseletsa=Cil.bitsSizeOf(Cil_const.mk_tcompa.data.fcomp)inletsb=Cil.bitsSizeOf(Cil_const.mk_tcompb.data.fcomp)insb-saletfind_all(fields:domain)(rg:_range)=List.sortcompare@@Domain.fold(funcfds->List.fold_left(funfdsfd->letofs,len=Cil.fieldBitsOffsetfdinifrg.offset<=ofs&&ofs+len<=rg.offset+rg.lengththen{offset=ofs;length=len;data=fd}::fdselsefds)fds@@Option.value~default:[]c.cfields)fields[]letfindfieldsrg=matchfind_allfieldsrgwith|[]->None|fr::_->Somefrtypeslice=Bitsofint|Fieldoffieldinfoletpp_bitsfmtn=ifn<>0thenFormat.fprintffmt"#%db"nletpp_slicefmt=function|Bitsn->pp_bitsfmtn|Fieldfd->Format.fprintffmt".%s"fd.fnameletpadpqs=letn=q-pinifn>0thenBitsn::selsesletlast(rg:_range)=rg.offset+rg.lengthletspanfieldsrg=matchfind_allfieldsrgwith|[]->[Bitsrg.length]|fr::frs->padrg.offsetfr.offset@@Fieldfr.data::letp=lastfrinletq=lastrginmatchList.rev@@List.filter(funr->p<=r.offset)frswith|[]->padpq[]|lr::_->padplr.offset@@Fieldlr.data::pad(lastlr)q[]letprettyfieldsfmtrg=List.iter(pp_slicefmt)@@spanfieldsrgletpslicefmt~fields~offset~length=List.iter(pp_slicefmt)@@spanfields{offset;length;data=()}