diff mbox

Import setenv and unsetenv from gnulib

Message ID 20170703162737.8386-1-Anton.Kolesov@synopsys.com
State New
Headers show

Commit Message

Anton Kolesov July 3, 2017, 4:27 p.m. UTC
This patch supersedes
https://sourceware.org/ml/gdb-patches/2017-07/msg00009.html

---

Patch [1] broke a build on MinGW hosts, because MinGW doesn't provide POSIX
functions setenv () and unsetenv ().  This can be fixed by using
implementations from gnulib.

[1] https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=9a6c7d9c0

gdb/ChangeLog
yyyy-mm-dd  Anton Kolesov  <Anton.Kolesov@synopsys.com>

	* gnulib/update-gnulib.sh (IMPORTED_GNULIB_MODULES): Add setenv and
	unsetenv.
	* gnulib/aclocal.m4: Regenerate.
	* gnulib/config.in: Regenerate.
	* gnulib/configure: Regenerate.
	* gnulib/import/Makefile.am: Regenerate.
	* gnulib/import/Makefile.in: Regenerate.
	* gnulib/import/m4/gnulib-cache.m4: Regenerate.
	* gnulib/import/m4/gnulib-comp.m4: Regenerate.
	* gnulib/import/m4/environ.m4: New file.
	* gnulib/import/m4/setenv.m4: New file.
	* gnulib/import/setenv.c: New file.
	* gnulib/import/unsetenv.c: New file.
---
 gdb/gnulib/aclocal.m4                |   2 +
 gdb/gnulib/config.in                 |  35 ++++
 gdb/gnulib/configure                 | 391 ++++++++++++++++++++++++++++++++++-
 gdb/gnulib/import/Makefile.am        |  20 +-
 gdb/gnulib/import/Makefile.in        |  12 +-
 gdb/gnulib/import/m4/environ.m4      |  47 +++++
 gdb/gnulib/import/m4/gnulib-cache.m4 |   4 +-
 gdb/gnulib/import/m4/gnulib-comp.m4  |  20 ++
 gdb/gnulib/import/m4/setenv.m4       | 160 ++++++++++++++
 gdb/gnulib/import/setenv.c           | 390 ++++++++++++++++++++++++++++++++++
 gdb/gnulib/import/unsetenv.c         | 127 ++++++++++++
 gdb/gnulib/update-gnulib.sh          |   2 +
 12 files changed, 1201 insertions(+), 9 deletions(-)
 create mode 100644 gdb/gnulib/import/m4/environ.m4
 create mode 100644 gdb/gnulib/import/m4/setenv.m4
 create mode 100644 gdb/gnulib/import/setenv.c
 create mode 100644 gdb/gnulib/import/unsetenv.c

Comments

Sergio Durigan Junior July 3, 2017, 7:35 p.m. UTC | #1
On Monday, July 03 2017, Anton Kolesov wrote:

> This patch supersedes
> https://sourceware.org/ml/gdb-patches/2017-07/msg00009.html

This is indeed better and looks good to me.  Please wait until a global
maintainer approves it.

Thanks for doing this.

