Mercurial > projects > ldc
annotate gen/toobj.cpp @ 1534:8ca25bd765a3
Build fix for the latest LLVMContext changes (LLVM r75445)
This shouldn't break the build with older LLVM revs. We include
LLVMContext.h in gen/llvm.h now to make the transition a little bit
easier.
author | Benjamin Kramer <benny.kra@gmail.com> |
---|---|
date | Mon, 13 Jul 2009 12:17:58 +0200 |
parents | c88b16d4a13c |
children | 61f12f4651b5 |
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 <fstream> | |
12 | |
40 | 13 #include "gen/llvm.h" |
1521
982eb70e83b2
Fix build for LLVM >= r74640
Benjamin Kramer <benny.kra@gmail.com>
parents:
1502
diff
changeset
|
14 #include "gen/llvm-version.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/Module.h" |
37a7688a7494
Add basics for direct assembly output.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
18 #include "llvm/ModuleProvider.h" |
37a7688a7494
Add basics for direct assembly output.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
19 #include "llvm/PassManager.h" |
689
06c05906b054
Always run SimplifyCFG to workaround LLVM bug 2613.
Christian Kamm <kamm incasoftware de>
parents:
686
diff
changeset
|
20 #include "llvm/LinkAllPasses.h" |
676
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
21 #include "llvm/System/Program.h" |
673
37a7688a7494
Add basics for direct assembly output.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
22 #include "llvm/Support/raw_ostream.h" |
986
a8cb25d478c4
Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents:
951
diff
changeset
|
23 #include "llvm/Support/CommandLine.h" |
988
2667e3a145be
- Fixed LLVM style CL args for D2.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
986
diff
changeset
|
24 #include "llvm/Target/TargetMachine.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 |
1386
402bffb1b356
Use RTTIBuilder to build !ModuleInfo, still needs some work.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1380
diff
changeset
|
40 #include "gen/abi.h" |
64
b688ad419f8c
[svn r68] Added support for multi-dimensional static arrays.
lindquist
parents:
63
diff
changeset
|
41 #include "gen/arrays.h" |
100 | 42 #include "gen/classes.h" |
1386
402bffb1b356
Use RTTIBuilder to build !ModuleInfo, still needs some work.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1380
diff
changeset
|
43 #include "gen/cl_options.h" |
100 | 44 #include "gen/functions.h" |
1386
402bffb1b356
Use RTTIBuilder to build !ModuleInfo, still needs some work.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1380
diff
changeset
|
45 #include "gen/irstate.h" |
402bffb1b356
Use RTTIBuilder to build !ModuleInfo, still needs some work.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1380
diff
changeset
|
46 #include "gen/llvmhelpers.h" |
402bffb1b356
Use RTTIBuilder to build !ModuleInfo, still needs some work.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1380
diff
changeset
|
47 #include "gen/logger.h" |
402bffb1b356
Use RTTIBuilder to build !ModuleInfo, still needs some work.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1380
diff
changeset
|
48 #include "gen/optimizer.h" |
402bffb1b356
Use RTTIBuilder to build !ModuleInfo, still needs some work.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1380
diff
changeset
|
49 #include "gen/programs.h" |
402bffb1b356
Use RTTIBuilder to build !ModuleInfo, still needs some work.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1380
diff
changeset
|
50 #include "gen/rttibuilder.h" |
86
fd32135dca3e
[svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!!
lindquist
parents:
85
diff
changeset
|
51 #include "gen/runtime.h" |
1386
402bffb1b356
Use RTTIBuilder to build !ModuleInfo, still needs some work.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1380
diff
changeset
|
52 #include "gen/structs.h" |
402bffb1b356
Use RTTIBuilder to build !ModuleInfo, still needs some work.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1380
diff
changeset
|
53 #include "gen/todebug.h" |
402bffb1b356
Use RTTIBuilder to build !ModuleInfo, still needs some work.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1380
diff
changeset
|
54 #include "gen/tollvm.h" |
1 | 55 |
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
|
56 #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
|
57 #include "ir/irmodule.h" |
1364
46f6365a50d7
Added IrTypeFunction and IrTypeDelegate and eliminated IrDType. This means the Type::ir field can be removed. It's the final part needed for the move to a slightly more sane type system. Now the whole thing just needs to be cleaned up :P
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1341
diff
changeset
|
58 #include "ir/irtype.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
|
59 |
1 | 60 ////////////////////////////////////////////////////////////////////////////////////////// |
61 | |
986
a8cb25d478c4
Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents:
951
diff
changeset
|
62 static llvm::cl::opt<bool> noVerify("noverify", |
a8cb25d478c4
Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents:
951
diff
changeset
|
63 llvm::cl::desc("Do not run the validation pass before writing bitcode"), |
a8cb25d478c4
Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents:
951
diff
changeset
|
64 llvm::cl::ZeroOrMore); |
a8cb25d478c4
Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents:
951
diff
changeset
|
65 |
a8cb25d478c4
Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents:
951
diff
changeset
|
66 ////////////////////////////////////////////////////////////////////////////////////////// |
a8cb25d478c4
Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents:
951
diff
changeset
|
67 |
674
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
68 // fwd decl |
699
ed9a9e6dd1cc
Started changing target triple stuff, part of fixing #97
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
694
diff
changeset
|
69 void write_asm_to_file(llvm::TargetMachine &Target, llvm::Module& m, llvm::raw_fd_ostream& Out); |
849
ba390e5e9150
Remove unportable env-sanitizing code. If it is really needed, it needs to be
Christian Kamm <kamm incasoftware de>
parents:
824
diff
changeset
|
70 void assemble(const llvm::sys::Path& asmpath, const llvm::sys::Path& objpath); |
674
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
71 |
125 | 72 ////////////////////////////////////////////////////////////////////////////////////////// |
73 | |
1147
dbe4af57b240
Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1146
diff
changeset
|
74 llvm::Module* Module::genLLVMModule(Ir* sir) |
1 | 75 { |
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 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
|
77 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
|
78 { |
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
|
79 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
|
80 } |
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
|
81 |
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
|
82 Logger::println("Generating module: %s\n", (md ? md->toChars() : toChars())); |
1 | 83 LOG_SCOPE; |
84 | |
1364
46f6365a50d7
Added IrTypeFunction and IrTypeDelegate and eliminated IrDType. This means the Type::ir field can be removed. It's the final part needed for the move to a slightly more sane type system. Now the whole thing just needs to be cleaned up :P
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1341
diff
changeset
|
85 if (global.params.verbose_cg) |
46f6365a50d7
Added IrTypeFunction and IrTypeDelegate and eliminated IrDType. This means the Type::ir field can be removed. It's the final part needed for the move to a slightly more sane type system. Now the whole thing just needs to be cleaned up :P
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1341
diff
changeset
|
86 printf("codegen: %s (%s)\n", toPrettyChars(), 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
|
87 |
797
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
766
diff
changeset
|
88 assert(!global.errors); |
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
766
diff
changeset
|
89 |
946
1714836f2c0b
Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents:
945
diff
changeset
|
90 // name the module |
1714836f2c0b
Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents:
945
diff
changeset
|
91 std::string mname(toChars()); |
1714836f2c0b
Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents:
945
diff
changeset
|
92 if (md != 0) |
1714836f2c0b
Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents:
945
diff
changeset
|
93 mname = md->toChars(); |
1714836f2c0b
Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents:
945
diff
changeset
|
94 |
18 | 95 // 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
|
96 // TODO look at making the instance static and moving most functionality into IrModule where it belongs |
1521
982eb70e83b2
Fix build for LLVM >= r74640
Benjamin Kramer <benny.kra@gmail.com>
parents:
1502
diff
changeset
|
97 IRState ir(new llvm::Module(mname, llvm::getGlobalContext())); |
1 | 98 gIR = &ir; |
99 ir.dmodule = this; | |
100 | |
1247
2a92c115461d
Disabled resetting types between modules MAO (more at once). Fixes guaranteed MOA compilation segfault.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1241
diff
changeset
|
101 // reset all IR data stored in Dsymbols |
173
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
102 IrDsymbol::resetAll(); |
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
103 |
1147
dbe4af57b240
Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1146
diff
changeset
|
104 sir->setState(&ir); |
dbe4af57b240
Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1146
diff
changeset
|
105 |
988
2667e3a145be
- Fixed LLVM style CL args for D2.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
986
diff
changeset
|
106 // set target triple |
699
ed9a9e6dd1cc
Started changing target triple stuff, part of fixing #97
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
694
diff
changeset
|
107 ir.module->setTargetTriple(global.params.targetTriple); |
735
eee9efe5b51f
Attempt at getting LLVM to provide a proper target data layout. Should assert now if things are borked.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
733
diff
changeset
|
108 |
eee9efe5b51f
Attempt at getting LLVM to provide a proper target data layout. Should assert now if things are borked.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
733
diff
changeset
|
109 // set final data layout |
988
2667e3a145be
- Fixed LLVM style CL args for D2.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
986
diff
changeset
|
110 ir.module->setDataLayout(global.params.dataLayout); |
735
eee9efe5b51f
Attempt at getting LLVM to provide a proper target data layout. Should assert now if things are borked.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
733
diff
changeset
|
111 if (Logger::enabled()) |
988
2667e3a145be
- Fixed LLVM style CL args for D2.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
986
diff
changeset
|
112 Logger::cout() << "Final data layout: " << global.params.dataLayout << '\n'; |
2667e3a145be
- Fixed LLVM style CL args for D2.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
986
diff
changeset
|
113 |
2667e3a145be
- Fixed LLVM style CL args for D2.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
986
diff
changeset
|
114 // allocate the target abi |
2667e3a145be
- Fixed LLVM style CL args for D2.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
986
diff
changeset
|
115 gABI = TargetABI::getTarget(); |
1 | 116 |
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
|
117 // 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
|
118 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
|
119 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
|
120 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
|
121 } |
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
|
122 |
758
f04dde6e882c
Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
751
diff
changeset
|
123 // handle invalid 'objectø module |
f04dde6e882c
Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
751
diff
changeset
|
124 if (!ClassDeclaration::object) { |
f04dde6e882c
Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
751
diff
changeset
|
125 error("is missing 'class Object'"); |
f04dde6e882c
Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
751
diff
changeset
|
126 fatal(); |
f04dde6e882c
Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
751
diff
changeset
|
127 } |
f04dde6e882c
Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
751
diff
changeset
|
128 if (!ClassDeclaration::classinfo) { |
f04dde6e882c
Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
751
diff
changeset
|
129 error("is missing 'class ClassInfo'"); |
f04dde6e882c
Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
751
diff
changeset
|
130 fatal(); |
f04dde6e882c
Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
751
diff
changeset
|
131 } |
1161
f528e55fb32f
Force initialize the runtime module in Module::genLLVMModule. It is required
Christian Kamm <kamm incasoftware de>
parents:
1148
diff
changeset
|
132 |
f528e55fb32f
Force initialize the runtime module in Module::genLLVMModule. It is required
Christian Kamm <kamm incasoftware de>
parents:
1148
diff
changeset
|
133 LLVM_D_InitRuntime(); |
758
f04dde6e882c
Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
751
diff
changeset
|
134 |
6 | 135 // process module members |
1 | 136 for (int k=0; k < members->dim; k++) { |
137 Dsymbol* dsym = (Dsymbol*)(members->data[k]); | |
138 assert(dsym); | |
1147
dbe4af57b240
Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1146
diff
changeset
|
139 dsym->codegen(sir); |
1 | 140 } |
141 | |
1163
ea52660f828b
Emit function bodies before generating the module info to make sure static
Christian Kamm <kamm incasoftware de>
parents:
1161
diff
changeset
|
142 // emit function bodies |
ea52660f828b
Emit function bodies before generating the module info to make sure static
Christian Kamm <kamm incasoftware de>
parents:
1161
diff
changeset
|
143 sir->emitFunctionBodies(); |
ea52660f828b
Emit function bodies before generating the module info to make sure static
Christian Kamm <kamm incasoftware de>
parents:
1161
diff
changeset
|
144 |
1478
4dca8ed9d8b7
Fix #318 by making a list of all seen template instances in a module for
Christian Kamm <kamm incasoftware de>
parents:
1467
diff
changeset
|
145 // for singleobj-compilation, fully emit all seen template instances |
4dca8ed9d8b7
Fix #318 by making a list of all seen template instances in a module for
Christian Kamm <kamm incasoftware de>
parents:
1467
diff
changeset
|
146 if (opts::singleObj) |
4dca8ed9d8b7
Fix #318 by making a list of all seen template instances in a module for
Christian Kamm <kamm incasoftware de>
parents:
1467
diff
changeset
|
147 { |
4dca8ed9d8b7
Fix #318 by making a list of all seen template instances in a module for
Christian Kamm <kamm incasoftware de>
parents:
1467
diff
changeset
|
148 while (!ir.seenTemplateInstances.empty()) |
4dca8ed9d8b7
Fix #318 by making a list of all seen template instances in a module for
Christian Kamm <kamm incasoftware de>
parents:
1467
diff
changeset
|
149 { |
4dca8ed9d8b7
Fix #318 by making a list of all seen template instances in a module for
Christian Kamm <kamm incasoftware de>
parents:
1467
diff
changeset
|
150 IRState::TemplateInstanceSet::iterator it, end = ir.seenTemplateInstances.end(); |
4dca8ed9d8b7
Fix #318 by making a list of all seen template instances in a module for
Christian Kamm <kamm incasoftware de>
parents:
1467
diff
changeset
|
151 for (it = ir.seenTemplateInstances.begin(); it != end; ++it) |
4dca8ed9d8b7
Fix #318 by making a list of all seen template instances in a module for
Christian Kamm <kamm incasoftware de>
parents:
1467
diff
changeset
|
152 (*it)->codegen(sir); |
4dca8ed9d8b7
Fix #318 by making a list of all seen template instances in a module for
Christian Kamm <kamm incasoftware de>
parents:
1467
diff
changeset
|
153 ir.seenTemplateInstances.clear(); |
4dca8ed9d8b7
Fix #318 by making a list of all seen template instances in a module for
Christian Kamm <kamm incasoftware de>
parents:
1467
diff
changeset
|
154 |
4dca8ed9d8b7
Fix #318 by making a list of all seen template instances in a module for
Christian Kamm <kamm incasoftware de>
parents:
1467
diff
changeset
|
155 // emit any newly added function bodies |
4dca8ed9d8b7
Fix #318 by making a list of all seen template instances in a module for
Christian Kamm <kamm incasoftware de>
parents:
1467
diff
changeset
|
156 sir->emitFunctionBodies(); |
4dca8ed9d8b7
Fix #318 by making a list of all seen template instances in a module for
Christian Kamm <kamm incasoftware de>
parents:
1467
diff
changeset
|
157 } |
4dca8ed9d8b7
Fix #318 by making a list of all seen template instances in a module for
Christian Kamm <kamm incasoftware de>
parents:
1467
diff
changeset
|
158 } |
4dca8ed9d8b7
Fix #318 by making a list of all seen template instances in a module for
Christian Kamm <kamm incasoftware de>
parents:
1467
diff
changeset
|
159 |
89 | 160 // generate ModuleInfo |
1241
fc579f389f9a
!ClassInfo instances were not mutable, this is necessary for .classinfo based locking to work. !ModuleInfo generation was commented out as well.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1228
diff
changeset
|
161 genmoduleinfo(); |
89 | 162 |
250
fc9c1a0eabbd
[svn r267] Fixed debug info for global variables.
lindquist
parents:
248
diff
changeset
|
163 // 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
|
164 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
|
165 { |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
166 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
|
167 LLConstant* usedInit = LLConstantArray::get(usedTy, ir.usedArray); |
1529
ad7f2f1862d6
Adjust LDC to work with the LLVMContext LLVM changes.
Christian Kamm <kamm incasoftware de>
parents:
1521
diff
changeset
|
168 LLGlobalVariable* usedArray = new LLGlobalVariable(*ir.module, usedTy, true, LLGlobalValue::AppendingLinkage, usedInit, "llvm.used"); |
323
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
169 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
|
170 } |
250
fc9c1a0eabbd
[svn r267] Fixed debug info for global variables.
lindquist
parents:
248
diff
changeset
|
171 |
6 | 172 // verify the llvm |
986
a8cb25d478c4
Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents:
951
diff
changeset
|
173 if (!noVerify) { |
31
2841234d2aea
[svn r35] * Attributes on struct fields/methods now work
lindquist
parents:
28
diff
changeset
|
174 std::string verifyErr; |
2841234d2aea
[svn r35] * Attributes on struct fields/methods now work
lindquist
parents:
28
diff
changeset
|
175 Logger::println("Verifying module..."); |
117 | 176 LOG_SCOPE; |
31
2841234d2aea
[svn r35] * Attributes on struct fields/methods now work
lindquist
parents:
28
diff
changeset
|
177 if (llvm::verifyModule(*ir.module,llvm::ReturnStatusAction,&verifyErr)) |
2841234d2aea
[svn r35] * Attributes on struct fields/methods now work
lindquist
parents:
28
diff
changeset
|
178 { |
2841234d2aea
[svn r35] * Attributes on struct fields/methods now work
lindquist
parents:
28
diff
changeset
|
179 error("%s", verifyErr.c_str()); |
2841234d2aea
[svn r35] * Attributes on struct fields/methods now work
lindquist
parents:
28
diff
changeset
|
180 fatal(); |
2841234d2aea
[svn r35] * Attributes on struct fields/methods now work
lindquist
parents:
28
diff
changeset
|
181 } |
2841234d2aea
[svn r35] * Attributes on struct fields/methods now work
lindquist
parents:
28
diff
changeset
|
182 else { |
2841234d2aea
[svn r35] * Attributes on struct fields/methods now work
lindquist
parents:
28
diff
changeset
|
183 Logger::println("Verification passed!"); |
2841234d2aea
[svn r35] * Attributes on struct fields/methods now work
lindquist
parents:
28
diff
changeset
|
184 } |
1 | 185 } |
186 | |
1052
12ea38902e83
Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents:
1026
diff
changeset
|
187 gIR = NULL; |
1147
dbe4af57b240
Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1146
diff
changeset
|
188 |
1052
12ea38902e83
Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents:
1026
diff
changeset
|
189 if (llvmForceLogging && !logenabled) |
12ea38902e83
Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents:
1026
diff
changeset
|
190 { |
12ea38902e83
Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents:
1026
diff
changeset
|
191 Logger::disable(); |
12ea38902e83
Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents:
1026
diff
changeset
|
192 } |
1147
dbe4af57b240
Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1146
diff
changeset
|
193 |
dbe4af57b240
Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1146
diff
changeset
|
194 sir->setState(NULL); |
dbe4af57b240
Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1146
diff
changeset
|
195 |
1052
12ea38902e83
Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents:
1026
diff
changeset
|
196 return ir.module; |
12ea38902e83
Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents:
1026
diff
changeset
|
197 } |
12ea38902e83
Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents:
1026
diff
changeset
|
198 |
12ea38902e83
Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents:
1026
diff
changeset
|
199 void writeModule(llvm::Module* m, std::string filename) |
12ea38902e83
Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents:
1026
diff
changeset
|
200 { |
125 | 201 // run optimizer |
1170
e40c65bd8c5d
Allow specific optimization passes to be requested from the command line.
Frits van Bommel <fvbommel wxs.nl>
parents:
1163
diff
changeset
|
202 bool reverify = ldc_optimize_module(m); |
1 | 203 |
605
e235b80c92bc
Removed useless assert in ArrayLiteralExp::toConstElem
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
583
diff
changeset
|
204 // verify the llvm |
1170
e40c65bd8c5d
Allow specific optimization passes to be requested from the command line.
Frits van Bommel <fvbommel wxs.nl>
parents:
1163
diff
changeset
|
205 if (!noVerify && reverify) { |
605
e235b80c92bc
Removed useless assert in ArrayLiteralExp::toConstElem
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
583
diff
changeset
|
206 std::string verifyErr; |
e235b80c92bc
Removed useless assert in ArrayLiteralExp::toConstElem
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
583
diff
changeset
|
207 Logger::println("Verifying module... again..."); |
e235b80c92bc
Removed useless assert in ArrayLiteralExp::toConstElem
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
583
diff
changeset
|
208 LOG_SCOPE; |
1052
12ea38902e83
Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents:
1026
diff
changeset
|
209 if (llvm::verifyModule(*m,llvm::ReturnStatusAction,&verifyErr)) |
605
e235b80c92bc
Removed useless assert in ArrayLiteralExp::toConstElem
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
583
diff
changeset
|
210 { |
1052
12ea38902e83
Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents:
1026
diff
changeset
|
211 //error("%s", verifyErr.c_str()); |
605
e235b80c92bc
Removed useless assert in ArrayLiteralExp::toConstElem
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
583
diff
changeset
|
212 fatal(); |
e235b80c92bc
Removed useless assert in ArrayLiteralExp::toConstElem
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
583
diff
changeset
|
213 } |
e235b80c92bc
Removed useless assert in ArrayLiteralExp::toConstElem
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
583
diff
changeset
|
214 else { |
e235b80c92bc
Removed useless assert in ArrayLiteralExp::toConstElem
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
583
diff
changeset
|
215 Logger::println("Verification passed!"); |
e235b80c92bc
Removed useless assert in ArrayLiteralExp::toConstElem
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
583
diff
changeset
|
216 } |
e235b80c92bc
Removed useless assert in ArrayLiteralExp::toConstElem
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
583
diff
changeset
|
217 } |
e235b80c92bc
Removed useless assert in ArrayLiteralExp::toConstElem
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
583
diff
changeset
|
218 |
217
0806379a5eca
[svn r233] Added: -oq command line option for writing fully qualified object names.
lindquist
parents:
213
diff
changeset
|
219 // 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
|
220 typedef llvm::sys::Path LLPath; |
0806379a5eca
[svn r233] Added: -oq command line option for writing fully qualified object names.
lindquist
parents:
213
diff
changeset
|
221 |
675
bfe5229f9d8e
Disable bc output by default. Remove -dis. Add -output-bc, -output-ll, -output-s.
Christian Kamm <kamm incasoftware de>
parents:
674
diff
changeset
|
222 // write LLVM bitcode |
bfe5229f9d8e
Disable bc output by default. Remove -dis. Add -output-bc, -output-ll, -output-s.
Christian Kamm <kamm incasoftware de>
parents:
674
diff
changeset
|
223 if (global.params.output_bc) { |
1052
12ea38902e83
Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents:
1026
diff
changeset
|
224 LLPath bcpath = LLPath(filename); |
675
bfe5229f9d8e
Disable bc output by default. Remove -dis. Add -output-bc, -output-ll, -output-s.
Christian Kamm <kamm incasoftware de>
parents:
674
diff
changeset
|
225 bcpath.eraseSuffix(); |
bfe5229f9d8e
Disable bc output by default. Remove -dis. Add -output-bc, -output-ll, -output-s.
Christian Kamm <kamm incasoftware de>
parents:
674
diff
changeset
|
226 bcpath.appendSuffix(std::string(global.bc_ext)); |
393
a3f3c2770a0d
Added bitcode filename to very verbose logging.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
363
diff
changeset
|
227 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
|
228 std::ofstream bos(bcpath.c_str(), std::ios::binary); |
1380
98d435fa2a2d
Added error messages when failed to open files for .bc and .ll output, instead of just trying to write to the stream, pretty similar to the #281 problem.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1379
diff
changeset
|
229 if (bos.fail()) |
98d435fa2a2d
Added error messages when failed to open files for .bc and .ll output, instead of just trying to write to the stream, pretty similar to the #281 problem.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1379
diff
changeset
|
230 { |
98d435fa2a2d
Added error messages when failed to open files for .bc and .ll output, instead of just trying to write to the stream, pretty similar to the #281 problem.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1379
diff
changeset
|
231 error("cannot write LLVM bitcode, failed to open file '%s'", bcpath.c_str()); |
98d435fa2a2d
Added error messages when failed to open files for .bc and .ll output, instead of just trying to write to the stream, pretty similar to the #281 problem.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1379
diff
changeset
|
232 fatal(); |
98d435fa2a2d
Added error messages when failed to open files for .bc and .ll output, instead of just trying to write to the stream, pretty similar to the #281 problem.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1379
diff
changeset
|
233 } |
1052
12ea38902e83
Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents:
1026
diff
changeset
|
234 llvm::WriteBitcodeToFile(m, bos); |
52 | 235 } |
1 | 236 |
675
bfe5229f9d8e
Disable bc output by default. Remove -dis. Add -output-bc, -output-ll, -output-s.
Christian Kamm <kamm incasoftware de>
parents:
674
diff
changeset
|
237 // write LLVM IR |
bfe5229f9d8e
Disable bc output by default. Remove -dis. Add -output-bc, -output-ll, -output-s.
Christian Kamm <kamm incasoftware de>
parents:
674
diff
changeset
|
238 if (global.params.output_ll) { |
1052
12ea38902e83
Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents:
1026
diff
changeset
|
239 LLPath llpath = LLPath(filename); |
675
bfe5229f9d8e
Disable bc output by default. Remove -dis. Add -output-bc, -output-ll, -output-s.
Christian Kamm <kamm incasoftware de>
parents:
674
diff
changeset
|
240 llpath.eraseSuffix(); |
bfe5229f9d8e
Disable bc output by default. Remove -dis. Add -output-bc, -output-ll, -output-s.
Christian Kamm <kamm incasoftware de>
parents:
674
diff
changeset
|
241 llpath.appendSuffix(std::string(global.ll_ext)); |
580
7824c21a58e3
Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents:
565
diff
changeset
|
242 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
|
243 std::ofstream aos(llpath.c_str()); |
1380
98d435fa2a2d
Added error messages when failed to open files for .bc and .ll output, instead of just trying to write to the stream, pretty similar to the #281 problem.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1379
diff
changeset
|
244 if (aos.fail()) |
98d435fa2a2d
Added error messages when failed to open files for .bc and .ll output, instead of just trying to write to the stream, pretty similar to the #281 problem.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1379
diff
changeset
|
245 { |
98d435fa2a2d
Added error messages when failed to open files for .bc and .ll output, instead of just trying to write to the stream, pretty similar to the #281 problem.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1379
diff
changeset
|
246 error("cannot write LLVM asm, failed to open file '%s'", llpath.c_str()); |
98d435fa2a2d
Added error messages when failed to open files for .bc and .ll output, instead of just trying to write to the stream, pretty similar to the #281 problem.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1379
diff
changeset
|
247 fatal(); |
98d435fa2a2d
Added error messages when failed to open files for .bc and .ll output, instead of just trying to write to the stream, pretty similar to the #281 problem.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1379
diff
changeset
|
248 } |
1052
12ea38902e83
Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents:
1026
diff
changeset
|
249 m->print(aos, NULL); |
52 | 250 } |
1 | 251 |
675
bfe5229f9d8e
Disable bc output by default. Remove -dis. Add -output-bc, -output-ll, -output-s.
Christian Kamm <kamm incasoftware de>
parents:
674
diff
changeset
|
252 // write native assembly |
694
931333ea35c6
Allow output of only bc, ll, or s by making -of set the output type depending
Christian Kamm <kamm incasoftware de>
parents:
689
diff
changeset
|
253 if (global.params.output_s || global.params.output_o) { |
1052
12ea38902e83
Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents:
1026
diff
changeset
|
254 LLPath spath = LLPath(filename); |
694
931333ea35c6
Allow output of only bc, ll, or s by making -of set the output type depending
Christian Kamm <kamm incasoftware de>
parents:
689
diff
changeset
|
255 spath.eraseSuffix(); |
931333ea35c6
Allow output of only bc, ll, or s by making -of set the output type depending
Christian Kamm <kamm incasoftware de>
parents:
689
diff
changeset
|
256 spath.appendSuffix(std::string(global.s_ext)); |
931333ea35c6
Allow output of only bc, ll, or s by making -of set the output type depending
Christian Kamm <kamm incasoftware de>
parents:
689
diff
changeset
|
257 if (!global.params.output_s) { |
931333ea35c6
Allow output of only bc, ll, or s by making -of set the output type depending
Christian Kamm <kamm incasoftware de>
parents:
689
diff
changeset
|
258 spath.createTemporaryFileOnDisk(); |
931333ea35c6
Allow output of only bc, ll, or s by making -of set the output type depending
Christian Kamm <kamm incasoftware de>
parents:
689
diff
changeset
|
259 } |
931333ea35c6
Allow output of only bc, ll, or s by making -of set the output type depending
Christian Kamm <kamm incasoftware de>
parents:
689
diff
changeset
|
260 Logger::println("Writing native asm to: %s\n", spath.c_str()); |
931333ea35c6
Allow output of only bc, ll, or s by making -of set the output type depending
Christian Kamm <kamm incasoftware de>
parents:
689
diff
changeset
|
261 std::string err; |
931333ea35c6
Allow output of only bc, ll, or s by making -of set the output type depending
Christian Kamm <kamm incasoftware de>
parents:
689
diff
changeset
|
262 { |
945
03d7c4aac654
SWITCHED TO LLVM 2.5 !
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
936
diff
changeset
|
263 llvm::raw_fd_ostream out(spath.c_str(), false, err); |
1379
d430a41fbb45
Add error message when failed to open output stream for native asm output. Fixes ticket #281 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1364
diff
changeset
|
264 if (err.empty()) |
d430a41fbb45
Add error message when failed to open output stream for native asm output. Fixes ticket #281 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1364
diff
changeset
|
265 { |
d430a41fbb45
Add error message when failed to open output stream for native asm output. Fixes ticket #281 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1364
diff
changeset
|
266 write_asm_to_file(*gTargetMachine, *m, out); |
d430a41fbb45
Add error message when failed to open output stream for native asm output. Fixes ticket #281 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1364
diff
changeset
|
267 } |
d430a41fbb45
Add error message when failed to open output stream for native asm output. Fixes ticket #281 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1364
diff
changeset
|
268 else |
d430a41fbb45
Add error message when failed to open output stream for native asm output. Fixes ticket #281 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1364
diff
changeset
|
269 { |
d430a41fbb45
Add error message when failed to open output stream for native asm output. Fixes ticket #281 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1364
diff
changeset
|
270 error("cannot write native asm: %s", err.c_str()); |
d430a41fbb45
Add error message when failed to open output stream for native asm output. Fixes ticket #281 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1364
diff
changeset
|
271 fatal(); |
d430a41fbb45
Add error message when failed to open output stream for native asm output. Fixes ticket #281 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1364
diff
changeset
|
272 } |
694
931333ea35c6
Allow output of only bc, ll, or s by making -of set the output type depending
Christian Kamm <kamm incasoftware de>
parents:
689
diff
changeset
|
273 } |
675
bfe5229f9d8e
Disable bc output by default. Remove -dis. Add -output-bc, -output-ll, -output-s.
Christian Kamm <kamm incasoftware de>
parents:
674
diff
changeset
|
274 |
694
931333ea35c6
Allow output of only bc, ll, or s by making -of set the output type depending
Christian Kamm <kamm incasoftware de>
parents:
689
diff
changeset
|
275 // call gcc to convert assembly to object file |
931333ea35c6
Allow output of only bc, ll, or s by making -of set the output type depending
Christian Kamm <kamm incasoftware de>
parents:
689
diff
changeset
|
276 if (global.params.output_o) { |
1052
12ea38902e83
Add '-singleobj' command line switch that will tell LDC to link LLVM modules internally and only emit a single object file.
Christian Kamm <kamm incasoftware de>
parents:
1026
diff
changeset
|
277 LLPath objpath = LLPath(filename); |
849
ba390e5e9150
Remove unportable env-sanitizing code. If it is really needed, it needs to be
Christian Kamm <kamm incasoftware de>
parents:
824
diff
changeset
|
278 assemble(spath, objpath); |
694
931333ea35c6
Allow output of only bc, ll, or s by making -of set the output type depending
Christian Kamm <kamm incasoftware de>
parents:
689
diff
changeset
|
279 } |
675
bfe5229f9d8e
Disable bc output by default. Remove -dis. Add -output-bc, -output-ll, -output-s.
Christian Kamm <kamm incasoftware de>
parents:
674
diff
changeset
|
280 |
694
931333ea35c6
Allow output of only bc, ll, or s by making -of set the output type depending
Christian Kamm <kamm incasoftware de>
parents:
689
diff
changeset
|
281 if (!global.params.output_s) { |
931333ea35c6
Allow output of only bc, ll, or s by making -of set the output type depending
Christian Kamm <kamm incasoftware de>
parents:
689
diff
changeset
|
282 spath.eraseFromDisk(); |
931333ea35c6
Allow output of only bc, ll, or s by making -of set the output type depending
Christian Kamm <kamm incasoftware de>
parents:
689
diff
changeset
|
283 } |
673
37a7688a7494
Add basics for direct assembly output.
Christian Kamm <kamm incasoftware de>
parents:
663
diff
changeset
|
284 } |
1 | 285 } |
286 | |
287 /* ================================================================== */ | |
288 | |
676
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
289 // based on llc code, University of Illinois Open Source License |
699
ed9a9e6dd1cc
Started changing target triple stuff, part of fixing #97
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
694
diff
changeset
|
290 void write_asm_to_file(llvm::TargetMachine &Target, llvm::Module& m, llvm::raw_fd_ostream& out) |
674
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
291 { |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
292 using namespace llvm; |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
293 |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
294 // 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
|
295 ExistingModuleProvider Provider(&m); |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
296 FunctionPassManager Passes(&Provider); |
699
ed9a9e6dd1cc
Started changing target triple stuff, part of fixing #97
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
694
diff
changeset
|
297 |
674
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
298 Passes.add(new TargetData(*Target.getTargetData())); |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
299 |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
300 // 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
|
301 MachineCodeEmitter *MCE = 0; |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
302 |
1280
00a307a393f2
Now the backend wants an enum value as optimization level.
Frits van Bommel <fvbommel wxs.nl>
parents:
1276
diff
changeset
|
303 // Last argument is enum CodeGenOpt::Level OptLevel |
00a307a393f2
Now the backend wants an enum value as optimization level.
Frits van Bommel <fvbommel wxs.nl>
parents:
1276
diff
changeset
|
304 // debug info doesn't work properly with OptLevel != None! |
00a307a393f2
Now the backend wants an enum value as optimization level.
Frits van Bommel <fvbommel wxs.nl>
parents:
1276
diff
changeset
|
305 CodeGenOpt::Level LastArg = CodeGenOpt::Default; |
1341
681dd955c53b
Run backend without optimizations when no optimization parameters were used,
Frits van Bommel <fvbommel wxs.nl>
parents:
1299
diff
changeset
|
306 if (global.params.symdebug || !optimize()) |
1280
00a307a393f2
Now the backend wants an enum value as optimization level.
Frits van Bommel <fvbommel wxs.nl>
parents:
1276
diff
changeset
|
307 LastArg = CodeGenOpt::None; |
00a307a393f2
Now the backend wants an enum value as optimization level.
Frits van Bommel <fvbommel wxs.nl>
parents:
1276
diff
changeset
|
308 else if (optLevel() >= 3) |
00a307a393f2
Now the backend wants an enum value as optimization level.
Frits van Bommel <fvbommel wxs.nl>
parents:
1276
diff
changeset
|
309 LastArg = CodeGenOpt::Aggressive; |
1532
c88b16d4a13c
Remove all of the now unecessary #if LLVM_REV
Benjamin Kramer <benny.kra@gmail.com>
parents:
1529
diff
changeset
|
310 |
1276
fa20726fe074
Update codegen to (hopefully) work correctly with newer LLVM trunk, where
Frits van Bommel <fvbommel wxs.nl>
parents:
1271
diff
changeset
|
311 FileModel::Model mod = Target.addPassesToEmitFile(Passes, out, TargetMachine::AssemblyFile, LastArg); |
674
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
312 assert(mod == FileModel::AsmFile); |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
313 |
1276
fa20726fe074
Update codegen to (hopefully) work correctly with newer LLVM trunk, where
Frits van Bommel <fvbommel wxs.nl>
parents:
1271
diff
changeset
|
314 bool err = Target.addPassesToEmitFileFinish(Passes, MCE, LastArg); |
674
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
315 assert(!err); |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
316 |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
317 Passes.doInitialization(); |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
318 |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
319 // 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
|
320 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
|
321 if (!I->isDeclaration()) |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
322 Passes.run(*I); |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
323 |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
324 Passes.doFinalization(); |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
325 |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
326 // release module from module provider so we can delete it ourselves |
699
ed9a9e6dd1cc
Started changing target triple stuff, part of fixing #97
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
694
diff
changeset
|
327 std::string Err; |
674
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
328 llvm::Module* rmod = Provider.releaseModule(&Err); |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
329 assert(rmod); |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
330 } |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
331 |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
332 /* ================================================================== */ |
db6a7e574cbd
Move to separate function and cleanup.
Christian Kamm <kamm incasoftware de>
parents:
673
diff
changeset
|
333 |
676
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
334 // uses gcc to make an obj out of an assembly file |
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
335 // based on llvm-ld code, University of Illinois Open Source License |
849
ba390e5e9150
Remove unportable env-sanitizing code. If it is really needed, it needs to be
Christian Kamm <kamm incasoftware de>
parents:
824
diff
changeset
|
336 void assemble(const llvm::sys::Path& asmpath, const llvm::sys::Path& objpath) |
676
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
337 { |
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
338 using namespace llvm; |
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
339 |
1299
847b767b2d0b
Factor out the code to find gcc, and add a command-line option to override the
Frits van Bommel <fvbommel wxs.nl>
parents:
1280
diff
changeset
|
340 sys::Path gcc = getGcc(); |
676
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
341 |
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
342 // Run GCC to assemble and link the program into native code. |
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
343 // |
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
344 // Note: |
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
345 // We can't just assemble and link the file with the system assembler |
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
346 // and linker because we don't know where to put the _start symbol. |
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
347 // GCC mysteriously knows how to do it. |
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
348 std::vector<std::string> args; |
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
349 args.push_back(gcc.toString()); |
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
350 args.push_back("-fno-strict-aliasing"); |
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
351 args.push_back("-O3"); |
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
352 args.push_back("-c"); |
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
353 args.push_back("-xassembler"); |
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
354 args.push_back(asmpath.toString()); |
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
355 args.push_back("-o"); |
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
356 args.push_back(objpath.toString()); |
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
357 |
677
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
676
diff
changeset
|
358 //FIXME: only use this if needed? |
075c1272a01d
Link using gcc instead.
Christian Kamm <kamm incasoftware de>
parents:
676
diff
changeset
|
359 args.push_back("-fpic"); |
676
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
360 |
902
893d72ab95d0
Add -m64 switch to gcc calls on 64-bit platforms.
Christian Kamm <kamm incasoftware de>
parents:
890
diff
changeset
|
361 //FIXME: enforce 64 bit |
893d72ab95d0
Add -m64 switch to gcc calls on 64-bit platforms.
Christian Kamm <kamm incasoftware de>
parents:
890
diff
changeset
|
362 if (global.params.is64bit) |
893d72ab95d0
Add -m64 switch to gcc calls on 64-bit platforms.
Christian Kamm <kamm incasoftware de>
parents:
890
diff
changeset
|
363 args.push_back("-m64"); |
1026
f756c47f310a
Pass -m32/-m64 on to gcc when assembling and linking
Frits van Bommel <fvbommel wxs.nl>
parents:
1005
diff
changeset
|
364 else |
f756c47f310a
Pass -m32/-m64 on to gcc when assembling and linking
Frits van Bommel <fvbommel wxs.nl>
parents:
1005
diff
changeset
|
365 // Assume 32-bit? |
f756c47f310a
Pass -m32/-m64 on to gcc when assembling and linking
Frits van Bommel <fvbommel wxs.nl>
parents:
1005
diff
changeset
|
366 args.push_back("-m32"); |
902
893d72ab95d0
Add -m64 switch to gcc calls on 64-bit platforms.
Christian Kamm <kamm incasoftware de>
parents:
890
diff
changeset
|
367 |
676
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
368 // Now that "args" owns all the std::strings for the arguments, call the c_str |
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
369 // method to get the underlying string array. We do this game so that the |
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
370 // std::string array is guaranteed to outlive the const char* array. |
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
371 std::vector<const char *> Args; |
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
372 for (unsigned i = 0, e = args.size(); i != e; ++i) |
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
373 Args.push_back(args[i].c_str()); |
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
374 Args.push_back(0); |
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
375 |
994
18ad5601dff7
Use LLVM OStream wrapper instead of <iostream> in the logger.
Frits van Bommel <fvbommel wxs.nl>
parents:
993
diff
changeset
|
376 if (Logger::enabled()) { |
18ad5601dff7
Use LLVM OStream wrapper instead of <iostream> in the logger.
Frits van Bommel <fvbommel wxs.nl>
parents:
993
diff
changeset
|
377 Logger::println("Assembling with: "); |
18ad5601dff7
Use LLVM OStream wrapper instead of <iostream> in the logger.
Frits van Bommel <fvbommel wxs.nl>
parents:
993
diff
changeset
|
378 std::vector<const char*>::const_iterator I = Args.begin(), E = Args.end(); |
1502
2292878925f4
Add an `llvm::OStream` workalike class for use with `Logger::cout()`, with the
Frits van Bommel <fvbommel wxs.nl>
parents:
1478
diff
changeset
|
379 Stream logstr = Logger::cout(); |
994
18ad5601dff7
Use LLVM OStream wrapper instead of <iostream> in the logger.
Frits van Bommel <fvbommel wxs.nl>
parents:
993
diff
changeset
|
380 for (; I != E; ++I) |
18ad5601dff7
Use LLVM OStream wrapper instead of <iostream> in the logger.
Frits van Bommel <fvbommel wxs.nl>
parents:
993
diff
changeset
|
381 if (*I) |
18ad5601dff7
Use LLVM OStream wrapper instead of <iostream> in the logger.
Frits van Bommel <fvbommel wxs.nl>
parents:
993
diff
changeset
|
382 logstr << "'" << *I << "'" << " "; |
18ad5601dff7
Use LLVM OStream wrapper instead of <iostream> in the logger.
Frits van Bommel <fvbommel wxs.nl>
parents:
993
diff
changeset
|
383 logstr << "\n" << std::flush; |
18ad5601dff7
Use LLVM OStream wrapper instead of <iostream> in the logger.
Frits van Bommel <fvbommel wxs.nl>
parents:
993
diff
changeset
|
384 } |
676
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
385 |
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
386 // Run the compiler to assembly the program. |
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
387 std::string ErrMsg; |
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
388 int R = sys::Program::ExecuteAndWait( |
849
ba390e5e9150
Remove unportable env-sanitizing code. If it is really needed, it needs to be
Christian Kamm <kamm incasoftware de>
parents:
824
diff
changeset
|
389 gcc, &Args[0], 0, 0, 0, 0, &ErrMsg); |
814
05f2651caa6c
Added error when invoking gcc fails
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
811
diff
changeset
|
390 if (R) |
05f2651caa6c
Added error when invoking gcc fails
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
811
diff
changeset
|
391 { |
1062
b9f9bde1707e
Make error message on assembler failure more informative (hopefully)
Frits van Bommel <fvbommel wxs.nl>
parents:
1052
diff
changeset
|
392 error("Failed to invoke gcc. %s", ErrMsg.c_str()); |
814
05f2651caa6c
Added error when invoking gcc fails
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
811
diff
changeset
|
393 fatal(); |
05f2651caa6c
Added error when invoking gcc fails
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
811
diff
changeset
|
394 } |
676
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
395 } |
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
396 |
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
397 |
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
398 /* ================================================================== */ |
686
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
399 |
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
400 // the following code generates functions and needs to output |
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
401 // debug info. these macros are useful for that |
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
402 #define DBG_TYPE ( getPtrToType(llvm::StructType::get(NULL,NULL)) ) |
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
403 #define DBG_CAST(X) ( llvm::ConstantExpr::getBitCast(X, DBG_TYPE) ) |
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
404 |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
405 // build module ctor |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
406 |
676
1f0a78174598
Make ldc call gcc to assemble.
Christian Kamm <kamm incasoftware de>
parents:
675
diff
changeset
|
407 llvm::Function* build_module_ctor() |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
408 { |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
409 if (gIR->ctors.empty()) |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
410 return NULL; |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
411 |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
412 size_t n = gIR->ctors.size(); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
413 if (n == 1) |
173
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
414 return gIR->ctors[0]->ir.irFunc->func; |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
415 |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
416 std::string name("_D"); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
417 name.append(gIR->dmodule->mangle()); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
418 name.append("6__ctorZ"); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
419 |
213
7816aafeea3c
[svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents:
205
diff
changeset
|
420 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
|
421 const llvm::FunctionType* fnTy = llvm::FunctionType::get(LLType::VoidTy,argsTy,false); |
184 | 422 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
|
423 llvm::Function* fn = llvm::Function::Create(fnTy, llvm::GlobalValue::InternalLinkage, name, gIR->module); |
933
d3a6f1a96731
Replace assertion with errormessage for unsupported calling conventions. like Pascal. See dstress/run/e/extern_10_A.d
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
920
diff
changeset
|
424 fn->setCallingConv(DtoCallingConv(0, LINKd)); |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
425 |
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
|
426 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
|
427 IRBuilder<> builder(bb); |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
428 |
686
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
429 // debug info |
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
430 LLGlobalVariable* subprog; |
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
431 if(global.params.symdebug) { |
946
1714836f2c0b
Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents:
945
diff
changeset
|
432 subprog = DtoDwarfSubProgramInternal(name.c_str(), name.c_str()).getGV(); |
686
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
433 builder.CreateCall(gIR->module->getFunction("llvm.dbg.func.start"), DBG_CAST(subprog)); |
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
434 } |
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
435 |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
436 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
|
437 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
|
438 llvm::CallInst* call = builder.CreateCall(f,""); |
933
d3a6f1a96731
Replace assertion with errormessage for unsupported calling conventions. like Pascal. See dstress/run/e/extern_10_A.d
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
920
diff
changeset
|
439 call->setCallingConv(DtoCallingConv(0, LINKd)); |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
440 } |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
441 |
686
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
442 // debug info end |
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
443 if(global.params.symdebug) |
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
444 builder.CreateCall(gIR->module->getFunction("llvm.dbg.region.end"), DBG_CAST(subprog)); |
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
445 |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
446 builder.CreateRetVoid(); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
447 return fn; |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
448 } |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
449 |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
450 // build module dtor |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
451 |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
452 static llvm::Function* build_module_dtor() |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
453 { |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
454 if (gIR->dtors.empty()) |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
455 return NULL; |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
456 |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
457 size_t n = gIR->dtors.size(); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
458 if (n == 1) |
173
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
459 return gIR->dtors[0]->ir.irFunc->func; |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
460 |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
461 std::string name("_D"); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
462 name.append(gIR->dmodule->mangle()); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
463 name.append("6__dtorZ"); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
464 |
213
7816aafeea3c
[svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents:
205
diff
changeset
|
465 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
|
466 const llvm::FunctionType* fnTy = llvm::FunctionType::get(LLType::VoidTy,argsTy,false); |
184 | 467 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
|
468 llvm::Function* fn = llvm::Function::Create(fnTy, llvm::GlobalValue::InternalLinkage, name, gIR->module); |
933
d3a6f1a96731
Replace assertion with errormessage for unsupported calling conventions. like Pascal. See dstress/run/e/extern_10_A.d
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
920
diff
changeset
|
469 fn->setCallingConv(DtoCallingConv(0, LINKd)); |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
470 |
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
|
471 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
|
472 IRBuilder<> builder(bb); |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
473 |
686
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
474 // debug info |
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
475 LLGlobalVariable* subprog; |
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
476 if(global.params.symdebug) { |
946
1714836f2c0b
Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents:
945
diff
changeset
|
477 subprog = DtoDwarfSubProgramInternal(name.c_str(), name.c_str()).getGV(); |
686
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
478 builder.CreateCall(gIR->module->getFunction("llvm.dbg.func.start"), DBG_CAST(subprog)); |
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
479 } |
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
480 |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
481 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
|
482 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
|
483 llvm::CallInst* call = builder.CreateCall(f,""); |
933
d3a6f1a96731
Replace assertion with errormessage for unsupported calling conventions. like Pascal. See dstress/run/e/extern_10_A.d
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
920
diff
changeset
|
484 call->setCallingConv(DtoCallingConv(0, LINKd)); |
116
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 |
686
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
487 // debug info end |
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
488 if(global.params.symdebug) |
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
489 builder.CreateCall(gIR->module->getFunction("llvm.dbg.region.end"), DBG_CAST(subprog)); |
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
490 |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
491 builder.CreateRetVoid(); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
492 return fn; |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
493 } |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
494 |
121
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
495 // build module unittest |
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
496 |
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
497 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
|
498 { |
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
499 if (gIR->unitTests.empty()) |
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
500 return NULL; |
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
501 |
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
502 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
|
503 if (n == 1) |
173
db9890b3fb64
[svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents:
163
diff
changeset
|
504 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
|
505 |
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
506 std::string name("_D"); |
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
507 name.append(gIR->dmodule->mangle()); |
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
508 name.append("10__unittestZ"); |
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
509 |
213
7816aafeea3c
[svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents:
205
diff
changeset
|
510 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
|
511 const llvm::FunctionType* fnTy = llvm::FunctionType::get(LLType::VoidTy,argsTy,false); |
184 | 512 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
|
513 llvm::Function* fn = llvm::Function::Create(fnTy, llvm::GlobalValue::InternalLinkage, name, gIR->module); |
933
d3a6f1a96731
Replace assertion with errormessage for unsupported calling conventions. like Pascal. See dstress/run/e/extern_10_A.d
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
920
diff
changeset
|
514 fn->setCallingConv(DtoCallingConv(0, LINKd)); |
121
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
515 |
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
|
516 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
|
517 IRBuilder<> builder(bb); |
121
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
518 |
686
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
519 // debug info |
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
520 LLGlobalVariable* subprog; |
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
521 if(global.params.symdebug) { |
946
1714836f2c0b
Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents:
945
diff
changeset
|
522 subprog = DtoDwarfSubProgramInternal(name.c_str(), name.c_str()).getGV(); |
686
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
523 builder.CreateCall(gIR->module->getFunction("llvm.dbg.func.start"), DBG_CAST(subprog)); |
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
524 } |
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
525 |
121
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
526 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
|
527 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
|
528 llvm::CallInst* call = builder.CreateCall(f,""); |
933
d3a6f1a96731
Replace assertion with errormessage for unsupported calling conventions. like Pascal. See dstress/run/e/extern_10_A.d
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
920
diff
changeset
|
529 call->setCallingConv(DtoCallingConv(0, LINKd)); |
121
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
530 } |
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
531 |
686
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
532 // debug info end |
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
533 if(global.params.symdebug) |
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
534 builder.CreateCall(gIR->module->getFunction("llvm.dbg.region.end"), DBG_CAST(subprog)); |
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
535 |
121
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
536 builder.CreateRetVoid(); |
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
537 return fn; |
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
538 } |
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
539 |
323
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
540 // 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
|
541 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
|
542 { |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
543 // 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
|
544 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
|
545 |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
546 // 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
|
547 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
|
548 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
|
549 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
|
550 |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
551 // 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
|
552 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
|
553 |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
554 // 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
|
555 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
|
556 std::vector<LLConstant*> mrefvalues; |
1534
8ca25bd765a3
Build fix for the latest LLVMContext changes (LLVM r75445)
Benjamin Kramer <benny.kra@gmail.com>
parents:
1532
diff
changeset
|
557 mrefvalues.push_back(llvm::getGlobalContext().getNullValue(modulerefTy->getContainedType(0))); |
797
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
766
diff
changeset
|
558 mrefvalues.push_back(llvm::ConstantExpr::getBitCast(moduleinfo, modulerefTy->getContainedType(1))); |
323
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
559 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
|
560 |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
561 // 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
|
562 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
|
563 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
|
564 thismrefname += "11__moduleRefZ"; |
1529
ad7f2f1862d6
Adjust LDC to work with the LLVMContext LLVM changes.
Christian Kamm <kamm incasoftware de>
parents:
1521
diff
changeset
|
565 LLGlobalVariable* thismref = new LLGlobalVariable(*gIR->module, modulerefTy, false, LLGlobalValue::InternalLinkage, thismrefinit, thismrefname); |
323
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
566 |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
567 // 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
|
568 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
|
569 if (!mref) |
1529
ad7f2f1862d6
Adjust LDC to work with the LLVMContext LLVM changes.
Christian Kamm <kamm incasoftware de>
parents:
1521
diff
changeset
|
570 mref = new LLGlobalVariable(*gIR->module, getPtrToType(modulerefTy), false, LLGlobalValue::ExternalLinkage, NULL, "_Dmodule_ref"); |
323
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
571 |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
572 // 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
|
573 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
|
574 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
|
575 |
686
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
576 // debug info |
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
577 LLGlobalVariable* subprog; |
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
578 if(global.params.symdebug) { |
946
1714836f2c0b
Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents:
945
diff
changeset
|
579 subprog = DtoDwarfSubProgramInternal(fname.c_str(), fname.c_str()).getGV(); |
686
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
580 builder.CreateCall(gIR->module->getFunction("llvm.dbg.func.start"), DBG_CAST(subprog)); |
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
581 } |
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
582 |
323
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
583 // 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
|
584 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
|
585 |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
586 // 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
|
587 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
|
588 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
|
589 |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
590 // 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
|
591 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
|
592 |
686
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
593 // debug info end |
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
594 if(global.params.symdebug) |
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
595 builder.CreateCall(gIR->module->getFunction("llvm.dbg.region.end"), DBG_CAST(subprog)); |
363bb6c0cc80
Emit stub debug info for generated functions to work around LLVM bug 2172.
Christian Kamm <kamm incasoftware de>
parents:
683
diff
changeset
|
596 |
323
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
597 // return |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
598 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
|
599 |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
600 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
|
601 } |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
602 |
1 | 603 // Put out instance of ModuleInfo for this Module |
604 | |
605 void Module::genmoduleinfo() | |
606 { | |
811
8e6135be6999
Fixed ModuleInfo generation to no longer use the ModuleInfo class' default initializer for types/defaults, it's unsafe as initializers don't necesarily match the "formal" type. There might be explicit padding.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
810
diff
changeset
|
607 // The layout is: |
8e6135be6999
Fixed ModuleInfo generation to no longer use the ModuleInfo class' default initializer for types/defaults, it's unsafe as initializers don't necesarily match the "formal" type. There might be explicit padding.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
810
diff
changeset
|
608 // { |
8e6135be6999
Fixed ModuleInfo generation to no longer use the ModuleInfo class' default initializer for types/defaults, it's unsafe as initializers don't necesarily match the "formal" type. There might be explicit padding.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
810
diff
changeset
|
609 // char[] name; |
8e6135be6999
Fixed ModuleInfo generation to no longer use the ModuleInfo class' default initializer for types/defaults, it's unsafe as initializers don't necesarily match the "formal" type. There might be explicit padding.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
810
diff
changeset
|
610 // ModuleInfo[] importedModules; |
8e6135be6999
Fixed ModuleInfo generation to no longer use the ModuleInfo class' default initializer for types/defaults, it's unsafe as initializers don't necesarily match the "formal" type. There might be explicit padding.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
810
diff
changeset
|
611 // ClassInfo[] localClasses; |
8e6135be6999
Fixed ModuleInfo generation to no longer use the ModuleInfo class' default initializer for types/defaults, it's unsafe as initializers don't necesarily match the "formal" type. There might be explicit padding.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
810
diff
changeset
|
612 // uint flags; |
8e6135be6999
Fixed ModuleInfo generation to no longer use the ModuleInfo class' default initializer for types/defaults, it's unsafe as initializers don't necesarily match the "formal" type. There might be explicit padding.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
810
diff
changeset
|
613 // |
8e6135be6999
Fixed ModuleInfo generation to no longer use the ModuleInfo class' default initializer for types/defaults, it's unsafe as initializers don't necesarily match the "formal" type. There might be explicit padding.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
810
diff
changeset
|
614 // void function() ctor; |
8e6135be6999
Fixed ModuleInfo generation to no longer use the ModuleInfo class' default initializer for types/defaults, it's unsafe as initializers don't necesarily match the "formal" type. There might be explicit padding.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
810
diff
changeset
|
615 // void function() dtor; |
8e6135be6999
Fixed ModuleInfo generation to no longer use the ModuleInfo class' default initializer for types/defaults, it's unsafe as initializers don't necesarily match the "formal" type. There might be explicit padding.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
810
diff
changeset
|
616 // void function() unitTest; |
8e6135be6999
Fixed ModuleInfo generation to no longer use the ModuleInfo class' default initializer for types/defaults, it's unsafe as initializers don't necesarily match the "formal" type. There might be explicit padding.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
810
diff
changeset
|
617 // |
8e6135be6999
Fixed ModuleInfo generation to no longer use the ModuleInfo class' default initializer for types/defaults, it's unsafe as initializers don't necesarily match the "formal" type. There might be explicit padding.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
810
diff
changeset
|
618 // void* xgetMembers; |
8e6135be6999
Fixed ModuleInfo generation to no longer use the ModuleInfo class' default initializer for types/defaults, it's unsafe as initializers don't necesarily match the "formal" type. There might be explicit padding.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
810
diff
changeset
|
619 // void function() ictor; |
1464
93644700a0b3
Some minor changes to handling of variables referenced from nested functions in D2 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1456
diff
changeset
|
620 // |
1467
630fc54f7c1e
Fix a bug in DtoNestedInit and update an unrelated comment.
Frits van Bommel <fvbommel wxs.nl>
parents:
1464
diff
changeset
|
621 // version(D_Version2) |
630fc54f7c1e
Fix a bug in DtoNestedInit and update an unrelated comment.
Frits van Bommel <fvbommel wxs.nl>
parents:
1464
diff
changeset
|
622 // void*[4] reserved; // useless to us |
811
8e6135be6999
Fixed ModuleInfo generation to no longer use the ModuleInfo class' default initializer for types/defaults, it's unsafe as initializers don't necesarily match the "formal" type. There might be explicit padding.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
810
diff
changeset
|
623 // } |
89 | 624 |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
625 // resolve ModuleInfo |
919
c76f74d09fb1
Fixed assertion failure when object.d is missing the ModuleInfo class
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
902
diff
changeset
|
626 if (!moduleinfo) |
c76f74d09fb1
Fixed assertion failure when object.d is missing the ModuleInfo class
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
902
diff
changeset
|
627 { |
c76f74d09fb1
Fixed assertion failure when object.d is missing the ModuleInfo class
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
902
diff
changeset
|
628 error("object.d is missing the ModuleInfo class"); |
c76f74d09fb1
Fixed assertion failure when object.d is missing the ModuleInfo class
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
902
diff
changeset
|
629 fatal(); |
c76f74d09fb1
Fixed assertion failure when object.d is missing the ModuleInfo class
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
902
diff
changeset
|
630 } |
797
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
766
diff
changeset
|
631 // check for patch |
1453 | 632 #if DMDV2 |
633 else if (moduleinfo->fields.dim != 10) | |
634 #else | |
1386
402bffb1b356
Use RTTIBuilder to build !ModuleInfo, still needs some work.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1380
diff
changeset
|
635 else if (moduleinfo->fields.dim != 9) |
1453 | 636 #endif |
797
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
766
diff
changeset
|
637 { |
919
c76f74d09fb1
Fixed assertion failure when object.d is missing the ModuleInfo class
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
902
diff
changeset
|
638 error("object.d ModuleInfo class is incorrect"); |
797
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
766
diff
changeset
|
639 fatal(); |
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
766
diff
changeset
|
640 } |
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
766
diff
changeset
|
641 |
1386
402bffb1b356
Use RTTIBuilder to build !ModuleInfo, still needs some work.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1380
diff
changeset
|
642 // use the RTTIBuilder |
402bffb1b356
Use RTTIBuilder to build !ModuleInfo, still needs some work.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1380
diff
changeset
|
643 RTTIBuilder b(moduleinfo); |
89 | 644 |
1386
402bffb1b356
Use RTTIBuilder to build !ModuleInfo, still needs some work.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1380
diff
changeset
|
645 // some types |
402bffb1b356
Use RTTIBuilder to build !ModuleInfo, still needs some work.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1380
diff
changeset
|
646 const LLType* moduleinfoTy = moduleinfo->type->irtype->getPA(); |
402bffb1b356
Use RTTIBuilder to build !ModuleInfo, still needs some work.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1380
diff
changeset
|
647 const LLType* classinfoTy = ClassDeclaration::classinfo->type->irtype->getPA(); |
89 | 648 |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
649 // name |
1386
402bffb1b356
Use RTTIBuilder to build !ModuleInfo, still needs some work.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1380
diff
changeset
|
650 b.push_string(toPrettyChars()); |
89 | 651 |
652 // importedModules[] | |
653 int aimports_dim = aimports.dim; | |
213
7816aafeea3c
[svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents:
205
diff
changeset
|
654 std::vector<LLConstant*> importInits; |
1386
402bffb1b356
Use RTTIBuilder to build !ModuleInfo, still needs some work.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1380
diff
changeset
|
655 LLConstant* c = 0; |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
656 for (size_t i = 0; i < aimports.dim; i++) |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
657 { |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
658 Module *m = (Module *)aimports.data[i]; |
824
b972fec8a5f5
Fixed problem with moduleinfo thinking it imports itself, causing assertion failure, fixes #138
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
815
diff
changeset
|
659 if (!m->needModuleInfo() || m == this) |
811
8e6135be6999
Fixed ModuleInfo generation to no longer use the ModuleInfo class' default initializer for types/defaults, it's unsafe as initializers don't necesarily match the "formal" type. There might be explicit padding.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
810
diff
changeset
|
660 continue; |
8e6135be6999
Fixed ModuleInfo generation to no longer use the ModuleInfo class' default initializer for types/defaults, it's unsafe as initializers don't necesarily match the "formal" type. There might be explicit padding.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
810
diff
changeset
|
661 |
8e6135be6999
Fixed ModuleInfo generation to no longer use the ModuleInfo class' default initializer for types/defaults, it's unsafe as initializers don't necesarily match the "formal" type. There might be explicit padding.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
810
diff
changeset
|
662 // declare the imported module info |
8e6135be6999
Fixed ModuleInfo generation to no longer use the ModuleInfo class' default initializer for types/defaults, it's unsafe as initializers don't necesarily match the "formal" type. There might be explicit padding.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
810
diff
changeset
|
663 std::string m_name("_D"); |
8e6135be6999
Fixed ModuleInfo generation to no longer use the ModuleInfo class' default initializer for types/defaults, it's unsafe as initializers don't necesarily match the "formal" type. There might be explicit padding.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
810
diff
changeset
|
664 m_name.append(m->mangle()); |
8e6135be6999
Fixed ModuleInfo generation to no longer use the ModuleInfo class' default initializer for types/defaults, it's unsafe as initializers don't necesarily match the "formal" type. There might be explicit padding.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
810
diff
changeset
|
665 m_name.append("8__ModuleZ"); |
8e6135be6999
Fixed ModuleInfo generation to no longer use the ModuleInfo class' default initializer for types/defaults, it's unsafe as initializers don't necesarily match the "formal" type. There might be explicit padding.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
810
diff
changeset
|
666 llvm::GlobalVariable* m_gvar = gIR->module->getGlobalVariable(m_name); |
1529
ad7f2f1862d6
Adjust LDC to work with the LLVMContext LLVM changes.
Christian Kamm <kamm incasoftware de>
parents:
1521
diff
changeset
|
667 if (!m_gvar) m_gvar = new llvm::GlobalVariable(*gIR->module, moduleinfoTy, false, llvm::GlobalValue::ExternalLinkage, NULL, m_name); |
811
8e6135be6999
Fixed ModuleInfo generation to no longer use the ModuleInfo class' default initializer for types/defaults, it's unsafe as initializers don't necesarily match the "formal" type. There might be explicit padding.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
810
diff
changeset
|
668 importInits.push_back(m_gvar); |
89 | 669 } |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
670 // has import array? |
133
44a95ac7368a
[svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents:
132
diff
changeset
|
671 if (!importInits.empty()) |
44a95ac7368a
[svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents:
132
diff
changeset
|
672 { |
44a95ac7368a
[svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents:
132
diff
changeset
|
673 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
|
674 c = llvm::ConstantArray::get(importArrTy, importInits); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
675 std::string m_name("_D"); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
676 m_name.append(mangle()); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
677 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
|
678 llvm::GlobalVariable* m_gvar = gIR->module->getGlobalVariable(m_name); |
1529
ad7f2f1862d6
Adjust LDC to work with the LLVMContext LLVM changes.
Christian Kamm <kamm incasoftware de>
parents:
1521
diff
changeset
|
679 if (!m_gvar) m_gvar = new llvm::GlobalVariable(*gIR->module, importArrTy, true, llvm::GlobalValue::InternalLinkage, c, m_name); |
133
44a95ac7368a
[svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents:
132
diff
changeset
|
680 c = llvm::ConstantExpr::getBitCast(m_gvar, getPtrToType(importArrTy->getElementType())); |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
681 c = DtoConstSlice(DtoConstSize_t(importInits.size()), c); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
682 } |
89 | 683 else |
1386
402bffb1b356
Use RTTIBuilder to build !ModuleInfo, still needs some work.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1380
diff
changeset
|
684 { |
811
8e6135be6999
Fixed ModuleInfo generation to no longer use the ModuleInfo class' default initializer for types/defaults, it's unsafe as initializers don't necesarily match the "formal" type. There might be explicit padding.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
810
diff
changeset
|
685 c = DtoConstSlice( DtoConstSize_t(0), getNullValue(getPtrToType(moduleinfoTy)) ); |
1386
402bffb1b356
Use RTTIBuilder to build !ModuleInfo, still needs some work.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1380
diff
changeset
|
686 } |
402bffb1b356
Use RTTIBuilder to build !ModuleInfo, still needs some work.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1380
diff
changeset
|
687 b.push(c); |
89 | 688 |
689 // localClasses[] | |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
690 ClassDeclarations aclasses; |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
691 //printf("members->dim = %d\n", members->dim); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
692 for (size_t i = 0; i < members->dim; i++) |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
693 { |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
694 Dsymbol *member; |
89 | 695 |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
696 member = (Dsymbol *)members->data[i]; |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
697 //printf("\tmember '%s'\n", member->toChars()); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
698 member->addLocalClass(&aclasses); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
699 } |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
700 // fill inits |
213
7816aafeea3c
[svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents:
205
diff
changeset
|
701 std::vector<LLConstant*> classInits; |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
702 for (size_t i = 0; i < aclasses.dim; i++) |
89 | 703 { |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
704 ClassDeclaration* cd = (ClassDeclaration*)aclasses.data[i]; |
1147
dbe4af57b240
Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1146
diff
changeset
|
705 cd->codegen(Type::sir); |
dbe4af57b240
Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1146
diff
changeset
|
706 |
133
44a95ac7368a
[svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents:
132
diff
changeset
|
707 if (cd->isInterfaceDeclaration()) |
44a95ac7368a
[svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents:
132
diff
changeset
|
708 { |
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
|
709 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
|
710 continue; |
44a95ac7368a
[svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents:
132
diff
changeset
|
711 } |
797
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
766
diff
changeset
|
712 else if (cd->sizeok != 1) |
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
766
diff
changeset
|
713 { |
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
766
diff
changeset
|
714 Logger::println("skipping opaque class declaration '%s' in moduleinfo", cd->toPrettyChars()); |
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
766
diff
changeset
|
715 continue; |
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
766
diff
changeset
|
716 } |
132 | 717 Logger::println("class: %s", cd->toPrettyChars()); |
1228
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1184
diff
changeset
|
718 c = DtoBitCast(cd->ir.irStruct->getClassInfoSymbol(), getPtrToType(classinfoTy)); |
797
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
766
diff
changeset
|
719 classInits.push_back(c); |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
720 } |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
721 // has class array? |
133
44a95ac7368a
[svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents:
132
diff
changeset
|
722 if (!classInits.empty()) |
44a95ac7368a
[svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents:
132
diff
changeset
|
723 { |
44a95ac7368a
[svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents:
132
diff
changeset
|
724 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
|
725 c = llvm::ConstantArray::get(classArrTy, classInits); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
726 std::string m_name("_D"); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
727 m_name.append(mangle()); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
728 m_name.append("9__classesZ"); |
184 | 729 assert(gIR->module->getGlobalVariable(m_name) == NULL); |
1529
ad7f2f1862d6
Adjust LDC to work with the LLVMContext LLVM changes.
Christian Kamm <kamm incasoftware de>
parents:
1521
diff
changeset
|
730 llvm::GlobalVariable* m_gvar = new llvm::GlobalVariable(*gIR->module, classArrTy, true, llvm::GlobalValue::InternalLinkage, c, m_name); |
1450
83bdf7bed9c5
Fix a type mismatch in ModuleInfo generation.
Frits van Bommel <fvbommel wxs.nl>
parents:
1386
diff
changeset
|
731 c = DtoGEPi(m_gvar, 0, 0); |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
732 c = DtoConstSlice(DtoConstSize_t(classInits.size()), c); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
733 } |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
734 else |
1450
83bdf7bed9c5
Fix a type mismatch in ModuleInfo generation.
Frits van Bommel <fvbommel wxs.nl>
parents:
1386
diff
changeset
|
735 c = DtoConstSlice( DtoConstSize_t(0), getNullValue(getPtrToType(getPtrToType(classinfoTy))) ); |
1386
402bffb1b356
Use RTTIBuilder to build !ModuleInfo, still needs some work.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1380
diff
changeset
|
736 b.push(c); |
89 | 737 |
1386
402bffb1b356
Use RTTIBuilder to build !ModuleInfo, still needs some work.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1380
diff
changeset
|
738 // flags (4 means MIstandalone) |
402bffb1b356
Use RTTIBuilder to build !ModuleInfo, still needs some work.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1380
diff
changeset
|
739 unsigned mi_flags = needmoduleinfo ? 0 : 4; |
402bffb1b356
Use RTTIBuilder to build !ModuleInfo, still needs some work.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1380
diff
changeset
|
740 b.push_uint(mi_flags); |
89 | 741 |
811
8e6135be6999
Fixed ModuleInfo generation to no longer use the ModuleInfo class' default initializer for types/defaults, it's unsafe as initializers don't necesarily match the "formal" type. There might be explicit padding.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
810
diff
changeset
|
742 // function pointer type for next three fields |
8e6135be6999
Fixed ModuleInfo generation to no longer use the ModuleInfo class' default initializer for types/defaults, it's unsafe as initializers don't necesarily match the "formal" type. There might be explicit padding.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
810
diff
changeset
|
743 const LLType* fnptrTy = getPtrToType(LLFunctionType::get(LLType::VoidTy, std::vector<const LLType*>(), false)); |
8e6135be6999
Fixed ModuleInfo generation to no longer use the ModuleInfo class' default initializer for types/defaults, it's unsafe as initializers don't necesarily match the "formal" type. There might be explicit padding.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
810
diff
changeset
|
744 |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
745 // ctor |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
746 llvm::Function* fctor = build_module_ctor(); |
811
8e6135be6999
Fixed ModuleInfo generation to no longer use the ModuleInfo class' default initializer for types/defaults, it's unsafe as initializers don't necesarily match the "formal" type. There might be explicit padding.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
810
diff
changeset
|
747 c = fctor ? fctor : getNullValue(fnptrTy); |
1386
402bffb1b356
Use RTTIBuilder to build !ModuleInfo, still needs some work.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1380
diff
changeset
|
748 b.push(c); |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
749 |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
750 // dtor |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
751 llvm::Function* fdtor = build_module_dtor(); |
811
8e6135be6999
Fixed ModuleInfo generation to no longer use the ModuleInfo class' default initializer for types/defaults, it's unsafe as initializers don't necesarily match the "formal" type. There might be explicit padding.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
810
diff
changeset
|
752 c = fdtor ? fdtor : getNullValue(fnptrTy); |
1386
402bffb1b356
Use RTTIBuilder to build !ModuleInfo, still needs some work.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1380
diff
changeset
|
753 b.push(c); |
89 | 754 |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
755 // unitTest |
121
9c79b61fb638
[svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents:
117
diff
changeset
|
756 llvm::Function* unittest = build_module_unittest(); |
811
8e6135be6999
Fixed ModuleInfo generation to no longer use the ModuleInfo class' default initializer for types/defaults, it's unsafe as initializers don't necesarily match the "formal" type. There might be explicit padding.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
810
diff
changeset
|
757 c = unittest ? unittest : getNullValue(fnptrTy); |
1386
402bffb1b356
Use RTTIBuilder to build !ModuleInfo, still needs some work.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1380
diff
changeset
|
758 b.push(c); |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
759 |
132 | 760 // xgetMembers |
811
8e6135be6999
Fixed ModuleInfo generation to no longer use the ModuleInfo class' default initializer for types/defaults, it's unsafe as initializers don't necesarily match the "formal" type. There might be explicit padding.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
810
diff
changeset
|
761 c = getNullValue(getVoidPtrType()); |
1386
402bffb1b356
Use RTTIBuilder to build !ModuleInfo, still needs some work.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1380
diff
changeset
|
762 b.push(c); |
132 | 763 |
764 // ictor | |
811
8e6135be6999
Fixed ModuleInfo generation to no longer use the ModuleInfo class' default initializer for types/defaults, it's unsafe as initializers don't necesarily match the "formal" type. There might be explicit padding.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
810
diff
changeset
|
765 c = getNullValue(fnptrTy); |
1386
402bffb1b356
Use RTTIBuilder to build !ModuleInfo, still needs some work.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1380
diff
changeset
|
766 b.push(c); |
132 | 767 |
1464
93644700a0b3
Some minor changes to handling of variables referenced from nested functions in D2 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1456
diff
changeset
|
768 #if DMDV2 |
93644700a0b3
Some minor changes to handling of variables referenced from nested functions in D2 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1456
diff
changeset
|
769 |
93644700a0b3
Some minor changes to handling of variables referenced from nested functions in D2 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1456
diff
changeset
|
770 // void*[4] reserved :/ |
93644700a0b3
Some minor changes to handling of variables referenced from nested functions in D2 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1456
diff
changeset
|
771 const LLType* AT = llvm::ArrayType::get(getVoidPtrType(), 4); |
93644700a0b3
Some minor changes to handling of variables referenced from nested functions in D2 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1456
diff
changeset
|
772 c = getNullValue(AT); |
93644700a0b3
Some minor changes to handling of variables referenced from nested functions in D2 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1456
diff
changeset
|
773 b.push(c); |
93644700a0b3
Some minor changes to handling of variables referenced from nested functions in D2 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1456
diff
changeset
|
774 |
93644700a0b3
Some minor changes to handling of variables referenced from nested functions in D2 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1456
diff
changeset
|
775 #endif |
93644700a0b3
Some minor changes to handling of variables referenced from nested functions in D2 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1456
diff
changeset
|
776 |
132 | 777 /*Logger::println("MODULE INFO INITIALIZERS"); |
778 for (size_t i=0; i<initVec.size(); ++i) | |
779 { | |
780 Logger::cout() << *initVec[i] << '\n'; | |
781 if (initVec[i]->getType() != moduleinfoTy->getElementType(i)) | |
782 assert(0); | |
783 }*/ | |
784 | |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
785 // create initializer |
1386
402bffb1b356
Use RTTIBuilder to build !ModuleInfo, still needs some work.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1380
diff
changeset
|
786 LLConstant* constMI = b.get_constant(); |
89 | 787 |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
788 // create name |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
789 std::string MIname("_D"); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
790 MIname.append(mangle()); |
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
791 MIname.append("8__ModuleZ"); |
89 | 792 |
824
b972fec8a5f5
Fixed problem with moduleinfo thinking it imports itself, causing assertion failure, fixes #138
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
815
diff
changeset
|
793 // declare global |
116
fd7ad91fd713
[svn r120] ModuleInfo implementation is now almost complete.
lindquist
parents:
115
diff
changeset
|
794 // flags will be modified at runtime so can't make it constant |
184 | 795 |
824
b972fec8a5f5
Fixed problem with moduleinfo thinking it imports itself, causing assertion failure, fixes #138
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
815
diff
changeset
|
796 // it makes no sense that the our own module info already exists! |
b972fec8a5f5
Fixed problem with moduleinfo thinking it imports itself, causing assertion failure, fixes #138
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
815
diff
changeset
|
797 assert(!gIR->module->getGlobalVariable(MIname)); |
1529
ad7f2f1862d6
Adjust LDC to work with the LLVMContext LLVM changes.
Christian Kamm <kamm incasoftware de>
parents:
1521
diff
changeset
|
798 llvm::GlobalVariable* gvar = new llvm::GlobalVariable(*gIR->module, constMI->getType(), false, llvm::GlobalValue::ExternalLinkage, constMI, MIname); |
117 | 799 |
323
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
800 // 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
|
801 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
|
802 |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
803 // 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
|
804 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
|
805 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
|
806 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
|
807 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
|
808 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
|
809 |
0d52412d5b1a
[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments.
lindquist
parents:
316
diff
changeset
|
810 // 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
|
811 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
|
812 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
|
813 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
|
814 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
|
815 |
117 | 816 // 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
|
817 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
|
818 std::vector<LLConstant*> appendInits(1, magicinit); |
213
7816aafeea3c
[svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents:
205
diff
changeset
|
819 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
|
820 std::string appendName("llvm.global_ctors"); |
1529
ad7f2f1862d6
Adjust LDC to work with the LLVMContext LLVM changes.
Christian Kamm <kamm incasoftware de>
parents:
1521
diff
changeset
|
821 llvm::GlobalVariable* appendVar = new llvm::GlobalVariable(*gIR->module, appendArrTy, true, llvm::GlobalValue::AppendingLinkage, appendInit, appendName); |
1 | 822 } |