/* Copyright (C) 2021 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 */