> ---
>
> Patch [1] broke a build on MinGW hosts, because MinGW doesn't provide POSIX
> functions setenv () and unsetenv ().  This can be fixed by using
> implementations from gnulib.
>
> [1] https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=9a6c7d9c0
>
> gdb/ChangeLog
> yyyy-mm-dd  Anton Kolesov  <Anton.Kolesov@synopsys.com>
>
> 	* gnulib/update-gnulib.sh (IMPORTED_GNULIB_MODULES): Add setenv and
> 	unsetenv.
> 	* gnulib/aclocal.m4: Regenerate.
> 	* gnulib/config.in: Regenerate.
> 	* gnulib/configure: Regenerate.
> 	* gnulib/import/Makefile.am: Regenerate.
> 	* gnulib/import/Makefile.in: Regenerate.
> 	* gnulib/import/m4/gnulib-cache.m4: Regenerate.
> 	* gnulib/import/m4/gnulib-comp.m4: Regenerate.
> 	* gnulib/import/m4/environ.m4: New file.
> 	* gnulib/import/m4/setenv.m4: New file.
> 	* gnulib/import/setenv.c: New file.
> 	* gnulib/import/unsetenv.c: New file.
> ---
>  gdb/gnulib/aclocal.m4                |   2 +
>  gdb/gnulib/config.in                 |  35 ++++
>  gdb/gnulib/configure                 | 391 ++++++++++++++++++++++++++++++++++-
>  gdb/gnulib/import/Makefile.am        |  20 +-
>  gdb/gnulib/import/Makefile.in        |  12 +-
>  gdb/gnulib/import/m4/environ.m4      |  47 +++++
>  gdb/gnulib/import/m4/gnulib-cache.m4 |   4 +-
>  gdb/gnulib/import/m4/gnulib-comp.m4  |  20 ++
>  gdb/gnulib/import/m4/setenv.m4       | 160 ++++++++++++++
>  gdb/gnulib/import/setenv.c           | 390 ++++++++++++++++++++++++++++++++++
>  gdb/gnulib/import/unsetenv.c         | 127 ++++++++++++
>  gdb/gnulib/update-gnulib.sh          |   2 +
>  12 files changed, 1201 insertions(+), 9 deletions(-)
>  create mode 100644 gdb/gnulib/import/m4/environ.m4
>  create mode 100644 gdb/gnulib/import/m4/setenv.m4
>  create mode 100644 gdb/gnulib/import/setenv.c
>  create mode 100644 gdb/gnulib/import/unsetenv.c
>
> diff --git a/gdb/gnulib/aclocal.m4 b/gdb/gnulib/aclocal.m4
> index cd0dd5d..a4ce6a6 100644
> --- a/gdb/gnulib/aclocal.m4
> +++ b/gdb/gnulib/aclocal.m4
> @@ -1023,6 +1023,7 @@ m4_include([import/m4/dirfd.m4])
>  m4_include([import/m4/dirname.m4])
>  m4_include([import/m4/double-slash-root.m4])
>  m4_include([import/m4/eealloc.m4])
> +m4_include([import/m4/environ.m4])
>  m4_include([import/m4/errno_h.m4])
>  m4_include([import/m4/exponentd.m4])
>  m4_include([import/m4/exponentl.m4])
> @@ -1071,6 +1072,7 @@ m4_include([import/m4/rawmemchr.m4])
>  m4_include([import/m4/readlink.m4])
>  m4_include([import/m4/rename.m4])
>  m4_include([import/m4/rmdir.m4])
> +m4_include([import/m4/setenv.m4])
>  m4_include([import/m4/signal_h.m4])
>  m4_include([import/m4/ssize_t.m4])
>  m4_include([import/m4/stat.m4])
> diff --git a/gdb/gnulib/config.in b/gdb/gnulib/config.in
> index 057b12d..6061520 100644
> --- a/gdb/gnulib/config.in
> +++ b/gdb/gnulib/config.in
> @@ -95,6 +95,9 @@
>  /* Define to 1 when the gnulib module dirfd should be tested. */
>  #undef GNULIB_TEST_DIRFD
>  
> +/* Define to 1 when the gnulib module environ should be tested. */
> +#undef GNULIB_TEST_ENVIRON
> +
>  /* Define to 1 when the gnulib module frexp should be tested. */
>  #undef GNULIB_TEST_FREXP
>  
> @@ -140,6 +143,9 @@
>  /* Define to 1 when the gnulib module rmdir should be tested. */
>  #undef GNULIB_TEST_RMDIR
>  
> +/* Define to 1 when the gnulib module setenv should be tested. */
> +#undef GNULIB_TEST_SETENV
> +
>  /* Define to 1 when the gnulib module stat should be tested. */
>  #undef GNULIB_TEST_STAT
>  
> @@ -152,6 +158,9 @@
>  /* Define to 1 when the gnulib module strtok_r should be tested. */
>  #undef GNULIB_TEST_STRTOK_R
>  
> +/* Define to 1 when the gnulib module unsetenv should be tested. */
> +#undef GNULIB_TEST_UNSETENV
> +
>  /* Define to 1 if you have 'alloca' after including <alloca.h>, a header that
>     may be supplied by this distribution. */
>  #undef HAVE_ALLOCA
> @@ -201,6 +210,10 @@
>     */
>  #undef HAVE_DECL_MEMMEM
>  
> +/* Define to 1 if you have the declaration of `setenv', and to 0 if you don't.
> +   */
> +#undef HAVE_DECL_SETENV
> +
>  /* Define to 1 if you have the declaration of `strtok_r', and to 0 if you
>     don't. */
>  #undef HAVE_DECL_STRTOK_R
> @@ -209,12 +222,19 @@
>     don't. */
>  #undef HAVE_DECL_TOWLOWER
>  
> +/* Define to 1 if you have the declaration of `unsetenv', and to 0 if you
> +   don't. */
> +#undef HAVE_DECL_UNSETENV
> +
>  /* Define to 1 if you have the <dirent.h> header file. */
>  #undef HAVE_DIRENT_H
>  
>  /* Define to 1 if you have the `dirfd' function. */
>  #undef HAVE_DIRFD
>  
> +/* Define if you have the declaration of environ. */
> +#undef HAVE_ENVIRON_DECL
> +
>  /* Define to 1 if you have the <features.h> header file. */
>  #undef HAVE_FEATURES_H
>  
> @@ -1126,6 +1146,12 @@
>  /* Define to 1 if 'long double' and 'double' have the same representation. */
>  #undef HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
>  
> +/* Define to 1 if you have the <search.h> header file. */
> +#undef HAVE_SEARCH_H
> +
> +/* Define to 1 if you have the `setenv' function. */
> +#undef HAVE_SETENV
> +
>  /* Define to 1 if 'sig_atomic_t' is a signed integer type. */
>  #undef HAVE_SIGNED_SIG_ATOMIC_T
>  
> @@ -1189,9 +1215,15 @@
>  /* Define to 1 if you have the `towlower' function. */
>  #undef HAVE_TOWLOWER
>  
> +/* Define to 1 if you have the `tsearch' function. */
> +#undef HAVE_TSEARCH
> +
>  /* Define to 1 if you have the <unistd.h> header file. */
>  #undef HAVE_UNISTD_H
>  
> +/* Define to 1 if you have the `unsetenv' function. */
> +#undef HAVE_UNSETENV
> +
>  /* Define to 1 if the system has the type 'unsigned long long int'. */
>  #undef HAVE_UNSIGNED_LONG_LONG_INT
>  
> @@ -1407,6 +1439,9 @@
>  #endif
>  
>  
> +/* Define to 1 if unsetenv returns void instead of int. */
> +#undef VOID_UNSETENV
> +
>  /* Define to l, ll, u, ul, ull, etc., as suitable for constants of type
>     'wchar_t'. */
>  #undef WCHAR_T_SUFFIX
> diff --git a/gdb/gnulib/configure b/gdb/gnulib/configure
> index d214164..2a0dfc2 100644
> --- a/gdb/gnulib/configure
> +++ b/gdb/gnulib/configure
> @@ -3307,6 +3307,7 @@ as_fn_append ac_func_list " readlink"
>  as_fn_append ac_func_list " realpath"
>  as_fn_append ac_header_list " sys/param.h"
>  as_fn_append ac_header_list " dirent.h"
> +as_fn_append ac_header_list " unistd.h"
>  as_fn_append ac_func_list " btowc"
>  as_fn_append ac_func_list " isblank"
>  as_fn_append ac_func_list " iswctype"
> @@ -3324,7 +3325,6 @@ as_fn_append ac_header_list " limits.h"
>  as_fn_append ac_header_list " wchar.h"
>  as_fn_append ac_header_list " stdint.h"
>  as_fn_append ac_header_list " inttypes.h"
> -as_fn_append ac_header_list " unistd.h"
>  as_fn_append ac_func_list " symlink"
>  as_fn_append ac_func_list " lstat"
>  as_fn_append ac_header_list " math.h"
> @@ -3333,6 +3333,7 @@ as_fn_append ac_func_list " mbrtowc"
>  as_fn_append ac_header_list " sys/mman.h"
>  as_fn_append ac_func_list " mprotect"
>  as_fn_append ac_func_list " link"
> +as_fn_append ac_func_list " setenv"
>  as_fn_append ac_header_list " sys/stat.h"
>  as_fn_append ac_header_list " features.h"
>  as_fn_append ac_func_list " iswcntrl"
> @@ -5311,6 +5312,7 @@ fi
>    # Code from module dirname-lgpl:
>    # Code from module dosname:
>    # Code from module double-slash-root:
> +  # Code from module environ:
>    # Code from module errno:
>    # Code from module extensions:
>    # Code from module extern-inline:
> @@ -5352,6 +5354,7 @@ fi
>    # Code from module rename:
>    # Code from module rmdir:
>    # Code from module same-inode:
> +  # Code from module setenv:
>    # Code from module signal-h:
>    # Code from module snippet/_Noreturn:
>    # Code from module snippet/arg-nonnull:
> @@ -5376,6 +5379,7 @@ fi
>    # Code from module sys_types:
>    # Code from module time:
>    # Code from module unistd:
> +  # Code from module unsetenv:
>    # Code from module update-copyright:
>    # Code from module verify:
>    # Code from module wchar:
> @@ -6826,6 +6830,59 @@ $as_echo "$gl_cv_pragma_columns" >&6; }
>  
>  
>  
> +
> +
> +
> +
> +
> +
> +
> +  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if environ is properly declared" >&5
> +$as_echo_n "checking if environ is properly declared... " >&6; }
> +  if test "${gt_cv_var_environ_declaration+set}" = set; then :
> +  $as_echo_n "(cached) " >&6
> +else
> +
> +    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> +/* end confdefs.h.  */
> +#if HAVE_UNISTD_H
> +     #include <unistd.h>
> +     #endif
> +     /* mingw, BeOS, Haiku declare environ in <stdlib.h>, not in <unistd.h>.  */
> +     #include <stdlib.h>
> +
> +           extern struct { int foo; } environ;
> +int
> +main ()
> +{
> +environ.foo = 1;
> +  ;
> +  return 0;
> +}
> +_ACEOF
> +if ac_fn_c_try_compile "$LINENO"; then :
> +  gt_cv_var_environ_declaration=no
> +else
> +  gt_cv_var_environ_declaration=yes
> +fi
> +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
> +fi
> +
> +  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_var_environ_declaration" >&5
> +$as_echo "$gt_cv_var_environ_declaration" >&6; }
> +  if test $gt_cv_var_environ_declaration = yes; then
> +
> +$as_echo "#define HAVE_ENVIRON_DECL 1" >>confdefs.h
> +
> +  fi
> +
> +
> +  if test $gt_cv_var_environ_declaration != yes; then
> +    HAVE_DECL_ENVIRON=0
> +  fi
> +
> +
> +
>    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for complete errno.h" >&5
>  $as_echo_n "checking for complete errno.h... " >&6; }
>  if test "${gl_cv_header_errno_h_complete+set}" = set; then :
> @@ -9919,8 +9976,6 @@ $as_echo "#define HAVE_LANGINFO_CODESET 1" >>confdefs.h
>  
>  
>  
> -
> -
>    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working fcntl.h" >&5
>  $as_echo_n "checking for working fcntl.h... " >&6; }
>  if test "${gl_cv_header_working_fcntl_h+set}" = set; then :
> @@ -11411,6 +11466,55 @@ $as_echo "$gl_cv_func_memmem_works_always" >&6; }
>  
>  
>  
> +ac_fn_c_check_decl "$LINENO" "setenv" "ac_cv_have_decl_setenv" "$ac_includes_default"
> +if test "x$ac_cv_have_decl_setenv" = x""yes; then :
> +  ac_have_decl=1
> +else
> +  ac_have_decl=0
> +fi
> +
> +cat >>confdefs.h <<_ACEOF
> +#define HAVE_DECL_SETENV $ac_have_decl
> +_ACEOF
> +
> +
> +
> +
> +
> +
> +  if test $ac_cv_have_decl_setenv = no; then
> +    HAVE_DECL_SETENV=0
> +  fi
> +
> +
> +
> +
> +
> +  for ac_header in search.h
> +do :
> +  ac_fn_c_check_header_mongrel "$LINENO" "search.h" "ac_cv_header_search_h" "$ac_includes_default"
> +if test "x$ac_cv_header_search_h" = x""yes; then :
> +  cat >>confdefs.h <<_ACEOF
> +#define HAVE_SEARCH_H 1
> +_ACEOF
> +
> +fi
> +
> +done
> +
> +  for ac_func in tsearch
> +do :
> +  ac_fn_c_check_func "$LINENO" "tsearch" "ac_cv_func_tsearch"
> +if test "x$ac_cv_func_tsearch" = x""yes; then :
> +  cat >>confdefs.h <<_ACEOF
> +#define HAVE_TSEARCH 1
> +_ACEOF
> +
> +fi
> +done
> +
> +
> +
>  
>    GNULIB_PTHREAD_SIGMASK=0;
>    GNULIB_RAISE=0;
> @@ -12246,6 +12350,17 @@ $as_echo "$gl_cv_next_time_h" >&6; }
>  
>  
>  
> +ac_fn_c_check_decl "$LINENO" "unsetenv" "ac_cv_have_decl_unsetenv" "$ac_includes_default"
> +if test "x$ac_cv_have_decl_unsetenv" = x""yes; then :
> +  ac_have_decl=1
> +else
> +  ac_have_decl=0
> +fi
> +
> +cat >>confdefs.h <<_ACEOF
> +#define HAVE_DECL_UNSETENV $ac_have_decl
> +_ACEOF
> +
>  
>              { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether <wchar.h> uses 'inline' correctly" >&5
>  $as_echo_n "checking whether <wchar.h> uses 'inline' correctly... " >&6; }
> @@ -12917,6 +13032,22 @@ $as_echo "#define DOUBLE_SLASH_IS_DISTINCT_ROOT 1" >>confdefs.h
>  
>  
>  
> +
> +
> +
> +          GNULIB_ENVIRON=1
> +
> +
> +
> +
> +
> +$as_echo "#define GNULIB_TEST_ENVIRON 1" >>confdefs.h
> +
> +
> +
> +
> +
> +
>    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for flexible array member" >&5
>  $as_echo_n "checking for flexible array member... " >&6; }
>  if test "${ac_cv_c_flexmember+set}" = set; then :
> @@ -17099,6 +17230,102 @@ $as_echo "#define GNULIB_TEST_RMDIR 1" >>confdefs.h
>  
>  
>  
> +     if test $ac_cv_func_setenv = no; then
> +    HAVE_SETENV=0
> +  else
> +    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether setenv validates arguments" >&5
> +$as_echo_n "checking whether setenv validates arguments... " >&6; }
> +if test "${gl_cv_func_setenv_works+set}" = set; then :
> +  $as_echo_n "(cached) " >&6
> +else
> +  if test "$cross_compiling" = yes; then :
> +  case "$host_os" in
> +                 # Guess yes on glibc systems.
> +         *-gnu*) gl_cv_func_setenv_works="guessing yes" ;;
> +                 # If we don't know, assume the worst.
> +         *)      gl_cv_func_setenv_works="guessing no" ;;
> +       esac
> +
> +else
> +  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> +/* end confdefs.h.  */
> +
> +       #include <stdlib.h>
> +       #include <errno.h>
> +       #include <string.h>
> +
> +int
> +main ()
> +{
> +
> +       int result = 0;
> +       {
> +         if (setenv ("", "", 0) != -1)
> +           result |= 1;
> +         else if (errno != EINVAL)
> +           result |= 2;
> +       }
> +       {
> +         if (setenv ("a", "=", 1) != 0)
> +           result |= 4;
> +         else if (strcmp (getenv ("a"), "=") != 0)
> +           result |= 8;
> +       }
> +       return result;
> +
> +  ;
> +  return 0;
> +}
> +_ACEOF
> +if ac_fn_c_try_run "$LINENO"; then :
> +  gl_cv_func_setenv_works=yes
> +else
> +  gl_cv_func_setenv_works=no
> +fi
> +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
> +  conftest.$ac_objext conftest.beam conftest.$ac_ext
> +fi
> +
> +fi
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_setenv_works" >&5
> +$as_echo "$gl_cv_func_setenv_works" >&6; }
> +    case "$gl_cv_func_setenv_works" in
> +      *yes) ;;
> +      *)
> +        REPLACE_SETENV=1
> +        ;;
> +    esac
> +  fi
> +
> +  if test $HAVE_SETENV = 0 || test $REPLACE_SETENV = 1; then
> +
> +
> +
> +
> +
> +
> +
> +
> +  gl_LIBOBJS="$gl_LIBOBJS setenv.$ac_objext"
> +
> +  fi
> +
> +
> +
> +
> +
> +          GNULIB_SETENV=1
> +
> +
> +
> +
> +
> +$as_echo "#define GNULIB_TEST_SETENV 1" >>confdefs.h
> +
> +
> +
> +
> +
>  
>  
>  
> @@ -18642,6 +18869,164 @@ fi
>  
>  
>  
> +  if test $ac_cv_have_decl_unsetenv = no; then
> +    HAVE_DECL_UNSETENV=0
> +  fi
> +  for ac_func in unsetenv
> +do :
> +  ac_fn_c_check_func "$LINENO" "unsetenv" "ac_cv_func_unsetenv"
> +if test "x$ac_cv_func_unsetenv" = x""yes; then :
> +  cat >>confdefs.h <<_ACEOF
> +#define HAVE_UNSETENV 1
> +_ACEOF
> +
> +fi
> +done
> +
> +  if test $ac_cv_func_unsetenv = no; then
> +    HAVE_UNSETENV=0
> +  else
> +    HAVE_UNSETENV=1
> +        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for unsetenv() return type" >&5
> +$as_echo_n "checking for unsetenv() return type... " >&6; }
> +if test "${gt_cv_func_unsetenv_ret+set}" = set; then :
> +  $as_echo_n "(cached) " >&6
> +else
> +  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> +/* end confdefs.h.  */
> +
> +#undef _BSD
> +#define _BSD 1 /* unhide unsetenv declaration in OSF/1 5.1 <stdlib.h> */
> +#include <stdlib.h>
> +extern
> +#ifdef __cplusplus
> +"C"
> +#endif
> +int unsetenv (const char *name);
> +
> +int
> +main ()
> +{
> +
> +  ;
> +  return 0;
> +}
> +_ACEOF
> +if ac_fn_c_try_compile "$LINENO"; then :
> +  gt_cv_func_unsetenv_ret='int'
> +else
> +  gt_cv_func_unsetenv_ret='void'
> +fi
> +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
> +fi
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_unsetenv_ret" >&5
> +$as_echo "$gt_cv_func_unsetenv_ret" >&6; }
> +    if test $gt_cv_func_unsetenv_ret = 'void'; then
> +
> +$as_echo "#define VOID_UNSETENV 1" >>confdefs.h
> +
> +      REPLACE_UNSETENV=1
> +    fi
> +
> +                { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether unsetenv obeys POSIX" >&5
> +$as_echo_n "checking whether unsetenv obeys POSIX... " >&6; }
> +if test "${gl_cv_func_unsetenv_works+set}" = set; then :
> +  $as_echo_n "(cached) " >&6
> +else
> +  if test "$cross_compiling" = yes; then :
> +  case "$host_os" in
> +                 # Guess yes on glibc systems.
> +         *-gnu*) gl_cv_func_unsetenv_works="guessing yes" ;;
> +                 # If we don't know, assume the worst.
> +         *)      gl_cv_func_unsetenv_works="guessing no" ;;
> +       esac
> +
> +else
> +  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> +/* end confdefs.h.  */
> +
> +       #include <stdlib.h>
> +       #include <errno.h>
> +       extern char **environ;
> +
> +int
> +main ()
> +{
> +
> +       char entry1[] = "a=1";
> +       char entry2[] = "b=2";
> +       char *env[] = { entry1, entry2, NULL };
> +       if (putenv ((char *) "a=1")) return 1;
> +       if (putenv (entry2)) return 2;
> +       entry2[0] = 'a';
> +       unsetenv ("a");
> +       if (getenv ("a")) return 3;
> +       if (!unsetenv ("") || errno != EINVAL) return 4;
> +       entry2[0] = 'b';
> +       environ = env;
> +       if (!getenv ("a")) return 5;
> +       entry2[0] = 'a';
> +       unsetenv ("a");
> +       if (getenv ("a")) return 6;
> +
> +  ;
> +  return 0;
> +}
> +_ACEOF
> +if ac_fn_c_try_run "$LINENO"; then :
> +  gl_cv_func_unsetenv_works=yes
> +else
> +  gl_cv_func_unsetenv_works=no
> +fi
> +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
> +  conftest.$ac_objext conftest.beam conftest.$ac_ext
> +fi
> +
> +fi
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_unsetenv_works" >&5
> +$as_echo "$gl_cv_func_unsetenv_works" >&6; }
> +    case "$gl_cv_func_unsetenv_works" in
> +      *yes) ;;
> +      *)
> +        REPLACE_UNSETENV=1
> +        ;;
> +    esac
> +  fi
> +
> +  if test $HAVE_UNSETENV = 0 || test $REPLACE_UNSETENV = 1; then
> +
> +
> +
> +
> +
> +
> +
> +
> +  gl_LIBOBJS="$gl_LIBOBJS unsetenv.$ac_objext"
> +
> +
> +
> +
> +
> +  fi
> +
> +
> +
> +
> +
> +          GNULIB_UNSETENV=1
> +
> +
> +
> +
> +
> +$as_echo "#define GNULIB_TEST_UNSETENV 1" >>confdefs.h
> +
> +
> +
> +
> +
> +
>  
>  
>  
> diff --git a/gdb/gnulib/import/Makefile.am b/gdb/gnulib/import/Makefile.am
> index baa03a5..26f249d 100644
> --- a/gdb/gnulib/import/Makefile.am
> +++ b/gdb/gnulib/import/Makefile.am
> @@ -21,7 +21,7 @@
>  # the same distribution terms as the rest of that program.
>  #
>  # Generated by gnulib-tool.
> -# Reproduce by: gnulib-tool --import --lib=libgnu --source-base=import --m4-base=import/m4 --doc-base=doc --tests-base=tests --aux-dir=import/extra --no-conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files alloca canonicalize-lgpl dirent dirfd errno fnmatch-gnu frexpl inttypes limits-h lstat memchr memmem pathmax rawmemchr readlink rename signal-h strchrnul strstr strtok_r sys_stat unistd update-copyright wchar wctype-h
> +# Reproduce by: gnulib-tool --import --lib=libgnu --source-base=import --m4-base=import/m4 --doc-base=doc --tests-base=tests --aux-dir=import/extra --no-conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files alloca canonicalize-lgpl dirent dirfd errno fnmatch-gnu frexpl inttypes limits-h lstat memchr memmem pathmax rawmemchr readlink rename setenv signal-h strchrnul strstr strtok_r sys_stat unistd unsetenv update-copyright wchar wctype-h
>  
>  AUTOMAKE_OPTIONS = 1.9.6 gnits
>  
> @@ -928,6 +928,15 @@ EXTRA_DIST += same-inode.h
>  
>  ## end   gnulib module same-inode
>  
> +## begin gnulib module setenv
> +
> +
> +EXTRA_DIST += setenv.c
> +
> +EXTRA_libgnu_a_SOURCES += setenv.c
> +
> +## end   gnulib module setenv
> +
>  ## begin gnulib module signal-h
>  
>  BUILT_SOURCES += signal.h
> @@ -1862,6 +1871,15 @@ EXTRA_DIST += unistd.in.h
>  
>  ## end   gnulib module unistd
>  
> +## begin gnulib module unsetenv
> +
> +
> +EXTRA_DIST += unsetenv.c
> +
> +EXTRA_libgnu_a_SOURCES += unsetenv.c
> +
> +## end   gnulib module unsetenv
> +
>  ## begin gnulib module update-copyright
>  
>  
> diff --git a/gdb/gnulib/import/Makefile.in b/gdb/gnulib/import/Makefile.in
> index d45d7ea..ca7a73d 100644
> --- a/gdb/gnulib/import/Makefile.in
> +++ b/gdb/gnulib/import/Makefile.in
> @@ -36,7 +36,7 @@
>  # the same distribution terms as the rest of that program.
>  #
>  # Generated by gnulib-tool.
> -# Reproduce by: gnulib-tool --import --lib=libgnu --source-base=import --m4-base=import/m4 --doc-base=doc --tests-base=tests --aux-dir=import/extra --no-conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files alloca canonicalize-lgpl dirent dirfd errno fnmatch-gnu frexpl inttypes limits-h lstat memchr memmem pathmax rawmemchr readlink rename signal-h strchrnul strstr strtok_r sys_stat unistd update-copyright wchar wctype-h
> +# Reproduce by: gnulib-tool --import --lib=libgnu --source-base=import --m4-base=import/m4 --doc-base=doc --tests-base=tests --aux-dir=import/extra --no-conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files alloca canonicalize-lgpl dirent dirfd errno fnmatch-gnu frexpl inttypes limits-h lstat memchr memmem pathmax rawmemchr readlink rename setenv signal-h strchrnul strstr strtok_r sys_stat unistd unsetenv update-copyright wchar wctype-h
>  
>  
>  
> @@ -74,6 +74,7 @@ am__aclocal_m4_deps = $(top_srcdir)/import/m4/00gnulib.m4 \
>  	$(top_srcdir)/import/m4/dirname.m4 \
>  	$(top_srcdir)/import/m4/double-slash-root.m4 \
>  	$(top_srcdir)/import/m4/eealloc.m4 \
> +	$(top_srcdir)/import/m4/environ.m4 \
>  	$(top_srcdir)/import/m4/errno_h.m4 \
>  	$(top_srcdir)/import/m4/exponentd.m4 \
>  	$(top_srcdir)/import/m4/exponentl.m4 \
> @@ -122,6 +123,7 @@ am__aclocal_m4_deps = $(top_srcdir)/import/m4/00gnulib.m4 \
>  	$(top_srcdir)/import/m4/readlink.m4 \
>  	$(top_srcdir)/import/m4/rename.m4 \
>  	$(top_srcdir)/import/m4/rmdir.m4 \
> +	$(top_srcdir)/import/m4/setenv.m4 \
>  	$(top_srcdir)/import/m4/signal_h.m4 \
>  	$(top_srcdir)/import/m4/ssize_t.m4 \
>  	$(top_srcdir)/import/m4/stat.m4 \
> @@ -1289,7 +1291,7 @@ EXTRA_DIST = m4/gnulib-cache.m4 alloca.c alloca.in.h \
>  	mbrtowc.c mbsinit.c mbsrtowcs-impl.h mbsrtowcs-state.c \
>  	mbsrtowcs.c memchr.c memchr.valgrind memmem.c str-two-way.h \
>  	pathmax.h rawmemchr.c rawmemchr.valgrind readlink.c rename.c \
> -	rmdir.c same-inode.h signal.in.h \
> +	rmdir.c same-inode.h setenv.c signal.in.h \
>  	$(top_srcdir)/import/extra/snippet/_Noreturn.h \
>  	$(top_srcdir)/import/extra/snippet/arg-nonnull.h \
>  	$(top_srcdir)/import/extra/snippet/c++defs.h \
> @@ -1297,7 +1299,7 @@ EXTRA_DIST = m4/gnulib-cache.m4 alloca.c alloca.in.h \
>  	stdbool.in.h stddef.in.h stdint.in.h stdio.in.h stdlib.in.h \
>  	strchrnul.c strchrnul.valgrind streq.h string.in.h \
>  	str-two-way.h strstr.c strtok_r.c sys_stat.in.h sys_time.in.h \
> -	sys_types.in.h time.in.h unistd.in.h \
> +	sys_types.in.h time.in.h unistd.in.h unsetenv.c \
>  	$(top_srcdir)/import/extra/update-copyright verify.h \
>  	wchar.in.h wctype.in.h
>  
> @@ -1343,7 +1345,7 @@ EXTRA_libgnu_a_SOURCES = alloca.c canonicalize-lgpl.c dirfd.c float.c \
>  	gettimeofday.c isnan.c isnand.c isnan.c isnanl.c lstat.c \
>  	malloc.c mbrtowc.c mbsinit.c mbsrtowcs-state.c mbsrtowcs.c \
>  	memchr.c memmem.c rawmemchr.c readlink.c rename.c rmdir.c \
> -	stat.c strchrnul.c strstr.c strtok_r.c
> +	setenv.c stat.c strchrnul.c strstr.c strtok_r.c unsetenv.c
>  
>  # Use this preprocessor expression to decide whether #include_next works.
>  # Do not rely on a 'configure'-time test for this, since the expression
> @@ -1449,6 +1451,7 @@ distclean-compile:
>  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/readlink.Po@am__quote@
>  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rename.Po@am__quote@
>  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rmdir.Po@am__quote@
> +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/setenv.Po@am__quote@
>  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stat.Po@am__quote@
>  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strchrnul.Po@am__quote@
>  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stripslash.Po@am__quote@
> @@ -1456,6 +1459,7 @@ distclean-compile:
>  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strstr.Po@am__quote@
>  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strtok_r.Po@am__quote@
>  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unistd.Po@am__quote@
> +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unsetenv.Po@am__quote@
>  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wctype-h.Po@am__quote@
>  
>  .c.o:
> diff --git a/gdb/gnulib/import/m4/environ.m4 b/gdb/gnulib/import/m4/environ.m4
> new file mode 100644
> index 0000000..9a0ea7e
> --- /dev/null
> +++ b/gdb/gnulib/import/m4/environ.m4
> @@ -0,0 +1,47 @@
> +# environ.m4 serial 6
> +dnl Copyright (C) 2001-2004, 2006-2016 Free Software Foundation, Inc.
> +dnl This file is free software; the Free Software Foundation
> +dnl gives unlimited permission to copy and/or distribute it,
> +dnl with or without modifications, as long as this notice is preserved.
> +
> +AC_DEFUN_ONCE([gl_ENVIRON],
> +[
> +  AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
> +  dnl Persuade glibc <unistd.h> to declare environ.
> +  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
> +
> +  AC_CHECK_HEADERS_ONCE([unistd.h])
> +  gt_CHECK_VAR_DECL(
> +    [#if HAVE_UNISTD_H
> +     #include <unistd.h>
> +     #endif
> +     /* mingw, BeOS, Haiku declare environ in <stdlib.h>, not in <unistd.h>.  */
> +     #include <stdlib.h>
> +    ],
> +    [environ])
> +  if test $gt_cv_var_environ_declaration != yes; then
> +    HAVE_DECL_ENVIRON=0
> +  fi
> +])
> +
> +# Check if a variable is properly declared.
> +# gt_CHECK_VAR_DECL(includes,variable)
> +AC_DEFUN([gt_CHECK_VAR_DECL],
> +[
> +  define([gt_cv_var], [gt_cv_var_]$2[_declaration])
> +  AC_MSG_CHECKING([if $2 is properly declared])
> +  AC_CACHE_VAL([gt_cv_var], [
> +    AC_COMPILE_IFELSE(
> +      [AC_LANG_PROGRAM(
> +         [[$1
> +           extern struct { int foo; } $2;]],
> +         [[$2.foo = 1;]])],
> +      [gt_cv_var=no],
> +      [gt_cv_var=yes])])
> +  AC_MSG_RESULT([$gt_cv_var])
> +  if test $gt_cv_var = yes; then
> +    AC_DEFINE([HAVE_]m4_translit($2, [a-z], [A-Z])[_DECL], 1,
> +              [Define if you have the declaration of $2.])
> +  fi
> +  undefine([gt_cv_var])
> +])
> diff --git a/gdb/gnulib/import/m4/gnulib-cache.m4 b/gdb/gnulib/import/m4/gnulib-cache.m4
> index f99e59b..c4ebb73 100644
> --- a/gdb/gnulib/import/m4/gnulib-cache.m4
> +++ b/gdb/gnulib/import/m4/gnulib-cache.m4
> @@ -27,7 +27,7 @@
>  
>  
>  # Specification in the form of a command-line invocation:
> -#   gnulib-tool --import --lib=libgnu --source-base=import --m4-base=import/m4 --doc-base=doc --tests-base=tests --aux-dir=import/extra --no-conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files alloca canonicalize-lgpl dirent dirfd errno fnmatch-gnu frexpl inttypes limits-h lstat memchr memmem pathmax rawmemchr readlink rename signal-h strchrnul strstr strtok_r sys_stat unistd update-copyright wchar wctype-h
> +#   gnulib-tool --import --lib=libgnu --source-base=import --m4-base=import/m4 --doc-base=doc --tests-base=tests --aux-dir=import/extra --no-conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files alloca canonicalize-lgpl dirent dirfd errno fnmatch-gnu frexpl inttypes limits-h lstat memchr memmem pathmax rawmemchr readlink rename setenv signal-h strchrnul strstr strtok_r sys_stat unistd unsetenv update-copyright wchar wctype-h
>  
>  # Specification in the form of a few gnulib-tool.m4 macro invocations:
>  gl_LOCAL_DIR([])
> @@ -48,12 +48,14 @@ gl_MODULES([
>    rawmemchr
>    readlink
>    rename
> +  setenv
>    signal-h
>    strchrnul
>    strstr
>    strtok_r
>    sys_stat
>    unistd
> +  unsetenv
>    update-copyright
>    wchar
>    wctype-h
> diff --git a/gdb/gnulib/import/m4/gnulib-comp.m4 b/gdb/gnulib/import/m4/gnulib-comp.m4
> index 42d04ed..5a36567 100644
> --- a/gdb/gnulib/import/m4/gnulib-comp.m4
> +++ b/gdb/gnulib/import/m4/gnulib-comp.m4
> @@ -53,6 +53,7 @@ AC_DEFUN([gl_EARLY],
>    # Code from module dirname-lgpl:
>    # Code from module dosname:
>    # Code from module double-slash-root:
> +  # Code from module environ:
>    # Code from module errno:
>    # Code from module extensions:
>    # Code from module extern-inline:
> @@ -94,6 +95,7 @@ AC_DEFUN([gl_EARLY],
>    # Code from module rename:
>    # Code from module rmdir:
>    # Code from module same-inode:
> +  # Code from module setenv:
>    # Code from module signal-h:
>    # Code from module snippet/_Noreturn:
>    # Code from module snippet/arg-nonnull:
> @@ -118,6 +120,7 @@ AC_DEFUN([gl_EARLY],
>    # Code from module sys_types:
>    # Code from module time:
>    # Code from module unistd:
> +  # Code from module unsetenv:
>    # Code from module update-copyright:
>    # Code from module verify:
>    # Code from module wchar:
> @@ -160,6 +163,8 @@ AC_DEFUN([gl_INIT],
>    gl_DIRENT_MODULE_INDICATOR([dirfd])
>    gl_DIRNAME_LGPL
>    gl_DOUBLE_SLASH_ROOT
> +  gl_ENVIRON
> +  gl_UNISTD_MODULE_INDICATOR([environ])
>    gl_HEADER_ERRNO_H
>    AC_REQUIRE([gl_EXTERN_INLINE])
>    AC_C_FLEXIBLE_ARRAY_MEMBER
> @@ -285,6 +290,11 @@ AC_DEFUN([gl_INIT],
>      AC_LIBOBJ([rmdir])
>    fi
>    gl_UNISTD_MODULE_INDICATOR([rmdir])
> +  gl_FUNC_SETENV
> +  if test $HAVE_SETENV = 0 || test $REPLACE_SETENV = 1; then
> +    AC_LIBOBJ([setenv])
> +  fi
> +  gl_STDLIB_MODULE_INDICATOR([setenv])
>    gl_SIGNAL_H
>    gt_TYPE_SSIZE_T
>    gl_FUNC_STAT
> @@ -328,6 +338,12 @@ AC_DEFUN([gl_INIT],
>    AC_PROG_MKDIR_P
>    gl_HEADER_TIME_H
>    gl_UNISTD_H
> +  gl_FUNC_UNSETENV
> +  if test $HAVE_UNSETENV = 0 || test $REPLACE_UNSETENV = 1; then
> +    AC_LIBOBJ([unsetenv])
> +    gl_PREREQ_UNSETENV
> +  fi
> +  gl_STDLIB_MODULE_INDICATOR([unsetenv])
>    gl_WCHAR_H
>    gl_WCTYPE_H
>    # End of code from modules
> @@ -533,6 +549,7 @@ AC_DEFUN([gl_FILE_LIST], [
>    lib/rename.c
>    lib/rmdir.c
>    lib/same-inode.h
> +  lib/setenv.c
>    lib/signal.in.h
>    lib/stat.c
>    lib/stdbool.in.h
> @@ -556,6 +573,7 @@ AC_DEFUN([gl_FILE_LIST], [
>    lib/time.in.h
>    lib/unistd.c
>    lib/unistd.in.h
> +  lib/unsetenv.c
>    lib/verify.h
>    lib/wchar.in.h
>    lib/wctype-h.c
> @@ -571,6 +589,7 @@ AC_DEFUN([gl_FILE_LIST], [
>    m4/dirname.m4
>    m4/double-slash-root.m4
>    m4/eealloc.m4
> +  m4/environ.m4
>    m4/errno_h.m4
>    m4/exponentd.m4
>    m4/exponentl.m4
> @@ -618,6 +637,7 @@ AC_DEFUN([gl_FILE_LIST], [
>    m4/readlink.m4
>    m4/rename.m4
>    m4/rmdir.m4
> +  m4/setenv.m4
>    m4/signal_h.m4
>    m4/ssize_t.m4
>    m4/stat.m4
> diff --git a/gdb/gnulib/import/m4/setenv.m4 b/gdb/gnulib/import/m4/setenv.m4
> new file mode 100644
> index 0000000..5d49aba
> --- /dev/null
> +++ b/gdb/gnulib/import/m4/setenv.m4
> @@ -0,0 +1,160 @@
> +# setenv.m4 serial 26
> +dnl Copyright (C) 2001-2004, 2006-2016 Free Software Foundation, Inc.
> +dnl This file is free software; the Free Software Foundation
> +dnl gives unlimited permission to copy and/or distribute it,
> +dnl with or without modifications, as long as this notice is preserved.
> +
> +AC_DEFUN([gl_FUNC_SETENV],
> +[
> +  AC_REQUIRE([gl_FUNC_SETENV_SEPARATE])
> +  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
> +  if test $ac_cv_func_setenv = no; then
> +    HAVE_SETENV=0
> +  else
> +    AC_CACHE_CHECK([whether setenv validates arguments],
> +      [gl_cv_func_setenv_works],
> +      [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
> +       #include <stdlib.h>
> +       #include <errno.h>
> +       #include <string.h>
> +      ]], [[
> +       int result = 0;
> +       {
> +         if (setenv ("", "", 0) != -1)
> +           result |= 1;
> +         else if (errno != EINVAL)
> +           result |= 2;
> +       }
> +       {
> +         if (setenv ("a", "=", 1) != 0)
> +           result |= 4;
> +         else if (strcmp (getenv ("a"), "=") != 0)
> +           result |= 8;
> +       }
> +       return result;
> +      ]])],
> +      [gl_cv_func_setenv_works=yes], [gl_cv_func_setenv_works=no],
> +      [case "$host_os" in
> +                 # Guess yes on glibc systems.
> +         *-gnu*) gl_cv_func_setenv_works="guessing yes" ;;
> +                 # If we don't know, assume the worst.
> +         *)      gl_cv_func_setenv_works="guessing no" ;;
> +       esac
> +      ])])
> +    case "$gl_cv_func_setenv_works" in
> +      *yes) ;;
> +      *)
> +        REPLACE_SETENV=1
> +        ;;
> +    esac
> +  fi
> +])
> +
> +# Like gl_FUNC_SETENV, except prepare for separate compilation
> +# (no REPLACE_SETENV, no AC_LIBOBJ).
> +AC_DEFUN([gl_FUNC_SETENV_SEPARATE],
> +[
> +  AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
> +  AC_CHECK_DECLS_ONCE([setenv])
> +  if test $ac_cv_have_decl_setenv = no; then
> +    HAVE_DECL_SETENV=0
> +  fi
> +  AC_CHECK_FUNCS_ONCE([setenv])
> +  gl_PREREQ_SETENV
> +])
> +
> +AC_DEFUN([gl_FUNC_UNSETENV],
> +[
> +  AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
> +  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
> +  AC_CHECK_DECLS_ONCE([unsetenv])
> +  if test $ac_cv_have_decl_unsetenv = no; then
> +    HAVE_DECL_UNSETENV=0
> +  fi
> +  AC_CHECK_FUNCS([unsetenv])
> +  if test $ac_cv_func_unsetenv = no; then
> +    HAVE_UNSETENV=0
> +  else
> +    HAVE_UNSETENV=1
> +    dnl Some BSDs return void, failing to do error checking.
> +    AC_CACHE_CHECK([for unsetenv() return type], [gt_cv_func_unsetenv_ret],
> +      [AC_COMPILE_IFELSE(
> +         [AC_LANG_PROGRAM(
> +            [[
> +#undef _BSD
> +#define _BSD 1 /* unhide unsetenv declaration in OSF/1 5.1 <stdlib.h> */
> +#include <stdlib.h>
> +extern
> +#ifdef __cplusplus
> +"C"
> +#endif
> +int unsetenv (const char *name);
> +            ]],
> +            [[]])],
> +         [gt_cv_func_unsetenv_ret='int'],
> +         [gt_cv_func_unsetenv_ret='void'])])
> +    if test $gt_cv_func_unsetenv_ret = 'void'; then
> +      AC_DEFINE([VOID_UNSETENV], [1], [Define to 1 if unsetenv returns void
> +       instead of int.])
> +      REPLACE_UNSETENV=1
> +    fi
> +
> +    dnl Solaris 10 unsetenv does not remove all copies of a name.
> +    dnl Haiku alpha 2 unsetenv gets confused by assignment to environ.
> +    dnl OpenBSD 4.7 unsetenv("") does not fail.
> +    AC_CACHE_CHECK([whether unsetenv obeys POSIX],
> +      [gl_cv_func_unsetenv_works],
> +      [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
> +       #include <stdlib.h>
> +       #include <errno.h>
> +       extern char **environ;
> +      ]], [[
> +       char entry1[] = "a=1";
> +       char entry2[] = "b=2";
> +       char *env[] = { entry1, entry2, NULL };
> +       if (putenv ((char *) "a=1")) return 1;
> +       if (putenv (entry2)) return 2;
> +       entry2[0] = 'a';
> +       unsetenv ("a");
> +       if (getenv ("a")) return 3;
> +       if (!unsetenv ("") || errno != EINVAL) return 4;
> +       entry2[0] = 'b';
> +       environ = env;
> +       if (!getenv ("a")) return 5;
> +       entry2[0] = 'a';
> +       unsetenv ("a");
> +       if (getenv ("a")) return 6;
> +      ]])],
> +      [gl_cv_func_unsetenv_works=yes], [gl_cv_func_unsetenv_works=no],
> +      [case "$host_os" in
> +                 # Guess yes on glibc systems.
> +         *-gnu*) gl_cv_func_unsetenv_works="guessing yes" ;;
> +                 # If we don't know, assume the worst.
> +         *)      gl_cv_func_unsetenv_works="guessing no" ;;
> +       esac
> +      ])])
> +    case "$gl_cv_func_unsetenv_works" in
> +      *yes) ;;
> +      *)
> +        REPLACE_UNSETENV=1
> +        ;;
> +    esac
> +  fi
> +])
> +
> +# Prerequisites of lib/setenv.c.
> +AC_DEFUN([gl_PREREQ_SETENV],
> +[
> +  AC_REQUIRE([AC_FUNC_ALLOCA])
> +  AC_REQUIRE([gl_ENVIRON])
> +  AC_CHECK_HEADERS_ONCE([unistd.h])
> +  AC_CHECK_HEADERS([search.h])
> +  AC_CHECK_FUNCS([tsearch])
> +])
> +
> +# Prerequisites of lib/unsetenv.c.
> +AC_DEFUN([gl_PREREQ_UNSETENV],
> +[
> +  AC_REQUIRE([gl_ENVIRON])
> +  AC_CHECK_HEADERS_ONCE([unistd.h])
> +])
> diff --git a/gdb/gnulib/import/setenv.c b/gdb/gnulib/import/setenv.c
> new file mode 100644
> index 0000000..85c32cb
> --- /dev/null
> +++ b/gdb/gnulib/import/setenv.c
> @@ -0,0 +1,390 @@
> +/* Copyright (C) 1992, 1995-2003, 2005-2016 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   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/>.  */
> +
> +#if !_LIBC
> +/* Don't use __attribute__ __nonnull__ in this compilation unit.  Otherwise gcc
> +   optimizes away the name == NULL test below.  */
> +# define _GL_ARG_NONNULL(params)
> +
> +# define _GL_USE_STDLIB_ALLOC 1
> +# include <config.h>
> +#endif
> +
> +#include <alloca.h>
> +
> +/* Specification.  */
> +#include <stdlib.h>
> +
> +#include <errno.h>
> +#ifndef __set_errno
> +# define __set_errno(ev) ((errno) = (ev))
> +#endif
> +
> +#include <string.h>
> +#if _LIBC || HAVE_UNISTD_H
> +# include <unistd.h>
> +#endif
> +
> +#if !_LIBC
> +# include "malloca.h"
> +#endif
> +
> +#if _LIBC || !HAVE_SETENV
> +
> +#if !_LIBC
> +# define __environ      environ
> +#endif
> +
> +#if _LIBC
> +/* This lock protects against simultaneous modifications of 'environ'.  */
> +# include <bits/libc-lock.h>
> +__libc_lock_define_initialized (static, envlock)
> +# define LOCK   __libc_lock_lock (envlock)
> +# define UNLOCK __libc_lock_unlock (envlock)
> +#else
> +# define LOCK
> +# define UNLOCK
> +#endif
> +
> +/* In the GNU C library we must keep the namespace clean.  */
> +#ifdef _LIBC
> +# define setenv __setenv
> +# define clearenv __clearenv
> +# define tfind __tfind
> +# define tsearch __tsearch
> +#endif
> +
> +/* In the GNU C library implementation we try to be more clever and
> +   allow arbitrarily many changes of the environment given that the used
> +   values are from a small set.  Outside glibc this will eat up all
> +   memory after a while.  */
> +#if defined _LIBC || (defined HAVE_SEARCH_H && defined HAVE_TSEARCH \
> +                      && defined __GNUC__)
> +# define USE_TSEARCH    1
> +# include <search.h>
> +typedef int (*compar_fn_t) (const void *, const void *);
> +
> +/* This is a pointer to the root of the search tree with the known
> +   values.  */
> +static void *known_values;
> +
> +# define KNOWN_VALUE(Str) \
> +  ({                                                                          \
> +    void *value = tfind (Str, &known_values, (compar_fn_t) strcmp);           \
> +    value != NULL ? *(char **) value : NULL;                                  \
> +  })
> +# define STORE_VALUE(Str) \
> +  tsearch (Str, &known_values, (compar_fn_t) strcmp)
> +
> +#else
> +# undef USE_TSEARCH
> +
> +# define KNOWN_VALUE(Str) NULL
> +# define STORE_VALUE(Str) do { } while (0)
> +
> +#endif
> +
> +
> +/* If this variable is not a null pointer we allocated the current
> +   environment.  */
> +static char **last_environ;
> +
> +
> +/* This function is used by 'setenv' and 'putenv'.  The difference between
> +   the two functions is that for the former must create a new string which
> +   is then placed in the environment, while the argument of 'putenv'
> +   must be used directly.  This is all complicated by the fact that we try
> +   to reuse values once generated for a 'setenv' call since we can never
> +   free the strings.  */
> +int
> +__add_to_environ (const char *name, const char *value, const char *combined,
> +                  int replace)
> +{
> +  char **ep;
> +  size_t size;
> +  const size_t namelen = strlen (name);
> +  const size_t vallen = value != NULL ? strlen (value) + 1 : 0;
> +
> +  LOCK;
> +
> +  /* We have to get the pointer now that we have the lock and not earlier
> +     since another thread might have created a new environment.  */
> +  ep = __environ;
> +
> +  size = 0;
> +  if (ep != NULL)
> +    {
> +      for (; *ep != NULL; ++ep)
> +        if (!strncmp (*ep, name, namelen) && (*ep)[namelen] == '=')
> +          break;
> +        else
> +          ++size;
> +    }
> +
> +  if (ep == NULL || *ep == NULL)
> +    {
> +      char **new_environ;
> +#ifdef USE_TSEARCH
> +      char *new_value;
> +#endif
> +
> +      /* We allocated this space; we can extend it.  */
> +      new_environ =
> +        (char **) (last_environ == NULL
> +                   ? malloc ((size + 2) * sizeof (char *))
> +                   : realloc (last_environ, (size + 2) * sizeof (char *)));
> +      if (new_environ == NULL)
> +        {
> +          /* It's easier to set errno to ENOMEM than to rely on the
> +             'malloc-posix' and 'realloc-posix' gnulib modules.  */
> +          __set_errno (ENOMEM);
> +          UNLOCK;
> +          return -1;
> +        }
> +
> +      /* If the whole entry is given add it.  */
> +      if (combined != NULL)
> +        /* We must not add the string to the search tree since it belongs
> +           to the user.  */
> +        new_environ[size] = (char *) combined;
> +      else
> +        {
> +          /* See whether the value is already known.  */
> +#ifdef USE_TSEARCH
> +# ifdef _LIBC
> +          new_value = (char *) alloca (namelen + 1 + vallen);
> +          __mempcpy (__mempcpy (__mempcpy (new_value, name, namelen), "=", 1),
> +                     value, vallen);
> +# else
> +          new_value = (char *) malloca (namelen + 1 + vallen);
> +          if (new_value == NULL)
> +            {
> +              __set_errno (ENOMEM);
> +              UNLOCK;
> +              return -1;
> +            }
> +          memcpy (new_value, name, namelen);
> +          new_value[namelen] = '=';
> +          memcpy (&new_value[namelen + 1], value, vallen);
> +# endif
> +
> +          new_environ[size] = KNOWN_VALUE (new_value);
> +          if (new_environ[size] == NULL)
> +#endif
> +            {
> +              new_environ[size] = (char *) malloc (namelen + 1 + vallen);
> +              if (new_environ[size] == NULL)
> +                {
> +#if defined USE_TSEARCH && !defined _LIBC
> +                  freea (new_value);
> +#endif
> +                  __set_errno (ENOMEM);
> +                  UNLOCK;
> +                  return -1;
> +                }
> +
> +#ifdef USE_TSEARCH
> +              memcpy (new_environ[size], new_value, namelen + 1 + vallen);
> +#else
> +              memcpy (new_environ[size], name, namelen);
> +              new_environ[size][namelen] = '=';
> +              memcpy (&new_environ[size][namelen + 1], value, vallen);
> +#endif
> +              /* And save the value now.  We cannot do this when we remove
> +                 the string since then we cannot decide whether it is a
> +                 user string or not.  */
> +              STORE_VALUE (new_environ[size]);
> +            }
> +#if defined USE_TSEARCH && !defined _LIBC
> +          freea (new_value);
> +#endif
> +        }
> +
> +      if (__environ != last_environ)
> +        memcpy ((char *) new_environ, (char *) __environ,
> +                size * sizeof (char *));
> +
> +      new_environ[size + 1] = NULL;
> +
> +      last_environ = __environ = new_environ;
> +    }
> +  else if (replace)
> +    {
> +      char *np;
> +
> +      /* Use the user string if given.  */
> +      if (combined != NULL)
> +        np = (char *) combined;
> +      else
> +        {
> +#ifdef USE_TSEARCH
> +          char *new_value;
> +# ifdef _LIBC
> +          new_value = alloca (namelen + 1 + vallen);
> +          __mempcpy (__mempcpy (__mempcpy (new_value, name, namelen), "=", 1),
> +                     value, vallen);
> +# else
> +          new_value = malloca (namelen + 1 + vallen);
> +          if (new_value == NULL)
> +            {
> +              __set_errno (ENOMEM);
> +              UNLOCK;
> +              return -1;
> +            }
> +          memcpy (new_value, name, namelen);
> +          new_value[namelen] = '=';
> +          memcpy (&new_value[namelen + 1], value, vallen);
> +# endif
> +
> +          np = KNOWN_VALUE (new_value);
> +          if (np == NULL)
> +#endif
> +            {
> +              np = (char *) malloc (namelen + 1 + vallen);
> +              if (np == NULL)
> +                {
> +#if defined USE_TSEARCH && !defined _LIBC
> +                  freea (new_value);
> +#endif
> +                  __set_errno (ENOMEM);
> +                  UNLOCK;
> +                  return -1;
> +                }
> +
> +#ifdef USE_TSEARCH
> +              memcpy (np, new_value, namelen + 1 + vallen);
> +#else
> +              memcpy (np, name, namelen);
> +              np[namelen] = '=';
> +              memcpy (&np[namelen + 1], value, vallen);
> +#endif
> +              /* And remember the value.  */
> +              STORE_VALUE (np);
> +            }
> +#if defined USE_TSEARCH && !defined _LIBC
> +          freea (new_value);
> +#endif
> +        }
> +
> +      *ep = np;
> +    }
> +
> +  UNLOCK;
> +
> +  return 0;
> +}
> +
> +int
> +setenv (const char *name, const char *value, int replace)
> +{
> +  if (name == NULL || *name == '\0' || strchr (name, '=') != NULL)
> +    {
> +      __set_errno (EINVAL);
> +      return -1;
> +    }
> +
> +  return __add_to_environ (name, value, NULL, replace);
> +}
> +
> +/* The 'clearenv' was planned to be added to POSIX.1 but probably
> +   never made it.  Nevertheless the POSIX.9 standard (POSIX bindings
> +   for Fortran 77) requires this function.  */
> +int
> +clearenv (void)
> +{
> +  LOCK;
> +
> +  if (__environ == last_environ && __environ != NULL)
> +    {
> +      /* We allocated this environment so we can free it.  */
> +      free (__environ);
> +      last_environ = NULL;
> +    }
> +
> +  /* Clear the environment pointer removes the whole environment.  */
> +  __environ = NULL;
> +
> +  UNLOCK;
> +
> +  return 0;
> +}
> +
> +#ifdef _LIBC
> +static void
> +free_mem (void)
> +{
> +  /* Remove all traces.  */
> +  clearenv ();
> +
> +  /* Now remove the search tree.  */
> +  __tdestroy (known_values, free);
> +  known_values = NULL;
> +}
> +text_set_element (__libc_subfreeres, free_mem);
> +
> +
> +# undef setenv
> +# undef clearenv
> +weak_alias (__setenv, setenv)
> +weak_alias (__clearenv, clearenv)
> +#endif
> +
> +#endif /* _LIBC || !HAVE_SETENV */
> +
> +/* The rest of this file is called into use when replacing an existing
> +   but buggy setenv.  Known bugs include failure to diagnose invalid
> +   name, and consuming a leading '=' from value.  */
> +#if HAVE_SETENV
> +
> +# undef setenv
> +# if !HAVE_DECL_SETENV
> +extern int setenv (const char *, const char *, int);
> +# endif
> +# define STREQ(a, b) (strcmp (a, b) == 0)
> +
> +int
> +rpl_setenv (const char *name, const char *value, int replace)
> +{
> +  int result;
> +  if (!name || !*name || strchr (name, '='))
> +    {
> +      errno = EINVAL;
> +      return -1;
> +    }
> +  /* Call the real setenv even if replace is 0, in case implementation
> +     has underlying data to update, such as when environ changes.  */
> +  result = setenv (name, value, replace);
> +  if (result == 0 && replace && *value == '=')
> +    {
> +      char *tmp = getenv (name);
> +      if (!STREQ (tmp, value))
> +        {
> +          int saved_errno;
> +          size_t len = strlen (value);
> +          tmp = malloca (len + 2);
> +          /* Since leading '=' is eaten, double it up.  */
> +          *tmp = '=';
> +          memcpy (tmp + 1, value, len + 1);
> +          result = setenv (name, tmp, replace);
> +          saved_errno = errno;
> +          freea (tmp);
> +          errno = saved_errno;
> +        }
> +    }
> +  return result;
> +}
> +
> +#endif /* HAVE_SETENV */
> diff --git a/gdb/gnulib/import/unsetenv.c b/gdb/gnulib/import/unsetenv.c
> new file mode 100644
> index 0000000..8368744
> --- /dev/null
> +++ b/gdb/gnulib/import/unsetenv.c
> @@ -0,0 +1,127 @@
> +/* Copyright (C) 1992, 1995-2002, 2005-2016 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   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/>.  */
> +
> +/* Don't use __attribute__ __nonnull__ in this compilation unit.  Otherwise gcc
> +   optimizes away the name == NULL test below.  */
> +#define _GL_ARG_NONNULL(params)
> +
> +#include <config.h>
> +
> +/* Specification.  */
> +#include <stdlib.h>
> +
> +#include <errno.h>
> +#if !_LIBC
> +# define __set_errno(ev) ((errno) = (ev))
> +#endif
> +
> +#include <string.h>
> +#include <unistd.h>
> +
> +#if !_LIBC
> +# define __environ      environ
> +#endif
> +
> +#if _LIBC
> +/* This lock protects against simultaneous modifications of 'environ'.  */
> +# include <bits/libc-lock.h>
> +__libc_lock_define_initialized (static, envlock)
> +# define LOCK   __libc_lock_lock (envlock)
> +# define UNLOCK __libc_lock_unlock (envlock)
> +#else
> +# define LOCK
> +# define UNLOCK
> +#endif
> +
> +/* In the GNU C library we must keep the namespace clean.  */
> +#ifdef _LIBC
> +# define unsetenv __unsetenv
> +#endif
> +
> +#if _LIBC || !HAVE_UNSETENV
> +
> +int
> +unsetenv (const char *name)
> +{
> +  size_t len;
> +  char **ep;
> +
> +  if (name == NULL || *name == '\0' || strchr (name, '=') != NULL)
> +    {
> +      __set_errno (EINVAL);
> +      return -1;
> +    }
> +
> +  len = strlen (name);
> +
> +  LOCK;
> +
> +  ep = __environ;
> +  while (*ep != NULL)
> +    if (!strncmp (*ep, name, len) && (*ep)[len] == '=')
> +      {
> +        /* Found it.  Remove this pointer by moving later ones back.  */
> +        char **dp = ep;
> +
> +        do
> +          dp[0] = dp[1];
> +        while (*dp++);
> +        /* Continue the loop in case NAME appears again.  */
> +      }
> +    else
> +      ++ep;
> +
> +  UNLOCK;
> +
> +  return 0;
> +}
> +
> +#ifdef _LIBC
> +# undef unsetenv
> +weak_alias (__unsetenv, unsetenv)
> +#endif
> +
> +#else /* HAVE_UNSETENV */
> +
> +# undef unsetenv
> +# if !HAVE_DECL_UNSETENV
> +#  if VOID_UNSETENV
> +extern void unsetenv (const char *);
> +#  else
> +extern int unsetenv (const char *);
> +#  endif
> +# endif
> +
> +/* Call the underlying unsetenv, in case there is hidden bookkeeping
> +   that needs updating beyond just modifying environ.  */
> +int
> +rpl_unsetenv (const char *name)
> +{
> +  int result = 0;
> +  if (!name || !*name || strchr (name, '='))
> +    {
> +      errno = EINVAL;
> +      return -1;
> +    }
> +  while (getenv (name))
> +# if !VOID_UNSETENV
> +    result =
> +# endif
> +      unsetenv (name);
> +  return result;
> +}
> +
> +#endif /* HAVE_UNSETENV */
> diff --git a/gdb/gnulib/update-gnulib.sh b/gdb/gnulib/update-gnulib.sh
> index 19d949b..2775dc7 100755
> --- a/gdb/gnulib/update-gnulib.sh
> +++ b/gdb/gnulib/update-gnulib.sh
> @@ -46,12 +46,14 @@ IMPORTED_GNULIB_MODULES="\
>      rawmemchr \
>      readlink \
>      rename \
> +    setenv \
>      signal-h \
>      strchrnul \
>      strstr \
>      strtok_r \
>      sys_stat \
>      unistd \
> +    unsetenv \
>      update-copyright \
>      wchar \
>      wctype-h \
> -- 
> 2.8.3
Yao Qi July 4, 2017, 10:20 a.m. UTC | #2
On Mon, Jul 3, 2017 at 5:27 PM, Anton Kolesov
<Anton.Kolesov@synopsys.com> wrote:
> This patch supersedes
> https://sourceware.org/ml/gdb-patches/2017-07/msg00009.html
>
> ---
>
> Patch [1] broke a build on MinGW hosts, because MinGW doesn't provide POSIX
> functions setenv () and unsetenv ().  This can be fixed by using
> implementations from gnulib.
>
> [1] https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=9a6c7d9c0
>

