annotate gen/classes.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 855adfdb8d38
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"
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
13 #include "gen/functions.h"
100
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
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
17 static void LLVM_AddBaseClassData(BaseClasses* bcs)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
18 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
19 // add base class data members first
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
20 for (int j=0; j<bcs->dim; j++)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
21 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
22 BaseClass* bc = (BaseClass*)(bcs->data[j]);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
23 assert(bc);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
24 Logger::println("Adding base class members of %s", bc->base->toChars());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
25 LOG_SCOPE;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
26
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
27 LLVM_AddBaseClassData(&bc->base->baseclasses);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
28 for (int k=0; k < bc->base->members->dim; k++) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
29 Dsymbol* dsym = (Dsymbol*)(bc->base->members->data[k]);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
30 if (dsym->isVarDeclaration())
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
31 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
32 dsym->toObjFile();
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
33 }
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
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
40 void DtoResolveClass(ClassDeclaration* cd)
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
41 {
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
42 if (cd->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
43 cd->llvmResolved = true;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
44
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
45 // first resolve the base class
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
46 if (cd->baseClass) {
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
47 DtoResolveClass(cd->baseClass);
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
48 }
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
49
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
50 Logger::println("DtoResolveClass(%s)", cd->toPrettyChars());
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
51 LOG_SCOPE;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
52
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
53 assert(cd->type->ty == Tclass);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
54 TypeClass* ts = (TypeClass*)cd->type;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
55
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
56 assert(!cd->llvmIRStruct);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
57 IRStruct* irstruct = new IRStruct(ts);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
58 cd->llvmIRStruct = irstruct;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
59
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
60 gIR->structs.push_back(irstruct);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
61 gIR->classes.push_back(cd);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
62
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
63 // add vtable
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
64 ts->llvmVtblType = new llvm::PATypeHolder(llvm::OpaqueType::get());
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
65 const llvm::Type* vtabty = llvm::PointerType::get(ts->llvmVtblType->get());
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
66
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
67 std::vector<const llvm::Type*> fieldtypes;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
68 fieldtypes.push_back(vtabty);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
69
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
70 // base classes first
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
71 LLVM_AddBaseClassData(&cd->baseclasses);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
72
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
73 // then add own members
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
74 for (int k=0; k < cd->members->dim; k++) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
75 Dsymbol* dsym = (Dsymbol*)(cd->members->data[k]);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
76 dsym->toObjFile();
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
77 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
78
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
79 // add field types
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
80 for (IRStruct::OffsetMap::iterator i=irstruct->offsets.begin(); i!=irstruct->offsets.end(); ++i) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
81 fieldtypes.push_back(i->second.type);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
82 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
83
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
84 const llvm::StructType* structtype = llvm::StructType::get(fieldtypes);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
85 // refine abstract types for stuff like: class C {C next;}
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
86 assert(irstruct->recty != 0);
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
87
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
88 llvm::PATypeHolder& spa = irstruct->recty;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
89 llvm::cast<llvm::OpaqueType>(spa.get())->refineAbstractTypeTo(structtype);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
90 structtype = isaStruct(spa.get());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
91
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
92 ts->llvmType = new llvm::PATypeHolder(structtype);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
93
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
94 bool needs_definition = false;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
95 if (cd->parent->isModule()) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
96 gIR->module->addTypeName(cd->mangle(), ts->llvmType->get());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
97 needs_definition = (cd->getModule() == gIR->dmodule);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
98 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
99 else {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
100 assert(0 && "class parent is not a module");
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
101 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
102
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
103 // generate vtable
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
104 llvm::GlobalVariable* svtblVar = 0;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
105 std::vector<const llvm::Type*> sinits_ty;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
106
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
107 for (int k=0; k < cd->vtbl.dim; k++)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
108 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
109 Dsymbol* dsym = (Dsymbol*)cd->vtbl.data[k];
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
110 assert(dsym);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
111 //Logger::cout() << "vtblsym: " << dsym->toChars() << '\n';
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
112
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
113 if (FuncDeclaration* fd = dsym->isFuncDeclaration()) {
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
114 DtoResolveFunction(fd);
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
115 assert(fd->type->ty == Tfunction);
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
116 TypeFunction* tf = (TypeFunction*)fd->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
117 const llvm::Type* fpty = llvm::PointerType::get(tf->llvmType->get());
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
118 sinits_ty.push_back(fpty);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
119 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
120 else if (ClassDeclaration* cd = dsym->isClassDeclaration()) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
121 const llvm::Type* cty = llvm::PointerType::get(llvm::Type::Int8Ty);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
122 sinits_ty.push_back(cty);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
123 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
124 else
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
125 assert(0);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
126 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
127
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
128 assert(!sinits_ty.empty());
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
129 const llvm::StructType* svtbl_ty = llvm::StructType::get(sinits_ty);
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
130
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
131 std::string styname(cd->mangle());
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
132 styname.append("__vtblType");
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
133 gIR->module->addTypeName(styname, svtbl_ty);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
134
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
135 // refine for final vtable 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
136 llvm::cast<llvm::OpaqueType>(ts->llvmVtblType->get())->refineAbstractTypeTo(svtbl_ty);
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
137
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
138 gIR->classes.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
139 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
140
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
141 gIR->declareList.push_back(cd);
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
142 }
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
143
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
144 //////////////////////////////////////////////////////////////////////////////////////////
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
145
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
146 void DtoDeclareClass(ClassDeclaration* cd)
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
147 {
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
148 if (cd->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
149 cd->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
150
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
151 Logger::println("DtoDeclareClass(%s)", cd->toPrettyChars());
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
152 LOG_SCOPE;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
153
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
154 assert(cd->type->ty == Tclass);
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
155 TypeClass* ts = (TypeClass*)cd->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
156
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
157 assert(cd->llvmIRStruct);
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
158 IRStruct* irstruct = cd->llvmIRStruct;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
159
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
160 gIR->structs.push_back(irstruct);
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
161 gIR->classes.push_back(cd);
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
162
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
163 bool needs_definition = false;
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
164 if (cd->parent->isModule()) {
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
165 needs_definition = (cd->getModule() == gIR->dmodule);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
166 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
167
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
168 // vtable
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 std::string varname("_D");
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
170 varname.append(cd->mangle());
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 varname.append("6__vtblZ");
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
172
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
173 std::string styname(cd->mangle());
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 styname.append("__vtblTy");
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
175
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
176 llvm::GlobalValue::LinkageTypes _linkage = llvm::GlobalValue::ExternalLinkage;
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
177
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
178 const llvm::StructType* svtbl_ty = isaStruct(ts->llvmVtblType->get());
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
179 cd->llvmVtbl = new llvm::GlobalVariable(svtbl_ty, true, _linkage, 0, varname, gIR->module);
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
180
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
181 // init
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
182 std::string initname("_D");
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
183 initname.append(cd->mangle());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
184 initname.append("6__initZ");
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
185
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
186 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
187 ts->llvmInit = initvar;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
188
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
189 gIR->classes.pop_back();
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
190 gIR->structs.pop_back();
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
191
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
192 gIR->constInitList.push_back(cd);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
193 if (needs_definition)
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
194 gIR->defineList.push_back(cd);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
195 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
196
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
197 //////////////////////////////////////////////////////////////////////////////////////////
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
198
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
199 void DtoConstInitClass(ClassDeclaration* cd)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
200 {
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
201 if (cd->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
202 cd->llvmInitialized = true;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
203
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
204 Logger::println("DtoConstInitClass(%s)", cd->toPrettyChars());
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
205 LOG_SCOPE;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
206
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
207 IRStruct* irstruct = cd->llvmIRStruct;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
208 gIR->structs.push_back(irstruct);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
209 gIR->classes.push_back(cd);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
210
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
211 // make sure each offset knows its default initializer
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
212 for (IRStruct::OffsetMap::iterator i=irstruct->offsets.begin(); i!=irstruct->offsets.end(); ++i)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
213 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
214 IRStruct::Offset* so = &i->second;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
215 llvm::Constant* finit = DtoConstFieldInitializer(so->var->type, so->var->init);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
216 so->init = finit;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
217 so->var->llvmConstInit = finit;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
218 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
219
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
220 // fill out fieldtypes/inits
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
221 std::vector<llvm::Constant*> fieldinits;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
222
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
223 // first field is always the vtable
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
224 assert(cd->llvmVtbl != 0);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
225 fieldinits.push_back(cd->llvmVtbl);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
226
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
227 // rest
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
228 for (IRStruct::OffsetMap::iterator i=irstruct->offsets.begin(); i!=irstruct->offsets.end(); ++i) {
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
229 Logger::println("adding fieldinit for: %s", i->second.var->toChars());
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
230 fieldinits.push_back(i->second.init);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
231 }
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 const llvm::StructType* structtype = isaStruct(ts->llvmType->get());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
237
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
238 // generate initializer
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
239 Logger::cout() << cd->toPrettyChars() << " | " << *structtype << '\n';
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
240
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
241 for(size_t i=0; i<structtype->getNumElements(); ++i) {
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
242 Logger::cout() << "s#" << i << " = " << *structtype->getElementType(i) << '\n';
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
243 }
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
244
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
245 for(size_t i=0; i<fieldinits.size(); ++i) {
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
246 Logger::cout() << "i#" << i << " = " << *fieldinits[i]->getType() << '\n';
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
247 }
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
248
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
249 llvm::Constant* _init = llvm::ConstantStruct::get(structtype, fieldinits);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
250 assert(_init);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
251 cd->llvmInitZ = _init;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
252
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
253 // generate vtable initializer
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
254 std::vector<llvm::Constant*> sinits;
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
255
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
256 for (int k=0; k < cd->vtbl.dim; k++)
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
257 {
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
258 Dsymbol* dsym = (Dsymbol*)cd->vtbl.data[k];
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
259 assert(dsym);
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
260 //Logger::cout() << "vtblsym: " << dsym->toChars() << '\n';
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
261
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
262 if (FuncDeclaration* fd = dsym->isFuncDeclaration()) {
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
263 DtoForceDeclareDsymbol(fd);
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
264 assert(fd->llvmValue);
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
265 llvm::Constant* c = llvm::cast<llvm::Constant>(fd->llvmValue);
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
266 sinits.push_back(c);
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
267 }
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
268 else if (ClassDeclaration* cd = dsym->isClassDeclaration()) {
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
269 const llvm::Type* cty = llvm::PointerType::get(llvm::Type::Int8Ty);
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
270 llvm::Constant* c = llvm::Constant::getNullValue(cty);
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
271 sinits.push_back(c);
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
272 }
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
273 else
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
274 assert(0);
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
275 }
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
276
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
277 const llvm::StructType* svtbl_ty = isaStruct(ts->llvmVtblType->get());
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
278
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
279 /*for (size_t i=0; i< sinits.size(); ++i)
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
280 {
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
281 Logger::cout() << "field[" << i << "] = " << *svtbl_ty->getElementType(i) << '\n';
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
282 Logger::cout() << "init [" << i << "] = " << *sinits[i]->getType() << '\n';
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
283 assert(svtbl_ty->getElementType(i) == sinits[i]->getType());
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 }*/
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 llvm::Constant* cvtblInit = llvm::ConstantStruct::get(svtbl_ty, sinits);
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 cd->llvmConstVtbl = llvm::cast<llvm::ConstantStruct>(cvtblInit);
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
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
289 gIR->classes.pop_back();
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
290 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
291
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 DtoDeclareClassInfo(cd);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
293 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
294
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
295 //////////////////////////////////////////////////////////////////////////////////////////
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
296
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
297 void DtoDefineClass(ClassDeclaration* cd)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
298 {
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
299 if (cd->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
300 cd->llvmDefined = true;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
301
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
302 Logger::println("DtoDefineClass(%s)", cd->toPrettyChars());
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
303 LOG_SCOPE;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
304
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
305 // get the struct (class) type
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
306 assert(cd->type->ty == Tclass);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
307 TypeClass* ts = (TypeClass*)cd->type;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
308
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
309 bool def = false;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
310 if (cd->parent->isModule() && cd->getModule() == gIR->dmodule) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
311 ts->llvmInit->setInitializer(cd->llvmInitZ);
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
312 cd->llvmVtbl->setInitializer(cd->llvmConstVtbl);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
313 def = true;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
314 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
315
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
316 // generate classinfo
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
317 if (def) DtoDefineClassInfo(cd);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
318 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
319
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
320 //////////////////////////////////////////////////////////////////////////////////////////
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
321
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
322 void DtoCallClassDtors(TypeClass* tc, llvm::Value* instance)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
323 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
324 Array* arr = &tc->sym->dtors;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
325 for (size_t i=0; i<arr->dim; i++)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
326 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
327 FuncDeclaration* fd = (FuncDeclaration*)arr->data[i];
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
328 assert(fd->llvmValue);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
329 new llvm::CallInst(fd->llvmValue, instance, "", gIR->scopebb());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
330 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
331 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
332
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
333 //////////////////////////////////////////////////////////////////////////////////////////
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
334
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
335 void DtoInitClass(TypeClass* tc, llvm::Value* dst)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
336 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
337 assert(gIR);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
338
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
339 assert(tc->llvmType);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
340 uint64_t size_t_size = gTargetData->getTypeSize(DtoSize_t());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
341 uint64_t n = gTargetData->getTypeSize(tc->llvmType->get()) - size_t_size;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
342
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
343 // set vtable field
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
344 llvm::Value* vtblvar = DtoGEPi(dst,0,0,"tmp",gIR->scopebb());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
345 assert(tc->sym->llvmVtbl);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
346 new llvm::StoreInst(tc->sym->llvmVtbl, vtblvar, gIR->scopebb());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
347
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
348 // copy the static initializer
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
349 if (n > 0) {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
350 assert(tc->llvmInit);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
351 assert(dst->getType() == tc->llvmInit->getType());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
352
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
353 llvm::Type* arrty = llvm::PointerType::get(llvm::Type::Int8Ty);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
354
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
355 llvm::Value* dstarr = new llvm::BitCastInst(dst,arrty,"tmp",gIR->scopebb());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
356 dstarr = DtoGEPi(dstarr,size_t_size,"tmp",gIR->scopebb());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
357
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
358 llvm::Value* srcarr = new llvm::BitCastInst(tc->llvmInit,arrty,"tmp",gIR->scopebb());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
359 srcarr = DtoGEPi(srcarr,size_t_size,"tmp",gIR->scopebb());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
360
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
361 llvm::Function* fn = LLVM_DeclareMemCpy32();
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
362 std::vector<llvm::Value*> llargs;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
363 llargs.resize(4);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
364 llargs[0] = dstarr;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
365 llargs[1] = srcarr;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
366 llargs[2] = llvm::ConstantInt::get(llvm::Type::Int32Ty, n, false);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
367 llargs[3] = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
368
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
369 new llvm::CallInst(fn, llargs.begin(), llargs.end(), "", gIR->scopebb());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
370 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
371 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
372
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
373 //////////////////////////////////////////////////////////////////////////////////////////
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
374
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
375 void DtoDeclareClassInfo(ClassDeclaration* cd)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
376 {
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
377 if (cd->llvmClassDeclared) 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
378 cd->llvmClassDeclared = true;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
379
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 Logger::println("DtoDeclareClassInfo(%s)", cd->toChars());
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
381 LOG_SCOPE;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
382
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
383 ClassDeclaration* cinfo = ClassDeclaration::classinfo;
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
384 DtoResolveClass(cinfo);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
385
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
386 std::string gname("_D");
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
387 gname.append(cd->mangle());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
388 gname.append("7__ClassZ");
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
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 const llvm::Type* st = cinfo->type->llvmType->get();
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
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
392 cd->llvmClass = new llvm::GlobalVariable(st, true, llvm::GlobalValue::ExternalLinkage, NULL, gname, gIR->module);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
393 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
394
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
395 void DtoDefineClassInfo(ClassDeclaration* cd)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
396 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
397 // The layout is:
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
398 // {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
399 // void **vptr;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
400 // monitor_t monitor;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
401 // byte[] initializer; // static initialization data
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
402 // char[] name; // class name
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
403 // void *[] vtbl;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
404 // Interface[] interfaces;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
405 // ClassInfo *base; // base class
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
406 // void *destructor;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
407 // void *invariant; // class invariant
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
408 // uint flags;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
409 // void *deallocator;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
410 // OffsetTypeInfo[] offTi;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
411 // void *defaultConstructor;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
412 // }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
413
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
414 if (cd->llvmClassDefined) 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
415 cd->llvmClassDefined = 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
416
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
417 Logger::println("DtoDefineClassInfo(%s)", cd->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
418 LOG_SCOPE;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
419
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
420 assert(cd->type->ty == Tclass);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
421 assert(cd->llvmClass);
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
422 assert(cd->llvmInitZ);
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
423 assert(cd->llvmVtbl);
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
424 assert(cd->llvmConstVtbl);
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
425
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
426 TypeClass* cdty = (TypeClass*)cd->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
427 assert(cdty->llvmInit);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
428
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
429 // holds the list of initializers for llvm
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
430 std::vector<llvm::Constant*> inits;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
431
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
432 ClassDeclaration* cinfo = ClassDeclaration::classinfo;
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
433 DtoForceConstInitDsymbol(cinfo);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
434 assert(cinfo->llvmInitZ);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
435
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
436 llvm::Constant* c;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
437
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
438 // own vtable
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
439 c = cinfo->llvmInitZ->getOperand(0);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
440 assert(c);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
441 inits.push_back(c);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
442
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
443 // monitor
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
444 // TODO no monitors yet
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
445
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
446 // byte[] init
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
447 const llvm::Type* byteptrty = llvm::PointerType::get(llvm::Type::Int8Ty);
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
448 c = llvm::ConstantExpr::getBitCast(cdty->llvmInit, byteptrty);
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
449 assert(!cd->llvmInitZ->getType()->isAbstract());
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
450 size_t initsz = gTargetData->getTypeSize(cd->llvmInitZ->getType());
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
451 c = DtoConstSlice(DtoConstSize_t(initsz), c);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
452 inits.push_back(c);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
453
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
454 // class name
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
455 // from dmd
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
456 char *name = cd->ident->toChars();
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
457 size_t namelen = strlen(name);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
458 if (!(namelen > 9 && memcmp(name, "TypeInfo_", 9) == 0))
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
459 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
460 name = cd->toPrettyChars();
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
461 namelen = strlen(name);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
462 }
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
463 c = DtoConstString(name);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
464 inits.push_back(c);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
465
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
466 // vtbl array
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
467 const llvm::Type* byteptrptrty = llvm::PointerType::get(byteptrty);
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
468 assert(!cd->llvmVtbl->getType()->isAbstract());
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
469 c = llvm::ConstantExpr::getBitCast(cd->llvmVtbl, byteptrptrty);
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
470 assert(!cd->llvmConstVtbl->getType()->isAbstract());
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
471 size_t vtblsz = gTargetData->getTypeSize(cd->llvmConstVtbl->getType());
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
472 c = DtoConstSlice(DtoConstSize_t(vtblsz), c);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
473 inits.push_back(c);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
474
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
475 // interfaces array
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
476 // TODO
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
477 c = cinfo->llvmInitZ->getOperand(4);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
478 inits.push_back(c);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
479
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
480 // base classinfo
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
481 if (cd->baseClass) {
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
482 DtoDeclareClassInfo(cd->baseClass);
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
483 c = cd->baseClass->llvmClass;
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
484 assert(c);
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
485 inits.push_back(c);
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
486 }
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
487 else {
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
488 // null
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
489 c = cinfo->llvmInitZ->getOperand(5);
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
490 inits.push_back(c);
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
491 }
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
492
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
493 // destructor
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
494 // TODO
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
495 c = cinfo->llvmInitZ->getOperand(6);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
496 inits.push_back(c);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
497
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
498 // invariant
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
499 // TODO
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
500 c = cinfo->llvmInitZ->getOperand(7);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
501 inits.push_back(c);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
502
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
503 // uint flags, adapted from original dmd code
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
504 uint flags = 0;
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
505 //flags |= 4; // has offTi
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
506 //flags |= isCOMclass(); // IUnknown
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
507 if (cd->ctor) flags |= 8;
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
508 for (ClassDeclaration *cd2 = cd; cd2; cd2 = cd2->baseClass)
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
509 {
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
510 if (cd2->members)
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
511 {
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
512 for (size_t i = 0; i < cd2->members->dim; i++)
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
513 {
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
514 Dsymbol *sm = (Dsymbol *)cd2->members->data[i];
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
515 //printf("sm = %s %s\n", sm->kind(), sm->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
516 if (sm->hasPointers())
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
517 goto L2;
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
518 }
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
519 }
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
520 }
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
521 flags |= 2; // no pointers
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
522 L2:
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
523 c = DtoConstUint(flags);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
524 inits.push_back(c);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
525
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
526 // allocator
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
527 // TODO
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
528 c = cinfo->llvmInitZ->getOperand(9);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
529 inits.push_back(c);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
530
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
531 // offset typeinfo
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
532 // TODO
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
533 c = cinfo->llvmInitZ->getOperand(10);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
534 inits.push_back(c);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
535
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
536 // default constructor
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
537 // TODO
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
538 c = cinfo->llvmInitZ->getOperand(11);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
539 inits.push_back(c);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
540
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
541 /*size_t n = inits.size();
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
542 for (size_t i=0; i<n; ++i)
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
543 {
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
544 Logger::cout() << "inits[" << i << "]: " << *inits[i] << '\n';
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
545 }*/
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
546
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
547 // build the initializer
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
548 const llvm::StructType* st = isaStruct(cinfo->llvmInitZ->getType());
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
549 llvm::Constant* finalinit = llvm::ConstantStruct::get(st, inits);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
550 //Logger::cout() << "built the classinfo initializer:\n" << *finalinit <<'\n';
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
551
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
552 cd->llvmClassZ = finalinit;
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
553 cd->llvmClass->setInitializer(finalinit);
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents:
diff changeset
554 }