diff --git a/bfd/Makefile.in b/bfd/Makefile.in index 8d09f6fa4af..cf227d09c27 100644 --- a/bfd/Makefile.in +++ b/bfd/Makefile.in @@ -129,9 +129,9 @@ am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \ $(top_srcdir)/../config/zstd.m4 $(top_srcdir)/../libtool.m4 \ $(top_srcdir)/../ltoptions.m4 $(top_srcdir)/../ltsugar.m4 \ $(top_srcdir)/../ltversion.m4 $(top_srcdir)/../lt~obsolete.m4 \ - $(top_srcdir)/bfd.m4 $(top_srcdir)/warning.m4 \ - $(top_srcdir)/acinclude.m4 $(top_srcdir)/version.m4 \ - $(top_srcdir)/configure.ac + $(top_srcdir)/ax_tls.m4 $(top_srcdir)/bfd.m4 \ + $(top_srcdir)/warning.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/version.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ diff --git a/bfd/aclocal.m4 b/bfd/aclocal.m4 index 09b849dfc87..e0142ae724e 100644 --- a/bfd/aclocal.m4 +++ b/bfd/aclocal.m4 @@ -1187,6 +1187,7 @@ m4_include([../ltoptions.m4]) m4_include([../ltsugar.m4]) m4_include([../ltversion.m4]) m4_include([../lt~obsolete.m4]) +m4_include([ax_tls.m4]) m4_include([bfd.m4]) m4_include([warning.m4]) m4_include([acinclude.m4]) diff --git a/bfd/ax_tls.m4 b/bfd/ax_tls.m4 new file mode 100644 index 00000000000..fb184fe201b --- /dev/null +++ b/bfd/ax_tls.m4 @@ -0,0 +1,71 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_tls.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_TLS([action-if-found], [action-if-not-found]) +# +# DESCRIPTION +# +# Provides a test for the compiler support of thread local storage (TLS) +# extensions. Defines TLS if it is found. Currently knows about C++11, +# GCC/ICC, and MSVC. I think SunPro uses the same as GCC, and Borland +# apparently supports either. +# +# LICENSE +# +# Copyright (c) 2008 Alan Woodland +# Copyright (c) 2010 Diego Elio Petteno` +# +# 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 . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 15 + +AC_DEFUN([AX_TLS], [ + AC_MSG_CHECKING([for thread local storage (TLS) class]) + AC_CACHE_VAL([ac_cv_tls], + [for ax_tls_keyword in thread_local _Thread_local __thread '__declspec(thread)' none; do + AS_CASE([$ax_tls_keyword], + [none], [ac_cv_tls=none ; break], + [AC_COMPILE_IFELSE([AC_LANG_PROGRAM( + [#include ], + [static $ax_tls_keyword int bar;] + )], + [ac_cv_tls=$ax_tls_keyword ; break], + [ac_cv_tls=none] + )] + ) + done ] + ) + AC_MSG_RESULT([$ac_cv_tls]) + + AS_IF([test "$ac_cv_tls" != "none"], + [AC_DEFINE_UNQUOTED([TLS],[$ac_cv_tls],[If the compiler supports a TLS storage class, define it to that here]) + m4_ifnblank([$1],[$1],[[:]])], + [m4_ifnblank([$2],[$2],[[:]])]) +]) diff --git a/bfd/bfd.c b/bfd/bfd.c index 08980ae52b7..2cf8361caa2 100644 --- a/bfd/bfd.c +++ b/bfd/bfd.c @@ -691,6 +691,8 @@ SECTION The easiest way to report a BFD error to the user is to use <>. + The BFD error is thread-local. + SUBSECTION Type <> @@ -728,10 +730,10 @@ CODE_FRAGMENT . */ -static bfd_error_type bfd_error; -static bfd_error_type input_error; -static bfd *input_bfd; -static char *_bfd_error_buf; +static TLS bfd_error_type bfd_error; +static TLS bfd_error_type input_error; +static TLS bfd *input_bfd; +static TLS char *_bfd_error_buf; const char *const bfd_errmsgs[] = { @@ -920,7 +922,7 @@ DESCRIPTION Primarily for error reporting, this function is like libiberty's xasprintf except that it can return NULL on no memory and the returned string should not be freed. Uses a - single malloc'd buffer managed by libbfd, _bfd_error_buf. + thread-local malloc'd buffer managed by libbfd, _bfd_error_buf. Be aware that a call to this function frees the result of any previous call. bfd_errmsg (bfd_error_on_input) also calls this function. diff --git a/bfd/config.in b/bfd/config.in index 7ff3eeebf8b..0ba104f4431 100644 --- a/bfd/config.in +++ b/bfd/config.in @@ -285,6 +285,9 @@ /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS +/* If the compiler supports a TLS storage class, define it to that here */ +#undef TLS + /* Name of host specific header file to include in trad-core.c. */ #undef TRAD_HEADER diff --git a/bfd/configure b/bfd/configure index f0a07ff675f..de94019bd9c 100755 --- a/bfd/configure +++ b/bfd/configure @@ -13283,6 +13283,57 @@ $as_echo "#define USE_BINARY_FOPEN 1" >>confdefs.h ;; esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for thread local storage (TLS) class" >&5 +$as_echo_n "checking for thread local storage (TLS) class... " >&6; } + if ${ac_cv_tls+:} false; then : + $as_echo_n "(cached) " >&6 +else + for ax_tls_keyword in thread_local _Thread_local __thread '__declspec(thread)' none; do + case $ax_tls_keyword in #( + none) : + ac_cv_tls=none ; break ;; #( + *) : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +static $ax_tls_keyword int bar; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_tls=$ax_tls_keyword ; break +else + ac_cv_tls=none + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ;; +esac + done + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_tls" >&5 +$as_echo "$ac_cv_tls" >&6; } + + if test "$ac_cv_tls" != "none"; then : + +cat >>confdefs.h <<_ACEOF +#define TLS $ac_cv_tls +_ACEOF + + : +else + : +fi + + # Link in zlib/zstd if we can. This allows us to read compressed debug sections. # This is used only by compress.c. diff --git a/bfd/configure.ac b/bfd/configure.ac index d1e7e3a4bf3..42678065e57 100644 --- a/bfd/configure.ac +++ b/bfd/configure.ac @@ -233,6 +233,8 @@ AC_CHECK_DECLS([___lc_codepage_func], [], [], [[#include ]]) BFD_BINARY_FOPEN +AX_TLS + # Link in zlib/zstd if we can. This allows us to read compressed debug sections. # This is used only by compress.c. AM_ZLIB diff --git a/bfd/po/bfd.pot b/bfd/po/bfd.pot index babae2d7a6f..6c979791ef7 100644 --- a/bfd/po/bfd.pot +++ b/bfd/po/bfd.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: https://sourceware.org/bugzilla/\n" -"POT-Creation-Date: 2023-11-07 17:27-0700\n" +"POT-Creation-Date: 2023-11-07 17:40-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -138,115 +138,115 @@ msgstr "" msgid "Writing updated armap timestamp" msgstr "" -#: bfd.c:738 +#: bfd.c:740 msgid "no error" msgstr "" -#: bfd.c:739 +#: bfd.c:741 msgid "system call error" msgstr "" -#: bfd.c:740 +#: bfd.c:742 msgid "invalid bfd target" msgstr "" -#: bfd.c:741 +#: bfd.c:743 msgid "file in wrong format" msgstr "" -#: bfd.c:742 +#: bfd.c:744 msgid "archive object file in wrong format" msgstr "" -#: bfd.c:743 +#: bfd.c:745 msgid "invalid operation" msgstr "" -#: bfd.c:744 +#: bfd.c:746 msgid "memory exhausted" msgstr "" -#: bfd.c:745 +#: bfd.c:747 msgid "no symbols" msgstr "" -#: bfd.c:746 +#: bfd.c:748 msgid "archive has no index; run ranlib to add one" msgstr "" -#: bfd.c:747 +#: bfd.c:749 msgid "no more archived files" msgstr "" -#: bfd.c:748 +#: bfd.c:750 msgid "malformed archive" msgstr "" -#: bfd.c:749 +#: bfd.c:751 msgid "DSO missing from command line" msgstr "" -#: bfd.c:750 +#: bfd.c:752 msgid "file format not recognized" msgstr "" -#: bfd.c:751 +#: bfd.c:753 msgid "file format is ambiguous" msgstr "" -#: bfd.c:752 +#: bfd.c:754 msgid "section has no contents" msgstr "" -#: bfd.c:753 +#: bfd.c:755 msgid "nonrepresentable section on output" msgstr "" -#: bfd.c:754 +#: bfd.c:756 msgid "symbol needs debug section which does not exist" msgstr "" -#: bfd.c:755 +#: bfd.c:757 msgid "bad value" msgstr "" -#: bfd.c:756 +#: bfd.c:758 msgid "file truncated" msgstr "" -#: bfd.c:757 +#: bfd.c:759 msgid "file too big" msgstr "" -#: bfd.c:758 +#: bfd.c:760 msgid "sorry, cannot handle this file" msgstr "" -#: bfd.c:759 +#: bfd.c:761 #, c-format msgid "error reading %s: %s" msgstr "" -#: bfd.c:760 +#: bfd.c:762 msgid "#" msgstr "" -#: bfd.c:1890 +#: bfd.c:1892 #, c-format msgid "BFD %s assertion fail %s:%d" msgstr "" -#: bfd.c:1903 +#: bfd.c:1905 #, c-format msgid "BFD %s internal error, aborting at %s:%d in %s\n" msgstr "" -#: bfd.c:1908 +#: bfd.c:1910 #, c-format msgid "BFD %s internal error, aborting at %s:%d\n" msgstr "" -#: bfd.c:1910 +#: bfd.c:1912 msgid "Please report this bug.\n" msgstr ""