Mercurial > projects > ldc
annotate dmd/mem.c @ 323:0d52412d5b1a trunk
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
Changed the way moduleinfo is registered to use the same approach as DMD, this eliminates the need for correct linking order and should make the way for using a natively compiled runtime library. This should speed up linking tremendously and should now be possible.
Fixed the llvm.used array to only be emitted if really necessary.
author | lindquist |
---|---|
date | Wed, 09 Jul 2008 23:43:51 +0200 |
parents | 967178e31a13 |
children | b30fe7e1dbb9 |
rev | line source |
---|---|
1 | 1 |
2 /* Copyright (c) 2000 Digital Mars */ | |
3 /* All Rights Reserved */ | |
4 | |
268
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
5 #include <cstdio> |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
6 #include <cstdlib> |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
7 #include <cstring> |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
8 #include <cassert> |
1 | 9 |
10 #include "mem.h" | |
11 | |
268
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
12 #if USE_BOEHM_GC |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
13 // I needed to perfix the dir after upgrading to gc 7.0 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
14 #include "gc/gc.h" |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
15 #endif |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
16 |
1 | 17 /* This implementation of the storage allocator uses the standard C allocation package. |
18 */ | |
19 | |
20 Mem mem; | |
268
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
21 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
22 #if USE_BOEHM_GC |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
23 |
6 | 24 static bool gc_was_init = false; |
1 | 25 |
26 void Mem::init() | |
27 { | |
28 GC_init(); | |
6 | 29 gc_was_init = true; |
1 | 30 } |
31 | |
32 char *Mem::strdup(const char *s) | |
33 { | |
34 char *p; | |
35 | |
36 if (s) | |
37 { | |
38 p = GC_strdup(s); | |
39 if (p) | |
40 return p; | |
41 error(); | |
42 } | |
43 return NULL; | |
44 } | |
45 | |
46 void *Mem::malloc(size_t size) | |
47 { void *p; | |
48 | |
49 if (!size) | |
50 p = NULL; | |
51 else | |
52 { | |
53 p = GC_malloc(size); | |
54 if (!p) | |
55 error(); | |
56 } | |
57 return p; | |
58 } | |
59 | |
60 void *Mem::calloc(size_t size, size_t n) | |
61 { void *p; | |
62 | |
63 if (!size || !n) | |
64 p = NULL; | |
65 else | |
66 { | |
67 p = GC_malloc(size * n); | |
68 if (!p) | |
69 error(); | |
70 memset(p, 0, size * n); | |
71 } | |
72 return p; | |
73 } | |
74 | |
75 void *Mem::realloc(void *p, size_t size) | |
76 { | |
77 if (!size) | |
78 { if (p) | |
79 { GC_free(p); | |
80 p = NULL; | |
81 } | |
82 } | |
83 else if (!p) | |
84 { | |
85 p = GC_malloc(size); | |
86 if (!p) | |
87 error(); | |
88 } | |
89 else | |
90 { | |
91 p = GC_realloc(p, size); | |
92 if (!p) | |
93 error(); | |
94 } | |
95 return p; | |
96 } | |
97 | |
98 void Mem::free(void *p) | |
99 { | |
100 if (p) | |
101 GC_free(p); | |
102 } | |
103 | |
104 void *Mem::mallocdup(void *o, size_t size) | |
105 { void *p; | |
106 | |
107 if (!size) | |
108 p = NULL; | |
109 else | |
110 { | |
111 p = GC_malloc(size); | |
112 if (!p) | |
113 error(); | |
114 else | |
115 memcpy(p,o,size); | |
116 } | |
117 return p; | |
118 } | |
119 | |
120 void Mem::error() | |
121 { | |
122 printf("Error: out of memory\n"); | |
123 exit(EXIT_FAILURE); | |
124 } | |
125 | |
126 void Mem::fullcollect() | |
127 { | |
128 GC_gcollect(); | |
129 } | |
130 | |
131 void Mem::mark(void *pointer) | |
132 { | |
133 (void) pointer; // necessary for VC /W4 | |
134 } | |
135 | |
136 /* =================================================== */ | |
137 | |
138 void * operator new(size_t m_size) | |
6 | 139 { |
140 // without this we segfault with gc 7.0 | |
141 if (!gc_was_init) { | |
142 mem.init(); | |
143 } | |
1 | 144 void *p = GC_malloc(m_size); |
145 if (p) | |
146 return p; | |
147 printf("Error: out of memory\n"); | |
148 exit(EXIT_FAILURE); | |
149 return p; | |
150 } | |
151 | |
152 void operator delete(void *p) | |
153 { | |
154 GC_free(p); | |
155 } | |
156 | |
268
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
157 #elif !USE_BOEHM_GC |
1 | 158 |
268
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
159 void Mem::init() |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
160 { |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
161 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
162 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
163 char *Mem::strdup(const char *s) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
164 { |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
165 char *p; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
166 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
167 if (s) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
168 { |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
169 p = ::strdup(s); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
170 if (p) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
171 return p; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
172 error(); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
173 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
174 return NULL; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
175 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
176 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
177 void *Mem::malloc(size_t size) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
178 { void *p; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
179 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
180 if (!size) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
181 p = NULL; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
182 else |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
183 { |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
184 p = ::malloc(size); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
185 if (!p) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
186 error(); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
187 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
188 return p; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
189 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
190 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
191 void *Mem::calloc(size_t size, size_t n) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
192 { void *p; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
193 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
194 if (!size || !n) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
195 p = NULL; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
196 else |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
197 { |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
198 p = ::malloc(size * n); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
199 if (!p) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
200 error(); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
201 memset(p, 0, size * n); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
202 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
203 return p; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
204 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
205 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
206 void *Mem::realloc(void *p, size_t size) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
207 { |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
208 if (!size) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
209 { if (p) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
210 { ::free(p); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
211 p = NULL; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
212 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
213 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
214 else if (!p) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
215 { |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
216 p = ::malloc(size); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
217 if (!p) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
218 error(); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
219 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
220 else |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
221 { |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
222 p = ::realloc(p, size); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
223 if (!p) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
224 error(); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
225 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
226 return p; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
227 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
228 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
229 void Mem::free(void *p) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
230 { |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
231 if (p) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
232 ::free(p); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
233 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
234 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
235 void *Mem::mallocdup(void *o, size_t size) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
236 { void *p; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
237 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
238 if (!size) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
239 p = NULL; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
240 else |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
241 { |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
242 p = ::malloc(size); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
243 if (!p) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
244 error(); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
245 else |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
246 memcpy(p,o,size); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
247 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
248 return p; |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
249 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
250 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
251 void Mem::error() |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
252 { |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
253 printf("Error: out of memory\n"); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
254 exit(EXIT_FAILURE); |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
255 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
256 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
257 void Mem::fullcollect() |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
258 { |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
259 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
260 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
261 void Mem::mark(void *pointer) |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
262 { |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
263 } |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
264 |
23d0d9855cad
[svn r289] Fixed: right shift >> was broken for unsigned types.
lindquist
parents:
6
diff
changeset
|
265 #endif // USE_BOEHM_GC |