We need commit hash and subject only, like

9a6c7d9c0 (C++ify gdb/common/environ.c)

Did you run regression test on x86-linux?  If there
is no regression, patches is good to me.
Anton Kolesov July 4, 2017, 6:06 p.m. UTC | #3
> > Patch [1] broke a build on MinGW hosts, because MinGW doesn't provide

> > POSIX functions setenv () and unsetenv ().  This can be fixed by using

> > implementations from gnulib.

> >

> > [1] https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=9a6c7d9c0

> >

> 

> We need commit hash and subject only, like

> 

> 9a6c7d9c0 (C++ify gdb/common/environ.c)

> 

> Did you run regression test on x86-linux?  If there is no regression, patches is

> good to me.


If I run "make check-gdb", I don't see any obvious new errors from this patch.
Unfortunately results are a little bit volatile - some tests sporadically fail even
if I run them with same GDB build and sources, even without this patch - I've run
testsuite five times and got five similar, but different results.

Selftests pass on x86_64-linux. On Windows with this patch there is a failure in
iconv sefltest, which seems unrelated (was present even when I've tried to use
putenv directly instead of importing gnulib module). 

Anton

> 

> --

> Yao (齐尧)
Sergio Durigan Junior July 4, 2017, 8:26 p.m. UTC | #4
On Tuesday, July 04 2017, Anton Kolesov wrote:

