use crate::core::*;
use crate::crash::*;
use crate::error::*;
use crate::hooks::*;
#[derive(Clone, Eq, PartialEq, Hash, Debug)]
pub struct TraceRange(pub(crate) std::ops::Range<u64>);
impl TraceRange {
pub fn new(start: u64, end: u64) -> Self {
Self(start..end)
}
}
pub struct Tracer;
impl Tracer {
pub fn add_hooks<LD: Clone, GD: Clone>(
ranges: Vec<TraceRange>,
hook: Option<HookFn<LD, GD>>,
hooks: &mut Hooks<LD, GD>,
) -> Result<()> {
let hook = if let Some(tracer_hook) = hook {
tracer_hook
} else {
Tracer::hook
};
for TraceRange(range) in ranges.into_iter() {
for addr in range.step_by(4) {
hooks.add_tracer_hook(addr, hook);
}
}
Ok(())
}
pub fn hook<LD, GD>(args: &mut HookArgs<LD, GD>) -> Result<ExitKind> {
CSE.with(|cs| {
let insns = cs
.disasm_count(args.insn, args.addr, 1)
.expect("could not disassemble while adding coverage hooks");
let insn = insns.as_ref().get(0).unwrap();
println!("{}", insn);
});
Ok(ExitKind::Continue)
}
}