diff options
author | Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> | 2019-04-14 09:30:42 +0000 |
---|---|---|
committer | Rainer Orth <ro@gcc.gnu.org> | 2019-04-14 09:30:42 +0000 |
commit | 235d1c467babc736f4800c5a26f2989fe41d6351 (patch) | |
tree | bc9d2ab7897e04e60705bb4981d7a7713a0c7b46 /libphobos/libdruntime/gcc | |
parent | ba838aa6c360912bc203068ef2161fce137fb97d (diff) | |
download | gcc-235d1c467babc736f4800c5a26f2989fe41d6351.zip gcc-235d1c467babc736f4800c5a26f2989fe41d6351.tar.gz gcc-235d1c467babc736f4800c5a26f2989fe41d6351.tar.bz2 |
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
Diffstat (limited to 'libphobos/libdruntime/gcc')
-rw-r--r-- | libphobos/libdruntime/gcc/config.d.in | 3 | ||||
-rw-r--r-- | libphobos/libdruntime/gcc/sections/elf_shared.d | 43 |
2 files changed, 44 insertions, 2 deletions
diff --git a/libphobos/libdruntime/gcc/config.d.in b/libphobos/libdruntime/gcc/config.d.in index 4652bf0..9c58af0 100644 --- a/libphobos/libdruntime/gcc/config.d.in +++ b/libphobos/libdruntime/gcc/config.d.in @@ -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@; diff --git a/libphobos/libdruntime/gcc/sections/elf_shared.d b/libphobos/libdruntime/gcc/sections/elf_shared.d index 40857ce..4cf5a23 100644 --- a/libphobos/libdruntime/gcc/sections/elf_shared.d +++ b/libphobos/libdruntime/gcc/sections/elf_shared.d @@ -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]; |