Mercurial > projects > ldc
diff runtime/internal/memory.d @ 443:44f08170f4ef
Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Reworked the LLVMDC specific pragmas.
author | Tomas Lindquist Olsen <tomas.l.olsen@gmail.com> |
---|---|
date | Fri, 01 Aug 2008 00:32:06 +0200 |
parents | |
children | 02fb65cddc3e |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/runtime/internal/memory.d Fri Aug 01 00:32:06 2008 +0200 @@ -0,0 +1,173 @@ +/** + * This module exposes functionality for inspecting and manipulating memory. + * + * Copyright: Copyright (C) 2005-2006 Digital Mars, www.digitalmars.com. + * All rights reserved. + * License: + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, in both source and binary form, subject to the following + * restrictions: + * + * o The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * o Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * o This notice may not be removed or altered from any source + * distribution. + * Authors: Walter Bright, Sean Kelly + */ +module memory; + + +private +{ + version( linux ) + { + //version = SimpleLibcStackEnd; + + version( SimpleLibcStackEnd ) + { + extern (C) extern void* __libc_stack_end; + } + else + { + import tango.stdc.posix.dlfcn; + } + } + version(LLVMDC) + { + pragma(intrinsic, "llvm.frameaddress") + { + void* llvm_frameaddress(uint level=0); + } + } +} + + +/** + * + */ +extern (C) void* rt_stackBottom() +{ + version( Win32 ) + { + asm + { + naked; + mov EAX,FS:4; + ret; + } + } + else version( linux ) + { + version( SimpleLibcStackEnd ) + { + return __libc_stack_end; + } + else + { + // See discussion: http://autopackage.org/forums/viewtopic.php?t=22 + static void** libc_stack_end; + + if( libc_stack_end == libc_stack_end.init ) + { + void* handle = dlopen( null, RTLD_NOW ); + libc_stack_end = cast(void**) dlsym( handle, "__libc_stack_end" ); + dlclose( handle ); + } + return *libc_stack_end; + } + } + else + { + static assert( false, "Operating system not supported." ); + } +} + + +/** + * + */ +extern (C) void* rt_stackTop() +{ + version(LLVMDC) + { + return llvm_frameaddress(); + } + else version( D_InlineAsm_X86 ) + { + asm + { + naked; + mov EAX, ESP; + ret; + } + } + else + { + static assert( false, "Architecture not supported." ); + } +} + + +private +{ + version( Win32 ) + { + extern (C) + { + extern int _data_start__; + extern int _bss_end__; + + alias _data_start__ Data_Start; + alias _bss_end__ Data_End; + } + } + else version( linux ) + { + extern (C) + { + extern int _data; + extern int __data_start; + extern int _end; + extern int _data_start__; + extern int _data_end__; + extern int _bss_start__; + extern int _bss_end__; + extern int __fini_array_end; + } + + alias __data_start Data_Start; + alias _end Data_End; + } + + alias void delegate( void*, void* ) scanFn; +} + + +/** + * + */ +extern (C) void rt_scanStaticData( scanFn scan ) +{ + version( Win32 ) + { + scan( &Data_Start, &Data_End ); + } + else version( linux ) + { + //printf("scanning static data from %p to %p\n", &Data_Start, &Data_End); + scan( &Data_Start, &Data_End ); + } + else + { + static assert( false, "Operating system not supported." ); + } +}