>> > Patch [1] broke a build on MinGW hosts, because MinGW doesn't provide
>> > POSIX functions setenv () and unsetenv ().  This can be fixed by using
>> > implementations from gnulib.
>> >
>> > [1] https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=9a6c7d9c0
>> >
>> 
>> We need commit hash and subject only, like
>> 
>> 9a6c7d9c0 (C++ify gdb/common/environ.c)
>> 
>> Did you run regression test on x86-linux?  If there is no regression, patches is
>> good to me.
>
> If I run "make check-gdb", I don't see any obvious new errors from this patch.
> Unfortunately results are a little bit volatile - some tests sporadically fail even
> if I run them with same GDB build and sources, even without this patch - I've run
> testsuite five times and got five similar, but different results.

Yeah, our testsuite has racy fails which are well known.  What are the
tests that fail sporadically?
Anton Kolesov July 5, 2017, 9:50 a.m. UTC | #5
> >>
> >> Did you run regression test on x86-linux?  If there is no regression,
> >> patches is good to me.
> >
> > If I run "make check-gdb", I don't see any obvious new errors from this
> patch.
> > Unfortunately results are a little bit volatile - some tests
> > sporadically fail even if I run them with same GDB build and sources,
> > even without this patch - I've run testsuite five times and got five similar,
> but different results.
> 
> Yeah, our testsuite has racy fails which are well known.  What are the tests
> that fail sporadically?

