| /** |
| * |
| * 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 src/rt/_sections.d) |
| */ |
| |
| /* NOTE: This file has been patched from the original DMD distribution to |
| * work with the GDC compiler. |
| */ |
| 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 (FreeBSD) |
| public import rt.sections_elf_shared; |
| else version (NetBSD) |
| 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_x86_64; |
| else version (X86) |
| public import rt.sections_osx_x86; |
| else |
| static assert(0, "unimplemented"); |
| } |
| else version (CRuntime_DigitalMars) |
| public import rt.sections_win32; |
| else version (CRuntime_Microsoft) |
| public import rt.sections_win64; |
| else version (CRuntime_Bionic) |
| public import rt.sections_android; |
| 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 (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; |
| } |
| } |