annotate gen/classes.cpp @ 109:5ab8e92611f9 trunk

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