/** * * Copyright: Copyright Digital Mars 2000 - 2012. * License: Distributed under the * $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0). * (See accompanying file LICENSE) * Authors: Walter Bright, Sean Kelly, Martin Nowak * Source: $(DRUNTIMESRC rt/_sections.d) */ module rt.sections; version (OSX) version = Darwin;else version (iOS) version = Darwin;else version (TVOS) version = Darwin;else version (WatchOS) version = Darwin; version (GNU) public import gcc.sections;else version (CRuntime_Glibc) public import rt.sections_elf_shared;else version (CRuntime_Musl) public import rt.sections_elf_shared;else version (FreeBSD) public import rt.sections_elf_shared;else version (NetBSD) public import rt.sections_elf_shared;else version (OpenBSD){ /** * OpenBSD is missing support needed for elf_shared. * See the top of sections_solaris.d for more info. */ public import rt.sections_solaris;}else version (DragonFlyBSD) public import rt.sections_elf_shared;else version (Solaris) public import rt.sections_solaris;else version (Darwin){ version (X86_64) public import rt.sections_osx_64; else version (X86) public import rt.sections_osx_x86; else version (AArch64) public import rt.sections_osx_64; else static assert(0, "unimplemented");}else version (CRuntime_Microsoft) public import rt.sections_win64;else version (CRuntime_Bionic) public import rt.sections_elf_shared;else version (CRuntime_UClibc) public import rt.sections_elf_shared;else static assert(0, "unimplemented"); import rt.deh, rt.minfo; template isSectionGroup(T){ enum isSectionGroup = is(typeof(T.init.modules) == immutable(ModuleInfo*)[]) && is(typeof(T.init.moduleGroup) == ModuleGroup) && (!is(typeof(T.init.ehTables)) || is(typeof(T.init.ehTables) == immutable(FuncTable)[])) && is(typeof(T.init.gcRanges) == void[][]) && is(typeof({ foreach (ref T; T) {}})) && is(typeof({ foreach_reverse (ref T; T) {}}));}static assert(isSectionGroup!(SectionGroup));static assert(is(typeof(&initSections) == void function() nothrow @nogc));static assert(is(typeof(&finiSections) == void function() nothrow @nogc));static assert(is(typeof(&initTLSRanges) RT == return) && is(typeof(&initTLSRanges) == RT function() nothrow @nogc) && is(typeof(&finiTLSRanges) == void function(RT) nothrow @nogc) && is(typeof(&scanTLSRanges) == void function(RT, scope void delegate(void*, void*) nothrow) nothrow)); version (Windows){}else version (Shared){ static assert(is(typeof(&pinLoadedLibraries) == void* function() nothrow @nogc)); static assert(is(typeof(&unpinLoadedLibraries) == void function(void*) nothrow @nogc)); static assert(is(typeof(&inheritLoadedLibraries) == void function(void*) nothrow @nogc)); static assert(is(typeof(&cleanupLoadedLibraries) == void function() nothrow @nogc));} bool scanDataSegPrecisely() nothrow @nogc{ import rt.config; string opt = rt_configOption("scanDataSeg"); switch (opt) { case "": case "conservative": return false; case "precise": return true; default: __gshared err = new Error("DRT invalid scanDataSeg option, must be 'precise' or 'conservative'"); throw err; }}
/**
*
* Copyright: Copyright Digital Mars 2000 - 2012.
* License: Distributed under the
* $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0).
* (See accompanying file LICENSE)
* Authors: Walter Bright, Sean Kelly, Martin Nowak
* Source: $(DRUNTIMESRC rt/_sections.d)
*/
module rt.sections;
version (OSX)
version = Darwin;
else version (iOS)
version = Darwin;
else version (TVOS)
version = Darwin;
else version (WatchOS)
version = Darwin;
version (GNU)
public import gcc.sections;
else version (CRuntime_Glibc)
public import rt.sections_elf_shared;
else version (CRuntime_Musl)
public import rt.sections_elf_shared;
else version (FreeBSD)
public import rt.sections_elf_shared;
else version (NetBSD)
public import rt.sections_elf_shared;
else version (OpenBSD)
{
/**
* OpenBSD is missing support needed for elf_shared.
* See the top of sections_solaris.d for more info.
*/
public import rt.sections_solaris;
}
else version (DragonFlyBSD)
public import rt.sections_elf_shared;
else version (Solaris)
public import rt.sections_solaris;
else version (Darwin)
{
version (X86_64)
public import rt.sections_osx_64;
else version (X86)
public import rt.sections_osx_x86;
else version (AArch64)
public import rt.sections_osx_64;
else
static assert(0, "unimplemented");
}
else version (CRuntime_Microsoft)
public import rt.sections_win64;
else version (CRuntime_Bionic)
public import rt.sections_elf_shared;
else version (CRuntime_UClibc)
public import rt.sections_elf_shared;
else
static assert(0, "unimplemented");
import rt.deh, rt.minfo;
template isSectionGroup(T)
{
enum isSectionGroup =
is(typeof(T.init.modules) == immutable(ModuleInfo*)[]) &&
is(typeof(T.init.moduleGroup) == ModuleGroup) &&
(!is(typeof(T.init.ehTables)) || is(typeof(T.init.ehTables) == immutable(FuncTable)[])) &&
is(typeof(T.init.gcRanges) == void[][]) &&
is(typeof({ foreach (ref T; T) {}})) &&
is(typeof({ foreach_reverse (ref T; T) {}}));
}
static assert(isSectionGroup!(SectionGroup));
static assert(is(typeof(&initSections) == void function() nothrow @nogc));
static assert(is(typeof(&finiSections) == void function() nothrow @nogc));
static assert(is(typeof(&initTLSRanges) RT == return) &&
is(typeof(&initTLSRanges) == RT function() nothrow @nogc) &&
is(typeof(&finiTLSRanges) == void function(RT) nothrow @nogc) &&
is(typeof(&scanTLSRanges) == void function(RT, scope void delegate(void*, void*) nothrow) nothrow));
version (Windows)
{
}
else version (Shared)
{
static assert(is(typeof(&pinLoadedLibraries) == void* function() nothrow @nogc));
static assert(is(typeof(&unpinLoadedLibraries) == void function(void*) nothrow @nogc));
static assert(is(typeof(&inheritLoadedLibraries) == void function(void*) nothrow @nogc));
static assert(is(typeof(&cleanupLoadedLibraries) == void function() nothrow @nogc));
}
bool scanDataSegPrecisely() nothrow @nogc
{
import rt.config;
string opt = rt_configOption("scanDataSeg");
switch (opt)
{
case "":
case "conservative":
return false;
case "precise":
return true;
default:
__gshared err = new Error("DRT invalid scanDataSeg option, must be 'precise' or 'conservative'");
throw err;
}
}