Skip to content

Commit fdd4287

Browse files
authored
adds register aliases to the Core Theory (#1343)
* adds the register aliasing * fixes the msb function in the lisp library * uses signed extension during operands unification in Primus Lisp Before that it was unsigned but in general we should put more control on it, as right now we have 32 aarch64 bit operations performed in 64 bits.
1 parent eb7a251 commit fdd4287

17 files changed

+873
-175
lines changed

lib/arm/arm_target.ml

Lines changed: 66 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -76,36 +76,80 @@ let vfp3regs = Theory.Role.Register.[
7676

7777
let vars32_fp = vars32 @ untyped @@ array r64 "D" 16
7878

79-
let gp64 = array r64 "X" 29
80-
let fp64 = array r128 "Q" 32
79+
let rs = array r64 "R" 32
80+
let xs = array r64 "X" 32
81+
let ws = array r32 "W" 32
82+
let vs = array r128 "V" 32
83+
let qs = array r128 "Q" 32
84+
let ds = array r64 "D" 32
85+
let ss = array r32 "S" 32
86+
let hs = array r16 "H" 32
87+
let bs = array r8 "B" 32
8188
let fp64 = reg r64 "FP" (* X29 *)
8289
let lr64 = reg r64 "LR" (* X30 *)
8390
let sp64 = reg r64 "SP" (* X31 *)
91+
let sp32 = reg r32 "WSP" (* W31 *)
92+
let zr = reg r64 "ZR"
8493
let zr64 = reg r64 "XZR"
8594
let zr32 = reg r32 "WZR"
86-
let mems64 = CT.Mem.define r64 r8
87-
let data64 = CT.Var.define mems64 "mem"
88-
let flags64 = [
95+
let memsv8 = CT.Mem.define r64 r8
96+
let datav8 = CT.Var.define memsv8 "mem"
97+
let flagsv8 = [
8998
reg bool "NF";
9099
reg bool "ZF";
91100
reg bool "CF";
92101
reg bool "VF";
93102
]
94103

95-
let vars64 = gp64 @< [fp64; sp64; lr64] @< flags64 @< [data64]
96-
97-
let regs64 = Theory.Role.Register.[
98-
[general; integer], gp64 @< [fp64; lr64; sp64];
99-
[general; floating], untyped [fp64];
100-
[stack_pointer], untyped [sp64];
101-
[frame_pointer], untyped [fp64];
102-
[function_argument], array r64 "X" 8 @< array r64 "Q" 8;
103-
[function_return], [reg r64 "X0"] @< [reg r128 "Q0"];
104-
[constant; zero; pseudo], [zr64] @< [zr32];
105-
[pseudo], array r32 "W" 31 @< [reg r32 "WSP"];
106-
[link], untyped [lr64];
104+
let (.$()) = List.nth_exn
105+
106+
let aliases =
107+
xs @< ws @< qs @< ds @< ss @< hs @< bs
108+
@<[fp64; lr64; sp64; zr; zr64]
109+
@<[sp32; zr32]
110+
111+
let varsv8 = rs @< flagsv8 @< [datav8]
112+
113+
let regsv8 = Theory.Role.Register.[
114+
[general; integer], untyped rs;
115+
[general; floating], untyped xs;
116+
[stack_pointer], untyped [reg r64 "R31"];
117+
[frame_pointer], untyped [reg r64 "R29"];
118+
[function_argument], array r64 "R" 8 @< array r64 "V" 8;
119+
[function_return], [reg r64 "R0"] @< [reg r128 "V0"];
120+
[constant; zero; pseudo], untyped [reg r64 "XZR"; reg r64 "ZR"];
121+
[constant; zero; pseudo], untyped [reg r32 "WZR"];
122+
[link], untyped [reg r64 "R30"];
123+
[alias], aliases;
107124
] @ status_regs
108125

126+
let equal xs ys =
127+
List.map2_exn xs ys ~f:Theory.Alias.(fun x y -> def x [reg y])
128+
129+
let lower xs _ ys =
130+
List.map2_exn xs ys ~f:Theory.Alias.(fun x y -> def x [unk; reg y])
131+
132+
let are f x y = f x y
133+
134+
let aliasing = Theory.Alias.[
135+
[
136+
def fp64 [reg xs.$(29)];
137+
def lr64 [reg xs.$(30)];
138+
def sp64 [reg xs.$(31)];
139+
def sp64 [unk; reg sp32];
140+
def zr [reg xs.$(31)];
141+
def zr [reg zr64];
142+
def zr [unk; reg zr32];
143+
];
144+
are equal rs xs;
145+
lower rs are ws;
146+
are equal vs qs;
147+
lower qs are ds;
148+
lower ds are ss;
149+
lower ss are hs;
150+
lower hs are bs;
151+
] |> List.concat
152+
109153

110154
let parent = CT.Target.declare ~package "arm"
111155

@@ -211,11 +255,12 @@ module Family (Order : Endianness) = struct
211255
let v8a =
212256
CT.Target.declare ~package (ordered "armv8-a") ~parent:v7
213257
~nicknames:["armv8-a"]
258+
~aliasing
214259
~bits:64
215-
~code:data64
216-
~data:data64
217-
~vars:vars64
218-
~regs:regs64
260+
~code:datav8
261+
~data:datav8
262+
~vars:varsv8
263+
~regs:regsv8
219264

220265
let v81a = v8a <: "armv8.1-a"
221266
let v82a = v81a <: "armv8.2-a"

lib/bap_core_theory/bap_core_theory.ml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ module Theory = struct
2626
module Filetype = Target.Filetype
2727
module Enum = KB.Enum
2828
module Role = Target.Role
29+
module Alias = Target.Alias
30+
module Origin = Target.Origin
2931

3032
type program = Program.cls
3133
type source = Source.t
@@ -35,6 +37,8 @@ module Theory = struct
3537
type language = Language.t
3638
type compiler = Compiler.t
3739
type role = Role.t
40+
type alias = Alias.t
41+
type ('a,'k) origin = ('a,'k) Origin.t
3842
type system = System.t
3943
type abi = Abi.t
4044
type fabi = Fabi.t
@@ -86,5 +90,6 @@ module Theory = struct
8690
module Empty : Core = Bap_core_theory_empty.Core
8791
module IEEE754 = Bap_core_theory_IEEE754
8892
module Parser = Bap_core_theory_parser
93+
module Pass = Bap_core_theory_pass
8994
include Bap_core_theory_manager
9095
end

0 commit comments

Comments
 (0)