annotate gen/structs.cpp @ 102:027b8d8b71ec trunk

[svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up. Basically it tries to do the following in order: Resolve types, Declare symbols, Create constant initializers, Apply initializers, Generate functions bodies. ClassInfo is now has the most useful(biased?) members working. Probably other stuf...
author lindquist
date Sun, 18 Nov 2007 06:52:57 +0100
parents 5071469303d4
children 27b9f749d9fe
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"
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
12 #include "gen/arrays.h"
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
13 #include "gen/logger.h"
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
14 #include "gen/structs.h"
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
15
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
16 //////////////////////////////////////////////////////////////////////////////////////////
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
17
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
18 const llvm::Type* DtoStructType(Type* t)
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
19 {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
20 assert(0);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
21 std::vector<const llvm::Type*> types;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
22 return llvm::StructType::get(types);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
23 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
24
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
25 //////////////////////////////////////////////////////////////////////////////////////////
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
26
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
27 llvm::Value* DtoStructZeroInit(llvm::Value* v)
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
28 {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
29 assert(gIR);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
30 uint64_t n = gTargetData->getTypeSize(v->getType()->getContainedType(0));
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
31 //llvm::Type* sarrty = llvm::PointerType::get(llvm::ArrayType::get(llvm::Type::Int8Ty, n));
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
32 llvm::Type* sarrty = llvm::PointerType::get(llvm::Type::Int8Ty);
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 llvm::Value* sarr = new llvm::BitCastInst(v,sarrty,"tmp",gIR->scopebb());
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 llvm::Function* fn = LLVM_DeclareMemSet32();
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
37 std::vector<llvm::Value*> llargs;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
38 llargs.resize(4);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
39 llargs[0] = sarr;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
40 llargs[1] = llvm::ConstantInt::get(llvm::Type::Int8Ty, 0, false);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
41 llargs[2] = llvm::ConstantInt::get(llvm::Type::Int32Ty, n, false);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
42 llargs[3] = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
43
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
44 llvm::Value* ret = new llvm::CallInst(fn, llargs.begin(), llargs.end(), "", gIR->scopebb());
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 return ret;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
47 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
48
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 llvm::Value* DtoStructCopy(llvm::Value* dst, llvm::Value* src)
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
52 {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
53 Logger::cout() << "dst = " << *dst << " src = " << *src << '\n';
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
54 assert(dst->getType() == src->getType());
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
55 assert(gIR);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
56
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
57 uint64_t n = gTargetData->getTypeSize(dst->getType()->getContainedType(0));
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
58 //llvm::Type* sarrty = llvm::PointerType::get(llvm::ArrayType::get(llvm::Type::Int8Ty, n));
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
59 llvm::Type* arrty = llvm::PointerType::get(llvm::Type::Int8Ty);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
60
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
61 llvm::Value* dstarr = new llvm::BitCastInst(dst,arrty,"tmp",gIR->scopebb());
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
62 llvm::Value* srcarr = new llvm::BitCastInst(src,arrty,"tmp",gIR->scopebb());
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
63
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
64 llvm::Function* fn = LLVM_DeclareMemCpy32();
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
65 std::vector<llvm::Value*> llargs;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
66 llargs.resize(4);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
67 llargs[0] = dstarr;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
68 llargs[1] = srcarr;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
69 llargs[2] = llvm::ConstantInt::get(llvm::Type::Int32Ty, n, false);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
70 llargs[3] = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false);
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 return new llvm::CallInst(fn, llargs.begin(), llargs.end(), "", gIR->scopebb());
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
73 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
74
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
75 //////////////////////////////////////////////////////////////////////////////////////////
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
76 llvm::Constant* DtoConstStructInitializer(StructInitializer* si)
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
77 {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
78 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
79 LOG_SCOPE;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
80
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
81 TypeStruct* ts = (TypeStruct*)si->ad->type;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
82
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
83 const llvm::StructType* structtype = isaStruct(ts->llvmType->get());
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
84 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
85
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
86 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
87
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
88 std::vector<DUnionIdx> inits;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
89 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
90 {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
91 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
92 assert(ini);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
93 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
94 assert(vd);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
95 llvm::Constant* v = DtoConstInitializer(vd->type, ini);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
96 inits.push_back(DUnionIdx(vd->llvmFieldIndex, vd->llvmFieldIndexOffset, v));
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
97 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
98
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
99 DtoConstInitStruct((StructDeclaration*)si->ad);
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
100 return si->ad->llvmUnion->getConst(inits);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
101 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
102
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
103 //////////////////////////////////////////////////////////////////////////////////////////
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
104
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
105 llvm::Value* DtoIndexStruct(llvm::Value* ptr, StructDeclaration* sd, Type* t, unsigned os, std::vector<unsigned>& idxs)
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
106 {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
107 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
108 LOG_SCOPE;
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 if (idxs.empty())
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
111 idxs.push_back(0);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
112
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
113 const llvm::Type* llt = llvm::PointerType::get(DtoType(t));
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
114 const llvm::Type* st = llvm::PointerType::get(DtoType(sd->type));
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
115 if (ptr->getType() != st) {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
116 assert(sd->llvmHasUnions);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
117 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
118 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
119
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
120 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
121 VarDeclaration* vd = (VarDeclaration*)sd->fields.data[i];
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
122 Type* vdtype = DtoDType(vd->type);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
123 Logger::println("found %u type %s", vd->offset, vdtype->toChars());
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
124 assert(vd->llvmFieldIndex >= 0);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
125 if (os == vd->offset && vdtype == t) {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
126 idxs.push_back(vd->llvmFieldIndex);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
127 ptr = DtoGEP(ptr, idxs, "tmp");
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
128 if (ptr->getType() != llt)
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
129 ptr = gIR->ir->CreateBitCast(ptr, llt, "tmp");
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
130 if (vd->llvmFieldIndexOffset)
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
131 ptr = new llvm::GetElementPtrInst(ptr, DtoConstUint(vd->llvmFieldIndexOffset), "tmp", gIR->scopebb());
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
132 return ptr;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
133 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
134 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
135 TypeStruct* ts = (TypeStruct*)vdtype;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
136 StructDeclaration* ssd = ts->sym;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
137 idxs.push_back(vd->llvmFieldIndex);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
138 if (vd->llvmFieldIndexOffset) {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
139 Logger::println("has union field offset");
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
140 ptr = DtoGEP(ptr, idxs, "tmp");
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
141 if (ptr->getType() != llt)
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
142 ptr = gIR->ir->CreateBitCast(ptr, llt, "tmp");
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
143 ptr = new llvm::GetElementPtrInst(ptr, DtoConstUint(vd->llvmFieldIndexOffset), "tmp", gIR->scopebb());
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
144 std::vector<unsigned> tmp;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
145 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
146 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
147 else {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
148 const llvm::Type* sty = llvm::PointerType::get(DtoType(vd->type));
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
149 if (ptr->getType() != sty) {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
150 ptr = gIR->ir->CreateBitCast(ptr, sty, "tmp");
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
151 std::vector<unsigned> tmp;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
152 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
153 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
154 else {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
155 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
156 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
157 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
158 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
159 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
160
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
161 size_t llt_sz = gTargetData->getTypeSize(llt->getContainedType(0));
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
162 assert(os % llt_sz == 0);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
163 ptr = gIR->ir->CreateBitCast(ptr, llt, "tmp");
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
164 return new llvm::GetElementPtrInst(ptr, DtoConstUint(os / llt_sz), "tmp", gIR->scopebb());
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
165 }
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
166
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
167 //////////////////////////////////////////////////////////////////////////////////////////
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
168
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
169 void DtoResolveStruct(StructDeclaration* sd)
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
170 {
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
171 if (sd->llvmResolved) return;
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
172 sd->llvmResolved = true;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
173
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
174 Logger::println("DtoResolveStruct(%s)", sd->toChars());
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
175 LOG_SCOPE;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
176
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
177 TypeStruct* ts = (TypeStruct*)DtoDType(sd->type);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
178
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
179 IRStruct* irstruct = new IRStruct(ts);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
180 sd->llvmIRStruct = irstruct;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
181 gIR->structs.push_back(irstruct);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
182
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
183 for (int k=0; k < sd->members->dim; k++) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
184 Dsymbol* dsym = (Dsymbol*)(sd->members->data[k]);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
185 dsym->toObjFile();
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
186 }
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("doing struct fields");
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
189
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
190 const llvm::StructType* structtype = 0;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
191 std::vector<const llvm::Type*> fieldtypes;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
192
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
193 if (irstruct->offsets.empty())
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
194 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
195 Logger::println("has no fields");
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
196 fieldtypes.push_back(llvm::Type::Int8Ty);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
197 structtype = llvm::StructType::get(fieldtypes);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
198 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
199 else
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
200 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
201 Logger::println("has fields");
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
202 unsigned prevsize = (unsigned)-1;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
203 unsigned lastoffset = (unsigned)-1;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
204 const llvm::Type* fieldtype = NULL;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
205 VarDeclaration* fieldinit = NULL;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
206 size_t fieldpad = 0;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
207 int idx = 0;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
208 for (IRStruct::OffsetMap::iterator i=irstruct->offsets.begin(); i!=irstruct->offsets.end(); ++i) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
209 // first iteration
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
210 if (lastoffset == (unsigned)-1) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
211 lastoffset = i->first;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
212 assert(lastoffset == 0);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
213 fieldtype = i->second.type;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
214 fieldinit = i->second.var;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
215 prevsize = gTargetData->getTypeSize(fieldtype);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
216 i->second.var->llvmFieldIndex = idx;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
217 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
218 // colliding offset?
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
219 else if (lastoffset == i->first) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
220 size_t s = gTargetData->getTypeSize(i->second.type);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
221 if (s > prevsize) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
222 fieldpad += s - prevsize;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
223 prevsize = s;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
224 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
225 sd->llvmHasUnions = true;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
226 i->second.var->llvmFieldIndex = idx;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
227 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
228 // intersecting offset?
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
229 else if (i->first < (lastoffset + prevsize)) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
230 size_t s = gTargetData->getTypeSize(i->second.type);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
231 assert((i->first + s) <= (lastoffset + prevsize)); // this holds because all types are aligned to their size
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
232 sd->llvmHasUnions = true;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
233 i->second.var->llvmFieldIndex = idx;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
234 i->second.var->llvmFieldIndexOffset = (i->first - lastoffset) / s;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
235 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
236 // fresh offset
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
237 else {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
238 // commit the field
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
239 fieldtypes.push_back(fieldtype);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
240 irstruct->defaultFields.push_back(fieldinit);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
241 if (fieldpad) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
242 fieldtypes.push_back(llvm::ArrayType::get(llvm::Type::Int8Ty, fieldpad));
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
243 irstruct->defaultFields.push_back(NULL);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
244 idx++;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
245 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
246
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
247 idx++;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
248
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
249 // start new
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
250 lastoffset = i->first;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
251 fieldtype = i->second.type;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
252 fieldinit = i->second.var;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
253 prevsize = gTargetData->getTypeSize(fieldtype);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
254 i->second.var->llvmFieldIndex = idx;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
255 fieldpad = 0;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
256 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
257 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
258 fieldtypes.push_back(fieldtype);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
259 irstruct->defaultFields.push_back(fieldinit);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
260 if (fieldpad) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
261 fieldtypes.push_back(llvm::ArrayType::get(llvm::Type::Int8Ty, fieldpad));
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
262 irstruct->defaultFields.push_back(NULL);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
263 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
264
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
265 Logger::println("creating struct type");
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
266 structtype = llvm::StructType::get(fieldtypes);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
267 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
268
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
269 // refine abstract types for stuff like: struct S{S* next;}
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
270 if (irstruct->recty != 0)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
271 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
272 llvm::PATypeHolder& pa = irstruct->recty;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
273 llvm::cast<llvm::OpaqueType>(pa.get())->refineAbstractTypeTo(structtype);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
274 structtype = isaStruct(pa.get());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
275 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
276
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
277 assert(ts->llvmType == 0);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
278 ts->llvmType = new llvm::PATypeHolder(structtype);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
279
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
280 if (sd->parent->isModule()) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
281 gIR->module->addTypeName(sd->mangle(),structtype);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
282 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
283
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 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
285
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
286 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
287 }
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
288
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
289 //////////////////////////////////////////////////////////////////////////////////////////
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
290
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
291 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
292 {
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
293 if (sd->llvmDeclared) return;
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
294 sd->llvmDeclared = true;
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
295
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 Logger::println("DtoDeclareStruct(%s)", sd->toChars());
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
297 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
298
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
299 TypeStruct* ts = (TypeStruct*)DtoDType(sd->type);
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
300
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
301 std::string initname("_D");
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
302 initname.append(sd->mangle());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
303 initname.append("6__initZ");
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
304
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
305 llvm::GlobalValue::LinkageTypes _linkage = llvm::GlobalValue::ExternalLinkage;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
306 llvm::GlobalVariable* initvar = new llvm::GlobalVariable(ts->llvmType->get(), true, _linkage, NULL, initname, gIR->module);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
307 ts->llvmInit = initvar;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
308
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
309 gIR->constInitList.push_back(sd);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
310 if (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
311 gIR->defineList.push_back(sd);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
312 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
313
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
314 //////////////////////////////////////////////////////////////////////////////////////////
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
315
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
316 void DtoConstInitStruct(StructDeclaration* sd)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
317 {
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
318 if (sd->llvmInitialized) return;
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
319 sd->llvmInitialized = true;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
320
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
321 Logger::println("DtoConstInitStruct(%s)", sd->toChars());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
322 LOG_SCOPE;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
323
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
324 IRStruct* irstruct = sd->llvmIRStruct;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
325 gIR->structs.push_back(irstruct);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
326
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
327 // make sure each offset knows its default initializer
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
328 for (IRStruct::OffsetMap::iterator i=irstruct->offsets.begin(); i!=irstruct->offsets.end(); ++i)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
329 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
330 IRStruct::Offset* so = &i->second;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
331 llvm::Constant* finit = DtoConstFieldInitializer(so->var->type, so->var->init);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
332 so->init = finit;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
333 so->var->llvmConstInit = finit;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
334 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
335
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
336 const llvm::StructType* structtype = isaStruct(sd->type->llvmType->get());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
337
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
338 // go through the field inits and build the default initializer
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
339 std::vector<llvm::Constant*> fieldinits_ll;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
340 size_t nfi = irstruct->defaultFields.size();
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
341 for (size_t i=0; i<nfi; ++i) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
342 llvm::Constant* c;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
343 if (irstruct->defaultFields[i] != NULL) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
344 c = irstruct->defaultFields[i]->llvmConstInit;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
345 assert(c);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
346 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
347 else {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
348 const llvm::ArrayType* arrty = isaArray(structtype->getElementType(i));
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
349 std::vector<llvm::Constant*> vals(arrty->getNumElements(), llvm::ConstantInt::get(llvm::Type::Int8Ty, 0, false));
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
350 c = llvm::ConstantArray::get(arrty, vals);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
351 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
352 fieldinits_ll.push_back(c);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
353 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
354
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
355 // generate the union mapper
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
356 sd->llvmUnion = new DUnion; // uses gIR->topstruct()
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
357
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
358 // always generate the constant initalizer
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
359 if (!sd->zeroInit) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
360 Logger::println("Not zero initialized");
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
361 //assert(tk == gIR->gIR->topstruct()().size());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
362 #ifndef LLVMD_NO_LOGGER
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
363 Logger::cout() << "struct type: " << *structtype << '\n';
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
364 for (size_t k=0; k<fieldinits_ll.size(); ++k) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
365 Logger::cout() << "Type:" << '\n';
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
366 Logger::cout() << *fieldinits_ll[k]->getType() << '\n';
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
367 Logger::cout() << "Value:" << '\n';
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
368 Logger::cout() << *fieldinits_ll[k] << '\n';
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
369 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
370 Logger::cout() << "Initializer printed" << '\n';
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
371 #endif
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
372 sd->llvmInitZ = llvm::ConstantStruct::get(structtype,fieldinits_ll);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
373 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
374 else {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
375 Logger::println("Zero initialized");
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
376 sd->llvmInitZ = llvm::ConstantAggregateZero::get(structtype);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
377 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
378
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
379 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
380
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
381 // emit typeinfo
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
382 if (sd->getModule() == gIR->dmodule && sd->llvmInternal != LLVMnotypeinfo)
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
383 sd->type->getTypeInfo(NULL);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
384 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
385
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
386 //////////////////////////////////////////////////////////////////////////////////////////
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
387
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
388 void DtoDefineStruct(StructDeclaration* sd)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
389 {
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
390 if (sd->llvmDefined) return;
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
391 sd->llvmDefined = true;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
392
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
393 Logger::println("DtoDefineStruct(%s)", sd->toChars());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
394 LOG_SCOPE;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
395
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
396 assert(sd->type->ty == Tstruct);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
397 TypeStruct* ts = (TypeStruct*)sd->type;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
398 ts->llvmInit->setInitializer(sd->llvmInitZ);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
399
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
400 sd->llvmDModule = gIR->dmodule;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
401 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
402
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
403 //////////////////////////////////////////////////////////////////////////////////////////
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
404 //////////////////////////// D UNION HELPER CLASS ////////////////////////////////////
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
405 //////////////////////////////////////////////////////////////////////////////////////////
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
406
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
407 DUnion::DUnion()
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
408 {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
409 DUnionField* f = NULL;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
410 IRStruct* topstruct = gIR->topstruct();
88
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
411 bool unions = false;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 96
diff changeset
412 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
413 {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
414 unsigned o = i->first;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
415 IRStruct::Offset* so = &i->second;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
416 const llvm::Type* ft = so->init->getType();
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
417 size_t sz = gTargetData->getTypeSize(ft);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
418 if (f == NULL) { // new field
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
419 fields.push_back(DUnionField());
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
420 f = &fields.back();
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
421 f->size = sz;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
422 f->offset = o;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
423 f->init = so->init;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
424 f->initsize = sz;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
425 f->types.push_back(ft);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
426 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
427 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
428 if (sz > f->size)
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
429 f->size = sz;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
430 f->types.push_back(ft);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
431 unions = true;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
432 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
433 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
434 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
435 unions = true;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
436 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
437 else {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
438 fields.push_back(DUnionField());
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
439 f = &fields.back();
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->offset = o;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
442 f->init = so->init;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
443 f->initsize = sz;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
444 f->types.push_back(ft);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
445 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
446 }
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 {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
449 LOG_SCOPE;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
450 Logger::println("******** DUnion BEGIN");
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
451 size_t n = fields.size();
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
452 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
453 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
454 LOG_SCOPE;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
455 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
456 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
457 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
458 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
459 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
460 Logger::println("******** DUnion END");
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
461 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
462 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
463
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
464 static void push_nulls(size_t nbytes, std::vector<llvm::Constant*>& out)
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
465 {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
466 assert(nbytes > 0);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
467 std::vector<llvm::Constant*> i(nbytes, llvm::ConstantInt::get(llvm::Type::Int8Ty, 0, false));
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
468 out.push_back(llvm::ConstantArray::get(llvm::ArrayType::get(llvm::Type::Int8Ty, nbytes), i));
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
469 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
470
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
471 llvm::Constant* DUnion::getConst(std::vector<DUnionIdx>& in)
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 std::sort(in.begin(), in.end());
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
474 std::vector<llvm::Constant*> out;
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 size_t nin = in.size();
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
477 size_t nfields = fields.size();
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 size_t fi = 0;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
480 size_t last = 0;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
481 size_t ii = 0;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
482 size_t os = 0;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
483
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
484 for(;;)
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 if (fi == nfields) break;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
487
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
488 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
489
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
490 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
491 {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
492 size_t s = gTargetData->getTypeSize(in[ii].c->getType());
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
493 if (in[ii].idx == last)
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
494 {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
495 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
496 if (nos && nos-os) {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
497 assert(nos >= os);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
498 push_nulls(nos-os, out);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
499 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
500 os = nos + s;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
501 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
502 else
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
503 {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
504 os = s;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
505 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
506 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
507 ii++;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
508 if (!nextSame)
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
509 {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
510 if (os < fields[fi].size)
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
511 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
512 os = 0;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
513 last = fi++;
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 continue;
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
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
518 // default initialize if necessary
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
519 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
520 {
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
521 DUnionField& f = fields[fi];
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
522 out.push_back(f.init);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
523 if (f.initsize < f.size)
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
524 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
525 last = fi++;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
526 os = 0;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
527 continue;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
528 }
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 std::vector<const llvm::Type*> tys;
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
532 size_t nout = out.size();
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
533 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
534 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
535
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
536 const llvm::StructType* st = llvm::StructType::get(tys);
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
537 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
538 }
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
539
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
540
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
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
544
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
545
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
546
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
547
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
548
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
549
058d3925950e [svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
lindquist
parents:
diff changeset
550
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