Mercurial > projects > ldc
annotate dmd/mars.c @ 650:aa6a0b7968f7
Added test case for bug #100
Removed dubious check for not emitting static private global in other modules without access. This should be handled properly somewhere else, it's causing unresolved global errors for stuff that should work (in MiniD)
author | Tomas Lindquist Olsen <tomas.l.olsen@gmail.com> |
---|---|
date | Sun, 05 Oct 2008 17:28:15 +0200 |
parents | 94b01f15814f |
children | 5709381df7e8 |
rev | line source |
---|---|
159 | 1 // Compiler implementation of the D programming language |
2 // Copyright (c) 1999-2008 by Digital Mars | |
3 // All Rights Reserved | |
4 // written by Walter Bright | |
5 // http://www.digitalmars.com | |
6 // License for redistribution is by either the Artistic License | |
7 // in artistic.txt, or the GNU General Public License in gnu.txt. | |
8 // See the included readme.txt for details. | |
9 | |
10 #include <stdio.h> | |
11 #include <stdlib.h> | |
12 #include <ctype.h> | |
13 #include <assert.h> | |
14 #include <limits.h> | |
15 #include <string> | |
16 #include <cstdarg> | |
17 | |
18 #if __DMC__ | |
19 #include <dos.h> | |
20 #endif | |
21 | |
571
cbd6c8073a32
Changed all '#if linux || __APPLE__' to '#if POSIX' so we can support other platforms too, thanx for the suggestion anders.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
568
diff
changeset
|
22 #if POSIX |
159 | 23 #include <errno.h> |
432 | 24 #elif _WIN32 |
25 #include <windows.h> | |
159 | 26 #endif |
27 | |
28 #include "mem.h" | |
29 #include "root.h" | |
30 | |
31 #include "mars.h" | |
32 #include "module.h" | |
33 #include "mtype.h" | |
34 #include "id.h" | |
35 #include "cond.h" | |
36 #include "expression.h" | |
37 #include "lexer.h" | |
38 | |
39 #include "gen/logger.h" | |
277
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
40 #include "gen/linker.h" |
159 | 41 |
42 void getenv_setargv(const char *envvar, int *pargc, char** *pargv); | |
43 | |
44 Global global; | |
45 | |
46 Global::Global() | |
47 { | |
48 mars_ext = "d"; | |
49 sym_ext = "d"; | |
50 hdr_ext = "di"; | |
51 doc_ext = "html"; | |
52 ddoc_ext = "ddoc"; | |
53 | |
374
1f20b9f7de1b
Fix nativeobj extension for Windows.
Christian Kamm <kamm incasoftware de>
parents:
366
diff
changeset
|
54 // LLVMDC |
159 | 55 obj_ext = "bc"; |
56 ll_ext = "ll"; | |
57 bc_ext = "bc"; | |
374
1f20b9f7de1b
Fix nativeobj extension for Windows.
Christian Kamm <kamm incasoftware de>
parents:
366
diff
changeset
|
58 #if _WIN32 |
1f20b9f7de1b
Fix nativeobj extension for Windows.
Christian Kamm <kamm incasoftware de>
parents:
366
diff
changeset
|
59 nativeobj_ext = "obj"; |
571
cbd6c8073a32
Changed all '#if linux || __APPLE__' to '#if POSIX' so we can support other platforms too, thanx for the suggestion anders.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
568
diff
changeset
|
60 #elif POSIX |
159 | 61 nativeobj_ext = "o"; |
62 #else | |
63 #error "fix this" | |
64 #endif | |
65 | |
66 copyright = "Copyright (c) 1999-2008 by Digital Mars and Tomas Lindquist Olsen"; | |
67 written = "written by Walter Bright and Tomas Lindquist Olsen"; | |
546
406aee3416bb
Removed D_InlineAsm and D_InlineAsm_X86 versions.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
542
diff
changeset
|
68 version = "v1.034"; |
159 | 69 llvmdc_version = "0.1"; |
70 global.structalign = 8; | |
71 | |
72 memset(¶ms, 0, sizeof(Param)); | |
73 } | |
74 | |
75 char *Loc::toChars() const | |
76 { | |
77 OutBuffer buf; | |
78 char *p; | |
79 | |
80 if (filename) | |
81 { | |
82 buf.printf("%s", filename); | |
83 } | |
84 | |
85 if (linnum) | |
86 buf.printf("(%d)", linnum); | |
87 buf.writeByte(0); | |
88 return (char *)buf.extractData(); | |
89 } | |
90 | |
91 Loc::Loc(Module *mod, unsigned linnum) | |
92 { | |
93 this->linnum = linnum; | |
94 this->filename = mod ? mod->srcfile->toChars() : NULL; | |
95 } | |
96 | |
97 /************************************** | |
98 * Print error message and exit. | |
99 */ | |
100 | |
101 void error(Loc loc, const char *format, ...) | |
102 { | |
103 va_list ap; | |
104 va_start(ap, format); | |
105 verror(loc, format, ap); | |
106 va_end( ap ); | |
107 } | |
108 | |
109 void verror(Loc loc, const char *format, va_list ap) | |
110 { | |
111 if (!global.gag) | |
112 { | |
113 char *p = loc.toChars(); | |
114 | |
115 if (*p) | |
116 fprintf(stdmsg, "%s: ", p); | |
117 mem.free(p); | |
118 | |
119 fprintf(stdmsg, "Error: "); | |
120 vfprintf(stdmsg, format, ap); | |
121 fprintf(stdmsg, "\n"); | |
122 fflush(stdmsg); | |
123 } | |
124 global.errors++; | |
125 } | |
126 | |
127 /*************************************** | |
128 * Call this after printing out fatal error messages to clean up and exit | |
129 * the compiler. | |
130 */ | |
131 | |
132 void fatal() | |
133 { | |
134 #if 0 | |
135 halt(); | |
136 #endif | |
137 exit(EXIT_FAILURE); | |
138 } | |
139 | |
140 /************************************** | |
141 * Try to stop forgetting to remove the breakpoints from | |
142 * release builds. | |
143 */ | |
144 void halt() | |
145 { | |
146 #ifdef DEBUG | |
147 *(char*)0=0; | |
148 #endif | |
149 } | |
150 | |
151 extern void backend_init(); | |
152 extern void backend_term(); | |
153 | |
154 void usage() | |
155 { | |
546
406aee3416bb
Removed D_InlineAsm and D_InlineAsm_X86 versions.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
542
diff
changeset
|
156 printf("LLVM D Compiler %s (based on DMD %s and LLVM 2.4svn)\n%s\n%s\n", |
159 | 157 global.llvmdc_version, global.version, global.copyright, global.written); |
158 printf("\ | |
159 D Language Documentation: http://www.digitalmars.com/d/1.0/index.html\n\ | |
160 LLVMDC Homepage: http://www.dsource.org/projects/llvmdc\n\ | |
161 Usage:\n\ | |
323
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
306
diff
changeset
|
162 llvmdc files.d ... { -switch }\n\ |
159 | 163 \n\ |
164 files.d D source files\n%s\ | |
547
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
165 -of<filename> name output file to <filename>\n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
166 -o- do not write object file\n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
167 -od<objdir> write object files to directory <objdir>\n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
168 -op do not strip paths from source file\n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
169 -oq write object files with fully qualified names\n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
170 \n\ |
159 | 171 -c do not link\n\ |
547
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
172 -L<linkerflag> pass <linkerflag> to llvm-ld\n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
173 \n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
174 -g add symbolic debug info\n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
175 -gc add symbolic debug info, pretend to be C\n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
176 \n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
177 -w enable warnings\n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
178 \n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
179 -H generate 'header' file\n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
180 -Hd<hdrdir> write 'header' file to <hdrdir> directory\n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
181 -Hf<filename> write 'header' file to <filename>\n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
182 \n\ |
159 | 183 -D generate documentation\n\ |
184 -Dd<docdir> write documentation file to <docdir> directory\n\ | |
185 -Df<filename> write documentation file to <filename>\n\ | |
547
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
186 \n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
187 Codegen control:\n\ |
323
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
306
diff
changeset
|
188 -m<arch> emit code specific to <arch> being one of:\n\ |
159 | 189 x86 x86-64 ppc32 ppc64\n\ |
547
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
190 -t<os> emit code specific to <os> being one of:\n\ |
638
94b01f15814f
Added FreeBSD support to the -t switch
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
637
diff
changeset
|
191 Linux, Windows, MacOSX, FreeBSD\n\ |
547
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
192 \n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
193 -O optimize, same as -O2\n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
194 -O<n> optimize at level <n> (0-5)\n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
195 -inline do function inlining\n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
196 \n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
197 -debug enables asserts, invariants, contracts, boundscheck\n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
198 and sets debug=1\n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
199 -release disables asserts, invariants, contracts boundscheck\n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
200 \n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
201 -enable-<feature> and\n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
202 -disable-<feature> where <feature> is one of\n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
203 asserts assert statements (default: on)\n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
204 invariants class and struct invariants (default: on)\n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
205 contracts function contracts (default: on)\n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
206 boundscheck array bounds checking (default: on)\n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
207 -debug=level compile in debug stmts <= level (default: 0)\n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
208 -debug=ident compile in debug stmts identified by ident\n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
209 -version=level compile in version code >= level\n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
210 -version=ident compile in version code identified by ident\n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
211 \n\ |
237
a168a2c3ea48
[svn r253] Removed -inlineasm option. inline asm is now enabled by default unless the new -noasm option is passed.
lindquist
parents:
220
diff
changeset
|
212 -noasm do not allow use of inline asm\n\ |
159 | 213 -noruntime do not allow code that generates implicit runtime calls\n\ |
214 -noverify do not run the validation pass before writing bitcode\n\ | |
547
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
215 -unittest compile in unit tests\n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
216 -d allow deprecated features\n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
217 \n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
218 -annotate annotate the bitcode with human readable source code\n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
219 -dis disassemble module after compiling\n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
220 -ignore ignore unsupported pragmas\n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
221 \n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
222 Path options:\n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
223 -I<path> where to look for imports\n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
224 -J<path> where to look for string imports\n\ |
567
aaba4f7c6d8a
Get rid of runtime path. Allow defaultlib and debuglib switches to be given multiple times.
Christian Kamm <kamm incasoftware de>
parents:
550
diff
changeset
|
225 -defaultlib=name set default library for non-debug build\n\ |
aaba4f7c6d8a
Get rid of runtime path. Allow defaultlib and debuglib switches to be given multiple times.
Christian Kamm <kamm incasoftware de>
parents:
550
diff
changeset
|
226 -debuglib=name set default library for debug build\n\ |
547
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
227 \n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
228 Misc options:\n\ |
159 | 229 -v verbose\n\ |
230 -vv very verbose (does not include -v)\n\ | |
547
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
231 -quiet suppress unnecessary messages\n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
232 -run srcfile args... run resulting program, passing args\n\ |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
233 --help print help\n\ |
159 | 234 ", |
235 #if WIN32 | |
236 " @cmdfile read arguments from cmdfile\n" | |
237 #else | |
238 "" | |
239 #endif | |
240 ); | |
241 } | |
242 | |
243 int main(int argc, char *argv[]) | |
244 { | |
245 int i; | |
246 Array files; | |
247 char *p; | |
248 Module *m; | |
249 int status = EXIT_SUCCESS; | |
250 int argcstart = argc; | |
251 bool very_verbose = false; | |
252 | |
253 // Check for malformed input | |
254 if (argc < 1 || !argv) | |
255 { | |
256 Largs: | |
257 error("missing or null command line arguments"); | |
258 fatal(); | |
259 } | |
260 for (i = 0; i < argc; i++) | |
261 { | |
262 if (!argv[i]) | |
263 goto Largs; | |
264 } | |
265 | |
266 #if __DMC__ // DMC unique support for response files | |
267 if (response_expand(&argc,&argv)) // expand response files | |
268 error("can't open response file"); | |
269 #endif | |
270 | |
271 files.reserve(argc - 1); | |
272 | |
273 // Set default values | |
432 | 274 #if _WIN32 |
275 char buf[MAX_PATH]; | |
276 GetModuleFileName(NULL, buf, MAX_PATH); | |
277 global.params.argv0 = buf; | |
278 #else | |
159 | 279 global.params.argv0 = argv[0]; |
432 | 280 #endif |
159 | 281 global.params.link = 1; |
530
d30c40f1128d
Make class invariants work.
Christian Kamm <kamm incasoftware de>
parents:
510
diff
changeset
|
282 global.params.useAssert = 1; |
327
781af50846b2
[svn r348] Switch on class invariants (except in release mode).
ChristianK
parents:
323
diff
changeset
|
283 global.params.useInvariants = 1; |
159 | 284 global.params.useIn = 1; |
285 global.params.useOut = 1; | |
439
47b64d06eb9f
Enable array bounds check and emit them in IndexExp.
Christian Kamm <kamm incasoftware de>
parents:
432
diff
changeset
|
286 global.params.useArrayBounds = 1; |
331
04e1b4930975
[svn r352] Implement SwitchErrorStatement. Fixes #52.
ChristianK
parents:
327
diff
changeset
|
287 global.params.useSwitchError = 1; |
159 | 288 global.params.useInline = 0; // this one messes things up to a point where codegen breaks |
289 global.params.llvmInline = 0; // use this one instead to know if inline passes should be run | |
290 global.params.obj = 1; | |
548
8d709660cd24
Do not set Dversion to 1. Dversion = 2 means we use post 1.000 additions to D1.
Christian Kamm <kamm incasoftware de>
parents:
547
diff
changeset
|
291 global.params.Dversion = 2; |
159 | 292 global.params.quiet = 1; |
293 | |
294 global.params.linkswitches = new Array(); | |
295 global.params.libfiles = new Array(); | |
296 global.params.objfiles = new Array(); | |
297 global.params.ddocfiles = new Array(); | |
298 | |
299 global.params.is64bit = sizeof(void*) == 8 ? 1 : 0; | |
300 | |
301 uint16_t endiantest = 0xFF00; | |
302 uint8_t endianres = ((uint8_t*)&endiantest)[0]; | |
303 if (endianres == 0x00) | |
304 global.params.isLE = true; | |
305 else if (endianres == 0xFF) | |
306 global.params.isLE = false; | |
307 else { | |
308 error("Endian test is broken"); | |
309 fatal(); | |
310 } | |
311 | |
312 global.params.llvmArch = 0; | |
313 global.params.forceBE = 0; | |
314 global.params.noruntime = 0; | |
315 global.params.novalidate = 0; | |
316 global.params.optimizeLevel = -1; | |
317 global.params.runtimeImppath = 0; | |
237
a168a2c3ea48
[svn r253] Removed -inlineasm option. inline asm is now enabled by default unless the new -noasm option is passed.
lindquist
parents:
220
diff
changeset
|
318 global.params.useInlineAsm = 1; |
159 | 319 |
320 // Predefine version identifiers | |
321 #if IN_LLVM | |
322 VersionCondition::addPredefinedGlobalIdent("LLVM"); | |
323 VersionCondition::addPredefinedGlobalIdent("LLVMDC"); | |
324 #endif | |
486
a34078905d01
Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
484
diff
changeset
|
325 |
534
7e2867ed70d9
Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents:
530
diff
changeset
|
326 // setup default target os to be build os |
159 | 327 #if _WIN32 |
534
7e2867ed70d9
Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents:
530
diff
changeset
|
328 global.params.os = OSWindows; |
159 | 329 #elif linux |
534
7e2867ed70d9
Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents:
530
diff
changeset
|
330 global.params.os = OSLinux; |
541
4b7925bc1605
Fixed some osx mistakes.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
536
diff
changeset
|
331 #elif __APPLE__ |
536
0d2db7efa105
Add isnan for __APPLE__ and darwin version ident for OSX.
Christian Kamm <kamm incasoftware de>
parents:
535
diff
changeset
|
332 global.params.os = OSMacOSX; |
637
29dc68c949b0
Applied the FreeBSD patch from Ralith, closes ticket #95 , slightly changed but basically the same. Thanx Ralith :)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
583
diff
changeset
|
333 #elif __FreeBSD__ |
29dc68c949b0
Applied the FreeBSD patch from Ralith, closes ticket #95 , slightly changed but basically the same. Thanx Ralith :)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
583
diff
changeset
|
334 global.params.os = OSFreeBSD; |
159 | 335 #else |
637
29dc68c949b0
Applied the FreeBSD patch from Ralith, closes ticket #95 , slightly changed but basically the same. Thanx Ralith :)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
583
diff
changeset
|
336 #error Unsupported OS |
159 | 337 #endif /* linux */ |
338 | |
566
68d7df3f9b05
Added some sanity checks for target detection.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
550
diff
changeset
|
339 assert(global.params.os != OSinvalid); |
68d7df3f9b05
Added some sanity checks for target detection.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
550
diff
changeset
|
340 |
159 | 341 //VersionCondition::addPredefinedGlobalIdent("D_Bits"); |
342 VersionCondition::addPredefinedGlobalIdent("all"); | |
343 | |
344 #if _WIN32 | |
432 | 345 inifile(global.params.argv0, "llvmdc.ini"); |
571
cbd6c8073a32
Changed all '#if linux || __APPLE__' to '#if POSIX' so we can support other platforms too, thanx for the suggestion anders.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
568
diff
changeset
|
346 #elif POSIX |
432 | 347 inifile(global.params.argv0, "llvmdc.conf"); |
159 | 348 #else |
349 #error | |
350 #endif | |
351 getenv_setargv("DFLAGS", &argc, &argv); | |
352 | |
353 #if 0 | |
354 for (i = 0; i < argc; i++) | |
355 { | |
356 printf("argv[%d] = '%s'\n", i, argv[i]); | |
357 } | |
358 #endif | |
359 | |
360 for (i = 1; i < argc; i++) | |
361 { | |
362 p = argv[i]; | |
363 if (*p == '-') | |
364 { | |
365 if (strcmp(p + 1, "d") == 0) | |
366 global.params.useDeprecated = 1; | |
367 else if (strcmp(p + 1, "c") == 0) | |
368 global.params.link = 0; | |
369 else if (strcmp(p + 1, "fPIC") == 0) | |
370 global.params.pic = 1; | |
371 else if (strcmp(p + 1, "g") == 0) | |
372 global.params.symdebug = 1; | |
373 else if (strcmp(p + 1, "gc") == 0) | |
374 global.params.symdebug = 2; | |
375 else if (strcmp(p + 1, "v") == 0) | |
376 global.params.verbose = 1; | |
377 else if (strcmp(p + 1, "vv") == 0) { | |
378 Logger::enable(); | |
379 very_verbose = true; | |
380 } | |
381 else if (strcmp(p + 1, "v1") == 0) | |
382 global.params.Dversion = 1; | |
383 else if (strcmp(p + 1, "w") == 0) | |
384 global.params.warnings = 1; | |
385 else if (p[1] == 'O') | |
386 { | |
387 global.params.optimize = 1; | |
388 global.params.optimizeLevel = 2; | |
389 if (p[2] != 0) { | |
390 int optlevel = atoi(p+2); | |
391 if (optlevel < 0 || optlevel > 5) { | |
392 error("Optimization level must be between 0 and 5. Using default (%d)", | |
393 global.params.optimizeLevel); | |
394 } | |
395 else { | |
396 global.params.optimizeLevel = optlevel; | |
397 } | |
398 } | |
399 } | |
400 else if (strcmp(p + 1, "forcebe") == 0) | |
401 global.params.forceBE = 1; | |
402 else if (strcmp(p + 1, "noruntime") == 0) | |
403 global.params.noruntime = 1; | |
404 else if (strcmp(p + 1, "noverify") == 0) | |
405 global.params.novalidate = 1; | |
406 else if (strcmp(p + 1, "dis") == 0) | |
407 global.params.disassemble = 1; | |
408 else if (strcmp(p + 1, "annotate") == 0) | |
409 global.params.llvmAnnotate = 1; | |
547
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
410 else if (strncmp(p + 1, "enable-", 7) == 0 || |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
411 strncmp(p + 1, "disable-", 8) == 0) |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
412 { |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
413 bool enable = (p[1] == 'e'); |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
414 char* feature = p + 1 + (enable ? 7 : 8); |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
415 if (strcmp(feature, "asserts") == 0) |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
416 global.params.useAssert = enable; |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
417 else if (strcmp(feature, "boundscheck") == 0) |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
418 global.params.useArrayBounds = enable; |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
419 else if (strcmp(feature, "contracts") == 0) |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
420 { |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
421 global.params.useIn = enable; |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
422 global.params.useOut = enable; |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
423 } |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
424 else if (strcmp(feature, "invariants") == 0) |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
425 global.params.useInvariants = enable; |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
426 else |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
427 error("unrecognized feature '%s'", feature); |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
428 } |
237
a168a2c3ea48
[svn r253] Removed -inlineasm option. inline asm is now enabled by default unless the new -noasm option is passed.
lindquist
parents:
220
diff
changeset
|
429 else if (strcmp(p + 1, "noasm") == 0) |
a168a2c3ea48
[svn r253] Removed -inlineasm option. inline asm is now enabled by default unless the new -noasm option is passed.
lindquist
parents:
220
diff
changeset
|
430 global.params.useInlineAsm = 0; |
159 | 431 else if (p[1] == 'o') |
432 { | |
433 switch (p[2]) | |
434 { | |
435 case '-': | |
436 global.params.obj = 0; | |
437 break; | |
438 | |
439 case 'd': | |
440 if (!p[3]) | |
441 goto Lnoarg; | |
442 global.params.objdir = p + 3; | |
443 break; | |
444 | |
445 case 'f': | |
446 if (!p[3]) | |
447 goto Lnoarg; | |
448 global.params.objname = p + 3; | |
449 break; | |
450 | |
451 case 'p': | |
452 if (p[3]) | |
453 goto Lerror; | |
454 global.params.preservePaths = 1; | |
455 break; | |
456 | |
580
7824c21a58e3
Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents:
572
diff
changeset
|
457 case 'q': |
7824c21a58e3
Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents:
572
diff
changeset
|
458 if (p[3]) |
7824c21a58e3
Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents:
572
diff
changeset
|
459 goto Lerror; |
7824c21a58e3
Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents:
572
diff
changeset
|
460 global.params.fqnNames = 1; |
7824c21a58e3
Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents:
572
diff
changeset
|
461 break; |
217
0806379a5eca
[svn r233] Added: -oq command line option for writing fully qualified object names.
lindquist
parents:
205
diff
changeset
|
462 |
159 | 463 case 0: |
464 error("-o no longer supported, use -of or -od"); | |
465 break; | |
466 | |
467 default: | |
468 goto Lerror; | |
469 } | |
470 } | |
471 else if (p[1] == 'D') | |
472 { global.params.doDocComments = 1; | |
473 switch (p[2]) | |
474 { | |
475 case 'd': | |
476 if (!p[3]) | |
477 goto Lnoarg; | |
478 global.params.docdir = p + 3; | |
479 break; | |
480 case 'f': | |
481 if (!p[3]) | |
482 goto Lnoarg; | |
483 global.params.docname = p + 3; | |
484 break; | |
485 | |
486 case 0: | |
487 break; | |
488 | |
489 default: | |
490 goto Lerror; | |
491 } | |
492 } | |
493 #ifdef _DH | |
494 else if (p[1] == 'H') | |
495 { global.params.doHdrGeneration = 1; | |
496 switch (p[2]) | |
497 { | |
498 case 'd': | |
499 if (!p[3]) | |
500 goto Lnoarg; | |
501 global.params.hdrdir = p + 3; | |
502 break; | |
503 | |
504 case 'f': | |
505 if (!p[3]) | |
506 goto Lnoarg; | |
507 global.params.hdrname = p + 3; | |
508 break; | |
509 | |
510 case 0: | |
511 break; | |
512 | |
513 default: | |
514 goto Lerror; | |
515 } | |
516 } | |
517 #endif | |
518 else if (strcmp(p + 1, "ignore") == 0) | |
519 global.params.ignoreUnsupportedPragmas = 1; | |
520 else if (strcmp(p + 1, "inline") == 0) { | |
521 // TODO | |
522 // the ast rewrites dmd does for inlining messes up the ast. | |
523 // someday maybe we can support it, for now llvm does an excellent job at inlining | |
524 global.params.useInline = 0; //1 | |
525 global.params.llvmInline = 1; | |
526 } | |
527 else if (strcmp(p + 1, "quiet") == 0) | |
528 global.params.quiet = 1; | |
529 else if (strcmp(p + 1, "release") == 0) | |
547
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
530 { |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
531 global.params.useInvariants = 0; |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
532 global.params.useIn = 0; |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
533 global.params.useOut = 0; |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
534 global.params.useAssert = 0; |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
535 global.params.useArrayBounds = 0; |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
536 } |
159 | 537 else if (strcmp(p + 1, "unittest") == 0) |
538 global.params.useUnitTests = 1; | |
539 else if (p[1] == 'I') | |
540 { | |
541 if (!global.params.imppath) | |
542 global.params.imppath = new Array(); | |
543 global.params.imppath->push(p + 2); | |
544 } | |
545 else if (p[1] == 'J') | |
546 { | |
547 if (!global.params.fileImppath) | |
548 global.params.fileImppath = new Array(); | |
549 global.params.fileImppath->push(p + 2); | |
550 } | |
551 else if (memcmp(p + 1, "debug", 5) == 0 && p[6] != 'l') | |
552 { | |
553 // Parse: | |
554 // -debug | |
555 // -debug=number | |
556 // -debug=identifier | |
557 if (p[6] == '=') | |
558 { | |
559 if (isdigit(p[7])) | |
560 { long level; | |
561 | |
562 errno = 0; | |
563 level = strtol(p + 7, &p, 10); | |
564 if (*p || errno || level > INT_MAX) | |
565 goto Lerror; | |
566 DebugCondition::setGlobalLevel((int)level); | |
567 } | |
568 else if (Lexer::isValidIdentifier(p + 7)) | |
569 DebugCondition::addGlobalIdent(p + 7); | |
570 else | |
571 goto Lerror; | |
572 } | |
573 else if (p[6]) | |
574 goto Lerror; | |
575 else | |
547
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
576 { |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
577 global.params.useInvariants = 1; |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
578 global.params.useIn = 1; |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
579 global.params.useOut = 1; |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
580 global.params.useAssert = 1; |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
581 global.params.useArrayBounds = 1; |
159 | 582 global.params.debuglevel = 1; |
547
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
583 } |
159 | 584 } |
585 else if (memcmp(p + 1, "version", 5) == 0) | |
586 { | |
587 // Parse: | |
588 // -version=number | |
589 // -version=identifier | |
590 if (p[8] == '=') | |
591 { | |
592 if (isdigit(p[9])) | |
593 { long level; | |
594 | |
595 errno = 0; | |
596 level = strtol(p + 9, &p, 10); | |
597 if (*p || errno || level > INT_MAX) | |
598 goto Lerror; | |
599 VersionCondition::setGlobalLevel((int)level); | |
600 } | |
601 else if (Lexer::isValidIdentifier(p + 9)) | |
602 VersionCondition::addGlobalIdent(p + 9); | |
603 else | |
604 goto Lerror; | |
605 } | |
606 else | |
607 goto Lerror; | |
608 } | |
609 else if (strcmp(p + 1, "-b") == 0) | |
610 global.params.debugb = 1; | |
611 else if (strcmp(p + 1, "-c") == 0) | |
612 global.params.debugc = 1; | |
613 else if (strcmp(p + 1, "-f") == 0) | |
614 global.params.debugf = 1; | |
615 else if (strcmp(p + 1, "-help") == 0) | |
616 { usage(); | |
617 exit(EXIT_SUCCESS); | |
618 } | |
619 else if (strcmp(p + 1, "-r") == 0) | |
620 global.params.debugr = 1; | |
621 else if (strcmp(p + 1, "-x") == 0) | |
622 global.params.debugx = 1; | |
623 else if (strcmp(p + 1, "-y") == 0) | |
624 global.params.debugy = 1; | |
625 else if (p[1] == 'L') | |
626 { | |
627 global.params.linkswitches->push(p + 2); | |
628 } | |
629 else if (memcmp(p + 1, "defaultlib=", 11) == 0) | |
630 { | |
567
aaba4f7c6d8a
Get rid of runtime path. Allow defaultlib and debuglib switches to be given multiple times.
Christian Kamm <kamm incasoftware de>
parents:
550
diff
changeset
|
631 if(!global.params.defaultlibnames) |
aaba4f7c6d8a
Get rid of runtime path. Allow defaultlib and debuglib switches to be given multiple times.
Christian Kamm <kamm incasoftware de>
parents:
550
diff
changeset
|
632 global.params.defaultlibnames = new Array(); |
aaba4f7c6d8a
Get rid of runtime path. Allow defaultlib and debuglib switches to be given multiple times.
Christian Kamm <kamm incasoftware de>
parents:
550
diff
changeset
|
633 global.params.defaultlibnames->push(p + 1 + 11); |
159 | 634 } |
635 else if (memcmp(p + 1, "debuglib=", 9) == 0) | |
636 { | |
567
aaba4f7c6d8a
Get rid of runtime path. Allow defaultlib and debuglib switches to be given multiple times.
Christian Kamm <kamm incasoftware de>
parents:
550
diff
changeset
|
637 if(!global.params.debuglibnames) |
aaba4f7c6d8a
Get rid of runtime path. Allow defaultlib and debuglib switches to be given multiple times.
Christian Kamm <kamm incasoftware de>
parents:
550
diff
changeset
|
638 global.params.debuglibnames = new Array(); |
aaba4f7c6d8a
Get rid of runtime path. Allow defaultlib and debuglib switches to be given multiple times.
Christian Kamm <kamm incasoftware de>
parents:
550
diff
changeset
|
639 global.params.debuglibnames->push(p + 1 + 9); |
159 | 640 } |
641 else if (strcmp(p + 1, "run") == 0) | |
642 { global.params.run = 1; | |
643 global.params.runargs_length = ((i >= argcstart) ? argc : argcstart) - i - 1; | |
644 if (global.params.runargs_length) | |
645 { | |
646 files.push(argv[i + 1]); | |
647 global.params.runargs = &argv[i + 2]; | |
648 i += global.params.runargs_length; | |
649 global.params.runargs_length--; | |
650 } | |
651 else | |
652 { global.params.run = 0; | |
653 goto Lnoarg; | |
654 } | |
655 } | |
656 else if (p[1] == 'm') | |
657 { | |
658 global.params.llvmArch = p+2; | |
659 } | |
547
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
660 else if (p[1] == 't') |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
661 { |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
662 if(strcmp(p + 2, "Linux") == 0) |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
663 global.params.os = OSLinux; |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
664 else if(strcmp(p + 2, "Windows") == 0) |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
665 global.params.os = OSWindows; |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
666 else if(strcmp(p + 2, "MacOSX") == 0) |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
667 global.params.os = OSMacOSX; |
638
94b01f15814f
Added FreeBSD support to the -t switch
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
637
diff
changeset
|
668 else if(strcmp(p + 2, "FreeBSD") == 0) |
94b01f15814f
Added FreeBSD support to the -t switch
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
637
diff
changeset
|
669 global.params.os = OSFreeBSD; |
547
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
670 else |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
671 error("unrecognized target os '%s'", p + 2); |
b0005772a88e
Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents:
546
diff
changeset
|
672 } |
159 | 673 else |
674 { | |
675 Lerror: | |
676 error("unrecognized switch '%s'", argv[i]); | |
677 continue; | |
678 | |
679 Lnoarg: | |
680 error("argument expected for switch '%s'", argv[i]); | |
681 continue; | |
682 } | |
683 } | |
684 else | |
685 files.push(p); | |
686 } | |
687 if (global.errors) | |
688 { | |
689 fatal(); | |
690 } | |
691 if (files.dim == 0) | |
692 { usage(); | |
693 return EXIT_FAILURE; | |
694 } | |
695 | |
567
aaba4f7c6d8a
Get rid of runtime path. Allow defaultlib and debuglib switches to be given multiple times.
Christian Kamm <kamm incasoftware de>
parents:
550
diff
changeset
|
696 Array* libs; |
aaba4f7c6d8a
Get rid of runtime path. Allow defaultlib and debuglib switches to be given multiple times.
Christian Kamm <kamm incasoftware de>
parents:
550
diff
changeset
|
697 if (global.params.symdebug) |
aaba4f7c6d8a
Get rid of runtime path. Allow defaultlib and debuglib switches to be given multiple times.
Christian Kamm <kamm incasoftware de>
parents:
550
diff
changeset
|
698 libs = global.params.debuglibnames; |
aaba4f7c6d8a
Get rid of runtime path. Allow defaultlib and debuglib switches to be given multiple times.
Christian Kamm <kamm incasoftware de>
parents:
550
diff
changeset
|
699 else |
aaba4f7c6d8a
Get rid of runtime path. Allow defaultlib and debuglib switches to be given multiple times.
Christian Kamm <kamm incasoftware de>
parents:
550
diff
changeset
|
700 libs = global.params.defaultlibnames; |
aaba4f7c6d8a
Get rid of runtime path. Allow defaultlib and debuglib switches to be given multiple times.
Christian Kamm <kamm incasoftware de>
parents:
550
diff
changeset
|
701 |
aaba4f7c6d8a
Get rid of runtime path. Allow defaultlib and debuglib switches to be given multiple times.
Christian Kamm <kamm incasoftware de>
parents:
550
diff
changeset
|
702 if (libs) |
aaba4f7c6d8a
Get rid of runtime path. Allow defaultlib and debuglib switches to be given multiple times.
Christian Kamm <kamm incasoftware de>
parents:
550
diff
changeset
|
703 { |
aaba4f7c6d8a
Get rid of runtime path. Allow defaultlib and debuglib switches to be given multiple times.
Christian Kamm <kamm incasoftware de>
parents:
550
diff
changeset
|
704 for (int i = 0; i < libs->dim; i++) |
aaba4f7c6d8a
Get rid of runtime path. Allow defaultlib and debuglib switches to be given multiple times.
Christian Kamm <kamm incasoftware de>
parents:
550
diff
changeset
|
705 { |
aaba4f7c6d8a
Get rid of runtime path. Allow defaultlib and debuglib switches to be given multiple times.
Christian Kamm <kamm incasoftware de>
parents:
550
diff
changeset
|
706 char *arg = (char *)mem.malloc(64); |
aaba4f7c6d8a
Get rid of runtime path. Allow defaultlib and debuglib switches to be given multiple times.
Christian Kamm <kamm incasoftware de>
parents:
550
diff
changeset
|
707 strcpy(arg, "-l"); |
aaba4f7c6d8a
Get rid of runtime path. Allow defaultlib and debuglib switches to be given multiple times.
Christian Kamm <kamm incasoftware de>
parents:
550
diff
changeset
|
708 strncat(arg, (char *)libs->data[i], 64); |
aaba4f7c6d8a
Get rid of runtime path. Allow defaultlib and debuglib switches to be given multiple times.
Christian Kamm <kamm incasoftware de>
parents:
550
diff
changeset
|
709 global.params.linkswitches->push(arg); |
aaba4f7c6d8a
Get rid of runtime path. Allow defaultlib and debuglib switches to be given multiple times.
Christian Kamm <kamm incasoftware de>
parents:
550
diff
changeset
|
710 } |
aaba4f7c6d8a
Get rid of runtime path. Allow defaultlib and debuglib switches to be given multiple times.
Christian Kamm <kamm incasoftware de>
parents:
550
diff
changeset
|
711 } |
aaba4f7c6d8a
Get rid of runtime path. Allow defaultlib and debuglib switches to be given multiple times.
Christian Kamm <kamm incasoftware de>
parents:
550
diff
changeset
|
712 else |
aaba4f7c6d8a
Get rid of runtime path. Allow defaultlib and debuglib switches to be given multiple times.
Christian Kamm <kamm incasoftware de>
parents:
550
diff
changeset
|
713 { |
569
926a03711ca8
Split runtime into three parts again.
Christian Kamm <kamm incasoftware de>
parents:
568
diff
changeset
|
714 char *arg; |
926a03711ca8
Split runtime into three parts again.
Christian Kamm <kamm incasoftware de>
parents:
568
diff
changeset
|
715 arg = (char *)mem.malloc(64); |
926a03711ca8
Split runtime into three parts again.
Christian Kamm <kamm incasoftware de>
parents:
568
diff
changeset
|
716 strcpy(arg, "-lllvmdc-runtime"); |
926a03711ca8
Split runtime into three parts again.
Christian Kamm <kamm incasoftware de>
parents:
568
diff
changeset
|
717 global.params.linkswitches->push(arg); |
926a03711ca8
Split runtime into three parts again.
Christian Kamm <kamm incasoftware de>
parents:
568
diff
changeset
|
718 arg = (char *)mem.malloc(64); |
926a03711ca8
Split runtime into three parts again.
Christian Kamm <kamm incasoftware de>
parents:
568
diff
changeset
|
719 strcpy(arg, "-ltango-cc-tango"); |
926a03711ca8
Split runtime into three parts again.
Christian Kamm <kamm incasoftware de>
parents:
568
diff
changeset
|
720 global.params.linkswitches->push(arg); |
926a03711ca8
Split runtime into three parts again.
Christian Kamm <kamm incasoftware de>
parents:
568
diff
changeset
|
721 arg = (char *)mem.malloc(64); |
926a03711ca8
Split runtime into three parts again.
Christian Kamm <kamm incasoftware de>
parents:
568
diff
changeset
|
722 strcpy(arg, "-ltango-gc-basic"); |
567
aaba4f7c6d8a
Get rid of runtime path. Allow defaultlib and debuglib switches to be given multiple times.
Christian Kamm <kamm incasoftware de>
parents:
550
diff
changeset
|
723 global.params.linkswitches->push(arg); |
aaba4f7c6d8a
Get rid of runtime path. Allow defaultlib and debuglib switches to be given multiple times.
Christian Kamm <kamm incasoftware de>
parents:
550
diff
changeset
|
724 } |
aaba4f7c6d8a
Get rid of runtime path. Allow defaultlib and debuglib switches to be given multiple times.
Christian Kamm <kamm incasoftware de>
parents:
550
diff
changeset
|
725 |
159 | 726 if (global.params.run) |
727 global.params.quiet = 1; | |
728 | |
729 if (global.params.useUnitTests) | |
730 global.params.useAssert = 1; | |
731 | |
732 if (!global.params.obj) | |
733 global.params.link = 0; | |
734 | |
735 if (global.params.link) | |
736 { | |
737 global.params.exefile = global.params.objname; | |
738 global.params.objname = NULL; | |
739 } | |
740 else if (global.params.run) | |
741 { | |
742 error("flags conflict with -run"); | |
743 fatal(); | |
744 } | |
745 else | |
746 { | |
747 if (global.params.objname && files.dim > 1) | |
748 { | |
749 error("multiple source files, but only one .obj name"); | |
750 fatal(); | |
751 } | |
752 } | |
753 | |
754 bool allowForceEndianness = false; | |
755 | |
756 if (global.params.llvmArch == 0) { | |
583
12bda38ea366
Fixed choosing default target machine without needing to link in targets.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
580
diff
changeset
|
757 #if defined(__x86_64__) || defined(_M_X64) |
12bda38ea366
Fixed choosing default target machine without needing to link in targets.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
580
diff
changeset
|
758 global.params.llvmArch = "x86-64"; |
12bda38ea366
Fixed choosing default target machine without needing to link in targets.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
580
diff
changeset
|
759 #elif defined(__i386__) || defined(_M_IX86) |
12bda38ea366
Fixed choosing default target machine without needing to link in targets.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
580
diff
changeset
|
760 global.params.llvmArch = "x86"; |
12bda38ea366
Fixed choosing default target machine without needing to link in targets.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
580
diff
changeset
|
761 #elif defined(__ppc__) || defined(_M_PPC) |
12bda38ea366
Fixed choosing default target machine without needing to link in targets.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
580
diff
changeset
|
762 if (global.params.is64bit) |
12bda38ea366
Fixed choosing default target machine without needing to link in targets.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
580
diff
changeset
|
763 global.params.llvmArch = "ppc64"; |
12bda38ea366
Fixed choosing default target machine without needing to link in targets.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
580
diff
changeset
|
764 else |
12bda38ea366
Fixed choosing default target machine without needing to link in targets.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
580
diff
changeset
|
765 global.params.llvmArch = "ppc32"; |
12bda38ea366
Fixed choosing default target machine without needing to link in targets.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
580
diff
changeset
|
766 #else |
12bda38ea366
Fixed choosing default target machine without needing to link in targets.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
580
diff
changeset
|
767 #error |
12bda38ea366
Fixed choosing default target machine without needing to link in targets.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
580
diff
changeset
|
768 #endif |
159 | 769 } |
770 | |
771 if (strcmp(global.params.llvmArch,"x86")==0) { | |
772 VersionCondition::addPredefinedGlobalIdent("X86"); | |
773 global.params.isLE = true; | |
774 global.params.is64bit = false; | |
237
a168a2c3ea48
[svn r253] Removed -inlineasm option. inline asm is now enabled by default unless the new -noasm option is passed.
lindquist
parents:
220
diff
changeset
|
775 global.params.cpu = ARCHx86; |
534
7e2867ed70d9
Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents:
530
diff
changeset
|
776 global.params.tt_arch = "i686"; |
7e2867ed70d9
Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents:
530
diff
changeset
|
777 global.params.data_layout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-f80:32:32-v64:64:64-v128:128:128-a0:0:64"; |
445
cc40db549aea
Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
439
diff
changeset
|
778 if (global.params.useInlineAsm) { |
546
406aee3416bb
Removed D_InlineAsm and D_InlineAsm_X86 versions.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
542
diff
changeset
|
779 VersionCondition::addPredefinedGlobalIdent("LLVM_InlineAsm_X86"); |
445
cc40db549aea
Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
439
diff
changeset
|
780 } |
159 | 781 } |
782 else if (strcmp(global.params.llvmArch,"x86-64")==0) { | |
783 VersionCondition::addPredefinedGlobalIdent("X86_64"); | |
784 global.params.isLE = true; | |
785 global.params.is64bit = true; | |
237
a168a2c3ea48
[svn r253] Removed -inlineasm option. inline asm is now enabled by default unless the new -noasm option is passed.
lindquist
parents:
220
diff
changeset
|
786 global.params.cpu = ARCHx86_64; |
534
7e2867ed70d9
Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents:
530
diff
changeset
|
787 global.params.tt_arch = "x86_64"; |
7e2867ed70d9
Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents:
530
diff
changeset
|
788 global.params.data_layout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64"; |
159 | 789 } |
790 else if (strcmp(global.params.llvmArch,"ppc32")==0) { | |
791 VersionCondition::addPredefinedGlobalIdent("PPC"); | |
792 global.params.isLE = false; | |
793 global.params.is64bit = false; | |
237
a168a2c3ea48
[svn r253] Removed -inlineasm option. inline asm is now enabled by default unless the new -noasm option is passed.
lindquist
parents:
220
diff
changeset
|
794 global.params.cpu = ARCHppc; |
534
7e2867ed70d9
Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents:
530
diff
changeset
|
795 global.params.tt_arch = "powerpc"; |
7e2867ed70d9
Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents:
530
diff
changeset
|
796 global.params.data_layout = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64"; |
159 | 797 } |
798 else if (strcmp(global.params.llvmArch,"ppc64")==0) { | |
799 VersionCondition::addPredefinedGlobalIdent("PPC64"); | |
800 global.params.isLE = false; | |
801 global.params.is64bit = true; | |
237
a168a2c3ea48
[svn r253] Removed -inlineasm option. inline asm is now enabled by default unless the new -noasm option is passed.
lindquist
parents:
220
diff
changeset
|
802 global.params.cpu = ARCHppc_64; |
534
7e2867ed70d9
Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents:
530
diff
changeset
|
803 global.params.tt_arch = "powerpc64"; |
7e2867ed70d9
Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents:
530
diff
changeset
|
804 global.params.data_layout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64"; |
159 | 805 } |
806 else { | |
807 assert(0 && "Invalid arch"); | |
808 } | |
809 | |
566
68d7df3f9b05
Added some sanity checks for target detection.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
550
diff
changeset
|
810 assert(global.params.cpu != ARCHinvalid); |
68d7df3f9b05
Added some sanity checks for target detection.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
550
diff
changeset
|
811 |
159 | 812 if (allowForceEndianness && global.params.forceBE) { |
813 VersionCondition::addPredefinedGlobalIdent("BigEndian"); | |
814 global.params.isLE = false; | |
815 } | |
816 else if (global.params.isLE) { | |
817 VersionCondition::addPredefinedGlobalIdent("LittleEndian"); | |
818 } | |
819 else { | |
820 VersionCondition::addPredefinedGlobalIdent("BigEndian"); | |
821 } | |
822 | |
823 if (global.params.is64bit) { | |
824 VersionCondition::addPredefinedGlobalIdent("LLVM64"); | |
825 } | |
826 | |
534
7e2867ed70d9
Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents:
530
diff
changeset
|
827 |
7e2867ed70d9
Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents:
530
diff
changeset
|
828 // setup version idents and tt_os for chosen target os |
7e2867ed70d9
Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents:
530
diff
changeset
|
829 switch(global.params.os) |
7e2867ed70d9
Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents:
530
diff
changeset
|
830 { |
7e2867ed70d9
Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents:
530
diff
changeset
|
831 case OSWindows: |
7e2867ed70d9
Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents:
530
diff
changeset
|
832 VersionCondition::addPredefinedGlobalIdent("Windows"); |
7e2867ed70d9
Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents:
530
diff
changeset
|
833 VersionCondition::addPredefinedGlobalIdent("Win32"); |
7e2867ed70d9
Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents:
530
diff
changeset
|
834 VersionCondition::addPredefinedGlobalIdent("mingw32"); |
7e2867ed70d9
Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents:
530
diff
changeset
|
835 global.params.tt_os = "-pc-mingw32"; |
7e2867ed70d9
Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents:
530
diff
changeset
|
836 break; |
7e2867ed70d9
Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents:
530
diff
changeset
|
837 |
536
0d2db7efa105
Add isnan for __APPLE__ and darwin version ident for OSX.
Christian Kamm <kamm incasoftware de>
parents:
535
diff
changeset
|
838 case OSLinux: |
534
7e2867ed70d9
Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents:
530
diff
changeset
|
839 VersionCondition::addPredefinedGlobalIdent("linux"); |
7e2867ed70d9
Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents:
530
diff
changeset
|
840 VersionCondition::addPredefinedGlobalIdent("Posix"); |
7e2867ed70d9
Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents:
530
diff
changeset
|
841 global.params.tt_os = "-pc-linux-gnu"; |
7e2867ed70d9
Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents:
530
diff
changeset
|
842 break; |
7e2867ed70d9
Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents:
530
diff
changeset
|
843 |
536
0d2db7efa105
Add isnan for __APPLE__ and darwin version ident for OSX.
Christian Kamm <kamm incasoftware de>
parents:
535
diff
changeset
|
844 case OSMacOSX: |
0d2db7efa105
Add isnan for __APPLE__ and darwin version ident for OSX.
Christian Kamm <kamm incasoftware de>
parents:
535
diff
changeset
|
845 VersionCondition::addPredefinedGlobalIdent("darwin"); |
541
4b7925bc1605
Fixed some osx mistakes.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
536
diff
changeset
|
846 VersionCondition::addPredefinedGlobalIdent("Posix"); |
536
0d2db7efa105
Add isnan for __APPLE__ and darwin version ident for OSX.
Christian Kamm <kamm incasoftware de>
parents:
535
diff
changeset
|
847 global.params.tt_os = "-pc-darwin-gnu"; |
542
1e9ca2889b07
Missing 'break' in osx code path.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
541
diff
changeset
|
848 break; |
536
0d2db7efa105
Add isnan for __APPLE__ and darwin version ident for OSX.
Christian Kamm <kamm incasoftware de>
parents:
535
diff
changeset
|
849 |
637
29dc68c949b0
Applied the FreeBSD patch from Ralith, closes ticket #95 , slightly changed but basically the same. Thanx Ralith :)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
583
diff
changeset
|
850 case OSFreeBSD: |
29dc68c949b0
Applied the FreeBSD patch from Ralith, closes ticket #95 , slightly changed but basically the same. Thanx Ralith :)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
583
diff
changeset
|
851 VersionCondition::addPredefinedGlobalIdent("freebsd"); |
29dc68c949b0
Applied the FreeBSD patch from Ralith, closes ticket #95 , slightly changed but basically the same. Thanx Ralith :)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
583
diff
changeset
|
852 VersionCondition::addPredefinedGlobalIdent("Posix"); |
29dc68c949b0
Applied the FreeBSD patch from Ralith, closes ticket #95 , slightly changed but basically the same. Thanx Ralith :)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
583
diff
changeset
|
853 break; |
29dc68c949b0
Applied the FreeBSD patch from Ralith, closes ticket #95 , slightly changed but basically the same. Thanx Ralith :)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
583
diff
changeset
|
854 |
534
7e2867ed70d9
Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents:
530
diff
changeset
|
855 default: |
7e2867ed70d9
Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents:
530
diff
changeset
|
856 assert(false && "Target OS not supported"); |
7e2867ed70d9
Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents:
530
diff
changeset
|
857 } |
7e2867ed70d9
Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents:
530
diff
changeset
|
858 |
159 | 859 |
860 // Initialization | |
861 Type::init(); | |
862 Id::initialize(); | |
863 Module::init(); | |
864 initPrecedence(); | |
865 | |
866 backend_init(); | |
867 | |
868 //printf("%d source files\n",files.dim); | |
869 | |
870 // Build import search path | |
871 if (global.params.imppath) | |
872 { | |
873 for (i = 0; i < global.params.imppath->dim; i++) | |
874 { | |
875 char *path = (char *)global.params.imppath->data[i]; | |
876 Array *a = FileName::splitPath(path); | |
877 | |
878 if (a) | |
879 { | |
880 if (!global.path) | |
881 global.path = new Array(); | |
882 global.path->append(a); | |
883 } | |
884 } | |
885 } | |
886 | |
887 // Build string import search path | |
888 if (global.params.fileImppath) | |
889 { | |
890 for (i = 0; i < global.params.fileImppath->dim; i++) | |
891 { | |
892 char *path = (char *)global.params.fileImppath->data[i]; | |
893 Array *a = FileName::splitPath(path); | |
894 | |
895 if (a) | |
896 { | |
897 if (!global.filePath) | |
898 global.filePath = new Array(); | |
899 global.filePath->append(a); | |
900 } | |
901 } | |
902 } | |
903 | |
904 // Create Modules | |
905 Array modules; | |
906 modules.reserve(files.dim); | |
907 for (i = 0; i < files.dim; i++) | |
908 { Identifier *id; | |
909 char *ext; | |
910 char *name; | |
911 | |
912 p = (char *) files.data[i]; | |
913 | |
914 p = FileName::name(p); // strip path | |
915 ext = FileName::ext(p); | |
916 if (ext) | |
917 { | |
918 #if IN_LLVM | |
919 if (strcmp(ext, global.nativeobj_ext) == 0 || | |
920 strcmp(ext, global.obj_ext) == 0) | |
921 #elif TARGET_LINUX | |
922 if (strcmp(ext, global.obj_ext) == 0) | |
923 #else | |
924 if (stricmp(ext, global.obj_ext) == 0) | |
925 #endif | |
926 { | |
927 global.params.objfiles->push(files.data[i]); | |
928 continue; | |
929 } | |
930 | |
279
a137ed004205
[svn r300] Removed some win32 stuff that was causing problems on mingw32.
lindquist
parents:
277
diff
changeset
|
931 #if TARGET_LINUX || __MINGW32__ |
159 | 932 if (strcmp(ext, "a") == 0) |
933 #else | |
934 if (stricmp(ext, "lib") == 0) | |
935 #endif | |
936 { | |
937 global.params.libfiles->push(files.data[i]); | |
938 continue; | |
939 } | |
940 | |
941 if (strcmp(ext, global.ddoc_ext) == 0) | |
942 { | |
943 global.params.ddocfiles->push(files.data[i]); | |
944 continue; | |
945 } | |
946 | |
947 #if !TARGET_LINUX | |
948 if (stricmp(ext, "res") == 0) | |
949 { | |
950 global.params.resfile = (char *)files.data[i]; | |
951 continue; | |
952 } | |
953 | |
954 if (stricmp(ext, "def") == 0) | |
955 { | |
956 global.params.deffile = (char *)files.data[i]; | |
957 continue; | |
958 } | |
959 | |
960 if (stricmp(ext, "exe") == 0) | |
961 { | |
962 global.params.exefile = (char *)files.data[i]; | |
963 continue; | |
964 } | |
965 #endif | |
966 | |
967 if (stricmp(ext, global.mars_ext) == 0 || | |
510
6aee82889553
Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
968 stricmp(ext, global.hdr_ext) == 0 || |
159 | 969 stricmp(ext, "htm") == 0 || |
970 stricmp(ext, "html") == 0 || | |
971 stricmp(ext, "xhtml") == 0) | |
972 { | |
973 ext--; // skip onto '.' | |
974 assert(*ext == '.'); | |
975 name = (char *)mem.malloc((ext - p) + 1); | |
976 memcpy(name, p, ext - p); | |
977 name[ext - p] = 0; // strip extension | |
978 | |
979 if (name[0] == 0 || | |
980 strcmp(name, "..") == 0 || | |
981 strcmp(name, ".") == 0) | |
982 { | |
983 Linvalid: | |
984 error("invalid file name '%s'", (char *)files.data[i]); | |
985 fatal(); | |
986 } | |
987 } | |
988 else | |
989 { error("unrecognized file extension %s\n", ext); | |
990 fatal(); | |
991 } | |
992 } | |
993 else | |
994 { name = p; | |
995 if (!*name) | |
996 goto Linvalid; | |
997 } | |
998 | |
999 id = new Identifier(name, 0); | |
1000 m = new Module((char *) files.data[i], id, global.params.doDocComments, global.params.doHdrGeneration); | |
1001 modules.push(m); | |
1002 } | |
1003 | |
1004 // Read files, parse them | |
1005 for (i = 0; i < modules.dim; i++) | |
1006 { | |
1007 m = (Module *)modules.data[i]; | |
1008 if (global.params.verbose) | |
1009 printf("parse %s\n", m->toChars()); | |
1010 if (!Module::rootModule) | |
1011 Module::rootModule = m; | |
1012 m->importedFrom = m; | |
1013 m->read(0); | |
1014 m->parse(); | |
580
7824c21a58e3
Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents:
572
diff
changeset
|
1015 m->buildTargetFiles(); |
7824c21a58e3
Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents:
572
diff
changeset
|
1016 m->deleteObjFile(); |
159 | 1017 if (m->isDocFile) |
1018 { | |
1019 m->gendocfile(); | |
1020 | |
1021 // Remove m from list of modules | |
1022 modules.remove(i); | |
1023 i--; | |
1024 } | |
1025 } | |
1026 if (global.errors) | |
1027 fatal(); | |
1028 #ifdef _DH | |
1029 if (global.params.doHdrGeneration) | |
1030 { | |
1031 /* Generate 'header' import files. | |
1032 * Since 'header' import files must be independent of command | |
1033 * line switches and what else is imported, they are generated | |
1034 * before any semantic analysis. | |
1035 */ | |
1036 for (i = 0; i < modules.dim; i++) | |
1037 { | |
1038 m = (Module *)modules.data[i]; | |
1039 if (global.params.verbose) | |
1040 printf("import %s\n", m->toChars()); | |
1041 m->genhdrfile(); | |
1042 } | |
1043 } | |
1044 if (global.errors) | |
1045 fatal(); | |
1046 #endif | |
1047 | |
1048 // Do semantic analysis | |
1049 for (i = 0; i < modules.dim; i++) | |
1050 { | |
1051 m = (Module *)modules.data[i]; | |
1052 if (global.params.verbose) | |
1053 printf("semantic %s\n", m->toChars()); | |
1054 m->semantic(); | |
1055 } | |
1056 if (global.errors) | |
1057 fatal(); | |
1058 | |
1059 // Do pass 2 semantic analysis | |
1060 for (i = 0; i < modules.dim; i++) | |
1061 { | |
1062 m = (Module *)modules.data[i]; | |
1063 if (global.params.verbose) | |
1064 printf("semantic2 %s\n", m->toChars()); | |
1065 m->semantic2(); | |
1066 } | |
1067 if (global.errors) | |
1068 fatal(); | |
1069 | |
1070 // Do pass 3 semantic analysis | |
1071 for (i = 0; i < modules.dim; i++) | |
1072 { | |
1073 m = (Module *)modules.data[i]; | |
1074 if (global.params.verbose) | |
1075 printf("semantic3 %s\n", m->toChars()); | |
1076 m->semantic3(); | |
1077 } | |
1078 if (global.errors) | |
1079 fatal(); | |
1080 | |
1081 #if !IN_LLVM | |
1082 // Scan for functions to inline | |
1083 if (global.params.useInline) | |
1084 { | |
1085 /* The problem with useArrayBounds and useAssert is that the | |
1086 * module being linked to may not have generated them, so if | |
1087 * we inline functions from those modules, the symbols for them will | |
1088 * not be found at link time. | |
1089 */ | |
1090 if (!global.params.useArrayBounds && !global.params.useAssert) | |
1091 { | |
1092 #endif | |
1093 // Do pass 3 semantic analysis on all imported modules, | |
1094 // since otherwise functions in them cannot be inlined | |
1095 for (i = 0; i < Module::amodules.dim; i++) | |
1096 { | |
1097 m = (Module *)Module::amodules.data[i]; | |
1098 if (global.params.verbose) | |
1099 printf("semantic3 %s\n", m->toChars()); | |
1100 m->semantic3(); | |
1101 } | |
1102 if (global.errors) | |
1103 fatal(); | |
1104 #if !IN_LLVM | |
1105 } | |
1106 | |
1107 for (i = 0; i < modules.dim; i++) | |
1108 { | |
1109 m = (Module *)modules.data[i]; | |
1110 if (global.params.verbose) | |
1111 printf("inline scan %s\n", m->toChars()); | |
1112 m->inlineScan(); | |
1113 } | |
1114 } | |
1115 if (global.errors) | |
1116 fatal(); | |
1117 #endif | |
1118 | |
1119 // Generate output files | |
1120 for (i = 0; i < modules.dim; i++) | |
1121 { | |
1122 m = (Module *)modules.data[i]; | |
1123 if (global.params.verbose) | |
1124 printf("code %s\n", m->toChars()); | |
1125 if (global.params.obj) | |
580
7824c21a58e3
Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents:
572
diff
changeset
|
1126 { |
336 | 1127 m->genobjfile(0); |
580
7824c21a58e3
Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents:
572
diff
changeset
|
1128 global.params.objfiles->push(m->objfile->name->str); |
7824c21a58e3
Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents:
572
diff
changeset
|
1129 } |
159 | 1130 if (global.errors) |
1131 m->deleteObjFile(); | |
1132 else | |
1133 { | |
1134 if (global.params.doDocComments) | |
1135 m->gendocfile(); | |
1136 } | |
1137 } | |
279
a137ed004205
[svn r300] Removed some win32 stuff that was causing problems on mingw32.
lindquist
parents:
277
diff
changeset
|
1138 |
159 | 1139 backend_term(); |
1140 if (global.errors) | |
1141 fatal(); | |
1142 | |
1143 if (!global.params.objfiles->dim) | |
1144 { | |
1145 if (global.params.link) | |
1146 error("no object files to link"); | |
1147 } | |
1148 else | |
1149 { | |
1150 if (global.params.link) | |
276
21f85bac0b1a
[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
lindquist
parents:
262
diff
changeset
|
1151 //status = runLINK(); |
432 | 1152 linkExecutable(global.params.argv0); |
159 | 1153 |
1154 if (global.params.run) | |
1155 { | |
1156 if (!status) | |
1157 { | |
277
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
1158 status = runExectuable(); |
159 | 1159 |
1160 /* Delete .obj files and .exe file | |
1161 */ | |
1162 for (i = 0; i < modules.dim; i++) | |
1163 { | |
1164 m = (Module *)modules.data[i]; | |
1165 m->deleteObjFile(); | |
1166 } | |
277
90a8c798b0db
[svn r298] Eliminated the dmd/link.c source file entirely in favor of a llvm::sys based approach to the same functionality.
lindquist
parents:
276
diff
changeset
|
1167 deleteExecutable(); |
159 | 1168 } |
1169 } | |
1170 } | |
1171 | |
1172 return status; | |
1173 } | |
1174 | |
1175 | |
1176 | |
1177 /*********************************** | |
1178 * Parse and append contents of environment variable envvar | |
1179 * to argc and argv[]. | |
1180 * The string is separated into arguments, processing \ and ". | |
1181 */ | |
1182 | |
1183 void getenv_setargv(const char *envvar, int *pargc, char** *pargv) | |
1184 { | |
1185 char *env; | |
1186 char *p; | |
1187 Array *argv; | |
1188 int argc; | |
1189 | |
1190 int wildcard; // do wildcard expansion | |
1191 int instring; | |
1192 int slash; | |
1193 char c; | |
1194 int j; | |
1195 | |
1196 env = getenv(envvar); | |
1197 if (!env) | |
1198 return; | |
1199 | |
1200 env = mem.strdup(env); // create our own writable copy | |
1201 | |
1202 argc = *pargc; | |
1203 argv = new Array(); | |
1204 argv->setDim(argc); | |
1205 | |
1206 for (int i = 0; i < argc; i++) | |
1207 argv->data[i] = (void *)(*pargv)[i]; | |
1208 | |
1209 j = 1; // leave argv[0] alone | |
1210 while (1) | |
1211 { | |
1212 wildcard = 1; | |
1213 switch (*env) | |
1214 { | |
1215 case ' ': | |
1216 case '\t': | |
1217 env++; | |
1218 break; | |
1219 | |
1220 case 0: | |
1221 goto Ldone; | |
1222 | |
1223 case '"': | |
1224 wildcard = 0; | |
1225 default: | |
1226 argv->push(env); // append | |
1227 //argv->insert(j, env); // insert at position j | |
1228 j++; | |
1229 argc++; | |
1230 p = env; | |
1231 slash = 0; | |
1232 instring = 0; | |
1233 c = 0; | |
1234 | |
1235 while (1) | |
1236 { | |
1237 c = *env++; | |
1238 switch (c) | |
1239 { | |
1240 case '"': | |
1241 p -= (slash >> 1); | |
1242 if (slash & 1) | |
1243 { p--; | |
1244 goto Laddc; | |
1245 } | |
1246 instring ^= 1; | |
1247 slash = 0; | |
1248 continue; | |
1249 | |
1250 case ' ': | |
1251 case '\t': | |
1252 if (instring) | |
1253 goto Laddc; | |
1254 *p = 0; | |
1255 //if (wildcard) | |
1256 //wildcardexpand(); // not implemented | |
1257 break; | |
1258 | |
1259 case '\\': | |
1260 slash++; | |
1261 *p++ = c; | |
1262 continue; | |
1263 | |
1264 case 0: | |
1265 *p = 0; | |
1266 //if (wildcard) | |
1267 //wildcardexpand(); // not implemented | |
1268 goto Ldone; | |
1269 | |
1270 default: | |
1271 Laddc: | |
1272 slash = 0; | |
1273 *p++ = c; | |
1274 continue; | |
1275 } | |
1276 break; | |
1277 } | |
1278 } | |
1279 } | |
1280 | |
1281 Ldone: | |
1282 *pargc = argc; | |
1283 *pargv = (char **)argv->data; | |
1284 } |