- gdb.base/checkpoint-ns.exp: break
- gdb.base/checkpoint.exp: break2 with many checkpoints
- gdb.btrace/exception.exp: indented
- Several consequtive tests in gdb.btrace/rn-dl-bind.exp
- gdb.threads/process-dies-while-handling-bp.exp: non_stop=off (KFAIL became
PASS with my patch).

Anton


> 
> --
> Sergio
> GPG key ID: 237A 54B1 0287 28BF 00EF  31F4 D0EB 7628 65FC 5E36 Please send
> encrypted e-mail if possible
> https://urldefense.proofpoint.com/v2/url?u=http-
> 3A__sergiodj.net_&d=DwIBAg&c=DPL6_X_6JkXFx7AXWqB0tg&r=bGeZp_Q7
> bzMjryuhhu0vBa43pSPPzpiFmLmHs_6WFqE&m=aD1DqJ1hQsS0rfAg_7NQt6
> UjAXyTJB0Cb1_rsKqMQK0&s=3JcsKwbMsJt-
> bA9MdRr4tPp7azeC0hVKiqr3B8FOTjg&e=
Pedro Alves July 5, 2017, 9:56 a.m. UTC | #6
On 07/04/2017 07:06 PM, Anton Kolesov wrote:
> Selftests pass on x86_64-linux. On Windows with this patch there is a failure in
> iconv sefltest, which seems unrelated (was present even when I've tried to use
> putenv directly instead of importing gnulib module). 

I take it you meant the s/iconv/gdb_environ/ selftest.
Can you show what does "maint selftest" say?

Thanks,
Pedro Alves
Anton Kolesov July 5, 2017, 10:32 a.m. UTC | #7
> 

> On 07/04/2017 07:06 PM, Anton Kolesov wrote:

> > Selftests pass on x86_64-linux. On Windows with this patch there is a

> > failure in iconv sefltest, which seems unrelated (was present even

> > when I've tried to use putenv directly instead of importing gnulib module).

> 

> I take it you meant the s/iconv/gdb_environ/ selftest.

> Can you show what does "maint selftest" say?


z:\tmp>gdb.exe -ex "mt selftest" -batch
Self test failed: Converting character sets: No error.
Ran 11 unit tests, 1 failed

Grepping for "Converting character sets" points to iconv_wrapper in charset.c.

I'm cross-building with Mingw GCC 4.9.2 from EPEL repositories for CentOS/RHEL 6.
Maybe some problems with this toolchain or my windows environment.

Anton

> 

> Thanks,

> Pedro Alves
Pedro Alves July 5, 2017, 12:25 p.m. UTC | #8
On 07/05/2017 11:32 AM, Anton Kolesov wrote:
>>
>> On 07/04/2017 07:06 PM, Anton Kolesov wrote:
>>> Selftests pass on x86_64-linux. On Windows with this patch there is a
>>> failure in iconv sefltest, which seems unrelated (was present even
>>> when I've tried to use putenv directly instead of importing gnulib module).
>>
>> I take it you meant the s/iconv/gdb_environ/ selftest.
>> Can you show what does "maint selftest" say?
> 
> z:\tmp>gdb.exe -ex "mt selftest" -batch
> Self test failed: Converting character sets: No error.
> Ran 11 unit tests, 1 failed
> 
> Grepping for "Converting character sets" points to iconv_wrapper in charset.c.

I put a breakpoint on iconv_wrapper::iconv_wrapper, and ran 
"mt selftest" on my GNU/Linux machine, and that leads to the Rust unit tests,
from here in rust-exp.y:

	    convert_between_encodings ("UTF-32", "UTF-8", (gdb_byte *) &value,
				       sizeof (value), sizeof (value),
				       &work_obstack, translit_none);

That's "UTF-32" -> "UTF-8".

I guess your build is using the phony iconv, which has (gdb/charset.c):

/* We allow conversions from UTF-32, wchar_t, and the host charset.
   We allow conversions to wchar_t and the host charset.
   Return 1 if we are converting from UTF-32BE, 2 if from UTF32-LE,
   0 otherwise.  This is used as a flag in calls to iconv.  */

static iconv_t
phony_iconv_open (const char *to, const char *from)
{
  if (strcmp (to, "wchar_t") && strcmp (to, GDB_DEFAULT_HOST_CHARSET))
    return -1;

  if (!strcmp (from, "UTF-32BE") || !strcmp (from, "UTF-32"))
    return 1;

  if (!strcmp (from, "UTF-32LE"))
    return 2;

  if (strcmp (from, "wchar_t") && strcmp (from, GDB_DEFAULT_HOST_CHARSET))
    return -1;

  return 0;
}

With host charset defined as:

#undef GDB_DEFAULT_HOST_CHARSET
#ifdef USE_WIN32API
# define GDB_DEFAULT_HOST_CHARSET "CP1252"
...
#endif

> I'm cross-building with Mingw GCC 4.9.2 from EPEL repositories for CentOS/RHEL 6.
> Maybe some problems with this toolchain or my windows environment.
> 

So it looks like for proper Rust support on Windows, we'd either need to
teach the phony iconv about utf-32 -> utf-8 conversion, or you have to
link GDB with the real iconv.

Thanks,
Pedro Alves
Sergio Durigan Junior July 6, 2017, 3:34 p.m. UTC | #9
On Wednesday, July 05 2017, Anton Kolesov wrote:

>> >>
>> >> Did you run regression test on x86-linux?  If there is no regression,
>> >> patches is good to me.
>> >
>> > If I run "make check-gdb", I don't see any obvious new errors from this
>> patch.
>> > Unfortunately results are a little bit volatile - some tests
>> > sporadically fail even if I run them with same GDB build and sources,
>> > even without this patch - I've run testsuite five times and got five similar,
>> but different results.
>> 
>> Yeah, our testsuite has racy fails which are well known.  What are the tests
>> that fail sporadically?
>
> - gdb.base/checkpoint-ns.exp: break
> - gdb.base/checkpoint.exp: break2 with many checkpoints
> - gdb.btrace/exception.exp: indented
> - Several consequtive tests in gdb.btrace/rn-dl-bind.exp

These don't ring any bells for me, but since you're testing on MingW, it
may very well be that they're racy tests on this platform as well.  My
take is that if you can reproduce the exact failures without your patch,
then you can discard them as racy.

> - gdb.threads/process-dies-while-handling-bp.exp: non_stop=off (KFAIL became
> PASS with my patch).

This one is a known racy test.

Thanks,
Yao Qi July 7, 2017, 8:23 a.m. UTC | #10
Anton Kolesov <Anton.Kolesov@synopsys.com> writes:

> If I run "make check-gdb", I don't see any obvious new errors from this patch.
> Unfortunately results are a little bit volatile - some tests
> sporadically fail even
> if I run them with same GDB build and sources, even without this patch
> - I've run
> testsuite five times and got five similar, but different results.
>

They are not regressions to me.

> Selftests pass on x86_64-linux. On Windows with this patch there is a failure in
> iconv sefltest, which seems unrelated (was present even when I've tried to use
> putenv directly instead of importing gnulib module). 

Thanks for running tests on Windows.  Your patch is safe to go in.
Please push it in.
Anton Kolesov July 7, 2017, 9:35 a.m. UTC | #11
> They are not regressions to me.

> 

> > Selftests pass on x86_64-linux. On Windows with this patch there is a

> > failure in iconv sefltest, which seems unrelated (was present even

> > when I've tried to use putenv directly instead of importing gnulib module).

> 

> Thanks for running tests on Windows.  Your patch is safe to go in.

> Please push it in.


Just to be clear, I've run regression tests on a Linux system, on Windows I've run
only the selftests. 

Anton


> 

> --

> Yao (齐尧)
diff mbox

Patch

diff --git a/gdb/gnulib/aclocal.m4 b/gdb/gnulib/aclocal.m4
index cd0dd5d..a4ce6a6 100644
--- a/gdb/gnulib/aclocal.m4
+++ b/gdb/gnulib/aclocal.m4
@@ -1023,6 +1023,7 @@  m4_include([import/m4/dirfd.m4])
 m4_include([import/m4/dirname.m4])
 m4_include([import/m4/double-slash-root.m4])
 m4_include([import/m4/eealloc.m4])
+m4_include([import/m4/environ.m4])
 m4_include([import/m4/errno_h.m4])
 m4_include([import/m4/exponentd.m4])
 m4_include([import/m4/exponentl.m4])
@@ -1071,6 +1072,7 @@  m4_include([import/m4/rawmemchr.m4])
 m4_include([import/m4/readlink.m4])
 m4_include([import/m4/rename.m4])
 m4_include([import/m4/rmdir.m4])
+m4_include([import/m4/setenv.m4])
 m4_include([import/m4/signal_h.m4])
 m4_include([import/m4/ssize_t.m4])
 m4_include([import/m4/stat.m4])
diff --git a/gdb/gnulib/config.in b/gdb/gnulib/config.in
index 057b12d..6061520 100644
--- a/gdb/gnulib/config.in
+++ b/gdb/gnulib/config.in
@@ -95,6 +95,9 @@ 
 /* Define to 1 when the gnulib module dirfd should be tested. */
 #undef GNULIB_TEST_DIRFD
 
+/* Define to 1 when the gnulib module environ should be tested. */
+#undef GNULIB_TEST_ENVIRON
+
 /* Define to 1 when the gnulib module frexp should be tested. */
 #undef GNULIB_TEST_FREXP
 
@@ -140,6 +143,9 @@ 
 /* Define to 1 when the gnulib module rmdir should be tested. */
 #undef GNULIB_TEST_RMDIR
 
+/* Define to 1 when the gnulib module setenv should be tested. */
+#undef GNULIB_TEST_SETENV
+
 /* Define to 1 when the gnulib module stat should be tested. */
 #undef GNULIB_TEST_STAT
 
@@ -152,6 +158,9 @@ 
 /* Define to 1 when the gnulib module strtok_r should be tested. */
 #undef GNULIB_TEST_STRTOK_R
 
+/* Define to 1 when the gnulib module unsetenv should be tested. */
+#undef GNULIB_TEST_UNSETENV
+
 /* Define to 1 if you have 'alloca' after including <alloca.h>, a header that
    may be supplied by this distribution. */
 #undef HAVE_ALLOCA
@@ -201,6 +210,10 @@ 
    */
 #undef HAVE_DECL_MEMMEM
 
+/* Define to 1 if you have the declaration of `setenv', and to 0 if you don't.
+   */
+#undef HAVE_DECL_SETENV
+
 /* Define to 1 if you have the declaration of `strtok_r', and to 0 if you
    don't. */
 #undef HAVE_DECL_STRTOK_R
@@ -209,12 +222,19 @@ 
    don't. */
 #undef HAVE_DECL_TOWLOWER
 
+/* Define to 1 if you have the declaration of `unsetenv', and to 0 if you
+   don't. */
+#undef HAVE_DECL_UNSETENV
+
 /* Define to 1 if you have the <dirent.h> header file. */
 #undef HAVE_DIRENT_H
 
 /* Define to 1 if you have the `dirfd' function. */
 #undef HAVE_DIRFD
 
+/* Define if you have the declaration of environ. */
+#undef HAVE_ENVIRON_DECL
+
 /* Define to 1 if you have the <features.h> header file. */
 #undef HAVE_FEATURES_H
 
@@ -1126,6 +1146,12 @@ 
 /* Define to 1 if 'long double' and 'double' have the same representation. */
 #undef HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
 
+/* Define to 1 if you have the <search.h> header file. */
+#undef HAVE_SEARCH_H
+
+/* Define to 1 if you have the `setenv' function. */
+#undef HAVE_SETENV
+
 /* Define to 1 if 'sig_atomic_t' is a signed integer type. */
 #undef HAVE_SIGNED_SIG_ATOMIC_T
 
@@ -1189,9 +1215,15 @@ 
 /* Define to 1 if you have the `towlower' function. */
 #undef HAVE_TOWLOWER
 
+/* Define to 1 if you have the `tsearch' function. */
+#undef HAVE_TSEARCH
+
 /* Define to 1 if you have the <unistd.h> header file. */
 #undef HAVE_UNISTD_H
 
+/* Define to 1 if you have the `unsetenv' function. */
+#undef HAVE_UNSETENV
+
 /* Define to 1 if the system has the type 'unsigned long long int'. */
 #undef HAVE_UNSIGNED_LONG_LONG_INT
 
@@ -1407,6 +1439,9 @@ 
 #endif
 
 
+/* Define to 1 if unsetenv returns void instead of int. */
+#undef VOID_UNSETENV
+
 /* Define to l, ll, u, ul, ull, etc., as suitable for constants of type
    'wchar_t'. */
 #undef WCHAR_T_SUFFIX
diff --git a/gdb/gnulib/configure b/gdb/gnulib/configure
index d214164..2a0dfc2 100644
--- a/gdb/gnulib/configure
+++ b/gdb/gnulib/configure
@@ -3307,6 +3307,7 @@  as_fn_append ac_func_list " readlink"
 as_fn_append ac_func_list " realpath"
 as_fn_append ac_header_list " sys/param.h"
 as_fn_append ac_header_list " dirent.h"
+as_fn_append ac_header_list " unistd.h"
 as_fn_append ac_func_list " btowc"
 as_fn_append ac_func_list " isblank"
 as_fn_append ac_func_list " iswctype"
@@ -3324,7 +3325,6 @@  as_fn_append ac_header_list " limits.h"
 as_fn_append ac_header_list " wchar.h"
 as_fn_append ac_header_list " stdint.h"
 as_fn_append ac_header_list " inttypes.h"
-as_fn_append ac_header_list " unistd.h"
 as_fn_append ac_func_list " symlink"
 as_fn_append ac_func_list " lstat"
 as_fn_append ac_header_list " math.h"
@@ -3333,6 +3333,7 @@  as_fn_append ac_func_list " mbrtowc"
 as_fn_append ac_header_list " sys/mman.h"
 as_fn_append ac_func_list " mprotect"
 as_fn_append ac_func_list " link"
+as_fn_append ac_func_list " setenv"
 as_fn_append ac_header_list " sys/stat.h"
 as_fn_append ac_header_list " features.h"
 as_fn_append ac_func_list " iswcntrl"
@@ -5311,6 +5312,7 @@  fi
   # Code from module dirname-lgpl:
   # Code from module dosname:
   # Code from module double-slash-root:
+  # Code from module environ:
   # Code from module errno:
   # Code from module extensions:
   # Code from module extern-inline:
@@ -5352,6 +5354,7 @@  fi
   # Code from module rename:
   # Code from module rmdir:
   # Code from module same-inode:
+  # Code from module setenv:
   # Code from module signal-h:
   # Code from module snippet/_Noreturn:
   # Code from module snippet/arg-nonnull:
@@ -5376,6 +5379,7 @@  fi
   # Code from module sys_types:
   # Code from module time:
   # Code from module unistd:
+  # Code from module unsetenv:
   # Code from module update-copyright:
   # Code from module verify:
   # Code from module wchar:
@@ -6826,6 +6830,59 @@  $as_echo "$gl_cv_pragma_columns" >&6; }
 
 
 
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if environ is properly declared" >&5
+$as_echo_n "checking if environ is properly declared... " >&6; }
+  if test "${gt_cv_var_environ_declaration+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#if HAVE_UNISTD_H
+     #include <unistd.h>
+     #endif
+     /* mingw, BeOS, Haiku declare environ in <stdlib.h>, not in <unistd.h>.  */
+     #include <stdlib.h>
+
+           extern struct { int foo; } environ;
+int
+main ()
+{
+environ.foo = 1;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  gt_cv_var_environ_declaration=no
+else
+  gt_cv_var_environ_declaration=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_var_environ_declaration" >&5
+$as_echo "$gt_cv_var_environ_declaration" >&6; }
+  if test $gt_cv_var_environ_declaration = yes; then
+
+$as_echo "#define HAVE_ENVIRON_DECL 1" >>confdefs.h
+
+  fi
+
+
+  if test $gt_cv_var_environ_declaration != yes; then
+    HAVE_DECL_ENVIRON=0
+  fi
+
+
+
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for complete errno.h" >&5
 $as_echo_n "checking for complete errno.h... " >&6; }
 if test "${gl_cv_header_errno_h_complete+set}" = set; then :
