annotate gen/toobj.c @ 73:b706170e24a9 trunk

[svn r77] Fixed foreach on slice. Fixed some nested function problems when accessing outer function parameters. Major changes to handling of structs. Initial support for unions. Probably more...
author lindquist
date Wed, 31 Oct 2007 03:11:32 +0100
parents d7e764e62462
children eb379601d445
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
2 // Copyright (c) 1999-2004 by Digital Mars
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
3 // All Rights Reserved
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
4 // written by Walter Bright
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
5 // www.digitalmars.com
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
6 // License for redistribution is by either the Artistic License
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
7 // in artistic.txt, or the GNU General Public License in gnu.txt.
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
8 // See the included readme.txt for details.
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
9
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
10 #include <cstddef>
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
11 #include <iostream>
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
12 #include <fstream>
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
13
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
14 #include "gen/llvm.h"
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
15 #include "llvm/Analysis/Verifier.h"
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
16 #include "llvm/Bitcode/ReaderWriter.h"
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
17 #include "llvm/Target/TargetMachine.h"
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
18 #include "llvm/Target/TargetMachineRegistry.h"
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
19
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
20 #include "mars.h"
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
21 #include "module.h"
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
22 #include "mtype.h"
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
23 #include "declaration.h"
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
24 #include "statement.h"
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
25 #include "enum.h"
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
26 #include "aggregate.h"
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
27 #include "init.h"
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
28 #include "attrib.h"
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
29 #include "id.h"
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
30 #include "import.h"
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
31 #include "template.h"
18
c05ef76f1c20 [svn r22] * Forgot to add std.stdio
lindquist
parents: 17
diff changeset
32 #include "scope.h"
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
33
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents: 1
diff changeset
34 #include "gen/irstate.h"
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents: 1
diff changeset
35 #include "gen/elem.h"
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents: 1
diff changeset
36 #include "gen/logger.h"
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents: 1
diff changeset
37 #include "gen/tollvm.h"
64
b688ad419f8c [svn r68] Added support for multi-dimensional static arrays.
lindquist
parents: 63
diff changeset
38 #include "gen/arrays.h"
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
39
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
40 //////////////////////////////////////////////////////////////////////////////////////////
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
41
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
42 void
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
43 Module::genobjfile()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
44 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
45 Logger::cout() << "Generating module: " << (md ? md->toChars() : toChars()) << '\n';
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
46 LOG_SCOPE;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
47
6
35d93ce68cf4 [svn r10] Updated for LLVM rev. 20070913
lindquist
parents: 4
diff changeset
48 // start by deleting the old object file
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
49 deleteObjFile();
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
50
18
c05ef76f1c20 [svn r22] * Forgot to add std.stdio
lindquist
parents: 17
diff changeset
51 // create a new ir state
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
52 IRState ir;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
53 gIR = &ir;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
54 ir.dmodule = this;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
55
6
35d93ce68cf4 [svn r10] Updated for LLVM rev. 20070913
lindquist
parents: 4
diff changeset
56 // name the module
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
57 std::string mname(toChars());
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
58 if (md != 0)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
59 mname = md->toChars();
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
60 ir.module = new llvm::Module(mname);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
61
6
35d93ce68cf4 [svn r10] Updated for LLVM rev. 20070913
lindquist
parents: 4
diff changeset
62 // set target stuff
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
63 std::string target_triple(global.params.tt_arch);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
64 target_triple.append(global.params.tt_os);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
65 ir.module->setTargetTriple(target_triple);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
66 ir.module->setDataLayout(global.params.data_layout);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
67
73
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
68 // heavily inspired by tools/llc/llc.cpp:200-230
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
69 const llvm::TargetMachineRegistry::Entry* targetEntry;
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
70 std::string targetError;
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
71 targetEntry = llvm::TargetMachineRegistry::getClosestStaticTargetForModule(*ir.module, targetError);
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
72 assert(targetEntry && "Failed to find a static target for module");
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
73 std::auto_ptr<llvm::TargetMachine> targetPtr(targetEntry->CtorFn(*ir.module, "")); // TODO: replace "" with features
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
74 assert(targetPtr.get() && "Could not allocate target machine!");
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
75 llvm::TargetMachine &targetMachine = *targetPtr.get();
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
76 gTargetData = targetMachine.getTargetData();
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
77
6
35d93ce68cf4 [svn r10] Updated for LLVM rev. 20070913
lindquist
parents: 4
diff changeset
78 // process module members
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
79 for (int k=0; k < members->dim; k++) {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
80 Dsymbol* dsym = (Dsymbol*)(members->data[k]);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
81 assert(dsym);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
82 dsym->toObjFile();
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
83 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
84
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
85 gTargetData = 0;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
86
11
d3ee9efe20e2 [svn r15] * Fixed a bunch problems with virtual calls. Seems I did some rather poor testing.
lindquist
parents: 10
diff changeset
87 // emit the llvm main function if necessary
d3ee9efe20e2 [svn r15] * Fixed a bunch problems with virtual calls. Seems I did some rather poor testing.
lindquist
parents: 10
diff changeset
88 if (ir.emitMain) {
d3ee9efe20e2 [svn r15] * Fixed a bunch problems with virtual calls. Seems I did some rather poor testing.
lindquist
parents: 10
diff changeset
89 LLVM_DtoMain();
d3ee9efe20e2 [svn r15] * Fixed a bunch problems with virtual calls. Seems I did some rather poor testing.
lindquist
parents: 10
diff changeset
90 }
d3ee9efe20e2 [svn r15] * Fixed a bunch problems with virtual calls. Seems I did some rather poor testing.
lindquist
parents: 10
diff changeset
91
6
35d93ce68cf4 [svn r10] Updated for LLVM rev. 20070913
lindquist
parents: 4
diff changeset
92 // verify the llvm
31
2841234d2aea [svn r35] * Attributes on struct fields/methods now work
lindquist
parents: 28
diff changeset
93 if (!global.params.novalidate) {
2841234d2aea [svn r35] * Attributes on struct fields/methods now work
lindquist
parents: 28
diff changeset
94 std::string verifyErr;
2841234d2aea [svn r35] * Attributes on struct fields/methods now work
lindquist
parents: 28
diff changeset
95 Logger::println("Verifying module...");
2841234d2aea [svn r35] * Attributes on struct fields/methods now work
lindquist
parents: 28
diff changeset
96 if (llvm::verifyModule(*ir.module,llvm::ReturnStatusAction,&verifyErr))
2841234d2aea [svn r35] * Attributes on struct fields/methods now work
lindquist
parents: 28
diff changeset
97 {
2841234d2aea [svn r35] * Attributes on struct fields/methods now work
lindquist
parents: 28
diff changeset
98 error("%s", verifyErr.c_str());
2841234d2aea [svn r35] * Attributes on struct fields/methods now work
lindquist
parents: 28
diff changeset
99 fatal();
2841234d2aea [svn r35] * Attributes on struct fields/methods now work
lindquist
parents: 28
diff changeset
100 }
2841234d2aea [svn r35] * Attributes on struct fields/methods now work
lindquist
parents: 28
diff changeset
101 else {
2841234d2aea [svn r35] * Attributes on struct fields/methods now work
lindquist
parents: 28
diff changeset
102 Logger::println("Verification passed!");
2841234d2aea [svn r35] * Attributes on struct fields/methods now work
lindquist
parents: 28
diff changeset
103 }
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
104 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
105
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
106 // run passes
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
107 // TODO
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
108
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
109 // write bytecode
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
110 {
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
111 Logger::println("Writing LLVM bitcode\n");
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
112 std::ofstream bos(bcfile->name->toChars(), std::ios::binary);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
113 llvm::WriteBitcodeToFile(ir.module, bos);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
114 }
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
115
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
116 // disassemble ?
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
117 if (global.params.disassemble) {
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
118 Logger::println("Writing LLVM asm to: %s\n", llfile->name->toChars());
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
119 std::ofstream aos(llfile->name->toChars());
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
120 ir.module->print(aos);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
121 }
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
122
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
123 delete ir.module;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
124 gIR = NULL;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
125 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
126
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
127 /* ================================================================== */
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
128
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
129 // Put out instance of ModuleInfo for this Module
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
130
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
131 void Module::genmoduleinfo()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
132 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
133 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
134
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
135 /* ================================================================== */
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
136
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
137 void Dsymbol::toObjFile()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
138 {
38
27b2f40bdb58 [svn r42] Disabled the extensive logging by default. Use the -vv flag to get it back.
lindquist
parents: 31
diff changeset
139 Logger::println("Ignoring Dsymbol::toObjFile for %s", toChars());
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
140 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
141
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
142 /* ================================================================== */
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
143
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
144 void Declaration::toObjFile()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
145 {
38
27b2f40bdb58 [svn r42] Disabled the extensive logging by default. Use the -vv flag to get it back.
lindquist
parents: 31
diff changeset
146 Logger::println("Ignoring Declaration::toObjFile for %s", toChars());
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
147 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
148
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
149 /* ================================================================== */
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
150
6
35d93ce68cf4 [svn r10] Updated for LLVM rev. 20070913
lindquist
parents: 4
diff changeset
151 /// Returns the LLVM style index from a DMD style offset
73
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
152 size_t AggregateDeclaration::offsetToIndex(Type* t, unsigned os, std::vector<unsigned>& result)
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
153 {
24
25bb577878e8 [svn r28] * Fixed accessing aggregate fields. it was still not quite right. hopefully is now :)
lindquist
parents: 23
diff changeset
154 Logger::println("checking for offset %u type %s:", os, t->toChars());
23
77e3d1ddae3f [svn r27] * Fixed bug in aggregate field lookup.
lindquist
parents: 22
diff changeset
155 LOG_SCOPE;
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
156 for (unsigned i=0; i<fields.dim; ++i) {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
157 VarDeclaration* vd = (VarDeclaration*)fields.data[i];
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
158 Type* vdtype = LLVM_DtoDType(vd->type);
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
159 Logger::println("found %u type %s", vd->offset, vdtype->toChars());
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
160 if (os == vd->offset && vdtype == t) {
73
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
161 assert(vd->llvmFieldIndex >= 0);
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
162 result.push_back(vd->llvmFieldIndex);
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
163 return vd->llvmFieldIndexOffset;
23
77e3d1ddae3f [svn r27] * Fixed bug in aggregate field lookup.
lindquist
parents: 22
diff changeset
164 }
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
165 else if (vdtype->ty == Tstruct && (vd->offset + vdtype->size()) > os) {
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
166 TypeStruct* ts = (TypeStruct*)vdtype;
24
25bb577878e8 [svn r28] * Fixed accessing aggregate fields. it was still not quite right. hopefully is now :)
lindquist
parents: 23
diff changeset
167 StructDeclaration* sd = ts->sym;
25bb577878e8 [svn r28] * Fixed accessing aggregate fields. it was still not quite right. hopefully is now :)
lindquist
parents: 23
diff changeset
168 result.push_back(i);
73
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
169 return sd->offsetToIndex(t, os - vd->offset, result);
8
5e69b77a5c51 [svn r12] fixed accessing aggregate fields of aggregates
lindquist
parents: 6
diff changeset
170 }
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
171 }
73
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
172 //assert(0 && "Offset not found in any aggregate field");
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
173 return (size_t)-1;
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
174 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
175
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
176 /* ================================================================== */
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
177
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
178 static unsigned LLVM_ClassOffsetToIndex(ClassDeclaration* cd, unsigned os, unsigned& idx)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
179 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
180 // start at the bottom of the inheritance chain
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
181 if (cd->baseClass != 0) {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
182 unsigned o = LLVM_ClassOffsetToIndex(cd->baseClass, os, idx);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
183 if (o != (unsigned)-1)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
184 return o;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
185 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
186
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
187 // check this class
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
188 unsigned i;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
189 for (i=0; i<cd->fields.dim; ++i) {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
190 VarDeclaration* vd = (VarDeclaration*)cd->fields.data[i];
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
191 if (os == vd->offset)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
192 return i+idx;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
193 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
194 idx += i;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
195
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
196 return (unsigned)-1;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
197 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
198
6
35d93ce68cf4 [svn r10] Updated for LLVM rev. 20070913
lindquist
parents: 4
diff changeset
199 /// Returns the LLVM style index from a DMD style offset
35d93ce68cf4 [svn r10] Updated for LLVM rev. 20070913
lindquist
parents: 4
diff changeset
200 /// Handles class inheritance
73
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
201 size_t ClassDeclaration::offsetToIndex(Type* t, unsigned os, std::vector<unsigned>& result)
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
202 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
203 unsigned idx = 0;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
204 unsigned r = LLVM_ClassOffsetToIndex(this, os, idx);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
205 assert(r != (unsigned)-1 && "Offset not found in any aggregate field");
8
5e69b77a5c51 [svn r12] fixed accessing aggregate fields of aggregates
lindquist
parents: 6
diff changeset
206 result.push_back(r+1); // vtable is 0
73
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
207 return 0;
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
208 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
209
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
210 /* ================================================================== */
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
211
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
212 void InterfaceDeclaration::toObjFile()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
213 {
38
27b2f40bdb58 [svn r42] Disabled the extensive logging by default. Use the -vv flag to get it back.
lindquist
parents: 31
diff changeset
214 Logger::println("Ignoring InterfaceDeclaration::toObjFile for %s", toChars());
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
215 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
216
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
217 /* ================================================================== */
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
218
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
219 void StructDeclaration::toObjFile()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
220 {
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
221 TypeStruct* ts = (TypeStruct*)LLVM_DtoDType(type);
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
222 if (llvmType != 0)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
223 return;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
224
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
225 static int sdi = 0;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
226 Logger::print("StructDeclaration::toObjFile(%d): %s\n", sdi++, toChars());
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
227 LOG_SCOPE;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
228
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
229 gIR->structs.push_back(IRStruct(ts));
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
230
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
231 for (int k=0; k < members->dim; k++) {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
232 Dsymbol* dsym = (Dsymbol*)(members->data[k]);
31
2841234d2aea [svn r35] * Attributes on struct fields/methods now work
lindquist
parents: 28
diff changeset
233 dsym->toObjFile();
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
234 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
235
73
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
236 Logger::println("doing struct fields");
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
237
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
238 llvm::StructType* structtype = 0;
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
239 std::vector<llvm::Constant*> fieldinits;
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
240
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
241 if (gIR->topstruct().offsets.empty())
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
242 {
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
243 std::vector<const llvm::Type*> fieldtypes;
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
244 Logger::println("has no fields");
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
245 fieldtypes.push_back(llvm::Type::Int8Ty);
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
246 fieldinits.push_back(llvm::ConstantInt::get(llvm::Type::Int8Ty, 0, false));
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
247 structtype = llvm::StructType::get(fieldtypes);
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
248 }
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
249 else
23
77e3d1ddae3f [svn r27] * Fixed bug in aggregate field lookup.
lindquist
parents: 22
diff changeset
250 {
73
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
251 Logger::println("has fields");
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
252 std::vector<const llvm::Type*> fieldtypes;
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
253 unsigned prevsize = (unsigned)-1;
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
254 unsigned lastoffset = (unsigned)-1;
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
255 const llvm::Type* fieldtype = NULL;
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
256 llvm::Constant* fieldinit = NULL;
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
257 size_t fieldpad = 0;
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
258 int idx = 0;
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
259 for (IRStruct::OffsetMap::iterator i=gIR->topstruct().offsets.begin(); i!=gIR->topstruct().offsets.end(); ++i) {
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
260 // first iteration
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
261 if (lastoffset == (unsigned)-1) {
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
262 lastoffset = i->first;
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
263 assert(lastoffset == 0);
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
264 fieldtype = LLVM_DtoType(i->second.var->type);
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
265 fieldinit = i->second.init;
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
266 prevsize = gTargetData->getTypeSize(fieldtype);
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
267 i->second.var->llvmFieldIndex = idx;
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
268 }
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
269 // colliding offset?
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
270 else if (lastoffset == i->first) {
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
271 const llvm::Type* t = LLVM_DtoType(i->second.var->type);
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
272 size_t s = gTargetData->getTypeSize(t);
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
273 if (s > prevsize) {
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
274 fieldpad = s - prevsize;
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
275 prevsize = s;
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
276 }
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
277 llvmHasUnions = true;
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
278 i->second.var->llvmFieldIndex = idx;
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
279 }
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
280 // intersecting offset?
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
281 else if (i->first < (lastoffset + prevsize)) {
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
282 const llvm::Type* t = LLVM_DtoType(i->second.var->type);
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
283 size_t s = gTargetData->getTypeSize(t);
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
284 assert((i->first + s) <= (lastoffset + prevsize)); // this holds because all types are aligned to their size
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
285 llvmHasUnions = true;
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
286 i->second.var->llvmFieldIndex = idx;
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
287 i->second.var->llvmFieldIndexOffset = (i->first - lastoffset) / s;
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
288 }
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
289 // fresh offset
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
290 else {
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
291 // commit the field
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
292 fieldtypes.push_back(fieldtype);
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
293 fieldinits.push_back(fieldinit);
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
294 if (fieldpad) {
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
295 // match up with below
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
296 std::vector<llvm::Constant*> vals(fieldpad, llvm::ConstantInt::get(llvm::Type::Int8Ty, 0, false));
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
297 llvm::Constant* c = llvm::ConstantArray::get(llvm::ArrayType::get(llvm::Type::Int8Ty, fieldpad), vals);
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
298 fieldtypes.push_back(c->getType());
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
299 fieldinits.push_back(c);
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
300 idx++;
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
301 }
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
302
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
303 idx++;
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
304
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
305 // start new
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
306 lastoffset = i->first;
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
307 fieldtype = LLVM_DtoType(i->second.var->type);
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
308 fieldinit = i->second.init;
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
309 prevsize = gTargetData->getTypeSize(fieldtype);
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
310 i->second.var->llvmFieldIndex = idx;
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
311 fieldpad = 0;
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
312 }
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
313 }
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
314 fieldtypes.push_back(fieldtype);
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
315 fieldinits.push_back(fieldinit);
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
316 if (fieldpad) {
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
317 // match up with above
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
318 std::vector<llvm::Constant*> vals(fieldpad, llvm::ConstantInt::get(llvm::Type::Int8Ty, 0, false));
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
319 llvm::Constant* c = llvm::ConstantArray::get(llvm::ArrayType::get(llvm::Type::Int8Ty, fieldpad), vals);
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
320 fieldtypes.push_back(c->getType());
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
321 fieldinits.push_back(c);
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
322 }
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
323
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
324 Logger::println("creating struct type");
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
325 structtype = llvm::StructType::get(fieldtypes);
23
77e3d1ddae3f [svn r27] * Fixed bug in aggregate field lookup.
lindquist
parents: 22
diff changeset
326 }
77e3d1ddae3f [svn r27] * Fixed bug in aggregate field lookup.
lindquist
parents: 22
diff changeset
327
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
328 // refine abstract types for stuff like: struct S{S* next;}
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
329 if (gIR->topstruct().recty != 0)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
330 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
331 llvm::PATypeHolder& pa = gIR->topstruct().recty;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
332 llvm::cast<llvm::OpaqueType>(pa.get())->refineAbstractTypeTo(structtype);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
333 structtype = llvm::cast<llvm::StructType>(pa.get());
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
334 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
335
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
336 ts->llvmType = structtype;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
337 llvmType = structtype;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
338
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
339 if (parent->isModule()) {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
340 gIR->module->addTypeName(mangle(),ts->llvmType);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
341 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
342
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
343 // generate static data
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
344 llvm::GlobalValue::LinkageTypes _linkage = llvm::GlobalValue::ExternalLinkage;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
345 llvm::Constant* _init = 0;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
346
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
347 // always generate the constant initalizer
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
348 if (!zeroInit) {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
349 Logger::println("Not zero initialized");
73
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
350 //assert(tk == gIR->gIR->topstruct()().size());
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
351 #ifndef LLVMD_NO_LOGGER
73
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
352 Logger::cout() << "struct type: " << *structtype << '\n';
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
353 for (size_t k=0; k<fieldinits.size(); ++k) {
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
354 Logger::cout() << "Type:" << '\n';
73
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
355 Logger::cout() << *fieldinits[k]->getType() << '\n';
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
356 Logger::cout() << "Value:" << '\n';
73
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
357 Logger::cout() << *fieldinits[k] << '\n';
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
358 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
359 Logger::cout() << "Initializer printed" << '\n';
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
360 #endif
73
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
361 llvmInitZ = llvm::ConstantStruct::get(structtype,fieldinits);
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
362 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
363 else {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
364 Logger::println("Zero initialized");
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
365 llvmInitZ = llvm::ConstantAggregateZero::get(structtype);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
366 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
367
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
368 // only provide the constant initializer for the defining module
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
369 if (getModule() == gIR->dmodule)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
370 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
371 _init = llvmInitZ;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
372 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
373
73
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
374 std::string initname("_D");
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
375 initname.append(mangle());
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
376 initname.append("6__initZ");
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
377 llvm::GlobalVariable* initvar = new llvm::GlobalVariable(ts->llvmType, true, _linkage, _init, initname, gIR->module);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
378 ts->llvmInit = initvar;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
379
31
2841234d2aea [svn r35] * Attributes on struct fields/methods now work
lindquist
parents: 28
diff changeset
380 // generate member function definitions
2841234d2aea [svn r35] * Attributes on struct fields/methods now work
lindquist
parents: 28
diff changeset
381 gIR->topstruct().queueFuncs = false;
73
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
382 IRStruct::FuncDeclVector& mfs = gIR->topstruct().funcs;
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
383 size_t n = mfs.size();
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
384 for (size_t i=0; i<n; ++i) {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
385 mfs[i]->toObjFile();
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
386 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
387
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
388 llvmDModule = gIR->dmodule;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
389
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
390 gIR->structs.pop_back();
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
391
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
392 // generate typeinfo
73
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
393 if (getModule() == gIR->dmodule && llvmInternal != LLVMnotypeinfo)
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 69
diff changeset
394 type->getTypeInfo(NULL);
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
395 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
396
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
397 /* ================================================================== */
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
398
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
399 static void LLVM_AddBaseClassData(BaseClasses* bcs)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
400 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
401 // add base class data members first
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
402 for (int j=0; j<bcs->dim; j++)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
403 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
404 BaseClass* bc = (BaseClass*)(bcs->data[j]);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
405 assert(bc);
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
406 Logger::println("Adding base class members of %s", bc->base->toChars());
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
407 LOG_SCOPE;
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
408
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
409 LLVM_AddBaseClassData(&bc->base->baseclasses);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
410 for (int k=0; k < bc->base->members->dim; k++) {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
411 Dsymbol* dsym = (Dsymbol*)(bc->base->members->data[k]);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
412 if (dsym->isVarDeclaration())
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
413 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
414 dsym->toObjFile();
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
415 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
416 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
417 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
418 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
419
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
420 void ClassDeclaration::toObjFile()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
421 {
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
422 TypeClass* ts = (TypeClass*)LLVM_DtoDType(type);
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
423 if (ts->llvmType != 0 || llvmInProgress)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
424 return;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
425
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
426 llvmInProgress = true;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
427
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
428 static int fdi = 0;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
429 Logger::print("ClassDeclaration::toObjFile(%d): %s\n", fdi++, toChars());
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
430 LOG_SCOPE;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
431
6
35d93ce68cf4 [svn r10] Updated for LLVM rev. 20070913
lindquist
parents: 4
diff changeset
432 gIR->structs.push_back(IRStruct(ts));
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
433 gIR->classes.push_back(this);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
434
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
435 // add vtable
9
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
436 llvm::PATypeHolder pa = llvm::OpaqueType::get();
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
437 const llvm::Type* vtabty = llvm::PointerType::get(pa);
73
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
438
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
439 std::vector<const llvm::Type*> fieldtypes;
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
440 fieldtypes.push_back(vtabty);
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
441
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
442 std::vector<llvm::Constant*> fieldinits;
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
443 fieldinits.push_back(0);
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
444
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
445 // base classes first
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
446 LLVM_AddBaseClassData(&baseclasses);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
447
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
448 // then add own members
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
449 for (int k=0; k < members->dim; k++) {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
450 Dsymbol* dsym = (Dsymbol*)(members->data[k]);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
451 dsym->toObjFile();
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
452 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
453
73
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
454 // fill out fieldtypes/inits
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
455 for (IRStruct::OffsetMap::iterator i=gIR->topstruct().offsets.begin(); i!=gIR->topstruct().offsets.end(); ++i) {
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
456 fieldtypes.push_back(LLVM_DtoType(i->second.var->type));
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
457 fieldinits.push_back(i->second.init);
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
458 }
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
459
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
460 llvm::StructType* structtype = llvm::StructType::get(fieldtypes);
6
35d93ce68cf4 [svn r10] Updated for LLVM rev. 20070913
lindquist
parents: 4
diff changeset
461 // refine abstract types for stuff like: class C {C next;}
35d93ce68cf4 [svn r10] Updated for LLVM rev. 20070913
lindquist
parents: 4
diff changeset
462 if (gIR->topstruct().recty != 0)
35d93ce68cf4 [svn r10] Updated for LLVM rev. 20070913
lindquist
parents: 4
diff changeset
463 {
35d93ce68cf4 [svn r10] Updated for LLVM rev. 20070913
lindquist
parents: 4
diff changeset
464 llvm::PATypeHolder& pa = gIR->topstruct().recty;
35d93ce68cf4 [svn r10] Updated for LLVM rev. 20070913
lindquist
parents: 4
diff changeset
465 llvm::cast<llvm::OpaqueType>(pa.get())->refineAbstractTypeTo(structtype);
35d93ce68cf4 [svn r10] Updated for LLVM rev. 20070913
lindquist
parents: 4
diff changeset
466 structtype = llvm::cast<llvm::StructType>(pa.get());
35d93ce68cf4 [svn r10] Updated for LLVM rev. 20070913
lindquist
parents: 4
diff changeset
467 }
35d93ce68cf4 [svn r10] Updated for LLVM rev. 20070913
lindquist
parents: 4
diff changeset
468
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
469 ts->llvmType = structtype;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
470 llvmType = structtype;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
471
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
472 bool needs_definition = false;
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
473 if (parent->isModule()) {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
474 gIR->module->addTypeName(mangle(),ts->llvmType);
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
475 needs_definition = (getModule() == gIR->dmodule);
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
476 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
477 else {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
478 assert(0 && "class parent is not a module");
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
479 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
480
9
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
481 // generate vtable
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
482 llvm::GlobalVariable* svtblVar = 0;
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
483 std::vector<llvm::Constant*> sinits;
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
484 std::vector<const llvm::Type*> sinits_ty;
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
485 sinits.reserve(vtbl.dim);
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
486 sinits_ty.reserve(vtbl.dim);
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
487
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
488 for (int k=0; k < vtbl.dim; k++)
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
489 {
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
490 Dsymbol* dsym = (Dsymbol*)vtbl.data[k];
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
491 assert(dsym);
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
492 //Logger::cout() << "vtblsym: " << dsym->toChars() << '\n';
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
493
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
494 if (FuncDeclaration* fd = dsym->isFuncDeclaration()) {
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
495 fd->toObjFile();
11
d3ee9efe20e2 [svn r15] * Fixed a bunch problems with virtual calls. Seems I did some rather poor testing.
lindquist
parents: 10
diff changeset
496 assert(fd->llvmValue);
9
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
497 llvm::Constant* c = llvm::cast<llvm::Constant>(fd->llvmValue);
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
498 sinits.push_back(c);
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
499 sinits_ty.push_back(c->getType());
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
500 }
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
501 else if (ClassDeclaration* cd = dsym->isClassDeclaration()) {
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
502 const llvm::Type* cty = llvm::PointerType::get(llvm::Type::Int8Ty);
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
503 llvm::Constant* c = llvm::Constant::getNullValue(cty);
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
504 sinits.push_back(c);
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
505 sinits_ty.push_back(cty);
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
506 }
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
507 else
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
508 assert(0);
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
509 }
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
510
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
511 const llvm::StructType* svtbl_ty = 0;
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
512 if (!sinits.empty())
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
513 {
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
514 llvm::GlobalValue::LinkageTypes _linkage = llvm::GlobalValue::ExternalLinkage;
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
515
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
516 std::string varname("_D");
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
517 varname.append(mangle());
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
518 varname.append("6__vtblZ");
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
519
9
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
520 std::string styname(mangle());
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
521 styname.append("__vtblTy");
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
522
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
523 svtbl_ty = llvm::StructType::get(sinits_ty);
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
524 gIR->module->addTypeName(styname, svtbl_ty);
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
525 svtblVar = new llvm::GlobalVariable(svtbl_ty, true, _linkage, 0, varname, gIR->module);
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
526
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
527 llvmConstVtbl = llvm::cast<llvm::ConstantStruct>(llvm::ConstantStruct::get(svtbl_ty, sinits));
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
528 if (needs_definition)
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
529 svtblVar->setInitializer(llvmConstVtbl);
9
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
530 llvmVtbl = svtblVar;
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
531 }
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
532
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
533 ////////////////////////////////////////////////////////////////////////////////
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
534
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
535 // refine for final vtable type
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
536 llvm::cast<llvm::OpaqueType>(pa.get())->refineAbstractTypeTo(svtbl_ty);
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
537 svtbl_ty = llvm::cast<llvm::StructType>(pa.get());
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
538 structtype = llvm::cast<llvm::StructType>(gIR->topstruct().recty.get());
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
539 ts->llvmType = structtype;
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
540 llvmType = structtype;
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
541
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
542 // generate initializer
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
543 llvm::GlobalValue::LinkageTypes _linkage = llvm::GlobalValue::ExternalLinkage;
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
544 llvm::Constant* _init = 0;
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
545
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
546 // first field is always the vtable
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
547 assert(svtblVar != 0);
73
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
548 fieldinits[0] = svtblVar;
9
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
549
73
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
550 llvmInitZ = _init = llvm::ConstantStruct::get(structtype,fieldinits);
9
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
551 assert(_init);
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
552
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
553 std::string initname("_D");
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
554 initname.append(mangle());
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
555 initname.append("6__initZ");
11
d3ee9efe20e2 [svn r15] * Fixed a bunch problems with virtual calls. Seems I did some rather poor testing.
lindquist
parents: 10
diff changeset
556 //Logger::cout() << *_init << '\n';
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
557 llvm::GlobalVariable* initvar = new llvm::GlobalVariable(ts->llvmType, true, _linkage, NULL, initname, gIR->module);
9
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
558 ts->llvmInit = initvar;
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
559
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
560 if (needs_definition) {
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
561 initvar->setInitializer(_init);
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
562 // generate member functions
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
563 gIR->topstruct().queueFuncs = false;
73
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
564 IRStruct::FuncDeclVector& mfs = gIR->topstruct().funcs;
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
565 size_t n = mfs.size();
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
566 for (size_t i=0; i<n; ++i) {
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
567 mfs[i]->toObjFile();
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
568 }
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
569 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
570
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
571 gIR->classes.pop_back();
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
572 gIR->structs.pop_back();
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
573
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
574 llvmInProgress = false;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
575 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
576
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
577 /******************************************
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
578 * Get offset of base class's vtbl[] initializer from start of csym.
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
579 * Returns ~0 if not this csym.
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
580 */
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
581
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
582 unsigned ClassDeclaration::baseVtblOffset(BaseClass *bc)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
583 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
584 return ~0;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
585 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
586
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
587 /* ================================================================== */
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
588
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
589 void VarDeclaration::toObjFile()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
590 {
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
591 Logger::print("VarDeclaration::toObjFile(): %s | %s\n", toChars(), type->toChars());
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
592 LOG_SCOPE;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
593 llvm::Module* M = gIR->module;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
594
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
595 // handle bind pragma
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
596 if (llvmInternal == LLVMbind) {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
597 Logger::println("var is bound: %s", llvmInternal1);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
598 llvmValue = M->getGlobalVariable(llvmInternal1);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
599 assert(llvmValue);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
600 return;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
601 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
602
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
603 // global variable or magic
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
604 if (isDataseg() || parent->isModule())
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
605 {
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
606 if (llvmTouched) return;
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
607 else llvmTouched = true;
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
608
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
609 bool _isconst = isConst();
26
99737f94abfb [svn r30] * Fixed static function-local variables.
lindquist
parents: 24
diff changeset
610
99737f94abfb [svn r30] * Fixed static function-local variables.
lindquist
parents: 24
diff changeset
611 llvm::GlobalValue::LinkageTypes _linkage;
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
612 if (parent && parent->isFuncDeclaration())
26
99737f94abfb [svn r30] * Fixed static function-local variables.
lindquist
parents: 24
diff changeset
613 _linkage = llvm::GlobalValue::InternalLinkage;
99737f94abfb [svn r30] * Fixed static function-local variables.
lindquist
parents: 24
diff changeset
614 else
99737f94abfb [svn r30] * Fixed static function-local variables.
lindquist
parents: 24
diff changeset
615 _linkage = LLVM_DtoLinkage(protection, storage_class);
99737f94abfb [svn r30] * Fixed static function-local variables.
lindquist
parents: 24
diff changeset
616
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
617 Type* t = LLVM_DtoDType(type);
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
618
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
619 const llvm::Type* _type = LLVM_DtoType(t);
21
8d45266bbabe [svn r25] * Fixed a lot of problems with string literals
lindquist
parents: 18
diff changeset
620 assert(_type);
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
621
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
622 llvm::Constant* _init = 0;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
623 bool _signed = !type->isunsigned();
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
624
21
8d45266bbabe [svn r25] * Fixed a lot of problems with string literals
lindquist
parents: 18
diff changeset
625 Logger::println("Creating global variable");
8d45266bbabe [svn r25] * Fixed a lot of problems with string literals
lindquist
parents: 18
diff changeset
626 std::string _name(mangle());
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
627
21
8d45266bbabe [svn r25] * Fixed a lot of problems with string literals
lindquist
parents: 18
diff changeset
628 llvm::GlobalVariable* gvar = new llvm::GlobalVariable(_type,_isconst,_linkage,0,_name,M);
8d45266bbabe [svn r25] * Fixed a lot of problems with string literals
lindquist
parents: 18
diff changeset
629 llvmValue = gvar;
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
630
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
631 // if extern don't emit initializer
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
632 if (!(storage_class & STCextern))
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
633 {
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
634 _init = LLVM_DtoConstInitializer(t, init);
21
8d45266bbabe [svn r25] * Fixed a lot of problems with string literals
lindquist
parents: 18
diff changeset
635
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
636 //Logger::cout() << "initializer: " << *_init << '\n';
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
637 if (_type != _init->getType()) {
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
638 Logger::cout() << "got type '" << *_init->getType() << "' expected '" << *_type << "'\n";
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
639 // zero initalizer
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
640 if (_init->isNullValue())
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
641 _init = llvm::Constant::getNullValue(_type);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
642 // pointer to global constant (struct.init)
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
643 else if (llvm::isa<llvm::GlobalVariable>(_init))
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
644 {
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
645 assert(_init->getType()->getContainedType(0) == _type);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
646 llvm::GlobalVariable* gv = llvm::cast<llvm::GlobalVariable>(_init);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
647 assert(t->ty == Tstruct);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
648 TypeStruct* ts = (TypeStruct*)t;
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
649 assert(ts->sym->llvmInitZ);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
650 _init = ts->sym->llvmInitZ;
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
651 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
652 // array single value init
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
653 else if (llvm::isa<llvm::ArrayType>(_type))
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
654 {
69
2b5a2eaa88be [svn r73] Identity expression for dynamic array and null was broken.
lindquist
parents: 68
diff changeset
655 _init = LLVM_DtoConstStaticArray(_type, _init);
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
656 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
657 else {
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
658 Logger::cout() << "Unexpected initializer type: " << *_type << '\n';
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
659 //assert(0);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
660 }
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
661 }
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
662
64
b688ad419f8c [svn r68] Added support for multi-dimensional static arrays.
lindquist
parents: 63
diff changeset
663 Logger::cout() << "final init = " << *_init << '\n';
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
664 gvar->setInitializer(_init);
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
665 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
666
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
667 llvmDModule = gIR->dmodule;
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
668
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
669 //if (storage_class & STCprivate)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
670 // gvar->setVisibility(llvm::GlobalValue::ProtectedVisibility);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
671 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
672
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
673 // inside aggregate declaration. declare a field.
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
674 else
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
675 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
676 Logger::println("Aggregate var declaration: '%s' offset=%d", toChars(), offset);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
677
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
678 Type* t = LLVM_DtoDType(type);
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
679 const llvm::Type* _type = LLVM_DtoType(t);
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
680
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
681 llvm::Constant*_init = LLVM_DtoConstInitializer(t, init);
28
1c80c18f3c82 [svn r32] * Fixed problems with arrays members of aggregates
lindquist
parents: 26
diff changeset
682 assert(_init);
1c80c18f3c82 [svn r32] * Fixed problems with arrays members of aggregates
lindquist
parents: 26
diff changeset
683 Logger::cout() << "field init is: " << *_init << " type should be " << *_type << '\n';
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
684 if (_type != _init->getType())
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
685 {
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
686 if (t->ty == Tsarray)
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
687 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
688 const llvm::ArrayType* arrty = llvm::cast<llvm::ArrayType>(_type);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
689 uint64_t n = arrty->getNumElements();
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
690 std::vector<llvm::Constant*> vals(n,_init);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
691 _init = llvm::ConstantArray::get(arrty, vals);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
692 }
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
693 else if (t->ty == Tarray)
28
1c80c18f3c82 [svn r32] * Fixed problems with arrays members of aggregates
lindquist
parents: 26
diff changeset
694 {
1c80c18f3c82 [svn r32] * Fixed problems with arrays members of aggregates
lindquist
parents: 26
diff changeset
695 assert(llvm::isa<llvm::StructType>(_type));
1c80c18f3c82 [svn r32] * Fixed problems with arrays members of aggregates
lindquist
parents: 26
diff changeset
696 _init = llvm::ConstantAggregateZero::get(_type);
1c80c18f3c82 [svn r32] * Fixed problems with arrays members of aggregates
lindquist
parents: 26
diff changeset
697 }
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
698 else if (t->ty == Tstruct)
28
1c80c18f3c82 [svn r32] * Fixed problems with arrays members of aggregates
lindquist
parents: 26
diff changeset
699 {
6
35d93ce68cf4 [svn r10] Updated for LLVM rev. 20070913
lindquist
parents: 4
diff changeset
700 const llvm::StructType* structty = llvm::cast<llvm::StructType>(_type);
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
701 TypeStruct* ts = (TypeStruct*)t;
9
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
702 assert(ts);
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
703 assert(ts->sym);
6
35d93ce68cf4 [svn r10] Updated for LLVM rev. 20070913
lindquist
parents: 4
diff changeset
704 assert(ts->sym->llvmInitZ);
35d93ce68cf4 [svn r10] Updated for LLVM rev. 20070913
lindquist
parents: 4
diff changeset
705 _init = ts->sym->llvmInitZ;
35d93ce68cf4 [svn r10] Updated for LLVM rev. 20070913
lindquist
parents: 4
diff changeset
706 }
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
707 else if (t->ty == Tclass)
28
1c80c18f3c82 [svn r32] * Fixed problems with arrays members of aggregates
lindquist
parents: 26
diff changeset
708 {
1c80c18f3c82 [svn r32] * Fixed problems with arrays members of aggregates
lindquist
parents: 26
diff changeset
709 _init = llvm::Constant::getNullValue(_type);
1c80c18f3c82 [svn r32] * Fixed problems with arrays members of aggregates
lindquist
parents: 26
diff changeset
710 }
1c80c18f3c82 [svn r32] * Fixed problems with arrays members of aggregates
lindquist
parents: 26
diff changeset
711 else {
1c80c18f3c82 [svn r32] * Fixed problems with arrays members of aggregates
lindquist
parents: 26
diff changeset
712 Logger::println("failed for type %s", type->toChars());
1c80c18f3c82 [svn r32] * Fixed problems with arrays members of aggregates
lindquist
parents: 26
diff changeset
713 assert(0);
1c80c18f3c82 [svn r32] * Fixed problems with arrays members of aggregates
lindquist
parents: 26
diff changeset
714 }
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
715 }
73
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
716
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
717 // add the field in the IRStruct
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
718 gIR->topstruct().offsets.insert(std::make_pair(offset, IRStruct::Offset(this,_init)));
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
719 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
720
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
721 Logger::println("VarDeclaration::toObjFile is done");
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
722 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
723
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
724 /* ================================================================== */
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
725
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
726 void TypedefDeclaration::toObjFile()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
727 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
728 static int tdi = 0;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
729 Logger::print("TypedefDeclaration::toObjFile(%d): %s\n", tdi++, toChars());
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
730 LOG_SCOPE;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
731
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
732 // generate typeinfo
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 69
diff changeset
733 type->getTypeInfo(NULL);
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
734 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
735
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
736 /* ================================================================== */
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
737
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
738 void EnumDeclaration::toObjFile()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
739 {
38
27b2f40bdb58 [svn r42] Disabled the extensive logging by default. Use the -vv flag to get it back.
lindquist
parents: 31
diff changeset
740 Logger::println("Ignoring EnumDeclaration::toObjFile for %s", toChars());
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
741 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
742
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
743 /* ================================================================== */
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
744
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
745 void FuncDeclaration::toObjFile()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
746 {
18
c05ef76f1c20 [svn r22] * Forgot to add std.stdio
lindquist
parents: 17
diff changeset
747 if (llvmDModule) {
9
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
748 assert(llvmValue != 0);
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
749 return;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
750 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
751
63
2c39b5292cf3 [svn r67] Fixed ignore unittests instead of failing to compile
lindquist
parents: 58
diff changeset
752 if (isUnitTestDeclaration()) {
2c39b5292cf3 [svn r67] Fixed ignore unittests instead of failing to compile
lindquist
parents: 58
diff changeset
753 Logger::println("*** ATTENTION: ignoring unittest declaration: %s", toChars());
2c39b5292cf3 [svn r67] Fixed ignore unittests instead of failing to compile
lindquist
parents: 58
diff changeset
754 return;
2c39b5292cf3 [svn r67] Fixed ignore unittests instead of failing to compile
lindquist
parents: 58
diff changeset
755 }
2c39b5292cf3 [svn r67] Fixed ignore unittests instead of failing to compile
lindquist
parents: 58
diff changeset
756
55
0ccfae271c45 [svn r59] Added support for C-style variadic functions. Currently only works on x86, x86-64 va_arg is broken in LLVM 2.1. PPC and PPC64 unknown.
lindquist
parents: 54
diff changeset
757 Type* t = LLVM_DtoDType(type);
0ccfae271c45 [svn r59] Added support for C-style variadic functions. Currently only works on x86, x86-64 va_arg is broken in LLVM 2.1. PPC and PPC64 unknown.
lindquist
parents: 54
diff changeset
758 TypeFunction* f = (TypeFunction*)t;
0ccfae271c45 [svn r59] Added support for C-style variadic functions. Currently only works on x86, x86-64 va_arg is broken in LLVM 2.1. PPC and PPC64 unknown.
lindquist
parents: 54
diff changeset
759
0ccfae271c45 [svn r59] Added support for C-style variadic functions. Currently only works on x86, x86-64 va_arg is broken in LLVM 2.1. PPC and PPC64 unknown.
lindquist
parents: 54
diff changeset
760 bool declareOnly = false;
0ccfae271c45 [svn r59] Added support for C-style variadic functions. Currently only works on x86, x86-64 va_arg is broken in LLVM 2.1. PPC and PPC64 unknown.
lindquist
parents: 54
diff changeset
761 if (TemplateInstance* tinst = parent->isTemplateInstance()) {
0ccfae271c45 [svn r59] Added support for C-style variadic functions. Currently only works on x86, x86-64 va_arg is broken in LLVM 2.1. PPC and PPC64 unknown.
lindquist
parents: 54
diff changeset
762 TemplateDeclaration* tempdecl = tinst->tempdecl;
0ccfae271c45 [svn r59] Added support for C-style variadic functions. Currently only works on x86, x86-64 va_arg is broken in LLVM 2.1. PPC and PPC64 unknown.
lindquist
parents: 54
diff changeset
763 if (tempdecl->llvmInternal == LLVMva_start)
0ccfae271c45 [svn r59] Added support for C-style variadic functions. Currently only works on x86, x86-64 va_arg is broken in LLVM 2.1. PPC and PPC64 unknown.
lindquist
parents: 54
diff changeset
764 {
0ccfae271c45 [svn r59] Added support for C-style variadic functions. Currently only works on x86, x86-64 va_arg is broken in LLVM 2.1. PPC and PPC64 unknown.
lindquist
parents: 54
diff changeset
765 Logger::println("magic va_start found");
0ccfae271c45 [svn r59] Added support for C-style variadic functions. Currently only works on x86, x86-64 va_arg is broken in LLVM 2.1. PPC and PPC64 unknown.
lindquist
parents: 54
diff changeset
766 llvmInternal = LLVMva_start;
0ccfae271c45 [svn r59] Added support for C-style variadic functions. Currently only works on x86, x86-64 va_arg is broken in LLVM 2.1. PPC and PPC64 unknown.
lindquist
parents: 54
diff changeset
767 declareOnly = true;
0ccfae271c45 [svn r59] Added support for C-style variadic functions. Currently only works on x86, x86-64 va_arg is broken in LLVM 2.1. PPC and PPC64 unknown.
lindquist
parents: 54
diff changeset
768 }
0ccfae271c45 [svn r59] Added support for C-style variadic functions. Currently only works on x86, x86-64 va_arg is broken in LLVM 2.1. PPC and PPC64 unknown.
lindquist
parents: 54
diff changeset
769 else if (tempdecl->llvmInternal == LLVMva_arg)
0ccfae271c45 [svn r59] Added support for C-style variadic functions. Currently only works on x86, x86-64 va_arg is broken in LLVM 2.1. PPC and PPC64 unknown.
lindquist
parents: 54
diff changeset
770 {
0ccfae271c45 [svn r59] Added support for C-style variadic functions. Currently only works on x86, x86-64 va_arg is broken in LLVM 2.1. PPC and PPC64 unknown.
lindquist
parents: 54
diff changeset
771 Logger::println("magic va_arg found");
0ccfae271c45 [svn r59] Added support for C-style variadic functions. Currently only works on x86, x86-64 va_arg is broken in LLVM 2.1. PPC and PPC64 unknown.
lindquist
parents: 54
diff changeset
772 llvmInternal = LLVMva_arg;
0ccfae271c45 [svn r59] Added support for C-style variadic functions. Currently only works on x86, x86-64 va_arg is broken in LLVM 2.1. PPC and PPC64 unknown.
lindquist
parents: 54
diff changeset
773 return;
0ccfae271c45 [svn r59] Added support for C-style variadic functions. Currently only works on x86, x86-64 va_arg is broken in LLVM 2.1. PPC and PPC64 unknown.
lindquist
parents: 54
diff changeset
774 }
0ccfae271c45 [svn r59] Added support for C-style variadic functions. Currently only works on x86, x86-64 va_arg is broken in LLVM 2.1. PPC and PPC64 unknown.
lindquist
parents: 54
diff changeset
775 }
0ccfae271c45 [svn r59] Added support for C-style variadic functions. Currently only works on x86, x86-64 va_arg is broken in LLVM 2.1. PPC and PPC64 unknown.
lindquist
parents: 54
diff changeset
776
9
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
777 llvm::Function* func = LLVM_DtoDeclareFunction(this);
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
778
55
0ccfae271c45 [svn r59] Added support for C-style variadic functions. Currently only works on x86, x86-64 va_arg is broken in LLVM 2.1. PPC and PPC64 unknown.
lindquist
parents: 54
diff changeset
779 if (declareOnly)
0ccfae271c45 [svn r59] Added support for C-style variadic functions. Currently only works on x86, x86-64 va_arg is broken in LLVM 2.1. PPC and PPC64 unknown.
lindquist
parents: 54
diff changeset
780 return;
0ccfae271c45 [svn r59] Added support for C-style variadic functions. Currently only works on x86, x86-64 va_arg is broken in LLVM 2.1. PPC and PPC64 unknown.
lindquist
parents: 54
diff changeset
781
31
2841234d2aea [svn r35] * Attributes on struct fields/methods now work
lindquist
parents: 28
diff changeset
782 if (!gIR->structs.empty() && gIR->topstruct().queueFuncs) {
11
d3ee9efe20e2 [svn r15] * Fixed a bunch problems with virtual calls. Seems I did some rather poor testing.
lindquist
parents: 10
diff changeset
783 if (!llvmQueued) {
d3ee9efe20e2 [svn r15] * Fixed a bunch problems with virtual calls. Seems I did some rather poor testing.
lindquist
parents: 10
diff changeset
784 Logger::println("queueing %s", toChars());
31
2841234d2aea [svn r35] * Attributes on struct fields/methods now work
lindquist
parents: 28
diff changeset
785 gIR->topstruct().funcs.push_back(this);
11
d3ee9efe20e2 [svn r15] * Fixed a bunch problems with virtual calls. Seems I did some rather poor testing.
lindquist
parents: 10
diff changeset
786 llvmQueued = true;
d3ee9efe20e2 [svn r15] * Fixed a bunch problems with virtual calls. Seems I did some rather poor testing.
lindquist
parents: 10
diff changeset
787 }
10
c0f2c47e5034 [svn r14] Forgot something stupid...y
lindquist
parents: 9
diff changeset
788 return; // we wait with the definition as they might invoke a virtual method and the vtable is not yet complete
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
789 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
790
11
d3ee9efe20e2 [svn r15] * Fixed a bunch problems with virtual calls. Seems I did some rather poor testing.
lindquist
parents: 10
diff changeset
791 assert(f->llvmType);
d3ee9efe20e2 [svn r15] * Fixed a bunch problems with virtual calls. Seems I did some rather poor testing.
lindquist
parents: 10
diff changeset
792 const llvm::FunctionType* functype = llvm::cast<llvm::FunctionType>(llvmValue->getType()->getContainedType(0));
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
793
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
794 // only members of the current module maybe be defined
17
6c6cd097bcdf [svn r21] * Fixed local instances of imported templates
lindquist
parents: 15
diff changeset
795 if (getModule() == gIR->dmodule || parent->isTemplateInstance())
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
796 {
11
d3ee9efe20e2 [svn r15] * Fixed a bunch problems with virtual calls. Seems I did some rather poor testing.
lindquist
parents: 10
diff changeset
797 llvmDModule = gIR->dmodule;
d3ee9efe20e2 [svn r15] * Fixed a bunch problems with virtual calls. Seems I did some rather poor testing.
lindquist
parents: 10
diff changeset
798
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
799 bool allow_fbody = true;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
800 // handle static constructor / destructor
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
801 if (isStaticCtorDeclaration() || isStaticDtorDeclaration()) {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
802 const llvm::ArrayType* sctor_type = llvm::ArrayType::get(llvm::PointerType::get(functype),1);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
803 //Logger::cout() << "static ctor type: " << *sctor_type << '\n';
11
d3ee9efe20e2 [svn r15] * Fixed a bunch problems with virtual calls. Seems I did some rather poor testing.
lindquist
parents: 10
diff changeset
804
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
805 llvm::Constant* sctor_func = llvm::cast<llvm::Constant>(llvmValue);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
806 //Logger::cout() << "static ctor func: " << *sctor_func << '\n';
11
d3ee9efe20e2 [svn r15] * Fixed a bunch problems with virtual calls. Seems I did some rather poor testing.
lindquist
parents: 10
diff changeset
807
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
808 llvm::Constant* sctor_init = 0;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
809 if (llvmInternal == LLVMnull)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
810 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
811 llvm::Constant* sctor_init_null = llvm::Constant::getNullValue(sctor_func->getType());
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
812 sctor_init = llvm::ConstantArray::get(sctor_type,&sctor_init_null,1);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
813 allow_fbody = false;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
814 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
815 else
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
816 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
817 sctor_init = llvm::ConstantArray::get(sctor_type,&sctor_func,1);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
818 }
11
d3ee9efe20e2 [svn r15] * Fixed a bunch problems with virtual calls. Seems I did some rather poor testing.
lindquist
parents: 10
diff changeset
819
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
820 //Logger::cout() << "static ctor init: " << *sctor_init << '\n';
11
d3ee9efe20e2 [svn r15] * Fixed a bunch problems with virtual calls. Seems I did some rather poor testing.
lindquist
parents: 10
diff changeset
821
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
822 // output the llvm.global_ctors array
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
823 const char* varname = isStaticCtorDeclaration() ? "_d_module_ctor_array" : "_d_module_dtor_array";
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
824 llvm::GlobalVariable* sctor_arr = new llvm::GlobalVariable(sctor_type, false, llvm::GlobalValue::AppendingLinkage, sctor_init, varname, gIR->module);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
825 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
826
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
827 // function definition
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
828 if (allow_fbody && fbody != 0)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
829 {
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
830 gIR->functions.push_back(IRFunction(this));
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
831 gIR->func().func = func;
15
37a4fdab33fc [svn r19] * Added support for reassigning 'this' inside class constructors.
lindquist
parents: 14
diff changeset
832
11
d3ee9efe20e2 [svn r15] * Fixed a bunch problems with virtual calls. Seems I did some rather poor testing.
lindquist
parents: 10
diff changeset
833 // first make absolutely sure the type is up to date
d3ee9efe20e2 [svn r15] * Fixed a bunch problems with virtual calls. Seems I did some rather poor testing.
lindquist
parents: 10
diff changeset
834 f->llvmType = llvmValue->getType()->getContainedType(0);
d3ee9efe20e2 [svn r15] * Fixed a bunch problems with virtual calls. Seems I did some rather poor testing.
lindquist
parents: 10
diff changeset
835
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
836 //Logger::cout() << "func type: " << *f->llvmType << '\n';
31
2841234d2aea [svn r35] * Attributes on struct fields/methods now work
lindquist
parents: 28
diff changeset
837
15
37a4fdab33fc [svn r19] * Added support for reassigning 'this' inside class constructors.
lindquist
parents: 14
diff changeset
838 // this handling
37a4fdab33fc [svn r19] * Added support for reassigning 'this' inside class constructors.
lindquist
parents: 14
diff changeset
839 if (f->llvmUsesThis) {
50
6fcc08a4d406 [svn r54] Added support for nested delegates referencing parent's stack variables.
lindquist
parents: 40
diff changeset
840 Logger::println("uses this");
15
37a4fdab33fc [svn r19] * Added support for reassigning 'this' inside class constructors.
lindquist
parents: 14
diff changeset
841 if (f->llvmRetInPtr)
37a4fdab33fc [svn r19] * Added support for reassigning 'this' inside class constructors.
lindquist
parents: 14
diff changeset
842 llvmThisVar = ++func->arg_begin();
37a4fdab33fc [svn r19] * Added support for reassigning 'this' inside class constructors.
lindquist
parents: 14
diff changeset
843 else
37a4fdab33fc [svn r19] * Added support for reassigning 'this' inside class constructors.
lindquist
parents: 14
diff changeset
844 llvmThisVar = func->arg_begin();
37a4fdab33fc [svn r19] * Added support for reassigning 'this' inside class constructors.
lindquist
parents: 14
diff changeset
845 assert(llvmThisVar != 0);
37a4fdab33fc [svn r19] * Added support for reassigning 'this' inside class constructors.
lindquist
parents: 14
diff changeset
846 }
37a4fdab33fc [svn r19] * Added support for reassigning 'this' inside class constructors.
lindquist
parents: 14
diff changeset
847
9
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
848 if (isMain())
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
849 gIR->emitMain = true;
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
850
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
851 llvm::BasicBlock* beginbb = new llvm::BasicBlock("entry",func);
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
852 llvm::BasicBlock* endbb = new llvm::BasicBlock("endentry",func);
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
853
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
854 //assert(gIR->scopes.empty());
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
855 gIR->scopes.push_back(IRScope(beginbb, endbb));
11
d3ee9efe20e2 [svn r15] * Fixed a bunch problems with virtual calls. Seems I did some rather poor testing.
lindquist
parents: 10
diff changeset
856
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
857 // create alloca point
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
858 f->llvmAllocaPoint = new llvm::BitCastInst(llvm::ConstantInt::get(llvm::Type::Int32Ty,0,false),llvm::Type::Int32Ty,"alloca point",gIR->scopebb());
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
859 gIR->func().allocapoint = f->llvmAllocaPoint;
11
d3ee9efe20e2 [svn r15] * Fixed a bunch problems with virtual calls. Seems I did some rather poor testing.
lindquist
parents: 10
diff changeset
860
50
6fcc08a4d406 [svn r54] Added support for nested delegates referencing parent's stack variables.
lindquist
parents: 40
diff changeset
861 llvm::Value* parentNested = NULL;
6fcc08a4d406 [svn r54] Added support for nested delegates referencing parent's stack variables.
lindquist
parents: 40
diff changeset
862 if (FuncDeclaration* fd = toParent()->isFuncDeclaration()) {
6fcc08a4d406 [svn r54] Added support for nested delegates referencing parent's stack variables.
lindquist
parents: 40
diff changeset
863 parentNested = fd->llvmNested;
6fcc08a4d406 [svn r54] Added support for nested delegates referencing parent's stack variables.
lindquist
parents: 40
diff changeset
864 }
6fcc08a4d406 [svn r54] Added support for nested delegates referencing parent's stack variables.
lindquist
parents: 40
diff changeset
865
6fcc08a4d406 [svn r54] Added support for nested delegates referencing parent's stack variables.
lindquist
parents: 40
diff changeset
866 // construct nested variables struct
6fcc08a4d406 [svn r54] Added support for nested delegates referencing parent's stack variables.
lindquist
parents: 40
diff changeset
867 if (!llvmNestedVars.empty() || parentNested) {
6fcc08a4d406 [svn r54] Added support for nested delegates referencing parent's stack variables.
lindquist
parents: 40
diff changeset
868 std::vector<const llvm::Type*> nestTypes;
6fcc08a4d406 [svn r54] Added support for nested delegates referencing parent's stack variables.
lindquist
parents: 40
diff changeset
869 int j = 0;
6fcc08a4d406 [svn r54] Added support for nested delegates referencing parent's stack variables.
lindquist
parents: 40
diff changeset
870 if (parentNested) {
6fcc08a4d406 [svn r54] Added support for nested delegates referencing parent's stack variables.
lindquist
parents: 40
diff changeset
871 nestTypes.push_back(parentNested->getType());
6fcc08a4d406 [svn r54] Added support for nested delegates referencing parent's stack variables.
lindquist
parents: 40
diff changeset
872 j++;
6fcc08a4d406 [svn r54] Added support for nested delegates referencing parent's stack variables.
lindquist
parents: 40
diff changeset
873 }
6fcc08a4d406 [svn r54] Added support for nested delegates referencing parent's stack variables.
lindquist
parents: 40
diff changeset
874 for (std::set<VarDeclaration*>::iterator i=llvmNestedVars.begin(); i!=llvmNestedVars.end(); ++i) {
6fcc08a4d406 [svn r54] Added support for nested delegates referencing parent's stack variables.
lindquist
parents: 40
diff changeset
875 VarDeclaration* vd = *i;
6fcc08a4d406 [svn r54] Added support for nested delegates referencing parent's stack variables.
lindquist
parents: 40
diff changeset
876 vd->llvmNestedIndex = j++;
67
f918f3e2e99e [svn r71] Fixed accessing parent function arguments from inside nested delegates.
lindquist
parents: 64
diff changeset
877 if (vd->isParameter()) {
f918f3e2e99e [svn r71] Fixed accessing parent function arguments from inside nested delegates.
lindquist
parents: 64
diff changeset
878 assert(vd->llvmValue);
f918f3e2e99e [svn r71] Fixed accessing parent function arguments from inside nested delegates.
lindquist
parents: 64
diff changeset
879 nestTypes.push_back(vd->llvmValue->getType());
f918f3e2e99e [svn r71] Fixed accessing parent function arguments from inside nested delegates.
lindquist
parents: 64
diff changeset
880 }
f918f3e2e99e [svn r71] Fixed accessing parent function arguments from inside nested delegates.
lindquist
parents: 64
diff changeset
881 else {
f918f3e2e99e [svn r71] Fixed accessing parent function arguments from inside nested delegates.
lindquist
parents: 64
diff changeset
882 nestTypes.push_back(LLVM_DtoType(vd->type));
f918f3e2e99e [svn r71] Fixed accessing parent function arguments from inside nested delegates.
lindquist
parents: 64
diff changeset
883 }
50
6fcc08a4d406 [svn r54] Added support for nested delegates referencing parent's stack variables.
lindquist
parents: 40
diff changeset
884 }
6fcc08a4d406 [svn r54] Added support for nested delegates referencing parent's stack variables.
lindquist
parents: 40
diff changeset
885 const llvm::StructType* nestSType = llvm::StructType::get(nestTypes);
6fcc08a4d406 [svn r54] Added support for nested delegates referencing parent's stack variables.
lindquist
parents: 40
diff changeset
886 Logger::cout() << "nested var struct has type:" << '\n' << *nestSType;
6fcc08a4d406 [svn r54] Added support for nested delegates referencing parent's stack variables.
lindquist
parents: 40
diff changeset
887 llvmNested = new llvm::AllocaInst(nestSType,"nestedvars",f->llvmAllocaPoint);
6fcc08a4d406 [svn r54] Added support for nested delegates referencing parent's stack variables.
lindquist
parents: 40
diff changeset
888 if (parentNested) {
6fcc08a4d406 [svn r54] Added support for nested delegates referencing parent's stack variables.
lindquist
parents: 40
diff changeset
889 assert(llvmThisVar);
6fcc08a4d406 [svn r54] Added support for nested delegates referencing parent's stack variables.
lindquist
parents: 40
diff changeset
890 llvm::Value* ptr = gIR->ir->CreateBitCast(llvmThisVar, parentNested->getType(), "tmp");
6fcc08a4d406 [svn r54] Added support for nested delegates referencing parent's stack variables.
lindquist
parents: 40
diff changeset
891 gIR->ir->CreateStore(ptr, LLVM_DtoGEPi(llvmNested, 0,0, "tmp"));
6fcc08a4d406 [svn r54] Added support for nested delegates referencing parent's stack variables.
lindquist
parents: 40
diff changeset
892 }
67
f918f3e2e99e [svn r71] Fixed accessing parent function arguments from inside nested delegates.
lindquist
parents: 64
diff changeset
893 for (std::set<VarDeclaration*>::iterator i=llvmNestedVars.begin(); i!=llvmNestedVars.end(); ++i) {
f918f3e2e99e [svn r71] Fixed accessing parent function arguments from inside nested delegates.
lindquist
parents: 64
diff changeset
894 VarDeclaration* vd = *i;
f918f3e2e99e [svn r71] Fixed accessing parent function arguments from inside nested delegates.
lindquist
parents: 64
diff changeset
895 if (vd->isParameter()) {
f918f3e2e99e [svn r71] Fixed accessing parent function arguments from inside nested delegates.
lindquist
parents: 64
diff changeset
896 gIR->ir->CreateStore(vd->llvmValue, LLVM_DtoGEPi(llvmNested, 0, vd->llvmNestedIndex, "tmp"));
68
c4b3f5d2cd9b [svn r72] Calling a nested function that is not a delegate was not working.
lindquist
parents: 67
diff changeset
897 vd->llvmValue = llvmNested;
67
f918f3e2e99e [svn r71] Fixed accessing parent function arguments from inside nested delegates.
lindquist
parents: 64
diff changeset
898 }
f918f3e2e99e [svn r71] Fixed accessing parent function arguments from inside nested delegates.
lindquist
parents: 64
diff changeset
899 }
50
6fcc08a4d406 [svn r54] Added support for nested delegates referencing parent's stack variables.
lindquist
parents: 40
diff changeset
900 }
6fcc08a4d406 [svn r54] Added support for nested delegates referencing parent's stack variables.
lindquist
parents: 40
diff changeset
901
57
a9d29e9f1fed [svn r61] Added support for D-style variadic functions :)
lindquist
parents: 55
diff changeset
902 // copy _argptr to a memory location
a9d29e9f1fed [svn r61] Added support for D-style variadic functions :)
lindquist
parents: 55
diff changeset
903 if (f->linkage == LINKd && f->varargs == 1)
a9d29e9f1fed [svn r61] Added support for D-style variadic functions :)
lindquist
parents: 55
diff changeset
904 {
a9d29e9f1fed [svn r61] Added support for D-style variadic functions :)
lindquist
parents: 55
diff changeset
905 llvm::Value* argptrmem = new llvm::AllocaInst(llvmArgPtr->getType(), "_argptrmem", gIR->topallocapoint());
a9d29e9f1fed [svn r61] Added support for D-style variadic functions :)
lindquist
parents: 55
diff changeset
906 new llvm::StoreInst(llvmArgPtr, argptrmem, gIR->scopebb());
a9d29e9f1fed [svn r61] Added support for D-style variadic functions :)
lindquist
parents: 55
diff changeset
907 llvmArgPtr = argptrmem;
a9d29e9f1fed [svn r61] Added support for D-style variadic functions :)
lindquist
parents: 55
diff changeset
908 }
a9d29e9f1fed [svn r61] Added support for D-style variadic functions :)
lindquist
parents: 55
diff changeset
909
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
910 // output function body
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
911 fbody->toIR(gIR);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
912
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
913 // llvm requires all basic blocks to end with a TerminatorInst but DMD does not put a return statement
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
914 // in automatically, so we do it here.
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
915 if (!isMain()) {
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
916 if (!gIR->scopereturned()) {
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
917 // pass the previous block into this block
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
918 //new llvm::BranchInst(irs.end, irs.begin);
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
919 if (func->getReturnType() == llvm::Type::VoidTy) {
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
920 new llvm::ReturnInst(gIR->scopebb());
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
921 }
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
922 else {
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
923 new llvm::ReturnInst(llvm::UndefValue::get(func->getReturnType()), gIR->scopebb());
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
924 }
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
925 }
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
926 }
11
d3ee9efe20e2 [svn r15] * Fixed a bunch problems with virtual calls. Seems I did some rather poor testing.
lindquist
parents: 10
diff changeset
927
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
928 // erase alloca point
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
929 f->llvmAllocaPoint->eraseFromParent();
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
930 f->llvmAllocaPoint = 0;
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
931 gIR->func().allocapoint = 0;
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
932
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
933 gIR->scopes.pop_back();
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
934
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
935 // get rid of the endentry block, it's never used
9
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
936 assert(!func->getBasicBlockList().empty());
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
937 func->getBasicBlockList().pop_back();
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
938
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
939 // if the last block is empty now, it must be unreachable or it's a bug somewhere else
9
dafae18f9c08 [svn r13] * Updated for LLVM 2.1
lindquist
parents: 8
diff changeset
940 // would be nice to figure out how to assert that this is correct
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
941 llvm::BasicBlock* lastbb = &func->getBasicBlockList().back();
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
942 if (lastbb->empty()) {
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
943 if (lastbb->getNumUses() == 0)
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
944 lastbb->eraseFromParent();
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
945 else {
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
946 new llvm::UnreachableInst(lastbb);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
947 /*if (func->getReturnType() == llvm::Type::VoidTy) {
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
948 new llvm::ReturnInst(lastbb);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
949 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
950 else {
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
951 new llvm::ReturnInst(llvm::UndefValue::get(func->getReturnType()), lastbb);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
952 }*/
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 50
diff changeset
953 }
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
954 }
15
37a4fdab33fc [svn r19] * Added support for reassigning 'this' inside class constructors.
lindquist
parents: 14
diff changeset
955
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 38
diff changeset
956 gIR->functions.pop_back();
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
957 }
17
6c6cd097bcdf [svn r21] * Fixed local instances of imported templates
lindquist
parents: 15
diff changeset
958
6c6cd097bcdf [svn r21] * Fixed local instances of imported templates
lindquist
parents: 15
diff changeset
959 // template instances should have weak linkage
6c6cd097bcdf [svn r21] * Fixed local instances of imported templates
lindquist
parents: 15
diff changeset
960 if (parent->isTemplateInstance()) {
6c6cd097bcdf [svn r21] * Fixed local instances of imported templates
lindquist
parents: 15
diff changeset
961 func->setLinkage(llvm::GlobalValue::WeakLinkage);
6c6cd097bcdf [svn r21] * Fixed local instances of imported templates
lindquist
parents: 15
diff changeset
962 }
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
963 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
964 }