Mercurial > projects > ldc
annotate dmd/mem.c @ 948:780530d1cad3
Revert templates to old behavior.
While emitting a template instantiation only once is good for compile times
and binary sizes, it doesn't work with linkonce linkage as inlined function
bodies could be discarded. Since we don't want to inhibit inlining, templates
are reverted to the previous behavior, where an instantiation is emitted for
each module using it.
In the future, a custom inlining pass may allow us to switch back to
common/weak linkage and reenable smart template instance emission.
author | Christian Kamm <kamm incasoftware de> |
---|---|
date | Sun, 08 Feb 2009 21:44:46 +0100 |
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 |