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:
Rainer Orth 2019-04-14 09:30:42 +00:00 committed by Rainer Orth
parent ba838aa6c3
commit 235d1c467b
10 changed files with 1500 additions and 1272 deletions

View File

@ -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.

View File

@ -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

File diff suppressed because it is too large Load Diff

View File

@ -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

View File

@ -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@

View File

@ -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@;

View File

@ -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];

View File

@ -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.

View File

@ -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@

View File

@ -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@