Mercurial > projects > ddmd
annotate dmd/backend/glue.d @ 184:9f4e5ac4f0a3
One step closer to building on posix.
There are two missing symbols so it actually doesn't build
but previously it didn't build correctly anyway.
author | Jacob Carlborg <doob@me.com> |
---|---|
date | Tue, 02 Nov 2010 08:46:11 +0100 |
parents | 190ba98276b3 |
children |
rev | line source |
---|---|
0 | 1 module dmd.backend.glue; |
2 | |
114 | 3 import dmd.common; |
0 | 4 import dmd.Array; |
5 import dmd.Dsymbol; | |
6 import dmd.File; | |
7 import dmd.FileName; | |
8 import dmd.Library; | |
9 import dmd.OutBuffer; | |
10 import dmd.Module; | |
11 import dmd.Identifier; | |
12 import dmd.AssertExp; | |
13 import dmd.TOK; | |
14 import dmd.Global; | |
15 import dmd.Param; | |
16 import dmd.backend.Config; | |
179 | 17 import dmd.backend.elem; |
0 | 18 import dmd.backend.Configv; |
19 import dmd.backend.StringTab; | |
20 | |
21 import core.stdc.string; | |
22 | |
79 | 23 version (Windows) |
24 { | |
25 | 25 extern (C++) extern |
26 { | |
27 int go_flag(char* cp); | |
28 void util_set64(); | |
29 void util_set386(); | |
30 } | |
79 | 31 } |
32 else version (linux) | |
33 { | |
34 extern (C++) | |
25 | 35 { |
36 int go_flag(char* cp); | |
37 void util_set64(); | |
38 void util_set386(); | |
39 } | |
0 | 40 } |
183
190ba98276b3
Several changes to make it build on posix systems.
Jacob Carlborg <doob@me.com>
parents:
179
diff
changeset
|
41 else version (OSX) |
190ba98276b3
Several changes to make it build on posix systems.
Jacob Carlborg <doob@me.com>
parents:
179
diff
changeset
|
42 { |
190ba98276b3
Several changes to make it build on posix systems.
Jacob Carlborg <doob@me.com>
parents:
179
diff
changeset
|
43 extern (C++) |
190ba98276b3
Several changes to make it build on posix systems.
Jacob Carlborg <doob@me.com>
parents:
179
diff
changeset
|
44 { |
190ba98276b3
Several changes to make it build on posix systems.
Jacob Carlborg <doob@me.com>
parents:
179
diff
changeset
|
45 int go_flag(char* cp); |
190ba98276b3
Several changes to make it build on posix systems.
Jacob Carlborg <doob@me.com>
parents:
179
diff
changeset
|
46 void util_set64(); |
190ba98276b3
Several changes to make it build on posix systems.
Jacob Carlborg <doob@me.com>
parents:
179
diff
changeset
|
47 void util_set386(); |
190ba98276b3
Several changes to make it build on posix systems.
Jacob Carlborg <doob@me.com>
parents:
179
diff
changeset
|
48 } |
190ba98276b3
Several changes to make it build on posix systems.
Jacob Carlborg <doob@me.com>
parents:
179
diff
changeset
|
49 } |
79 | 50 else |
51 { | |
52 static assert(false, "fix this"); | |
53 } | |
0 | 54 |
183
190ba98276b3
Several changes to make it build on posix systems.
Jacob Carlborg <doob@me.com>
parents:
179
diff
changeset
|
55 version (CPP_MANGLE) |
184
9f4e5ac4f0a3
One step closer to building on posix.
Jacob Carlborg <doob@me.com>
parents:
183
diff
changeset
|
56 { |
9f4e5ac4f0a3
One step closer to building on posix.
Jacob Carlborg <doob@me.com>
parents:
183
diff
changeset
|
57 string cpp_mangle(Dsymbol s) |
9f4e5ac4f0a3
One step closer to building on posix.
Jacob Carlborg <doob@me.com>
parents:
183
diff
changeset
|
58 { |
9f4e5ac4f0a3
One step closer to building on posix.
Jacob Carlborg <doob@me.com>
parents:
183
diff
changeset
|
59 assert(false, "port c++ mangling"); |
9f4e5ac4f0a3
One step closer to building on posix.
Jacob Carlborg <doob@me.com>
parents:
183
diff
changeset
|
60 } |
9f4e5ac4f0a3
One step closer to building on posix.
Jacob Carlborg <doob@me.com>
parents:
183
diff
changeset
|
61 } |
183
190ba98276b3
Several changes to make it build on posix systems.
Jacob Carlborg <doob@me.com>
parents:
179
diff
changeset
|
62 |
34 | 63 import std.exception; |
0 | 64 import std.string; |
65 | |
66 struct Outbuffer | |
67 { | |
68 ubyte* buf; // the buffer itself | |
69 ubyte* pend; // pointer past the end of the buffer | |
70 ubyte* p; // current position in buffer | |
71 uint len; // size of buffer | |
72 uint inc; // default increment size | |
73 | |
74 this(uint inc) | |
75 { | |
76 assert(false); | |
77 } | |
178 | 78 |
0 | 79 ~this() |
80 { | |
81 } | |
178 | 82 |
0 | 83 void reset() |
84 { | |
85 assert(false); | |
86 } | |
87 | |
88 // Reserve nbytes in buffer | |
89 void reserve(uint nbytes) | |
90 { | |
91 assert(false); | |
92 } | |
93 | |
94 // Write n zeros; return pointer to start of zeros | |
95 void* writezeros(uint n) | |
96 { | |
97 assert(false); | |
98 } | |
99 | |
100 // Position buffer to accept the specified number of bytes at offset | |
101 int position(uint offset, uint nbytes); | |
102 | |
103 // Write an array to the buffer, no reserve check | |
104 void writen(const(void)* b, int len) | |
105 { | |
106 memcpy(p,b,len); | |
107 p += len; | |
108 } | |
109 | |
110 // Clear bytes, no reserve check | |
111 void clearn(int len) | |
112 { | |
113 int i; | |
114 for (i=0; i< len; i++) | |
115 *p++ = 0; | |
116 } | |
117 | |
118 // Write an array to the buffer. | |
119 void write(const void *b, int len) | |
120 { | |
121 assert(false); | |
122 } | |
123 | |
124 void write(Outbuffer* b) | |
125 { | |
126 write(b.buf, b.p - b.buf); | |
127 } | |
128 | |
129 /** | |
130 * Flushes the stream. This will write any buffered | |
131 * output bytes. | |
132 */ | |
133 void flush() { } | |
134 | |
135 /** | |
136 * Writes an 8 bit byte, no reserve check. | |
137 */ | |
138 void writeByten(char v) | |
139 { | |
140 *p++ = v; | |
141 } | |
142 | |
143 /** | |
144 * Writes an 8 bit byte. | |
145 */ | |
146 void writeByte(int v) | |
147 { | |
148 assert(false); | |
149 } | |
150 | |
151 /** | |
152 * Writes a 16 bit little-end short, no reserve check. | |
153 */ | |
154 void writeWordn(int v) | |
155 { | |
156 version (_WIN32) { | |
157 *cast(ushort*)p = cast(short)v; | |
158 } else { | |
14
2cc604139636
Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
159 assert(0, "Check this"); |
2cc604139636
Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
160 p[0] = cast(ubyte)v; |
2cc604139636
Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
161 p[1] = cast(ubyte)(v >> 8); |
0 | 162 } |
163 p += 2; | |
164 } | |
165 | |
166 /** | |
167 * Writes a 16 bit little-end short. | |
168 */ | |
169 void writeWord(int v) | |
170 { | |
171 reserve(2); | |
172 writeWordn(v); | |
173 } | |
174 | |
175 /** | |
176 * Writes a 16 bit big-end short. | |
177 */ | |
178 void writeShort(int v) | |
179 { | |
180 if (pend - p < 2) | |
181 reserve(2); | |
182 | |
183 static if (false) { | |
184 p[0] = (cast(ubyte*)&v)[1]; | |
185 p[1] = v; | |
186 } else { | |
187 ubyte* q = p; | |
188 q[0] = cast(ubyte)(v >> 8); | |
189 q[1] = cast(ubyte)v; | |
190 } | |
191 p += 2; | |
192 } | |
193 | |
194 /** | |
195 * Writes a 16 bit char. | |
196 */ | |
197 void writeChar(int v) | |
198 { | |
199 writeShort(v); | |
200 } | |
201 | |
202 /** | |
203 * Writes a 32 bit int. | |
204 */ | |
205 void write32(long v) | |
206 { | |
207 assert(false); | |
208 } | |
209 | |
210 /** | |
211 * Writes a 64 bit long. | |
212 */ | |
213 ///#if __INTSIZE == 4 | |
214 void write64(long v) | |
215 { | |
216 assert(false); | |
217 } | |
218 ///#endif | |
219 | |
220 /** | |
221 * Writes a 32 bit float. | |
222 */ | |
223 void writeFloat(float v) | |
224 { | |
225 assert(false); | |
226 } | |
227 | |
228 /** | |
229 * Writes a 64 bit double. | |
230 */ | |
231 void writeDouble(double v) | |
232 { | |
233 assert(false); | |
234 } | |
235 | |
236 void write(const(char)* s) | |
237 { | |
238 assert(false); | |
239 } | |
240 | |
241 void write(const(ubyte)* s) | |
242 { | |
243 assert(false); | |
244 } | |
245 | |
246 void writeString(const(char)* s) | |
247 { | |
248 assert(false); | |
249 } | |
250 | |
251 void prependBytes(const(char)* s) | |
252 { | |
253 assert(false); | |
254 } | |
255 | |
256 void bracket(char c1, char c2) | |
257 { | |
258 assert(false); | |
259 } | |
260 | |
261 /** | |
262 * Returns the number of bytes written. | |
263 */ | |
264 int size() | |
265 { | |
266 return p - buf; | |
267 } | |
268 | |
269 char* toString() | |
270 { | |
271 assert(false); | |
272 } | |
178 | 273 |
0 | 274 void setsize(uint size) |
275 { | |
276 assert(false); | |
277 } | |
278 | |
279 void writesLEB128(long value) | |
280 { | |
281 assert(false); | |
282 } | |
178 | 283 |
0 | 284 void writeuLEB128(uint value) |
285 { | |
286 assert(false); | |
287 } | |
288 } | |
289 | |
290 /************************************** | |
291 * Append s to list of object files to generate later. | |
292 */ | |
178 | 293 |
0 | 294 void obj_append(Dsymbol s) |
295 { | |
176 | 296 global.obj_symbols_towrite.push(cast(void*)s); |
0 | 297 } |
298 | |
14
2cc604139636
Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
299 version (Bug4059) |
2cc604139636
Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
300 { |
2cc604139636
Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
301 private extern (C) void _Z8obj_initP9OutbufferPKcS2_(Outbuffer* objbuf, const(char)* filename, const(char)* csegname); |
2cc604139636
Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
302 void obj_init(Outbuffer* objbuf, const(char)* filename, const(char)* csegname) { return _Z8obj_initP9OutbufferPKcS2_(objbuf, filename, csegname); } |
2cc604139636
Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
303 } |
2cc604139636
Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
304 else |
2cc604139636
Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
305 { |
25 | 306 extern (C++) { |
178 | 307 void obj_init(Outbuffer* objbuf, const(char)* filename, const(char)* csegname); |
25 | 308 } |
14
2cc604139636
Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
309 } |
2cc604139636
Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
310 |
0 | 311 extern (C++) { |
312 void backend_init(); | |
313 void backend_term(); | |
314 void obj_term(); | |
315 void rtlsym_reset(); | |
316 void slist_reset(); | |
317 void el_reset(); | |
318 void cg87_reset(); | |
319 void out_reset(); | |
320 } | |
321 | |
322 void clearStringTab() | |
323 { | |
324 //printf("clearStringTab()\n"); | |
176 | 325 memset(global.stringTab.ptr, 0, global.stringTab.sizeof); |
326 global.stidx = 0; | |
0 | 327 |
165
25ede4f66bda
Temporarily disabled GC (again) because phobos fails to compile with it (looks like some ObjSymbols are being falsely collected, see Library.d:666)
korDen
parents:
140
diff
changeset
|
328 // assertexp_sfilename = null; |
25ede4f66bda
Temporarily disabled GC (again) because phobos fails to compile with it (looks like some ObjSymbols are being falsely collected, see Library.d:666)
korDen
parents:
140
diff
changeset
|
329 // assertexp_name = null; |
25ede4f66bda
Temporarily disabled GC (again) because phobos fails to compile with it (looks like some ObjSymbols are being falsely collected, see Library.d:666)
korDen
parents:
140
diff
changeset
|
330 // assertexp_mn = null; |
0 | 331 } |
332 | |
333 void obj_start(char *srcfile) | |
334 { | |
335 //printf("obj_start()\n"); | |
336 | |
337 out_config_init(); | |
338 | |
339 rtlsym_reset(); | |
340 slist_reset(); | |
341 clearStringTab(); | |
342 | |
176 | 343 obj_init(&global.objbuf, srcfile, null); |
0 | 344 |
345 el_reset(); | |
346 cg87_reset(); | |
347 out_reset(); | |
348 } | |
349 | |
350 void obj_end(Library library, File objfile) | |
351 { | |
352 obj_term(); | |
178 | 353 |
176 | 354 auto objbuf = &global.objbuf; |
0 | 355 |
356 if (library) | |
357 { | |
358 // Transfer image to library | |
359 library.addObject(objfile.name.toChars(), objbuf.buf, objbuf.p - objbuf.buf); | |
360 objbuf.buf = null; | |
361 } | |
362 else | |
363 { | |
364 // Transfer image to file | |
365 objfile.setbuffer(objbuf.buf, objbuf.p - objbuf.buf); | |
366 objbuf.buf = null; | |
367 | |
368 string p = FileName.path(objfile.name.toChars()); | |
369 FileName.ensurePathExists(p); | |
370 //mem.free(p); | |
371 | |
372 //printf("write obj %s\n", objfile.name.toChars()); | |
373 objfile.writev(); | |
374 } | |
375 | |
376 objbuf.pend = null; | |
377 objbuf.p = null; | |
378 objbuf.len = 0; | |
379 objbuf.inc = 0; | |
380 } | |
381 | |
382 void obj_write_deferred(Library library) | |
383 { | |
176 | 384 auto obj_symbols_towrite = global.obj_symbols_towrite; |
0 | 385 for (int i = 0; i < obj_symbols_towrite.dim; i++) |
178 | 386 { |
0 | 387 Dsymbol s = cast(Dsymbol)obj_symbols_towrite.data[i]; |
388 Module m = s.getModule(); | |
389 | |
390 string mname; | |
391 if (m) | |
178 | 392 { |
0 | 393 mname = m.srcfile.toChars(); |
176 | 394 global.lastmname = mname; |
0 | 395 } |
396 else | |
397 { | |
398 //mname = s->ident->toChars(); | |
176 | 399 mname = global.lastmname; |
0 | 400 assert(mname.length != 0); |
401 } | |
402 | |
403 obj_start(cast(char*)toStringz(mname)); | |
404 | |
176 | 405 int count = ++global.count; // sequence for generating names |
0 | 406 |
407 /* Create a module that's a doppelganger of m, with just | |
408 * enough to be able to create the moduleinfo. | |
409 */ | |
74
7e0d548de9e6
Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents:
34
diff
changeset
|
410 auto idbuf = new OutBuffer(); |
0 | 411 idbuf.printf("%s.%d", m ? m.ident.toChars() : mname, count); |
412 string idstr = idbuf.extractString(); | |
413 idbuf.data = null; | |
414 Identifier id = new Identifier(idstr, TOK.TOKidentifier); | |
415 | |
74
7e0d548de9e6
Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents:
34
diff
changeset
|
416 auto md = new Module(mname, id, 0, 0); |
7e0d548de9e6
Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents:
34
diff
changeset
|
417 md.members = new Dsymbols(); |
7e0d548de9e6
Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents:
34
diff
changeset
|
418 md.members.push(s); // its only 'member' is s |
0 | 419 if (m) |
420 { | |
421 md.doppelganger = 1; // identify this module as doppelganger | |
422 md.md = m.md; | |
423 md.aimports.push(cast(void*)m); // it only 'imports' m | |
424 md.massert = m.massert; | |
425 md.marray = m.marray; | |
426 } | |
427 | |
428 md.genobjfile(0); | |
429 | |
430 /* Set object file name to be source name with sequence number, | |
431 * as mangled symbol names get way too long. | |
432 */ | |
433 string fname = FileName.removeExt(mname); | |
178 | 434 |
0 | 435 OutBuffer namebuf = new OutBuffer(); |
436 uint hash = 0; | |
437 foreach (char c; s.toChars()) | |
438 hash += c; | |
439 | |
440 namebuf.printf("%s_%x_%x.%s", fname, count, hash, global.obj_ext); | |
441 fname = namebuf.extractString(); | |
442 | |
443 //printf("writing '%s'\n", fname); | |
444 File objfile = new File(fname); | |
445 obj_end(library, objfile); | |
446 } | |
447 | |
448 obj_symbols_towrite.dim = 0; | |
449 } | |
450 | |
451 /************************************** | |
452 * Initialize config variables. | |
453 */ | |
454 | |
455 void out_config_init() | |
456 { | |
457 Param* params = &global.params; | |
458 | |
459 if (!config.target_cpu) | |
460 { | |
461 config.target_cpu = TARGET_PentiumPro; | |
462 config.target_scheduler = config.target_cpu; | |
463 } | |
464 config.fulltypes = CVNONE; | |
465 config.inline8087 = 1; | |
466 config.memmodel = 0; | |
467 config.flags |= CFGuchar; // make sure TYchar is unsigned | |
468 version (TARGET_WINDOS) { | |
469 if (params.isX86_64) | |
470 config.exe = EX_WIN64; | |
471 else | |
472 config.exe = EX_NT; | |
473 | |
474 // Win32 eh | |
475 config.flags2 |= CFG2seh; | |
476 | |
477 if (params.run) | |
478 config.wflags |= WFexe; // EXE file only optimizations | |
479 else if (params.link && !global.params.deffile) | |
480 config.wflags |= WFexe; // EXE file only optimizations | |
481 else if (params.exefile) // if writing out EXE file | |
178 | 482 { |
0 | 483 size_t len = params.exefile.length; |
484 if (len >= 4 && icmp(params.exefile[len-3..len], "exe") == 0) | |
485 config.wflags |= WFexe; | |
486 } | |
487 config.flags4 |= CFG4underscore; | |
488 } | |
489 version (TARGET_LINUX) { | |
490 if (params.isX86_64) | |
491 config.exe = EX_LINUX64; | |
492 else | |
493 config.exe = EX_LINUX; | |
494 config.flags |= CFGnoebp; | |
495 config.flags |= CFGalwaysframe; | |
496 if (params.pic) | |
497 config.flags3 |= CFG3pic; | |
498 } | |
499 version (TARGET_OSX) { | |
500 if (params.isX86_64) | |
501 config.exe = EX_OSX64; | |
502 else | |
503 config.exe = EX_OSX; | |
504 config.flags |= CFGnoebp; | |
505 config.flags |= CFGalwaysframe; | |
506 if (params.pic) | |
507 config.flags3 |= CFG3pic; | |
508 } | |
509 version (TARGET_FREEBSD) { | |
510 if (params.isX86_64) | |
511 config.exe = EX_FREEBSD64; | |
512 else | |
513 config.exe = EX_FREEBSD; | |
514 config.flags |= CFGnoebp; | |
515 config.flags |= CFGalwaysframe; | |
516 if (params.pic) | |
517 config.flags3 |= CFG3pic; | |
518 } | |
519 version (TARGET_SOLARIS) { | |
520 if (params.isX86_64) | |
521 config.exe = EX_SOLARIS64; | |
522 else | |
523 config.exe = EX_SOLARIS; | |
524 config.flags |= CFGnoebp; | |
525 config.flags |= CFGalwaysframe; | |
526 if (params.pic) | |
527 config.flags3 |= CFG3pic; | |
528 } | |
529 config.flags2 |= CFG2nodeflib; // no default library | |
530 config.flags3 |= CFG3eseqds; | |
531 static if (false) { | |
532 if (env.getEEcontext().EEcompile != 2) | |
533 config.flags4 |= CFG4allcomdat; | |
534 if (env.nochecks()) | |
535 config.flags4 |= CFG4nochecks; // no runtime checking | |
536 } else version (TARGET_OSX) { | |
537 } else { | |
538 config.flags4 |= CFG4allcomdat; | |
539 } | |
540 if (params.trace) | |
541 config.flags |= CFGtrace; // turn on profiler | |
542 if (params.nofloat) | |
543 config.flags3 |= CFG3wkfloat; | |
544 | |
545 configv.verbose = params.verbose; | |
546 | |
547 if (params.optimize) | |
548 go_flag(cast(char*)"-o".ptr); | |
549 | |
550 if (params.symdebug) | |
551 { | |
552 version (ELFOBJ_OR_MACHOBJ) { | |
553 configv.addlinenumbers = 1; | |
554 config.fulltypes = (params.symdebug == 1) ? CVDWARF_D : CVDWARF_C; | |
555 } | |
556 version (OMFOBJ) { | |
557 configv.addlinenumbers = 1; | |
558 config.fulltypes = CV4; | |
559 } | |
560 if (!params.optimize) | |
561 config.flags |= CFGalwaysframe; | |
562 } | |
563 else | |
564 { | |
565 configv.addlinenumbers = 0; | |
566 config.fulltypes = CVNONE; | |
567 //config.flags &= ~CFGalwaysframe; | |
568 } | |
569 | |
570 if (params.isX86_64) | |
571 { | |
572 util_set64(); | |
573 cod3_set64(); | |
574 } | |
575 else | |
576 { | |
577 util_set386(); | |
578 cod3_set386(); | |
579 } | |
580 | |
581 debug { | |
582 debugb = params.debugb; | |
583 debugc = params.debugc; | |
584 debugf = params.debugf; | |
585 debugr = params.debugr; | |
586 debugw = params.debugw; | |
587 debugx = params.debugx; | |
588 debugy = params.debugy; | |
589 } | |
14
2cc604139636
Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
590 } |