Make various error-related globals thread-local

This changes bfd_error et al to be thread-local.

	* Makefile.in: Regenerate.
	* aclocal.m4: Include ax_tls.m4.
	* ax_tls.m4: New file.
	* bfd.c: (bfd_error, input_error, input_bfd, _bfd_error_buf):
	Now thread-local.
	(bfd_asprintf): Update docs.
	* config.in, configure: Regenerate.
	* configure.ac: Call AX_TLS.
	* po/bfd.pot: Regenerate.
This commit is contained in:
Tom Tromey
2023-08-27 11:37:38 -06:00
parent 426931be4b
commit c6d6a048f5
8 changed files with 166 additions and 36 deletions

View File

@@ -129,9 +129,9 @@ am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
$(top_srcdir)/../config/zstd.m4 $(top_srcdir)/../libtool.m4 \ $(top_srcdir)/../config/zstd.m4 $(top_srcdir)/../libtool.m4 \
$(top_srcdir)/../ltoptions.m4 $(top_srcdir)/../ltsugar.m4 \ $(top_srcdir)/../ltoptions.m4 $(top_srcdir)/../ltsugar.m4 \
$(top_srcdir)/../ltversion.m4 $(top_srcdir)/../lt~obsolete.m4 \ $(top_srcdir)/../ltversion.m4 $(top_srcdir)/../lt~obsolete.m4 \
$(top_srcdir)/bfd.m4 $(top_srcdir)/warning.m4 \ $(top_srcdir)/ax_tls.m4 $(top_srcdir)/bfd.m4 \
$(top_srcdir)/acinclude.m4 $(top_srcdir)/version.m4 \ $(top_srcdir)/warning.m4 $(top_srcdir)/acinclude.m4 \
$(top_srcdir)/configure.ac $(top_srcdir)/version.m4 $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4) $(ACLOCAL_M4)
DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \

1
bfd/aclocal.m4 vendored
View File

@@ -1187,6 +1187,7 @@ m4_include([../ltoptions.m4])
m4_include([../ltsugar.m4]) m4_include([../ltsugar.m4])
m4_include([../ltversion.m4]) m4_include([../ltversion.m4])
m4_include([../lt~obsolete.m4]) m4_include([../lt~obsolete.m4])
m4_include([ax_tls.m4])
m4_include([bfd.m4]) m4_include([bfd.m4])
m4_include([warning.m4]) m4_include([warning.m4])
m4_include([acinclude.m4]) m4_include([acinclude.m4])

71
bfd/ax_tls.m4 Normal file
View File

@@ -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 <ajw05@aber.ac.uk>
# Copyright (c) 2010 Diego Elio Petteno` <flameeyes@gmail.com>
#
# 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 <https://www.gnu.org/licenses/>.
#
# 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 <stdlib.h>],
[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],[[:]])])
])

View File

