/* Copyright (C) 2021-2024 Free Software Foundation, Inc.
   Contributed by Oracle.

   This file is part of GNU Binutils.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3, or (at your option)
   any later version.

   This program 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 General Public License for more details.

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

#ifndef _PERFAN_DEBUG_H
#define _PERFAN_DEBUG_H

extern unsigned int mpmt_debug_opt;
// To set mpmt_debug_opt use:
//   MPMT_DEBUG=4095 ; export MPMT_DEBUG
#define DEBUG_FLAG          (mpmt_debug_opt & 1)
#define DUMP_ELF_SEC        (mpmt_debug_opt & 2)
#define DUMP_ELF_SYM        (mpmt_debug_opt & 4)
#define DUMP_RELA_SEC       (mpmt_debug_opt & 8)
#define DUMP_ELF_RELOC      DUMP_RELA_SEC
#define DUMP_DWARFLIB       (mpmt_debug_opt & 16)
#define DUMP_DWR_LINE_REGS  (mpmt_debug_opt & 32)
#define DUMP_USER_LABELS    (mpmt_debug_opt & 64)
#define DEBUG_MAPS          (mpmt_debug_opt & 128)
#define DEBUG_DBE_FILE      (mpmt_debug_opt & 256)
#define DEBUG_DATA_WINDOW   (mpmt_debug_opt & 512)
#define DEBUG_STABS         (mpmt_debug_opt & 1024)
#define DEBUG_DATAOBJ       (mpmt_debug_opt & 2048)
#define DEBUG_LOADOBJ       (mpmt_debug_opt & 4096)
#define DEBUG_SAXPARSER     (mpmt_debug_opt & 8192)
#define DUMP_JAVA_CLASS     (mpmt_debug_opt & 16384)
#define DEBUG_COMPARISON    (mpmt_debug_opt & 32768)
#define DEBUG_READ_AR       (mpmt_debug_opt & 65536)
#define DEBUG_ERR_MSG       (mpmt_debug_opt & 131072)
#define DUMP_JCLASS_READER  (mpmt_debug_opt & 262144)
#define DEBUG_DBE           (mpmt_debug_opt & 524288)
#define DEBUG_ARCHIVE       (mpmt_debug_opt & 1048576)
#define DEBUG_IO            (mpmt_debug_opt & 2097152)
#define DUMP_DYN_FILE       (mpmt_debug_opt & 4194304)
#define DUMP_JAR_FILE       (mpmt_debug_opt & 8388608)
#define DUMP_CALL_STACK     (mpmt_debug_opt & 16777216)
#define DEBUG_THREADS       (mpmt_debug_opt & 33554432)
#define DBE_USE_MMAP        (mpmt_debug_opt & 67108864)

#ifdef DEBUG

// Turn on assertion checking whenever debugging
#define ASSERTS 1

// debug macro - provides a clean way of inserting debugging code without
//  having the distracting #ifdef DEBUG ... #else ... #endif directives
//  interspersed throughout the code.  It also provides an easy way
//  to turn them off with no loss of efficiency.  It is not limited
//  to printf() commands; any code may be inserted.  Variables
//  needed only by the debugging code can be declared inside a
//  debug { ... } statement.
//
// usage:
//      debug <statement>
//  or,	debug { <statements> }
// If DEBUG is on, map "DEBUG_CODE" to nothing!
// This results in the <statement> being executed normally

#define DEBUG_CODE

#else
// If DEBUG is off, map "DEBUG_CODE" to something harmless.
// The clever hack used here is to use a conditional with a
// constant condition, which is optimized out by the compiler,
// so that <statement> is not present in the compiled code!

#define DEBUG_CODE if (0)

#endif /*DEBUG*/

#define Dprintf(x, ...) DEBUG_CODE if(x) fprintf(stderr, __VA_ARGS__)

#endif /* ! _DEBUG_H */