/* Common definitions.

   Copyright (C) 1986-2021 Free Software Foundation, Inc.

   This file is part of GDB.

   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 of the License, 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, see <http://www.gnu.org/licenses/>.  */

#ifndef COMMON_COMMON_DEFS_H
#define COMMON_COMMON_DEFS_H

#include <gdbsupport/config.h>

#undef PACKAGE_NAME
#undef PACKAGE
#undef PACKAGE_VERSION
#undef PACKAGE_STRING
#undef PACKAGE_TARNAME

#include "gnulib/config.h"

/* From:
    https://www.gnu.org/software/gnulib/manual/html_node/stdint_002eh.html

   "On some hosts that predate C++11, when using C++ one must define
   __STDC_CONSTANT_MACROS to make visible the definitions of constant
   macros such as INTMAX_C, and one must define __STDC_LIMIT_MACROS to
   make visible the definitions of limit macros such as INTMAX_MAX.".

   And:
    https://www.gnu.org/software/gnulib/manual/html_node/inttypes_002eh.html

   "On some hosts that predate C++11, when using C++ one must define
   __STDC_FORMAT_MACROS to make visible the declarations of format
   macros such as PRIdMAX."

   Must do this before including any system header, since other system
   headers may include stdint.h/inttypes.h.  */
#define __STDC_CONSTANT_MACROS 1
#define __STDC_LIMIT_MACROS 1
#define __STDC_FORMAT_MACROS 1

/* Some distros enable _FORTIFY_SOURCE by default, which on occasion
   has caused build failures with -Wunused-result when a patch is
   developed on a distro that does not enable _FORTIFY_SOURCE.  We
   enable it here in order to try to catch these problems earlier;
   plus this seems like a reasonable safety measure.  The check for
   optimization is required because _FORTIFY_SOURCE only works when
   optimization is enabled.  If _FORTIFY_SOURCE is already defined,
   then we don't do anything.  Also, on MinGW, fortify requires
   linking to -lssp, and to avoid the hassle of checking for
   that and linking to it statically, we just don't define
   _FORTIFY_SOURCE there.  */

#if (!defined _FORTIFY_SOURCE && defined __OPTIMIZE__ && __OPTIMIZE__ > 0 \
     && !defined(__MINGW32__))
#define _FORTIFY_SOURCE 2
#endif

/* We don't support Windows versions before XP, so we define
   _WIN32_WINNT correspondingly to ensure the Windows API headers
   expose the required symbols.  */
#if defined (__MINGW32__) || defined (__CYGWIN__)
# ifdef _WIN32_WINNT
#  if _WIN32_WINNT < 0x0501
#   undef _WIN32_WINNT
#   define _WIN32_WINNT 0x0501
#  endif
# else
#  define _WIN32_WINNT 0x0501
# endif
#endif	/* __MINGW32__ || __CYGWIN__ */

#include <stdarg.h>
#include <stdio.h>

/* Include both cstdlib and stdlib.h to ensure we have standard functions
   defined both in the std:: namespace and in the global namespace.  */
#include <cstdlib>
#include <stdlib.h>

#include <stddef.h>
#include <stdint.h>
#include <string.h>
#ifdef HAVE_STRINGS_H
#include <strings.h>	/* for strcasecmp and strncasecmp */
#endif
#include <errno.h>
#if HAVE_ALLOCA_H
#include <alloca.h>
#endif

#include "ansidecl.h"
/* This is defined by ansidecl.h, but we prefer gnulib's version.  On
   MinGW, gnulib might enable __USE_MINGW_ANSI_STDIO, which may or not
   require use of attribute gnu_printf instead of printf.  gnulib
   checks that at configure time.  Since _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD
   is compatible with ATTRIBUTE_PRINTF, simply use it.  */
#undef ATTRIBUTE_PRINTF
#define ATTRIBUTE_PRINTF _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD

/* This is defined by ansidecl.h, but we disable the attribute.

   Say a developer starts out with:
   ...
   extern void foo (void *ptr) __atttribute__((nonnull (1)));
   void foo (void *ptr) {}
   ...
   with the idea in mind to catch:
   ...
   foo (nullptr);
   ...
   at compile time with -Werror=nonnull, and then adds:
   ...
    void foo (void *ptr) {
   +  gdb_assert (ptr != nullptr);
    }
   ...
   to catch:
   ...
   foo (variable_with_nullptr_value);
   ...
   at runtime as well.

   Said developer then verifies that the assert works (using -O0), and commits
   the code.

   Some other developer then checks out the code and accidentally writes some
   variant of:
   ...
   foo (variable_with_nullptr_value);
   ...
   and builds with -O2, and ... the assert doesn't trigger, because it's
   optimized away by gcc.

   There's no suppported recipe to prevent the assertion from being optimized
   away (other than: build with -O0, or remove the nonnull attribute).  Note
   that -fno-delete-null-pointer-checks does not help.  A patch was submitted
   to improve gcc documentation to point this out more clearly (
   https://gcc.gnu.org/pipermail/gcc-patches/2021-July/576218.html ).  The
   patch also mentions a possible workaround that obfuscates the pointer
   using:
   ...
    void foo (void *ptr) {
   +  asm ("" : "+r"(ptr));
      gdb_assert (ptr != nullptr);
    }
   ...
   but that still requires the developer to manually add this in all cases
   where that's necessary.

   A warning was added to detect the situation: -Wnonnull-compare, which does
   help in detecting those cases, but each new gcc release may indicate a new
   batch of locations that needs fixing, which means we've added a maintenance
   burden.

   We could try to deal with the problem more proactively by introducing a
   gdb_assert variant like:
   ...
   void gdb_assert_non_null (void *ptr) {
      asm ("" : "+r"(ptr));
      gdb_assert (ptr != nullptr);
    }
    void foo (void *ptr) {
      gdb_assert_nonnull (ptr);
    }
   ...
   and make it a coding style to use it everywhere, but again, maintenance
   burden.

   With all these things considered, for now we go with the solution with the
   least maintenance burden: disable the attribute, such that we reliably deal
   with it everywhere.  */
#undef ATTRIBUTE_NONNULL
#define ATTRIBUTE_NONNULL(m)

#if GCC_VERSION >= 3004
#define ATTRIBUTE_UNUSED_RESULT __attribute__ ((__warn_unused_result__))
#else
#define ATTRIBUTE_UNUSED_RESULT
#endif

#include "libiberty.h"
#include "pathmax.h"
#include "gdb/signals.h"
#include "gdb_locale.h"
#include "ptid.h"
#include "common-types.h"
#include "common-utils.h"
#include "gdb_assert.h"
#include "errors.h"
#include "print-utils.h"
#include "common-debug.h"
#include "cleanups.h"
#include "common-exceptions.h"
#include "gdbsupport/poison.h"

#define EXTERN_C extern "C"
#define EXTERN_C_PUSH extern "C" {
#define EXTERN_C_POP }

/* Pull in gdb::unique_xmalloc_ptr.  */
#include "gdbsupport/gdb_unique_ptr.h"

/* String containing the current directory (what getwd would return).  */
extern char *current_directory;

/* sbrk on macOS is not useful for our purposes, since sbrk(0) always
   returns the same value.  brk/sbrk on macOS is just an emulation
   that always returns a pointer to a 4MB section reserved for
   that.  */

#if defined (HAVE_SBRK) && !__APPLE__
#define HAVE_USEFUL_SBRK 1
#endif

#endif /* COMMON_COMMON_DEFS_H */