@@ -9919,8 +9976,6 @@  $as_echo "#define HAVE_LANGINFO_CODESET 1" >>confdefs.h
 
 
 
-
-
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working fcntl.h" >&5
 $as_echo_n "checking for working fcntl.h... " >&6; }
 if test "${gl_cv_header_working_fcntl_h+set}" = set; then :
@@ -11411,6 +11466,55 @@  $as_echo "$gl_cv_func_memmem_works_always" >&6; }
 
 
 
+ac_fn_c_check_decl "$LINENO" "setenv" "ac_cv_have_decl_setenv" "$ac_includes_default"
+if test "x$ac_cv_have_decl_setenv" = x""yes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_SETENV $ac_have_decl
+_ACEOF
+
+
+
+
+
+
+  if test $ac_cv_have_decl_setenv = no; then
+    HAVE_DECL_SETENV=0
+  fi
+
+
+
+
+
+  for ac_header in search.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "search.h" "ac_cv_header_search_h" "$ac_includes_default"
+if test "x$ac_cv_header_search_h" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_SEARCH_H 1
+_ACEOF
+
+fi
+
+done
+
+  for ac_func in tsearch
+do :
+  ac_fn_c_check_func "$LINENO" "tsearch" "ac_cv_func_tsearch"
+if test "x$ac_cv_func_tsearch" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_TSEARCH 1
+_ACEOF
+
+fi
+done
+
+
+
 
   GNULIB_PTHREAD_SIGMASK=0;
   GNULIB_RAISE=0;
@@ -12246,6 +12350,17 @@  $as_echo "$gl_cv_next_time_h" >&6; }
 
 
 
+ac_fn_c_check_decl "$LINENO" "unsetenv" "ac_cv_have_decl_unsetenv" "$ac_includes_default"
+if test "x$ac_cv_have_decl_unsetenv" = x""yes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_UNSETENV $ac_have_decl
+_ACEOF
+
 
             { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether <wchar.h> uses 'inline' correctly" >&5
 $as_echo_n "checking whether <wchar.h> uses 'inline' correctly... " >&6; }
@@ -12917,6 +13032,22 @@  $as_echo "#define DOUBLE_SLASH_IS_DISTINCT_ROOT 1" >>confdefs.h
 
 
 
+
+
+
+          GNULIB_ENVIRON=1
+
+
+
+
+
+$as_echo "#define GNULIB_TEST_ENVIRON 1" >>confdefs.h
+
+
+
+
+
+
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for flexible array member" >&5
 $as_echo_n "checking for flexible array member... " >&6; }
 if test "${ac_cv_c_flexmember+set}" = set; then :
@@ -17099,6 +17230,102 @@  $as_echo "#define GNULIB_TEST_RMDIR 1" >>confdefs.h
 
 
 
+     if test $ac_cv_func_setenv = no; then
+    HAVE_SETENV=0
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether setenv validates arguments" >&5
+$as_echo_n "checking whether setenv validates arguments... " >&6; }
+if test "${gl_cv_func_setenv_works+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "$cross_compiling" = yes; then :
+  case "$host_os" in
+                 # Guess yes on glibc systems.
+         *-gnu*) gl_cv_func_setenv_works="guessing yes" ;;
+                 # If we don't know, assume the worst.
+         *)      gl_cv_func_setenv_works="guessing no" ;;
+       esac
+
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+       #include <stdlib.h>
+       #include <errno.h>
+       #include <string.h>
+
+int
+main ()
+{
+
+       int result = 0;
+       {
+         if (setenv ("", "", 0) != -1)
+           result |= 1;
+         else if (errno != EINVAL)
+           result |= 2;
+       }
+       {
+         if (setenv ("a", "=", 1) != 0)
+           result |= 4;
+         else if (strcmp (getenv ("a"), "=") != 0)
+           result |= 8;
+       }
+       return result;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  gl_cv_func_setenv_works=yes
+else
+  gl_cv_func_setenv_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_setenv_works" >&5
+$as_echo "$gl_cv_func_setenv_works" >&6; }
+    case "$gl_cv_func_setenv_works" in
+      *yes) ;;
+      *)
+        REPLACE_SETENV=1
+        ;;
+    esac
+  fi
+
+  if test $HAVE_SETENV = 0 || test $REPLACE_SETENV = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS setenv.$ac_objext"
+
+  fi
+
+
+
+
+
+          GNULIB_SETENV=1
+
+
+
+
+
+$as_echo "#define GNULIB_TEST_SETENV 1" >>confdefs.h
+
+
+
+
+
 
 
 
@@ -18642,6 +18869,164 @@  fi
 
 
 
+  if test $ac_cv_have_decl_unsetenv = no; then
+    HAVE_DECL_UNSETENV=0
+  fi
+  for ac_func in unsetenv
+do :
+  ac_fn_c_check_func "$LINENO" "unsetenv" "ac_cv_func_unsetenv"
+if test "x$ac_cv_func_unsetenv" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_UNSETENV 1
+_ACEOF
+
+fi
+done
+
+  if test $ac_cv_func_unsetenv = no; then
+    HAVE_UNSETENV=0
+  else
+    HAVE_UNSETENV=1
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for unsetenv() return type" >&5
+$as_echo_n "checking for unsetenv() return type... " >&6; }
+if test "${gt_cv_func_unsetenv_ret+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#undef _BSD
+#define _BSD 1 /* unhide unsetenv declaration in OSF/1 5.1 <stdlib.h> */
+#include <stdlib.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+int unsetenv (const char *name);
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  gt_cv_func_unsetenv_ret='int'
+else
+  gt_cv_func_unsetenv_ret='void'
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_unsetenv_ret" >&5
+$as_echo "$gt_cv_func_unsetenv_ret" >&6; }
+    if test $gt_cv_func_unsetenv_ret = 'void'; then
+
+$as_echo "#define VOID_UNSETENV 1" >>confdefs.h
+
+      REPLACE_UNSETENV=1
+    fi
+
+                { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether unsetenv obeys POSIX" >&5
+$as_echo_n "checking whether unsetenv obeys POSIX... " >&6; }
+if test "${gl_cv_func_unsetenv_works+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "$cross_compiling" = yes; then :
+  case "$host_os" in
+                 # Guess yes on glibc systems.
+         *-gnu*) gl_cv_func_unsetenv_works="guessing yes" ;;
+                 # If we don't know, assume the worst.
+         *)      gl_cv_func_unsetenv_works="guessing no" ;;
+       esac
+
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+       #include <stdlib.h>
+       #include <errno.h>
+       extern char **environ;
+
+int
+main ()
+{
+
+       char entry1[] = "a=1";
+       char entry2[] = "b=2";
+       char *env[] = { entry1, entry2, NULL };
+       if (putenv ((char *) "a=1")) return 1;
+       if (putenv (entry2)) return 2;
+       entry2[0] = 'a';
+       unsetenv ("a");
+       if (getenv ("a")) return 3;
+       if (!unsetenv ("") || errno != EINVAL) return 4;
+       entry2[0] = 'b';
+       environ = env;
+       if (!getenv ("a")) return 5;
+       entry2[0] = 'a';
+       unsetenv ("a");
+       if (getenv ("a")) return 6;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  gl_cv_func_unsetenv_works=yes
+else
+  gl_cv_func_unsetenv_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_unsetenv_works" >&5
+$as_echo "$gl_cv_func_unsetenv_works" >&6; }
+    case "$gl_cv_func_unsetenv_works" in
+      *yes) ;;
+      *)
+        REPLACE_UNSETENV=1
+        ;;
+    esac
+  fi
+
+  if test $HAVE_UNSETENV = 0 || test $REPLACE_UNSETENV = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS unsetenv.$ac_objext"
+
+
+
+
+
+  fi
+
+
+
+
+
+          GNULIB_UNSETENV=1
+
+
+
+
+
+$as_echo "#define GNULIB_TEST_UNSETENV 1" >>confdefs.h
+
+
+
+
+
+
 
 
 
diff --git a/gdb/gnulib/import/Makefile.am b/gdb/gnulib/import/Makefile.am
index baa03a5..26f249d 100644
--- a/gdb/gnulib/import/Makefile.am
+++ b/gdb/gnulib/import/Makefile.am
@@ -21,7 +21,7 @@ 
 # the same distribution terms as the rest of that program.
 #
 # Generated by gnulib-tool.
-# Reproduce by: gnulib-tool --import --lib=libgnu --source-base=import --m4-base=import/m4 --doc-base=doc --tests-base=tests --aux-dir=import/extra --no-conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files alloca canonicalize-lgpl dirent dirfd errno fnmatch-gnu frexpl inttypes limits-h lstat memchr memmem pathmax rawmemchr readlink rename signal-h strchrnul strstr strtok_r sys_stat unistd update-copyright wchar wctype-h
+# Reproduce by: gnulib-tool --import --lib=libgnu --source-base=import --m4-base=import/m4 --doc-base=doc --tests-base=tests --aux-dir=import/extra --no-conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files alloca canonicalize-lgpl dirent dirfd errno fnmatch-gnu frexpl inttypes limits-h lstat memchr memmem pathmax rawmemchr readlink rename setenv signal-h strchrnul strstr strtok_r sys_stat unistd unsetenv update-copyright wchar wctype-h
 
 AUTOMAKE_OPTIONS = 1.9.6 gnits
 
@@ -928,6 +928,15 @@  EXTRA_DIST += same-inode.h
 
 ## end   gnulib module same-inode
 
+## begin gnulib module setenv
+
+
+EXTRA_DIST += setenv.c
+
+EXTRA_libgnu_a_SOURCES += setenv.c
+
+## end   gnulib module setenv
+
 ## begin gnulib module signal-h
 
 BUILT_SOURCES += signal.h
@@ -1862,6 +1871,15 @@  EXTRA_DIST += unistd.in.h
 
 ## end   gnulib module unistd
 
+## begin gnulib module unsetenv
+
+
+EXTRA_DIST += unsetenv.c
+
+EXTRA_libgnu_a_SOURCES += unsetenv.c
+
+## end   gnulib module unsetenv
+
 ## begin gnulib module update-copyright
 
 
diff --git a/gdb/gnulib/import/Makefile.in b/gdb/gnulib/import/Makefile.in
index d45d7ea..ca7a73d 100644
--- a/gdb/gnulib/import/Makefile.in
+++ b/gdb/gnulib/import/Makefile.in
@@ -36,7 +36,7 @@ 
 # the same distribution terms as the rest of that program.
 #
 # Generated by gnulib-tool.
-# Reproduce by: gnulib-tool --import --lib=libgnu --source-base=import --m4-base=import/m4 --doc-base=doc --tests-base=tests --aux-dir=import/extra --no-conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files alloca canonicalize-lgpl dirent dirfd errno fnmatch-gnu frexpl inttypes limits-h lstat memchr memmem pathmax rawmemchr readlink rename signal-h strchrnul strstr strtok_r sys_stat unistd update-copyright wchar wctype-h
+# Reproduce by: gnulib-tool --import --lib=libgnu --source-base=import --m4-base=import/m4 --doc-base=doc --tests-base=tests --aux-dir=import/extra --no-conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files alloca canonicalize-lgpl dirent dirfd errno fnmatch-gnu frexpl inttypes limits-h lstat memchr memmem pathmax rawmemchr readlink rename setenv signal-h strchrnul strstr strtok_r sys_stat unistd unsetenv update-copyright wchar wctype-h
 
 
 
@@ -74,6 +74,7 @@  am__aclocal_m4_deps = $(top_srcdir)/import/m4/00gnulib.m4 \
 	$(top_srcdir)/import/m4/dirname.m4 \
 	$(top_srcdir)/import/m4/double-slash-root.m4 \
 	$(top_srcdir)/import/m4/eealloc.m4 \
