123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225(**************************************************************************)(* This file is part of BINSEC. *)(* *)(* Copyright (C) 2016-2026 *)(* CEA (Commissariat à l'énergie atomique et aux énergies *)(* alternatives) *)(* *)(* you can redistribute it and/or modify it under the terms of the GNU *)(* Lesser General Public License as published by the Free Software *)(* Foundation, version 2.1. *)(* *)(* It is distributed in the hope that it will be useful, *)(* but WITHOUT ANY WARRANTY; without even the implied warranty of *)(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *)(* GNU Lesser General Public License for more details. *)(* *)(* See the GNU Lesser General Public License version 2.1 *)(* for more details (enclosed in the file licenses/LGPLv2.1). *)(* *)(**************************************************************************)moduletypeS=sigtypetvalzero:t(** Zero (hard-wired) aka x0 *)valra:t(** Return address / x1 *)valsp:tvalgp:tvaltp:tvalfp:t(** Same as s0 *)vala0:tvala1:tvala2:tvala3:tvala4:tvala5:tvala6:tvala7:tvalt0:tvalt1:tvalt2:tvalt3:tvalt4:tvalt5:tvalt6:tvals0:tvals1:tvals2:tvals3:tvals4:tvals5:tvals6:tvals7:tvals8:tvals9:tvals10:tvals11:tvalname:t->stringvalsize:t->intvalnum:t->intvalbvnum:t->Bitvector.tvalof_string:string->toptionvalof_int_exn:int->tvalof_int:int->toptionvalexpr:t->Dba.Expr.tvallval:t->Dba.LValue.tendmoduleMode=struct[@@@warning"-37"]typet=M32|M64|M128letm32=M32andm64=M64andm128=M128letis_m32=functionM32->true|M64|M128->falseletis_m64=functionM64->true|M32|M128->falseletis_m128=functionM128->true|M32|M64->falseletsize=functionM32->32|M64->64|M128->128endmoduletypeRegisterSize=sigvalsize:Mode.tendmoduleRegister(M:RegisterSize)=structtyperegister=Dba.Var.ttypet=register(* The local hashtable holding the information for this architecture *)moduleH=structincludeBasic_types.String.Htblleth=create7letget=findhletset=addhendletregsbaselast=letrecauxaccm=ifm>lastthenList.revaccelseletname=base^string_of_intminaux(name::acc)(m+1)inaux[]0letcanonical_registers=("zero"::"ra"::"sp"::"gp"::"tp"::regs"a"7)@regs"t"7@regs"s"11(* The original, non-ABI given names for RISCV *)let_x_registers=regs"x"31(* Add registers to the hashtbl *)letadd_all()=letinfo=Dba.Var.Tag.Registerandbitsize=Size.Bit.create(Mode.sizeM.size)inList.iter(funr->H.setr(Dba.Var.creater~bitsize~tag:info))canonical_registerslet_=add_all()letzero=H.get"zero"andra=H.get"ra"andsp=H.get"sp"andgp=H.get"gp"andtp=H.get"tp"anda0=H.get"a0"anda1=H.get"a1"anda2=H.get"a2"anda3=H.get"a3"anda4=H.get"a4"anda5=H.get"a5"anda6=H.get"a6"anda7=H.get"a7"andt0=H.get"t0"andt1=H.get"t1"andt2=H.get"t2"andt3=H.get"t3"andt4=H.get"t4"andt5=H.get"t5"andt6=H.get"t6"ands0=H.get"s0"ands1=H.get"s1"ands2=H.get"s2"ands3=H.get"s3"ands4=H.get"s4"ands5=H.get"s5"ands6=H.get"s6"ands7=H.get"s7"ands8=H.get"s8"ands9=H.get"s9"ands10=H.get"s10"ands11=H.get"s11"letfp=s0(* The x table below relates ABI-named registers to their "physical" name *)letx=[|zero;ra;sp;gp;tp;t0;t1;t2;s0;s1;a0;a1;a2;a3;a4;a5;a6;a7;s2;s3;s4;s5;s6;s7;s8;s9;s10;s11;t3;t4;t5;t6;|]letnamet=t.Dba.Var.nameandsizet=t.Dba.Var.sizeandexprt=Dba.Expr.vtandlvalt=Dba.LValue.vtletof_stringname=matchH.getnamewitht->Somet|exceptionNot_found->Noneletof_int_exnn=Array.getxnletof_intn=matchof_int_exnnwitht->Somet|exception_->Noneletnumt=letexceptionFoundofintintryArray.iteri(funir->ifr=tthenraise(Foundi))x;raiseNot_foundwithFoundi->iletbvnumt=Bitvector.of_int~size:(Mode.sizeM.size)(numt)end