@@ -691,6 +691,8 @@ SECTION
The easiest way to report a BFD error to the user is to The easiest way to report a BFD error to the user is to
use <<bfd_perror>>. use <<bfd_perror>>.
The BFD error is thread-local.
SUBSECTION SUBSECTION
Type <<bfd_error_type>> Type <<bfd_error_type>>
@@ -728,10 +730,10 @@ CODE_FRAGMENT
. .
*/ */
static bfd_error_type bfd_error; static TLS bfd_error_type bfd_error;
static bfd_error_type input_error; static TLS bfd_error_type input_error;
static bfd *input_bfd; static TLS bfd *input_bfd;
static char *_bfd_error_buf; static TLS char *_bfd_error_buf;
const char *const bfd_errmsgs[] = const char *const bfd_errmsgs[] =
{ {
@@ -920,7 +922,7 @@ DESCRIPTION
Primarily for error reporting, this function is like Primarily for error reporting, this function is like
libiberty's xasprintf except that it can return NULL on no libiberty's xasprintf except that it can return NULL on no
memory and the returned string should not be freed. Uses a 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 Be aware that a call to this function frees the result of any
previous call. bfd_errmsg (bfd_error_on_input) also calls previous call. bfd_errmsg (bfd_error_on_input) also calls
this function. this function.

View File

@@ -285,6 +285,9 @@
/* Define to 1 if you have the ANSI C header files. */ /* Define to 1 if you have the ANSI C header files. */
#undef STDC_HEADERS #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. */ /* Name of host specific header file to include in trad-core.c. */
#undef TRAD_HEADER #undef TRAD_HEADER

51
bfd/configure vendored
View File

@@ -13283,6 +13283,57 @@ $as_echo "#define USE_BINARY_FOPEN 1" >>confdefs.h
;; ;;
esac 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 <stdlib.h>
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. # Link in zlib/zstd if we can. This allows us to read compressed debug sections.
# This is used only by compress.c. # This is used only by compress.c.

View File

@@ -233,6 +233,8 @@ AC_CHECK_DECLS([___lc_codepage_func], [], [], [[#include <locale.h>]])
BFD_BINARY_FOPEN BFD_BINARY_FOPEN
AX_TLS
# Link in zlib/zstd if we can. This allows us to read compressed debug sections. # Link in zlib/zstd if we can. This allows us to read compressed debug sections.
# This is used only by compress.c. # This is used only by compress.c.
AM_ZLIB AM_ZLIB

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: https://sourceware.org/bugzilla/\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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -138,115 +138,115 @@ msgstr ""
msgid "Writing updated armap timestamp" msgid "Writing updated armap timestamp"
msgstr "" msgstr ""
#: bfd.c:738 #: bfd.c:740
msgid "no error" msgid "no error"
msgstr "" msgstr ""
#: bfd.c:739 #: bfd.c:741
msgid "system call error" msgid "system call error"
msgstr "" msgstr ""
#: bfd.c:740 #: bfd.c:742
msgid "invalid bfd target" msgid "invalid bfd target"
msgstr "" msgstr ""
#: bfd.c:741 #: bfd.c:743
msgid "file in wrong format" msgid "file in wrong format"
msgstr "" msgstr ""
#: bfd.c:742 #: bfd.c:744
msgid "archive object file in wrong format" msgid "archive object file in wrong format"
msgstr "" msgstr ""
#: bfd.c:743 #: bfd.c:745
msgid "invalid operation" msgid "invalid operation"
msgstr "" msgstr ""
#: bfd.c:744 #: bfd.c:746
msgid "memory exhausted" msgid "memory exhausted"
msgstr "" msgstr ""
#: bfd.c:745 #: bfd.c:747
msgid "no symbols" msgid "no symbols"
msgstr "" msgstr ""
#: bfd.c:746 #: bfd.c:748
msgid "archive has no index; run ranlib to add one" msgid "archive has no index; run ranlib to add one"
msgstr "" msgstr ""
#: bfd.c:747 #: bfd.c:749
msgid "no more archived files" msgid "no more archived files"
msgstr "" msgstr ""
#: bfd.c:748 #: bfd.c:750
msgid "malformed archive" msgid "malformed archive"
msgstr "" msgstr ""
#: bfd.c:749 #: bfd.c:751
msgid "DSO missing from command line" msgid "DSO missing from command line"
msgstr "" msgstr ""
#: bfd.c:750 #: bfd.c:752
msgid "file format not recognized" msgid "file format not recognized"
msgstr "" msgstr ""
#: bfd.c:751 #: bfd.c:753
msgid "file format is ambiguous" msgid "file format is ambiguous"
msgstr "" msgstr ""
#: bfd.c:752 #: bfd.c:754
msgid "section has no contents" msgid "section has no contents"
msgstr "" msgstr ""
#: bfd.c:753 #: bfd.c:755
msgid "nonrepresentable section on output" msgid "nonrepresentable section on output"
msgstr "" msgstr ""
#: bfd.c:754 #: bfd.c:756
msgid "symbol needs debug section which does not exist" msgid "symbol needs debug section which does not exist"
msgstr "" msgstr ""
#: bfd.c:755 #: bfd.c:757
msgid "bad value" msgid "bad value"
msgstr "" msgstr ""
#: bfd.c:756 #: bfd.c:758
msgid "file truncated" msgid "file truncated"
msgstr "" msgstr ""
#: bfd.c:757 #: bfd.c:759
msgid "file too big" msgid "file too big"
msgstr "" msgstr ""
#: bfd.c:758 #: bfd.c:760
msgid "sorry, cannot handle this file" msgid "sorry, cannot handle this file"
msgstr "" msgstr ""
#: bfd.c:759 #: bfd.c:761
#, c-format #, c-format
msgid "error reading %s: %s" msgid "error reading %s: %s"
msgstr "" msgstr ""
#: bfd.c:760 #: bfd.c:762
msgid "#<invalid error code>" msgid "#<invalid error code>"
msgstr "" msgstr ""
#: bfd.c:1890 #: bfd.c:1892
#, c-format #, c-format
msgid "BFD %s assertion fail %s:%d" msgid "BFD %s assertion fail %s:%d"
msgstr "" msgstr ""
#: bfd.c:1903 #: bfd.c:1905
#, c-format #, c-format
msgid "BFD %s internal error, aborting at %s:%d in %s\n" msgid "BFD %s internal error, aborting at %s:%d in %s\n"
msgstr "" msgstr ""
#: bfd.c:1908 #: bfd.c:1910
#, c-format #, c-format
msgid "BFD %s internal error, aborting at %s:%d\n" msgid "BFD %s internal error, aborting at %s:%d\n"
msgstr "" msgstr ""
#: bfd.c:1910 #: bfd.c:1912
msgid "Please report this bug.\n" msgid "Please report this bug.\n"
msgstr "" msgstr ""