package bap-std
A control transfer operation.
Jmp is the only way to transfer control from block to block. Jumps are guarded with conditions. The jump should be taken only if its condition is evaluated to true. When control flow reaches the end of block it should take the first jump with true condition. If there is no such jump, then program stops.
Jumps are further subdivided into categories:
- goto - is a local control transfer instruction. The label can be only local to subroutine;
- call - transfer a control to another subroutine. A call contains a continuation, i.e., a label to which we're hoping to return after subroutine returns the control to us. Of course, called subroutine can in general return to another position, or not to return at all.
- ret - performs a return from subroutine
- int - calls to interrupt subroutine. If interrupt returns, then continue with the provided label.
val reify :
?tid:tid ->
?cnd:Bap_core_theory.Theory.Bool.t Bap_core_theory.Theory.value ->
?alt:dst ->
?dst:dst ->
unit ->
t
reify ()
reifies inputs into a jump term.
Calls and interrupt subroutines invocations are represented with two edges: the normal edge (denoted dst
) is the intra-procedural edge which connects the callsite with the fall-through destination (if such exists) and an alternative destination (denoted with alt
) which represents an inter-procedural destination between the callsite and the call destination.
val guard :
t ->
Bap_core_theory.Theory.Bool.t Bap_core_theory.Theory.value option
guard jmp
if jmp
is conditional, returns its condition.
val with_guard :
t ->
Bap_core_theory.Theory.Bool.t Bap_core_theory.Theory.value option ->
t
with_guard jmp cnd
updates the jump condition of jmp
.
val indirect :
'a Bap_core_theory.Theory.Bitv.t Bap_core_theory.Theory.value ->
dst
indirect v
creates an indirect jump destination.
The destination (or a set of destinations) is encoded with the Core Theory term v
.
val resolve :
dst ->
(tid, 'a Bap_core_theory.Theory.Bitv.t Bap_core_theory.Theory.value)
Core_kernel.Either.t
resolve dst
resolves destination.
create_call ?cond target
transfer control to subroutine target
create_int ?cond int_number return
call interrupt subroutine
exps jmp
returns a sequence of expressions occurring in different positions of a jump jmp
, e.g., in cond
, target
, etc.
free_vars jmp
returns a set of all variables that are free in some expression in the jump jmp
.
map_exp jmp ~f
applies f
to each expression in a jmp
, e.g., conditions and indirect labels.
substitute jmp x y
substitutes x
by y
in all expressions that occur in jump jmp
expressions.
val pp_slots : string list -> Stdlib.Format.formatter -> t -> unit
pp_slots names
prints slots that are in names
.
include Regular.Std.Regular.S with type t := t
val bin_size_t : t Bin_prot.Size.sizer
val bin_write_t : t Bin_prot.Write.writer
val bin_read_t : t Bin_prot.Read.reader
val __bin_read_t__ : (int -> t) Bin_prot.Read.reader
val bin_writer_t : t Bin_prot.Type_class.writer
val bin_reader_t : t Bin_prot.Type_class.reader
val bin_t : t Bin_prot.Type_class.t
val t_of_sexp : Sexplib0__.Sexp.t -> t
val sexp_of_t : t -> Sexplib0__.Sexp.t
val to_string : t -> string
val str : unit -> t -> string
val pps : unit -> t -> string
val ppo : Core_kernel.Out_channel.t -> t -> unit
val pp_seq : Stdlib.Format.formatter -> t Core_kernel.Sequence.t -> unit
val pp : Base__.Formatter.t -> t -> unit
module Replace_polymorphic_compare : sig ... end
val comparator : (t, comparator_witness) Core_kernel__Comparator.comparator
module Map : sig ... end
module Set : sig ... end
val hash_fold_t :
Ppx_hash_lib.Std.Hash.state ->
t ->
Ppx_hash_lib.Std.Hash.state
val hash : t -> Ppx_hash_lib.Std.Hash.hash_value
val hashable : t Core_kernel__.Hashtbl.Hashable.t
module Table : sig ... end
module Hash_set : sig ... end
module Hash_queue : sig ... end
val size_in_bytes : ?ver:string -> ?fmt:string -> t -> int
val of_bytes : ?ver:string -> ?fmt:string -> Regular.Std.bytes -> t
val to_bytes : ?ver:string -> ?fmt:string -> t -> Regular.Std.bytes
val blit_to_bytes :
?ver:string ->
?fmt:string ->
Regular.Std.bytes ->
t ->
int ->
unit
val of_bigstring : ?ver:string -> ?fmt:string -> Core_kernel.bigstring -> t
val to_bigstring : ?ver:string -> ?fmt:string -> t -> Core_kernel.bigstring
val blit_to_bigstring :
?ver:string ->
?fmt:string ->
Core_kernel.bigstring ->
t ->
int ->
unit
module Io : sig ... end
module Cache : sig ... end
val add_reader :
?desc:string ->
ver:string ->
string ->
t Regular.Std.reader ->
unit
val add_writer :
?desc:string ->
ver:string ->
string ->
t Regular.Std.writer ->
unit
val available_readers : unit -> info list
val default_reader : unit -> info
val available_writers : unit -> info list
val default_writer : unit -> info
val default_printer : unit -> info option
val find_reader : ?ver:string -> string -> t Regular.Std.reader option
val find_writer : ?ver:string -> string -> t Regular.Std.writer option