annotate dmd/mars.c @ 984:4c0df37d0421

Removing ldc.conf. (IMPORTANT: run 'cmake .' after pull) Added it to .hgignore. This gets rid of spurious differences caused by CMake regenerating it differently. Just run 'cmake .' to get it back in your local checkout.
author Frits van Bommel <fvbommel wxs.nl>
date Thu, 19 Feb 2009 13:50:05 +0100
parents 0b38b64f62c7
children a8cb25d478c4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1 // Compiler implementation of the D programming language
876
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
2 // Copyright (c) 1999-2009 by Digital Mars
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
3 // All Rights Reserved
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
4 // written by Walter Bright
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
5 // http://www.digitalmars.com
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
6 // License for redistribution is by either the Artistic License
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
7 // in artistic.txt, or the GNU General Public License in gnu.txt.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
8 // See the included readme.txt for details.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
9
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
10 #include <stdio.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
11 #include <stdlib.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
12 #include <ctype.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
13 #include <assert.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
14 #include <limits.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
15 #include <string>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
16 #include <cstdarg>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
17
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
18 #if __DMC__
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
19 #include <dos.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
20 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
23 #include <errno.h>
432
ecf70fe065b9 fixed configuration file loading issues on windows
elrood
parents: 374
diff changeset
24 #elif _WIN32
ecf70fe065b9 fixed configuration file loading issues on windows
elrood
parents: 374
diff changeset
25 #include <windows.h>
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
26 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
27
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
28 #include "mem.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
29 #include "root.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
30
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
31 #include "mars.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
32 #include "module.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
33 #include "mtype.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
34 #include "id.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
35 #include "cond.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
36 #include "expression.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
37 #include "lexer.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
38
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
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"
853
82ad6c0c601c Add Elrood's patch to output LDC and LLVM source revs.
Christian Kamm <kamm incasoftware de>
parents: 849
diff changeset
41 #include "revisions.h"
788
dce4b4ea2aee Print llvm package string in version header. See #128.
Christian Kamm <kamm incasoftware de>
parents: 785
diff changeset
42
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
43 void getenv_setargv(const char *envvar, int *pargc, char** *pargv);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
44
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
45 Global global;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
46
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
47 Global::Global()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
48 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
49 mars_ext = "d";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
50 sym_ext = "d";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
51 hdr_ext = "di";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
52 doc_ext = "html";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
53 ddoc_ext = "ddoc";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
54
663
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
55 // LDC
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
56 ll_ext = "ll";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
57 bc_ext = "bc";
675
bfe5229f9d8e Disable bc output by default. Remove -dis. Add -output-bc, -output-ll, -output-s.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
58 s_ext = "s";
708
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
59 obj_ext = "o";
374
1f20b9f7de1b Fix nativeobj extension for Windows.
Christian Kamm <kamm incasoftware de>
parents: 366
diff changeset
60 #if _WIN32
708
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
61 obj_ext_alt = "obj";
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
62 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
63
876
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
64 copyright = "Copyright (c) 1999-2009 by Digital Mars and Tomas Lindquist Olsen";
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
65 written = "written by Walter Bright and Tomas Lindquist Olsen";
876
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
66 version = "v1.039";
853
82ad6c0c601c Add Elrood's patch to output LDC and LLVM source revs.
Christian Kamm <kamm incasoftware de>
parents: 849
diff changeset
67 ldc_version = LDC_REV;
82ad6c0c601c Add Elrood's patch to output LDC and LLVM source revs.
Christian Kamm <kamm incasoftware de>
parents: 849
diff changeset
68 llvm_version = LLVM_REV;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
69 global.structalign = 8;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
70
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
71 memset(&params, 0, sizeof(Param));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
72 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
73
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
74 char *Loc::toChars() const
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
75 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
76 OutBuffer buf;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
77 char *p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
78
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
79 if (filename)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
80 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
81 buf.printf("%s", filename);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
82 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
83
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
84 if (linnum)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
85 buf.printf("(%d)", linnum);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
86 buf.writeByte(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
87 return (char *)buf.extractData();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
88 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
89
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
90 Loc::Loc(Module *mod, unsigned linnum)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
91 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
92 this->linnum = linnum;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
93 this->filename = mod ? mod->srcfile->toChars() : NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
94 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
95
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
96 /**************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
97 * Print error message and exit.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
98 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
99
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
100 void error(Loc loc, const char *format, ...)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
101 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
102 va_list ap;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
103 va_start(ap, format);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
104 verror(loc, format, ap);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
105 va_end( ap );
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
106 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
107
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
108 void verror(Loc loc, const char *format, va_list ap)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
109 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
110 if (!global.gag)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
111 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
112 char *p = loc.toChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
113
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
114 if (*p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
115 fprintf(stdmsg, "%s: ", p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
116 mem.free(p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
117
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
118 fprintf(stdmsg, "Error: ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
119 vfprintf(stdmsg, format, ap);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
120 fprintf(stdmsg, "\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
121 fflush(stdmsg);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
122 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
123 global.errors++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
124 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
125
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
126 /***************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
127 * Call this after printing out fatal error messages to clean up and exit
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
128 * the compiler.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
129 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
130
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
131 void fatal()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
132 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
133 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
134 halt();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
135 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
136 exit(EXIT_FAILURE);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
137 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
138
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
139 /**************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
140 * Try to stop forgetting to remove the breakpoints from
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
141 * release builds.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
142 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
143 void halt()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
144 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
145 #ifdef DEBUG
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
146 *(char*)0=0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
147 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
148 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
149
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
150 extern void backend_init();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
151 extern void backend_term();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
152
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
153 void usage()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
154 {
853
82ad6c0c601c Add Elrood's patch to output LDC and LLVM source revs.
Christian Kamm <kamm incasoftware de>
parents: 849
diff changeset
155 printf("LLVM D Compiler %s\nbased on DMD %s and %s\n%s\n%s\n",
82ad6c0c601c Add Elrood's patch to output LDC and LLVM source revs.
Christian Kamm <kamm incasoftware de>
parents: 849
diff changeset
156 global.ldc_version, global.version, global.llvm_version, global.copyright, global.written);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
157 printf("\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
158 D Language Documentation: http://www.digitalmars.com/d/1.0/index.html\n\
690
8526cf626110 Homepage rename.
Christian Kamm <kamm incasoftware de>
parents: 679
diff changeset
159 LDC Homepage: http://www.dsource.org/projects/ldc\n\
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
160 Usage:\n\
663
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
161 ldc files.d ... { -switch }\n\
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
162 \n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
163 files.d D source files\n%s\
547
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
164 -o- do not write object file\n\
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
165 -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
166 -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
167 -oq write object files with fully qualified names\n\
694
931333ea35c6 Allow output of only bc, ll, or s by making -of set the output type depending
Christian Kamm <kamm incasoftware de>
parents: 690
diff changeset
168 -of<filename> name output file to <filename>\n\
708
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
169 if -c and extension of <filename> is known, it determines the output type\n\
547
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
170 \n\
675
bfe5229f9d8e Disable bc output by default. Remove -dis. Add -output-bc, -output-ll, -output-s.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
171 -output-ll write LLVM IR\n\
bfe5229f9d8e Disable bc output by default. Remove -dis. Add -output-bc, -output-ll, -output-s.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
172 -output-bc write LLVM bitcode\n\
bfe5229f9d8e Disable bc output by default. Remove -dis. Add -output-bc, -output-ll, -output-s.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
173 -output-s write native assembly\n\
708
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
174 -output-o write native object (default if no -output switch passed)\n\
675
bfe5229f9d8e Disable bc output by default. Remove -dis. Add -output-bc, -output-ll, -output-s.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
175 \n\
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
176 -c do not link\n\
695
a51fed3de34e Some cleanups in command line argument descriptions.
Christian Kamm <kamm incasoftware de>
parents: 694
diff changeset
177 -L<linkerflag> pass <linkerflag> to linker\n\
547
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 -w enable warnings\n\
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
180 \n\
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
181 -H generate 'header' file\n\
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
182 -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
183 -Hf<filename> write 'header' file to <filename>\n\
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
184 \n\
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
185 -D generate documentation\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
186 -Dd<docdir> write documentation file to <docdir> directory\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
187 -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
188 \n\
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
189 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
190 -m<arch> emit code specific to <arch> being one of:\n\
735
eee9efe5b51f Attempt at getting LLVM to provide a proper target data layout. Should assert now if things are borked.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 734
diff changeset
191 x86 x86-64 ppc32 ppc64 arm thumb\n\
547
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
192 -t<os> emit code specific to <os> being one of:\n\
900
177afbf5297b Solaris compatibility and proc map parsing #183, thanks BlueZeniX!
Christian Kamm <kamm incasoftware de>
parents: 876
diff changeset
193 Linux, Windows, MacOSX, FreeBSD, Solaris\n\
547
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
194 \n\
695
a51fed3de34e Some cleanups in command line argument descriptions.
Christian Kamm <kamm incasoftware de>
parents: 694
diff changeset
195 -g, -gc add symbolic debug info\n\
a51fed3de34e Some cleanups in command line argument descriptions.
Christian Kamm <kamm incasoftware de>
parents: 694
diff changeset
196 \n\
547
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
197 -O optimize, same as -O2\n\
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
198 -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
199 -inline do function inlining\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 -debug enables asserts, invariants, contracts, boundscheck\n\
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
202 and sets debug=1\n\
695
a51fed3de34e Some cleanups in command line argument descriptions.
Christian Kamm <kamm incasoftware de>
parents: 694
diff changeset
203 -release disables asserts, invariants, contracts, boundscheck\n\
547
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
204 \n\
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
205 -enable-<feature> and\n\
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
206 -disable-<feature> where <feature> is one of\n\
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
207 asserts assert statements (default: on)\n\
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
208 invariants class and struct invariants (default: on)\n\
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
209 contracts function contracts (default: on)\n\
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
210 boundscheck array bounds checking (default: on)\n\
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
211 -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
212 -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
213 -version=level compile in version code >= level\n\
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
214 -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
215 \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
216 -noasm do not allow use of inline asm\n\
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
217 -noruntime do not allow code that generates implicit runtime calls\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
218 -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
219 -unittest compile in unit tests\n\
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
220 -d allow deprecated features\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 -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
223 -ignore ignore unsupported pragmas\n\
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
224 \n\
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
225 Path options:\n\
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
226 -I<path> where to look for imports\n\
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
227 -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
228 -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
229 -debuglib=name set default library for debug build\n\
651
5709381df7e8 Added -nodefaultlib switch do disable implicitly linked standard lib modules
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 638
diff changeset
230 -nodefaultlib don't add a default library for linking implicitly\n\
547
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
231 \n\
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
232 Misc options:\n\
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
233 -v verbose\n\
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
234 -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
235 -quiet suppress unnecessary messages\n\
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
236 -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
237 --help print help\n\
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
238 ",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
239 #if WIN32
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
240 " @cmdfile read arguments from cmdfile\n"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
241 #else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
242 ""
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
243 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
244 );
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
245 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
246
849
ba390e5e9150 Remove unportable env-sanitizing code. If it is really needed, it needs to be
Christian Kamm <kamm incasoftware de>
parents: 846
diff changeset
247 int main(int argc, char *argv[])
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
248 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
249 int i;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
250 Array files;
694
931333ea35c6 Allow output of only bc, ll, or s by making -of set the output type depending
Christian Kamm <kamm incasoftware de>
parents: 690
diff changeset
251 char *p, *ext;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
252 Module *m;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
253 int status = EXIT_SUCCESS;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
254 int argcstart = argc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
255 bool very_verbose = false;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
256
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
257 // Check for malformed input
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
258 if (argc < 1 || !argv)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
259 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
260 Largs:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
261 error("missing or null command line arguments");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
262 fatal();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
263 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
264 for (i = 0; i < argc; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
265 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
266 if (!argv[i])
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
267 goto Largs;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
268 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
269
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
270 #if __DMC__ // DMC unique support for response files
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
271 if (response_expand(&argc,&argv)) // expand response files
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
272 error("can't open response file");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
273 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
274
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
275 files.reserve(argc - 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
276
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
277 // Set default values
432
ecf70fe065b9 fixed configuration file loading issues on windows
elrood
parents: 374
diff changeset
278 #if _WIN32
ecf70fe065b9 fixed configuration file loading issues on windows
elrood
parents: 374
diff changeset
279 char buf[MAX_PATH];
ecf70fe065b9 fixed configuration file loading issues on windows
elrood
parents: 374
diff changeset
280 GetModuleFileName(NULL, buf, MAX_PATH);
ecf70fe065b9 fixed configuration file loading issues on windows
elrood
parents: 374
diff changeset
281 global.params.argv0 = buf;
ecf70fe065b9 fixed configuration file loading issues on windows
elrood
parents: 374
diff changeset
282 #else
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
283 global.params.argv0 = argv[0];
432
ecf70fe065b9 fixed configuration file loading issues on windows
elrood
parents: 374
diff changeset
284 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
285 global.params.link = 1;
530
d30c40f1128d Make class invariants work.
Christian Kamm <kamm incasoftware de>
parents: 510
diff changeset
286 global.params.useAssert = 1;
327
781af50846b2 [svn r348] Switch on class invariants (except in release mode).
ChristianK
parents: 323
diff changeset
287 global.params.useInvariants = 1;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
288 global.params.useIn = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
289 global.params.useOut = 1;
439
47b64d06eb9f Enable array bounds check and emit them in IndexExp.
Christian Kamm <kamm incasoftware de>
parents: 432
diff changeset
290 global.params.useArrayBounds = 1;
331
04e1b4930975 [svn r352] Implement SwitchErrorStatement. Fixes #52.
ChristianK
parents: 327
diff changeset
291 global.params.useSwitchError = 1;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
292 global.params.useInline = 0; // this one messes things up to a point where codegen breaks
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
293 global.params.llvmInline = 0; // use this one instead to know if inline passes should be run
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
294 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
295 global.params.Dversion = 2;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
296 global.params.quiet = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
297
708
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
298 global.params.output_o = OUTPUTFLAGdefault;
694
931333ea35c6 Allow output of only bc, ll, or s by making -of set the output type depending
Christian Kamm <kamm incasoftware de>
parents: 690
diff changeset
299
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
300 global.params.linkswitches = new Array();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
301 global.params.libfiles = new Array();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
302 global.params.objfiles = new Array();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
303 global.params.ddocfiles = new Array();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
304
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
305 global.params.is64bit = sizeof(void*) == 8 ? 1 : 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
306
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
307 uint16_t endiantest = 0xFF00;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
308 uint8_t endianres = ((uint8_t*)&endiantest)[0];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
309 if (endianres == 0x00)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
310 global.params.isLE = true;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
311 else if (endianres == 0xFF)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
312 global.params.isLE = false;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
313 else {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
314 error("Endian test is broken");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
315 fatal();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
316 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
317
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
318 global.params.llvmArch = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
319 global.params.forceBE = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
320 global.params.noruntime = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
321 global.params.novalidate = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
322 global.params.optimizeLevel = -1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
323 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
324 global.params.useInlineAsm = 1;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
325
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
326 // Predefine version identifiers
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
327 #if IN_LLVM
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
328 VersionCondition::addPredefinedGlobalIdent("LLVM");
663
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
329 VersionCondition::addPredefinedGlobalIdent("LDC");
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
330 #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
331
534
7e2867ed70d9 Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents: 530
diff changeset
332 // setup default target os to be build os
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
333 #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
334 global.params.os = OSWindows;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
335 #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
336 global.params.os = OSLinux;
541
4b7925bc1605 Fixed some osx mistakes.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 536
diff changeset
337 #elif __APPLE__
536
0d2db7efa105 Add isnan for __APPLE__ and darwin version ident for OSX.
Christian Kamm <kamm incasoftware de>
parents: 535
diff changeset
338 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
339 #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
340 global.params.os = OSFreeBSD;
872
aa953cc960b6 Apply BlueZeniX's patch for OpenSolaris compatibility. Fixes #158.
Christian Kamm <kamm incasoftware de>
parents: 853
diff changeset
341 #elif defined (__SVR4) && defined (__sun)
aa953cc960b6 Apply BlueZeniX's patch for OpenSolaris compatibility. Fixes #158.
Christian Kamm <kamm incasoftware de>
parents: 853
diff changeset
342 global.params.os = OSSolaris;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
343 #else
872
aa953cc960b6 Apply BlueZeniX's patch for OpenSolaris compatibility. Fixes #158.
Christian Kamm <kamm incasoftware de>
parents: 853
diff changeset
344 #error Unsupported OS
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
345 #endif /* linux */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
346
566
68d7df3f9b05 Added some sanity checks for target detection.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 550
diff changeset
347 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
348
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
349 //VersionCondition::addPredefinedGlobalIdent("D_Bits");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
350 VersionCondition::addPredefinedGlobalIdent("all");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
351
785
ac39e5449ca5 Apply Elrood's CMake changes from #124. Thanks a lot!
Christian Kamm <kamm incasoftware de>
parents: 741
diff changeset
352 //#if _WIN32
ac39e5449ca5 Apply Elrood's CMake changes from #124. Thanks a lot!
Christian Kamm <kamm incasoftware de>
parents: 741
diff changeset
353 // inifile(global.params.argv0, "ldc.ini");
ac39e5449ca5 Apply Elrood's CMake changes from #124. Thanks a lot!
Christian Kamm <kamm incasoftware de>
parents: 741
diff changeset
354 //#elif POSIX
663
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
355 inifile(global.params.argv0, "ldc.conf");
785
ac39e5449ca5 Apply Elrood's CMake changes from #124. Thanks a lot!
Christian Kamm <kamm incasoftware de>
parents: 741
diff changeset
356 //#else
ac39e5449ca5 Apply Elrood's CMake changes from #124. Thanks a lot!
Christian Kamm <kamm incasoftware de>
parents: 741
diff changeset
357 //#error
ac39e5449ca5 Apply Elrood's CMake changes from #124. Thanks a lot!
Christian Kamm <kamm incasoftware de>
parents: 741
diff changeset
358 //#endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
359 getenv_setargv("DFLAGS", &argc, &argv);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
360
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
361 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
362 for (i = 0; i < argc; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
363 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
364 printf("argv[%d] = '%s'\n", i, argv[i]);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
365 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
366 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
367
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
368 for (i = 1; i < argc; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
369 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
370 p = argv[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
371 if (*p == '-')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
372 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
373 if (strcmp(p + 1, "d") == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
374 global.params.useDeprecated = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
375 else if (strcmp(p + 1, "c") == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
376 global.params.link = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
377 else if (strcmp(p + 1, "fPIC") == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
378 global.params.pic = 1;
811
8e6135be6999 Fixed ModuleInfo generation to no longer use the ModuleInfo class' default initializer for types/defaults, it's unsafe as initializers don't necesarily match the "formal" type. There might be explicit padding.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 797
diff changeset
379 else if (strcmp(p + 1, "g") == 0)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
380 global.params.symdebug = 1;
811
8e6135be6999 Fixed ModuleInfo generation to no longer use the ModuleInfo class' default initializer for types/defaults, it's unsafe as initializers don't necesarily match the "formal" type. There might be explicit padding.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 797
diff changeset
381 else if (strcmp(p + 1, "gc") == 0)
8e6135be6999 Fixed ModuleInfo generation to no longer use the ModuleInfo class' default initializer for types/defaults, it's unsafe as initializers don't necesarily match the "formal" type. There might be explicit padding.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 797
diff changeset
382 global.params.symdebug = 2;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
383 else if (strcmp(p + 1, "v") == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
384 global.params.verbose = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
385 else if (strcmp(p + 1, "vv") == 0) {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
386 Logger::enable();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
387 very_verbose = true;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
388 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
389 else if (strcmp(p + 1, "v1") == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
390 global.params.Dversion = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
391 else if (strcmp(p + 1, "w") == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
392 global.params.warnings = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
393 else if (p[1] == 'O')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
394 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
395 global.params.optimize = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
396 global.params.optimizeLevel = 2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
397 if (p[2] != 0) {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
398 int optlevel = atoi(p+2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
399 if (optlevel < 0 || optlevel > 5) {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
400 error("Optimization level must be between 0 and 5. Using default (%d)",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
401 global.params.optimizeLevel);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
402 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
403 else {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
404 global.params.optimizeLevel = optlevel;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
405 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
406 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
407 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
408 else if (strcmp(p + 1, "forcebe") == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
409 global.params.forceBE = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
410 else if (strcmp(p + 1, "noruntime") == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
411 global.params.noruntime = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
412 else if (strcmp(p + 1, "noverify") == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
413 global.params.novalidate = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
414 else if (strcmp(p + 1, "annotate") == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
415 global.params.llvmAnnotate = 1;
547
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
416 else if (strncmp(p + 1, "enable-", 7) == 0 ||
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
417 strncmp(p + 1, "disable-", 8) == 0)
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
418 {
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
419 bool enable = (p[1] == 'e');
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
420 char* feature = p + 1 + (enable ? 7 : 8);
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
421 if (strcmp(feature, "asserts") == 0)
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
422 global.params.useAssert = enable;
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
423 else if (strcmp(feature, "boundscheck") == 0)
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
424 global.params.useArrayBounds = enable;
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
425 else if (strcmp(feature, "contracts") == 0)
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
426 {
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
427 global.params.useIn = enable;
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
428 global.params.useOut = enable;
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
429 }
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
430 else if (strcmp(feature, "invariants") == 0)
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
431 global.params.useInvariants = enable;
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
432 else
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
433 error("unrecognized feature '%s'", feature);
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
434 }
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
435 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
436 global.params.useInlineAsm = 0;
651
5709381df7e8 Added -nodefaultlib switch do disable implicitly linked standard lib modules
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 638
diff changeset
437 else if (strcmp(p + 1, "nodefaultlib") == 0)
5709381df7e8 Added -nodefaultlib switch do disable implicitly linked standard lib modules
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 638
diff changeset
438 global.params.noDefaultLib = 1;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
439 else if (p[1] == 'o')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
440 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
441 switch (p[2])
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
442 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
443 case '-':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
444 global.params.obj = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
445 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
446
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
447 case 'd':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
448 if (!p[3])
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
449 goto Lnoarg;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
450 global.params.objdir = p + 3;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
451 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
452
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
453 case 'f':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
454 if (!p[3])
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
455 goto Lnoarg;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
456 global.params.objname = p + 3;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
457 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
458
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
459 case 'p':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
460 if (p[3])
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
461 goto Lerror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
462 global.params.preservePaths = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
463 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
464
580
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 572
diff changeset
465 case 'q':
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 572
diff changeset
466 if (p[3])
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 572
diff changeset
467 goto Lerror;
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 572
diff changeset
468 global.params.fqnNames = 1;
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 572
diff changeset
469 break;
217
0806379a5eca [svn r233] Added: -oq command line option for writing fully qualified object names.
lindquist
parents: 205
diff changeset
470
675
bfe5229f9d8e Disable bc output by default. Remove -dis. Add -output-bc, -output-ll, -output-s.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
471 case 'u':
bfe5229f9d8e Disable bc output by default. Remove -dis. Add -output-bc, -output-ll, -output-s.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
472 if (strncmp(p+1, "output-", 7) != 0)
bfe5229f9d8e Disable bc output by default. Remove -dis. Add -output-bc, -output-ll, -output-s.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
473 goto Lerror;
708
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
474
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
475 // remove default output
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
476 if (global.params.output_o == OUTPUTFLAGdefault)
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
477 global.params.output_o = OUTPUTFLAGno;
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
478
694
931333ea35c6 Allow output of only bc, ll, or s by making -of set the output type depending
Christian Kamm <kamm incasoftware de>
parents: 690
diff changeset
479 if (strcmp(p+8, global.ll_ext) == 0)
708
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
480 global.params.output_ll = OUTPUTFLAGset;
694
931333ea35c6 Allow output of only bc, ll, or s by making -of set the output type depending
Christian Kamm <kamm incasoftware de>
parents: 690
diff changeset
481 else if (strcmp(p+8, global.bc_ext) == 0)
708
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
482 global.params.output_bc = OUTPUTFLAGset;
694
931333ea35c6 Allow output of only bc, ll, or s by making -of set the output type depending
Christian Kamm <kamm incasoftware de>
parents: 690
diff changeset
483 else if (strcmp(p+8, global.s_ext) == 0)
708
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
484 global.params.output_s = OUTPUTFLAGset;
694
931333ea35c6 Allow output of only bc, ll, or s by making -of set the output type depending
Christian Kamm <kamm incasoftware de>
parents: 690
diff changeset
485 else if (strcmp(p+8, global.obj_ext) == 0)
708
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
486 global.params.output_o = OUTPUTFLAGset;
675
bfe5229f9d8e Disable bc output by default. Remove -dis. Add -output-bc, -output-ll, -output-s.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
487 else
bfe5229f9d8e Disable bc output by default. Remove -dis. Add -output-bc, -output-ll, -output-s.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
488 goto Lerror;
708
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
489
675
bfe5229f9d8e Disable bc output by default. Remove -dis. Add -output-bc, -output-ll, -output-s.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
490 break;
bfe5229f9d8e Disable bc output by default. Remove -dis. Add -output-bc, -output-ll, -output-s.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
491
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
492 case 0:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
493 error("-o no longer supported, use -of or -od");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
494 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
495
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
496 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
497 goto Lerror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
498 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
499 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
500 else if (p[1] == 'D')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
501 { global.params.doDocComments = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
502 switch (p[2])
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
503 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
504 case 'd':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
505 if (!p[3])
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
506 goto Lnoarg;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
507 global.params.docdir = p + 3;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
508 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
509 case 'f':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
510 if (!p[3])
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
511 goto Lnoarg;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
512 global.params.docname = p + 3;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
513 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
514
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
515 case 0:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
516 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
517
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
518 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
519 goto Lerror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
520 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
521 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
522 #ifdef _DH
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
523 else if (p[1] == 'H')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
524 { global.params.doHdrGeneration = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
525 switch (p[2])
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
526 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
527 case 'd':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
528 if (!p[3])
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
529 goto Lnoarg;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
530 global.params.hdrdir = p + 3;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
531 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
532
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
533 case 'f':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
534 if (!p[3])
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
535 goto Lnoarg;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
536 global.params.hdrname = p + 3;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
537 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
538
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
539 case 0:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
540 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
541
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
542 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
543 goto Lerror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
544 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
545 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
546 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
547 else if (strcmp(p + 1, "ignore") == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
548 global.params.ignoreUnsupportedPragmas = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
549 else if (strcmp(p + 1, "inline") == 0) {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
550 // TODO
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
551 // the ast rewrites dmd does for inlining messes up the ast.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
552 // someday maybe we can support it, for now llvm does an excellent job at inlining
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
553 global.params.useInline = 0; //1
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
554 global.params.llvmInline = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
555 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
556 else if (strcmp(p + 1, "quiet") == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
557 global.params.quiet = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
558 else if (strcmp(p + 1, "release") == 0)
547
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
559 {
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
560 global.params.useInvariants = 0;
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
561 global.params.useIn = 0;
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
562 global.params.useOut = 0;
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
563 global.params.useAssert = 0;
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
564 global.params.useArrayBounds = 0;
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
565 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
566 else if (strcmp(p + 1, "unittest") == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
567 global.params.useUnitTests = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
568 else if (p[1] == 'I')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
569 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
570 if (!global.params.imppath)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
571 global.params.imppath = new Array();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
572 global.params.imppath->push(p + 2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
573 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
574 else if (p[1] == 'J')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
575 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
576 if (!global.params.fileImppath)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
577 global.params.fileImppath = new Array();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
578 global.params.fileImppath->push(p + 2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
579 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
580 else if (memcmp(p + 1, "debug", 5) == 0 && p[6] != 'l')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
581 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
582 // Parse:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
583 // -debug
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
584 // -debug=number
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
585 // -debug=identifier
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
586 if (p[6] == '=')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
587 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
588 if (isdigit(p[7]))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
589 { long level;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
590
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
591 errno = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
592 level = strtol(p + 7, &p, 10);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
593 if (*p || errno || level > INT_MAX)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
594 goto Lerror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
595 DebugCondition::setGlobalLevel((int)level);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
596 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
597 else if (Lexer::isValidIdentifier(p + 7))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
598 DebugCondition::addGlobalIdent(p + 7);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
599 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
600 goto Lerror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
601 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
602 else if (p[6])
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
603 goto Lerror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
604 else
547
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
605 {
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
606 global.params.useInvariants = 1;
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
607 global.params.useIn = 1;
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
608 global.params.useOut = 1;
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
609 global.params.useAssert = 1;
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
610 global.params.useArrayBounds = 1;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
611 global.params.debuglevel = 1;
547
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
612 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
613 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
614 else if (memcmp(p + 1, "version", 5) == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
615 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
616 // Parse:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
617 // -version=number
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
618 // -version=identifier
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
619 if (p[8] == '=')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
620 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
621 if (isdigit(p[9]))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
622 { long level;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
623
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
624 errno = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
625 level = strtol(p + 9, &p, 10);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
626 if (*p || errno || level > INT_MAX)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
627 goto Lerror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
628 VersionCondition::setGlobalLevel((int)level);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
629 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
630 else if (Lexer::isValidIdentifier(p + 9))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
631 VersionCondition::addGlobalIdent(p + 9);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
632 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
633 goto Lerror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
634 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
635 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
636 goto Lerror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
637 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
638 else if (strcmp(p + 1, "-b") == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
639 global.params.debugb = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
640 else if (strcmp(p + 1, "-c") == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
641 global.params.debugc = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
642 else if (strcmp(p + 1, "-f") == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
643 global.params.debugf = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
644 else if (strcmp(p + 1, "-help") == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
645 { usage();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
646 exit(EXIT_SUCCESS);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
647 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
648 else if (strcmp(p + 1, "-r") == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
649 global.params.debugr = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
650 else if (strcmp(p + 1, "-x") == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
651 global.params.debugx = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
652 else if (strcmp(p + 1, "-y") == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
653 global.params.debugy = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
654 else if (p[1] == 'L')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
655 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
656 global.params.linkswitches->push(p + 2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
657 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
658 else if (memcmp(p + 1, "defaultlib=", 11) == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
659 {
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
660 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
661 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
662 global.params.defaultlibnames->push(p + 1 + 11);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
663 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
664 else if (memcmp(p + 1, "debuglib=", 9) == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
665 {
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
666 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
667 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
668 global.params.debuglibnames->push(p + 1 + 9);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
669 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
670 else if (strcmp(p + 1, "run") == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
671 { global.params.run = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
672 global.params.runargs_length = ((i >= argcstart) ? argc : argcstart) - i - 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
673 if (global.params.runargs_length)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
674 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
675 files.push(argv[i + 1]);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
676 global.params.runargs = &argv[i + 2];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
677 i += global.params.runargs_length;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
678 global.params.runargs_length--;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
679 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
680 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
681 { global.params.run = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
682 goto Lnoarg;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
683 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
684 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
685 else if (p[1] == 'm')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
686 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
687 global.params.llvmArch = p+2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
688 }
547
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
689 else if (p[1] == 't')
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
690 {
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
691 if(strcmp(p + 2, "Linux") == 0)
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
692 global.params.os = OSLinux;
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
693 else if(strcmp(p + 2, "Windows") == 0)
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
694 global.params.os = OSWindows;
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
695 else if(strcmp(p + 2, "MacOSX") == 0)
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
696 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
697 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
698 global.params.os = OSFreeBSD;
872
aa953cc960b6 Apply BlueZeniX's patch for OpenSolaris compatibility. Fixes #158.
Christian Kamm <kamm incasoftware de>
parents: 853
diff changeset
699 else if(strcmp(p + 2, "Solaris") == 0)
aa953cc960b6 Apply BlueZeniX's patch for OpenSolaris compatibility. Fixes #158.
Christian Kamm <kamm incasoftware de>
parents: 853
diff changeset
700 global.params.os = OSSolaris;
547
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
701 else
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
702 error("unrecognized target os '%s'", p + 2);
b0005772a88e Add -enable/-disable for specific features.
Christian Kamm <kamm incasoftware de>
parents: 546
diff changeset
703 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
704 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
705 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
706 Lerror:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
707 error("unrecognized switch '%s'", argv[i]);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
708 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
709
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
710 Lnoarg:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
711 error("argument expected for switch '%s'", argv[i]);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
712 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
713 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
714 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
715 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
716 files.push(p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
717 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
718 if (global.errors)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
719 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
720 fatal();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
721 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
722 if (files.dim == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
723 { usage();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
724 return EXIT_FAILURE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
725 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
726
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
727 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
728 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
729 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
730 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
731 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
732
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
733 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
734 {
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
735 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
736 {
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
737 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
738 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
739 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
740 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
741 }
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
742 }
651
5709381df7e8 Added -nodefaultlib switch do disable implicitly linked standard lib modules
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 638
diff changeset
743 else if (!global.params.noDefaultLib)
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
744 {
569
926a03711ca8 Split runtime into three parts again.
Christian Kamm <kamm incasoftware de>
parents: 568
diff changeset
745 char *arg;
926a03711ca8 Split runtime into three parts again.
Christian Kamm <kamm incasoftware de>
parents: 568
diff changeset
746 arg = (char *)mem.malloc(64);
663
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
747 strcpy(arg, "-lldc-runtime");
569
926a03711ca8 Split runtime into three parts again.
Christian Kamm <kamm incasoftware de>
parents: 568
diff changeset
748 global.params.linkswitches->push(arg);
926a03711ca8 Split runtime into three parts again.
Christian Kamm <kamm incasoftware de>
parents: 568
diff changeset
749 arg = (char *)mem.malloc(64);
926a03711ca8 Split runtime into three parts again.
Christian Kamm <kamm incasoftware de>
parents: 568
diff changeset
750 strcpy(arg, "-ltango-cc-tango");
926a03711ca8 Split runtime into three parts again.
Christian Kamm <kamm incasoftware de>
parents: 568
diff changeset
751 global.params.linkswitches->push(arg);
926a03711ca8 Split runtime into three parts again.
Christian Kamm <kamm incasoftware de>
parents: 568
diff changeset
752 arg = (char *)mem.malloc(64);
926a03711ca8 Split runtime into three parts again.
Christian Kamm <kamm incasoftware de>
parents: 568
diff changeset
753 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
754 global.params.linkswitches->push(arg);
679
dc078dd8d2e1 Fix remaining make files. Fix linking order for static libs.
Christian Kamm <kamm incasoftware de>
parents: 677
diff changeset
755 // pass the runtime again to resolve issues
dc078dd8d2e1 Fix remaining make files. Fix linking order for static libs.
Christian Kamm <kamm incasoftware de>
parents: 677
diff changeset
756 // with linking order
dc078dd8d2e1 Fix remaining make files. Fix linking order for static libs.
Christian Kamm <kamm incasoftware de>
parents: 677
diff changeset
757 arg = (char *)mem.malloc(64);
dc078dd8d2e1 Fix remaining make files. Fix linking order for static libs.
Christian Kamm <kamm incasoftware de>
parents: 677
diff changeset
758 strcpy(arg, "-lldc-runtime");
dc078dd8d2e1 Fix remaining make files. Fix linking order for static libs.
Christian Kamm <kamm incasoftware de>
parents: 677
diff changeset
759 global.params.linkswitches->push(arg);
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
760 }
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
761
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
762 if (global.params.run)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
763 global.params.quiet = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
764
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
765 if (global.params.useUnitTests)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
766 global.params.useAssert = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
767
708
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
768 // LDC output determination
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
769
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
770 // if we don't link, autodetect target from extension
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
771 if(!global.params.link && global.params.objname) {
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
772 ext = FileName::ext(global.params.objname);
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
773 bool autofound = false;
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
774 if (!ext) {
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
775 // keep things as they are
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
776 } else if (strcmp(ext, global.ll_ext) == 0) {
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
777 global.params.output_ll = OUTPUTFLAGset;
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
778 autofound = true;
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
779 } else if (strcmp(ext, global.bc_ext) == 0) {
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
780 global.params.output_bc = OUTPUTFLAGset;
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
781 autofound = true;
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
782 } else if (strcmp(ext, global.s_ext) == 0) {
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
783 global.params.output_s = OUTPUTFLAGset;
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
784 autofound = true;
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
785 } else if (strcmp(ext, global.obj_ext) == 0) {
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
786 global.params.output_o = OUTPUTFLAGset;
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
787 autofound = true;
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
788 } else {
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
789 // append dot, so forceExt won't change existing name even if it contains dots
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
790 size_t len = strlen(global.params.objname);
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
791 size_t extlen = strlen(".");
713
b3dc22526289 Use malloc instead of alloca.
Christian Kamm <kamm incasoftware de>
parents: 712
diff changeset
792 char* s = (char *)mem.malloc(len + 1 + extlen + 1);
708
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
793 memcpy(s, global.params.objname, len);
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
794 s[len] = '.';
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
795 s[len+1+extlen] = 0;
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
796 global.params.objname = s;
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
797
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
798 }
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
799 if(autofound && global.params.output_o == OUTPUTFLAGdefault)
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
800 global.params.output_o = OUTPUTFLAGno;
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
801 }
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
802
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
803 // only link if possible
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
804 if (!global.params.obj || !global.params.output_o)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
805 global.params.link = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
806
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
807 if (global.params.link)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
808 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
809 global.params.exefile = global.params.objname;
712
8c0d3ec8dbbb Fix -of with multiple input files.
Christian Kamm <kamm incasoftware de>
parents: 708
diff changeset
810 if (files.dim > 1)
8c0d3ec8dbbb Fix -of with multiple input files.
Christian Kamm <kamm incasoftware de>
parents: 708
diff changeset
811 global.params.objname = NULL;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
812 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
813 else if (global.params.run)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
814 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
815 error("flags conflict with -run");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
816 fatal();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
817 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
818 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
819 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
820 if (global.params.objname && files.dim > 1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
821 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
822 error("multiple source files, but only one .obj name");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
823 fatal();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
824 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
825 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
826
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
827 bool allowForceEndianness = false;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
828
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
829 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
830 #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
831 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
832 #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
833 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
834 #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
835 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
836 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
837 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
838 global.params.llvmArch = "ppc32";
734
6dcab994ddc3 Fold in mandel's patch for ARM from #106
Christian Kamm <kamm incasoftware de>
parents: 717
diff changeset
839 #elif defined(__arm__)
6dcab994ddc3 Fold in mandel's patch for ARM from #106
Christian Kamm <kamm incasoftware de>
parents: 717
diff changeset
840 global.params.llvmArch = "arm";
735
eee9efe5b51f Attempt at getting LLVM to provide a proper target data layout. Should assert now if things are borked.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 734
diff changeset
841 #elif defined(__thumb__)
eee9efe5b51f Attempt at getting LLVM to provide a proper target data layout. Should assert now if things are borked.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 734
diff changeset
842 global.params.llvmArch = "thumb";
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
843 #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
844 #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
845 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
846 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
847
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
848 if (strcmp(global.params.llvmArch,"x86")==0) {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
849 VersionCondition::addPredefinedGlobalIdent("X86");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
850 global.params.isLE = true;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
851 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
852 global.params.cpu = ARCHx86;
445
cc40db549aea Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 439
diff changeset
853 if (global.params.useInlineAsm) {
942
55559220ad72 Reverted back to the LLVM_InlineAsm_X86 versions, a few more things still needs to be sorted out first.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 941
diff changeset
854 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
855 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
856 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
857 else if (strcmp(global.params.llvmArch,"x86-64")==0) {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
858 VersionCondition::addPredefinedGlobalIdent("X86_64");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
859 global.params.isLE = true;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
860 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
861 global.params.cpu = ARCHx86_64;
741
4ac97ec7c18e Applied easy part from wilsonk's x86-64 patch in #107
Christian Kamm <kamm incasoftware de>
parents: 735
diff changeset
862 if (global.params.useInlineAsm) {
4ac97ec7c18e Applied easy part from wilsonk's x86-64 patch in #107
Christian Kamm <kamm incasoftware de>
parents: 735
diff changeset
863 VersionCondition::addPredefinedGlobalIdent("LLVM_InlineAsm_X86_64");
4ac97ec7c18e Applied easy part from wilsonk's x86-64 patch in #107
Christian Kamm <kamm incasoftware de>
parents: 735
diff changeset
864 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
865 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
866 else if (strcmp(global.params.llvmArch,"ppc32")==0) {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
867 VersionCondition::addPredefinedGlobalIdent("PPC");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
868 global.params.isLE = false;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
869 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
870 global.params.cpu = ARCHppc;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
871 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
872 else if (strcmp(global.params.llvmArch,"ppc64")==0) {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
873 VersionCondition::addPredefinedGlobalIdent("PPC64");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
874 global.params.isLE = false;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
875 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
876 global.params.cpu = ARCHppc_64;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
877 }
734
6dcab994ddc3 Fold in mandel's patch for ARM from #106
Christian Kamm <kamm incasoftware de>
parents: 717
diff changeset
878 else if (strcmp(global.params.llvmArch,"arm")==0) {
6dcab994ddc3 Fold in mandel's patch for ARM from #106
Christian Kamm <kamm incasoftware de>
parents: 717
diff changeset
879 VersionCondition::addPredefinedGlobalIdent("ARM");
6dcab994ddc3 Fold in mandel's patch for ARM from #106
Christian Kamm <kamm incasoftware de>
parents: 717
diff changeset
880 global.params.isLE = true;
6dcab994ddc3 Fold in mandel's patch for ARM from #106
Christian Kamm <kamm incasoftware de>
parents: 717
diff changeset
881 global.params.is64bit = false;
6dcab994ddc3 Fold in mandel's patch for ARM from #106
Christian Kamm <kamm incasoftware de>
parents: 717
diff changeset
882 global.params.cpu = ARCHarm;
6dcab994ddc3 Fold in mandel's patch for ARM from #106
Christian Kamm <kamm incasoftware de>
parents: 717
diff changeset
883 }
735
eee9efe5b51f Attempt at getting LLVM to provide a proper target data layout. Should assert now if things are borked.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 734
diff changeset
884 else if (strcmp(global.params.llvmArch,"thumb")==0) {
eee9efe5b51f Attempt at getting LLVM to provide a proper target data layout. Should assert now if things are borked.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 734
diff changeset
885 VersionCondition::addPredefinedGlobalIdent("Thumb");
eee9efe5b51f Attempt at getting LLVM to provide a proper target data layout. Should assert now if things are borked.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 734
diff changeset
886 global.params.isLE = true;
eee9efe5b51f Attempt at getting LLVM to provide a proper target data layout. Should assert now if things are borked.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 734
diff changeset
887 global.params.is64bit = false;
eee9efe5b51f Attempt at getting LLVM to provide a proper target data layout. Should assert now if things are borked.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 734
diff changeset
888 global.params.cpu = ARCHthumb;
eee9efe5b51f Attempt at getting LLVM to provide a proper target data layout. Should assert now if things are borked.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 734
diff changeset
889 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
890 else {
920
545f54041d91 Implemented proper support for naked asm using llvm module level asm. Still not 100% complete, but already 1000 times better that what we had before. Don's BignumX86 implementation from Tango (when turned into a standalone unittest) seems to fully work with no changes, and great performance :)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 917
diff changeset
891 error("invalid cpu architecture specified: %s", global.params.llvmArch);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
892 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
893
566
68d7df3f9b05 Added some sanity checks for target detection.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 550
diff changeset
894 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
895
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
896 if (allowForceEndianness && global.params.forceBE) {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
897 VersionCondition::addPredefinedGlobalIdent("BigEndian");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
898 global.params.isLE = false;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
899 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
900 else if (global.params.isLE) {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
901 VersionCondition::addPredefinedGlobalIdent("LittleEndian");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
902 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
903 else {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
904 VersionCondition::addPredefinedGlobalIdent("BigEndian");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
905 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
906
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
907 if (global.params.is64bit) {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
908 VersionCondition::addPredefinedGlobalIdent("LLVM64");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
909 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
910
534
7e2867ed70d9 Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents: 530
diff changeset
911
7e2867ed70d9 Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents: 530
diff changeset
912 // 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
913 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
914 {
7e2867ed70d9 Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents: 530
diff changeset
915 case OSWindows:
876
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
916 // TODO Win64 stuff!
534
7e2867ed70d9 Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents: 530
diff changeset
917 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
918 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
919 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
920 break;
7e2867ed70d9 Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents: 530
diff changeset
921
536
0d2db7efa105 Add isnan for __APPLE__ and darwin version ident for OSX.
Christian Kamm <kamm incasoftware de>
parents: 535
diff changeset
922 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
923 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
924 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
925 break;
7e2867ed70d9 Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents: 530
diff changeset
926
536
0d2db7efa105 Add isnan for __APPLE__ and darwin version ident for OSX.
Christian Kamm <kamm incasoftware de>
parents: 535
diff changeset
927 case OSMacOSX:
960
0b38b64f62c7 Add OSX version declaration for Mac OS X to improve dmd-mac compatibility.
Christian Kamm <kamm incasoftware de>
parents: 942
diff changeset
928 VersionCondition::addPredefinedGlobalIdent("OSX");
536
0d2db7efa105 Add isnan for __APPLE__ and darwin version ident for OSX.
Christian Kamm <kamm incasoftware de>
parents: 535
diff changeset
929 VersionCondition::addPredefinedGlobalIdent("darwin");
909
52dad07846be Port some LDC1 portability fixes to LDC2. Fixes #196.
Christian Kamm <kamm incasoftware de>
parents: 900
diff changeset
930 VersionCondition::addPredefinedGlobalIdent("Posix");
52dad07846be Port some LDC1 portability fixes to LDC2. Fixes #196.
Christian Kamm <kamm incasoftware de>
parents: 900
diff changeset
931 break;
536
0d2db7efa105 Add isnan for __APPLE__ and darwin version ident for OSX.
Christian Kamm <kamm incasoftware de>
parents: 535
diff changeset
932
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
933 case OSFreeBSD:
909
52dad07846be Port some LDC1 portability fixes to LDC2. Fixes #196.
Christian Kamm <kamm incasoftware de>
parents: 900
diff changeset
934 VersionCondition::addPredefinedGlobalIdent("freebsd");
52dad07846be Port some LDC1 portability fixes to LDC2. Fixes #196.
Christian Kamm <kamm incasoftware de>
parents: 900
diff changeset
935 VersionCondition::addPredefinedGlobalIdent("Posix");
52dad07846be Port some LDC1 portability fixes to LDC2. Fixes #196.
Christian Kamm <kamm incasoftware de>
parents: 900
diff changeset
936 break;
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
937
872
aa953cc960b6 Apply BlueZeniX's patch for OpenSolaris compatibility. Fixes #158.
Christian Kamm <kamm incasoftware de>
parents: 853
diff changeset
938 case OSSolaris:
909
52dad07846be Port some LDC1 portability fixes to LDC2. Fixes #196.
Christian Kamm <kamm incasoftware de>
parents: 900
diff changeset
939 VersionCondition::addPredefinedGlobalIdent("solaris");
52dad07846be Port some LDC1 portability fixes to LDC2. Fixes #196.
Christian Kamm <kamm incasoftware de>
parents: 900
diff changeset
940 VersionCondition::addPredefinedGlobalIdent("Posix");
52dad07846be Port some LDC1 portability fixes to LDC2. Fixes #196.
Christian Kamm <kamm incasoftware de>
parents: 900
diff changeset
941 break;
872
aa953cc960b6 Apply BlueZeniX's patch for OpenSolaris compatibility. Fixes #158.
Christian Kamm <kamm incasoftware de>
parents: 853
diff changeset
942
534
7e2867ed70d9 Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents: 530
diff changeset
943 default:
7e2867ed70d9 Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents: 530
diff changeset
944 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
945 }
7e2867ed70d9 Get rid of isLinux and isWindows in favor of global.params.os.
Christian Kamm <kamm incasoftware de>
parents: 530
diff changeset
946
699
ed9a9e6dd1cc Started changing target triple stuff, part of fixing #97
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 695
diff changeset
947 if (!global.params.targetTriple)
ed9a9e6dd1cc Started changing target triple stuff, part of fixing #97
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 695
diff changeset
948 global.params.targetTriple = DEFAULT_TARGET_TRIPLE;
ed9a9e6dd1cc Started changing target triple stuff, part of fixing #97
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 695
diff changeset
949
ed9a9e6dd1cc Started changing target triple stuff, part of fixing #97
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 695
diff changeset
950 Logger::println("Target triple: %s", global.params.targetTriple);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
951
735
eee9efe5b51f Attempt at getting LLVM to provide a proper target data layout. Should assert now if things are borked.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 734
diff changeset
952 // build a minimal data layout so llvm can find the target
eee9efe5b51f Attempt at getting LLVM to provide a proper target data layout. Should assert now if things are borked.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 734
diff changeset
953 global.params.dataLayout = global.params.isLE
eee9efe5b51f Attempt at getting LLVM to provide a proper target data layout. Should assert now if things are borked.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 734
diff changeset
954 ? (char*)(global.params.is64bit ? "e-p:64:64" : "e-p:32:32")
eee9efe5b51f Attempt at getting LLVM to provide a proper target data layout. Should assert now if things are borked.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 734
diff changeset
955 : (char*)(global.params.is64bit ? "E-p:64:64" : "E-p:32:32");
eee9efe5b51f Attempt at getting LLVM to provide a proper target data layout. Should assert now if things are borked.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 734
diff changeset
956 Logger::println("Layout: %s", global.params.dataLayout);
eee9efe5b51f Attempt at getting LLVM to provide a proper target data layout. Should assert now if things are borked.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 734
diff changeset
957
876
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
958 // added in 1.039
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
959 if (global.params.doDocComments)
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
960 VersionCondition::addPredefinedGlobalIdent("D_Ddoc");
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
961
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
962 // Initialization
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
963 Type::init();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
964 Id::initialize();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
965 Module::init();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
966 initPrecedence();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
967
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
968 backend_init();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
969
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
970 //printf("%d source files\n",files.dim);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
971
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
972 // Build import search path
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
973 if (global.params.imppath)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
974 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
975 for (i = 0; i < global.params.imppath->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
976 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
977 char *path = (char *)global.params.imppath->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
978 Array *a = FileName::splitPath(path);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
979
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
980 if (a)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
981 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
982 if (!global.path)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
983 global.path = new Array();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
984 global.path->append(a);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
985 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
986 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
987 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
988
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
989 // Build string import search path
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
990 if (global.params.fileImppath)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
991 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
992 for (i = 0; i < global.params.fileImppath->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
993 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
994 char *path = (char *)global.params.fileImppath->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
995 Array *a = FileName::splitPath(path);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
996
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
997 if (a)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
998 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
999 if (!global.filePath)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1000 global.filePath = new Array();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1001 global.filePath->append(a);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1002 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1003 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1004 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1005
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1006 // Create Modules
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1007 Array modules;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1008 modules.reserve(files.dim);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1009 for (i = 0; i < files.dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1010 { Identifier *id;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1011 char *ext;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1012 char *name;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1013
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1014 p = (char *) files.data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1015
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1016 p = FileName::name(p); // strip path
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1017 ext = FileName::ext(p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1018 if (ext)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1019 {
917
7e272f2b4fc3 Removed use of TARGET_LINUX and replaced with POSIX, fixes bug [172]
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 909
diff changeset
1020 #if POSIX
675
bfe5229f9d8e Disable bc output by default. Remove -dis. Add -output-bc, -output-ll, -output-s.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
1021 if (strcmp(ext, global.obj_ext) == 0 ||
bfe5229f9d8e Disable bc output by default. Remove -dis. Add -output-bc, -output-ll, -output-s.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
1022 strcmp(ext, global.bc_ext) == 0)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1023 #else
675
bfe5229f9d8e Disable bc output by default. Remove -dis. Add -output-bc, -output-ll, -output-s.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
1024 if (stricmp(ext, global.obj_ext) == 0 ||
bfe5229f9d8e Disable bc output by default. Remove -dis. Add -output-bc, -output-ll, -output-s.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
1025 stricmp(ext, global.bc_ext) == 0)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1026 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1027 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1028 global.params.objfiles->push(files.data[i]);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1029 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1030 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1031
917
7e272f2b4fc3 Removed use of TARGET_LINUX and replaced with POSIX, fixes bug [172]
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 909
diff changeset
1032 #if POSIX
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1033 if (strcmp(ext, "a") == 0)
917
7e272f2b4fc3 Removed use of TARGET_LINUX and replaced with POSIX, fixes bug [172]
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 909
diff changeset
1034 #elif __MINGW32__
7e272f2b4fc3 Removed use of TARGET_LINUX and replaced with POSIX, fixes bug [172]
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 909
diff changeset
1035 if (stricmp(ext, "a") == 0)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1036 #else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1037 if (stricmp(ext, "lib") == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1038 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1039 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1040 global.params.libfiles->push(files.data[i]);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1041 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1042 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1043
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1044 if (strcmp(ext, global.ddoc_ext) == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1045 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1046 global.params.ddocfiles->push(files.data[i]);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1047 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1048 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1049
917
7e272f2b4fc3 Removed use of TARGET_LINUX and replaced with POSIX, fixes bug [172]
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 909
diff changeset
1050 #if !POSIX
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1051 if (stricmp(ext, "res") == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1052 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1053 global.params.resfile = (char *)files.data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1054 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1055 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1056
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1057 if (stricmp(ext, "def") == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1058 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1059 global.params.deffile = (char *)files.data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1060 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1061 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1062
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1063 if (stricmp(ext, "exe") == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1064 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1065 global.params.exefile = (char *)files.data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1066 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1067 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1068 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1069
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1070 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
1071 stricmp(ext, global.hdr_ext) == 0 ||
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1072 stricmp(ext, "htm") == 0 ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1073 stricmp(ext, "html") == 0 ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1074 stricmp(ext, "xhtml") == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1075 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1076 ext--; // skip onto '.'
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1077 assert(*ext == '.');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1078 name = (char *)mem.malloc((ext - p) + 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1079 memcpy(name, p, ext - p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1080 name[ext - p] = 0; // strip extension
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1081
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1082 if (name[0] == 0 ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1083 strcmp(name, "..") == 0 ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1084 strcmp(name, ".") == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1085 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1086 Linvalid:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1087 error("invalid file name '%s'", (char *)files.data[i]);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1088 fatal();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1089 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1090 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1091 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1092 { error("unrecognized file extension %s\n", ext);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1093 fatal();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1094 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1095 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1096 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1097 { name = p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1098 if (!*name)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1099 goto Linvalid;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1100 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1101
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1102 id = new Identifier(name, 0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1103 m = new Module((char *) files.data[i], id, global.params.doDocComments, global.params.doHdrGeneration);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1104 modules.push(m);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1105 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1106
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1107 // Read files, parse them
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1108 for (i = 0; i < modules.dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1109 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1110 m = (Module *)modules.data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1111 if (global.params.verbose)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1112 printf("parse %s\n", m->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1113 if (!Module::rootModule)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1114 Module::rootModule = m;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1115 m->importedFrom = m;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1116 m->read(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1117 m->parse();
580
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 572
diff changeset
1118 m->buildTargetFiles();
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 572
diff changeset
1119 m->deleteObjFile();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1120 if (m->isDocFile)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1121 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1122 m->gendocfile();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1123
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1124 // Remove m from list of modules
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1125 modules.remove(i);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1126 i--;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1127 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1128 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1129 if (global.errors)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1130 fatal();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1131 #ifdef _DH
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1132 if (global.params.doHdrGeneration)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1133 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1134 /* Generate 'header' import files.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1135 * Since 'header' import files must be independent of command
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1136 * line switches and what else is imported, they are generated
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1137 * before any semantic analysis.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1138 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1139 for (i = 0; i < modules.dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1140 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1141 m = (Module *)modules.data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1142 if (global.params.verbose)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1143 printf("import %s\n", m->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1144 m->genhdrfile();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1145 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1146 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1147 if (global.errors)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1148 fatal();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1149 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1150
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1151 // Do semantic analysis
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1152 for (i = 0; i < modules.dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1153 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1154 m = (Module *)modules.data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1155 if (global.params.verbose)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1156 printf("semantic %s\n", m->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1157 m->semantic();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1158 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1159 if (global.errors)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1160 fatal();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1161
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1162 // Do pass 2 semantic analysis
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1163 for (i = 0; i < modules.dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1164 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1165 m = (Module *)modules.data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1166 if (global.params.verbose)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1167 printf("semantic2 %s\n", m->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1168 m->semantic2();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1169 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1170 if (global.errors)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1171 fatal();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1172
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1173 // Do pass 3 semantic analysis
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1174 for (i = 0; i < modules.dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1175 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1176 m = (Module *)modules.data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1177 if (global.params.verbose)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1178 printf("semantic3 %s\n", m->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1179 m->semantic3();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1180 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1181 if (global.errors)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1182 fatal();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1183
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1184 #if !IN_LLVM
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1185 // Scan for functions to inline
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1186 if (global.params.useInline)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1187 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1188 /* The problem with useArrayBounds and useAssert is that the
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1189 * module being linked to may not have generated them, so if
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1190 * we inline functions from those modules, the symbols for them will
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1191 * not be found at link time.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1192 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1193 if (!global.params.useArrayBounds && !global.params.useAssert)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1194 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1195 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1196 // Do pass 3 semantic analysis on all imported modules,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1197 // since otherwise functions in them cannot be inlined
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1198 for (i = 0; i < Module::amodules.dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1199 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1200 m = (Module *)Module::amodules.data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1201 if (global.params.verbose)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1202 printf("semantic3 %s\n", m->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1203 m->semantic3();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1204 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1205 if (global.errors)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1206 fatal();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1207 #if !IN_LLVM
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1208 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1209
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1210 for (i = 0; i < modules.dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1211 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1212 m = (Module *)modules.data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1213 if (global.params.verbose)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1214 printf("inline scan %s\n", m->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1215 m->inlineScan();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1216 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1217 }
797
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 788
diff changeset
1218 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1219 if (global.errors)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1220 fatal();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1221
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1222 // Generate output files
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1223 for (i = 0; i < modules.dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1224 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1225 m = (Module *)modules.data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1226 if (global.params.verbose)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1227 printf("code %s\n", m->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1228 if (global.params.obj)
580
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 572
diff changeset
1229 {
849
ba390e5e9150 Remove unportable env-sanitizing code. If it is really needed, it needs to be
Christian Kamm <kamm incasoftware de>
parents: 846
diff changeset
1230 m->genobjfile(0);
580
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 572
diff changeset
1231 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
1232 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1233 if (global.errors)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1234 m->deleteObjFile();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1235 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1236 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1237 if (global.params.doDocComments)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1238 m->gendocfile();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1239 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1240 }
279
a137ed004205 [svn r300] Removed some win32 stuff that was causing problems on mingw32.
lindquist
parents: 277
diff changeset
1241
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1242 backend_term();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1243 if (global.errors)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1244 fatal();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1245
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1246 if (!global.params.objfiles->dim)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1247 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1248 if (global.params.link)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1249 error("no object files to link");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1250 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1251 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1252 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1253 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
1254 //status = runLINK();
677
075c1272a01d Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents: 676
diff changeset
1255 linkObjToExecutable(global.params.argv0);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1256
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1257 if (global.params.run)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1258 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1259 if (!status)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1260 {
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
1261 status = runExectuable();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1262
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1263 /* Delete .obj files and .exe file
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1264 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1265 for (i = 0; i < modules.dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1266 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1267 m = (Module *)modules.data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1268 m->deleteObjFile();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1269 }
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
1270 deleteExecutable();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1271 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1272 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1273 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1274
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1275 return status;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1276 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1277
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1278
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1279
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1280 /***********************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1281 * Parse and append contents of environment variable envvar
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1282 * to argc and argv[].
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1283 * The string is separated into arguments, processing \ and ".
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1284 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1285
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1286 void getenv_setargv(const char *envvar, int *pargc, char** *pargv)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1287 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1288 char *env;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1289 char *p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1290 Array *argv;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1291 int argc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1292
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1293 int wildcard; // do wildcard expansion
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1294 int instring;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1295 int slash;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1296 char c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1297 int j;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1298
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1299 env = getenv(envvar);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1300 if (!env)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1301 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1302
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1303 env = mem.strdup(env); // create our own writable copy
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1304
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1305 argc = *pargc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1306 argv = new Array();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1307 argv->setDim(argc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1308
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1309 for (int i = 0; i < argc; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1310 argv->data[i] = (void *)(*pargv)[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1311
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1312 j = 1; // leave argv[0] alone
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1313 while (1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1314 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1315 wildcard = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1316 switch (*env)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1317 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1318 case ' ':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1319 case '\t':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1320 env++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1321 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1322
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1323 case 0:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1324 goto Ldone;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1325
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1326 case '"':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1327 wildcard = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1328 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1329 argv->push(env); // append
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1330 //argv->insert(j, env); // insert at position j
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1331 j++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1332 argc++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1333 p = env;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1334 slash = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1335 instring = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1336 c = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1337
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1338 while (1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1339 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1340 c = *env++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1341 switch (c)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1342 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1343 case '"':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1344 p -= (slash >> 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1345 if (slash & 1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1346 { p--;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1347 goto Laddc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1348 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1349 instring ^= 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1350 slash = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1351 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1352
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1353 case ' ':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1354 case '\t':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1355 if (instring)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1356 goto Laddc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1357 *p = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1358 //if (wildcard)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1359 //wildcardexpand(); // not implemented
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1360 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1361
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1362 case '\\':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1363 slash++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1364 *p++ = c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1365 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1366
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1367 case 0:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1368 *p = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1369 //if (wildcard)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1370 //wildcardexpand(); // not implemented
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1371 goto Ldone;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1372
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1373 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1374 Laddc:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1375 slash = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1376 *p++ = c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1377 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1378 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1379 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1380 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1381 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1382 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1383
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1384 Ldone:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1385 *pargc = argc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1386 *pargv = (char **)argv->data;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1387 }