aboutsummaryrefslogtreecommitdiff
path: root/libphobos/libdruntime/gcc
diff options
context:
space:
mode:
authorRainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>2019-04-14 09:30:42 +0000
committerRainer Orth <ro@gcc.gnu.org>2019-04-14 09:30:42 +0000
commit235d1c467babc736f4800c5a26f2989fe41d6351 (patch)
treebc9d2ab7897e04e60705bb4981d7a7713a0c7b46 /libphobos/libdruntime/gcc
parentba838aa6c360912bc203068ef2161fce137fb97d (diff)
downloadgcc-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.in3
-rw-r--r--libphobos/libdruntime/gcc/sections/elf_shared.d43
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];