Mercurial > projects > ldc
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 } |