+	$(top_srcdir)/import/m4/environ.m4 \
 	$(top_srcdir)/import/m4/errno_h.m4 \
 	$(top_srcdir)/import/m4/exponentd.m4 \
 	$(top_srcdir)/import/m4/exponentl.m4 \
@@ -122,6 +123,7 @@  am__aclocal_m4_deps = $(top_srcdir)/import/m4/00gnulib.m4 \
 	$(top_srcdir)/import/m4/readlink.m4 \
 	$(top_srcdir)/import/m4/rename.m4 \
 	$(top_srcdir)/import/m4/rmdir.m4 \
+	$(top_srcdir)/import/m4/setenv.m4 \
 	$(top_srcdir)/import/m4/signal_h.m4 \
 	$(top_srcdir)/import/m4/ssize_t.m4 \
 	$(top_srcdir)/import/m4/stat.m4 \
@@ -1289,7 +1291,7 @@  EXTRA_DIST = m4/gnulib-cache.m4 alloca.c alloca.in.h \
 	mbrtowc.c mbsinit.c mbsrtowcs-impl.h mbsrtowcs-state.c \
 	mbsrtowcs.c memchr.c memchr.valgrind memmem.c str-two-way.h \
 	pathmax.h rawmemchr.c rawmemchr.valgrind readlink.c rename.c \
-	rmdir.c same-inode.h signal.in.h \
+	rmdir.c same-inode.h setenv.c signal.in.h \
 	$(top_srcdir)/import/extra/snippet/_Noreturn.h \
 	$(top_srcdir)/import/extra/snippet/arg-nonnull.h \
 	$(top_srcdir)/import/extra/snippet/c++defs.h \
@@ -1297,7 +1299,7 @@  EXTRA_DIST = m4/gnulib-cache.m4 alloca.c alloca.in.h \
 	stdbool.in.h stddef.in.h stdint.in.h stdio.in.h stdlib.in.h \
 	strchrnul.c strchrnul.valgrind streq.h string.in.h \
 	str-two-way.h strstr.c strtok_r.c sys_stat.in.h sys_time.in.h \
-	sys_types.in.h time.in.h unistd.in.h \
+	sys_types.in.h time.in.h unistd.in.h unsetenv.c \
 	$(top_srcdir)/import/extra/update-copyright verify.h \
 	wchar.in.h wctype.in.h
 
@@ -1343,7 +1345,7 @@  EXTRA_libgnu_a_SOURCES = alloca.c canonicalize-lgpl.c dirfd.c float.c \
 	gettimeofday.c isnan.c isnand.c isnan.c isnanl.c lstat.c \
 	malloc.c mbrtowc.c mbsinit.c mbsrtowcs-state.c mbsrtowcs.c \
 	memchr.c memmem.c rawmemchr.c readlink.c rename.c rmdir.c \
-	stat.c strchrnul.c strstr.c strtok_r.c
+	setenv.c stat.c strchrnul.c strstr.c strtok_r.c unsetenv.c
 
 # Use this preprocessor expression to decide whether #include_next works.
 # Do not rely on a 'configure'-time test for this, since the expression
@@ -1449,6 +1451,7 @@  distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/readlink.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rename.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rmdir.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/setenv.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stat.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strchrnul.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stripslash.Po@am__quote@
@@ -1456,6 +1459,7 @@  distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strstr.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strtok_r.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unistd.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unsetenv.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wctype-h.Po@am__quote@
 
 .c.o:
diff --git a/gdb/gnulib/import/m4/environ.m4 b/gdb/gnulib/import/m4/environ.m4
new file mode 100644
index 0000000..9a0ea7e
--- /dev/null
+++ b/gdb/gnulib/import/m4/environ.m4
@@ -0,0 +1,47 @@ 
+# environ.m4 serial 6
+dnl Copyright (C) 2001-2004, 2006-2016 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN_ONCE([gl_ENVIRON],
+[
+  AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+  dnl Persuade glibc <unistd.h> to declare environ.
+  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+  AC_CHECK_HEADERS_ONCE([unistd.h])
+  gt_CHECK_VAR_DECL(
+    [#if HAVE_UNISTD_H
+     #include <unistd.h>
+     #endif
+     /* mingw, BeOS, Haiku declare environ in <stdlib.h>, not in <unistd.h>.  */
+     #include <stdlib.h>
+    ],
+    [environ])
+  if test $gt_cv_var_environ_declaration != yes; then
+    HAVE_DECL_ENVIRON=0
+  fi
+])
+
+# Check if a variable is properly declared.
+# gt_CHECK_VAR_DECL(includes,variable)
+AC_DEFUN([gt_CHECK_VAR_DECL],
+[
+  define([gt_cv_var], [gt_cv_var_]$2[_declaration])
+  AC_MSG_CHECKING([if $2 is properly declared])
+  AC_CACHE_VAL([gt_cv_var], [
+    AC_COMPILE_IFELSE(
+      [AC_LANG_PROGRAM(
+         [[$1
+           extern struct { int foo; } $2;]],
+         [[$2.foo = 1;]])],
+      [gt_cv_var=no],
+      [gt_cv_var=yes])])
+  AC_MSG_RESULT([$gt_cv_var])
+  if test $gt_cv_var = yes; then
+    AC_DEFINE([HAVE_]m4_translit($2, [a-z], [A-Z])[_DECL], 1,
+              [Define if you have the declaration of $2.])
+  fi
+  undefine([gt_cv_var])
+])
diff --git a/gdb/gnulib/import/m4/gnulib-cache.m4 b/gdb/gnulib/import/m4/gnulib-cache.m4
index f99e59b..c4ebb73 100644
--- a/gdb/gnulib/import/m4/gnulib-cache.m4
+++ b/gdb/gnulib/import/m4/gnulib-cache.m4
@@ -27,7 +27,7 @@ 
 
 
 # Specification in the form of a command-line invocation:
-#   gnulib-tool --import --lib=libgnu --source-base=import --m4-base=import/m4 --doc-base=doc --tests-base=tests --aux-dir=import/extra --no-conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files alloca canonicalize-lgpl dirent dirfd errno fnmatch-gnu frexpl inttypes limits-h lstat memchr memmem pathmax rawmemchr readlink rename signal-h strchrnul strstr strtok_r sys_stat unistd update-copyright wchar wctype-h
+#   gnulib-tool --import --lib=libgnu --source-base=import --m4-base=import/m4 --doc-base=doc --tests-base=tests --aux-dir=import/extra --no-conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files alloca canonicalize-lgpl dirent dirfd errno fnmatch-gnu frexpl inttypes limits-h lstat memchr memmem pathmax rawmemchr readlink rename setenv signal-h strchrnul strstr strtok_r sys_stat unistd unsetenv update-copyright wchar wctype-h
 
 # Specification in the form of a few gnulib-tool.m4 macro invocations:
 gl_LOCAL_DIR([])
