annotate gen/classes.cpp @ 100:5071469303d4 trunk

[svn r104] TONS OF FIXES. Split up declaration, constant initializer gen and definition for globals, structs, classes and functions. Improved ClassInfo support (not complete), not in vtable yet. Fixed a bunch of forward reference problems. Much more. Major commit! :)
author lindquist
date Fri, 16 Nov 2007 08:21:47 +0100
parents
children 027b8d8b71ec
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
1 #include "gen/llvm.h"
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
2
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
3 #include "mtype.h"
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
4 #include "aggregate.h"
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
5 #include "init.h"
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
6 #include "declaration.h"
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
7
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
8 #include "gen/irstate.h"
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
9 #include "gen/tollvm.h"
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
10 #include "gen/arrays.h"
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
11 #include "gen/logger.h"
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
12 #include "gen/classes.h"
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
13
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
14 //////////////////////////////////////////////////////////////////////////////////////////
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
15
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
16 static void LLVM_AddBaseClassData(BaseClasses* bcs)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
17 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
18 // add base class data members first
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
19 for (int j=0; j<bcs->dim; j++)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
20 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
21 BaseClass* bc = (BaseClass*)(bcs->data[j]);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
22 assert(bc);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
23 Logger::println("Adding base class members of %s", bc->base->toChars());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
24 LOG_SCOPE;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
25
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
26 bc->base->toObjFile();
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
27
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
28 LLVM_AddBaseClassData(&bc->base->baseclasses);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
29 for (int k=0; k < bc->base->members->dim; k++) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
30 Dsymbol* dsym = (Dsymbol*)(bc->base->members->data[k]);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
31 if (dsym->isVarDeclaration())
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
32 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
33 dsym->toObjFile();
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
34 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
35 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
36 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
37 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
38
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
39 //////////////////////////////////////////////////////////////////////////////////////////
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
40
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
41 void DtoDeclareClass(ClassDeclaration* cd)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
42 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
43 if (cd->llvmTouched) return;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
44 cd->llvmTouched = true;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
45
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
46 Logger::println("DtoDeclareClass(%s)\n", cd->toPrettyChars());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
47 LOG_SCOPE;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
48
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
49 assert(cd->type->ty == Tclass);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
50 TypeClass* ts = (TypeClass*)cd->type;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
51
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
52 assert(!cd->llvmIRStruct);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
53 IRStruct* irstruct = new IRStruct(ts);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
54 cd->llvmIRStruct = irstruct;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
55
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
56 gIR->structs.push_back(irstruct);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
57 gIR->classes.push_back(cd);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
58
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
59 // add vtable
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
60 llvm::PATypeHolder pa = llvm::OpaqueType::get();
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
61 const llvm::Type* vtabty = llvm::PointerType::get(pa);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
62
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
63 std::vector<const llvm::Type*> fieldtypes;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
64 fieldtypes.push_back(vtabty);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
65
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
66 // base classes first
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
67 LLVM_AddBaseClassData(&cd->baseclasses);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
68
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
69 // then add own members
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
70 for (int k=0; k < cd->members->dim; k++) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
71 Dsymbol* dsym = (Dsymbol*)(cd->members->data[k]);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
72 dsym->toObjFile();
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
73 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
74
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
75 // add field types
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
76 for (IRStruct::OffsetMap::iterator i=irstruct->offsets.begin(); i!=irstruct->offsets.end(); ++i) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
77 fieldtypes.push_back(i->second.type);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
78 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
79
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
80 const llvm::StructType* structtype = llvm::StructType::get(fieldtypes);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
81 // refine abstract types for stuff like: class C {C next;}
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
82 assert(irstruct->recty != 0);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
83 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
84 llvm::PATypeHolder& spa = irstruct->recty;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
85 llvm::cast<llvm::OpaqueType>(spa.get())->refineAbstractTypeTo(structtype);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
86 structtype = isaStruct(spa.get());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
87 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
88
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
89 // create the type
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
90 ts->llvmType = new llvm::PATypeHolder(structtype);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
91
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
92 bool needs_definition = false;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
93 if (cd->parent->isModule()) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
94 gIR->module->addTypeName(cd->mangle(), ts->llvmType->get());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
95 needs_definition = (cd->getModule() == gIR->dmodule);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
96 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
97 else {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
98 assert(0 && "class parent is not a module");
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
99 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
101 // generate vtable
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
102 llvm::GlobalVariable* svtblVar = 0;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
103 std::vector<llvm::Constant*> sinits;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
104 std::vector<const llvm::Type*> sinits_ty;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
105 sinits.reserve(cd->vtbl.dim);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
106 sinits_ty.reserve(cd->vtbl.dim);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
107
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
108 for (int k=0; k < cd->vtbl.dim; k++)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
109 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
110 Dsymbol* dsym = (Dsymbol*)cd->vtbl.data[k];
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
111 assert(dsym);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
112 //Logger::cout() << "vtblsym: " << dsym->toChars() << '\n';
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
113
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
114 if (FuncDeclaration* fd = dsym->isFuncDeclaration()) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
115 fd->toObjFile();
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
116 assert(fd->llvmValue);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
117 llvm::Constant* c = llvm::cast<llvm::Constant>(fd->llvmValue);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
118 sinits.push_back(c);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
119 sinits_ty.push_back(c->getType());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
120 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
121 else if (ClassDeclaration* cd = dsym->isClassDeclaration()) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
122 const llvm::Type* cty = llvm::PointerType::get(llvm::Type::Int8Ty);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
123 llvm::Constant* c = llvm::Constant::getNullValue(cty);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
124 sinits.push_back(c);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
125 sinits_ty.push_back(cty);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
126 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
127 else
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
128 assert(0);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
129 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
130
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
131 const llvm::StructType* svtbl_ty = 0;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
132 if (!sinits.empty())
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
133 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
134 llvm::GlobalValue::LinkageTypes _linkage = llvm::GlobalValue::ExternalLinkage;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
135
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
136 std::string varname("_D");
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
137 varname.append(cd->mangle());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
138 varname.append("6__vtblZ");
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
139
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
140 std::string styname(cd->mangle());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
141 styname.append("__vtblTy");
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
142
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
143 svtbl_ty = llvm::StructType::get(sinits_ty);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
144 gIR->module->addTypeName(styname, svtbl_ty);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
145 svtblVar = new llvm::GlobalVariable(svtbl_ty, true, _linkage, 0, varname, gIR->module);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
146
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
147 cd->llvmConstVtbl = llvm::cast<llvm::ConstantStruct>(llvm::ConstantStruct::get(svtbl_ty, sinits));
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
148 if (needs_definition)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
149 svtblVar->setInitializer(cd->llvmConstVtbl);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
150 cd->llvmVtbl = svtblVar;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
151 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
152
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
153 // refine for final vtable type
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
154 llvm::cast<llvm::OpaqueType>(pa.get())->refineAbstractTypeTo(svtbl_ty);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
155
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
156 std::string initname("_D");
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
157 initname.append(cd->mangle());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
158 initname.append("6__initZ");
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
159 llvm::GlobalValue::LinkageTypes _linkage = llvm::GlobalValue::ExternalLinkage;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
160 llvm::GlobalVariable* initvar = new llvm::GlobalVariable(ts->llvmType->get(), true, _linkage, NULL, initname, gIR->module);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
161 ts->llvmInit = initvar;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
162
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
163 gIR->classes.pop_back();
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
164 gIR->structs.pop_back();
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
165
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
166 gIR->constInitQueue.push_back(cd);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
167 if (needs_definition)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
168 gIR->defineQueue.push_back(cd);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
169 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
170
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
171 //////////////////////////////////////////////////////////////////////////////////////////
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
172
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
173 void DtoConstInitClass(ClassDeclaration* cd)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
174 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
175 IRStruct* irstruct = cd->llvmIRStruct;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
176 if (irstruct->constinited) return;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
177 irstruct->constinited = true;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
178
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
179 Logger::println("DtoConstInitClass(%s)\n", cd->toPrettyChars());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
180 LOG_SCOPE;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
181
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
182 gIR->structs.push_back(irstruct);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
183 gIR->classes.push_back(cd);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
184
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
185 // make sure each offset knows its default initializer
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
186 for (IRStruct::OffsetMap::iterator i=irstruct->offsets.begin(); i!=irstruct->offsets.end(); ++i)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
187 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
188 IRStruct::Offset* so = &i->second;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
189 llvm::Constant* finit = DtoConstFieldInitializer(so->var->type, so->var->init);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
190 so->init = finit;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
191 so->var->llvmConstInit = finit;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
192 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
193
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
194 // fill out fieldtypes/inits
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
195 std::vector<llvm::Constant*> fieldinits;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
196
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
197 // first field is always the vtable
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
198 assert(cd->llvmVtbl != 0);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
199 fieldinits.push_back(cd->llvmVtbl);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
200
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
201 // rest
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
202 for (IRStruct::OffsetMap::iterator i=irstruct->offsets.begin(); i!=irstruct->offsets.end(); ++i) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
203 fieldinits.push_back(i->second.init);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
204 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
205
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
206 // get the struct (class) type
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
207 assert(cd->type->ty == Tclass);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
208 TypeClass* ts = (TypeClass*)cd->type;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
209 const llvm::StructType* structtype = isaStruct(ts->llvmType->get());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
210
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
211 // generate initializer
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
212 Logger::cout() << cd->toPrettyChars() << " | " << *structtype << '\n';
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
213 Logger::println("%u %u fields", structtype->getNumElements(), fieldinits.size());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
214 llvm::Constant* _init = llvm::ConstantStruct::get(structtype, fieldinits);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
215 assert(_init);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
216 cd->llvmInitZ = _init;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
217
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
218 gIR->classes.pop_back();
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
219 gIR->structs.pop_back();
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
220 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
221
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
222 //////////////////////////////////////////////////////////////////////////////////////////
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
223
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
224 void DtoDefineClass(ClassDeclaration* cd)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
225 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
226 IRStruct* irstruct = cd->llvmIRStruct;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
227 if (irstruct->defined) return;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
228 irstruct->defined = true;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
229
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
230 Logger::println("DtoDefineClass(%s)\n", cd->toPrettyChars());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
231 LOG_SCOPE;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
232
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
233 // get the struct (class) type
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
234 assert(cd->type->ty == Tclass);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
235 TypeClass* ts = (TypeClass*)cd->type;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
236
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
237 bool def = false;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
238 if (cd->parent->isModule() && cd->getModule() == gIR->dmodule) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
239 ts->llvmInit->setInitializer(cd->llvmInitZ);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
240 def = true;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
241 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
242
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
243 // generate classinfo
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
244 DtoDeclareClassInfo(cd);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
245 if (def) DtoDefineClassInfo(cd);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
246 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
247
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
248 //////////////////////////////////////////////////////////////////////////////////////////
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
249
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
250 void DtoCallClassDtors(TypeClass* tc, llvm::Value* instance)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
251 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
252 Array* arr = &tc->sym->dtors;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
253 for (size_t i=0; i<arr->dim; i++)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
254 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
255 FuncDeclaration* fd = (FuncDeclaration*)arr->data[i];
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
256 assert(fd->llvmValue);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
257 new llvm::CallInst(fd->llvmValue, instance, "", gIR->scopebb());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
258 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
259 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
260
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
261 //////////////////////////////////////////////////////////////////////////////////////////
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
262
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
263 void DtoInitClass(TypeClass* tc, llvm::Value* dst)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
264 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
265 assert(gIR);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
266
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
267 assert(tc->llvmType);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
268 uint64_t size_t_size = gTargetData->getTypeSize(DtoSize_t());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
269 uint64_t n = gTargetData->getTypeSize(tc->llvmType->get()) - size_t_size;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
270
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
271 // set vtable field
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
272 llvm::Value* vtblvar = DtoGEPi(dst,0,0,"tmp",gIR->scopebb());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
273 assert(tc->sym->llvmVtbl);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
274 new llvm::StoreInst(tc->sym->llvmVtbl, vtblvar, gIR->scopebb());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
275
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
276 // copy the static initializer
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
277 if (n > 0) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
278 assert(tc->llvmInit);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
279 assert(dst->getType() == tc->llvmInit->getType());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
280
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
281 llvm::Type* arrty = llvm::PointerType::get(llvm::Type::Int8Ty);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
282
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
283 llvm::Value* dstarr = new llvm::BitCastInst(dst,arrty,"tmp",gIR->scopebb());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
284 dstarr = DtoGEPi(dstarr,size_t_size,"tmp",gIR->scopebb());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
285
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
286 llvm::Value* srcarr = new llvm::BitCastInst(tc->llvmInit,arrty,"tmp",gIR->scopebb());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
287 srcarr = DtoGEPi(srcarr,size_t_size,"tmp",gIR->scopebb());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
288
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
289 llvm::Function* fn = LLVM_DeclareMemCpy32();
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
290 std::vector<llvm::Value*> llargs;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
291 llargs.resize(4);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
292 llargs[0] = dstarr;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
293 llargs[1] = srcarr;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
294 llargs[2] = llvm::ConstantInt::get(llvm::Type::Int32Ty, n, false);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
295 llargs[3] = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
296
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
297 new llvm::CallInst(fn, llargs.begin(), llargs.end(), "", gIR->scopebb());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
298 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
299 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
300
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
301 //////////////////////////////////////////////////////////////////////////////////////////
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
302
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
303 void DtoDeclareClassInfo(ClassDeclaration* cd)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
304 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
305 if (cd->llvmClass)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
306 return;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
307
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
308 Logger::println("CLASS INFO DECLARATION: %s", cd->toChars());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
309 LOG_SCOPE;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
310
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
311 ClassDeclaration* cinfo = ClassDeclaration::classinfo;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
312 cinfo->toObjFile();
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
313
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
314 const llvm::Type* st = cinfo->type->llvmType->get();
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
315
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
316 std::string gname("_D");
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
317 gname.append(cd->mangle());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
318 gname.append("7__ClassZ");
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
319
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
320 cd->llvmClass = new llvm::GlobalVariable(st, true, llvm::GlobalValue::ExternalLinkage, NULL, gname, gIR->module);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
321 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
322
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
323 void DtoDefineClassInfo(ClassDeclaration* cd)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
324 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
325 // The layout is:
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
326 // {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
327 // void **vptr;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
328 // monitor_t monitor;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
329 // byte[] initializer; // static initialization data
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
330 // char[] name; // class name
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
331 // void *[] vtbl;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
332 // Interface[] interfaces;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
333 // ClassInfo *base; // base class
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
334 // void *destructor;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
335 // void *invariant; // class invariant
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
336 // uint flags;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
337 // void *deallocator;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
338 // OffsetTypeInfo[] offTi;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
339 // void *defaultConstructor;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
340 // }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
341
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
342 if (cd->llvmClassZ)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
343 return;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
344
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
345 Logger::println("CLASS INFO DEFINITION: %s", cd->toChars());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
346 LOG_SCOPE;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
347 assert(cd->llvmClass);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
348
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
349 // holds the list of initializers for llvm
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
350 std::vector<llvm::Constant*> inits;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
351
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
352 ClassDeclaration* cinfo = ClassDeclaration::classinfo;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
353 DtoConstInitClass(cinfo);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
354 assert(cinfo->llvmInitZ);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
355
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
356 llvm::Constant* c;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
357
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
358 // own vtable
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
359 c = cinfo->llvmInitZ->getOperand(0);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
360 assert(c);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
361 inits.push_back(c);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
362
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
363 // monitor
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
364 // TODO no monitors yet
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
365
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
366 // initializer
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
367 c = cinfo->llvmInitZ->getOperand(1);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
368 inits.push_back(c);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
369
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
370 // class name
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
371 // from dmd
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
372 char *name = cd->ident->toChars();
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
373 size_t namelen = strlen(name);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
374 if (!(namelen > 9 && memcmp(name, "TypeInfo_", 9) == 0))
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
375 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
376 name = cd->toPrettyChars();
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
377 namelen = strlen(name);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
378 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
379 c = DtoConstString(name);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
380 inits.push_back(c);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
381
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
382 // vtbl array
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
383 c = cinfo->llvmInitZ->getOperand(3);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
384 inits.push_back(c);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
385
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
386 // interfaces array
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
387 c = cinfo->llvmInitZ->getOperand(4);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
388 inits.push_back(c);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
389
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
390 // base classinfo
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
391 c = cinfo->llvmInitZ->getOperand(5);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
392 inits.push_back(c);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
393
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
394 // destructor
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
395 c = cinfo->llvmInitZ->getOperand(6);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
396 inits.push_back(c);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
397
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
398 // invariant
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
399 c = cinfo->llvmInitZ->getOperand(7);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
400 inits.push_back(c);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
401
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
402 // flags
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
403 c = cinfo->llvmInitZ->getOperand(8);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
404 inits.push_back(c);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
405
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
406 // allocator
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
407 c = cinfo->llvmInitZ->getOperand(9);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
408 inits.push_back(c);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
409
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
410 // offset typeinfo
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
411 c = cinfo->llvmInitZ->getOperand(10);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
412 inits.push_back(c);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
413
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
414 // default constructor
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
415 c = cinfo->llvmInitZ->getOperand(11);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
416 inits.push_back(c);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
417
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
418 /*size_t n = inits.size();
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
419 for (size_t i=0; i<n; ++i)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
420 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
421 Logger::cout() << "inits[" << i << "]: " << *inits[i] << '\n';
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
422 }*/
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
423
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
424 // build the initializer
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
425 const llvm::StructType* st = isaStruct(cinfo->llvmInitZ->getType());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
426 llvm::Constant* finalinit = llvm::ConstantStruct::get(st, inits);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
427 //Logger::cout() << "built the classinfo initializer:\n" << *finalinit <<'\n';
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
428
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
429 cd->llvmClassZ = finalinit;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
430 cd->llvmClass->setInitializer(finalinit);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
431 }