/* **********************************************************
 * Copyright (c) 2012-2020 Google, Inc.  All rights reserved.
 * Copyright (c) 2008-2010 VMware, Inc.  All rights reserved.
 * **********************************************************/

/* Dr. Memory: the memory debugger
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation;
 * version 2.1 of the License, and no later version.

 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Library General Public License for more details.

 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

/***************************************************************************
 * leak.h: leak scanning
 */

#ifndef _LEAK_H_
#define _LEAK_H_ 1

#include "drmgr.h"

#ifdef STATISTICS
extern uint midchunk_postsize_ptrs;
extern uint midchunk_postnew_ptrs;
extern uint midchunk_postinheritance_ptrs;
extern uint midchunk_string_ptrs;
extern uint strings_not_pointers;
# ifdef WINDOWS
extern uint pointers_encoded;
extern uint encoded_pointers_scanned;
# endif
#endif

/**************************/
/* Must be provided by client */

void
client_found_leak(app_pc start, app_pc end, size_t indirect_bytes,
                  bool pre_us, bool reachable,
                  bool maybe_reachable, void *client_data,
                  bool count_reachable, bool show_reachable);

/**************************/
/* Must be called by client */

void
leak_init(bool have_defined_info,
          bool check_leaks_on_destroy,
          bool midchunk_new_ok,
          bool midchunk_inheritance_ok,
          bool midchunk_string_ok,
          bool midchunk_size_ok,
          bool show_reachable,
          IF_WINDOWS_(bool check_encoded_pointers)
          byte *(*next_defined_ptrsz)(byte *, byte *),
          byte *(*end_of_defined_region)(byte *, byte *),
          bool (*is_register_defined)(void *, reg_id_t));
void
leak_exit();

void
leak_module_load(void *drcontext, const module_data_t *info, bool loaded);

void
leak_module_unload(void *drcontext, const module_data_t *info);

void
leak_scan_for_leaks(bool at_exit);

/* User must call from client_handle_malloc() and client_handle_realloc() */
void
leak_handle_alloc(void *drcontext, app_pc base, size_t size);

#ifdef WINDOWS
/* User must call from client_remove_malloc_on_destroy() */
void
leak_remove_malloc_on_destroy(HANDLE heap, byte *start, byte *end);
#endif

#endif /* _LEAK_H_ */
