annotate gen/main.cpp @ 1199:80a326087f59

Disable frame pointer elimination when -g or -gc is passed.
author Christian Kamm <kamm incasoftware de>
date Wed, 08 Apr 2009 21:12:08 +0200
parents 1546b5162152
children 3d6a908a34e9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
1 // Pulled out of dmd/mars.c
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
2
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
3 // some things are taken from llvm's llc tool
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
4 // which uses the llvm license
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
5
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
6 #include "gen/llvm.h"
1149
5ebe8224988b Fixed problems introduced by previous commits that prevented Tango from compiling.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
7 #include "llvm/LinkAllVMCore.h"
1052
12ea38902e83 Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents: 1033
diff changeset
8 #include "llvm/Linker.h"
1149
5ebe8224988b Fixed problems introduced by previous commits that prevented Tango from compiling.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
9 #include "llvm/System/Signals.h"
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
10 #include "llvm/Target/SubtargetFeature.h"
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
11 #include "llvm/Target/TargetMachine.h"
1199
80a326087f59 Disable frame pointer elimination when -g or -gc is passed.
Christian Kamm <kamm incasoftware de>
parents: 1197
diff changeset
12 #include "llvm/Target/TargetOptions.h"
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
13 #include "llvm/Target/TargetMachineRegistry.h"
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
14
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
15 #include <stdio.h>
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
16 #include <stdlib.h>
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
17 #include <assert.h>
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
18 #include <limits.h>
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
19
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
20 #if POSIX
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
21 #include <errno.h>
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
22 #elif _WIN32
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
23 #include <windows.h>
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
24 #endif
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
25
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1073
diff changeset
26 #include "rmem.h"
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
27 #include "root.h"
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
28
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
29 #include "mars.h"
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
30 #include "module.h"
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
31 #include "mtype.h"
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
32 #include "id.h"
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
33 #include "cond.h"
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
34
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
35 #include "gen/logger.h"
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
36 #include "gen/linker.h"
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
37 #include "gen/irstate.h"
1052
12ea38902e83 Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents: 1033
diff changeset
38 #include "gen/toobj.h"
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
39
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
40 #include "gen/cl_options.h"
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
41 #include "gen/cl_helpers.h"
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
42 using namespace opts;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
43
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1073
diff changeset
44 #include "gen/configfile.h"
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1073
diff changeset
45
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
46 extern void getenv_setargv(const char *envvar, int *pargc, char** *pargv);
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
47 extern void backend_init();
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
48 extern void backend_term();
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
49
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
50 static cl::opt<bool> noDefaultLib("nodefaultlib",
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
51 cl::desc("Don't add a default library for linking implicitly"),
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
52 cl::ZeroOrMore);
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
53
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
54 static ArrayAdapter impPathsStore("I", global.params.imppath);
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
55 static cl::list<std::string, ArrayAdapter> importPaths("I",
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
56 cl::desc("Where to look for imports"),
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
57 cl::value_desc("path"),
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
58 cl::location(impPathsStore),
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
59 cl::Prefix);
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
60
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
61 static ArrayAdapter defaultLibStore("defaultlib", global.params.defaultlibnames);
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
62 static cl::list<std::string, ArrayAdapter> defaultlibs("defaultlib",
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
63 cl::desc("Set default libraries for non-debug build"),
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
64 cl::value_desc("lib,..."),
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
65 cl::location(defaultLibStore),
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
66 cl::CommaSeparated);
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
67
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
68 static ArrayAdapter debugLibStore("debuglib", global.params.debuglibnames);
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
69 static cl::list<std::string, ArrayAdapter> debuglibs("debuglib",
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
70 cl::desc("Set default libraries for debug build"),
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
71 cl::value_desc("lib,..."),
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
72 cl::location(debugLibStore),
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
73 cl::CommaSeparated);
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
74
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
75 void printVersion() {
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
76 printf("LLVM D Compiler %s\nbased on DMD %s and %s\n%s\n%s\n",
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
77 global.ldc_version, global.version, global.llvm_version, global.copyright, global.written);
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
78 printf("D Language Documentation: http://www.digitalmars.com/d/1.0/index.html\n"
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
79 "LDC Homepage: http://www.dsource.org/projects/ldc\n");
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
80 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
81
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
82 // Helper function to handle -d-debug=* and -d-version=*
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
83 static void processVersions(std::vector<std::string>& list, char* type,
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
84 void (*setLevel)(unsigned), void (*addIdent)(const char*)) {
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
85 typedef std::vector<std::string>::iterator It;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
86
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
87 for(It I = list.begin(), E = list.end(); I != E; ++I) {
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
88 const char* value = I->c_str();
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
89 if (isdigit(value[0])) {
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
90 errno = 0;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
91 char* end;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
92 long level = strtol(value, &end, 10);
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
93 if (*end || errno || level > INT_MAX) {
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
94 error("Invalid %s level: %s", type, I->c_str());
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
95 } else {
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
96 setLevel((unsigned)level);
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
97 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
98 } else {
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
99 char* cstr = mem.strdup(value);
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
100 if (Lexer::isValidIdentifier(cstr)) {
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
101 addIdent(cstr);
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
102 continue;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
103 } else {
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
104 error("Invalid %s identifier or level: '%s'", type, I->c_str());
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
105 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
106 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
107 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
108 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
109
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
110 // Helper function to handle -of, -od, etc.
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
111 static void initFromString(char*& dest, const cl::opt<std::string>& src) {
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
112 dest = 0;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
113 if (src.getNumOccurrences() != 0) {
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
114 if (src.empty())
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
115 error("Expected argument to '-%s'", src.ArgStr);
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
116 dest = mem.strdup(src.c_str());
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
117 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
118 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
119
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
120 int main(int argc, char** argv)
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
121 {
1149
5ebe8224988b Fixed problems introduced by previous commits that prevented Tango from compiling.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
122 // stack trace on signals
5ebe8224988b Fixed problems introduced by previous commits that prevented Tango from compiling.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
123 llvm::sys::PrintStackTraceOnErrorSignal();
5ebe8224988b Fixed problems introduced by previous commits that prevented Tango from compiling.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1147
diff changeset
124
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
125 Array files;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
126 char *p, *ext;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
127 Module *m;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
128 int status = EXIT_SUCCESS;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
129
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
130 // Set some default values
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
131 #if _WIN32
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
132 char buf[MAX_PATH];
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
133 GetModuleFileName(NULL, buf, MAX_PATH);
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
134 global.params.argv0 = buf;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
135 #else
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
136 global.params.argv0 = argv[0];
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
137 #endif
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
138 global.params.useSwitchError = 1;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
139
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
140 global.params.linkswitches = new Array();
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
141 global.params.libfiles = new Array();
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
142 global.params.objfiles = new Array();
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
143 global.params.ddocfiles = new Array();
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
144
999
2b6c2e961f25 Added some missing version identifiers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 997
diff changeset
145
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
146 // Set predefined version identifiers
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
147 VersionCondition::addPredefinedGlobalIdent("LLVM");
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
148 VersionCondition::addPredefinedGlobalIdent("LDC");
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
149 VersionCondition::addPredefinedGlobalIdent("all");
999
2b6c2e961f25 Added some missing version identifiers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 997
diff changeset
150 #if DMDV2
2b6c2e961f25 Added some missing version identifiers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 997
diff changeset
151 VersionCondition::addPredefinedGlobalIdent("D_Version2");
2b6c2e961f25 Added some missing version identifiers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 997
diff changeset
152 #endif
2b6c2e961f25 Added some missing version identifiers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 997
diff changeset
153
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1073
diff changeset
154 // merge DFLAGS environment variable into argc/argv
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
155 getenv_setargv("DFLAGS", &argc, &argv);
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
156 #if 0
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
157 for (int i = 0; i < argc; i++)
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
158 {
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
159 printf("argv[%d] = '%s'\n", i, argv[i]);
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
160 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
161 #endif
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
162
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1073
diff changeset
163 // build complete fixed up list of command line arguments
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1073
diff changeset
164 std::vector<const char*> final_args;
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1073
diff changeset
165 final_args.reserve(argc);
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1073
diff changeset
166
1197
1546b5162152 Make sure -run doesn't consume the config file flags.
Christian Kamm <kamm incasoftware de>
parents: 1187
diff changeset
167 // insert command line args until -run is reached
1546b5162152 Make sure -run doesn't consume the config file flags.
Christian Kamm <kamm incasoftware de>
parents: 1187
diff changeset
168 int run_argnum = 1;
1546b5162152 Make sure -run doesn't consume the config file flags.
Christian Kamm <kamm incasoftware de>
parents: 1187
diff changeset
169 while (run_argnum < argc && strncmp(argv[run_argnum], "-run", 4) != 0)
1546b5162152 Make sure -run doesn't consume the config file flags.
Christian Kamm <kamm incasoftware de>
parents: 1187
diff changeset
170 ++run_argnum;
1546b5162152 Make sure -run doesn't consume the config file flags.
Christian Kamm <kamm incasoftware de>
parents: 1187
diff changeset
171 final_args.insert(final_args.end(), &argv[0], &argv[run_argnum]);
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1073
diff changeset
172
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1073
diff changeset
173 // read the configuration file
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1073
diff changeset
174 ConfigFile cfg_file;
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1073
diff changeset
175
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1073
diff changeset
176 // just ignore errors for now, they are still printed
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1073
diff changeset
177 #if DMDV2
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1073
diff changeset
178 #define CFG_FILENAME "ldc2.conf"
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1073
diff changeset
179 #else
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1073
diff changeset
180 #define CFG_FILENAME "ldc.conf"
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1073
diff changeset
181 #endif
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1073
diff changeset
182 cfg_file.read(global.params.argv0, (void*)main, CFG_FILENAME);
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1073
diff changeset
183 #undef CFG_FILENAME
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1073
diff changeset
184
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1073
diff changeset
185 // insert config file additions to the argument list
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1073
diff changeset
186 final_args.insert(final_args.end(), cfg_file.switches_begin(), cfg_file.switches_end());
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1073
diff changeset
187
1197
1546b5162152 Make sure -run doesn't consume the config file flags.
Christian Kamm <kamm incasoftware de>
parents: 1187
diff changeset
188 // insert -run and everything beyond
1546b5162152 Make sure -run doesn't consume the config file flags.
Christian Kamm <kamm incasoftware de>
parents: 1187
diff changeset
189 final_args.insert(final_args.end(), &argv[run_argnum], &argv[argc]);
1546b5162152 Make sure -run doesn't consume the config file flags.
Christian Kamm <kamm incasoftware de>
parents: 1187
diff changeset
190
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1073
diff changeset
191 #if 0
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1073
diff changeset
192 for (size_t i = 0; i < final_args.size(); ++i)
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1073
diff changeset
193 {
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1073
diff changeset
194 printf("final_args[%zu] = %s\n", i, final_args[i]);
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1073
diff changeset
195 }
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1073
diff changeset
196 #endif
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1073
diff changeset
197
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
198 // Handle fixed-up arguments!
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
199 cl::SetVersionPrinter(&printVersion);
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1073
diff changeset
200 cl::ParseCommandLineOptions(final_args.size(), (char**)&final_args[0], "LLVM-based D Compiler\n", true);
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
201
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
202 // Negated options
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
203 global.params.link = !compileOnly;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
204 global.params.obj = !dontWriteObj;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
205 global.params.useInlineAsm = !noAsm;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
206
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
207 // String options: std::string --> char*
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
208 initFromString(global.params.objname, objectFile);
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
209 initFromString(global.params.objdir, objectDir);
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
210
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
211 initFromString(global.params.docdir, ddocDir);
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
212 initFromString(global.params.docname, ddocFile);
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
213 global.params.doDocComments |=
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
214 global.params.docdir || global.params.docname;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
215
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
216 #ifdef _DH
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
217 initFromString(global.params.hdrdir, hdrDir);
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
218 initFromString(global.params.hdrname, hdrFile);
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
219 global.params.doHdrGeneration |=
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
220 global.params.hdrdir || global.params.hdrname;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
221 #endif
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
222
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
223 processVersions(debugArgs, "debug",
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
224 DebugCondition::setGlobalLevel,
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
225 DebugCondition::addGlobalIdent);
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
226 processVersions(versions, "version",
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
227 VersionCondition::setGlobalLevel,
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
228 VersionCondition::addGlobalIdent);
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
229
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
230 global.params.output_o =
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
231 opts::output_o == cl::BOU_UNSET
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
232 ? OUTPUTFLAGdefault
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
233 : opts::output_o == cl::BOU_TRUE
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
234 ? OUTPUTFLAGset
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
235 : OUTPUTFLAGno;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
236 global.params.output_bc = opts::output_bc ? OUTPUTFLAGset : OUTPUTFLAGno;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
237 global.params.output_ll = opts::output_ll ? OUTPUTFLAGset : OUTPUTFLAGno;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
238 global.params.output_s = opts::output_s ? OUTPUTFLAGset : OUTPUTFLAGno;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
239
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
240 if (global.params.run || !runargs.empty()) {
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
241 // FIXME: how to properly detect the presence of a PositionalEatsArgs
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
242 // option without parameters? We want to emit an error in that case...
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
243 // You'd think getNumOccurrences would do it, but it just returns the
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
244 // number of parameters)
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
245 // NOTE: Hacked around it by detecting -run in getenv_setargv(), where
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
246 // we're looking for it anyway, and pre-setting the flag...
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
247 global.params.run = true;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
248 if (!runargs.empty()) {
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
249 files.push(mem.strdup(runargs[0].c_str()));
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
250 } else {
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
251 global.params.run = false;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
252 error("Expected at least one argument to '-run'\n");
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
253 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
254 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
255
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
256
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
257 files.reserve(fileList.size());
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
258 typedef std::vector<std::string>::iterator It;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
259 for(It I = fileList.begin(), E = fileList.end(); I != E; ++I)
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
260 if (!I->empty())
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
261 files.push(mem.strdup(I->c_str()));
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
262
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
263 if (global.errors)
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
264 {
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
265 fatal();
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
266 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
267 if (files.dim == 0)
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
268 {
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
269 cl::PrintHelpMessage();
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
270 return EXIT_FAILURE;
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
271 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
272
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
273 Array* libs;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
274 if (global.params.symdebug)
1199
80a326087f59 Disable frame pointer elimination when -g or -gc is passed.
Christian Kamm <kamm incasoftware de>
parents: 1197
diff changeset
275 {
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
276 libs = global.params.debuglibnames;
1199
80a326087f59 Disable frame pointer elimination when -g or -gc is passed.
Christian Kamm <kamm incasoftware de>
parents: 1197
diff changeset
277 llvm::NoFramePointerElim = true;
80a326087f59 Disable frame pointer elimination when -g or -gc is passed.
Christian Kamm <kamm incasoftware de>
parents: 1197
diff changeset
278 }
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
279 else
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
280 libs = global.params.defaultlibnames;
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
281
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
282 if (libs)
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
283 {
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
284 for (int i = 0; i < libs->dim; i++)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
285 {
1187
a95fc9fcad5c Make sure -defaultlib and -debuglib don't get cut off if longer than 63 chars,
Frits van Bommel <fvbommel wxs.nl>
parents: 1170
diff changeset
286 char* lib = (char *)libs->data[i];
a95fc9fcad5c Make sure -defaultlib and -debuglib don't get cut off if longer than 63 chars,
Frits van Bommel <fvbommel wxs.nl>
parents: 1170
diff changeset
287 char *arg = (char *)mem.malloc(strlen(lib) + 3);
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
288 strcpy(arg, "-l");
1187
a95fc9fcad5c Make sure -defaultlib and -debuglib don't get cut off if longer than 63 chars,
Frits van Bommel <fvbommel wxs.nl>
parents: 1170
diff changeset
289 strcpy(arg+2, lib);
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
290 global.params.linkswitches->push(arg);
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
291 }
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
292 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
293 else if (!noDefaultLib)
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
294 {
1187
a95fc9fcad5c Make sure -defaultlib and -debuglib don't get cut off if longer than 63 chars,
Frits van Bommel <fvbommel wxs.nl>
parents: 1170
diff changeset
295 global.params.linkswitches->push(mem.strdup("-lldc-runtime"));
a95fc9fcad5c Make sure -defaultlib and -debuglib don't get cut off if longer than 63 chars,
Frits van Bommel <fvbommel wxs.nl>
parents: 1170
diff changeset
296 global.params.linkswitches->push(mem.strdup("-ltango-cc-tango"));
a95fc9fcad5c Make sure -defaultlib and -debuglib don't get cut off if longer than 63 chars,
Frits van Bommel <fvbommel wxs.nl>
parents: 1170
diff changeset
297 global.params.linkswitches->push(mem.strdup("-ltango-gc-basic"));
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
298 // pass the runtime again to resolve issues
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
299 // with linking order
1187
a95fc9fcad5c Make sure -defaultlib and -debuglib don't get cut off if longer than 63 chars,
Frits van Bommel <fvbommel wxs.nl>
parents: 1170
diff changeset
300 global.params.linkswitches->push(mem.strdup("-lldc-runtime"));
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
301 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
302
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
303 if (global.params.run)
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
304 quiet = 1;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
305
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
306 if (global.params.useUnitTests)
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
307 global.params.useAssert = 1;
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
308
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
309 // LDC output determination
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
310
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
311 // if we don't link, autodetect target from extension
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
312 if(!global.params.link && global.params.objname) {
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
313 ext = FileName::ext(global.params.objname);
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
314 bool autofound = false;
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
315 if (!ext) {
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
316 // keep things as they are
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
317 } else if (strcmp(ext, global.ll_ext) == 0) {
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
318 global.params.output_ll = OUTPUTFLAGset;
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
319 autofound = true;
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
320 } else if (strcmp(ext, global.bc_ext) == 0) {
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
321 global.params.output_bc = OUTPUTFLAGset;
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
322 autofound = true;
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
323 } else if (strcmp(ext, global.s_ext) == 0) {
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
324 global.params.output_s = OUTPUTFLAGset;
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
325 autofound = true;
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
326 } else if (strcmp(ext, global.obj_ext) == 0) {
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
327 global.params.output_o = OUTPUTFLAGset;
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
328 autofound = true;
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
329 } else {
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
330 // append dot, so forceExt won't change existing name even if it contains dots
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
331 size_t len = strlen(global.params.objname);
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
332 size_t extlen = strlen(".");
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
333 char* s = (char *)mem.malloc(len + 1 + extlen + 1);
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
334 memcpy(s, global.params.objname, len);
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
335 s[len] = '.';
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
336 s[len+1+extlen] = 0;
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
337 global.params.objname = s;
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
338
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
339 }
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
340 if(autofound && global.params.output_o == OUTPUTFLAGdefault)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
341 global.params.output_o = OUTPUTFLAGno;
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
342 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
343
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
344 // only link if possible
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
345 if (!global.params.obj || !global.params.output_o)
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
346 global.params.link = 0;
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
347
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
348 if (global.params.link)
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
349 {
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
350 global.params.exefile = global.params.objname;
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
351 if (files.dim > 1)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
352 global.params.objname = NULL;
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
353 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
354 else if (global.params.run)
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
355 {
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
356 error("flags conflict with -run");
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
357 fatal();
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
358 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
359 else
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
360 {
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
361 if (global.params.objname && files.dim > 1)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
362 {
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
363 error("multiple source files, but only one .obj name");
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
364 fatal();
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
365 }
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
366 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
367
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
368 // create a proper target
1147
dbe4af57b240 Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1103
diff changeset
369 Ir ir;
1021
d1ec9ff0e9ba Implemented basic -m32 and -m64 options.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 1007
diff changeset
370
d1ec9ff0e9ba Implemented basic -m32 and -m64 options.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 1007
diff changeset
371 // check -m32/64 sanity
d1ec9ff0e9ba Implemented basic -m32 and -m64 options.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 1007
diff changeset
372 if (m32bits && m64bits)
d1ec9ff0e9ba Implemented basic -m32 and -m64 options.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 1007
diff changeset
373 error("cannot use both -m32 and -m64 options");
d1ec9ff0e9ba Implemented basic -m32 and -m64 options.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 1007
diff changeset
374 else if ((m32bits || m64bits) && (mArch != 0 || !mTargetTriple.empty()))
d1ec9ff0e9ba Implemented basic -m32 and -m64 options.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 1007
diff changeset
375 error("-m32 and -m64 switches cannot be used together with -march and -mtriple switches");
d1ec9ff0e9ba Implemented basic -m32 and -m64 options.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 1007
diff changeset
376 if (global.errors)
d1ec9ff0e9ba Implemented basic -m32 and -m64 options.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 1007
diff changeset
377 fatal();
d1ec9ff0e9ba Implemented basic -m32 and -m64 options.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 1007
diff changeset
378
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
379 llvm::Module mod("dummy");
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
380
1021
d1ec9ff0e9ba Implemented basic -m32 and -m64 options.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 1007
diff changeset
381 // override triple if needed
d1ec9ff0e9ba Implemented basic -m32 and -m64 options.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 1007
diff changeset
382 const char* defaultTriple = DEFAULT_TARGET_TRIPLE;
d1ec9ff0e9ba Implemented basic -m32 and -m64 options.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 1007
diff changeset
383 if ((sizeof(void*) == 4 && m64bits) || (sizeof(void*) == 8 && m32bits))
d1ec9ff0e9ba Implemented basic -m32 and -m64 options.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 1007
diff changeset
384 {
d1ec9ff0e9ba Implemented basic -m32 and -m64 options.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 1007
diff changeset
385 defaultTriple = DEFAULT_ALT_TARGET_TRIPLE;
d1ec9ff0e9ba Implemented basic -m32 and -m64 options.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 1007
diff changeset
386 }
d1ec9ff0e9ba Implemented basic -m32 and -m64 options.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 1007
diff changeset
387
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
388 // did the user override the target triple?
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
389 if (mTargetTriple.empty())
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
390 {
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
391 if (mArch != 0)
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
392 {
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
393 error("you must specify a target triple as well with -mtriple when using the -march option");
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
394 fatal();
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
395 }
1021
d1ec9ff0e9ba Implemented basic -m32 and -m64 options.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 1007
diff changeset
396 global.params.targetTriple = defaultTriple;
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
397 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
398 else
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
399 {
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
400 global.params.targetTriple = mTargetTriple.c_str();
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
401 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
402
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
403 mod.setTargetTriple(global.params.targetTriple);
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
404
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
405 // Allocate target machine. First, check whether the user has
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
406 // explicitly specified an architecture to compile for.
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
407 if (mArch == 0)
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
408 {
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
409 std::string Err;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
410 mArch = llvm::TargetMachineRegistry::getClosestStaticTargetForModule(mod, Err);
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
411 if (mArch == 0)
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
412 {
997
4f12ec3216cf Missing %s error param in main.cpp
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 989
diff changeset
413 error("failed to auto-select target: %s, please use the -march option", Err.c_str());
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
414 fatal();
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
415 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
416 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
417
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
418 // Package up features to be passed to target/subtarget
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
419 std::string FeaturesStr;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
420 if (mCPU.size() || mAttrs.size())
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
421 {
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
422 llvm::SubtargetFeatures Features;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
423 Features.setCPU(mCPU);
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
424 for (unsigned i = 0; i != mAttrs.size(); ++i)
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
425 Features.AddFeature(mAttrs[i]);
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
426 FeaturesStr = Features.getString();
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
427 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
428
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
429 std::auto_ptr<llvm::TargetMachine> target(mArch->CtorFn(mod, FeaturesStr));
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
430 assert(target.get() && "Could not allocate target machine!");
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
431 gTargetMachine = target.get();
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
432 gTargetData = gTargetMachine->getTargetData();
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
433
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
434 // get final data layout
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
435 std::string datalayout = gTargetData->getStringRepresentation();
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
436 global.params.dataLayout = datalayout.c_str();
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
437
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
438 global.params.llvmArch = mArch->Name;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
439
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
440 if (strcmp(global.params.llvmArch,"x86")==0) {
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
441 VersionCondition::addPredefinedGlobalIdent("X86");
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
442 global.params.isLE = true;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
443 global.params.is64bit = false;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
444 global.params.cpu = ARCHx86;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
445 if (global.params.useInlineAsm) {
1033
abfe71f5b911 Switch LLVM_InlineAsm -> D_InlineAsm. It's for real this time, hopefully.
Christian Kamm <kamm incasoftware de>
parents: 1021
diff changeset
446 VersionCondition::addPredefinedGlobalIdent("D_InlineAsm_X86");
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
447 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
448 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
449 else if (strcmp(global.params.llvmArch,"x86-64")==0) {
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
450 VersionCondition::addPredefinedGlobalIdent("X86_64");
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
451 global.params.isLE = true;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
452 global.params.is64bit = true;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
453 global.params.cpu = ARCHx86_64;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
454 if (global.params.useInlineAsm) {
1033
abfe71f5b911 Switch LLVM_InlineAsm -> D_InlineAsm. It's for real this time, hopefully.
Christian Kamm <kamm incasoftware de>
parents: 1021
diff changeset
455 VersionCondition::addPredefinedGlobalIdent("D_InlineAsm_X86_64");
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
456 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
457 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
458 else if (strcmp(global.params.llvmArch,"ppc32")==0) {
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
459 VersionCondition::addPredefinedGlobalIdent("PPC");
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
460 global.params.isLE = false;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
461 global.params.is64bit = false;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
462 global.params.cpu = ARCHppc;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
463 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
464 else if (strcmp(global.params.llvmArch,"ppc64")==0) {
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
465 VersionCondition::addPredefinedGlobalIdent("PPC64");
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
466 global.params.isLE = false;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
467 global.params.is64bit = true;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
468 global.params.cpu = ARCHppc_64;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
469 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
470 else if (strcmp(global.params.llvmArch,"arm")==0) {
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
471 VersionCondition::addPredefinedGlobalIdent("ARM");
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
472 global.params.isLE = true;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
473 global.params.is64bit = false;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
474 global.params.cpu = ARCHarm;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
475 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
476 else if (strcmp(global.params.llvmArch,"thumb")==0) {
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
477 VersionCondition::addPredefinedGlobalIdent("Thumb");
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
478 global.params.isLE = true;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
479 global.params.is64bit = false;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
480 global.params.cpu = ARCHthumb;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
481 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
482 else {
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
483 error("invalid cpu architecture specified: %s", global.params.llvmArch);
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
484 fatal();
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
485 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
486
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
487 // endianness
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
488 if (global.params.isLE) {
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
489 VersionCondition::addPredefinedGlobalIdent("LittleEndian");
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
490 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
491 else {
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
492 VersionCondition::addPredefinedGlobalIdent("BigEndian");
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
493 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
494
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
495 // a generic 64bit version
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
496 if (global.params.is64bit) {
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
497 VersionCondition::addPredefinedGlobalIdent("LLVM64");
999
2b6c2e961f25 Added some missing version identifiers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 997
diff changeset
498 // FIXME: is this always correct?
2b6c2e961f25 Added some missing version identifiers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 997
diff changeset
499 VersionCondition::addPredefinedGlobalIdent("D_LP64");
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
500 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
501
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
502 // parse the OS out of the target triple
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
503 // see http://gcc.gnu.org/install/specific.html for details
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
504 // also llvm's different SubTargets have useful information
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
505 std::string triple = global.params.targetTriple;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
506 size_t npos = std::string::npos;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
507
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
508 // windows
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
509 // FIXME: win64
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
510 if (triple.find("windows") != npos || triple.find("win32") != npos || triple.find("mingw") != npos)
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
511 {
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
512 global.params.os = OSWindows;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
513 VersionCondition::addPredefinedGlobalIdent("Windows");
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
514 VersionCondition::addPredefinedGlobalIdent("Win32");
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
515 VersionCondition::addPredefinedGlobalIdent("mingw32");
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
516 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
517 // FIXME: cygwin
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
518 else if (triple.find("cygwin") != npos)
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
519 {
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
520 error("CygWin is not yet supported");
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
521 fatal();
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
522 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
523 // linux
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
524 else if (triple.find("linux") != npos)
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
525 {
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
526 global.params.os = OSLinux;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
527 VersionCondition::addPredefinedGlobalIdent("linux");
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
528 VersionCondition::addPredefinedGlobalIdent("Posix");
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
529 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
530 // darwin
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
531 else if (triple.find("-darwin") != npos)
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
532 {
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
533 global.params.os = OSMacOSX;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
534 VersionCondition::addPredefinedGlobalIdent("OSX");
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
535 VersionCondition::addPredefinedGlobalIdent("darwin");
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
536 VersionCondition::addPredefinedGlobalIdent("Posix");
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
537 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
538 // freebsd
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
539 else if (triple.find("-freebsd") != npos)
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
540 {
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
541 global.params.os = OSFreeBSD;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
542 VersionCondition::addPredefinedGlobalIdent("freebsd");
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
543 VersionCondition::addPredefinedGlobalIdent("Posix");
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
544 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
545 // solaris
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
546 else if (triple.find("-solaris") != npos)
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
547 {
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
548 global.params.os = OSSolaris;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
549 VersionCondition::addPredefinedGlobalIdent("solaris");
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
550 VersionCondition::addPredefinedGlobalIdent("Posix");
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
551 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
552 // unsupported
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
553 else
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
554 {
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
555 error("target triple '%s' is not supported", global.params.targetTriple);
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
556 fatal();
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
557 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
558
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
559 // added in 1.039
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
560 if (global.params.doDocComments)
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
561 VersionCondition::addPredefinedGlobalIdent("D_Ddoc");
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
562
999
2b6c2e961f25 Added some missing version identifiers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 997
diff changeset
563 #if DMDV2
2b6c2e961f25 Added some missing version identifiers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 997
diff changeset
564 // unittests?
2b6c2e961f25 Added some missing version identifiers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 997
diff changeset
565 if (global.params.useUnitTests)
2b6c2e961f25 Added some missing version identifiers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 997
diff changeset
566 VersionCondition::addPredefinedGlobalIdent("unittest");
2b6c2e961f25 Added some missing version identifiers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 997
diff changeset
567 #endif
2b6c2e961f25 Added some missing version identifiers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 997
diff changeset
568
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
569 // Initialization
1147
dbe4af57b240 Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1103
diff changeset
570 Type::init(&ir);
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
571 Id::initialize();
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
572 Module::init();
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
573 initPrecedence();
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
574
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
575 backend_init();
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
576
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
577 //printf("%d source files\n",files.dim);
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
578
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
579 // Build import search path
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
580 if (global.params.imppath)
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
581 {
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
582 for (int i = 0; i < global.params.imppath->dim; i++)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
583 {
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
584 char *path = (char *)global.params.imppath->data[i];
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
585 Array *a = FileName::splitPath(path);
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
586
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
587 if (a)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
588 {
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
589 if (!global.path)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
590 global.path = new Array();
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
591 global.path->append(a);
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
592 }
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
593 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
594 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
595
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
596 // Build string import search path
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
597 if (global.params.fileImppath)
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
598 {
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
599 for (int i = 0; i < global.params.fileImppath->dim; i++)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
600 {
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
601 char *path = (char *)global.params.fileImppath->data[i];
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
602 Array *a = FileName::splitPath(path);
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
603
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
604 if (a)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
605 {
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
606 if (!global.filePath)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
607 global.filePath = new Array();
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
608 global.filePath->append(a);
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
609 }
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
610 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
611 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
612
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
613 // Create Modules
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
614 Array modules;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
615 modules.reserve(files.dim);
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
616 for (int i = 0; i < files.dim; i++)
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
617 { Identifier *id;
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
618 char *ext;
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
619 char *name;
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
620
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
621 p = (char *) files.data[i];
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
622
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
623 p = FileName::name(p); // strip path
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
624 ext = FileName::ext(p);
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
625 if (ext)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
626 {
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
627 #if POSIX
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
628 if (strcmp(ext, global.obj_ext) == 0 ||
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
629 strcmp(ext, global.bc_ext) == 0)
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
630 #else
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
631 if (stricmp(ext, global.obj_ext) == 0 ||
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
632 stricmp(ext, global.bc_ext) == 0)
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
633 #endif
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
634 {
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
635 global.params.objfiles->push(files.data[i]);
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
636 continue;
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
637 }
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
638
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
639 #if POSIX
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
640 if (strcmp(ext, "a") == 0)
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
641 #elif __MINGW32__
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
642 if (stricmp(ext, "a") == 0)
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
643 #else
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
644 if (stricmp(ext, "lib") == 0)
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
645 #endif
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
646 {
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
647 global.params.libfiles->push(files.data[i]);
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
648 continue;
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
649 }
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
650
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
651 if (strcmp(ext, global.ddoc_ext) == 0)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
652 {
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
653 global.params.ddocfiles->push(files.data[i]);
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
654 continue;
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
655 }
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
656
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
657 #if !POSIX
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
658 if (stricmp(ext, "res") == 0)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
659 {
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
660 global.params.resfile = (char *)files.data[i];
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
661 continue;
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
662 }
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
663
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
664 if (stricmp(ext, "def") == 0)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
665 {
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
666 global.params.deffile = (char *)files.data[i];
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
667 continue;
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
668 }
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
669
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
670 if (stricmp(ext, "exe") == 0)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
671 {
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
672 global.params.exefile = (char *)files.data[i];
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
673 continue;
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
674 }
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
675 #endif
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
676
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
677 if (stricmp(ext, global.mars_ext) == 0 ||
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
678 stricmp(ext, global.hdr_ext) == 0 ||
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
679 stricmp(ext, "htm") == 0 ||
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
680 stricmp(ext, "html") == 0 ||
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
681 stricmp(ext, "xhtml") == 0)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
682 {
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
683 ext--; // skip onto '.'
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
684 assert(*ext == '.');
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
685 name = (char *)mem.malloc((ext - p) + 1);
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
686 memcpy(name, p, ext - p);
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
687 name[ext - p] = 0; // strip extension
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
688
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
689 if (name[0] == 0 ||
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
690 strcmp(name, "..") == 0 ||
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
691 strcmp(name, ".") == 0)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
692 {
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
693 Linvalid:
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
694 error("invalid file name '%s'", (char *)files.data[i]);
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
695 fatal();
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
696 }
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
697 }
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
698 else
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
699 { error("unrecognized file extension %s\n", ext);
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
700 fatal();
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
701 }
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
702 }
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
703 else
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
704 { name = p;
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
705 if (!*name)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
706 goto Linvalid;
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
707 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
708
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
709 id = new Identifier(name, 0);
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
710 m = new Module((char *) files.data[i], id, global.params.doDocComments, global.params.doHdrGeneration);
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
711 modules.push(m);
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
712 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
713
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
714 // Read files, parse them
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
715 for (int i = 0; i < modules.dim; i++)
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
716 {
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
717 m = (Module *)modules.data[i];
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
718 if (global.params.verbose)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
719 printf("parse %s\n", m->toChars());
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
720 if (!Module::rootModule)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
721 Module::rootModule = m;
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
722 m->importedFrom = m;
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
723 m->read(0);
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
724 m->parse();
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
725 m->buildTargetFiles();
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
726 m->deleteObjFile();
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
727 if (m->isDocFile)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
728 {
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
729 m->gendocfile();
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
730
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
731 // Remove m from list of modules
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
732 modules.remove(i);
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
733 i--;
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
734 }
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
735 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
736 if (global.errors)
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
737 fatal();
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
738 #ifdef _DH
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
739 if (global.params.doHdrGeneration)
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
740 {
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
741 /* Generate 'header' import files.
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
742 * Since 'header' import files must be independent of command
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
743 * line switches and what else is imported, they are generated
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
744 * before any semantic analysis.
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
745 */
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
746 for (int i = 0; i < modules.dim; i++)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
747 {
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
748 m = (Module *)modules.data[i];
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
749 if (global.params.verbose)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
750 printf("import %s\n", m->toChars());
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
751 m->genhdrfile();
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
752 }
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
753 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
754 if (global.errors)
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
755 fatal();
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
756 #endif
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
757
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
758 // Do semantic analysis
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
759 for (int i = 0; i < modules.dim; i++)
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
760 {
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
761 m = (Module *)modules.data[i];
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
762 if (global.params.verbose)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
763 printf("semantic %s\n", m->toChars());
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
764 m->semantic();
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
765 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
766 if (global.errors)
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
767 fatal();
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
768
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
769 // Do pass 2 semantic analysis
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
770 for (int i = 0; i < modules.dim; i++)
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
771 {
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
772 m = (Module *)modules.data[i];
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
773 if (global.params.verbose)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
774 printf("semantic2 %s\n", m->toChars());
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
775 m->semantic2();
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
776 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
777 if (global.errors)
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
778 fatal();
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
779
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
780 // Do pass 3 semantic analysis
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
781 for (int i = 0; i < modules.dim; i++)
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
782 {
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
783 m = (Module *)modules.data[i];
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
784 if (global.params.verbose)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
785 printf("semantic3 %s\n", m->toChars());
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
786 m->semantic3();
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
787 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
788 if (global.errors)
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
789 fatal();
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
790
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
791 #if !IN_LLVM
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
792 // Scan for functions to inline
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
793 if (global.params.useInline)
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
794 {
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
795 /* The problem with useArrayBounds and useAssert is that the
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
796 * module being linked to may not have generated them, so if
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
797 * we inline functions from those modules, the symbols for them will
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
798 * not be found at link time.
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
799 */
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
800 if (!global.params.useArrayBounds && !global.params.useAssert)
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
801 {
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
802 #endif
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
803 // Do pass 3 semantic analysis on all imported modules,
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
804 // since otherwise functions in them cannot be inlined
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
805 for (int i = 0; i < Module::amodules.dim; i++)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
806 {
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
807 m = (Module *)Module::amodules.data[i];
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
808 if (global.params.verbose)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
809 printf("semantic3 %s\n", m->toChars());
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
810 m->semantic3();
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
811 }
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
812 if (global.errors)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
813 fatal();
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
814 #if !IN_LLVM
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
815 }
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
816
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
817 for (int i = 0; i < modules.dim; i++)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
818 {
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
819 m = (Module *)modules.data[i];
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
820 if (global.params.verbose)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
821 printf("inline scan %s\n", m->toChars());
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
822 m->inlineScan();
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
823 }
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
824 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
825 #endif
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
826 if (global.errors)
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
827 fatal();
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
828
1052
12ea38902e83 Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents: 1033
diff changeset
829 // collects llvm modules to be linked if singleobj is passed
12ea38902e83 Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents: 1033
diff changeset
830 std::vector<llvm::Module*> llvmModules;
12ea38902e83 Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents: 1033
diff changeset
831
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
832 // Generate output files
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
833 for (int i = 0; i < modules.dim; i++)
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
834 {
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
835 m = (Module *)modules.data[i];
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
836 if (global.params.verbose)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
837 printf("code %s\n", m->toChars());
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
838 if (global.params.obj)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
839 {
1147
dbe4af57b240 Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1103
diff changeset
840 llvm::Module* lm = m->genLLVMModule(&ir);
1052
12ea38902e83 Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents: 1033
diff changeset
841 if (!singleObj)
12ea38902e83 Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents: 1033
diff changeset
842 {
12ea38902e83 Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents: 1033
diff changeset
843 m->deleteObjFile();
12ea38902e83 Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents: 1033
diff changeset
844 writeModule(lm, m->objfile->name->str);
12ea38902e83 Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents: 1033
diff changeset
845 global.params.objfiles->push(m->objfile->name->str);
12ea38902e83 Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents: 1033
diff changeset
846 delete lm;
12ea38902e83 Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents: 1033
diff changeset
847 }
12ea38902e83 Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents: 1033
diff changeset
848 else
12ea38902e83 Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents: 1033
diff changeset
849 llvmModules.push_back(lm);
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
850 }
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
851 if (global.errors)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
852 m->deleteObjFile();
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
853 else
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
854 {
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
855 if (global.params.doDocComments)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
856 m->gendocfile();
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
857 }
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
858 }
1052
12ea38902e83 Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents: 1033
diff changeset
859
12ea38902e83 Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents: 1033
diff changeset
860 // internal linking for singleobj
12ea38902e83 Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents: 1033
diff changeset
861 if (singleObj && llvmModules.size() > 0)
12ea38902e83 Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents: 1033
diff changeset
862 {
12ea38902e83 Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents: 1033
diff changeset
863 Module* m = (Module*)modules.data[0];
12ea38902e83 Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents: 1033
diff changeset
864 char* name = m->toChars();
12ea38902e83 Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents: 1033
diff changeset
865 char* filename = m->objfile->name->str;
12ea38902e83 Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents: 1033
diff changeset
866
12ea38902e83 Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents: 1033
diff changeset
867 llvm::Linker linker(name, name);
12ea38902e83 Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents: 1033
diff changeset
868 std::string errormsg;
12ea38902e83 Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents: 1033
diff changeset
869 for (int i = 0; i < llvmModules.size(); i++)
12ea38902e83 Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents: 1033
diff changeset
870 {
12ea38902e83 Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents: 1033
diff changeset
871 if(linker.LinkInModule(llvmModules[i], &errormsg))
12ea38902e83 Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents: 1033
diff changeset
872 error(errormsg.c_str());
12ea38902e83 Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents: 1033
diff changeset
873 delete llvmModules[i];
12ea38902e83 Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents: 1033
diff changeset
874 }
12ea38902e83 Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents: 1033
diff changeset
875
1073
aa31e5592994 Work around llvm bug #3749 better, or not at all if using a fixed llvm revision.
Frits van Bommel <fvbommel wxs.nl>
parents: 1067
diff changeset
876 #if LLVM_REV < 66404
aa31e5592994 Work around llvm bug #3749 better, or not at all if using a fixed llvm revision.
Frits van Bommel <fvbommel wxs.nl>
parents: 1067
diff changeset
877 // Workaround for llvm bug #3749
aa31e5592994 Work around llvm bug #3749 better, or not at all if using a fixed llvm revision.
Frits van Bommel <fvbommel wxs.nl>
parents: 1067
diff changeset
878 // Not needed since LLVM r66404 (it no longer checks for this)
1052
12ea38902e83 Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents: 1033
diff changeset
879 llvm::GlobalVariable* ctors = linker.getModule()->getGlobalVariable("llvm.global_ctors");
1073
aa31e5592994 Work around llvm bug #3749 better, or not at all if using a fixed llvm revision.
Frits van Bommel <fvbommel wxs.nl>
parents: 1067
diff changeset
880 if (ctors) {
aa31e5592994 Work around llvm bug #3749 better, or not at all if using a fixed llvm revision.
Frits van Bommel <fvbommel wxs.nl>
parents: 1067
diff changeset
881 ctors->removeDeadConstantUsers();
aa31e5592994 Work around llvm bug #3749 better, or not at all if using a fixed llvm revision.
Frits van Bommel <fvbommel wxs.nl>
parents: 1067
diff changeset
882 assert(ctors->use_empty());
aa31e5592994 Work around llvm bug #3749 better, or not at all if using a fixed llvm revision.
Frits van Bommel <fvbommel wxs.nl>
parents: 1067
diff changeset
883 }
aa31e5592994 Work around llvm bug #3749 better, or not at all if using a fixed llvm revision.
Frits van Bommel <fvbommel wxs.nl>
parents: 1067
diff changeset
884 #endif
1052
12ea38902e83 Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents: 1033
diff changeset
885
12ea38902e83 Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents: 1033
diff changeset
886 m->deleteObjFile();
12ea38902e83 Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents: 1033
diff changeset
887 writeModule(linker.getModule(), filename);
12ea38902e83 Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents: 1033
diff changeset
888 global.params.objfiles->push(filename);
12ea38902e83 Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents: 1033
diff changeset
889 }
12ea38902e83 Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents: 1033
diff changeset
890
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
891 backend_term();
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
892 if (global.errors)
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
893 fatal();
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
894
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
895 if (!global.params.objfiles->dim)
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
896 {
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
897 if (global.params.link)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
898 error("no object files to link");
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
899 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
900 else
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
901 {
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
902 if (global.params.link)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
903 //status = runLINK();
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
904 linkObjToExecutable(global.params.argv0);
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
905
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
906 if (global.params.run)
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
907 {
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
908 if (!status)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
909 {
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
910 status = runExectuable();
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
911
1007
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
912 /* Delete .obj files and .exe file
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
913 */
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
914 for (int i = 0; i < modules.dim; i++)
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
915 {
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
916 m = (Module *)modules.data[i];
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
917 m->deleteObjFile();
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
918 }
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
919 deleteExecutable();
55051098d9fc Readded indentation that got lost in the dmd/mars.c -> gen/main.cpp move.
Christian Kamm <kamm incasoftware de>
parents: 999
diff changeset
920 }
989
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
921 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
922 }
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
923
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
924 return status;
420ef073448d Forgot new files that were supposed to be in last commit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
diff changeset
925 }