crabgrind 0.1.11

Rust bindings to "Valgrind Client Request" interface
Documentation
use std::ffi::{c_char, c_void};

// valgrind
extern "C" {
    pub fn running_on_valgrind() -> usize;
    pub fn vg_disable_error_reporting();
    pub fn vg_enable_error_reporting();

    pub fn vg_count_errors() -> usize;

    pub fn vg_discard_translations(addr: *mut c_void, len: usize);

    pub fn vg_malloclike_block(addr: *mut c_void, size: usize, rz: usize, is_zeroed: bool);
    pub fn vg_freelike_block(addr: *mut c_void, rz: usize);
    pub fn vg_resizeinplace_block(addr: *mut c_void, old_size: usize, new_size: usize, rz: usize);

    pub fn vg_create_mempool(pool: *mut c_void, rz: usize, is_zeroed: bool);
    pub fn vg_create_mempool_ext(pool: *mut c_void, rz: usize, is_zeroed: bool, flags: u32);
    pub fn vg_destroy_mempool(pool: *mut c_void);
    pub fn vg_mempool_alloc(pool: *mut c_void, addr: *mut c_void, size: usize);
    pub fn vg_mempool_free(pool: *mut c_void, addr: *mut c_void);
    pub fn vg_mempool_trim(pool: *mut c_void, addr: *mut c_void, size: usize);
    pub fn vg_move_mempool(poolA: *mut c_void, poolB: *mut c_void);
    pub fn vg_mempool_change(
        pool: *mut c_void,
        addrA: *mut c_void,
        addrB: *mut c_void,
        size: usize,
    );
    pub fn vg_mempool_exists(pool: *mut c_void) -> bool;

    pub fn vg_stack_register(start: *mut c_void, end: *mut c_void) -> usize;
    pub fn vg_stack_deregister(id: usize);
    pub fn vg_stack_change(id: usize, start: *mut c_void, end: *mut c_void);

    pub fn vg_load_pdb_debuginfo(fd: i32, ptr: *mut c_void, total_size: usize, delta: usize);

    pub fn vg_map_ip_to_srcloc(addr: *mut c_void, buf64: *mut c_void) -> usize;

    pub fn vg_non_simd_call1(f: extern "C" fn(tid: usize, arg1: *mut c_void), arg1: *mut c_void);

    pub fn vg_print(msg: *const c_char) -> usize;
    pub fn vg_print_backtrace(msg: *const c_char) -> usize;

    pub fn vg_monitor_command(cmd: *const c_char) -> bool;

    pub fn vg_clo_change(opt: *const c_char);
}

// callgrind
extern "C" {
    pub fn cl_dump_stats();
    pub fn cl_dump_stats_at(pos_str: *const c_char);
    pub fn cl_zero_stats();

    pub fn cl_toggle_collect();

    pub fn cl_start_instrumentation();
    pub fn cl_stop_instrumentation();
}

// cachegrind
extern "C" {
    pub fn cg_start_instrumentation();
    pub fn cg_stop_instrumentation();
}

// memcheck

#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash, PartialOrd, Ord)]
#[repr(C)]
pub struct LeakCount {
    pub leaked: usize,
    pub dubious: usize,
    pub reachable: usize,
    pub suppressed: usize,
}

extern "C" {
    pub fn mc_make_mem_noaccess(addr: *mut c_void, len: usize) -> i32;
    pub fn mc_make_mem_undefined(addr: *mut c_void, len: usize) -> i32;
    pub fn mc_make_mem_defined(addr: *mut c_void, len: usize) -> i32;
    pub fn mc_make_mem_defined_if_addressable(addr: *mut c_void, len: usize) -> i32;

    pub fn mc_create_block(addr: *mut c_void, len: usize, desc: *const c_char) -> u32;
    pub fn mc_discard(blkindex: u32) -> u32;
    pub fn mc_check_mem_is_addressable(addr: *mut c_void, len: usize) -> usize;
    pub fn mc_check_mem_is_defined(addr: *mut c_void, len: usize) -> usize;

    pub fn mc_do_leak_check();
    pub fn mc_do_new_leak_check();
    pub fn mc_do_quick_leak_check();
    pub fn mc_do_added_leak_check();
    pub fn mc_do_changed_leak_check();

    pub fn mc_count_leaks() -> LeakCount;
    pub fn mc_count_leak_blocks() -> LeakCount;

    pub fn mc_get_vbits(addr: *mut c_void, bits: *const u8, nbytes: usize) -> u32;
    pub fn mc_set_vbits(addr: *mut c_void, bits: *const u8, nbytes: usize) -> u32;
    pub fn mc_disable_addr_error_reporting_in_range(addr: *mut c_void, len: usize);
    pub fn mc_enable_addr_error_reporting_in_range(addr: *mut c_void, len: usize);
}

// helgrind
extern "C" {
    pub fn hg_clean_memory(addr: *mut c_void, len: usize);
    pub fn hg_annotate_happens_before(addr: *mut c_void);
    pub fn hg_annotate_happens_after(addr: *mut c_void);
    pub fn hg_annotate_new_memory(addr: *mut c_void, size: usize);
    pub fn hg_rwlock_create(lock: *mut c_void);
    pub fn hg_rwlock_destroy(lock: *mut c_void);
    pub fn hg_rwlock_acquired(lock: *mut c_void, is_w: bool);
    pub fn hg_rwlock_released(lock: *mut c_void);
}

// dhat
extern "C" {
    pub fn dh_histogram_memory(addr: *mut c_void);
}