annotate gen/typinf.cpp @ 132:1700239cab2e trunk

[svn r136] MAJOR UNSTABLE UPDATE!!! Initial commit after moving to Tango instead of Phobos. Lots of bugfixes... This build is not suitable for most things.
author lindquist
date Fri, 11 Jan 2008 17:57:40 +0100
parents 9c79b61fb638
children 44a95ac7368a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
2
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
3 // Copyright (c) 1999-2004 by Digital Mars
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
4 // All Rights Reserved
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
5 // written by Walter Bright
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
6 // www.digitalmars.com
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
7 // License for redistribution is by either the Artistic License
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
8 // in artistic.txt, or the GNU General Public License in gnu.txt.
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
9 // See the included readme.txt for details.
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
10
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
11 // Modifications for LLVMDC:
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
12 // Copyright (c) 2007 by Tomas Lindquist Olsen
027b8d8b71ec [svn 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 // tomas at famolsen dk
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
14
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
15 #include <cstdio>
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
16 #include <cassert>
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
17
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
18 #include "gen/llvm.h"
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
19
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
20 #include "mars.h"
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
21 #include "module.h"
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
22 #include "mtype.h"
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
23 #include "scope.h"
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
24 #include "init.h"
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
25 #include "expression.h"
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
26 #include "attrib.h"
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
27 #include "declaration.h"
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
28 #include "template.h"
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
29 #include "id.h"
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
30 #include "enum.h"
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
31 #include "import.h"
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
32 #include "aggregate.h"
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
33
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
34 #include "gen/irstate.h"
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents: 1
diff changeset
35 #include "gen/logger.h"
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
36 #include "gen/runtime.h"
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
37 #include "gen/tollvm.h"
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
38 #include "gen/arrays.h"
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 98
diff changeset
39 #include "gen/structs.h"
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
40 #include "gen/classes.h"
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
41
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
42 /*******************************************
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
43 * Get a canonicalized form of the TypeInfo for use with the internal
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
44 * runtime library routines. Canonicalized in that static arrays are
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
45 * represented as dynamic arrays, enums are represented by their
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
46 * underlying type, etc. This reduces the number of TypeInfo's needed,
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
47 * so we can use the custom internal ones more.
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
48 */
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
49
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
50 Expression *Type::getInternalTypeInfo(Scope *sc)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
51 { TypeInfoDeclaration *tid;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
52 Expression *e;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
53 Type *t;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
54 static TypeInfoDeclaration *internalTI[TMAX];
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
55
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
56 //printf("Type::getInternalTypeInfo() %s\n", toChars());
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
57 t = toBasetype();
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
58 switch (t->ty)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
59 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
60 case Tsarray:
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
61 t = t->next->arrayOf(); // convert to corresponding dynamic array type
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
62 break;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
63
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
64 case Tclass:
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
65 if (((TypeClass *)t)->sym->isInterfaceDeclaration())
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
66 break;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
67 goto Linternal;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
68
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
69 case Tarray:
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
70 if (t->next->ty != Tclass)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
71 break;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
72 goto Linternal;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
73
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
74 case Tfunction:
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
75 case Tdelegate:
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
76 case Tpointer:
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
77 Linternal:
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
78 tid = internalTI[t->ty];
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
79 if (!tid)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
80 { tid = new TypeInfoDeclaration(t, 1);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
81 internalTI[t->ty] = tid;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
82 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
83 e = new VarExp(0, tid);
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
84 //e = e->addressOf(sc);
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
85 e->type = tid->type; // do this so we don't get redundant dereference
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
86 return e;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
87
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
88 default:
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
89 break;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
90 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
91 //printf("\tcalling getTypeInfo() %s\n", t->toChars());
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
92 return t->getTypeInfo(sc);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
93 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
94
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
95
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
96 /****************************************************
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
97 * Get the exact TypeInfo.
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
98 */
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
99
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
100 Expression *Type::getTypeInfo(Scope *sc)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
101 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
102 Expression *e;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
103 Type *t;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
104
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
105 //printf("Type::getTypeInfo() %p, %s\n", this, toChars());
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
106 t = merge(); // do this since not all Type's are merge'd
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
107 if (!t->vtinfo)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
108 { t->vtinfo = t->getTypeInfoDeclaration();
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
109 assert(t->vtinfo);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
110
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
111 /* If this has a custom implementation in std/typeinfo, then
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
112 * do not generate a COMDAT for it.
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
113 */
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
114 if (!t->builtinTypeInfo())
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
115 { // Generate COMDAT
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
116 if (sc) // if in semantic() pass
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
117 { // Find module that will go all the way to an object file
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
118 Module *m = sc->module->importedFrom;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
119 m->members->push(t->vtinfo);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
120 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
121 else // if in obj generation pass
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
122 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
123 t->vtinfo->toObjFile();
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
124 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
125 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
126 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
127 e = new VarExp(0, t->vtinfo);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
128 //e = e->addressOf(sc);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
129 e->type = t->vtinfo->type; // do this so we don't get redundant dereference
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
130 return e;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
131 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
132
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
133 enum RET TypeFunction::retStyle()
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
134 {
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
135 return RETstack;
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
136 }
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
137
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
138 TypeInfoDeclaration *Type::getTypeInfoDeclaration()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
139 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
140 //printf("Type::getTypeInfoDeclaration() %s\n", toChars());
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
141 return new TypeInfoDeclaration(this, 0);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
142 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
143
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
144 TypeInfoDeclaration *TypeTypedef::getTypeInfoDeclaration()
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
145 {
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
146 return new TypeInfoTypedefDeclaration(this);
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
147 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
148
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
149 TypeInfoDeclaration *TypePointer::getTypeInfoDeclaration()
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
150 {
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
151 return new TypeInfoPointerDeclaration(this);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
152 }
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
153
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
154 TypeInfoDeclaration *TypeDArray::getTypeInfoDeclaration()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
155 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
156 return new TypeInfoArrayDeclaration(this);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
157 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
158
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
159 TypeInfoDeclaration *TypeSArray::getTypeInfoDeclaration()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
160 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
161 return new TypeInfoStaticArrayDeclaration(this);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
162 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
163
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
164 TypeInfoDeclaration *TypeAArray::getTypeInfoDeclaration()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
165 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
166 return new TypeInfoAssociativeArrayDeclaration(this);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
167 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
168
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
169 TypeInfoDeclaration *TypeStruct::getTypeInfoDeclaration()
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
170 {
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
171 return new TypeInfoStructDeclaration(this);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
172 }
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
173
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
174 TypeInfoDeclaration *TypeClass::getTypeInfoDeclaration()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
175 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
176 if (sym->isInterfaceDeclaration())
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
177 return new TypeInfoInterfaceDeclaration(this);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
178 else
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
179 return new TypeInfoClassDeclaration(this);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
180 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
181
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
182 TypeInfoDeclaration *TypeEnum::getTypeInfoDeclaration()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
183 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
184 return new TypeInfoEnumDeclaration(this);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
185 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
186
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
187 TypeInfoDeclaration *TypeFunction::getTypeInfoDeclaration()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
188 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
189 return new TypeInfoFunctionDeclaration(this);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
190 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
191
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
192 TypeInfoDeclaration *TypeDelegate::getTypeInfoDeclaration()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
193 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
194 return new TypeInfoDelegateDeclaration(this);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
195 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
196
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
197 TypeInfoDeclaration *TypeTuple::getTypeInfoDeclaration()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
198 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
199 return new TypeInfoTupleDeclaration(this);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
200 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
201
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
202
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
203 /* ========================================================================= */
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
204
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
205 /* These decide if there's an instance for them already in std.typeinfo,
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
206 * because then the compiler doesn't need to build one.
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
207 */
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
208
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
209 int Type::builtinTypeInfo()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
210 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
211 return 0;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
212 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
213
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
214 int TypeBasic::builtinTypeInfo()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
215 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
216 return 1;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
217 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
218
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
219 int TypeDArray::builtinTypeInfo()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
220 {
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
221 return next->isTypeBasic() != NULL;
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
222 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
223
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
224 /* ========================================================================= */
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
225
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
226 /***************************************
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
227 * Create a static array of TypeInfo references
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
228 * corresponding to an array of Expression's.
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
229 * Used to supply hidden _arguments[] value for variadic D functions.
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
230 */
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
231
57
a9d29e9f1fed [svn r61] Added support for D-style variadic functions :)
lindquist
parents: 54
diff changeset
232 Expression *createTypeInfoArray(Scope *sc, Expression *exps[], int dim)
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
233 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
234 assert(0);
57
a9d29e9f1fed [svn r61] Added support for D-style variadic functions :)
lindquist
parents: 54
diff changeset
235 return NULL;
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
236 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
237
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
238 /* ========================================================================= */
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
239
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
240 //////////////////////////////////////////////////////////////////////////////
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
241 // MAGIC PLACE
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
242 //////////////////////////////////////////////////////////////////////////////
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
243
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
244 void TypeInfoDeclaration::toObjFile()
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
245 {
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
246 gIR->resolveList.push_back(this);
027b8d8b71ec [svn 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 }
57
a9d29e9f1fed [svn r61] Added support for D-style variadic functions :)
lindquist
parents: 54
diff changeset
248
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
249 void DtoResolveTypeInfo(TypeInfoDeclaration* tid)
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
250 {
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
251 if (tid->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
252 tid->llvmResolved = 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
253
132
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
254 Logger::println("DtoResolveTypeInfo(%s)", tid->toChars());
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
255 LOG_SCOPE;
65
d4a678905d5e [svn r69] forgot std.stdarg
lindquist
parents: 58
diff changeset
256
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
257 tid->llvmIRGlobal = new IRGlobal(tid);
027b8d8b71ec [svn 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
027b8d8b71ec [svn 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 gIR->declareList.push_back(tid);
027b8d8b71ec [svn 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 }
98
6789050b5ad1 [svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references.
lindquist
parents: 96
diff changeset
261
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
262 void DtoDeclareTypeInfo(TypeInfoDeclaration* tid)
027b8d8b71ec [svn 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 {
027b8d8b71ec [svn 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 if (tid->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
265 tid->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
266
132
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
267 Logger::println("DtoDeclareTypeInfo(%s)", tid->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
268 LOG_SCOPE;
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
269
027b8d8b71ec [svn 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 std::string mangled(tid->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
271
027b8d8b71ec [svn 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 Logger::println("type = '%s'", tid->tinfo->toChars());
98
6789050b5ad1 [svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references.
lindquist
parents: 96
diff changeset
273 Logger::println("typeinfo mangle: %s", mangled.c_str());
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
274
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
275 // this is a declaration of a builtin __initZ var
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
276 if (tid->tinfo->builtinTypeInfo()) {
132
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
277 llvm::Value* found = gIR->module->getNamedGlobal(mangled);
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
278 if (!found)
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
279 {
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
280 const llvm::Type* t = llvm::OpaqueType::get();
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
281 llvm::GlobalVariable* g = new llvm::GlobalVariable(t, true, llvm::GlobalValue::ExternalLinkage, NULL, mangled, gIR->module);
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
282 assert(g);
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
283 tid->llvmValue = g;
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
284 mangled.append("__TYPE");
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
285 gIR->module->addTypeName(mangled, tid->llvmValue->getType()->getContainedType(0));
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
286 Logger::println("Got typeinfo var: %s", tid->llvmValue->getName().c_str());
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
287 tid->llvmInitialized = true;
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
288 tid->llvmDefined = true;
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
289 }
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
290 else if (!tid->llvmValue) {
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
291 tid->llvmValue = found;
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
292 tid->llvmInitialized = true;
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
293 tid->llvmDefined = true;
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
294 }
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
295 }
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
296 // custom typedef
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
297 else {
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
298 tid->llvmDeclare();
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 gIR->constInitList.push_back(tid);
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
300 }
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
301 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
302
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
303 void DtoConstInitTypeInfo(TypeInfoDeclaration* tid)
027b8d8b71ec [svn 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 if (tid->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
306 tid->llvmInitialized = 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
307
132
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
308 Logger::println("DtoConstInitTypeInfo(%s)", tid->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
309 LOG_SCOPE;
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
310
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
311 gIR->defineList.push_back(tid);
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 }
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
313
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
314 void DtoDefineTypeInfo(TypeInfoDeclaration* tid)
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
315 {
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
316 if (tid->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
317 tid->llvmDefined = 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
318
132
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
319 Logger::println("DtoDefineTypeInfo(%s)", tid->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
320 LOG_SCOPE;
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
321
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
322 tid->llvmDefine();
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
323 }
027b8d8b71ec [svn 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
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
325 /* ========================================================================= */
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
326
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
327 void TypeInfoDeclaration::toDt(dt_t **pdt)
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
328 {
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
329 assert(0 && "TypeInfoDeclaration::toDt");
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
330 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
331
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
332 void TypeInfoDeclaration::llvmDeclare()
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
333 {
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
334 assert(0 && "TypeInfoDeclaration::llvmDeclare");
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
335 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
336
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
337 void TypeInfoDeclaration::llvmDefine()
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
338 {
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
339 assert(0 && "TypeInfoDeclaration::llvmDeclare");
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
340 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
341
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
342 /* ========================================================================= */
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
343
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
344 void TypeInfoTypedefDeclaration::llvmDeclare()
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
345 {
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
346 Logger::println("TypeInfoTypedefDeclaration::llvmDeclare() %s", toChars());
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
347 LOG_SCOPE;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
348
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
349 ClassDeclaration* base = Type::typeinfotypedef;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
350 DtoResolveClass(base);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
351
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
352 const llvm::StructType* stype = isaStruct(base->type->llvmType->get());
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
353
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
354 // create the symbol
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
355 llvmValue = new llvm::GlobalVariable(stype,true,llvm::GlobalValue::WeakLinkage,NULL,toChars(),gIR->module);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
356 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
357
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
358 void TypeInfoTypedefDeclaration::llvmDefine()
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
359 {
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
360 Logger::println("TypeInfoTypedefDeclaration::llvmDefine() %s", toChars());
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
361 LOG_SCOPE;
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
362
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
363 ClassDeclaration* base = Type::typeinfotypedef;
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
364 DtoForceConstInitDsymbol(base);
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
365
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 98
diff changeset
366 const llvm::StructType* stype = isaStruct(base->type->llvmType->get());
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
367 Logger::cout() << "got stype: " << *stype << '\n';
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
368
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
369 // vtbl
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
370 std::vector<llvm::Constant*> sinits;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 98
diff changeset
371 sinits.push_back(base->llvmVtbl);
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
372
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
373 // monitor
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
374 sinits.push_back(llvm::ConstantPointerNull::get(llvm::PointerType::get(llvm::Type::Int8Ty)));
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
375
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
376 assert(tinfo->ty == Ttypedef);
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
377 TypeTypedef *tc = (TypeTypedef *)tinfo;
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
378 TypedefDeclaration *sd = tc->sym;
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
379
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
380 // TypeInfo base
96
ce7ed8f59b99 [svn r100] Moved test/ray.d to demos/ray.d.
lindquist
parents: 89
diff changeset
381 //const llvm::PointerType* basept = isaPointer(initZ->getOperand(1)->getType());
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
382 //sinits.push_back(llvm::ConstantPointerNull::get(basept));
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
383 Logger::println("generating base typeinfo");
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
384 //sd->basetype = sd->basetype->merge();
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
385
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
386 sd->basetype->getTypeInfo(NULL); // generate vtinfo
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
387 assert(sd->basetype->vtinfo);
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
388 if (!sd->basetype->vtinfo->llvmValue)
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
389 DtoForceDeclareDsymbol(sd->basetype->vtinfo);
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
027b8d8b71ec [svn 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 assert(sd->basetype->vtinfo->llvmValue);
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
392 assert(llvm::isa<llvm::Constant>(sd->basetype->vtinfo->llvmValue));
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
393 llvm::Constant* castbase = llvm::cast<llvm::Constant>(sd->basetype->vtinfo->llvmValue);
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
394 castbase = llvm::ConstantExpr::getBitCast(castbase, stype->getElementType(2));
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
395 sinits.push_back(castbase);
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
396
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
397 // char[] name
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
398 char *name = sd->toPrettyChars();
81
3587401b6eeb [svn r85] Fixed: if a return statement appeared in the try block of a nested try-finally, only the inner-most finally block would be executed.
lindquist
parents: 73
diff changeset
399 sinits.push_back(DtoConstString(name));
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
400 assert(sinits.back()->getType() == stype->getElementType(3));
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
401
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
402 // void[] init
69
2b5a2eaa88be [svn r73] Identity expression for dynamic array and null was broken.
lindquist
parents: 65
diff changeset
403 const llvm::PointerType* initpt = llvm::PointerType::get(llvm::Type::Int8Ty);
2b5a2eaa88be [svn r73] Identity expression for dynamic array and null was broken.
lindquist
parents: 65
diff changeset
404 if (tinfo->isZeroInit() || !sd->init) // 0 initializer, or the same as the base type
2b5a2eaa88be [svn r73] Identity expression for dynamic array and null was broken.
lindquist
parents: 65
diff changeset
405 {
81
3587401b6eeb [svn r85] Fixed: if a return statement appeared in the try block of a nested try-finally, only the inner-most finally block would be executed.
lindquist
parents: 73
diff changeset
406 sinits.push_back(DtoConstSlice(DtoConstSize_t(0), llvm::ConstantPointerNull::get(initpt)));
69
2b5a2eaa88be [svn r73] Identity expression for dynamic array and null was broken.
lindquist
parents: 65
diff changeset
407 }
2b5a2eaa88be [svn r73] Identity expression for dynamic array and null was broken.
lindquist
parents: 65
diff changeset
408 else
2b5a2eaa88be [svn r73] Identity expression for dynamic array and null was broken.
lindquist
parents: 65
diff changeset
409 {
81
3587401b6eeb [svn r85] Fixed: if a return statement appeared in the try block of a nested try-finally, only the inner-most finally block would be executed.
lindquist
parents: 73
diff changeset
410 llvm::Constant* ci = DtoConstInitializer(sd->basetype, sd->init);
69
2b5a2eaa88be [svn r73] Identity expression for dynamic array and null was broken.
lindquist
parents: 65
diff changeset
411 std::string ciname(sd->mangle());
2b5a2eaa88be [svn r73] Identity expression for dynamic array and null was broken.
lindquist
parents: 65
diff changeset
412 ciname.append("__init");
81
3587401b6eeb [svn r85] Fixed: if a return statement appeared in the try block of a nested try-finally, only the inner-most finally block would be executed.
lindquist
parents: 73
diff changeset
413 llvm::GlobalVariable* civar = new llvm::GlobalVariable(DtoType(sd->basetype),true,llvm::GlobalValue::InternalLinkage,ci,ciname,gIR->module);
69
2b5a2eaa88be [svn r73] Identity expression for dynamic array and null was broken.
lindquist
parents: 65
diff changeset
414 llvm::Constant* cicast = llvm::ConstantExpr::getBitCast(civar, initpt);
81
3587401b6eeb [svn r85] Fixed: if a return statement appeared in the try block of a nested try-finally, only the inner-most finally block would be executed.
lindquist
parents: 73
diff changeset
415 size_t cisize = gTargetData->getTypeSize(DtoType(sd->basetype));
3587401b6eeb [svn r85] Fixed: if a return statement appeared in the try block of a nested try-finally, only the inner-most finally block would be executed.
lindquist
parents: 73
diff changeset
416 sinits.push_back(DtoConstSlice(DtoConstSize_t(cisize), cicast));
69
2b5a2eaa88be [svn r73] Identity expression for dynamic array and null was broken.
lindquist
parents: 65
diff changeset
417 }
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
418
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
419 // create the symbol
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
420 llvm::Constant* tiInit = llvm::ConstantStruct::get(stype, sinits);
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
421 isaGlobalVar(llvmValue)->setInitializer(tiInit);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
422 }
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
423
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
424 void TypeInfoTypedefDeclaration::toDt(dt_t **pdt)
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
425 {
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
426 assert(0);
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
427 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
428
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
429 /* ========================================================================= */
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
430
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
431 void TypeInfoEnumDeclaration::llvmDeclare()
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
432 {
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
433 Logger::println("TypeInfoEnumDeclaration::llvmDeclare() %s", toChars());
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
434 LOG_SCOPE;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
435
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
436 ClassDeclaration* base = Type::typeinfoenum;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
437 DtoResolveClass(base);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
438
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
439 const llvm::StructType* stype = isaStruct(base->type->llvmType->get());
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
440
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
441 // create the symbol
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
442 llvmValue = new llvm::GlobalVariable(stype,true,llvm::GlobalValue::WeakLinkage,NULL,toChars(),gIR->module);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
443 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
444
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
445 void TypeInfoEnumDeclaration::llvmDefine()
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
446 {
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
447 Logger::println("TypeInfoEnumDeclaration::llvmDefine() %s", toChars());
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
448 LOG_SCOPE;
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
449
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
450 ClassDeclaration* base = Type::typeinfoenum;
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
451 DtoForceConstInitDsymbol(base);
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
452
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 98
diff changeset
453 const llvm::StructType* stype = isaStruct(base->type->llvmType->get());
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
454
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
455 // vtbl
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
456 std::vector<llvm::Constant*> sinits;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 98
diff changeset
457 sinits.push_back(base->llvmVtbl);
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
458
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
459 // monitor
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
460 sinits.push_back(llvm::ConstantPointerNull::get(llvm::PointerType::get(llvm::Type::Int8Ty)));
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
461
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
462 assert(tinfo->ty == Tenum);
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
463 TypeEnum *tc = (TypeEnum *)tinfo;
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
464 EnumDeclaration *sd = tc->sym;
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
465
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
466 // TypeInfo base
96
ce7ed8f59b99 [svn r100] Moved test/ray.d to demos/ray.d.
lindquist
parents: 89
diff changeset
467 //const llvm::PointerType* basept = isaPointer(initZ->getOperand(1)->getType());
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
468 //sinits.push_back(llvm::ConstantPointerNull::get(basept));
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
469 Logger::println("generating base typeinfo");
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
470 //sd->basetype = sd->basetype->merge();
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
471
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
472 sd->memtype->getTypeInfo(NULL); // generate vtinfo
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
473 assert(sd->memtype->vtinfo);
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
474 if (!sd->memtype->vtinfo->llvmValue)
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
475 DtoForceDeclareDsymbol(sd->memtype->vtinfo);
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
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
477 assert(llvm::isa<llvm::Constant>(sd->memtype->vtinfo->llvmValue));
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
478 llvm::Constant* castbase = llvm::cast<llvm::Constant>(sd->memtype->vtinfo->llvmValue);
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
479 castbase = llvm::ConstantExpr::getBitCast(castbase, stype->getElementType(2));
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
480 sinits.push_back(castbase);
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
481
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
482 // char[] name
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
483 char *name = sd->toPrettyChars();
81
3587401b6eeb [svn r85] Fixed: if a return statement appeared in the try block of a nested try-finally, only the inner-most finally block would be executed.
lindquist
parents: 73
diff changeset
484 sinits.push_back(DtoConstString(name));
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
485 assert(sinits.back()->getType() == stype->getElementType(3));
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
486
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
487 // void[] init
71
53d3086b5ad3 [svn r75] Fixed the init member in custom enum typeinfo. I don't see any way this could actually need emmision though :/
lindquist
parents: 69
diff changeset
488 const llvm::PointerType* initpt = llvm::PointerType::get(llvm::Type::Int8Ty);
53d3086b5ad3 [svn r75] Fixed the init member in custom enum typeinfo. I don't see any way this could actually need emmision though :/
lindquist
parents: 69
diff changeset
489 if (tinfo->isZeroInit() || !sd->defaultval) // 0 initializer, or the same as the base type
53d3086b5ad3 [svn r75] Fixed the init member in custom enum typeinfo. I don't see any way this could actually need emmision though :/
lindquist
parents: 69
diff changeset
490 {
81
3587401b6eeb [svn r85] Fixed: if a return statement appeared in the try block of a nested try-finally, only the inner-most finally block would be executed.
lindquist
parents: 73
diff changeset
491 sinits.push_back(DtoConstSlice(DtoConstSize_t(0), llvm::ConstantPointerNull::get(initpt)));
71
53d3086b5ad3 [svn r75] Fixed the init member in custom enum typeinfo. I don't see any way this could actually need emmision though :/
lindquist
parents: 69
diff changeset
492 }
53d3086b5ad3 [svn r75] Fixed the init member in custom enum typeinfo. I don't see any way this could actually need emmision though :/
lindquist
parents: 69
diff changeset
493 else
53d3086b5ad3 [svn r75] Fixed the init member in custom enum typeinfo. I don't see any way this could actually need emmision though :/
lindquist
parents: 69
diff changeset
494 {
81
3587401b6eeb [svn r85] Fixed: if a return statement appeared in the try block of a nested try-finally, only the inner-most finally block would be executed.
lindquist
parents: 73
diff changeset
495 const llvm::Type* memty = DtoType(sd->memtype);
71
53d3086b5ad3 [svn r75] Fixed the init member in custom enum typeinfo. I don't see any way this could actually need emmision though :/
lindquist
parents: 69
diff changeset
496 llvm::Constant* ci = llvm::ConstantInt::get(memty, sd->defaultval, !sd->memtype->isunsigned());
53d3086b5ad3 [svn r75] Fixed the init member in custom enum typeinfo. I don't see any way this could actually need emmision though :/
lindquist
parents: 69
diff changeset
497 std::string ciname(sd->mangle());
53d3086b5ad3 [svn r75] Fixed the init member in custom enum typeinfo. I don't see any way this could actually need emmision though :/
lindquist
parents: 69
diff changeset
498 ciname.append("__init");
53d3086b5ad3 [svn r75] Fixed the init member in custom enum typeinfo. I don't see any way this could actually need emmision though :/
lindquist
parents: 69
diff changeset
499 llvm::GlobalVariable* civar = new llvm::GlobalVariable(memty,true,llvm::GlobalValue::InternalLinkage,ci,ciname,gIR->module);
53d3086b5ad3 [svn r75] Fixed the init member in custom enum typeinfo. I don't see any way this could actually need emmision though :/
lindquist
parents: 69
diff changeset
500 llvm::Constant* cicast = llvm::ConstantExpr::getBitCast(civar, initpt);
53d3086b5ad3 [svn r75] Fixed the init member in custom enum typeinfo. I don't see any way this could actually need emmision though :/
lindquist
parents: 69
diff changeset
501 size_t cisize = gTargetData->getTypeSize(memty);
81
3587401b6eeb [svn r85] Fixed: if a return statement appeared in the try block of a nested try-finally, only the inner-most finally block would be executed.
lindquist
parents: 73
diff changeset
502 sinits.push_back(DtoConstSlice(DtoConstSize_t(cisize), cicast));
71
53d3086b5ad3 [svn r75] Fixed the init member in custom enum typeinfo. I don't see any way this could actually need emmision though :/
lindquist
parents: 69
diff changeset
503 }
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
504
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
505 // create the symbol
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
506 llvm::Constant* tiInit = llvm::ConstantStruct::get(stype, sinits);
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
507 isaGlobalVar(llvmValue)->setInitializer(tiInit);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
508 }
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
509
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
510 void TypeInfoEnumDeclaration::toDt(dt_t **pdt)
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
511 {
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
512 assert(0);
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
513 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
514
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
515 /* ========================================================================= */
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
516
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
517 static llvm::Constant* LLVM_D_Declare_TypeInfoBase(TypeInfoDeclaration* tid, ClassDeclaration* cd)
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
518 {
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
519 ClassDeclaration* base = cd;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
520 DtoResolveClass(base);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
521
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
522 const llvm::StructType* stype = isaStruct(base->type->llvmType->get());
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
523
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
524 // create the symbol
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
525 tid->llvmValue = new llvm::GlobalVariable(stype,true,llvm::GlobalValue::WeakLinkage,NULL,tid->toChars(),gIR->module);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
526 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
527
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
528 static llvm::Constant* LLVM_D_Define_TypeInfoBase(Type* basetype, TypeInfoDeclaration* tid, ClassDeclaration* cd)
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
529 {
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
530 ClassDeclaration* base = cd;
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
531 DtoForceConstInitDsymbol(base);
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
532
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 98
diff changeset
533 const llvm::StructType* stype = isaStruct(base->type->llvmType->get());
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
534
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
535 // vtbl
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
536 std::vector<llvm::Constant*> sinits;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 98
diff changeset
537 sinits.push_back(base->llvmVtbl);
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
538
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
539 // monitor
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
540 sinits.push_back(llvm::ConstantPointerNull::get(llvm::PointerType::get(llvm::Type::Int8Ty)));
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
541
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
542 // TypeInfo base
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
543 Logger::println("generating base typeinfo");
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
544 basetype->getTypeInfo(NULL);
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
545 assert(basetype->vtinfo);
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
546 if (!basetype->vtinfo->llvmValue)
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
547 DtoForceDeclareDsymbol(basetype->vtinfo);
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
548 assert(llvm::isa<llvm::Constant>(basetype->vtinfo->llvmValue));
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
549 llvm::Constant* castbase = llvm::cast<llvm::Constant>(basetype->vtinfo->llvmValue);
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
550 castbase = llvm::ConstantExpr::getBitCast(castbase, stype->getElementType(2));
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
551 sinits.push_back(castbase);
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
552
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
553 // create the symbol
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
554 llvm::Constant* tiInit = llvm::ConstantStruct::get(stype, sinits);
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
555 isaGlobalVar(tid->llvmValue)->setInitializer(tiInit);
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
556 }
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
557
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
558 /* ========================================================================= */
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
559
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
560 void TypeInfoPointerDeclaration::llvmDeclare()
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
561 {
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
562 Logger::println("TypeInfoPointerDeclaration::llvmDeclare() %s", toChars());
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
563 LOG_SCOPE;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
564
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
565 assert(tinfo->ty == Tpointer);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
566 TypePointer *tc = (TypePointer *)tinfo;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
567
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
568 LLVM_D_Declare_TypeInfoBase(this, Type::typeinfopointer);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
569 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
570
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
571 void TypeInfoPointerDeclaration::llvmDefine()
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
572 {
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
573 Logger::println("TypeInfoPointerDeclaration::llvmDefine() %s", toChars());
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
574 LOG_SCOPE;
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
575
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
576 assert(tinfo->ty == Tpointer);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
577 TypePointer *tc = (TypePointer *)tinfo;
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
578
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
579 LLVM_D_Define_TypeInfoBase(tc->next, this, Type::typeinfopointer);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
580 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
581
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
582 void TypeInfoPointerDeclaration::toDt(dt_t **pdt)
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
583 {
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
584 assert(0);
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
585 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
586
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
587 /* ========================================================================= */
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
588
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
589 void TypeInfoArrayDeclaration::llvmDeclare()
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
590 {
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
591 Logger::println("TypeInfoArrayDeclaration::llvmDeclare() %s", toChars());
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
592 LOG_SCOPE;
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
593
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
594 assert(tinfo->ty == Tarray);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
595 TypeDArray *tc = (TypeDArray *)tinfo;
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
596
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
597 LLVM_D_Declare_TypeInfoBase(this, Type::typeinfoarray);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
598 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
599
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
600 void TypeInfoArrayDeclaration::llvmDefine()
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
601 {
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
602 Logger::println("TypeInfoArrayDeclaration::llvmDefine() %s", toChars());
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
603 LOG_SCOPE;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
604
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
605 assert(tinfo->ty == Tarray);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
606 TypeDArray *tc = (TypeDArray *)tinfo;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
607
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
608 LLVM_D_Define_TypeInfoBase(tc->next, this, Type::typeinfoarray);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
609 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
610
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
611 void TypeInfoArrayDeclaration::toDt(dt_t **pdt)
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
612 {
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
613 assert(0);
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
614 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
615
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
616 /* ========================================================================= */
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
617
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
618 void TypeInfoStaticArrayDeclaration::llvmDeclare()
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
619 {
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
620 Logger::println("TypeInfoStaticArrayDeclaration::toDt() %s", toChars());
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
621 LOG_SCOPE;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
622
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
623 // init typeinfo class
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
624 ClassDeclaration* base = Type::typeinfostaticarray;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
625 DtoResolveClass(base);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
626
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
627 // get type of typeinfo class
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
628 const llvm::StructType* stype = isaStruct(base->type->llvmType->get());
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
629
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
630 // create the symbol
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
631 llvmValue = new llvm::GlobalVariable(stype,true,llvm::GlobalValue::WeakLinkage,NULL,toChars(),gIR->module);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
632 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
633
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
634 void TypeInfoStaticArrayDeclaration::llvmDefine()
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
635 {
105
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
636 Logger::println("TypeInfoStaticArrayDeclaration::toDt() %s", toChars());
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
637 LOG_SCOPE;
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
638
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
639 // init typeinfo class
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
640 ClassDeclaration* base = Type::typeinfostaticarray;
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
641 DtoForceConstInitDsymbol(base);
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
642
105
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
643 // get type of typeinfo class
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
644 const llvm::StructType* stype = isaStruct(base->type->llvmType->get());
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
645
105
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
646 // initializer vector
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
647 std::vector<llvm::Constant*> sinits;
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
648 // first is always the vtable
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
649 sinits.push_back(base->llvmVtbl);
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
650
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
651 // monitor
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
652 sinits.push_back(llvm::ConstantPointerNull::get(llvm::PointerType::get(llvm::Type::Int8Ty)));
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
653
105
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
654 // value typeinfo
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
655 assert(tinfo->ty == Tsarray);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
656 TypeSArray *tc = (TypeSArray *)tinfo;
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
657 tc->next->getTypeInfo(NULL);
105
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
658
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
659 // get symbol
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
660 assert(tc->next->vtinfo);
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
661 DtoForceDeclareDsymbol(tc->next->vtinfo);
105
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
662 llvm::Constant* castbase = isaConstant(tc->next->vtinfo->llvmValue);
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
663 castbase = llvm::ConstantExpr::getBitCast(castbase, stype->getElementType(2));
105
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
664 sinits.push_back(castbase);
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
665
105
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
666 // length
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
667 sinits.push_back(DtoConstSize_t(tc->dim->toInteger()));
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
668
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
669 // create the symbol
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
670 llvm::Constant* tiInit = llvm::ConstantStruct::get(stype, sinits);
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
671 isaGlobalVar(llvmValue)->setInitializer(tiInit);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
672 }
105
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
673
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
674 void TypeInfoStaticArrayDeclaration::toDt(dt_t **pdt)
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
675 {
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
676 assert(0);
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
677 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
678
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
679 /* ========================================================================= */
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
680
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
681 void TypeInfoAssociativeArrayDeclaration::llvmDeclare()
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
682 {
109
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
683 Logger::println("TypeInfoAssociativeArrayDeclaration::toDt() %s", toChars());
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
684 LOG_SCOPE;
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
685
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
686 // init typeinfo class
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
687 ClassDeclaration* base = Type::typeinfoassociativearray;
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
688 DtoResolveClass(base);
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
689
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
690 // get type of typeinfo class
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
691 const llvm::StructType* stype = isaStruct(base->type->llvmType->get());
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
692
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
693 // create the symbol
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
694 llvmValue = new llvm::GlobalVariable(stype,true,llvm::GlobalValue::WeakLinkage,NULL,toChars(),gIR->module);
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
695 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
696
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
697 void TypeInfoAssociativeArrayDeclaration::llvmDefine()
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
698 {
109
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
699 Logger::println("TypeInfoAssociativeArrayDeclaration::toDt() %s", toChars());
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
700 LOG_SCOPE;
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
701
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
702 // init typeinfo class
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
703 ClassDeclaration* base = Type::typeinfoassociativearray;
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
704 DtoForceConstInitDsymbol(base);
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
705
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
706 // get type of typeinfo class
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
707 const llvm::StructType* stype = isaStruct(base->type->llvmType->get());
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
708
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
709 // initializer vector
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
710 std::vector<llvm::Constant*> sinits;
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
711 // first is always the vtable
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
712 sinits.push_back(base->llvmVtbl);
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
713
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
714 // monitor
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
715 sinits.push_back(llvm::ConstantPointerNull::get(llvm::PointerType::get(llvm::Type::Int8Ty)));
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
716
109
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
717 // get type
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
718 assert(tinfo->ty == Taarray);
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
719 TypeAArray *tc = (TypeAArray *)tinfo;
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
720
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
721 // value typeinfo
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
722 tc->next->getTypeInfo(NULL);
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
723
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
724 // get symbol
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
725 assert(tc->next->vtinfo);
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
726 DtoForceDeclareDsymbol(tc->next->vtinfo);
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
727 llvm::Constant* castbase = isaConstant(tc->next->vtinfo->llvmValue);
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
728 castbase = llvm::ConstantExpr::getBitCast(castbase, stype->getElementType(2));
109
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
729 sinits.push_back(castbase);
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
730
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
731 // key typeinfo
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
732 tc->index->getTypeInfo(NULL);
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
733
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
734 // get symbol
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
735 assert(tc->index->vtinfo);
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
736 DtoForceDeclareDsymbol(tc->index->vtinfo);
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
737 castbase = isaConstant(tc->index->vtinfo->llvmValue);
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
738 castbase = llvm::ConstantExpr::getBitCast(castbase, stype->getElementType(3));
109
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
739 sinits.push_back(castbase);
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
740
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
741 // create the symbol
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
742 llvm::Constant* tiInit = llvm::ConstantStruct::get(stype, sinits);
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
743 isaGlobalVar(llvmValue)->setInitializer(tiInit);
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
744 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
745
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
746 void TypeInfoAssociativeArrayDeclaration::toDt(dt_t **pdt)
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
747 {
109
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
748 assert(0);
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
749 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
750
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
751 /* ========================================================================= */
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
752
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
753 void TypeInfoFunctionDeclaration::llvmDeclare()
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
754 {
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
755 Logger::println("TypeInfoFunctionDeclaration::toDt() %s", toChars());
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
756 LOG_SCOPE;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
757
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
758 assert(tinfo->ty == Tfunction);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
759 TypeFunction *tc = (TypeFunction *)tinfo;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
760
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
761 LLVM_D_Declare_TypeInfoBase(this, Type::typeinfofunction);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
762 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
763
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
764 void TypeInfoFunctionDeclaration::llvmDefine()
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
765 {
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
766 Logger::println("TypeInfoFunctionDeclaration::toDt() %s", toChars());
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
767 LOG_SCOPE;
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
768
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
769 assert(tinfo->ty == Tfunction);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
770 TypeFunction *tc = (TypeFunction *)tinfo;
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
771
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
772 LLVM_D_Define_TypeInfoBase(tc->next, this, Type::typeinfofunction);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
773 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
774
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
775 void TypeInfoFunctionDeclaration::toDt(dt_t **pdt)
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
776 {
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
777 assert(0);
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
778 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
779
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
780 /* ========================================================================= */
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
781
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
782 void TypeInfoDelegateDeclaration::llvmDeclare()
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
783 {
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
784 Logger::println("TypeInfoDelegateDeclaration::toDt() %s", toChars());
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
785 LOG_SCOPE;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
786
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
787 assert(tinfo->ty == Tdelegate);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
788 TypeDelegate *tc = (TypeDelegate *)tinfo;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
789
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
790 LLVM_D_Declare_TypeInfoBase(this, Type::typeinfodelegate);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
791 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
792
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
793 void TypeInfoDelegateDeclaration::llvmDefine()
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
794 {
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
795 Logger::println("TypeInfoDelegateDeclaration::toDt() %s", toChars());
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
796 LOG_SCOPE;
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
797
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
798 assert(tinfo->ty == Tdelegate);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
799 TypeDelegate *tc = (TypeDelegate *)tinfo;
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
800
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
801 LLVM_D_Define_TypeInfoBase(tc->next->next, this, Type::typeinfodelegate);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
802 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
803
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
804 void TypeInfoDelegateDeclaration::toDt(dt_t **pdt)
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
805 {
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
806 assert(0);
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
807 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
808
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
809 /* ========================================================================= */
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
810
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
811 void TypeInfoStructDeclaration::llvmDeclare()
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
812 {
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
813 Logger::println("TypeInfoStructDeclaration::llvmDeclare() %s", toChars());
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
814 LOG_SCOPE;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
815
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
816 assert(tinfo->ty == Tstruct);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
817 TypeStruct *tc = (TypeStruct *)tinfo;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
818 StructDeclaration *sd = tc->sym;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
819 DtoResolveDsymbol(sd);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
820
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
821 ClassDeclaration* base = Type::typeinfostruct;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
822 DtoResolveClass(base);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
823
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
824 const llvm::StructType* stype = isaStruct(((TypeClass*)base->type)->llvmType->get());
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
825
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
826 // create the symbol
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
827 llvmValue = new llvm::GlobalVariable(stype,true,llvm::GlobalValue::WeakLinkage,NULL,toChars(),gIR->module);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
828 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
829
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
830 void TypeInfoStructDeclaration::llvmDefine()
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
831 {
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
832 Logger::println("TypeInfoStructDeclaration::llvmDefine() %s", toChars());
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
833 LOG_SCOPE;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
834
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
835 assert(tinfo->ty == Tstruct);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
836 TypeStruct *tc = (TypeStruct *)tinfo;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
837 StructDeclaration *sd = tc->sym;
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
838 DtoForceConstInitDsymbol(sd);
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
839
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
840 ClassDeclaration* base = Type::typeinfostruct;
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
841 DtoForceConstInitDsymbol(base);
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
842
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 98
diff changeset
843 const llvm::StructType* stype = isaStruct(((TypeClass*)base->type)->llvmType->get());
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
844
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
845 // vtbl
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
846 std::vector<llvm::Constant*> sinits;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
847 sinits.push_back(base->llvmVtbl);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
848
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
849 // monitor
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
850 sinits.push_back(llvm::ConstantPointerNull::get(llvm::PointerType::get(llvm::Type::Int8Ty)));
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
851
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
852 // char[] name
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
853 char *name = sd->toPrettyChars();
81
3587401b6eeb [svn r85] Fixed: if a return statement appeared in the try block of a nested try-finally, only the inner-most finally block would be executed.
lindquist
parents: 73
diff changeset
854 sinits.push_back(DtoConstString(name));
110
e8da7856a260 [svn r114] Implemented the ClassInfo.offTi member.
lindquist
parents: 109
diff changeset
855 //Logger::println("************** A");
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
856 assert(sinits.back()->getType() == stype->getElementType(2));
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
857
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
858 // void[] init
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
859 const llvm::PointerType* initpt = llvm::PointerType::get(llvm::Type::Int8Ty);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
860 if (sd->zeroInit) // 0 initializer, or the same as the base type
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
861 {
81
3587401b6eeb [svn r85] Fixed: if a return statement appeared in the try block of a nested try-finally, only the inner-most finally block would be executed.
lindquist
parents: 73
diff changeset
862 sinits.push_back(DtoConstSlice(DtoConstSize_t(0), llvm::ConstantPointerNull::get(initpt)));
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
863 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
864 else
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
865 {
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 98
diff changeset
866 size_t cisize = gTargetData->getTypeSize(tc->llvmType->get());
121
9c79b61fb638 [svn r125] Renamed/moved a few backend member inside DMD structures for consistency.
lindquist
parents: 115
diff changeset
867 llvm::Constant* cicast = llvm::ConstantExpr::getBitCast(sd->llvmInit, initpt);
81
3587401b6eeb [svn r85] Fixed: if a return statement appeared in the try block of a nested try-finally, only the inner-most finally block would be executed.
lindquist
parents: 73
diff changeset
868 sinits.push_back(DtoConstSlice(DtoConstSize_t(cisize), cicast));
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
869 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
870
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
871 // toX functions ground work
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
872 FuncDeclaration *fd;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
873 FuncDeclaration *fdx;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
874 TypeFunction *tf;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
875 Type *ta;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
876 Dsymbol *s;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
877
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
878 static TypeFunction *tftohash;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
879 static TypeFunction *tftostring;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
880
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
881 if (!tftohash)
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
882 {
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
883 Scope sc;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
884
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
885 tftohash = new TypeFunction(NULL, Type::thash_t, 0, LINKd);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
886 tftohash = (TypeFunction *)tftohash->semantic(0, &sc);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
887
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
888 tftostring = new TypeFunction(NULL, Type::tchar->arrayOf(), 0, LINKd);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
889 tftostring = (TypeFunction *)tftostring->semantic(0, &sc);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
890 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
891
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
892 TypeFunction *tfeqptr;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
893 {
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
894 Scope sc;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
895 Arguments *arguments = new Arguments;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
896 Argument *arg = new Argument(STCin, tc->pointerTo(), NULL, NULL);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
897
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
898 arguments->push(arg);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
899 tfeqptr = new TypeFunction(arguments, Type::tint32, 0, LINKd);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
900 tfeqptr = (TypeFunction *)tfeqptr->semantic(0, &sc);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
901 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
902
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
903 #if 0
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
904 TypeFunction *tfeq;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
905 {
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
906 Scope sc;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
907 Array *arguments = new Array;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
908 Argument *arg = new Argument(In, tc, NULL, NULL);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
909
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
910 arguments->push(arg);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
911 tfeq = new TypeFunction(arguments, Type::tint32, 0, LINKd);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
912 tfeq = (TypeFunction *)tfeq->semantic(0, &sc);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
913 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
914 #endif
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
915
110
e8da7856a260 [svn r114] Implemented the ClassInfo.offTi member.
lindquist
parents: 109
diff changeset
916 //Logger::println("************** B");
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
917 const llvm::PointerType* ptty = isaPointer(stype->getElementType(4));
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
918 assert(ptty);
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
919
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
920 s = search_function(sd, Id::tohash);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
921 fdx = s ? s->isFuncDeclaration() : NULL;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
922 if (fdx)
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
923 {
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
924 fd = fdx->overloadExactMatch(tftohash);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
925 if (fd) {
132
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
926 DtoForceDeclareDsymbol(fd);
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
927 assert(fd->llvmValue != 0);
132
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
928 llvm::Constant* c = isaConstant(fd->llvmValue);
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
929 assert(c);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
930 c = llvm::ConstantExpr::getBitCast(c, ptty);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
931 sinits.push_back(c);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
932 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
933 else {
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
934 //fdx->error("must be declared as extern (D) uint toHash()");
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
935 sinits.push_back(llvm::ConstantPointerNull::get(ptty));
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
936 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
937 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
938 else {
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
939 sinits.push_back(llvm::ConstantPointerNull::get(ptty));
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
940 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
941
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
942 s = search_function(sd, Id::eq);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
943 fdx = s ? s->isFuncDeclaration() : NULL;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
944 for (int i = 0; i < 2; i++)
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
945 {
110
e8da7856a260 [svn r114] Implemented the ClassInfo.offTi member.
lindquist
parents: 109
diff changeset
946 //Logger::println("************** C %d", i);
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
947 ptty = isaPointer(stype->getElementType(5+i));
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
948 if (fdx)
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
949 {
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
950 fd = fdx->overloadExactMatch(tfeqptr);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
951 if (fd) {
132
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
952 DtoForceDeclareDsymbol(fd);
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
953 assert(fd->llvmValue != 0);
132
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
954 llvm::Constant* c = isaConstant(fd->llvmValue);
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
955 assert(c);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
956 c = llvm::ConstantExpr::getBitCast(c, ptty);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
957 sinits.push_back(c);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
958 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
959 else {
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
960 //fdx->error("must be declared as extern (D) int %s(%s*)", fdx->toChars(), sd->toChars());
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
961 sinits.push_back(llvm::ConstantPointerNull::get(ptty));
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
962 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
963 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
964 else {
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
965 sinits.push_back(llvm::ConstantPointerNull::get(ptty));
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
966 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
967
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
968 s = search_function(sd, Id::cmp);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
969 fdx = s ? s->isFuncDeclaration() : NULL;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
970 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
971
110
e8da7856a260 [svn r114] Implemented the ClassInfo.offTi member.
lindquist
parents: 109
diff changeset
972 //Logger::println("************** D");
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
973 ptty = isaPointer(stype->getElementType(7));
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
974 s = search_function(sd, Id::tostring);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
975 fdx = s ? s->isFuncDeclaration() : NULL;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
976 if (fdx)
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
977 {
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
978 fd = fdx->overloadExactMatch(tftostring);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
979 if (fd) {
132
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
980 DtoForceDeclareDsymbol(fd);
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
981 assert(fd->llvmValue != 0);
132
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
982 llvm::Constant* c = isaConstant(fd->llvmValue);
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
983 assert(c);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
984 c = llvm::ConstantExpr::getBitCast(c, ptty);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
985 sinits.push_back(c);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
986 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
987 else {
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
988 //fdx->error("must be declared as extern (D) char[] toString()");
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
989 sinits.push_back(llvm::ConstantPointerNull::get(ptty));
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
990 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
991 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
992 else {
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
993 sinits.push_back(llvm::ConstantPointerNull::get(ptty));
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
994 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
995
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
996 // uint m_flags;
81
3587401b6eeb [svn r85] Fixed: if a return statement appeared in the try block of a nested try-finally, only the inner-most finally block would be executed.
lindquist
parents: 73
diff changeset
997 sinits.push_back(DtoConstUint(tc->hasPointers()));
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
998
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
999 // create the symbol
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
1000 llvm::Constant* tiInit = llvm::ConstantStruct::get(stype, sinits);
73
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
1001 llvm::GlobalVariable* gvar = new llvm::GlobalVariable(stype,true,llvm::GlobalValue::WeakLinkage,tiInit,toChars(),gIR->module);
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
1002
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1003 isaGlobalVar(llvmValue)->setInitializer(tiInit);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1004 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1005
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1006 void TypeInfoStructDeclaration::toDt(dt_t **pdt)
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1007 {
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1008 assert(0);
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
1009 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
1010
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
1011 /* ========================================================================= */
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
1012
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1013 void TypeInfoClassDeclaration::llvmDeclare()
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1014 {
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1015 Logger::println("TypeInfoClassDeclaration::llvmDeclare() %s", toChars());
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1016 LOG_SCOPE;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1017
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1018 // init typeinfo class
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1019 ClassDeclaration* base = Type::typeinfoclass;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1020 assert(base);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1021 DtoResolveClass(base);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1022
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1023 // get type of typeinfo class
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1024 const llvm::StructType* stype = isaStruct(base->type->llvmType->get());
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1025
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1026 // create the symbol
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1027 llvmValue = new llvm::GlobalVariable(stype,true,llvm::GlobalValue::WeakLinkage,NULL,toChars(),gIR->module);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1028 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1029
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1030 void TypeInfoClassDeclaration::llvmDefine()
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1031 {
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1032 Logger::println("TypeInfoClassDeclaration::llvmDefine() %s", toChars());
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1033 LOG_SCOPE;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1034
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1035 // init typeinfo class
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1036 ClassDeclaration* base = Type::typeinfoclass;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1037 assert(base);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1038 DtoForceConstInitDsymbol(base);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1039
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1040 // get type of typeinfo class
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1041 const llvm::StructType* stype = isaStruct(base->type->llvmType->get());
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1042
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1043 // initializer vector
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1044 std::vector<llvm::Constant*> sinits;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1045 // first is always the vtable
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1046 sinits.push_back(base->llvmVtbl);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1047
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
1048 // monitor
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
1049 sinits.push_back(llvm::ConstantPointerNull::get(llvm::PointerType::get(llvm::Type::Int8Ty)));
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
1050
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1051 // get classinfo
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1052 assert(tinfo->ty == Tclass);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1053 TypeClass *tc = (TypeClass *)tinfo;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1054 assert(tc->sym->llvmClass);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1055 sinits.push_back(tc->sym->llvmClass);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1056
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1057 // create the symbol
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1058 llvm::Constant* tiInit = llvm::ConstantStruct::get(stype, sinits);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1059 isaGlobalVar(llvmValue)->setInitializer(tiInit);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1060 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1061
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
1062 void TypeInfoClassDeclaration::toDt(dt_t **pdt)
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
1063 {
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1064 assert(0);
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
1065 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
1066
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
1067 /* ========================================================================= */
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
1068
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1069 void TypeInfoInterfaceDeclaration::llvmDeclare()
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1070 {
113
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1071 Logger::println("TypeInfoInterfaceDeclaration::llvmDeclare() %s", toChars());
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1072 LOG_SCOPE;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1073
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1074 // init typeinfo class
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1075 ClassDeclaration* base = Type::typeinfointerface;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1076 assert(base);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1077 DtoResolveClass(base);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1078
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1079 // get type of typeinfo class
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1080 const llvm::StructType* stype = isaStruct(base->type->llvmType->get());
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1081
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1082 // create the symbol
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1083 llvmValue = new llvm::GlobalVariable(stype,true,llvm::GlobalValue::WeakLinkage,NULL,toChars(),gIR->module);
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1084 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1085
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1086 void TypeInfoInterfaceDeclaration::llvmDefine()
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1087 {
113
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1088 Logger::println("TypeInfoInterfaceDeclaration::llvmDefine() %s", toChars());
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1089 LOG_SCOPE;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1090
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1091 // init typeinfo class
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1092 ClassDeclaration* base = Type::typeinfointerface;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1093 assert(base);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1094 DtoForceConstInitDsymbol(base);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1095
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1096 // get type of typeinfo class
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1097 const llvm::StructType* stype = isaStruct(base->type->llvmType->get());
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1098
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1099 // initializer vector
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1100 std::vector<llvm::Constant*> sinits;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1101 // first is always the vtable
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1102 sinits.push_back(base->llvmVtbl);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1103
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
1104 // monitor
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
1105 sinits.push_back(llvm::ConstantPointerNull::get(llvm::PointerType::get(llvm::Type::Int8Ty)));
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
1106
113
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1107 // get classinfo
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1108 assert(tinfo->ty == Tclass);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1109 TypeClass *tc = (TypeClass *)tinfo;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1110 assert(tc->sym->llvmClass);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1111 sinits.push_back(tc->sym->llvmClass);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1112
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1113 // create the symbol
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1114 llvm::Constant* tiInit = llvm::ConstantStruct::get(stype, sinits);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1115 isaGlobalVar(llvmValue)->setInitializer(tiInit);
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1116 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1117
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
1118 void TypeInfoInterfaceDeclaration::toDt(dt_t **pdt)
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
1119 {
113
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1120 assert(0);
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
1121 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
1122
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
1123 /* ========================================================================= */
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
1124
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1125 void TypeInfoTupleDeclaration::llvmDeclare()
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1126 {
113
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1127 Logger::println("TypeInfoTupleDeclaration::llvmDeclare() %s", toChars());
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1128 LOG_SCOPE;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1129
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1130 // init typeinfo class
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1131 ClassDeclaration* base = Type::typeinfotypelist;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1132 assert(base);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1133 DtoResolveClass(base);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1134
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1135 // get type of typeinfo class
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1136 const llvm::StructType* stype = isaStruct(base->type->llvmType->get());
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1137
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1138 // create the symbol
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1139 llvmValue = new llvm::GlobalVariable(stype,true,llvm::GlobalValue::WeakLinkage,NULL,toChars(),gIR->module);
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1140 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1141
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1142 void TypeInfoTupleDeclaration::llvmDefine()
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1143 {
113
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1144 Logger::println("TypeInfoTupleDeclaration::llvmDefine() %s", toChars());
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1145 LOG_SCOPE;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1146
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1147 // init typeinfo class
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1148 ClassDeclaration* base = Type::typeinfotypelist;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1149 assert(base);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1150 DtoForceConstInitDsymbol(base);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1151
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1152 // get type of typeinfo class
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1153 const llvm::StructType* stype = isaStruct(base->type->llvmType->get());
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1154
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1155 // initializer vector
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1156 std::vector<llvm::Constant*> sinits;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1157 // first is always the vtable
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1158 sinits.push_back(base->llvmVtbl);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1159
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
1160 // monitor
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
1161 sinits.push_back(llvm::ConstantPointerNull::get(llvm::PointerType::get(llvm::Type::Int8Ty)));
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
1162
113
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1163 // create elements array
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1164 assert(tinfo->ty == Ttuple);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1165 TypeTuple *tu = (TypeTuple *)tinfo;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1166
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1167 size_t dim = tu->arguments->dim;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1168 std::vector<llvm::Constant*> arrInits;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1169
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1170 const llvm::Type* tiTy = Type::typeinfo->type->llvmType->get();
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1171 tiTy = llvm::PointerType::get(tiTy);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1172
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1173 for (size_t i = 0; i < dim; i++)
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1174 {
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1175 Argument *arg = (Argument *)tu->arguments->data[i];
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1176 arg->type->getTypeInfo(NULL);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1177 DtoForceDeclareDsymbol(arg->type->vtinfo);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1178 assert(arg->type->vtinfo->llvmValue);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1179 llvm::Constant* c = isaConstant(arg->type->vtinfo->llvmValue);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1180 c = llvm::ConstantExpr::getBitCast(c, tiTy);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1181 arrInits.push_back(c);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1182 }
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1183
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1184 // build array type
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1185 const llvm::ArrayType* arrTy = llvm::ArrayType::get(tiTy, dim);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1186 llvm::Constant* arrC = llvm::ConstantArray::get(arrTy, arrInits);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1187
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1188 // build the slice
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1189 llvm::Constant* slice = DtoConstSlice(DtoConstSize_t(dim), arrC);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1190 sinits.push_back(slice);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1191
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1192 // create the symbol
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1193 llvm::Constant* tiInit = llvm::ConstantStruct::get(stype, sinits);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1194 isaGlobalVar(llvmValue)->setInitializer(tiInit);
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1195 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1196
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
1197 void TypeInfoTupleDeclaration::toDt(dt_t **pdt)
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
1198 {
113
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1199 assert(0);
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
1200 }