comparison druntime/src/compiler/dmd/memory.d @ 1458:e0b2d67cfe7c

Added druntime (this should be removed once it works).
author Robert Clipsham <robert@octarineparrot.com>
date Tue, 02 Jun 2009 17:43:06 +0100
parents
children
comparison
equal deleted inserted replaced
1456:7b218ec1044f 1458:e0b2d67cfe7c
1 /**
2 * This module exposes functionality for inspecting and manipulating memory.
3 *
4 * Copyright: Copyright Digital Mars 2000 - 2009.
5 * License: <a href="http://www.boost.org/LICENSE_1_0.txt>Boost License 1.0</a>.
6 * Authors: Walter Bright, Sean Kelly
7 *
8 * Copyright Digital Mars 2000 - 2009.
9 * Distributed under the Boost Software License, Version 1.0.
10 * (See accompanying file LICENSE_1_0.txt or copy at
11 * http://www.boost.org/LICENSE_1_0.txt)
12 */
13 module rt.memory;
14
15
16 private
17 {
18 version( linux )
19 {
20 version = SimpleLibcStackEnd;
21
22 version( SimpleLibcStackEnd )
23 {
24 extern (C) extern __gshared void* __libc_stack_end;
25 }
26 }
27 version( FreeBSD )
28 {
29 version = SimpleLibcStackEnd;
30
31 version( SimpleLibcStackEnd )
32 {
33 extern (C) extern __gshared void* __libc_stack_end;
34 }
35 }
36 version( Solaris )
37 {
38 version = SimpleLibcStackEnd;
39
40 version( SimpleLibcStackEnd )
41 {
42 extern (C) extern __gshared void* __libc_stack_end;
43 }
44 }
45 extern (C) void gc_addRange( void* p, size_t sz );
46 extern (C) void gc_removeRange( void* p );
47 }
48
49
50 /**
51 *
52 */
53 extern (C) void* rt_stackBottom()
54 {
55 version( Windows )
56 {
57 asm
58 {
59 naked;
60 mov EAX,FS:4;
61 ret;
62 }
63 }
64 else version( linux )
65 {
66 version( SimpleLibcStackEnd )
67 {
68 return __libc_stack_end;
69 }
70 else
71 {
72 // See discussion: http://autopackage.org/forums/viewtopic.php?t=22
73 static void** libc_stack_end;
74
75 if( libc_stack_end == libc_stack_end.init )
76 {
77 void* handle = dlopen( null, RTLD_NOW );
78 libc_stack_end = cast(void**) dlsym( handle, "__libc_stack_end" );
79 dlclose( handle );
80 }
81 return *libc_stack_end;
82 }
83 }
84 else version( OSX )
85 {
86 return cast(void*) 0xc0000000;
87 }
88 else version( FreeBSD )
89 {
90 return __libc_stack_end;
91 }
92 else version( Solaris )
93 {
94 return __libc_stack_end;
95 }
96 else
97 {
98 static assert( false, "Operating system not supported." );
99 }
100 }
101
102
103 /**
104 *
105 */
106 extern (C) void* rt_stackTop()
107 {
108 version( D_InlineAsm_X86 )
109 {
110 asm
111 {
112 naked;
113 mov EAX, ESP;
114 ret;
115 }
116 }
117 else
118 {
119 static assert( false, "Architecture not supported." );
120 }
121 }
122
123
124 private
125 {
126 version( Windows )
127 {
128 extern (C)
129 {
130 extern __gshared
131 {
132 int _xi_a; // &_xi_a just happens to be start of data segment
133 int _edata; // &_edata is start of BSS segment
134 int _end; // &_end is past end of BSS
135 }
136 }
137 }
138 else version( linux )
139 {
140 extern (C)
141 {
142 extern __gshared
143 {
144 int _data;
145 int __data_start;
146 int _end;
147 int _data_start__;
148 int _data_end__;
149 int _bss_start__;
150 int _bss_end__;
151 int __fini_array_end;
152 }
153 }
154
155 alias __data_start Data_Start;
156 alias _end Data_End;
157 }
158 else version( OSX )
159 {
160 extern (C) void _d_osx_image_init();
161 }
162 else version( FreeBSD )
163 {
164 extern (C)
165 {
166 extern __gshared
167 {
168 int etext;
169 int _end;
170 }
171 }
172 }
173 else version( Solaris )
174 {
175 extern (C)
176 {
177 extern __gshared
178 {
179 int etext;
180 int _end;
181 }
182 }
183 }
184 }
185
186
187 void initStaticDataGC()
188 {
189 version( Windows )
190 {
191 gc_addRange( &_xi_a, cast(size_t) &_end - cast(size_t) &_xi_a );
192 }
193 else version( linux )
194 {
195 gc_addRange( &__data_start, cast(size_t) &_end - cast(size_t) &__data_start );
196 }
197 else version( OSX )
198 {
199 _d_osx_image_init();
200 }
201 else version( FreeBSD )
202 {
203 gc_addRange( &etext, cast(size_t) &_end - cast(size_t) &etext );
204 }
205 else version( Solaris )
206 {
207 gc_addRange( &etext, cast(size_t) &_end - cast(size_t) &etext );
208 }
209 else
210 {
211 static assert( false, "Operating system not supported." );
212 }
213 }