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

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