mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-02-26 13:35:49 +08:00
Work around lack of dlpi_tls_modid before Solaris 11.5
2019-04-14 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> Iain Buclaw <ibuclaw@gdcproject.org> PR d/88150 * m4/druntime/os.m4 (DRUNTIME_OS_DLPI_TLS_MODID): New macro. * configure.ac: Use it. Call AC_USE_SYSTEM_EXTENSIONS. * configure: Regenerate. * Makefile.in, libdruntime/Makefile.in, src/Makefile.in, testsuite/Makefile.in: Regenerate. * libdruntime/gcc/config.d.in (OS_Have_Dlpi_Tls_Modid): Define. * libdruntime/gcc/sections/elf_shared.d: Import gcc.config. (scanSegments) <PT_TLS> [OS_Have_Dlpi_Tls_Modid]: Use dlpi_tls_modid. [Solaris]: Use dlinfo(RTLD_DI_LINKMAP) to get rt_tlsmodid. Otherwise clear pdso._tlsMod, pdso._tlsSize. (getTLSRange) [Solaris && !OS_Have_Dlpi_Tls_Modid]: Readjust mod. Co-Authored-By: Iain Buclaw <ibuclaw@gdcproject.org> From-SVN: r270347
This commit is contained in:
parent
ba838aa6c3
commit
235d1c467b
@ -1,3 +1,21 @@
|
||||
2019-04-14 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
|
||||
Iain Buclaw <ibuclaw@gdcproject.org>
|
||||
|
||||
PR d/88150
|
||||
* m4/druntime/os.m4 (DRUNTIME_OS_DLPI_TLS_MODID): New macro.
|
||||
* configure.ac: Use it.
|
||||
Call AC_USE_SYSTEM_EXTENSIONS.
|
||||
* configure: Regenerate.
|
||||
* Makefile.in, libdruntime/Makefile.in, src/Makefile.in,
|
||||
testsuite/Makefile.in: Regenerate.
|
||||
* libdruntime/gcc/config.d.in (OS_Have_Dlpi_Tls_Modid): Define.
|
||||
* libdruntime/gcc/sections/elf_shared.d: Import gcc.config.
|
||||
(scanSegments) <PT_TLS> [OS_Have_Dlpi_Tls_Modid]: Use
|
||||
dlpi_tls_modid.
|
||||
[Solaris]: Use dlinfo(RTLD_DI_LINKMAP) to get rt_tlsmodid.
|
||||
Otherwise clear pdso._tlsMod, pdso._tlsSize.
|
||||
(getTLSRange) [Solaris && !OS_Have_Dlpi_Tls_Modid]: Readjust mod.
|
||||
|
||||
2019-04-14 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
|
||||
|
||||
* m4/druntime/os.m4 (DRUNTIME_OS_LINK_SPEC): New macro.
|
||||
@ -7,6 +25,8 @@
|
||||
testsuite/Makefile.in: Regenerate.
|
||||
* src/libgphobos.spec.in (*link): Append OS_LINK_SPEC.
|
||||
|
||||
2019-04-14 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
|
||||
|
||||
PR d/88150
|
||||
* libdruntime/gcc/sections/elf_shared.d [Solaris] (SharedELF): Set
|
||||
to true.
|
||||
|
@ -210,6 +210,7 @@ CPP = @CPP@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
CYGPATH_W = @CYGPATH_W@
|
||||
DCFG_ARM_EABI_UNWINDER = @DCFG_ARM_EABI_UNWINDER@
|
||||
DCFG_DLPI_TLS_MODID = @DCFG_DLPI_TLS_MODID@
|
||||
DCFG_HAVE_64BIT_ATOMICS = @DCFG_HAVE_64BIT_ATOMICS@
|
||||
DCFG_HAVE_ATOMIC_BUILTINS = @DCFG_HAVE_ATOMIC_BUILTINS@
|
||||
DCFG_HAVE_LIBATOMIC = @DCFG_HAVE_LIBATOMIC@
|
||||
|
2686
libphobos/configure
vendored
2686
libphobos/configure
vendored
File diff suppressed because it is too large
Load Diff
@ -32,6 +32,7 @@ AC_CONFIG_HEADERS(config.h)
|
||||
|
||||
AM_ENABLE_MULTILIB(, ..)
|
||||
AC_CANONICAL_SYSTEM
|
||||
AC_USE_SYSTEM_EXTENSIONS
|
||||
|
||||
target_alias=${target_alias-$target}
|
||||
AC_SUBST(target_alias)
|
||||
@ -125,6 +126,7 @@ DRUNTIME_OS_SOURCES
|
||||
DRUNTIME_OS_THREAD_MODEL
|
||||
DRUNTIME_OS_ARM_EABI_UNWINDER
|
||||
DRUNTIME_OS_MINFO_BRACKETING
|
||||
DRUNTIME_OS_DLPI_TLS_MODID
|
||||
DRUNTIME_OS_LINK_SPEC
|
||||
DRUNTIME_LIBRARIES_CLIB
|
||||
|
||||
|
@ -524,6 +524,7 @@ CPP = @CPP@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
CYGPATH_W = @CYGPATH_W@
|
||||
DCFG_ARM_EABI_UNWINDER = @DCFG_ARM_EABI_UNWINDER@
|
||||
DCFG_DLPI_TLS_MODID = @DCFG_DLPI_TLS_MODID@
|
||||
DCFG_HAVE_64BIT_ATOMICS = @DCFG_HAVE_64BIT_ATOMICS@
|
||||
DCFG_HAVE_ATOMIC_BUILTINS = @DCFG_HAVE_ATOMIC_BUILTINS@
|
||||
DCFG_HAVE_LIBATOMIC = @DCFG_HAVE_LIBATOMIC@
|
||||
|
@ -35,6 +35,9 @@ enum ThreadModel
|
||||
|
||||
enum ThreadModel GNU_Thread_Model = ThreadModel.@DCFG_THREAD_MODEL@;
|
||||
|
||||
// Whether struct dl_phdr_info has dlpi_tls_modid member.
|
||||
enum OS_Have_Dlpi_Tls_Modid = @DCFG_DLPI_TLS_MODID@;
|
||||
|
||||
// Whether target has support for builtin atomics.
|
||||
enum GNU_Have_Atomics = @DCFG_HAVE_ATOMIC_BUILTINS@;
|
||||
|
||||
|
@ -74,6 +74,7 @@ else
|
||||
static assert(0, "unimplemented");
|
||||
}
|
||||
import core.sys.posix.pthread;
|
||||
import gcc.config;
|
||||
import rt.deh;
|
||||
import rt.dmain2;
|
||||
import rt.minfo;
|
||||
@ -792,8 +793,40 @@ void scanSegments(in ref dl_phdr_info info, DSO* pdso) nothrow @nogc
|
||||
|
||||
case PT_TLS: // TLS segment
|
||||
safeAssert(!pdso._tlsSize, "Multiple TLS segments in image header.");
|
||||
pdso._tlsMod = info.dlpi_tls_modid;
|
||||
pdso._tlsSize = phdr.p_memsz;
|
||||
static if (OS_Have_Dlpi_Tls_Modid)
|
||||
{
|
||||
pdso._tlsMod = info.dlpi_tls_modid;
|
||||
pdso._tlsSize = phdr.p_memsz;
|
||||
}
|
||||
else version (Solaris)
|
||||
{
|
||||
struct Rt_map
|
||||
{
|
||||
Link_map rt_public;
|
||||
const char* rt_pathname;
|
||||
c_ulong rt_padstart;
|
||||
c_ulong rt_padimlen;
|
||||
c_ulong rt_msize;
|
||||
uint rt_flags;
|
||||
uint rt_flags1;
|
||||
c_ulong rt_tlsmodid;
|
||||
}
|
||||
|
||||
Rt_map* map;
|
||||
version (Shared)
|
||||
dlinfo(handleForName(info.dlpi_name), RTLD_DI_LINKMAP, &map);
|
||||
else
|
||||
dlinfo(RTLD_SELF, RTLD_DI_LINKMAP, &map);
|
||||
// Until Solaris 11.4, tlsmodid for the executable is 0.
|
||||
// Let it start at 1 as the rest of the code expects.
|
||||
pdso._tlsMod = map.rt_tlsmodid + 1;
|
||||
pdso._tlsSize = phdr.p_memsz;
|
||||
}
|
||||
else
|
||||
{
|
||||
pdso._tlsMod = 0;
|
||||
pdso._tlsSize = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -988,6 +1021,12 @@ void[] getTLSRange(size_t mod, size_t sz) nothrow @nogc
|
||||
if (mod == 0)
|
||||
return null;
|
||||
|
||||
version (Solaris)
|
||||
{
|
||||
static if (!OS_Have_Dlpi_Tls_Modid)
|
||||
mod -= 1;
|
||||
}
|
||||
|
||||
// base offset
|
||||
auto ti = tls_index(mod, 0);
|
||||
return (__tls_get_addr(&ti)-TLS_DTV_OFFSET)[0 .. sz];
|
||||
|
@ -184,6 +184,20 @@ AC_DEFUN([DRUNTIME_OS_MINFO_BRACKETING],
|
||||
AC_LANG_POP([C])
|
||||
])
|
||||
|
||||
# DRUNTIME_OS_DLPI_TLS_MODID
|
||||
# ----------------------------
|
||||
# Check if struct dl_phdr_info includes the dlpi_tls_modid member and
|
||||
# substitute DCFG_DLPI_TLS_MODID.
|
||||
AC_DEFUN([DRUNTIME_OS_DLPI_TLS_MODID],
|
||||
[
|
||||
AC_LANG_PUSH([C])
|
||||
AC_CHECK_MEMBER([struct dl_phdr_info.dlpi_tls_modid],
|
||||
[DCFG_DLPI_TLS_MODID=true], [DCFG_DLPI_TLS_MODID=false],
|
||||
[[#include <link.h>]])
|
||||
AC_SUBST(DCFG_DLPI_TLS_MODID)
|
||||
AC_LANG_POP([C])
|
||||
])
|
||||
|
||||
# DRUNTIME_OS_LINK_SPEC
|
||||
# ---------------------
|
||||
# Add target-specific link options to link_spec.
|
||||
|
@ -281,6 +281,7 @@ CPP = @CPP@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
CYGPATH_W = @CYGPATH_W@
|
||||
DCFG_ARM_EABI_UNWINDER = @DCFG_ARM_EABI_UNWINDER@
|
||||
DCFG_DLPI_TLS_MODID = @DCFG_DLPI_TLS_MODID@
|
||||
DCFG_HAVE_64BIT_ATOMICS = @DCFG_HAVE_64BIT_ATOMICS@
|
||||
DCFG_HAVE_ATOMIC_BUILTINS = @DCFG_HAVE_ATOMIC_BUILTINS@
|
||||
DCFG_HAVE_LIBATOMIC = @DCFG_HAVE_LIBATOMIC@
|
||||
|
@ -154,6 +154,7 @@ CPP = @CPP@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
CYGPATH_W = @CYGPATH_W@
|
||||
DCFG_ARM_EABI_UNWINDER = @DCFG_ARM_EABI_UNWINDER@
|
||||
DCFG_DLPI_TLS_MODID = @DCFG_DLPI_TLS_MODID@
|
||||
DCFG_HAVE_64BIT_ATOMICS = @DCFG_HAVE_64BIT_ATOMICS@
|
||||
DCFG_HAVE_ATOMIC_BUILTINS = @DCFG_HAVE_ATOMIC_BUILTINS@
|
||||
DCFG_HAVE_LIBATOMIC = @DCFG_HAVE_LIBATOMIC@
|
||||
|
Loading…
Reference in New Issue
Block a user