Mercurial > projects > ldc
annotate gen/toobj.cpp @ 674:db6a7e574cbd
Move to separate function and cleanup.
author | Christian Kamm <kamm incasoftware de> |
---|---|
date | Sat, 11 Oct 2008 11:41:56 +0200 |
parents | 37a7688a7494 |
children | bfe5229f9d8e |
rev | line source |
---|---|
1 | 1 |
2 // Copyright (c) 1999-2004 by Digital Mars | |
3 // All Rights Reserved | |
4 // written by Walter Bright | |
5 // www.digitalmars.com | |
6 // License for redistribution is by either the Artistic License | |
7 // in artistic.txt, or the GNU General Public License in gnu.txt. | |
8 // See the included readme.txt for details. | |
9 | |
10 #include <cstddef> | |
11 #include <iostream> | |
12 #include <fstream> | |
13 | |
40 | 14 #include "gen/llvm.h" |
1 | 15 #include "llvm/Analysis/Verifier.h" |
16 #include "llvm/Bitcode/ReaderWriter.h" | |
673
37a7688a7494
Add basics for direct assembly output.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
17 #include "llvm/Target/SubtargetFeature.h" |
1 | 18 #include "llvm/Target/TargetMachine.h" |
19 #include "llvm/Target/TargetMachineRegistry.h" | |
673
37a7688a7494
Add basics for direct assembly output.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
20 #include "llvm/Module.h" |
37a7688a7494
Add basics for direct assembly output.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
21 #include "llvm/ModuleProvider.h" |
37a7688a7494
Add basics for direct assembly output.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
22 #include "llvm/PassManager.h" |
217
0806379a5eca
[svn r233] Added: -oq command line option for writing fully qualified object names.
lindquist
parents:
213
diff
changeset
|
23 #include "llvm/System/Path.h" |
673
37a7688a7494
Add basics for direct assembly output.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
24 #include "llvm/Support/raw_ostream.h" |
1 | 25 |
26 #include "mars.h" | |
27 #include "module.h" | |
28 #include "mtype.h" | |
29 #include "declaration.h" | |
30 #include "statement.h" | |
31 #include "enum.h" | |
32 #include "aggregate.h" | |
33 #include "init.h" | |
34 #include "attrib.h" | |
35 #include "id.h" | |
36 #include "import.h" | |
37 #include "template.h" | |
18 | 38 #include "scope.h" |
1 | 39 |
4
e116aa1488e6
[svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
1
diff
changeset
|
40 #include "gen/irstate.h" |
e116aa1488e6
[svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
1
diff
changeset
|
41 #include "gen/logger.h" |
e116aa1488e6
[svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents:
1
diff
changeset
|
42 #include "gen/tollvm.h" |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
234
diff
changeset
|
43 #include "gen/llvmhelpers.h" |
64
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
63
diff
changeset
|
44 #include "gen/arrays.h" |
88
058d3925950e
[svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
86
diff
changeset
|
45 #include "gen/structs.h" |
100 | 46 #include "gen/classes.h" |
47 #include "gen/functions.h" | |
82
d8dd47ef3973
[svn r86] Changed the way arguments are given storage. It is now detected if they will need it during semantic passes.
lindquist
parents:
81
diff
changeset
|
48 #include "gen/todebug.h" |
86
fd32135dca3e
[svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents:
85
diff
changeset
|
49 #include "gen/runtime.h" |
1 | 50 |
136
0e28624814e8
[svn r140] did a lot of the work towards being able to pass multiple modules on the command line. not complete yet though
lindquist
parents:
133
diff
changeset
|
51 #include "ir/irvar.h" |
139
0ab29b838084
[svn r143] Fixed: a few bugs in debug information, still only line info, but should be correct files now :)
lindquist
parents:
137
diff
changeset
|
52 #include "ir/irmodule.h" |
136
0e28624814e8
[svn r140] did a lot of the work towards being able to pass multiple modules on the command line. not complete yet though
lindquist
parents:
133
diff
changeset
|
53 |
1 | 54 ////////////////////////////////////////////////////////////////////////////////////////// |
55 | |
125 | 56 // in gen/optimize.cpp |
663
6aaa3d3c1183
First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents:
650
diff
changeset
|
57 void ldc_optimize_module(llvm::Module* m, char lvl, bool doinline); |
125 | 58 |
674
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
59 // fwd decl |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
60 void write_asm_to_file(llvm::Module& m, llvm::raw_fd_ostream& Out); |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
61 |
125 | 62 ////////////////////////////////////////////////////////////////////////////////////////// |
63 | |
336 | 64 void Module::genobjfile(int multiobj) |
1 | 65 { |
486
a34078905d01
Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
393
diff
changeset
|
66 bool logenabled = Logger::enabled(); |
a34078905d01
Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
393
diff
changeset
|
67 if (llvmForceLogging && !logenabled) |
a34078905d01
Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
393
diff
changeset
|
68 { |
a34078905d01
Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
393
diff
changeset
|
69 Logger::enable(); |
a34078905d01
Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
393
diff
changeset
|
70 } |
a34078905d01
Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
393
diff
changeset
|
71 |
622
26fce59fe80a
Wrapped all the most potentially expensive logging calls in a conditional to only do work when actually requested.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
605
diff
changeset
|
72 Logger::println("Generating module: %s\n", (md ? md->toChars() : toChars())); |
1 | 73 LOG_SCOPE; |
74 | |
626
e83ba4ae4878
Fix import visibility bugs 313 and 314.
Christian Kamm <kamm incasoftware de>
parents:
622
diff
changeset
|
75 // printf("codegen: %s\n", srcfile->toChars()); |
486
a34078905d01
Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
393
diff
changeset
|
76 |
6 | 77 // start by deleting the old object file |
1 | 78 deleteObjFile(); |
79 | |
18 | 80 // create a new ir state |
139
0ab29b838084
[svn r143] Fixed: a few bugs in debug information, still only line info, but should be correct files now :)
lindquist
parents:
137
diff
changeset
|
81 // TODO look at making the instance static and moving most functionality into IrModule where it belongs |
1 | 82 IRState ir; |
83 gIR = &ir; | |
84 ir.dmodule = this; | |
85 | |
173
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
86 // reset all IR data stored in Dsymbols and Types |
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
87 IrDsymbol::resetAll(); |
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
88 IrType::resetAll(); |
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
89 |
139
0ab29b838084
[svn r143] Fixed: a few bugs in debug information, still only line info, but should be correct files now :)
lindquist
parents:
137
diff
changeset
|
90 // module ir state |
0ab29b838084
[svn r143] Fixed: a few bugs in debug information, still only line info, but should be correct files now :)
lindquist
parents:
137
diff
changeset
|
91 // might already exist via import, just overwrite... |
173
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
92 this->ir.irModule = new IrModule(this); |
139
0ab29b838084
[svn r143] Fixed: a few bugs in debug information, still only line info, but should be correct files now :)
lindquist
parents:
137
diff
changeset
|
93 |
6 | 94 // name the module |
1 | 95 std::string mname(toChars()); |
96 if (md != 0) | |
97 mname = md->toChars(); | |
98 ir.module = new llvm::Module(mname); | |
99 | |
6 | 100 // set target stuff |
1 | 101 std::string target_triple(global.params.tt_arch); |
102 target_triple.append(global.params.tt_os); | |
103 ir.module->setTargetTriple(target_triple); | |
104 ir.module->setDataLayout(global.params.data_layout); | |
105 | |
583
12bda38ea366
Fixed choosing default target machine without needing to link in targets.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
580
diff
changeset
|
106 gTargetData = new llvm::TargetData(global.params.data_layout); |
1 | 107 |
82
d8dd47ef3973
[svn r86] Changed the way arguments are given storage. It is now detected if they will need it during semantic passes.
lindquist
parents:
81
diff
changeset
|
108 // debug info |
d8dd47ef3973
[svn r86] Changed the way arguments are given storage. It is now detected if they will need it during semantic passes.
lindquist
parents:
81
diff
changeset
|
109 if (global.params.symdebug) { |
d8dd47ef3973
[svn r86] Changed the way arguments are given storage. It is now detected if they will need it during semantic passes.
lindquist
parents:
81
diff
changeset
|
110 RegisterDwarfSymbols(ir.module); |
139
0ab29b838084
[svn r143] Fixed: a few bugs in debug information, still only line info, but should be correct files now :)
lindquist
parents:
137
diff
changeset
|
111 DtoDwarfCompileUnit(this); |
82
d8dd47ef3973
[svn r86] Changed the way arguments are given storage. It is now detected if they will need it during semantic passes.
lindquist
parents:
81
diff
changeset
|
112 } |
d8dd47ef3973
[svn r86] Changed the way arguments are given storage. It is now detected if they will need it during semantic passes.
lindquist
parents:
81
diff
changeset
|
113 |
103
855adfdb8d38
[svn r107] Getting .classinfo on a class instance now works (classinfo is stored in vtable)
lindquist
parents:
102
diff
changeset
|
114 // start out by providing opaque for the built-in class types |
173
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
115 if (!ClassDeclaration::object->type->ir.type) |
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
116 ClassDeclaration::object->type->ir.type = new llvm::PATypeHolder(llvm::OpaqueType::get()); |
103
855adfdb8d38
[svn r107] Getting .classinfo on a class instance now works (classinfo is stored in vtable)
lindquist
parents:
102
diff
changeset
|
117 |
173
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
118 if (!Type::typeinfo->type->ir.type) |
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
119 Type::typeinfo->type->ir.type = new llvm::PATypeHolder(llvm::OpaqueType::get()); |
103
855adfdb8d38
[svn r107] Getting .classinfo on a class instance now works (classinfo is stored in vtable)
lindquist
parents:
102
diff
changeset
|
120 |
173
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
121 if (!ClassDeclaration::classinfo->type->ir.type) |
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
122 ClassDeclaration::classinfo->type->ir.type = new llvm::PATypeHolder(llvm::OpaqueType::get()); |
103
855adfdb8d38
[svn r107] Getting .classinfo on a class instance now works (classinfo is stored in vtable)
lindquist
parents:
102
diff
changeset
|
123 |
6 | 124 // process module members |
1 | 125 for (int k=0; k < members->dim; k++) { |
126 Dsymbol* dsym = (Dsymbol*)(members->data[k]); | |
127 assert(dsym); | |
336 | 128 dsym->toObjFile(multiobj); |
1 | 129 } |
130 | |
102
027b8d8b71ec
[svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents:
100
diff
changeset
|
131 // main driver loop |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
132 DtoEmptyAllLists(); |
89 | 133 // generate ModuleInfo |
134 genmoduleinfo(); | |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
135 // do this again as moduleinfo might have pulled something in! |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
136 DtoEmptyAllLists(); |
89 | 137 |
250
fc9c1a0eabbd
[svn r267] Fixed debug info for global variables.
lindquist
parents:
248
diff
changeset
|
138 // emit usedArray |
323
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
139 if (!ir.usedArray.empty()) |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
140 { |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
141 const LLArrayType* usedTy = LLArrayType::get(getVoidPtrType(), ir.usedArray.size()); |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
142 LLConstant* usedInit = LLConstantArray::get(usedTy, ir.usedArray); |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
143 LLGlobalVariable* usedArray = new LLGlobalVariable(usedTy, true, LLGlobalValue::AppendingLinkage, usedInit, "llvm.used", ir.module); |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
144 usedArray->setSection("llvm.metadata"); |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
145 } |
250
fc9c1a0eabbd
[svn r267] Fixed debug info for global variables.
lindquist
parents:
248
diff
changeset
|
146 |
6 | 147 // verify the llvm |
31
2841234d2aea
[svn r35] * Attributes on struct fields/methods now work
lindquist
parents:
28
diff
changeset
|
148 if (!global.params.novalidate) { |
2841234d2aea
[svn r35] * Attributes on struct fields/methods now work
lindquist
parents:
28
diff
changeset
|
149 std::string verifyErr; |
2841234d2aea
[svn r35] * Attributes on struct fields/methods now work
lindquist
parents:
28
diff
changeset
|
150 Logger::println("Verifying module..."); |
117 | 151 LOG_SCOPE; |
31
2841234d2aea
[svn r35] * Attributes on struct fields/methods now work
lindquist
parents:
28
diff
changeset
|
152 if (llvm::verifyModule(*ir.module,llvm::ReturnStatusAction,&verifyErr)) |
2841234d2aea
[svn r35] * Attributes on struct fields/methods now work
lindquist
parents:
28
diff
changeset
|
153 { |
2841234d2aea
[svn r35] * Attributes on struct fields/methods now work
lindquist
parents:
28
diff
changeset
|
154 error("%s", verifyErr.c_str()); |
2841234d2aea
[svn r35] * Attributes on struct fields/methods now work
lindquist
parents:
28
diff
changeset
|
155 fatal(); |
2841234d2aea
[svn r35] * Attributes on struct fields/methods now work
lindquist
parents:
28
diff
changeset
|
156 } |
2841234d2aea
[svn r35] * Attributes on struct fields/methods now work
lindquist
parents:
28
diff
changeset
|
157 else { |
2841234d2aea
[svn r35] * Attributes on struct fields/methods now work
lindquist
parents:
28
diff
changeset
|
158 Logger::println("Verification passed!"); |
2841234d2aea
[svn r35] * Attributes on struct fields/methods now work
lindquist
parents:
28
diff
changeset
|
159 } |
1 | 160 } |
161 | |
125 | 162 // run optimizer |
663
6aaa3d3c1183
First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents:
650
diff
changeset
|
163 ldc_optimize_module(ir.module, global.params.optimizeLevel, global.params.llvmInline); |
1 | 164 |
605
e235b80c92bc
Removed useless assert in ArrayLiteralExp::toConstElem
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
583
diff
changeset
|
165 // verify the llvm |
e235b80c92bc
Removed useless assert in ArrayLiteralExp::toConstElem
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
583
diff
changeset
|
166 if (!global.params.novalidate && (global.params.optimizeLevel >= 0 || global.params.llvmInline)) { |
e235b80c92bc
Removed useless assert in ArrayLiteralExp::toConstElem
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
583
diff
changeset
|
167 std::string verifyErr; |
e235b80c92bc
Removed useless assert in ArrayLiteralExp::toConstElem
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
583
diff
changeset
|
168 Logger::println("Verifying module... again..."); |
e235b80c92bc
Removed useless assert in ArrayLiteralExp::toConstElem
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
583
diff
changeset
|
169 LOG_SCOPE; |
e235b80c92bc
Removed useless assert in ArrayLiteralExp::toConstElem
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
583
diff
changeset
|
170 if (llvm::verifyModule(*ir.module,llvm::ReturnStatusAction,&verifyErr)) |
e235b80c92bc
Removed useless assert in ArrayLiteralExp::toConstElem
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
583
diff
changeset
|
171 { |
e235b80c92bc
Removed useless assert in ArrayLiteralExp::toConstElem
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
583
diff
changeset
|
172 error("%s", verifyErr.c_str()); |
e235b80c92bc
Removed useless assert in ArrayLiteralExp::toConstElem
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
583
diff
changeset
|
173 fatal(); |
e235b80c92bc
Removed useless assert in ArrayLiteralExp::toConstElem
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
583
diff
changeset
|
174 } |
e235b80c92bc
Removed useless assert in ArrayLiteralExp::toConstElem
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
583
diff
changeset
|
175 else { |
e235b80c92bc
Removed useless assert in ArrayLiteralExp::toConstElem
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
583
diff
changeset
|
176 Logger::println("Verification passed!"); |
e235b80c92bc
Removed useless assert in ArrayLiteralExp::toConstElem
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
583
diff
changeset
|
177 } |
e235b80c92bc
Removed useless assert in ArrayLiteralExp::toConstElem
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
583
diff
changeset
|
178 } |
e235b80c92bc
Removed useless assert in ArrayLiteralExp::toConstElem
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
583
diff
changeset
|
179 |
217
0806379a5eca
[svn r233] Added: -oq command line option for writing fully qualified object names.
lindquist
parents:
213
diff
changeset
|
180 // eventually do our own path stuff, dmd's is a bit strange. |
0806379a5eca
[svn r233] Added: -oq command line option for writing fully qualified object names.
lindquist
parents:
213
diff
changeset
|
181 typedef llvm::sys::Path LLPath; |
580
7824c21a58e3
Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents:
565
diff
changeset
|
182 LLPath bcpath = LLPath(objfile->name->toChars()); |
7824c21a58e3
Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents:
565
diff
changeset
|
183 LLPath llpath = bcpath; |
7824c21a58e3
Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents:
565
diff
changeset
|
184 llpath.eraseSuffix(); |
7824c21a58e3
Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents:
565
diff
changeset
|
185 llpath.appendSuffix(std::string(global.ll_ext)); |
217
0806379a5eca
[svn r233] Added: -oq command line option for writing fully qualified object names.
lindquist
parents:
213
diff
changeset
|
186 |
52 | 187 // write bytecode |
188 { | |
393
a3f3c2770a0d
Added bitcode filename to very verbose logging.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
363
diff
changeset
|
189 Logger::println("Writing LLVM bitcode to: %s\n", bcpath.c_str()); |
217
0806379a5eca
[svn r233] Added: -oq command line option for writing fully qualified object names.
lindquist
parents:
213
diff
changeset
|
190 std::ofstream bos(bcpath.c_str(), std::ios::binary); |
52 | 191 llvm::WriteBitcodeToFile(ir.module, bos); |
192 } | |
1 | 193 |
52 | 194 // disassemble ? |
195 if (global.params.disassemble) { | |
580
7824c21a58e3
Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents:
565
diff
changeset
|
196 Logger::println("Writing LLVM asm to: %s\n", llpath.c_str()); |
217
0806379a5eca
[svn r233] Added: -oq command line option for writing fully qualified object names.
lindquist
parents:
213
diff
changeset
|
197 std::ofstream aos(llpath.c_str()); |
565
3c07287765bc
Fixed toobj.cpp to compile with latest LLVM, seems a method overload was removed recently.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
511
diff
changeset
|
198 ir.module->print(aos, NULL); |
52 | 199 } |
1 | 200 |
674
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
201 //TODO: command line switch |
673
37a7688a7494
Add basics for direct assembly output.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
202 if(false) |
37a7688a7494
Add basics for direct assembly output.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
203 { |
674
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
204 //FIXME: Proper out file name. |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
205 Logger::println("Writing native asm to: %s\n", ""); |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
206 std::string err; |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
207 llvm::raw_fd_ostream out("test.s", err); |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
208 write_asm_to_file(*ir.module, out); |
673
37a7688a7494
Add basics for direct assembly output.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
209 } |
37a7688a7494
Add basics for direct assembly output.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
210 |
1 | 211 delete ir.module; |
125 | 212 gTargetData = 0; |
1 | 213 gIR = NULL; |
486
a34078905d01
Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
393
diff
changeset
|
214 |
a34078905d01
Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
393
diff
changeset
|
215 if (llvmForceLogging && !logenabled) |
a34078905d01
Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
393
diff
changeset
|
216 { |
a34078905d01
Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
393
diff
changeset
|
217 Logger::disable(); |
a34078905d01
Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
393
diff
changeset
|
218 } |
1 | 219 } |
220 | |
221 /* ================================================================== */ | |
222 | |
674
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
223 void write_asm_to_file(llvm::Module& m, llvm::raw_fd_ostream& out) |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
224 { |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
225 using namespace llvm; |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
226 |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
227 std::string Err; |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
228 |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
229 const TargetMachineRegistry::entry* MArch; |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
230 MArch = TargetMachineRegistry::getClosestStaticTargetForModule(m, Err); |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
231 if (MArch == 0) { |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
232 error("error auto-selecting target for module '%s'", Err.c_str()); |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
233 fatal(); |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
234 } |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
235 |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
236 SubtargetFeatures Features; |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
237 //TODO: Features? |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
238 // Features.setCPU(MCPU); |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
239 // for (unsigned i = 0; i != MAttrs.size(); ++i) |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
240 // Features.AddFeature(MAttrs[i]); |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
241 |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
242 //FIXME: Only set this if required? |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
243 TargetMachine::setRelocationModel(Reloc::PIC_); |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
244 |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
245 std::auto_ptr<TargetMachine> target(MArch->CtorFn(m, Features.getString())); |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
246 assert(target.get() && "Could not allocate target machine!"); |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
247 TargetMachine &Target = *target.get(); |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
248 |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
249 // Build up all of the passes that we want to do to the module. |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
250 ExistingModuleProvider Provider(&m); |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
251 FunctionPassManager Passes(&Provider); |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
252 //FIXME: Will gTargetData always be Target.getTargetData anyway? |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
253 assert(gTargetData->getStringRepresentation() == Target.getTargetData()->getStringRepresentation()); |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
254 Passes.add(new TargetData(*Target.getTargetData())); |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
255 |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
256 // Ask the target to add backend passes as necessary. |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
257 MachineCodeEmitter *MCE = 0; |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
258 |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
259 //TODO: May want to switch it on for -O0? |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
260 bool Fast = false; |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
261 FileModel::Model mod = Target.addPassesToEmitFile(Passes, out, TargetMachine::AssemblyFile, Fast); |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
262 assert(mod == FileModel::AsmFile); |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
263 |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
264 bool err = Target.addPassesToEmitFileFinish(Passes, MCE, Fast); |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
265 assert(!err); |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
266 |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
267 Passes.doInitialization(); |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
268 |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
269 // Run our queue of passes all at once now, efficiently. |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
270 for (llvm::Module::iterator I = m.begin(), E = m.end(); I != E; ++I) |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
271 if (!I->isDeclaration()) |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
272 Passes.run(*I); |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
273 |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
274 Passes.doFinalization(); |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
275 |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
276 // release module from module provider so we can delete it ourselves |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
277 llvm::Module* rmod = Provider.releaseModule(&Err); |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
278 assert(rmod); |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
279 } |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
280 |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
281 /* ================================================================== */ |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
282 |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
283 // build module ctor |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
284 |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
285 static llvm::Function* build_module_ctor() |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
286 { |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
287 if (gIR->ctors.empty()) |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
288 return NULL; |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
289 |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
290 size_t n = gIR->ctors.size(); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
291 if (n == 1) |
173
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
292 return gIR->ctors[0]->ir.irFunc->func; |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
293 |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
294 std::string name("_D"); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
295 name.append(gIR->dmodule->mangle()); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
296 name.append("6__ctorZ"); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
297 |
213
7816aafeea3c
[svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents:
205
diff
changeset
|
298 std::vector<const LLType*> argsTy; |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
234
diff
changeset
|
299 const llvm::FunctionType* fnTy = llvm::FunctionType::get(LLType::VoidTy,argsTy,false); |
184 | 300 assert(gIR->module->getFunction(name) == NULL); |
205
9d44ec83acd1
[svn r221] Update: Switched to the 2.3 LLVM svn branch, http://llvm.org/svn/llvm-project/llvm/branches/release_23 .
lindquist
parents:
184
diff
changeset
|
301 llvm::Function* fn = llvm::Function::Create(fnTy, llvm::GlobalValue::InternalLinkage, name, gIR->module); |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
302 fn->setCallingConv(llvm::CallingConv::Fast); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
303 |
205
9d44ec83acd1
[svn r221] Update: Switched to the 2.3 LLVM svn branch, http://llvm.org/svn/llvm-project/llvm/branches/release_23 .
lindquist
parents:
184
diff
changeset
|
304 llvm::BasicBlock* bb = llvm::BasicBlock::Create("entry", fn); |
493
017ca8645a1f
Make llvmdc work with llvm 2.4svn revision 54614. Breaks compatibility with llvm 2.3.
Christian Kamm <kamm incasoftware de>
parents:
486
diff
changeset
|
305 IRBuilder<> builder(bb); |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
306 |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
307 for (size_t i=0; i<n; i++) { |
173
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
308 llvm::Function* f = gIR->ctors[i]->ir.irFunc->func; |
316
163cad969791
[svn r337] Reverted changes to toobj.cpp: Module constructor calls can never be invokes.
ChristianK
parents:
315
diff
changeset
|
309 llvm::CallInst* call = builder.CreateCall(f,""); |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
310 call->setCallingConv(llvm::CallingConv::Fast); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
311 } |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
312 |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
313 builder.CreateRetVoid(); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
314 return fn; |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
315 } |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
316 |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
317 // build module dtor |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
318 |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
319 static llvm::Function* build_module_dtor() |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
320 { |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
321 if (gIR->dtors.empty()) |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
322 return NULL; |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
323 |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
324 size_t n = gIR->dtors.size(); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
325 if (n == 1) |
173
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
326 return gIR->dtors[0]->ir.irFunc->func; |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
327 |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
328 std::string name("_D"); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
329 name.append(gIR->dmodule->mangle()); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
330 name.append("6__dtorZ"); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
331 |
213
7816aafeea3c
[svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents:
205
diff
changeset
|
332 std::vector<const LLType*> argsTy; |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
234
diff
changeset
|
333 const llvm::FunctionType* fnTy = llvm::FunctionType::get(LLType::VoidTy,argsTy,false); |
184 | 334 assert(gIR->module->getFunction(name) == NULL); |
205
9d44ec83acd1
[svn r221] Update: Switched to the 2.3 LLVM svn branch, http://llvm.org/svn/llvm-project/llvm/branches/release_23 .
lindquist
parents:
184
diff
changeset
|
335 llvm::Function* fn = llvm::Function::Create(fnTy, llvm::GlobalValue::InternalLinkage, name, gIR->module); |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
336 fn->setCallingConv(llvm::CallingConv::Fast); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
337 |
205
9d44ec83acd1
[svn r221] Update: Switched to the 2.3 LLVM svn branch, http://llvm.org/svn/llvm-project/llvm/branches/release_23 .
lindquist
parents:
184
diff
changeset
|
338 llvm::BasicBlock* bb = llvm::BasicBlock::Create("entry", fn); |
493
017ca8645a1f
Make llvmdc work with llvm 2.4svn revision 54614. Breaks compatibility with llvm 2.3.
Christian Kamm <kamm incasoftware de>
parents:
486
diff
changeset
|
339 IRBuilder<> builder(bb); |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
340 |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
341 for (size_t i=0; i<n; i++) { |
173
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
342 llvm::Function* f = gIR->dtors[i]->ir.irFunc->func; |
316
163cad969791
[svn r337] Reverted changes to toobj.cpp: Module constructor calls can never be invokes.
ChristianK
parents:
315
diff
changeset
|
343 llvm::CallInst* call = builder.CreateCall(f,""); |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
344 call->setCallingConv(llvm::CallingConv::Fast); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
345 } |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
346 |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
347 builder.CreateRetVoid(); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
348 return fn; |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
349 } |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
350 |
121
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
351 // build module unittest |
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
352 |
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
353 static llvm::Function* build_module_unittest() |
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
354 { |
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
355 if (gIR->unitTests.empty()) |
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
356 return NULL; |
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
357 |
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
358 size_t n = gIR->unitTests.size(); |
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
359 if (n == 1) |
173
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
360 return gIR->unitTests[0]->ir.irFunc->func; |
121
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
361 |
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
362 std::string name("_D"); |
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
363 name.append(gIR->dmodule->mangle()); |
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
364 name.append("10__unittestZ"); |
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
365 |
213
7816aafeea3c
[svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents:
205
diff
changeset
|
366 std::vector<const LLType*> argsTy; |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
234
diff
changeset
|
367 const llvm::FunctionType* fnTy = llvm::FunctionType::get(LLType::VoidTy,argsTy,false); |
184 | 368 assert(gIR->module->getFunction(name) == NULL); |
205
9d44ec83acd1
[svn r221] Update: Switched to the 2.3 LLVM svn branch, http://llvm.org/svn/llvm-project/llvm/branches/release_23 .
lindquist
parents:
184
diff
changeset
|
369 llvm::Function* fn = llvm::Function::Create(fnTy, llvm::GlobalValue::InternalLinkage, name, gIR->module); |
121
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
370 fn->setCallingConv(llvm::CallingConv::Fast); |
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
371 |
205
9d44ec83acd1
[svn r221] Update: Switched to the 2.3 LLVM svn branch, http://llvm.org/svn/llvm-project/llvm/branches/release_23 .
lindquist
parents:
184
diff
changeset
|
372 llvm::BasicBlock* bb = llvm::BasicBlock::Create("entry", fn); |
493
017ca8645a1f
Make llvmdc work with llvm 2.4svn revision 54614. Breaks compatibility with llvm 2.3.
Christian Kamm <kamm incasoftware de>
parents:
486
diff
changeset
|
373 IRBuilder<> builder(bb); |
121
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
374 |
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
375 for (size_t i=0; i<n; i++) { |
173
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
376 llvm::Function* f = gIR->unitTests[i]->ir.irFunc->func; |
316
163cad969791
[svn r337] Reverted changes to toobj.cpp: Module constructor calls can never be invokes.
ChristianK
parents:
315
diff
changeset
|
377 llvm::CallInst* call = builder.CreateCall(f,""); |
121
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
378 call->setCallingConv(llvm::CallingConv::Fast); |
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
379 } |
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
380 |
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
381 builder.CreateRetVoid(); |
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
382 return fn; |
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
383 } |
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
384 |
323
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
385 // build ModuleReference and register function, to register the module info in the global linked list |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
386 static LLFunction* build_module_reference_and_ctor(LLConstant* moduleinfo) |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
387 { |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
388 // build ctor type |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
389 const LLFunctionType* fty = LLFunctionType::get(LLType::VoidTy, std::vector<const LLType*>(), false); |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
390 |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
391 // build ctor name |
324
c542d12017e5
[svn r345] Fixed the new moduleinfo stuff to have consistent symbol names with the D style.
lindquist
parents:
323
diff
changeset
|
392 std::string fname = "_D"; |
c542d12017e5
[svn r345] Fixed the new moduleinfo stuff to have consistent symbol names with the D style.
lindquist
parents:
323
diff
changeset
|
393 fname += gIR->dmodule->mangle(); |
323
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
394 fname += "16__moduleinfoCtorZ"; |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
395 |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
396 // build a function that registers the moduleinfo in the global moduleinfo linked list |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
397 LLFunction* ctor = LLFunction::Create(fty, LLGlobalValue::InternalLinkage, fname, gIR->module); |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
398 |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
399 // provide the default initializer |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
400 const LLStructType* modulerefTy = DtoModuleReferenceType(); |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
401 std::vector<LLConstant*> mrefvalues; |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
402 mrefvalues.push_back(LLConstant::getNullValue(modulerefTy->getContainedType(0))); |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
403 mrefvalues.push_back(moduleinfo); |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
404 LLConstant* thismrefinit = LLConstantStruct::get(modulerefTy, mrefvalues); |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
405 |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
406 // create the ModuleReference node for this module |
324
c542d12017e5
[svn r345] Fixed the new moduleinfo stuff to have consistent symbol names with the D style.
lindquist
parents:
323
diff
changeset
|
407 std::string thismrefname = "_D"; |
c542d12017e5
[svn r345] Fixed the new moduleinfo stuff to have consistent symbol names with the D style.
lindquist
parents:
323
diff
changeset
|
408 thismrefname += gIR->dmodule->mangle(); |
323
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
409 thismrefname += "11__moduleRefZ"; |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
410 LLGlobalVariable* thismref = new LLGlobalVariable(modulerefTy, false, LLGlobalValue::InternalLinkage, thismrefinit, thismrefname, gIR->module); |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
411 |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
412 // make sure _Dmodule_ref is declared |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
413 LLGlobalVariable* mref = gIR->module->getNamedGlobal("_Dmodule_ref"); |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
414 if (!mref) |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
415 mref = new LLGlobalVariable(getPtrToType(modulerefTy), false, LLGlobalValue::ExternalLinkage, NULL, "_Dmodule_ref", gIR->module); |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
416 |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
417 // make the function insert this moduleinfo as the beginning of the _Dmodule_ref linked list |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
418 llvm::BasicBlock* bb = llvm::BasicBlock::Create("moduleinfoCtorEntry", ctor); |
493
017ca8645a1f
Make llvmdc work with llvm 2.4svn revision 54614. Breaks compatibility with llvm 2.3.
Christian Kamm <kamm incasoftware de>
parents:
486
diff
changeset
|
419 IRBuilder<> builder(bb); |
323
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
420 |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
421 // get current beginning |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
422 LLValue* curbeg = builder.CreateLoad(mref, "current"); |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
423 |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
424 // put current beginning as the next of this one |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
425 LLValue* gep = builder.CreateStructGEP(thismref, 0, "next"); |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
426 builder.CreateStore(curbeg, gep); |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
427 |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
428 // replace beginning |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
429 builder.CreateStore(thismref, mref); |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
430 |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
431 // return |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
432 builder.CreateRetVoid(); |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
433 |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
434 return ctor; |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
435 } |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
436 |
1 | 437 // Put out instance of ModuleInfo for this Module |
438 | |
439 void Module::genmoduleinfo() | |
440 { | |
89 | 441 // The layout is: |
442 // { | |
443 // void **vptr; | |
444 // monitor_t monitor; | |
445 // char[] name; // class name | |
446 // ModuleInfo importedModules[]; | |
447 // ClassInfo localClasses[]; | |
448 // uint flags; // initialization state | |
449 // void *ctor; | |
450 // void *dtor; | |
451 // void *unitTest; | |
452 // } | |
453 | |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
454 // resolve ModuleInfo |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
455 assert(moduleinfo); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
456 DtoForceConstInitDsymbol(moduleinfo); |
89 | 457 |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
458 // moduleinfo llvm struct type |
173
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
459 const llvm::StructType* moduleinfoTy = isaStruct(moduleinfo->type->ir.type->get()); |
89 | 460 |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
461 // classinfo llvm struct type |
173
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
462 const llvm::StructType* classinfoTy = isaStruct(ClassDeclaration::classinfo->type->ir.type->get()); |
89 | 463 |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
464 // initializer vector |
213
7816aafeea3c
[svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents:
205
diff
changeset
|
465 std::vector<LLConstant*> initVec; |
7816aafeea3c
[svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents:
205
diff
changeset
|
466 LLConstant* c = 0; |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
467 |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
468 // vtable |
173
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
469 c = moduleinfo->ir.irStruct->vtbl; |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
470 initVec.push_back(c); |
89 | 471 |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
472 // monitor |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
234
diff
changeset
|
473 c = getNullPtr(getPtrToType(LLType::Int8Ty)); |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
474 initVec.push_back(c); |
89 | 475 |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
476 // name |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
477 char *name = toPrettyChars(); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
478 c = DtoConstString(name); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
479 initVec.push_back(c); |
89 | 480 |
481 // importedModules[] | |
482 int aimports_dim = aimports.dim; | |
213
7816aafeea3c
[svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents:
205
diff
changeset
|
483 std::vector<LLConstant*> importInits; |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
484 for (size_t i = 0; i < aimports.dim; i++) |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
485 { |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
486 Module *m = (Module *)aimports.data[i]; |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
487 if (!m->needModuleInfo()) |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
488 aimports_dim--; |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
489 else { // declare |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
490 // create name |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
491 std::string m_name("_D"); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
492 m_name.append(m->mangle()); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
493 m_name.append("8__ModuleZ"); |
163
a8cd9bc1021a
[svn r179] lots and lots of fixes, much more of tango now compiles/works.
lindquist
parents:
157
diff
changeset
|
494 llvm::GlobalVariable* m_gvar = gIR->module->getGlobalVariable(m_name); |
a8cd9bc1021a
[svn r179] lots and lots of fixes, much more of tango now compiles/works.
lindquist
parents:
157
diff
changeset
|
495 if (!m_gvar) m_gvar = new llvm::GlobalVariable(moduleinfoTy, false, llvm::GlobalValue::ExternalLinkage, NULL, m_name, gIR->module); |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
496 importInits.push_back(m_gvar); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
497 } |
89 | 498 } |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
499 // has import array? |
133
44a95ac7368a
[svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents:
132
diff
changeset
|
500 if (!importInits.empty()) |
44a95ac7368a
[svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents:
132
diff
changeset
|
501 { |
44a95ac7368a
[svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents:
132
diff
changeset
|
502 const llvm::ArrayType* importArrTy = llvm::ArrayType::get(getPtrToType(moduleinfoTy), importInits.size()); |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
503 c = llvm::ConstantArray::get(importArrTy, importInits); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
504 std::string m_name("_D"); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
505 m_name.append(mangle()); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
506 m_name.append("9__importsZ"); |
163
a8cd9bc1021a
[svn r179] lots and lots of fixes, much more of tango now compiles/works.
lindquist
parents:
157
diff
changeset
|
507 llvm::GlobalVariable* m_gvar = gIR->module->getGlobalVariable(m_name); |
a8cd9bc1021a
[svn r179] lots and lots of fixes, much more of tango now compiles/works.
lindquist
parents:
157
diff
changeset
|
508 if (!m_gvar) m_gvar = new llvm::GlobalVariable(importArrTy, true, llvm::GlobalValue::InternalLinkage, c, m_name, gIR->module); |
133
44a95ac7368a
[svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents:
132
diff
changeset
|
509 c = llvm::ConstantExpr::getBitCast(m_gvar, getPtrToType(importArrTy->getElementType())); |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
510 c = DtoConstSlice(DtoConstSize_t(importInits.size()), c); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
511 } |
89 | 512 else |
173
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
513 c = moduleinfo->ir.irStruct->constInit->getOperand(3); |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
514 initVec.push_back(c); |
89 | 515 |
516 // localClasses[] | |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
517 ClassDeclarations aclasses; |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
518 //printf("members->dim = %d\n", members->dim); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
519 for (size_t i = 0; i < members->dim; i++) |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
520 { |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
521 Dsymbol *member; |
89 | 522 |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
523 member = (Dsymbol *)members->data[i]; |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
524 //printf("\tmember '%s'\n", member->toChars()); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
525 member->addLocalClass(&aclasses); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
526 } |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
527 // fill inits |
213
7816aafeea3c
[svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents:
205
diff
changeset
|
528 std::vector<LLConstant*> classInits; |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
529 for (size_t i = 0; i < aclasses.dim; i++) |
89 | 530 { |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
531 ClassDeclaration* cd = (ClassDeclaration*)aclasses.data[i]; |
133
44a95ac7368a
[svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents:
132
diff
changeset
|
532 if (cd->isInterfaceDeclaration()) |
44a95ac7368a
[svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents:
132
diff
changeset
|
533 { |
136
0e28624814e8
[svn r140] did a lot of the work towards being able to pass multiple modules on the command line. not complete yet though
lindquist
parents:
133
diff
changeset
|
534 Logger::println("skipping interface '%s' in moduleinfo", cd->toPrettyChars()); |
133
44a95ac7368a
[svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents:
132
diff
changeset
|
535 continue; |
44a95ac7368a
[svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents:
132
diff
changeset
|
536 } |
132 | 537 Logger::println("class: %s", cd->toPrettyChars()); |
173
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
538 assert(cd->ir.irStruct->classInfo); |
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
539 classInits.push_back(cd->ir.irStruct->classInfo); |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
540 } |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
541 // has class array? |
133
44a95ac7368a
[svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents:
132
diff
changeset
|
542 if (!classInits.empty()) |
44a95ac7368a
[svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents:
132
diff
changeset
|
543 { |
44a95ac7368a
[svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents:
132
diff
changeset
|
544 const llvm::ArrayType* classArrTy = llvm::ArrayType::get(getPtrToType(classinfoTy), classInits.size()); |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
545 c = llvm::ConstantArray::get(classArrTy, classInits); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
546 std::string m_name("_D"); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
547 m_name.append(mangle()); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
548 m_name.append("9__classesZ"); |
184 | 549 assert(gIR->module->getGlobalVariable(m_name) == NULL); |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
550 llvm::GlobalVariable* m_gvar = new llvm::GlobalVariable(classArrTy, true, llvm::GlobalValue::InternalLinkage, c, m_name, gIR->module); |
133
44a95ac7368a
[svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents:
132
diff
changeset
|
551 c = llvm::ConstantExpr::getBitCast(m_gvar, getPtrToType(classArrTy->getElementType())); |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
552 c = DtoConstSlice(DtoConstSize_t(classInits.size()), c); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
553 } |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
554 else |
173
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
555 c = moduleinfo->ir.irStruct->constInit->getOperand(4); |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
556 initVec.push_back(c); |
89 | 557 |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
558 // flags |
132 | 559 c = DtoConstUint(0); |
560 if (!needmoduleinfo) | |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
561 c = DtoConstUint(4); // flags (4 means MIstandalone) |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
562 initVec.push_back(c); |
89 | 563 |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
564 // ctor |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
565 llvm::Function* fctor = build_module_ctor(); |
173
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
566 c = fctor ? fctor : moduleinfo->ir.irStruct->constInit->getOperand(6); |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
567 initVec.push_back(c); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
568 |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
569 // dtor |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
570 llvm::Function* fdtor = build_module_dtor(); |
173
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
571 c = fdtor ? fdtor : moduleinfo->ir.irStruct->constInit->getOperand(7); |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
572 initVec.push_back(c); |
89 | 573 |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
574 // unitTest |
121
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
575 llvm::Function* unittest = build_module_unittest(); |
173
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
576 c = unittest ? unittest : moduleinfo->ir.irStruct->constInit->getOperand(8); |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
577 initVec.push_back(c); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
578 |
132 | 579 // xgetMembers |
173
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
580 c = moduleinfo->ir.irStruct->constInit->getOperand(9); |
132 | 581 initVec.push_back(c); |
582 | |
583 // ictor | |
173
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
584 c = moduleinfo->ir.irStruct->constInit->getOperand(10); |
132 | 585 initVec.push_back(c); |
586 | |
587 /*Logger::println("MODULE INFO INITIALIZERS"); | |
588 for (size_t i=0; i<initVec.size(); ++i) | |
589 { | |
590 Logger::cout() << *initVec[i] << '\n'; | |
591 if (initVec[i]->getType() != moduleinfoTy->getElementType(i)) | |
592 assert(0); | |
593 }*/ | |
594 | |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
595 // create initializer |
213
7816aafeea3c
[svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents:
205
diff
changeset
|
596 LLConstant* constMI = llvm::ConstantStruct::get(moduleinfoTy, initVec); |
89 | 597 |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
598 // create name |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
599 std::string MIname("_D"); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
600 MIname.append(mangle()); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
601 MIname.append("8__ModuleZ"); |
89 | 602 |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
603 // declare |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
604 // flags will be modified at runtime so can't make it constant |
184 | 605 |
606 llvm::GlobalVariable* gvar = gIR->module->getGlobalVariable(MIname); | |
607 if (!gvar) gvar = new llvm::GlobalVariable(moduleinfoTy, false, llvm::GlobalValue::ExternalLinkage, NULL, MIname, gIR->module); | |
608 gvar->setInitializer(constMI); | |
117 | 609 |
323
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
610 // build the modulereference and ctor for registering it |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
611 LLFunction* mictor = build_module_reference_and_ctor(gvar); |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
612 |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
613 // register this ctor in the magic llvm.global_ctors appending array |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
614 const LLFunctionType* magicfty = LLFunctionType::get(LLType::VoidTy, std::vector<const LLType*>(), false); |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
615 std::vector<const LLType*> magictypes; |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
616 magictypes.push_back(LLType::Int32Ty); |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
617 magictypes.push_back(getPtrToType(magicfty)); |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
618 const LLStructType* magicsty = LLStructType::get(magictypes); |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
619 |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
620 // make the constant element |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
621 std::vector<LLConstant*> magicconstants; |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
622 magicconstants.push_back(DtoConstUint(65535)); |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
623 magicconstants.push_back(mictor); |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
624 LLConstant* magicinit = LLConstantStruct::get(magicsty, magicconstants); |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
625 |
117 | 626 // declare the appending array |
323
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
627 const llvm::ArrayType* appendArrTy = llvm::ArrayType::get(magicsty, 1); |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
628 std::vector<LLConstant*> appendInits(1, magicinit); |
213
7816aafeea3c
[svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents:
205
diff
changeset
|
629 LLConstant* appendInit = llvm::ConstantArray::get(appendArrTy, appendInits); |
323
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
630 std::string appendName("llvm.global_ctors"); |
117 | 631 llvm::GlobalVariable* appendVar = new llvm::GlobalVariable(appendArrTy, true, llvm::GlobalValue::AppendingLinkage, appendInit, appendName, gIR->module); |
1 | 632 } |
633 | |
634 /* ================================================================== */ | |
635 | |
336 | 636 void Dsymbol::toObjFile(int multiobj) |
1 | 637 { |
38
27b2f40bdb58
[svn r42] Disabled the extensive logging by default. Use the -vv flag to get it back.
lindquist
parents:
31
diff
changeset
|
638 Logger::println("Ignoring Dsymbol::toObjFile for %s", toChars()); |
1 | 639 } |
640 | |
641 /* ================================================================== */ | |
642 | |
643 void Declaration::toObjFile() | |
644 { | |
38
27b2f40bdb58
[svn r42] Disabled the extensive logging by default. Use the -vv flag to get it back.
lindquist
parents:
31
diff
changeset
|
645 Logger::println("Ignoring Declaration::toObjFile for %s", toChars()); |
1 | 646 } |
647 | |
648 /* ================================================================== */ | |
649 | |
336 | 650 void InterfaceDeclaration::toObjFile(int multiobj) |
1 | 651 { |
133
44a95ac7368a
[svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents:
132
diff
changeset
|
652 //Logger::println("Ignoring InterfaceDeclaration::toObjFile for %s", toChars()); |
44a95ac7368a
[svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents:
132
diff
changeset
|
653 gIR->resolveList.push_back(this); |
1 | 654 } |
655 | |
656 /* ================================================================== */ | |
657 | |
336 | 658 void StructDeclaration::toObjFile(int multiobj) |
1 | 659 { |
102
027b8d8b71ec
[svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents:
100
diff
changeset
|
660 gIR->resolveList.push_back(this); |
1 | 661 } |
662 | |
663 /* ================================================================== */ | |
664 | |
336 | 665 void ClassDeclaration::toObjFile(int multiobj) |
1 | 666 { |
102
027b8d8b71ec
[svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents:
100
diff
changeset
|
667 gIR->resolveList.push_back(this); |
1 | 668 } |
669 | |
670 /****************************************** | |
671 * Get offset of base class's vtbl[] initializer from start of csym. | |
672 * Returns ~0 if not this csym. | |
673 */ | |
674 | |
675 unsigned ClassDeclaration::baseVtblOffset(BaseClass *bc) | |
676 { | |
677 return ~0; | |
678 } | |
679 | |
680 /* ================================================================== */ | |
681 | |
336 | 682 void VarDeclaration::toObjFile(int multiobj) |
1 | 683 { |
40 | 684 Logger::print("VarDeclaration::toObjFile(): %s | %s\n", toChars(), type->toChars()); |
1 | 685 LOG_SCOPE; |
686 | |
85
f869c636a113
[svn r89] Fixed a bunch of problems with template instance across multiple modules.
lindquist
parents:
84
diff
changeset
|
687 if (aliassym) |
f869c636a113
[svn r89] Fixed a bunch of problems with template instance across multiple modules.
lindquist
parents:
84
diff
changeset
|
688 { |
88
058d3925950e
[svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
86
diff
changeset
|
689 Logger::println("alias sym"); |
336 | 690 toAlias()->toObjFile(multiobj); |
85
f869c636a113
[svn r89] Fixed a bunch of problems with template instance across multiple modules.
lindquist
parents:
84
diff
changeset
|
691 return; |
f869c636a113
[svn r89] Fixed a bunch of problems with template instance across multiple modules.
lindquist
parents:
84
diff
changeset
|
692 } |
f869c636a113
[svn r89] Fixed a bunch of problems with template instance across multiple modules.
lindquist
parents:
84
diff
changeset
|
693 |
1 | 694 // global variable or magic |
85
f869c636a113
[svn r89] Fixed a bunch of problems with template instance across multiple modules.
lindquist
parents:
84
diff
changeset
|
695 if (isDataseg()) |
1 | 696 { |
511
a0b0676e787d
Fixed problem when instantiating a template with private global variables.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
499
diff
changeset
|
697 Logger::println("data segment"); |
a0b0676e787d
Fixed problem when instantiating a template with private global variables.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
499
diff
changeset
|
698 |
132 | 699 // don't duplicate work |
173
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
700 if (this->ir.resolved) return; |
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
701 this->ir.resolved = true; |
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
702 this->ir.declared = true; |
40 | 703 |
173
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
704 this->ir.irGlobal = new IrGlobal(this); |
100 | 705 |
706 Logger::println("parent: %s (%s)", parent->toChars(), parent->kind()); | |
707 | |
149
4c577c2b7229
[svn r155] Fixed a bunch of linkage problems (especially with templates)
lindquist
parents:
139
diff
changeset
|
708 // handle static local variables |
100 | 709 bool static_local = false; |
149
4c577c2b7229
[svn r155] Fixed a bunch of linkage problems (especially with templates)
lindquist
parents:
139
diff
changeset
|
710 bool _isconst = isConst(); |
4c577c2b7229
[svn r155] Fixed a bunch of linkage problems (especially with templates)
lindquist
parents:
139
diff
changeset
|
711 if (parent && parent->isFuncDeclaration()) |
4c577c2b7229
[svn r155] Fixed a bunch of linkage problems (especially with templates)
lindquist
parents:
139
diff
changeset
|
712 { |
4c577c2b7229
[svn r155] Fixed a bunch of linkage problems (especially with templates)
lindquist
parents:
139
diff
changeset
|
713 static_local = true; |
4c577c2b7229
[svn r155] Fixed a bunch of linkage problems (especially with templates)
lindquist
parents:
139
diff
changeset
|
714 if (init && init->isExpInitializer()) { |
4c577c2b7229
[svn r155] Fixed a bunch of linkage problems (especially with templates)
lindquist
parents:
139
diff
changeset
|
715 _isconst = false; |
4c577c2b7229
[svn r155] Fixed a bunch of linkage problems (especially with templates)
lindquist
parents:
139
diff
changeset
|
716 } |
85
f869c636a113
[svn r89] Fixed a bunch of problems with template instance across multiple modules.
lindquist
parents:
84
diff
changeset
|
717 } |
149
4c577c2b7229
[svn r155] Fixed a bunch of linkage problems (especially with templates)
lindquist
parents:
139
diff
changeset
|
718 |
4c577c2b7229
[svn r155] Fixed a bunch of linkage problems (especially with templates)
lindquist
parents:
139
diff
changeset
|
719 Logger::println("Creating global variable"); |
26
99737f94abfb
[svn r30] * Fixed static function-local variables.
lindquist
parents:
24
diff
changeset
|
720 |
213
7816aafeea3c
[svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents:
205
diff
changeset
|
721 const LLType* _type = this->ir.irGlobal->type.get(); |
149
4c577c2b7229
[svn r155] Fixed a bunch of linkage problems (especially with templates)
lindquist
parents:
139
diff
changeset
|
722 llvm::GlobalValue::LinkageTypes _linkage = DtoLinkage(this); |
21
8d45266bbabe
[svn r25] * Fixed a lot of problems with string literals
lindquist
parents:
18
diff
changeset
|
723 std::string _name(mangle()); |
52 | 724 |
100 | 725 llvm::GlobalVariable* gvar = new llvm::GlobalVariable(_type,_isconst,_linkage,NULL,_name,gIR->module); |
173
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
726 this->ir.irGlobal->value = gvar; |
88
058d3925950e
[svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
86
diff
changeset
|
727 |
622
26fce59fe80a
Wrapped all the most potentially expensive logging calls in a conditional to only do work when actually requested.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
605
diff
changeset
|
728 if (Logger::enabled()) |
26fce59fe80a
Wrapped all the most potentially expensive logging calls in a conditional to only do work when actually requested.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
605
diff
changeset
|
729 Logger::cout() << *gvar << '\n'; |
163
a8cd9bc1021a
[svn r179] lots and lots of fixes, much more of tango now compiles/works.
lindquist
parents:
157
diff
changeset
|
730 |
100 | 731 if (static_local) |
732 DtoConstInitGlobal(this); | |
733 else | |
102
027b8d8b71ec
[svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents:
100
diff
changeset
|
734 gIR->constInitList.push_back(this); |
1 | 735 } |
736 | |
737 // inside aggregate declaration. declare a field. | |
738 else | |
739 { | |
740 Logger::println("Aggregate var declaration: '%s' offset=%d", toChars(), offset); | |
741 | |
213
7816aafeea3c
[svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents:
205
diff
changeset
|
742 const LLType* _type = DtoType(type); |
173
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
743 this->ir.irField = new IrField(this); |
73 | 744 |
745 // add the field in the IRStruct | |
136
0e28624814e8
[svn r140] did a lot of the work towards being able to pass multiple modules on the command line. not complete yet though
lindquist
parents:
133
diff
changeset
|
746 gIR->topstruct()->offsets.insert(std::make_pair(offset, IrStruct::Offset(this, _type))); |
1 | 747 } |
748 | |
749 Logger::println("VarDeclaration::toObjFile is done"); | |
750 } | |
751 | |
752 /* ================================================================== */ | |
753 | |
336 | 754 void TypedefDeclaration::toObjFile(int multiobj) |
1 | 755 { |
756 static int tdi = 0; | |
757 Logger::print("TypedefDeclaration::toObjFile(%d): %s\n", tdi++, toChars()); | |
758 LOG_SCOPE; | |
759 | |
52 | 760 // generate typeinfo |
275
665b81613475
[svn r296] Removed: the 'suite' dir, it never took off!
lindquist
parents:
251
diff
changeset
|
761 DtoTypeInfoOf(type, false); |
1 | 762 } |
763 | |
764 /* ================================================================== */ | |
765 | |
336 | 766 void EnumDeclaration::toObjFile(int multiobj) |
1 | 767 { |
38
27b2f40bdb58
[svn r42] Disabled the extensive logging by default. Use the -vv flag to get it back.
lindquist
parents:
31
diff
changeset
|
768 Logger::println("Ignoring EnumDeclaration::toObjFile for %s", toChars()); |
1 | 769 } |
770 | |
771 /* ================================================================== */ | |
772 | |
336 | 773 void FuncDeclaration::toObjFile(int multiobj) |
1 | 774 { |
102
027b8d8b71ec
[svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents:
100
diff
changeset
|
775 gIR->resolveList.push_back(this); |
1 | 776 } |