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

[svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up. Basically it tries to do the following in order: Resolve types, Declare symbols, Create constant initializers, Apply initializers, Generate functions bodies. ClassInfo is now has the most useful(biased?) members working. Probably other stuf...
author lindquist
date Sun, 18 Nov 2007 06:52:57 +0100
parents 5071469303d4
children 182b41f56b7f
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"
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
40
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 * 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
43 * runtime library routines. Canonicalized in that static arrays are
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
44 * represented as dynamic arrays, enums are represented by their
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
45 * 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
46 * so we can use the custom internal ones more.
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
47 */
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 Expression *Type::getInternalTypeInfo(Scope *sc)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
50 { TypeInfoDeclaration *tid;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
51 Expression *e;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
52 Type *t;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
53 static TypeInfoDeclaration *internalTI[TMAX];
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
54
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
55 //printf("Type::getInternalTypeInfo() %s\n", toChars());
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
56 t = toBasetype();
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
57 switch (t->ty)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
58 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
59 case Tsarray:
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
60 t = t->next->arrayOf(); // convert to corresponding dynamic array type
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
61 break;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
62
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
63 case Tclass:
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
64 if (((TypeClass *)t)->sym->isInterfaceDeclaration())
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
65 break;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
66 goto Linternal;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
67
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
68 case Tarray:
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
69 if (t->next->ty != Tclass)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
70 break;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
71 goto Linternal;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
72
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
73 case Tfunction:
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
74 case Tdelegate:
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
75 case Tpointer:
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
76 Linternal:
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
77 tid = internalTI[t->ty];
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
78 if (!tid)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
79 { tid = new TypeInfoDeclaration(t, 1);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
80 internalTI[t->ty] = tid;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
81 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
82 e = new VarExp(0, tid);
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
83 //e = e->addressOf(sc);
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
84 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
85 return e;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
86
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
87 default:
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
88 break;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
89 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
90 //printf("\tcalling getTypeInfo() %s\n", t->toChars());
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
91 return t->getTypeInfo(sc);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
92 }
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 * Get the exact TypeInfo.
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
97 */
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 Expression *Type::getTypeInfo(Scope *sc)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
100 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
101 Expression *e;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
102 Type *t;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
103
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
104 //printf("Type::getTypeInfo() %p, %s\n", this, toChars());
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
105 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
106 if (!t->vtinfo)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
107 { t->vtinfo = t->getTypeInfoDeclaration();
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
108 assert(t->vtinfo);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
109
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
110 /* If this has a custom implementation in std/typeinfo, then
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
111 * do not generate a COMDAT for it.
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
112 */
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
113 if (!t->builtinTypeInfo())
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
114 { // Generate COMDAT
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
115 if (sc) // if in semantic() pass
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
116 { // 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
117 Module *m = sc->module->importedFrom;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
118 m->members->push(t->vtinfo);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
119 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
120 else // if in obj generation pass
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
121 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
122 t->vtinfo->toObjFile();
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
123 }
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 e = new VarExp(0, t->vtinfo);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
127 //e = e->addressOf(sc);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
128 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
129 return e;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
130 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
131
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
132 enum RET TypeFunction::retStyle()
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
133 {
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
134 return RETstack;
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
135 }
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
136
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
137 TypeInfoDeclaration *Type::getTypeInfoDeclaration()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
138 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
139 //printf("Type::getTypeInfoDeclaration() %s\n", toChars());
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
140 return new TypeInfoDeclaration(this, 0);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
141 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
142
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
143 TypeInfoDeclaration *TypeTypedef::getTypeInfoDeclaration()
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
144 {
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
145 return new TypeInfoTypedefDeclaration(this);
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
146 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
147
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
148 TypeInfoDeclaration *TypePointer::getTypeInfoDeclaration()
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
149 {
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
150 return new TypeInfoPointerDeclaration(this);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
151 }
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
152
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
153 TypeInfoDeclaration *TypeDArray::getTypeInfoDeclaration()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
154 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
155 return new TypeInfoArrayDeclaration(this);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
156 }
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 TypeInfoDeclaration *TypeSArray::getTypeInfoDeclaration()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
159 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
160 return new TypeInfoStaticArrayDeclaration(this);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
161 }
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 TypeInfoDeclaration *TypeAArray::getTypeInfoDeclaration()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
164 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
165 return new TypeInfoAssociativeArrayDeclaration(this);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
166 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
167
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
168 TypeInfoDeclaration *TypeStruct::getTypeInfoDeclaration()
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
169 {
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
170 return new TypeInfoStructDeclaration(this);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
171 }
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
172
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
173 TypeInfoDeclaration *TypeClass::getTypeInfoDeclaration()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
174 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
175 if (sym->isInterfaceDeclaration())
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
176 return new TypeInfoInterfaceDeclaration(this);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
177 else
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
178 return new TypeInfoClassDeclaration(this);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
179 }
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 TypeInfoDeclaration *TypeEnum::getTypeInfoDeclaration()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
182 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
183 return new TypeInfoEnumDeclaration(this);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
184 }
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 TypeInfoDeclaration *TypeFunction::getTypeInfoDeclaration()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
187 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
188 return new TypeInfoFunctionDeclaration(this);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
189 }
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 TypeInfoDeclaration *TypeDelegate::getTypeInfoDeclaration()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
192 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
193 return new TypeInfoDelegateDeclaration(this);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
194 }
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 TypeInfoDeclaration *TypeTuple::getTypeInfoDeclaration()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
197 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
198 return new TypeInfoTupleDeclaration(this);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
199 }
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 /* 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
205 * because then the compiler doesn't need to build one.
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
206 */
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 int Type::builtinTypeInfo()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
209 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
210 return 0;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
211 }
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 int TypeBasic::builtinTypeInfo()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
214 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
215 return 1;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
216 }
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 int TypeDArray::builtinTypeInfo()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
219 {
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
220 return next->isTypeBasic() != NULL;
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
221 }
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 * Create a static array of TypeInfo references
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
227 * corresponding to an array of Expression's.
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
228 * Used to supply hidden _arguments[] value for variadic D functions.
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
229 */
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
230
57
a9d29e9f1fed [svn r61] Added support for D-style variadic functions :)
lindquist
parents: 54
diff changeset
231 Expression *createTypeInfoArray(Scope *sc, Expression *exps[], int dim)
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
232 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
233 assert(0);
57
a9d29e9f1fed [svn r61] Added support for D-style variadic functions :)
lindquist
parents: 54
diff changeset
234 return NULL;
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
235 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
236
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
237 /* ========================================================================= */
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 // MAGIC PLACE
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
241 //////////////////////////////////////////////////////////////////////////////
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 void TypeInfoDeclaration::toObjFile()
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
244 {
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
245 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
246 }
57
a9d29e9f1fed [svn r61] Added support for D-style variadic functions :)
lindquist
parents: 54
diff changeset
247
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
248 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
249 {
027b8d8b71ec [svn 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 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
251 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
252
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
253 Logger::println("* DtoResolveTypeInfo(%s)", tid->toChars());
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
254 LOG_SCOPE;
65
d4a678905d5e [svn r69] forgot std.stdarg
lindquist
parents: 58
diff changeset
255
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
256 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
257
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
258 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
259 }
98
6789050b5ad1 [svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references.
lindquist
parents: 96
diff changeset
260
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
261 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
262 {
027b8d8b71ec [svn 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 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
264 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
265
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
266 Logger::println("* DtoDeclareTypeInfo(%s)", tid->toChars());
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
267 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
268
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
269 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
270
027b8d8b71ec [svn 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 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
272 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
273
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
274 // 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
275 if (tid->tinfo->builtinTypeInfo()) {
027b8d8b71ec [svn 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 tid->llvmValue = LLVM_D_GetRuntimeGlobal(gIR->module, mangled.c_str());
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
277 assert(tid->llvmValue);
98
6789050b5ad1 [svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references.
lindquist
parents: 96
diff changeset
278 mangled.append("__TYPE");
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
279 gIR->module->addTypeName(mangled, tid->llvmValue->getType()->getContainedType(0));
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
280 Logger::println("Got typeinfo var: %s", tid->llvmValue->getName().c_str());
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
281 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
282 tid->llvmDefined = true;
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
283 }
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
284 // custom typedef
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
285 else {
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
286 gIR->constInitList.push_back(tid);
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
287 }
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
288 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
289
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
290 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
291 {
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
292 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
293 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
294
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
295 Logger::println("* DtoConstInitTypeInfo(%s)", tid->toChars());
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
296 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
297
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
298 tid->toDt(NULL);
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
299
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
300 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
301 //gIR->defineList.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
302 }
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
303
027b8d8b71ec [svn 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 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
305 {
027b8d8b71ec [svn 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 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
307 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
308
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
309 Logger::println("* DtoDefineTypeInfo(%s)", tid->toChars());
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
310 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
311
027b8d8b71ec [svn 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 assert(0);
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
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
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
315 /* ========================================================================= */
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
316
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
317 void TypeInfoDeclaration::toDt(dt_t **pdt)
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
318 {
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
319 assert(0 && "TypeInfoDeclaration");
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
320 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
321
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
322 /* ========================================================================= */
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
323
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
324 void TypeInfoTypedefDeclaration::toDt(dt_t **pdt)
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
325 {
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
326 Logger::println("TypeInfoTypedefDeclaration::toDt() %s", toChars());
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
327 LOG_SCOPE;
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
328
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
329 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
330 DtoForceConstInitDsymbol(base);
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
331
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 98
diff changeset
332 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
333 Logger::cout() << "got stype: " << *stype << '\n';
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
334
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
335 std::vector<llvm::Constant*> sinits;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 98
diff changeset
336 sinits.push_back(base->llvmVtbl);
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
337
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
338 assert(tinfo->ty == Ttypedef);
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
339 TypeTypedef *tc = (TypeTypedef *)tinfo;
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
340 TypedefDeclaration *sd = tc->sym;
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
341
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
342 // TypeInfo base
96
ce7ed8f59b99 [svn r100] Moved test/ray.d to demos/ray.d.
lindquist
parents: 89
diff changeset
343 //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
344 //sinits.push_back(llvm::ConstantPointerNull::get(basept));
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
345 Logger::println("generating base typeinfo");
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
346 //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
347
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
348 sd->basetype->getTypeInfo(NULL); // generate vtinfo
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
349 assert(sd->basetype->vtinfo);
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
350 if (!sd->basetype->vtinfo->llvmValue)
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
351 DtoForceConstInitDsymbol(sd->basetype->vtinfo);
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
352
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
353 assert(sd->basetype->vtinfo->llvmValue);
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
354 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
355 llvm::Constant* castbase = llvm::cast<llvm::Constant>(sd->basetype->vtinfo->llvmValue);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 98
diff changeset
356 castbase = llvm::ConstantExpr::getBitCast(castbase, stype->getElementType(1));
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
357 sinits.push_back(castbase);
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
358
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
359 // char[] name
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
360 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
361 sinits.push_back(DtoConstString(name));
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 98
diff changeset
362 assert(sinits.back()->getType() == stype->getElementType(2));
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
363
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
364 // void[] init
69
2b5a2eaa88be [svn r73] Identity expression for dynamic array and null was broken.
lindquist
parents: 65
diff changeset
365 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
366 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
367 {
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
368 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
369 }
2b5a2eaa88be [svn r73] Identity expression for dynamic array and null was broken.
lindquist
parents: 65
diff changeset
370 else
2b5a2eaa88be [svn r73] Identity expression for dynamic array and null was broken.
lindquist
parents: 65
diff changeset
371 {
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
372 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
373 std::string ciname(sd->mangle());
2b5a2eaa88be [svn r73] Identity expression for dynamic array and null was broken.
lindquist
parents: 65
diff changeset
374 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
375 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
376 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
377 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
378 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
379 }
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
380
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
381 // create the symbol
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
382 llvm::Constant* tiInit = llvm::ConstantStruct::get(stype, sinits);
73
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
383 llvm::GlobalVariable* gvar = new llvm::GlobalVariable(stype,true,llvm::GlobalValue::WeakLinkage,tiInit,toChars(),gIR->module);
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
384
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
385 llvmValue = gvar;
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
386 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
387
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
388 /* ========================================================================= */
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
389
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
390 void TypeInfoEnumDeclaration::toDt(dt_t **pdt)
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
391 {
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
392 Logger::println("TypeInfoTypedefDeclaration::toDt() %s", toChars());
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
393 LOG_SCOPE;
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
394
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
395 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
396 DtoForceConstInitDsymbol(base);
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
397
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 98
diff changeset
398 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
399
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
400 std::vector<llvm::Constant*> sinits;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 98
diff changeset
401 sinits.push_back(base->llvmVtbl);
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
402
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
403 assert(tinfo->ty == Tenum);
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
404 TypeEnum *tc = (TypeEnum *)tinfo;
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
405 EnumDeclaration *sd = tc->sym;
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
406
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
407 // TypeInfo base
96
ce7ed8f59b99 [svn r100] Moved test/ray.d to demos/ray.d.
lindquist
parents: 89
diff changeset
408 //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
409 //sinits.push_back(llvm::ConstantPointerNull::get(basept));
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
410 Logger::println("generating base typeinfo");
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
411 //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
412
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
413 sd->memtype->getTypeInfo(NULL); // generate vtinfo
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
414 assert(sd->memtype->vtinfo);
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
415 if (!sd->memtype->vtinfo->llvmValue)
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
416 DtoForceConstInitDsymbol(sd->memtype->vtinfo);
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
417
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
418 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
419 llvm::Constant* castbase = llvm::cast<llvm::Constant>(sd->memtype->vtinfo->llvmValue);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 98
diff changeset
420 castbase = llvm::ConstantExpr::getBitCast(castbase, stype->getElementType(1));
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
421 sinits.push_back(castbase);
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
422
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
423 // char[] name
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
424 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
425 sinits.push_back(DtoConstString(name));
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 98
diff changeset
426 assert(sinits.back()->getType() == stype->getElementType(2));
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
427
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
428 // 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
429 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
430 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
431 {
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
432 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
433 }
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
434 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
435 {
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
436 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
437 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
438 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
439 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
440 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
441 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
442 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
443 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
444 }
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
445
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
446 // create the symbol
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
447 llvm::Constant* tiInit = llvm::ConstantStruct::get(stype, sinits);
73
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
448 llvm::GlobalVariable* gvar = new llvm::GlobalVariable(stype,true,llvm::GlobalValue::WeakLinkage,tiInit,toChars(),gIR->module);
58
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 llvmValue = gvar;
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
451 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
452
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
453 /* ========================================================================= */
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
454
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
455 static llvm::Constant* LLVM_D_Create_TypeInfoBase(Type* basetype, TypeInfoDeclaration* tid, ClassDeclaration* cd)
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
456 {
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
457 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
458 DtoForceConstInitDsymbol(base);
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
459
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 98
diff changeset
460 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
461
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
462 std::vector<llvm::Constant*> sinits;
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 98
diff changeset
463 sinits.push_back(base->llvmVtbl);
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
464
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
465 // TypeInfo base
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
466 Logger::println("generating base typeinfo");
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
467 basetype->getTypeInfo(NULL);
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
468 assert(basetype->vtinfo);
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
469 if (!basetype->vtinfo->llvmValue)
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
470 DtoForceConstInitDsymbol(basetype->vtinfo);
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
471 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
472 llvm::Constant* castbase = llvm::cast<llvm::Constant>(basetype->vtinfo->llvmValue);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 98
diff changeset
473 castbase = llvm::ConstantExpr::getBitCast(castbase, stype->getElementType(1));
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
474 sinits.push_back(castbase);
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
475
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
476 // create the symbol
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
477 llvm::Constant* tiInit = llvm::ConstantStruct::get(stype, sinits);
73
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
478 llvm::GlobalVariable* gvar = new llvm::GlobalVariable(stype,true,llvm::GlobalValue::WeakLinkage,tiInit,tid->toChars(),gIR->module);
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
479
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
480 tid->llvmValue = gvar;
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
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
483 /* ========================================================================= */
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
484
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
485 void TypeInfoPointerDeclaration::toDt(dt_t **pdt)
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
486 {
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
487 Logger::println("TypeInfoPointerDeclaration::toDt() %s", toChars());
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
488 LOG_SCOPE;
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
489
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
490 assert(tinfo->ty == Tpointer);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
491 TypePointer *tc = (TypePointer *)tinfo;
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
492
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
493 LLVM_D_Create_TypeInfoBase(tc->next, this, Type::typeinfopointer);
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
494 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
495
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
496 /* ========================================================================= */
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
497
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
498 void TypeInfoArrayDeclaration::toDt(dt_t **pdt)
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
499 {
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
500 Logger::println("TypeInfoArrayDeclaration::toDt() %s", toChars());
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
501 LOG_SCOPE;
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
502
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
503 assert(tinfo->ty == Tarray);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
504 TypeDArray *tc = (TypeDArray *)tinfo;
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
505
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
506 LLVM_D_Create_TypeInfoBase(tc->next, this, Type::typeinfoarray);
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
507 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
508
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
509 /* ========================================================================= */
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
510
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
511 void TypeInfoStaticArrayDeclaration::toDt(dt_t **pdt)
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
512 {
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
513 assert(0 && "TypeInfoStaticArrayDeclaration");
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
514
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
515 /*
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
516 //printf("TypeInfoStaticArrayDeclaration::toDt()\n");
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
517 dtxoff(pdt, Type::typeinfostaticarray->toVtblSymbol(), 0, TYnptr); // vtbl for TypeInfo_StaticArray
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
518 dtdword(pdt, 0); // monitor
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
519
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
520 assert(tinfo->ty == Tsarray);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
521
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
522 TypeSArray *tc = (TypeSArray *)tinfo;
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
523
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
524 tc->next->getTypeInfo(NULL);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
525 dtxoff(pdt, tc->next->vtinfo->toSymbol(), 0, TYnptr); // TypeInfo for array of type
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
526
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
527 dtdword(pdt, tc->dim->toInteger()); // length
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
528 */
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
529 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
530
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
531 /* ========================================================================= */
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
532
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
533 void TypeInfoAssociativeArrayDeclaration::toDt(dt_t **pdt)
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
534 {
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
535 assert(0 && "TypeInfoAssociativeArrayDeclaration");
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
536
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
537 /*
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
538 //printf("TypeInfoAssociativeArrayDeclaration::toDt()\n");
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
539 dtxoff(pdt, Type::typeinfoassociativearray->toVtblSymbol(), 0, TYnptr); // vtbl for TypeInfo_AssociativeArray
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
540 dtdword(pdt, 0); // monitor
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
541
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
542 assert(tinfo->ty == Taarray);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
543
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
544 TypeAArray *tc = (TypeAArray *)tinfo;
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
545
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
546 tc->next->getTypeInfo(NULL);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
547 dtxoff(pdt, tc->next->vtinfo->toSymbol(), 0, TYnptr); // TypeInfo for array of type
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
548
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
549 tc->index->getTypeInfo(NULL);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
550 dtxoff(pdt, tc->index->vtinfo->toSymbol(), 0, TYnptr); // TypeInfo for array of type
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
551 */
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
552 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
553
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
554 /* ========================================================================= */
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
555
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
556 void TypeInfoFunctionDeclaration::toDt(dt_t **pdt)
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
557 {
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
558 Logger::println("TypeInfoFunctionDeclaration::toDt() %s", toChars());
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
559 LOG_SCOPE;
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
560
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
561 assert(tinfo->ty == Tfunction);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
562 TypeFunction *tc = (TypeFunction *)tinfo;
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
563
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
564 LLVM_D_Create_TypeInfoBase(tc->next, this, Type::typeinfofunction);
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
565 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
566
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
567 /* ========================================================================= */
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
568
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
569 void TypeInfoDelegateDeclaration::toDt(dt_t **pdt)
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
570 {
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
571 Logger::println("TypeInfoDelegateDeclaration::toDt() %s", toChars());
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
572 LOG_SCOPE;
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
573
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
574 assert(tinfo->ty == Tdelegate);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
575 TypeDelegate *tc = (TypeDelegate *)tinfo;
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
576
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
577 LLVM_D_Create_TypeInfoBase(tc->next->next, this, Type::typeinfodelegate);
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
578 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
579
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
580 /* ========================================================================= */
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
581
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
582 void TypeInfoStructDeclaration::toDt(dt_t **pdt)
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
583 {
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
584 Logger::println("TypeInfoStructDeclaration::toDt() %s", toChars());
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
585 LOG_SCOPE;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
586
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
587 assert(tinfo->ty == Tstruct);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
588 TypeStruct *tc = (TypeStruct *)tinfo;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
589 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
590 DtoForceConstInitDsymbol(sd);
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
591
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
592 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
593 DtoForceConstInitDsymbol(base);
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
594
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 98
diff changeset
595 const llvm::StructType* stype = isaStruct(((TypeClass*)base->type)->llvmType->get());
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
596
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
597 std::vector<llvm::Constant*> sinits;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
598 sinits.push_back(base->llvmVtbl);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
599
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
600 // char[] name
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
601 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
602 sinits.push_back(DtoConstString(name));
73
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
603 Logger::println("************** A");
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
604 assert(sinits.back()->getType() == stype->getElementType(1));
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
605
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
606 // void[] init
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
607 const llvm::PointerType* initpt = llvm::PointerType::get(llvm::Type::Int8Ty);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
608 if (sd->zeroInit) // 0 initializer, or the same as the base type
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
609 {
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
610 sinits.push_back(DtoConstSlice(DtoConstSize_t(0), llvm::ConstantPointerNull::get(initpt)));
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
611 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
612 else
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
613 {
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
614 assert(sd->llvmInitZ);
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 98
diff changeset
615 size_t cisize = gTargetData->getTypeSize(tc->llvmType->get());
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
616 llvm::Constant* cicast = llvm::ConstantExpr::getBitCast(tc->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
617 sinits.push_back(DtoConstSlice(DtoConstSize_t(cisize), cicast));
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
618 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
619
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
620 // toX functions ground work
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
621 FuncDeclaration *fd;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
622 FuncDeclaration *fdx;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
623 TypeFunction *tf;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
624 Type *ta;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
625 Dsymbol *s;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
626
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
627 static TypeFunction *tftohash;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
628 static TypeFunction *tftostring;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
629
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
630 if (!tftohash)
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
631 {
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
632 Scope sc;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
633
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
634 tftohash = new TypeFunction(NULL, Type::thash_t, 0, LINKd);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
635 tftohash = (TypeFunction *)tftohash->semantic(0, &sc);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
636
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
637 tftostring = new TypeFunction(NULL, Type::tchar->arrayOf(), 0, LINKd);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
638 tftostring = (TypeFunction *)tftostring->semantic(0, &sc);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
639 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
640
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
641 TypeFunction *tfeqptr;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
642 {
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
643 Scope sc;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
644 Arguments *arguments = new Arguments;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
645 Argument *arg = new Argument(STCin, tc->pointerTo(), NULL, NULL);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
646
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
647 arguments->push(arg);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
648 tfeqptr = new TypeFunction(arguments, Type::tint32, 0, LINKd);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
649 tfeqptr = (TypeFunction *)tfeqptr->semantic(0, &sc);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
650 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
651
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
652 #if 0
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
653 TypeFunction *tfeq;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
654 {
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
655 Scope sc;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
656 Array *arguments = new Array;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
657 Argument *arg = new Argument(In, tc, NULL, NULL);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
658
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
659 arguments->push(arg);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
660 tfeq = new TypeFunction(arguments, Type::tint32, 0, LINKd);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
661 tfeq = (TypeFunction *)tfeq->semantic(0, &sc);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
662 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
663 #endif
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
664
73
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
665 Logger::println("************** B");
96
ce7ed8f59b99 [svn r100] Moved test/ray.d to demos/ray.d.
lindquist
parents: 89
diff changeset
666 const llvm::PointerType* ptty = isaPointer(stype->getElementType(3));
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
667
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
668 s = search_function(sd, Id::tohash);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
669 fdx = s ? s->isFuncDeclaration() : NULL;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
670 if (fdx)
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
671 {
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
672 fd = fdx->overloadExactMatch(tftohash);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
673 if (fd) {
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
674 assert(fd->llvmValue != 0);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
675 llvm::Constant* c = llvm::cast_or_null<llvm::Constant>(fd->llvmValue);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
676 assert(c);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
677 c = llvm::ConstantExpr::getBitCast(c, ptty);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
678 sinits.push_back(c);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
679 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
680 else {
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
681 //fdx->error("must be declared as extern (D) uint toHash()");
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
682 sinits.push_back(llvm::ConstantPointerNull::get(ptty));
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
683 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
684 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
685 else {
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
686 sinits.push_back(llvm::ConstantPointerNull::get(ptty));
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
687 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
688
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
689 s = search_function(sd, Id::eq);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
690 fdx = s ? s->isFuncDeclaration() : NULL;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
691 for (int i = 0; i < 2; i++)
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
692 {
73
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
693 Logger::println("************** C %d", i);
96
ce7ed8f59b99 [svn r100] Moved test/ray.d to demos/ray.d.
lindquist
parents: 89
diff changeset
694 ptty = isaPointer(stype->getElementType(4+i));
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
695 if (fdx)
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
696 {
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
697 fd = fdx->overloadExactMatch(tfeqptr);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
698 if (fd) {
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
699 assert(fd->llvmValue != 0);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
700 llvm::Constant* c = llvm::cast_or_null<llvm::Constant>(fd->llvmValue);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
701 assert(c);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
702 c = llvm::ConstantExpr::getBitCast(c, ptty);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
703 sinits.push_back(c);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
704 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
705 else {
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
706 //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
707 sinits.push_back(llvm::ConstantPointerNull::get(ptty));
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
708 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
709 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
710 else {
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
711 sinits.push_back(llvm::ConstantPointerNull::get(ptty));
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
712 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
713
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
714 s = search_function(sd, Id::cmp);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
715 fdx = s ? s->isFuncDeclaration() : NULL;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
716 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
717
73
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
718 Logger::println("************** D");
96
ce7ed8f59b99 [svn r100] Moved test/ray.d to demos/ray.d.
lindquist
parents: 89
diff changeset
719 ptty = isaPointer(stype->getElementType(6));
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
720 s = search_function(sd, Id::tostring);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
721 fdx = s ? s->isFuncDeclaration() : NULL;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
722 if (fdx)
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
723 {
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
724 fd = fdx->overloadExactMatch(tftostring);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
725 if (fd) {
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
726 assert(fd->llvmValue != 0);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
727 llvm::Constant* c = llvm::cast_or_null<llvm::Constant>(fd->llvmValue);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
728 assert(c);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
729 c = llvm::ConstantExpr::getBitCast(c, ptty);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
730 sinits.push_back(c);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
731 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
732 else {
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
733 //fdx->error("must be declared as extern (D) char[] toString()");
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
734 sinits.push_back(llvm::ConstantPointerNull::get(ptty));
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
735 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
736 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
737 else {
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
738 sinits.push_back(llvm::ConstantPointerNull::get(ptty));
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
739 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
740
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
741 // 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
742 sinits.push_back(DtoConstUint(tc->hasPointers()));
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
743
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
744 // create the symbol
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
745 llvm::Constant* tiInit = llvm::ConstantStruct::get(stype, sinits);
73
b706170e24a9 [svn r77] Fixed foreach on slice.
lindquist
parents: 72
diff changeset
746 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
747
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
748 llvmValue = gvar;
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
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
753 void TypeInfoClassDeclaration::toDt(dt_t **pdt)
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
754 {
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
755 assert(0 && "TypeInfoClassDeclaration");
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
756
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
757 /*
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
758 //printf("TypeInfoClassDeclaration::toDt() %s\n", tinfo->toChars());
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
759 dtxoff(pdt, Type::typeinfoclass->toVtblSymbol(), 0, TYnptr); // vtbl for TypeInfoClass
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
760 dtdword(pdt, 0); // monitor
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
761
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
762 assert(tinfo->ty == Tclass);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
763
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
764 TypeClass *tc = (TypeClass *)tinfo;
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
765 Symbol *s;
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
766
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
767 if (!tc->sym->vclassinfo)
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
768 tc->sym->vclassinfo = new ClassInfoDeclaration(tc->sym);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
769 s = tc->sym->vclassinfo->toSymbol();
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
770 dtxoff(pdt, s, 0, TYnptr); // ClassInfo for tinfo
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
771 */
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
772 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
773
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
774 /* ========================================================================= */
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
775
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
776 void TypeInfoInterfaceDeclaration::toDt(dt_t **pdt)
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
777 {
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
778 assert(0 && "TypeInfoInterfaceDeclaration");
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
779
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
780 /*
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
781 //printf("TypeInfoInterfaceDeclaration::toDt() %s\n", tinfo->toChars());
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
782 dtxoff(pdt, Type::typeinfointerface->toVtblSymbol(), 0, TYnptr); // vtbl for TypeInfoInterface
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
783 dtdword(pdt, 0); // monitor
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
784
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
785 assert(tinfo->ty == Tclass);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
786
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
787 TypeClass *tc = (TypeClass *)tinfo;
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
788 Symbol *s;
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
789
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
790 if (!tc->sym->vclassinfo)
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
791 tc->sym->vclassinfo = new ClassInfoDeclaration(tc->sym);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
792 s = tc->sym->vclassinfo->toSymbol();
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
793 dtxoff(pdt, s, 0, TYnptr); // ClassInfo for tinfo
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
794 */
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
795 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
796
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
797 /* ========================================================================= */
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
798
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
799 void TypeInfoTupleDeclaration::toDt(dt_t **pdt)
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
800 {
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
801 assert(0 && "TypeInfoTupleDeclaration");
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
802
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
803 /*
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
804 //printf("TypeInfoTupleDeclaration::toDt() %s\n", tinfo->toChars());
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
805 dtxoff(pdt, Type::typeinfotypelist->toVtblSymbol(), 0, TYnptr); // vtbl for TypeInfoInterface
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
806 dtdword(pdt, 0); // monitor
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 assert(tinfo->ty == Ttuple);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
809
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
810 TypeTuple *tu = (TypeTuple *)tinfo;
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
811
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
812 size_t dim = tu->arguments->dim;
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
813 dtdword(pdt, dim); // elements.length
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
814
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
815 dt_t *d = NULL;
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
816 for (size_t i = 0; i < dim; i++)
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
817 { Argument *arg = (Argument *)tu->arguments->data[i];
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
818 Expression *e = arg->type->getTypeInfo(NULL);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
819 e = e->optimize(WANTvalue);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
820 e->toDt(&d);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
821 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
822
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
823 Symbol *s;
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
824 s = static_sym();
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
825 s->Sdt = d;
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
826 outdata(s);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
827
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
828 dtxoff(pdt, s, 0, TYnptr); // elements.ptr
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
829 */
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
830 }