let rec loop = function
| [] -> invalid_arg "get_byte"
| { start = start; size = size; arr = arr } :: _
- when start <= addr && addr < size ->
+ when start <= addr && addr < start +^ size ->
let offset = Int64.to_int (addr -^ start) in
Char.code (Array1.get arr offset)
| _ :: ms -> loop ms
with
Invalid_argument _ -> false
+let is_mapped { mappings = mappings } addr =
+ let rec loop = function
+ | [] -> false
+ | { start = start; size = size; arr = arr } :: _
+ when start <= addr && addr < start +^ size -> true
+ | _ :: ms -> loop ms
+ in
+ loop mappings
+
let follow_pointer t addr =
let ws = get_wordsize t in
let e = get_endian t in
let pred_long t addr =
let ws = get_wordsize t in
addr -^ Int64.of_int (bytes_of_wordsize ws)
+
+let align t addr =
+ let ws = get_wordsize t in
+ let mask = Int64.of_int (bytes_of_wordsize ws - 1) in
+ (addr +^ mask) &^ (Int64.lognot mask)