@@ -48,12 +48,14 @@  gl_MODULES([
   rawmemchr
   readlink
   rename
+  setenv
   signal-h
   strchrnul
   strstr
   strtok_r
   sys_stat
   unistd
+  unsetenv
   update-copyright
   wchar
   wctype-h
diff --git a/gdb/gnulib/import/m4/gnulib-comp.m4 b/gdb/gnulib/import/m4/gnulib-comp.m4
index 42d04ed..5a36567 100644
--- a/gdb/gnulib/import/m4/gnulib-comp.m4
+++ b/gdb/gnulib/import/m4/gnulib-comp.m4
@@ -53,6 +53,7 @@  AC_DEFUN([gl_EARLY],
   # Code from module dirname-lgpl:
   # Code from module dosname:
   # Code from module double-slash-root:
+  # Code from module environ:
   # Code from module errno:
   # Code from module extensions:
   # Code from module extern-inline:
@@ -94,6 +95,7 @@  AC_DEFUN([gl_EARLY],
   # Code from module rename:
   # Code from module rmdir:
   # Code from module same-inode:
+  # Code from module setenv:
   # Code from module signal-h:
   # Code from module snippet/_Noreturn:
   # Code from module snippet/arg-nonnull:
@@ -118,6 +120,7 @@  AC_DEFUN([gl_EARLY],
   # Code from module sys_types:
   # Code from module time:
   # Code from module unistd:
+  # Code from module unsetenv:
   # Code from module update-copyright:
   # Code from module verify:
   # Code from module wchar:
@@ -160,6 +163,8 @@  AC_DEFUN([gl_INIT],
   gl_DIRENT_MODULE_INDICATOR([dirfd])
   gl_DIRNAME_LGPL
   gl_DOUBLE_SLASH_ROOT
+  gl_ENVIRON
+  gl_UNISTD_MODULE_INDICATOR([environ])
   gl_HEADER_ERRNO_H
   AC_REQUIRE([gl_EXTERN_INLINE])
   AC_C_FLEXIBLE_ARRAY_MEMBER
@@ -285,6 +290,11 @@  AC_DEFUN([gl_INIT],
     AC_LIBOBJ([rmdir])
   fi
   gl_UNISTD_MODULE_INDICATOR([rmdir])
+  gl_FUNC_SETENV
+  if test $HAVE_SETENV = 0 || test $REPLACE_SETENV = 1; then
+    AC_LIBOBJ([setenv])
+  fi
+  gl_STDLIB_MODULE_INDICATOR([setenv])
   gl_SIGNAL_H
   gt_TYPE_SSIZE_T
   gl_FUNC_STAT
@@ -328,6 +338,12 @@  AC_DEFUN([gl_INIT],
   AC_PROG_MKDIR_P
   gl_HEADER_TIME_H
   gl_UNISTD_H
+  gl_FUNC_UNSETENV
+  if test $HAVE_UNSETENV = 0 || test $REPLACE_UNSETENV = 1; then
+    AC_LIBOBJ([unsetenv])
+    gl_PREREQ_UNSETENV
+  fi
+  gl_STDLIB_MODULE_INDICATOR([unsetenv])
   gl_WCHAR_H
   gl_WCTYPE_H
   # End of code from modules
@@ -533,6 +549,7 @@  AC_DEFUN([gl_FILE_LIST], [
   lib/rename.c
   lib/rmdir.c
   lib/same-inode.h
+  lib/setenv.c
   lib/signal.in.h
   lib/stat.c
   lib/stdbool.in.h
@@ -556,6 +573,7 @@  AC_DEFUN([gl_FILE_LIST], [
   lib/time.in.h
   lib/unistd.c
   lib/unistd.in.h
+  lib/unsetenv.c
   lib/verify.h
   lib/wchar.in.h
   lib/wctype-h.c
@@ -571,6 +589,7 @@  AC_DEFUN([gl_FILE_LIST], [
   m4/dirname.m4
   m4/double-slash-root.m4
   m4/eealloc.m4
+  m4/environ.m4
   m4/errno_h.m4
   m4/exponentd.m4
   m4/exponentl.m4
@@ -618,6 +637,7 @@  AC_DEFUN([gl_FILE_LIST], [
   m4/readlink.m4
   m4/rename.m4
   m4/rmdir.m4
+  m4/setenv.m4
   m4/signal_h.m4
   m4/ssize_t.m4
   m4/stat.m4
diff --git a/gdb/gnulib/import/m4/setenv.m4 b/gdb/gnulib/import/m4/setenv.m4
new file mode 100644
index 0000000..5d49aba
--- /dev/null
+++ b/gdb/gnulib/import/m4/setenv.m4
@@ -0,0 +1,160 @@ 
+# setenv.m4 serial 26
+dnl Copyright (C) 2001-2004, 2006-2016 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_SETENV],
+[
+  AC_REQUIRE([gl_FUNC_SETENV_SEPARATE])
+  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+  if test $ac_cv_func_setenv = no; then
+    HAVE_SETENV=0
+  else
+    AC_CACHE_CHECK([whether setenv validates arguments],
+      [gl_cv_func_setenv_works],
+      [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+       #include <stdlib.h>
+       #include <errno.h>
+       #include <string.h>
+      ]], [[
+       int result = 0;
+       {
+         if (setenv ("", "", 0) != -1)
+           result |= 1;
+         else if (errno != EINVAL)
+           result |= 2;
+       }
+       {
+         if (setenv ("a", "=", 1) != 0)
+           result |= 4;
+         else if (strcmp (getenv ("a"), "=") != 0)
+           result |= 8;
+       }
+       return result;
+      ]])],
+      [gl_cv_func_setenv_works=yes], [gl_cv_func_setenv_works=no],
+      [case "$host_os" in
+                 # Guess yes on glibc systems.
+         *-gnu*) gl_cv_func_setenv_works="guessing yes" ;;
+                 # If we don't know, assume the worst.
+         *)      gl_cv_func_setenv_works="guessing no" ;;
+       esac
+      ])])
+    case "$gl_cv_func_setenv_works" in
+      *yes) ;;
+      *)
+        REPLACE_SETENV=1
+        ;;
+    esac
+  fi
+])
+
+# Like gl_FUNC_SETENV, except prepare for separate compilation
+# (no REPLACE_SETENV, no AC_LIBOBJ).
+AC_DEFUN([gl_FUNC_SETENV_SEPARATE],
+[
+  AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+  AC_CHECK_DECLS_ONCE([setenv])
+  if test $ac_cv_have_decl_setenv = no; then
+    HAVE_DECL_SETENV=0
+  fi
+  AC_CHECK_FUNCS_ONCE([setenv])
+  gl_PREREQ_SETENV
+])
+
+AC_DEFUN([gl_FUNC_UNSETENV],
+[
+  AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+  AC_CHECK_DECLS_ONCE([unsetenv])
+  if test $ac_cv_have_decl_unsetenv = no; then
+    HAVE_DECL_UNSETENV=0
+  fi
+  AC_CHECK_FUNCS([unsetenv])
+  if test $ac_cv_func_unsetenv = no; then
+    HAVE_UNSETENV=0
+  else
+    HAVE_UNSETENV=1
+    dnl Some BSDs return void, failing to do error checking.
+    AC_CACHE_CHECK([for unsetenv() return type], [gt_cv_func_unsetenv_ret],
+      [AC_COMPILE_IFELSE(
+         [AC_LANG_PROGRAM(
+            [[
+#undef _BSD
+#define _BSD 1 /* unhide unsetenv declaration in OSF/1 5.1 <stdlib.h> */
+#include <stdlib.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+int unsetenv (const char *name);
+            ]],
+            [[]])],
+         [gt_cv_func_unsetenv_ret='int'],
+         [gt_cv_func_unsetenv_ret='void'])])
+    if test $gt_cv_func_unsetenv_ret = 'void'; then
+      AC_DEFINE([VOID_UNSETENV], [1], [Define to 1 if unsetenv returns void
+       instead of int.])
+      REPLACE_UNSETENV=1
+    fi
+
+    dnl Solaris 10 unsetenv does not remove all copies of a name.
+    dnl Haiku alpha 2 unsetenv gets confused by assignment to environ.
+    dnl OpenBSD 4.7 unsetenv("") does not fail.
+    AC_CACHE_CHECK([whether unsetenv obeys POSIX],
+      [gl_cv_func_unsetenv_works],
+      [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+       #include <stdlib.h>
+       #include <errno.h>
+       extern char **environ;
+      ]], [[
+       char entry1[] = "a=1";
+       char entry2[] = "b=2";
+       char *env[] = { entry1, entry2, NULL };
+       if (putenv ((char *) "a=1")) return 1;
+       if (putenv (entry2)) return 2;
+       entry2[0] = 'a';
+       unsetenv ("a");
+       if (getenv ("a")) return 3;
+       if (!unsetenv ("") || errno != EINVAL) return 4;
+       entry2[0] = 'b';
+       environ = env;
+       if (!getenv ("a")) return 5;
+       entry2[0] = 'a';
+       unsetenv ("a");
+       if (getenv ("a")) return 6;
+      ]])],
+      [gl_cv_func_unsetenv_works=yes], [gl_cv_func_unsetenv_works=no],
+      [case "$host_os" in
+                 # Guess yes on glibc systems.
+         *-gnu*) gl_cv_func_unsetenv_works="guessing yes" ;;
+                 # If we don't know, assume the worst.
+         *)      gl_cv_func_unsetenv_works="guessing no" ;;
+       esac
+      ])])
+    case "$gl_cv_func_unsetenv_works" in
+      *yes) ;;
+      *)
+        REPLACE_UNSETENV=1
+        ;;
+    esac
+  fi
+])
+
+# Prerequisites of lib/setenv.c.
+AC_DEFUN([gl_PREREQ_SETENV],
+[
+  AC_REQUIRE([AC_FUNC_ALLOCA])
+  AC_REQUIRE([gl_ENVIRON])
+  AC_CHECK_HEADERS_ONCE([unistd.h])
+  AC_CHECK_HEADERS([search.h])
+  AC_CHECK_FUNCS([tsearch])
+])
+
+# Prerequisites of lib/unsetenv.c.
+AC_DEFUN([gl_PREREQ_UNSETENV],
+[
+  AC_REQUIRE([gl_ENVIRON])
+  AC_CHECK_HEADERS_ONCE([unistd.h])
+])
diff --git a/gdb/gnulib/import/setenv.c b/gdb/gnulib/import/setenv.c
new file mode 100644
index 0000000..85c32cb
--- /dev/null
+++ b/gdb/gnulib/import/setenv.c
@@ -0,0 +1,390 @@ 
+/* Copyright (C) 1992, 1995-2003, 2005-2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   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/>.  */
+
+#if !_LIBC
+/* Don't use __attribute__ __nonnull__ in this compilation unit.  Otherwise gcc
+   optimizes away the name == NULL test below.  */
+# define _GL_ARG_NONNULL(params)
+
+# define _GL_USE_STDLIB_ALLOC 1
+# include <config.h>
+#endif
+
+#include <alloca.h>
+
+/* Specification.  */
+#include <stdlib.h>
+
+#include <errno.h>
+#ifndef __set_errno
+# define __set_errno(ev) ((errno) = (ev))
+#endif
+
+#include <string.h>
+#if _LIBC || HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#if !_LIBC
+# include "malloca.h"
+#endif
+
+#if _LIBC || !HAVE_SETENV
+
+#if !_LIBC
+# define __environ      environ
+#endif
+
+#if _LIBC
+/* This lock protects against simultaneous modifications of 'environ'.  */
+# include <bits/libc-lock.h>
+__libc_lock_define_initialized (static, envlock)
+# define LOCK   __libc_lock_lock (envlock)
+# define UNLOCK __libc_lock_unlock (envlock)
+#else
+# define LOCK
+# define UNLOCK
+#endif
+
+/* In the GNU C library we must keep the namespace clean.  */
+#ifdef _LIBC
+# define setenv __setenv
+# define clearenv __clearenv
+# define tfind __tfind
+# define tsearch __tsearch
+#endif
+
+/* In the GNU C library implementation we try to be more clever and
+   allow arbitrarily many changes of the environment given that the used
+   values are from a small set.  Outside glibc this will eat up all
+   memory after a while.  */
+#if defined _LIBC || (defined HAVE_SEARCH_H && defined HAVE_TSEARCH \
+                      && defined __GNUC__)
+# define USE_TSEARCH    1
+# include <search.h>
+typedef int (*compar_fn_t) (const void *, const void *);
+
+/* This is a pointer to the root of the search tree with the known
+   values.  */
+static void *known_values;
+
+# define KNOWN_VALUE(Str) \
+  ({                                                                          \
+    void *value = tfind (Str, &known_values, (compar_fn_t) strcmp);           \
+    value != NULL ? *(char **) value : NULL;                                  \
+  })
+# define STORE_VALUE(Str) \
+  tsearch (Str, &known_values, (compar_fn_t) strcmp)
+
+#else
+# undef USE_TSEARCH
+
+# define KNOWN_VALUE(Str) NULL
+# define STORE_VALUE(Str) do { } while (0)
+
+#endif
+
+
+/* If this variable is not a null pointer we allocated the current
+   environment.  */
+static char **last_environ;
+
+
+/* This function is used by 'setenv' and 'putenv'.  The difference between
+   the two functions is that for the former must create a new string which
+   is then placed in the environment, while the argument of 'putenv'
+   must be used directly.  This is all complicated by the fact that we try
+   to reuse values once generated for a 'setenv' call since we can never
+   free the strings.  */
+int
+__add_to_environ (const char *name, const char *value, const char *combined,
+                  int replace)
+{
+  char **ep;
+  size_t size;
+  const size_t namelen = strlen (name);
+  const size_t vallen = value != NULL ? strlen (value) + 1 : 0;
+
+  LOCK;
+
+  /* We have to get the pointer now that we have the lock and not earlier
+     since another thread might have created a new environment.  */
+  ep = __environ;
+
+  size = 0;
+  if (ep != NULL)
+    {
+      for (; *ep != NULL; ++ep)
+        if (!strncmp (*ep, name, namelen) && (*ep)[namelen] == '=')
+          break;
+        else
+          ++size;
+    }
+
+  if (ep == NULL || *ep == NULL)
+    {
+      char **new_environ;
+#ifdef USE_TSEARCH
+      char *new_value;
+#endif
+
+      /* We allocated this space; we can extend it.  */
+      new_environ =
+        (char **) (last_environ == NULL
+                   ? malloc ((size + 2) * sizeof (char *))
+                   : realloc (last_environ, (size + 2) * sizeof (char *)));
+      if (new_environ == NULL)
+        {
+          /* It's easier to set errno to ENOMEM than to rely on the
+             'malloc-posix' and 'realloc-posix' gnulib modules.  */
+          __set_errno (ENOMEM);
+          UNLOCK;
+          return -1;
+        }
+
+      /* If the whole entry is given add it.  */
+      if (combined != NULL)
+        /* We must not add the string to the search tree since it belongs
+           to the user.  */
+        new_environ[size] = (char *) combined;
+      else
+        {
+          /* See whether the value is already known.  */
+#ifdef USE_TSEARCH
+# ifdef _LIBC
+          new_value = (char *) alloca (namelen + 1 + vallen);
+          __mempcpy (__mempcpy (__mempcpy (new_value, name, namelen), "=", 1),
+                     value, vallen);
+# else
+          new_value = (char *) malloca (namelen + 1 + vallen);
+          if (new_value == NULL)
+            {
+              __set_errno (ENOMEM);
+              UNLOCK;
+              return -1;
+            }
+          memcpy (new_value, name, namelen);
+          new_value[namelen] = '=';
+          memcpy (&new_value[namelen + 1], value, vallen);
+# endif
+
+          new_environ[size] = KNOWN_VALUE (new_value);
+          if (new_environ[size] == NULL)
+#endif
+            {
+              new_environ[size] = (char *) malloc (namelen + 1 + vallen);
+              if (new_environ[size] == NULL)
+                {
+#if defined USE_TSEARCH && !defined _LIBC
+                  freea (new_value);
+#endif
+                  __set_errno (ENOMEM);
+                  UNLOCK;
+                  return -1;
+                }
+
+#ifdef USE_TSEARCH
+              memcpy (new_environ[size], new_value, namelen + 1 + vallen);
+#else
+              memcpy (new_environ[size], name, namelen);
+              new_environ[size][namelen] = '=';
+              memcpy (&new_environ[size][namelen + 1], value, vallen);
+#endif
+              /* And save the value now.  We cannot do this when we remove
+                 the string since then we cannot decide whether it is a
+                 user string or not.  */
+              STORE_VALUE (new_environ[size]);
+            }
+#if defined USE_TSEARCH && !defined _LIBC
+          freea (new_value);
+#endif
+        }
+
+      if (__environ != last_environ)
+        memcpy ((char *) new_environ, (char *) __environ,
+                size * sizeof (char *));
+
+      new_environ[size + 1] = NULL;
+
+      last_environ = __environ = new_environ;
+    }
+  else if (replace)
+    {
+      char *np;
+
+      /* Use the user string if given.  */
+      if (combined != NULL)
+        np = (char *) combined;
+      else
+        {
+#ifdef USE_TSEARCH
+          char *new_value;
+# ifdef _LIBC
+          new_value = alloca (namelen + 1 + vallen);
+          __mempcpy (__mempcpy (__mempcpy (new_value, name, namelen), "=", 1),
+                     value, vallen);
+# else
+          new_value = malloca (namelen + 1 + vallen);
+          if (new_value == NULL)
+            {
+              __set_errno (ENOMEM);
+              UNLOCK;
+              return -1;
+            }
+          memcpy (new_value, name, namelen);
+          new_value[namelen] = '=';
+          memcpy (&new_value[namelen + 1], value, vallen);
+# endif
+
+          np = KNOWN_VALUE (new_value);
+          if (np == NULL)
+#endif
+            {
+              np = (char *) malloc (namelen + 1 + vallen);
+              if (np == NULL)
+                {
+#if defined USE_TSEARCH && !defined _LIBC
+                  freea (new_value);
+#endif
+                  __set_errno (ENOMEM);
+                  UNLOCK;
+                  return -1;
+                }
+
+#ifdef USE_TSEARCH
+              memcpy (np, new_value, namelen + 1 + vallen);
+#else
+              memcpy (np, name, namelen);
+              np[namelen] = '=';
+              memcpy (&np[namelen + 1], value, vallen);
+#endif
+              /* And remember the value.  */
+              STORE_VALUE (np);
+            }
+#if defined USE_TSEARCH && !defined _LIBC
+          freea (new_value);
+#endif
+        }
+
+      *ep = np;
+    }
+
+  UNLOCK;
+
+  return 0;
+}
+
+int
+setenv (const char *name, const char *value, int replace)
+{
+  if (name == NULL || *name == '\0' || strchr (name, '=') != NULL)
+    {
+      __set_errno (EINVAL);
+      return -1;
+    }
+
+  return __add_to_environ (name, value, NULL, replace);
+}
+
+/* The 'clearenv' was planned to be added to POSIX.1 but probably
+   never made it.  Nevertheless the POSIX.9 standard (POSIX bindings
+   for Fortran 77) requires this function.  */
+int
+clearenv (void)
+{
+  LOCK;
+
+  if (__environ == last_environ && __environ != NULL)
+    {
+      /* We allocated this environment so we can free it.  */
+      free (__environ);
+      last_environ = NULL;
+    }
+
+  /* Clear the environment pointer removes the whole environment.  */
+  __environ = NULL;
+
+  UNLOCK;
+
+  return 0;
+}
+
+#ifdef _LIBC
+static void
+free_mem (void)
+{
+  /* Remove all traces.  */
+  clearenv ();
+
+  /* Now remove the search tree.  */
+  __tdestroy (known_values, free);
+  known_values = NULL;
+}
+text_set_element (__libc_subfreeres, free_mem);
+
+
+# undef setenv
+# undef clearenv
+weak_alias (__setenv, setenv)
+weak_alias (__clearenv, clearenv)
+#endif
+
+#endif /* _LIBC || !HAVE_SETENV */
+
+/* The rest of this file is called into use when replacing an existing
+   but buggy setenv.  Known bugs include failure to diagnose invalid
+   name, and consuming a leading '=' from value.  */
+#if HAVE_SETENV
+
+# undef setenv
+# if !HAVE_DECL_SETENV
+extern int setenv (const char *, const char *, int);
+# endif
+# define STREQ(a, b) (strcmp (a, b) == 0)
+
+int
+rpl_setenv (const char *name, const char *value, int replace)
+{
+  int result;
+  if (!name || !*name || strchr (name, '='))
+    {
+      errno = EINVAL;
+      return -1;
+    }
+  /* Call the real setenv even if replace is 0, in case implementation
+     has underlying data to update, such as when environ changes.  */
+  result = setenv (name, value, replace);
+  if (result == 0 && replace && *value == '=')
+    {
+      char *tmp = getenv (name);
+      if (!STREQ (tmp, value))
+        {
+          int saved_errno;
+          size_t len = strlen (value);
+          tmp = malloca (len + 2);
+          /* Since leading '=' is eaten, double it up.  */
+          *tmp = '=';
+          memcpy (tmp + 1, value, len + 1);
+          result = setenv (name, tmp, replace);
+          saved_errno = errno;
+          freea (tmp);
+          errno = saved_errno;
+        }
+    }
+  return result;
+}
+
+#endif /* HAVE_SETENV */
diff --git a/gdb/gnulib/import/unsetenv.c b/gdb/gnulib/import/unsetenv.c
new file mode 100644
index 0000000..8368744
--- /dev/null
+++ b/gdb/gnulib/import/unsetenv.c
@@ -0,0 +1,127 @@ 
+/* Copyright (C) 1992, 1995-2002, 2005-2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   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/>.  */
+
+/* Don't use __attribute__ __nonnull__ in this compilation unit.  Otherwise gcc
+   optimizes away the name == NULL test below.  */
+#define _GL_ARG_NONNULL(params)
+
+#include <config.h>
+
+/* Specification.  */
+#include <stdlib.h>
+
+#include <errno.h>
+#if !_LIBC
+# define __set_errno(ev) ((errno) = (ev))
+#endif
+
+#include <string.h>
+#include <unistd.h>
+
+#if !_LIBC
+# define __environ      environ
+#endif
+
+#if _LIBC
+/* This lock protects against simultaneous modifications of 'environ'.  */
+# include <bits/libc-lock.h>
+__libc_lock_define_initialized (static, envlock)
+# define LOCK   __libc_lock_lock (envlock)
+# define UNLOCK __libc_lock_unlock (envlock)
+#else
+# define LOCK
+# define UNLOCK
+#endif
+
+/* In the GNU C library we must keep the namespace clean.  */
+#ifdef _LIBC
+# define unsetenv __unsetenv
+#endif
+
+#if _LIBC || !HAVE_UNSETENV
+
+int
+unsetenv (const char *name)
+{
+  size_t len;
+  char **ep;
+
+  if (name == NULL || *name == '\0' || strchr (name, '=') != NULL)
+    {
+      __set_errno (EINVAL);
+      return -1;
+    }
+
+  len = strlen (name);
+
+  LOCK;
+
+  ep = __environ;
+  while (*ep != NULL)
+    if (!strncmp (*ep, name, len) && (*ep)[len] == '=')
+      {
+        /* Found it.  Remove this pointer by moving later ones back.  */
+        char **dp = ep;
+
+        do
+          dp[0] = dp[1];
+        while (*dp++);
+        /* Continue the loop in case NAME appears again.  */
+      }
+    else
+      ++ep;
+
+  UNLOCK;
+
+  return 0;
+}
+
+#ifdef _LIBC
+# undef unsetenv
+weak_alias (__unsetenv, unsetenv)
+#endif
+
+#else /* HAVE_UNSETENV */
+
+# undef unsetenv
+# if !HAVE_DECL_UNSETENV
+#  if VOID_UNSETENV
+extern void unsetenv (const char *);
+#  else
+extern int unsetenv (const char *);
+#  endif
+# endif
+
+/* Call the underlying unsetenv, in case there is hidden bookkeeping
+   that needs updating beyond just modifying environ.  */
+int
+rpl_unsetenv (const char *name)
+{
+  int result = 0;
+  if (!name || !*name || strchr (name, '='))
+    {
+      errno = EINVAL;
+      return -1;
+    }
+  while (getenv (name))
+# if !VOID_UNSETENV
+    result =
+# endif
+      unsetenv (name);
+  return result;
+}
+
+#endif /* HAVE_UNSETENV */
diff --git a/gdb/gnulib/update-gnulib.sh b/gdb/gnulib/update-gnulib.sh
index 19d949b..2775dc7 100755
--- a/gdb/gnulib/update-gnulib.sh
+++ b/gdb/gnulib/update-gnulib.sh
@@ -46,12 +46,14 @@  IMPORTED_GNULIB_MODULES="\
     rawmemchr \
     readlink \
     rename \
+    setenv \
     signal-h \
     strchrnul \
     strstr \
     strtok_r \
     sys_stat \
     unistd \
+    unsetenv \
     update-copyright \
     wchar \
     wctype-h \