]> git.llucax.com Git - software/druntime.git/blob - src/compiler/dmd/memory.d
Fixed a few mistakes regarding invariance, etc, between D1 and D2.
[software/druntime.git] / src / compiler / dmd / memory.d
1 /**
2  * This module exposes functionality for inspecting and manipulating memory.
3  *
4  * Copyright: Copyright (C) 2005-2006 Digital Mars, www.digitalmars.com.
5  *            All rights reserved.
6  * License:
7  *  This software is provided 'as-is', without any express or implied
8  *  warranty. In no event will the authors be held liable for any damages
9  *  arising from the use of this software.
10  *
11  *  Permission is granted to anyone to use this software for any purpose,
12  *  including commercial applications, and to alter it and redistribute it
13  *  freely, in both source and binary form, subject to the following
14  *  restrictions:
15  *
16  *  o  The origin of this software must not be misrepresented; you must not
17  *     claim that you wrote the original software. If you use this software
18  *     in a product, an acknowledgment in the product documentation would be
19  *     appreciated but is not required.
20  *  o  Altered source versions must be plainly marked as such, and must not
21  *     be misrepresented as being the original software.
22  *  o  This notice may not be removed or altered from any source
23  *     distribution.
24  * Authors:   Walter Bright, Sean Kelly
25  */
26 module rt.memory;
27
28
29 private
30 {
31     version( linux )
32     {
33         version = SimpleLibcStackEnd;
34
35         version( SimpleLibcStackEnd )
36         {
37             extern (C) extern void* __libc_stack_end;
38         }
39     }
40 }
41
42
43 /**
44  *
45  */
46 extern (C) void* rt_stackBottom()
47 {
48     version( Windows )
49     {
50         asm
51         {
52             naked;
53             mov EAX,FS:4;
54             ret;
55         }
56     }
57     else version( linux )
58     {
59         version( SimpleLibcStackEnd )
60         {
61             return __libc_stack_end;
62         }
63         else
64         {
65             // See discussion: http://autopackage.org/forums/viewtopic.php?t=22
66                 static void** libc_stack_end;
67
68                 if( libc_stack_end == libc_stack_end.init )
69                 {
70                     void* handle = dlopen( null, RTLD_NOW );
71                     libc_stack_end = cast(void**) dlsym( handle, "__libc_stack_end" );
72                     dlclose( handle );
73                 }
74                 return *libc_stack_end;
75         }
76     }
77     else
78     {
79         static assert( false, "Operating system not supported." );
80     }
81 }
82
83
84 /**
85  *
86  */
87 extern (C) void* rt_stackTop()
88 {
89     version( D_InlineAsm_X86 )
90     {
91         asm
92         {
93             naked;
94             mov EAX, ESP;
95             ret;
96         }
97     }
98     else
99     {
100             static assert( false, "Architecture not supported." );
101     }
102 }
103
104
105 private
106 {
107     version( Windows )
108     {
109         extern (C)
110         {
111             extern int _xi_a;   // &_xi_a just happens to be start of data segment
112             extern int _edata;  // &_edata is start of BSS segment
113             extern int _end;    // &_end is past end of BSS
114         }
115     }
116     else version( linux )
117     {
118         extern (C)
119         {
120             extern int _data;
121             extern int __data_start;
122             extern int _end;
123             extern int _data_start__;
124             extern int _data_end__;
125             extern int _bss_start__;
126             extern int _bss_end__;
127             extern int __fini_array_end;
128         }
129
130             alias __data_start  Data_Start;
131             alias _end          Data_End;
132     }
133
134     alias void delegate( void*, void* ) scanFn;
135 }
136
137
138 /**
139  *
140  */
141 extern (C) void rt_scanStaticData( scanFn scan )
142 {
143     version( Windows )
144     {
145         scan( &_xi_a, &_end );
146     }
147     else version( linux )
148     {
149         scan( &__data_start, &_end );
150     }
151     else
152     {
153         static assert( false, "Operating system not supported." );
154     }
155 }