annotate gen/structs.cpp @ 602:48f079b4fe0f

Fixed ArrayLiteralExp::toConstElem for dynamic arrays, tango-user library should now be possible to build. It seems to be related to DMD bug 2356, which must have been introduced recently, as we already handled this fine for ArrayInitializers, just not ArrayLiterals... Kinda annoying to have to do this work due to DMD bugs ...
author Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
date Mon, 15 Sep 2008 15:48:59 +0200
parents fbb1a366cfbc
children 26fce59fe80a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
1 #include <algorithm>
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
2
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
3 #include "gen/llvm.h"
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
4
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
5 #include "mtype.h"
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
6 #include "aggregate.h"
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
7 #include "init.h"
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
8 #include "declaration.h"
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
9
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
10 #include "gen/irstate.h"
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
11 #include "gen/tollvm.h"
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 217
diff changeset
12 #include "gen/llvmhelpers.h"
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
13 #include "gen/arrays.h"
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
14 #include "gen/logger.h"
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
15 #include "gen/structs.h"
344
e20ce6d8d374 [svn r365] Implemented raw struct equality comparison, uses C memcmp.
lindquist
parents: 336
diff changeset
16 #include "gen/dvalue.h"
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
17
136
0e28624814e8 [svn r140] did a lot of the work towards being able to pass multiple modules on the command line. not complete yet though
lindquist
parents: 133
diff changeset
18 #include "ir/irstruct.h"
0e28624814e8 [svn r140] did a lot of the work towards being able to pass multiple modules on the command line. not complete yet though
lindquist
parents: 133
diff changeset
19
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
20 //////////////////////////////////////////////////////////////////////////////////////////
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 205
diff changeset
21 LLConstant* DtoConstStructInitializer(StructInitializer* si)
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
22 {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
23 Logger::println("DtoConstStructInitializer: %s", si->toChars());
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
24 LOG_SCOPE;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
25
449
56265fa07c7d Fixed problem where global variables did not resolve type before using it.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
26 assert(si->ad);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
27 TypeStruct* ts = (TypeStruct*)si->ad->type;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
28
449
56265fa07c7d Fixed problem where global variables did not resolve type before using it.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
29 DtoResolveDsymbol(si->ad);
56265fa07c7d Fixed problem where global variables did not resolve type before using it.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 443
diff changeset
30
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 171
diff changeset
31 const llvm::StructType* structtype = isaStruct(ts->ir.type->get());
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
32 Logger::cout() << "llvm struct type: " << *structtype << '\n';
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
33
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
34 assert(si->value.dim == si->vars.dim);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
35
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
36 std::vector<DUnionIdx> inits;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
37 for (int i = 0; i < si->value.dim; ++i)
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
38 {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
39 Initializer* ini = (Initializer*)si->value.data[i];
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
40 assert(ini);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
41 VarDeclaration* vd = (VarDeclaration*)si->vars.data[i];
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
42 assert(vd);
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 205
diff changeset
43 LLConstant* v = DtoConstInitializer(vd->type, ini);
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 171
diff changeset
44 inits.push_back(DUnionIdx(vd->ir.irField->index, vd->ir.irField->indexOffset, v));
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
45 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
46
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
47 DtoConstInitStruct((StructDeclaration*)si->ad);
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 171
diff changeset
48 return si->ad->ir.irStruct->dunion->getConst(inits);
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
49 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
50
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
51 //////////////////////////////////////////////////////////////////////////////////////////
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
52
217
0806379a5eca [svn r233] Added: -oq command line option for writing fully qualified object names.
lindquist
parents: 213
diff changeset
53 LLValue* DtoIndexStruct(LLValue* ptr, StructDeclaration* sd, Type* t, unsigned os, DStructIndexVector& idxs)
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
54 {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
55 Logger::println("checking for offset %u type %s:", os, t->toChars());
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
56 LOG_SCOPE;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
57
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
58 if (idxs.empty())
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
59 idxs.push_back(0);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
60
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 205
diff changeset
61 const LLType* llt = getPtrToType(DtoType(t));
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 205
diff changeset
62 const LLType* st = getPtrToType(DtoType(sd->type));
585
fbb1a366cfbc Complex number should now follow the D ABI on x86. They're also treated as first class values now. Big change.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
63
fbb1a366cfbc Complex number should now follow the D ABI on x86. They're also treated as first class values now. Big change.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
64 Logger::cout() << "ptr = " << *ptr << '\n';
fbb1a366cfbc Complex number should now follow the D ABI on x86. They're also treated as first class values now. Big change.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
65 Logger::cout() << "st = " << *st << '\n';
fbb1a366cfbc Complex number should now follow the D ABI on x86. They're also treated as first class values now. Big change.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
66
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
67 if (ptr->getType() != st) {
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 171
diff changeset
68 assert(sd->ir.irStruct->hasUnions);
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
69 ptr = gIR->ir->CreateBitCast(ptr, st, "tmp");
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
70 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
71
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
72 for (unsigned i=0; i<sd->fields.dim; ++i) {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
73 VarDeclaration* vd = (VarDeclaration*)sd->fields.data[i];
486
a34078905d01 Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 449
diff changeset
74 Type* vdtype = vd->type->toBasetype();
169
2df270e1ba59 [svn r185] Fixed broken nested classes with data members, did DMD change the class layout? tango.text.Regex now compiles.
lindquist
parents: 157
diff changeset
75 //Logger::println("found %u type %s", vd->offset, vdtype->toChars());
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 171
diff changeset
76 assert(vd->ir.irField->index >= 0);
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
77 if (os == vd->offset && vdtype == t) {
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 171
diff changeset
78 idxs.push_back(vd->ir.irField->index);
217
0806379a5eca [svn r233] Added: -oq command line option for writing fully qualified object names.
lindquist
parents: 213
diff changeset
79 ptr = DtoGEPi(ptr, idxs, "tmp");
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
80 if (ptr->getType() != llt)
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
81 ptr = gIR->ir->CreateBitCast(ptr, llt, "tmp");
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 171
diff changeset
82 if (vd->ir.irField->indexOffset)
205
9d44ec83acd1 [svn r221] Update: Switched to the 2.3 LLVM svn branch, http://llvm.org/svn/llvm-project/llvm/branches/release_23 .
lindquist
parents: 173
diff changeset
83 ptr = llvm::GetElementPtrInst::Create(ptr, DtoConstUint(vd->ir.irField->indexOffset), "tmp", gIR->scopebb());
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
84 return ptr;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
85 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
86 else if (vdtype->ty == Tstruct && (vd->offset + vdtype->size()) > os) {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
87 TypeStruct* ts = (TypeStruct*)vdtype;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
88 StructDeclaration* ssd = ts->sym;
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 171
diff changeset
89 idxs.push_back(vd->ir.irField->index);
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 171
diff changeset
90 if (vd->ir.irField->indexOffset) {
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
91 Logger::println("has union field offset");
217
0806379a5eca [svn r233] Added: -oq command line option for writing fully qualified object names.
lindquist
parents: 213
diff changeset
92 ptr = DtoGEPi(ptr, idxs, "tmp");
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
93 if (ptr->getType() != llt)
133
44a95ac7368a [svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents: 132
diff changeset
94 ptr = DtoBitCast(ptr, llt);
205
9d44ec83acd1 [svn r221] Update: Switched to the 2.3 LLVM svn branch, http://llvm.org/svn/llvm-project/llvm/branches/release_23 .
lindquist
parents: 173
diff changeset
95 ptr = llvm::GetElementPtrInst::Create(ptr, DtoConstUint(vd->ir.irField->indexOffset), "tmp", gIR->scopebb());
217
0806379a5eca [svn r233] Added: -oq command line option for writing fully qualified object names.
lindquist
parents: 213
diff changeset
96 DStructIndexVector tmp;
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
97 return DtoIndexStruct(ptr, ssd, t, os-vd->offset, tmp);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
98 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
99 else {
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 205
diff changeset
100 const LLType* sty = getPtrToType(DtoType(vd->type));
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
101 if (ptr->getType() != sty) {
133
44a95ac7368a [svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents: 132
diff changeset
102 ptr = DtoBitCast(ptr, sty);
217
0806379a5eca [svn r233] Added: -oq command line option for writing fully qualified object names.
lindquist
parents: 213
diff changeset
103 DStructIndexVector tmp;
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
104 return DtoIndexStruct(ptr, ssd, t, os-vd->offset, tmp);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
105 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
106 else {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
107 return DtoIndexStruct(ptr, ssd, t, os-vd->offset, idxs);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
108 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
109 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
110 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
111 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
112
133
44a95ac7368a [svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents: 132
diff changeset
113 size_t llt_sz = getTypeStoreSize(llt->getContainedType(0));
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
114 assert(os % llt_sz == 0);
133
44a95ac7368a [svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents: 132
diff changeset
115 ptr = DtoBitCast(ptr, llt);
205
9d44ec83acd1 [svn r221] Update: Switched to the 2.3 LLVM svn branch, http://llvm.org/svn/llvm-project/llvm/branches/release_23 .
lindquist
parents: 173
diff changeset
116 return llvm::GetElementPtrInst::Create(ptr, DtoConstUint(os / llt_sz), "tmp", gIR->scopebb());
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
117 }
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
118
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
119 //////////////////////////////////////////////////////////////////////////////////////////
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
120
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
121 void DtoResolveStruct(StructDeclaration* sd)
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
122 {
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 171
diff changeset
123 if (sd->ir.resolved) return;
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 171
diff changeset
124 sd->ir.resolved = true;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
125
132
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
126 Logger::println("DtoResolveStruct(%s): %s", sd->toChars(), sd->loc.toChars());
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
127 LOG_SCOPE;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
128
171
95f07e3f8bb9 [svn r187] Fixed missing definitions of instances of imported struct template declarations.
lindquist
parents: 169
diff changeset
129 if (sd->prot() == PROTprivate && sd->getModule() != gIR->dmodule)
95f07e3f8bb9 [svn r187] Fixed missing definitions of instances of imported struct template declarations.
lindquist
parents: 169
diff changeset
130 Logger::println("using a private struct from outside its module");
95f07e3f8bb9 [svn r187] Fixed missing definitions of instances of imported struct template declarations.
lindquist
parents: 169
diff changeset
131
486
a34078905d01 Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 449
diff changeset
132 TypeStruct* ts = (TypeStruct*)sd->type->toBasetype();
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
133
435
74101be2a553 Added type param to DVarValue as DMD sometimes overrides the type of the VarDeclaration.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 351
diff changeset
134 bool ispacked = (ts->alignsize() == 1);
74101be2a553 Added type param to DVarValue as DMD sometimes overrides the type of the VarDeclaration.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 351
diff changeset
135
136
0e28624814e8 [svn r140] did a lot of the work towards being able to pass multiple modules on the command line. not complete yet though
lindquist
parents: 133
diff changeset
136 IrStruct* irstruct = new IrStruct(ts);
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 171
diff changeset
137 sd->ir.irStruct = irstruct;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
138 gIR->structs.push_back(irstruct);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
139
435
74101be2a553 Added type param to DVarValue as DMD sometimes overrides the type of the VarDeclaration.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 351
diff changeset
140 irstruct->packed = ispacked;
74101be2a553 Added type param to DVarValue as DMD sometimes overrides the type of the VarDeclaration.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 351
diff changeset
141
133
44a95ac7368a [svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents: 132
diff changeset
142 // fields
132
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
143 Array* arr = &sd->fields;
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
144 for (int k=0; k < arr->dim; k++) {
133
44a95ac7368a [svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents: 132
diff changeset
145 VarDeclaration* v = (VarDeclaration*)arr->data[k];
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 275
diff changeset
146 v->toObjFile(0); // TODO: multiobj
132
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
147 }
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
148
133
44a95ac7368a [svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents: 132
diff changeset
149 bool thisModule = false;
44a95ac7368a [svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents: 132
diff changeset
150 if (sd->getModule() == gIR->dmodule)
44a95ac7368a [svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents: 132
diff changeset
151 thisModule = true;
44a95ac7368a [svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents: 132
diff changeset
152
44a95ac7368a [svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents: 132
diff changeset
153 // methods
44a95ac7368a [svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents: 132
diff changeset
154 arr = sd->members;
44a95ac7368a [svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents: 132
diff changeset
155 for (int k=0; k < arr->dim; k++) {
44a95ac7368a [svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents: 132
diff changeset
156 Dsymbol* s = (Dsymbol*)arr->data[k];
44a95ac7368a [svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents: 132
diff changeset
157 if (FuncDeclaration* fd = s->isFuncDeclaration()) {
44a95ac7368a [svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents: 132
diff changeset
158 if (thisModule || (fd->prot() != PROTprivate)) {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 275
diff changeset
159 fd->toObjFile(0); // TODO: multiobj
133
44a95ac7368a [svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents: 132
diff changeset
160 }
44a95ac7368a [svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents: 132
diff changeset
161 }
44a95ac7368a [svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents: 132
diff changeset
162 else if (s->isAttribDeclaration()) {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 275
diff changeset
163 s->toObjFile(0); // TODO: multiobj
133
44a95ac7368a [svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents: 132
diff changeset
164 }
44a95ac7368a [svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents: 132
diff changeset
165 else {
44a95ac7368a [svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents: 132
diff changeset
166 Logger::println("Ignoring dsymbol '%s' in this->members of kind '%s'", s->toPrettyChars(), s->kind());
44a95ac7368a [svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents: 132
diff changeset
167 }
44a95ac7368a [svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents: 132
diff changeset
168 }
44a95ac7368a [svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents: 132
diff changeset
169
132
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
170 /*for (int k=0; k < sd->members->dim; k++) {
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
171 Dsymbol* dsym = (Dsymbol*)(sd->members->data[k]);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
172 dsym->toObjFile();
132
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
173 }*/
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
174
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
175 Logger::println("doing struct fields");
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
176
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
177 const llvm::StructType* structtype = 0;
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 205
diff changeset
178 std::vector<const LLType*> fieldtypes;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
179
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
180 if (irstruct->offsets.empty())
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
181 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
182 Logger::println("has no fields");
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 217
diff changeset
183 fieldtypes.push_back(LLType::Int8Ty);
435
74101be2a553 Added type param to DVarValue as DMD sometimes overrides the type of the VarDeclaration.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 351
diff changeset
184 structtype = llvm::StructType::get(fieldtypes, ispacked);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
185 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
186 else
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
187 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
188 Logger::println("has fields");
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
189 unsigned prevsize = (unsigned)-1;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
190 unsigned lastoffset = (unsigned)-1;
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 205
diff changeset
191 const LLType* fieldtype = NULL;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
192 VarDeclaration* fieldinit = NULL;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
193 size_t fieldpad = 0;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
194 int idx = 0;
136
0e28624814e8 [svn r140] did a lot of the work towards being able to pass multiple modules on the command line. not complete yet though
lindquist
parents: 133
diff changeset
195 for (IrStruct::OffsetMap::iterator i=irstruct->offsets.begin(); i!=irstruct->offsets.end(); ++i) {
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
196 // first iteration
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
197 if (lastoffset == (unsigned)-1) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
198 lastoffset = i->first;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
199 assert(lastoffset == 0);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
200 fieldtype = i->second.type;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
201 fieldinit = i->second.var;
351
f273f5c58a9a [svn r372] Fixed extern(C++) handling now same as DMD, which is to treat it like extern(C).
lindquist
parents: 345
diff changeset
202 prevsize = fieldinit->type->size();
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 171
diff changeset
203 i->second.var->ir.irField->index = idx;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
204 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
205 // colliding offset?
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
206 else if (lastoffset == i->first) {
351
f273f5c58a9a [svn r372] Fixed extern(C++) handling now same as DMD, which is to treat it like extern(C).
lindquist
parents: 345
diff changeset
207 size_t s = i->second.var->type->size();
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
208 if (s > prevsize) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
209 fieldpad += s - prevsize;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
210 prevsize = s;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
211 }
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 171
diff changeset
212 sd->ir.irStruct->hasUnions = true;
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 171
diff changeset
213 i->second.var->ir.irField->index = idx;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
214 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
215 // intersecting offset?
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
216 else if (i->first < (lastoffset + prevsize)) {
351
f273f5c58a9a [svn r372] Fixed extern(C++) handling now same as DMD, which is to treat it like extern(C).
lindquist
parents: 345
diff changeset
217 size_t s = i->second.var->type->size();
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
218 assert((i->first + s) <= (lastoffset + prevsize)); // this holds because all types are aligned to their size
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 171
diff changeset
219 sd->ir.irStruct->hasUnions = true;
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 171
diff changeset
220 i->second.var->ir.irField->index = idx;
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 171
diff changeset
221 i->second.var->ir.irField->indexOffset = (i->first - lastoffset) / s;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
222 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
223 // fresh offset
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
224 else {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
225 // commit the field
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
226 fieldtypes.push_back(fieldtype);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
227 irstruct->defaultFields.push_back(fieldinit);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
228 if (fieldpad) {
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 217
diff changeset
229 fieldtypes.push_back(llvm::ArrayType::get(LLType::Int8Ty, fieldpad));
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
230 irstruct->defaultFields.push_back(NULL);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
231 idx++;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
232 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
233
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
234 idx++;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
235
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
236 // start new
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
237 lastoffset = i->first;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
238 fieldtype = i->second.type;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
239 fieldinit = i->second.var;
351
f273f5c58a9a [svn r372] Fixed extern(C++) handling now same as DMD, which is to treat it like extern(C).
lindquist
parents: 345
diff changeset
240 prevsize = fieldinit->type->size();
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 171
diff changeset
241 i->second.var->ir.irField->index = idx;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
242 fieldpad = 0;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
243 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
244 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
245 fieldtypes.push_back(fieldtype);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
246 irstruct->defaultFields.push_back(fieldinit);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
247 if (fieldpad) {
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 217
diff changeset
248 fieldtypes.push_back(llvm::ArrayType::get(LLType::Int8Ty, fieldpad));
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
249 irstruct->defaultFields.push_back(NULL);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
250 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
251
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
252 Logger::println("creating struct type");
435
74101be2a553 Added type param to DVarValue as DMD sometimes overrides the type of the VarDeclaration.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 351
diff changeset
253 structtype = llvm::StructType::get(fieldtypes, ispacked);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
254 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
255
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
256 // refine abstract types for stuff like: struct S{S* next;}
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
257 if (irstruct->recty != 0)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
258 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
259 llvm::PATypeHolder& pa = irstruct->recty;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
260 llvm::cast<llvm::OpaqueType>(pa.get())->refineAbstractTypeTo(structtype);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
261 structtype = isaStruct(pa.get());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
262 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
263
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 171
diff changeset
264 assert(ts->ir.type == 0);
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 171
diff changeset
265 ts->ir.type = new llvm::PATypeHolder(structtype);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
266
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
267 if (sd->parent->isModule()) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
268 gIR->module->addTypeName(sd->mangle(),structtype);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
269 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
270
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
271 gIR->structs.pop_back();
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
272
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
273 gIR->declareList.push_back(sd);
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
274 }
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
275
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
276 //////////////////////////////////////////////////////////////////////////////////////////
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
277
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
278 void DtoDeclareStruct(StructDeclaration* sd)
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
279 {
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 171
diff changeset
280 if (sd->ir.declared) return;
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 171
diff changeset
281 sd->ir.declared = true;
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
282
132
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
283 Logger::println("DtoDeclareStruct(%s): %s", sd->toChars(), sd->loc.toChars());
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
284 LOG_SCOPE;
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
285
486
a34078905d01 Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 449
diff changeset
286 TypeStruct* ts = (TypeStruct*)sd->type->toBasetype();
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
287
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
288 std::string initname("_D");
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
289 initname.append(sd->mangle());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
290 initname.append("6__initZ");
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
291
149
4c577c2b7229 [svn r155] Fixed a bunch of linkage problems (especially with templates)
lindquist
parents: 137
diff changeset
292 llvm::GlobalValue::LinkageTypes _linkage = DtoExternalLinkage(sd);
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 171
diff changeset
293 llvm::GlobalVariable* initvar = new llvm::GlobalVariable(ts->ir.type->get(), true, _linkage, NULL, initname, gIR->module);
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 171
diff changeset
294 sd->ir.irStruct->init = initvar;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
295
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
296 gIR->constInitList.push_back(sd);
171
95f07e3f8bb9 [svn r187] Fixed missing definitions of instances of imported struct template declarations.
lindquist
parents: 169
diff changeset
297 if (DtoIsTemplateInstance(sd) || sd->getModule() == gIR->dmodule)
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
298 gIR->defineList.push_back(sd);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
299 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
300
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
301 //////////////////////////////////////////////////////////////////////////////////////////
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
302
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
303 void DtoConstInitStruct(StructDeclaration* sd)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
304 {
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 171
diff changeset
305 if (sd->ir.initialized) return;
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 171
diff changeset
306 sd->ir.initialized = true;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
307
132
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
308 Logger::println("DtoConstInitStruct(%s): %s", sd->toChars(), sd->loc.toChars());
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
309 LOG_SCOPE;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
310
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 171
diff changeset
311 IrStruct* irstruct = sd->ir.irStruct;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
312 gIR->structs.push_back(irstruct);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
313
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
314 // make sure each offset knows its default initializer
136
0e28624814e8 [svn r140] did a lot of the work towards being able to pass multiple modules on the command line. not complete yet though
lindquist
parents: 133
diff changeset
315 for (IrStruct::OffsetMap::iterator i=irstruct->offsets.begin(); i!=irstruct->offsets.end(); ++i)
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
316 {
136
0e28624814e8 [svn r140] did a lot of the work towards being able to pass multiple modules on the command line. not complete yet though
lindquist
parents: 133
diff changeset
317 IrStruct::Offset* so = &i->second;
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 205
diff changeset
318 LLConstant* finit = DtoConstFieldInitializer(so->var->type, so->var->init);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
319 so->init = finit;
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 171
diff changeset
320 so->var->ir.irField->constInit = finit;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
321 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
322
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 171
diff changeset
323 const llvm::StructType* structtype = isaStruct(sd->type->ir.type->get());
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
324
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
325 // go through the field inits and build the default initializer
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 205
diff changeset
326 std::vector<LLConstant*> fieldinits_ll;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
327 size_t nfi = irstruct->defaultFields.size();
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
328 for (size_t i=0; i<nfi; ++i) {
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 205
diff changeset
329 LLConstant* c;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
330 if (irstruct->defaultFields[i] != NULL) {
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 171
diff changeset
331 c = irstruct->defaultFields[i]->ir.irField->constInit;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
332 assert(c);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
333 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
334 else {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
335 const llvm::ArrayType* arrty = isaArray(structtype->getElementType(i));
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 217
diff changeset
336 std::vector<LLConstant*> vals(arrty->getNumElements(), llvm::ConstantInt::get(LLType::Int8Ty, 0, false));
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
337 c = llvm::ConstantArray::get(arrty, vals);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
338 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
339 fieldinits_ll.push_back(c);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
340 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
341
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
342 // generate the union mapper
435
74101be2a553 Added type param to DVarValue as DMD sometimes overrides the type of the VarDeclaration.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 351
diff changeset
343 sd->ir.irStruct->dunion = new DUnion(); // uses gIR->topstruct()
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
344
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
345 // always generate the constant initalizer
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
346 if (!sd->zeroInit) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
347 Logger::println("Not zero initialized");
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 217
diff changeset
348 #if 0
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
349 //assert(tk == gIR->gIR->topstruct()().size());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
350 #ifndef LLVMD_NO_LOGGER
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
351 Logger::cout() << "struct type: " << *structtype << '\n';
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
352 for (size_t k=0; k<fieldinits_ll.size(); ++k) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
353 Logger::cout() << "Type:" << '\n';
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
354 Logger::cout() << *fieldinits_ll[k]->getType() << '\n';
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
355 Logger::cout() << "Value:" << '\n';
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
356 Logger::cout() << *fieldinits_ll[k] << '\n';
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
357 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
358 Logger::cout() << "Initializer printed" << '\n';
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
359 #endif
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 217
diff changeset
360 #endif
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 171
diff changeset
361 sd->ir.irStruct->constInit = llvm::ConstantStruct::get(structtype,fieldinits_ll);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
362 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
363 else {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
364 Logger::println("Zero initialized");
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 171
diff changeset
365 sd->ir.irStruct->constInit = llvm::ConstantAggregateZero::get(structtype);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
366 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
367
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
368 gIR->structs.pop_back();
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
369
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
370 // emit typeinfo
443
44f08170f4ef Removed tango from the repository and instead added a runtime dir with the files needed to patch and build tango from svn.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 435
diff changeset
371 if (sd->getModule() == gIR->dmodule && sd->llvmInternal != LLVMno_typeinfo)
275
665b81613475 [svn r296] Removed: the 'suite' dir, it never took off!
lindquist
parents: 244
diff changeset
372 DtoTypeInfoOf(sd->type, false);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
373 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
374
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
375 //////////////////////////////////////////////////////////////////////////////////////////
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
376
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
377 void DtoDefineStruct(StructDeclaration* sd)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
378 {
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 171
diff changeset
379 if (sd->ir.defined) return;
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 171
diff changeset
380 sd->ir.defined = true;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
381
132
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
382 Logger::println("DtoDefineStruct(%s): %s", sd->toChars(), sd->loc.toChars());
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
383 LOG_SCOPE;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
384
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
385 assert(sd->type->ty == Tstruct);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
386 TypeStruct* ts = (TypeStruct*)sd->type;
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 171
diff changeset
387 sd->ir.irStruct->init->setInitializer(sd->ir.irStruct->constInit);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
388
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 171
diff changeset
389 sd->ir.DModule = gIR->dmodule;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
390 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
391
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
392 //////////////////////////////////////////////////////////////////////////////////////////
344
e20ce6d8d374 [svn r365] Implemented raw struct equality comparison, uses C memcmp.
lindquist
parents: 336
diff changeset
393 //////////////////////////// D STRUCT UTILITIES ////////////////////////////////////
e20ce6d8d374 [svn r365] Implemented raw struct equality comparison, uses C memcmp.
lindquist
parents: 336
diff changeset
394 //////////////////////////////////////////////////////////////////////////////////////////
e20ce6d8d374 [svn r365] Implemented raw struct equality comparison, uses C memcmp.
lindquist
parents: 336
diff changeset
395
e20ce6d8d374 [svn r365] Implemented raw struct equality comparison, uses C memcmp.
lindquist
parents: 336
diff changeset
396 LLValue* DtoStructEquals(TOK op, DValue* lhs, DValue* rhs)
e20ce6d8d374 [svn r365] Implemented raw struct equality comparison, uses C memcmp.
lindquist
parents: 336
diff changeset
397 {
e20ce6d8d374 [svn r365] Implemented raw struct equality comparison, uses C memcmp.
lindquist
parents: 336
diff changeset
398 Type* t = lhs->getType()->toBasetype();
e20ce6d8d374 [svn r365] Implemented raw struct equality comparison, uses C memcmp.
lindquist
parents: 336
diff changeset
399 assert(t->ty == Tstruct);
e20ce6d8d374 [svn r365] Implemented raw struct equality comparison, uses C memcmp.
lindquist
parents: 336
diff changeset
400
e20ce6d8d374 [svn r365] Implemented raw struct equality comparison, uses C memcmp.
lindquist
parents: 336
diff changeset
401 // set predicate
e20ce6d8d374 [svn r365] Implemented raw struct equality comparison, uses C memcmp.
lindquist
parents: 336
diff changeset
402 llvm::ICmpInst::Predicate cmpop;
345
5320fe65a65d [svn r366] Fixed identity exprs for structs was comparing addresses, not content!
lindquist
parents: 344
diff changeset
403 if (op == TOKequal || op == TOKidentity)
344
e20ce6d8d374 [svn r365] Implemented raw struct equality comparison, uses C memcmp.
lindquist
parents: 336
diff changeset
404 cmpop = llvm::ICmpInst::ICMP_EQ;
e20ce6d8d374 [svn r365] Implemented raw struct equality comparison, uses C memcmp.
lindquist
parents: 336
diff changeset
405 else
e20ce6d8d374 [svn r365] Implemented raw struct equality comparison, uses C memcmp.
lindquist
parents: 336
diff changeset
406 cmpop = llvm::ICmpInst::ICMP_NE;
e20ce6d8d374 [svn r365] Implemented raw struct equality comparison, uses C memcmp.
lindquist
parents: 336
diff changeset
407
e20ce6d8d374 [svn r365] Implemented raw struct equality comparison, uses C memcmp.
lindquist
parents: 336
diff changeset
408 // call memcmp
e20ce6d8d374 [svn r365] Implemented raw struct equality comparison, uses C memcmp.
lindquist
parents: 336
diff changeset
409 size_t sz = getABITypeSize(DtoType(t));
e20ce6d8d374 [svn r365] Implemented raw struct equality comparison, uses C memcmp.
lindquist
parents: 336
diff changeset
410 LLValue* val = DtoMemCmp(lhs->getRVal(), rhs->getRVal(), DtoConstSize_t(sz));
e20ce6d8d374 [svn r365] Implemented raw struct equality comparison, uses C memcmp.
lindquist
parents: 336
diff changeset
411 return gIR->ir->CreateICmp(cmpop, val, LLConstantInt::get(val->getType(), 0, false), "tmp");
e20ce6d8d374 [svn r365] Implemented raw struct equality comparison, uses C memcmp.
lindquist
parents: 336
diff changeset
412 }
e20ce6d8d374 [svn r365] Implemented raw struct equality comparison, uses C memcmp.
lindquist
parents: 336
diff changeset
413
e20ce6d8d374 [svn r365] Implemented raw struct equality comparison, uses C memcmp.
lindquist
parents: 336
diff changeset
414 //////////////////////////////////////////////////////////////////////////////////////////
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
415 //////////////////////////// D UNION HELPER CLASS ////////////////////////////////////
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
416 //////////////////////////////////////////////////////////////////////////////////////////
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
417
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
418 DUnion::DUnion()
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
419 {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
420 DUnionField* f = NULL;
136
0e28624814e8 [svn r140] did a lot of the work towards being able to pass multiple modules on the command line. not complete yet though
lindquist
parents: 133
diff changeset
421 IrStruct* topstruct = gIR->topstruct();
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
422 bool unions = false;
136
0e28624814e8 [svn r140] did a lot of the work towards being able to pass multiple modules on the command line. not complete yet though
lindquist
parents: 133
diff changeset
423 for (IrStruct::OffsetMap::iterator i=topstruct->offsets.begin(); i!=topstruct->offsets.end(); ++i)
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
424 {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
425 unsigned o = i->first;
136
0e28624814e8 [svn r140] did a lot of the work towards being able to pass multiple modules on the command line. not complete yet though
lindquist
parents: 133
diff changeset
426 IrStruct::Offset* so = &i->second;
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 205
diff changeset
427 const LLType* ft = so->init->getType();
133
44a95ac7368a [svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents: 132
diff changeset
428 size_t sz = getABITypeSize(ft);
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
429 if (f == NULL) { // new field
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
430 fields.push_back(DUnionField());
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
431 f = &fields.back();
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
432 f->size = sz;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
433 f->offset = o;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
434 f->init = so->init;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
435 f->initsize = sz;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
436 f->types.push_back(ft);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
437 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
438 else if (o == f->offset) { // same offset
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
439 if (sz > f->size)
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
440 f->size = sz;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
441 f->types.push_back(ft);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
442 unions = true;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
443 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
444 else if (o < f->offset+f->size) {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
445 assert((o+sz) <= (f->offset+f->size));
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
446 unions = true;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
447 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
448 else {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
449 fields.push_back(DUnionField());
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
450 f = &fields.back();
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
451 f->size = sz;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
452 f->offset = o;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
453 f->init = so->init;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
454 f->initsize = sz;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
455 f->types.push_back(ft);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
456 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
457 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
458
435
74101be2a553 Added type param to DVarValue as DMD sometimes overrides the type of the VarDeclaration.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 351
diff changeset
459 ispacked = topstruct->packed;
74101be2a553 Added type param to DVarValue as DMD sometimes overrides the type of the VarDeclaration.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 351
diff changeset
460
113
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 102
diff changeset
461 /*{
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
462 LOG_SCOPE;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
463 Logger::println("******** DUnion BEGIN");
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
464 size_t n = fields.size();
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
465 for (size_t i=0; i<n; ++i) {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
466 Logger::cout()<<"field #"<<i<<" offset: "<<fields[i].offset<<" size: "<<fields[i].size<<'('<<fields[i].initsize<<")\n";
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
467 LOG_SCOPE;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
468 size_t nt = fields[i].types.size();
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
469 for (size_t j=0; j<nt; ++j) {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
470 Logger::cout()<<*fields[i].types[j]<<'\n';
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
471 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
472 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
473 Logger::println("******** DUnion END");
113
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 102
diff changeset
474 }*/
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
475 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
476
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 205
diff changeset
477 static void push_nulls(size_t nbytes, std::vector<LLConstant*>& out)
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
478 {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
479 assert(nbytes > 0);
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 217
diff changeset
480 std::vector<LLConstant*> i(nbytes, llvm::ConstantInt::get(LLType::Int8Ty, 0, false));
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 217
diff changeset
481 out.push_back(llvm::ConstantArray::get(llvm::ArrayType::get(LLType::Int8Ty, nbytes), i));
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
482 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
483
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 205
diff changeset
484 LLConstant* DUnion::getConst(std::vector<DUnionIdx>& in)
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
485 {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
486 std::sort(in.begin(), in.end());
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 205
diff changeset
487 std::vector<LLConstant*> out;
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
488
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
489 size_t nin = in.size();
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
490 size_t nfields = fields.size();
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
491
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
492 size_t fi = 0;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
493 size_t last = 0;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
494 size_t ii = 0;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
495 size_t os = 0;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
496
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
497 for(;;)
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
498 {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
499 if (fi == nfields) break;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
500
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
501 bool nextSame = (ii+1 < nin) && (in[ii+1].idx == fi);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
502
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
503 if (ii < nin && fi == in[ii].idx)
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
504 {
133
44a95ac7368a [svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents: 132
diff changeset
505 size_t s = getABITypeSize(in[ii].c->getType());
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
506 if (in[ii].idx == last)
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
507 {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
508 size_t nos = in[ii].idxos * s;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
509 if (nos && nos-os) {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
510 assert(nos >= os);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
511 push_nulls(nos-os, out);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
512 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
513 os = nos + s;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
514 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
515 else
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
516 {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
517 os = s;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
518 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
519 out.push_back(in[ii].c);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
520 ii++;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
521 if (!nextSame)
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
522 {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
523 if (os < fields[fi].size)
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
524 push_nulls(fields[fi].size - os, out);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
525 os = 0;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
526 last = fi++;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
527 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
528 continue;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
529 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
530
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
531 // default initialize if necessary
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
532 if (ii == nin || fi < in[ii].idx)
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
533 {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
534 DUnionField& f = fields[fi];
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
535 out.push_back(f.init);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
536 if (f.initsize < f.size)
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
537 push_nulls(f.size - f.initsize, out);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
538 last = fi++;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
539 os = 0;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
540 continue;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
541 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
542 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
543
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 205
diff changeset
544 std::vector<const LLType*> tys;
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
545 size_t nout = out.size();
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
546 for (size_t i=0; i<nout; ++i)
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
547 tys.push_back(out[i]->getType());
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
548
435
74101be2a553 Added type param to DVarValue as DMD sometimes overrides the type of the VarDeclaration.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 351
diff changeset
549 const llvm::StructType* st = llvm::StructType::get(tys, ispacked);
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
550 return llvm::ConstantStruct::get(st, out);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
551 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
552
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
553
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
554
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
555
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
556
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
557
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
558
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
559
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
560
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
561
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
562
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
563
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
564
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
565
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
566
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
567
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
568
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
569
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
570
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
571
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
572