annotate gen/typinf.cpp @ 1064:f0b6549055ab

Make LDC work with LLVM trunk (s/LinkOnceLinkage/LinkOnceOdrLinkage/) Also moved the #defines for linkage types into a separate header instead of mars.h so we can #include revisions.h without having to rebuild the entire frontend every time we update. (I'm using revisions.h to get the LLVM revision for use in preprocessor conditionals. It should work with LLVM release 2.5, old trunk and new trunk)
author Frits van Bommel <fvbommel wxs.nl>
date Sun, 08 Mar 2009 16:13:10 +0100
parents a4fcc13da3cd
children 1860414bf3b7
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
663
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 622
diff changeset
11 // Modifications for LDC:
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
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"
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 213
diff changeset
38 #include "gen/llvmhelpers.h"
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
39 #include "gen/arrays.h"
100
5071469303d4 [svn r104] TONS OF FIXES.
lindquist
parents: 98
diff changeset
40 #include "gen/structs.h"
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
41 #include "gen/classes.h"
1064
f0b6549055ab Make LDC work with LLVM trunk (s/LinkOnceLinkage/LinkOnceOdrLinkage/)
Frits van Bommel <fvbommel wxs.nl>
parents: 918
diff changeset
42 #include "gen/linkage.h"
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
43
136
0e28624814e8 [svn r140] did a lot of the work towards being able to pass multiple modules on the command line. not complete yet though
lindquist
parents: 133
diff changeset
44 #include "ir/irvar.h"
0e28624814e8 [svn r140] did a lot of the work towards being able to pass multiple modules on the command line. not complete yet though
lindquist
parents: 133
diff changeset
45
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
46 /*******************************************
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
47 * 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
48 * runtime library routines. Canonicalized in that static arrays are
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
49 * represented as dynamic arrays, enums are represented by their
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
50 * 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
51 * so we can use the custom internal ones more.
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
52 */
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
53
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
54 Expression *Type::getInternalTypeInfo(Scope *sc)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
55 { TypeInfoDeclaration *tid;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
56 Expression *e;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
57 Type *t;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
58 static TypeInfoDeclaration *internalTI[TMAX];
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 //printf("Type::getInternalTypeInfo() %s\n", toChars());
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
61 t = toBasetype();
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
62 switch (t->ty)
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 Tsarray:
758
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
65 #if 0
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
66 // convert to corresponding dynamic array type
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
67 t = t->nextOf()->mutableOf()->arrayOf();
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
68 #endif
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
69 break;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
70
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
71 case Tclass:
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
72 if (((TypeClass *)t)->sym->isInterfaceDeclaration())
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
73 break;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
74 goto Linternal;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
75
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
76 case Tarray:
758
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
77 #if DMDV2
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
78 // convert to corresponding dynamic array type
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
79 t = t->nextOf()->mutableOf()->arrayOf();
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
80 #endif
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
81 if (t->nextOf()->ty != Tclass)
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
82 break;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
83 goto Linternal;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
84
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
85 case Tfunction:
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
86 case Tdelegate:
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
87 case Tpointer:
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
88 Linternal:
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
89 tid = internalTI[t->ty];
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
90 if (!tid)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
91 { tid = new TypeInfoDeclaration(t, 1);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
92 internalTI[t->ty] = tid;
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 e = new VarExp(0, tid);
758
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
95 e = e->addressOf(sc);
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
96 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
97 return e;
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 default:
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
100 break;
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 //printf("\tcalling getTypeInfo() %s\n", t->toChars());
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
103 return t->getTypeInfo(sc);
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
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
106 /****************************************************
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
107 * Get the exact TypeInfo.
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
108 */
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
109
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
110 Expression *Type::getTypeInfo(Scope *sc)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
111 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
112 Expression *e;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
113 Type *t;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
114
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
115 //printf("Type::getTypeInfo() %p, %s\n", this, toChars());
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
116 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
117 if (!t->vtinfo)
758
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
118 {
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
119 #if DMDV2
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
120 if (t->isConst())
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
121 t->vtinfo = new TypeInfoConstDeclaration(t);
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
122 else if (t->isInvariant())
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
123 t->vtinfo = new TypeInfoInvariantDeclaration(t);
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
124 else
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
125 #endif
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
126 t->vtinfo = t->getTypeInfoDeclaration();
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
127 assert(t->vtinfo);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
128
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
129 /* If this has a custom implementation in std/typeinfo, then
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
130 * do not generate a COMDAT for it.
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 if (!t->builtinTypeInfo())
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
133 { // Generate COMDAT
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
134 if (sc) // if in semantic() pass
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
135 { // 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
136 Module *m = sc->module->importedFrom;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
137 m->members->push(t->vtinfo);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
138 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
139 else // if in obj generation pass
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
140 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 290
diff changeset
141 t->vtinfo->toObjFile(0); // TODO: multiobj
1
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 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
144 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
145 e = new VarExp(0, t->vtinfo);
381
6590ec13f14d Fixed root cause for Invalid BitCasts. DtoCanLoad continues to return false
Christian Kamm <kamm incasoftware de>
parents: 379
diff changeset
146 //e = e->addressOf(sc);
6590ec13f14d Fixed root cause for Invalid BitCasts. DtoCanLoad continues to return false
Christian Kamm <kamm incasoftware de>
parents: 379
diff changeset
147 //e->type = t->vtinfo->type; // do this so we don't get redundant dereference
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
148 return e;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
149 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
150
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
151 enum RET TypeFunction::retStyle()
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
152 {
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
153 return RETstack;
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
154 }
1
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 TypeInfoDeclaration *Type::getTypeInfoDeclaration()
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 //printf("Type::getTypeInfoDeclaration() %s\n", toChars());
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
159 return new TypeInfoDeclaration(this, 0);
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
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
162 TypeInfoDeclaration *TypeTypedef::getTypeInfoDeclaration()
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
163 {
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
164 return new TypeInfoTypedefDeclaration(this);
1
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
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
167 TypeInfoDeclaration *TypePointer::getTypeInfoDeclaration()
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
168 {
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
169 return new TypeInfoPointerDeclaration(this);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
170 }
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
171
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
172 TypeInfoDeclaration *TypeDArray::getTypeInfoDeclaration()
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 return new TypeInfoArrayDeclaration(this);
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
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
177 TypeInfoDeclaration *TypeSArray::getTypeInfoDeclaration()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
178 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
179 return new TypeInfoStaticArrayDeclaration(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 *TypeAArray::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 TypeInfoAssociativeArrayDeclaration(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
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
187 TypeInfoDeclaration *TypeStruct::getTypeInfoDeclaration()
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
188 {
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
189 return new TypeInfoStructDeclaration(this);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
190 }
1
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 *TypeClass::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 if (sym->isInterfaceDeclaration())
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
195 return new TypeInfoInterfaceDeclaration(this);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
196 else
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
197 return new TypeInfoClassDeclaration(this);
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
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
200 TypeInfoDeclaration *TypeEnum::getTypeInfoDeclaration()
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 return new TypeInfoEnumDeclaration(this);
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 TypeInfoDeclaration *TypeFunction::getTypeInfoDeclaration()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
206 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
207 return new TypeInfoFunctionDeclaration(this);
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
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
210 TypeInfoDeclaration *TypeDelegate::getTypeInfoDeclaration()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
211 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
212 return new TypeInfoDelegateDeclaration(this);
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
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
215 TypeInfoDeclaration *TypeTuple::getTypeInfoDeclaration()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
216 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
217 return new TypeInfoTupleDeclaration(this);
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
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
220
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
221 /* ========================================================================= */
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
222
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
223 /* 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
224 * because then the compiler doesn't need to build one.
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 int Type::builtinTypeInfo()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
228 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
229 return 0;
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
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
232 int TypeBasic::builtinTypeInfo()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
233 {
764
8e7d4ddab66d Forgot D2 versioning on typeinfo change.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 763
diff changeset
234 #if DMDV2
763
9a9f403ab399 D2 changes!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
235 return !mod;
764
8e7d4ddab66d Forgot D2 versioning on typeinfo change.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 763
diff changeset
236 #else
8e7d4ddab66d Forgot D2 versioning on typeinfo change.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 763
diff changeset
237 return 1;
8e7d4ddab66d Forgot D2 versioning on typeinfo change.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 763
diff changeset
238 #endif
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
239 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
240
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
241 int TypeDArray::builtinTypeInfo()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
242 {
763
9a9f403ab399 D2 changes!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
243 #if DMDV2
9a9f403ab399 D2 changes!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
244 return !mod && next->isTypeBasic() != NULL && !next->mod;
9a9f403ab399 D2 changes!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
245 #else
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
246 return next->isTypeBasic() != NULL;
763
9a9f403ab399 D2 changes!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
247 #endif
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
248 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
249
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
250 /* ========================================================================= */
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
251
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
252 /***************************************
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
253 * Create a static array of TypeInfo references
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
254 * corresponding to an array of Expression's.
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
255 * Used to supply hidden _arguments[] value for variadic D functions.
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
256 */
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
257
57
a9d29e9f1fed [svn r61] Added support for D-style variadic functions :)
lindquist
parents: 54
diff changeset
258 Expression *createTypeInfoArray(Scope *sc, Expression *exps[], int dim)
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
259 {
663
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 622
diff changeset
260 assert(0); // done elsewhere in LDC
57
a9d29e9f1fed [svn r61] Added support for D-style variadic functions :)
lindquist
parents: 54
diff changeset
261 return NULL;
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
262 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
263
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
264 /* ========================================================================= */
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
265
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
266 //////////////////////////////////////////////////////////////////////////////
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
267 // MAGIC PLACE
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
268 //////////////////////////////////////////////////////////////////////////////
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
269
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 290
diff changeset
270 void TypeInfoDeclaration::toObjFile(int multiobj)
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
271 {
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
272 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
273 }
57
a9d29e9f1fed [svn r61] Added support for D-style variadic functions :)
lindquist
parents: 54
diff changeset
274
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
275 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
276 {
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 163
diff changeset
277 if (tid->ir.resolved) return;
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 163
diff changeset
278 tid->ir.resolved = true;
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
279
132
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
280 Logger::println("DtoResolveTypeInfo(%s)", tid->toChars());
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
281 LOG_SCOPE;
65
d4a678905d5e [svn r69] forgot std.stdarg
lindquist
parents: 58
diff changeset
282
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 163
diff changeset
283 tid->ir.irGlobal = new IrGlobal(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
284
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
285 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
286 }
98
6789050b5ad1 [svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references.
lindquist
parents: 96
diff changeset
287
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 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
289 {
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 163
diff changeset
290 if (tid->ir.declared) return;
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 163
diff changeset
291 tid->ir.declared = true;
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
132
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
293 Logger::println("DtoDeclareTypeInfo(%s)", tid->toChars());
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
294 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
295
027b8d8b71ec [svn 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 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
297
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
298 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
299 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
300
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
301 // 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
302 if (tid->tinfo->builtinTypeInfo()) {
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 173
diff changeset
303 LLValue* found = gIR->module->getNamedGlobal(mangled);
132
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
304 if (!found)
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
305 {
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 213
diff changeset
306 const LLType* t = LLOpaqueType::get();
132
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
307 llvm::GlobalVariable* g = new llvm::GlobalVariable(t, true, llvm::GlobalValue::ExternalLinkage, NULL, mangled, gIR->module);
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
308 assert(g);
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 163
diff changeset
309 /*if (!tid->ir.irGlobal)
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 163
diff changeset
310 tid->ir.irGlobal = new IrGlobal(tid);*/
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 163
diff changeset
311 tid->ir.irGlobal->value = g;
132
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
312 mangled.append("__TYPE");
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 163
diff changeset
313 gIR->module->addTypeName(mangled, tid->ir.irGlobal->value->getType()->getContainedType(0));
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 163
diff changeset
314 Logger::println("Got typeinfo var: %s", tid->ir.irGlobal->value->getName().c_str());
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 163
diff changeset
315 tid->ir.initialized = true;
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 163
diff changeset
316 tid->ir.defined = true;
132
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
317 }
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 163
diff changeset
318 else if (!tid->ir.irGlobal->value) {
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 163
diff changeset
319 tid->ir.irGlobal->value = found;
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 163
diff changeset
320 tid->ir.initialized = true;
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 163
diff changeset
321 tid->ir.defined = true;
132
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
322 }
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
323 }
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
324 // custom typedef
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
325 else {
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
326 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
327 gIR->constInitList.push_back(tid);
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
328 }
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
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
331 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
332 {
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 163
diff changeset
333 if (tid->ir.initialized) return;
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 163
diff changeset
334 tid->ir.initialized = true;
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
335
132
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
336 Logger::println("DtoConstInitTypeInfo(%s)", tid->toChars());
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
337 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
338
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
339 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
340 }
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
341
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
342 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
343 {
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 163
diff changeset
344 if (tid->ir.defined) return;
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 163
diff changeset
345 tid->ir.defined = true;
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
346
132
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
347 Logger::println("DtoDefineTypeInfo(%s)", tid->toChars());
102
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
348 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
349
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
350 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
351 }
027b8d8b71ec [svn r106] Turns out the last commit wasn't enough, now the D->LLVM process is even more split up.
lindquist
parents: 100
diff changeset
352
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
353 /* ========================================================================= */
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
354
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
355 void TypeInfoDeclaration::toDt(dt_t **pdt)
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
356 {
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
357 assert(0 && "TypeInfoDeclaration::toDt");
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
358 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
359
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
360 void TypeInfoDeclaration::llvmDeclare()
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
361 {
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
362 assert(0 && "TypeInfoDeclaration::llvmDeclare");
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
363 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
364
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
365 void TypeInfoDeclaration::llvmDefine()
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
366 {
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
367 assert(0 && "TypeInfoDeclaration::llvmDeclare");
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
368 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
369
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
370 /* ========================================================================= */
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
371
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
372 void TypeInfoTypedefDeclaration::llvmDeclare()
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
373 {
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
374 Logger::println("TypeInfoTypedefDeclaration::llvmDeclare() %s", toChars());
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
375 LOG_SCOPE;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
376
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
377 ClassDeclaration* base = Type::typeinfotypedef;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
378 DtoResolveClass(base);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
379
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 213
diff changeset
380 const LLStructType* stype = isaStruct(base->type->ir.type->get());
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
381
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
382 // create the symbol
918
a4fcc13da3cd Changed templates and typeinfo to use linkonce linkage instead of weak linkage, this should fix inlining problems, fixing bug #197 . If problems show up, it's easy to change it back by changing the define in mars.h . I'm 95% sure this is safe, given how we handle templates.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 880
diff changeset
383 ir.irGlobal->value = new llvm::GlobalVariable(ir.irGlobal->type.get(), true, TYPEINFO_LINKAGE_TYPE, NULL, toChars(), gIR->module);
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
384 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
385
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
386 void TypeInfoTypedefDeclaration::llvmDefine()
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
387 {
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
388 Logger::println("TypeInfoTypedefDeclaration::llvmDefine() %s", toChars());
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
389 LOG_SCOPE;
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
390
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
391 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
392 DtoForceConstInitDsymbol(base);
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
393
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
394 // vtbl
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 173
diff changeset
395 std::vector<LLConstant*> sinits;
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 163
diff changeset
396 sinits.push_back(base->ir.irStruct->vtbl);
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
397
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
398 // monitor
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 213
diff changeset
399 sinits.push_back(getNullPtr(getPtrToType(LLType::Int8Ty)));
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
400
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
401 assert(tinfo->ty == Ttypedef);
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
402 TypeTypedef *tc = (TypeTypedef *)tinfo;
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
403 TypedefDeclaration *sd = tc->sym;
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
404
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
405 // TypeInfo base
290
ebaf65fc4726 [svn r311] Fixed: structs no longer output two static typeinfos.
lindquist
parents: 275
diff changeset
406 sd->basetype = sd->basetype->merge(); // DMD does this!
275
665b81613475 [svn r296] Removed: the 'suite' dir, it never took off!
lindquist
parents: 244
diff changeset
407 LLConstant* castbase = DtoTypeInfoOf(sd->basetype, true);
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
408 sinits.push_back(castbase);
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
409
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
410 // char[] name
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
411 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
412 sinits.push_back(DtoConstString(name));
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
413
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
414 // void[] init
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 213
diff changeset
415 const LLPointerType* initpt = getPtrToType(LLType::Int8Ty);
69
2b5a2eaa88be [svn r73] Identity expression for dynamic array and null was broken.
lindquist
parents: 65
diff changeset
416 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
417 {
133
44a95ac7368a [svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents: 132
diff changeset
418 sinits.push_back(DtoConstSlice(DtoConstSize_t(0), getNullPtr(initpt)));
69
2b5a2eaa88be [svn r73] Identity expression for dynamic array and null was broken.
lindquist
parents: 65
diff changeset
419 }
2b5a2eaa88be [svn r73] Identity expression for dynamic array and null was broken.
lindquist
parents: 65
diff changeset
420 else
2b5a2eaa88be [svn r73] Identity expression for dynamic array and null was broken.
lindquist
parents: 65
diff changeset
421 {
796
6e7a4c3b64d2 Error instead of assert when trying to build a default initializer for void[n].
Christian Kamm <kamm incasoftware de>
parents: 766
diff changeset
422 LLConstant* ci = DtoConstInitializer(sd->loc, sd->basetype, sd->init);
69
2b5a2eaa88be [svn r73] Identity expression for dynamic array and null was broken.
lindquist
parents: 65
diff changeset
423 std::string ciname(sd->mangle());
2b5a2eaa88be [svn r73] Identity expression for dynamic array and null was broken.
lindquist
parents: 65
diff changeset
424 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
425 llvm::GlobalVariable* civar = new llvm::GlobalVariable(DtoType(sd->basetype),true,llvm::GlobalValue::InternalLinkage,ci,ciname,gIR->module);
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 173
diff changeset
426 LLConstant* cicast = llvm::ConstantExpr::getBitCast(civar, initpt);
133
44a95ac7368a [svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents: 132
diff changeset
427 size_t cisize = getTypeStoreSize(DtoType(sd->basetype));
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
428 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
429 }
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
430
797
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
431 // create the inititalizer
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
432 LLConstant* tiInit = llvm::ConstantStruct::get(sinits);
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
433
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
434 // refine global type
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
435 llvm::cast<llvm::OpaqueType>(ir.irGlobal->type.get())->refineAbstractTypeTo(tiInit->getType());
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
436
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
437 // set the initializer
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
438 isaGlobalVar(ir.irGlobal->value)->setInitializer(tiInit);
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
439 }
54
28e99b04a132 [svn r58] Fixed cond expression resulting in a non-basic type.
lindquist
parents: 52
diff changeset
440
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
441 void TypeInfoTypedefDeclaration::toDt(dt_t **pdt)
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
442 {
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
443 assert(0);
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
444 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
445
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
446 /* ========================================================================= */
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
447
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
448 void TypeInfoEnumDeclaration::llvmDeclare()
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
449 {
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
450 Logger::println("TypeInfoEnumDeclaration::llvmDeclare() %s", toChars());
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
451 LOG_SCOPE;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
452
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
453 ClassDeclaration* base = Type::typeinfoenum;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
454 DtoResolveClass(base);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
455
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
456 // create the symbol
918
a4fcc13da3cd Changed templates and typeinfo to use linkonce linkage instead of weak linkage, this should fix inlining problems, fixing bug #197 . If problems show up, it's easy to change it back by changing the define in mars.h . I'm 95% sure this is safe, given how we handle templates.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 880
diff changeset
457 ir.irGlobal->value = new llvm::GlobalVariable(ir.irGlobal->type.get(), true, TYPEINFO_LINKAGE_TYPE, NULL, toChars(), gIR->module);
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
458 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
459
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
460 void TypeInfoEnumDeclaration::llvmDefine()
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
461 {
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
462 Logger::println("TypeInfoEnumDeclaration::llvmDefine() %s", toChars());
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
463 LOG_SCOPE;
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
464
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
465 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
466 DtoForceConstInitDsymbol(base);
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
467
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
468 // vtbl
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 173
diff changeset
469 std::vector<LLConstant*> sinits;
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 163
diff changeset
470 sinits.push_back(base->ir.irStruct->vtbl);
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
471
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
472 // monitor
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 213
diff changeset
473 sinits.push_back(llvm::ConstantPointerNull::get(getPtrToType(LLType::Int8Ty)));
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
474
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
475 assert(tinfo->ty == Tenum);
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
476 TypeEnum *tc = (TypeEnum *)tinfo;
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
477 EnumDeclaration *sd = tc->sym;
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
478
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
479 // TypeInfo base
275
665b81613475 [svn r296] Removed: the 'suite' dir, it never took off!
lindquist
parents: 244
diff changeset
480 LLConstant* castbase = DtoTypeInfoOf(sd->memtype, true);
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
481 sinits.push_back(castbase);
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
482
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
483 // char[] name
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
484 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
485 sinits.push_back(DtoConstString(name));
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
486
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
487 // void[] init
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 213
diff changeset
488 const LLPointerType* initpt = getPtrToType(LLType::Int8Ty);
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
489 if (tinfo->isZeroInit() || !sd->defaultval) // 0 initializer, or the same as the base type
53d3086b5ad3 [svn r75] Fixed the init member in custom enum typeinfo. I don't see any way this could actually need emmision though :/
lindquist
parents: 69
diff changeset
490 {
81
3587401b6eeb [svn r85] Fixed: if a return statement appeared in the try block of a nested try-finally, only the inner-most finally block would be executed.
lindquist
parents: 73
diff changeset
491 sinits.push_back(DtoConstSlice(DtoConstSize_t(0), llvm::ConstantPointerNull::get(initpt)));
71
53d3086b5ad3 [svn r75] Fixed the init member in custom enum typeinfo. I don't see any way this could actually need emmision though :/
lindquist
parents: 69
diff changeset
492 }
53d3086b5ad3 [svn r75] Fixed the init member in custom enum typeinfo. I don't see any way this could actually need emmision though :/
lindquist
parents: 69
diff changeset
493 else
53d3086b5ad3 [svn r75] Fixed the init member in custom enum typeinfo. I don't see any way this could actually need emmision though :/
lindquist
parents: 69
diff changeset
494 {
758
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
495 #if DMDV2
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
496 assert(0 && "initializer not implemented");
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
497 #else
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 173
diff changeset
498 const LLType* memty = DtoType(sd->memtype);
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 173
diff changeset
499 LLConstant* ci = llvm::ConstantInt::get(memty, sd->defaultval, !sd->memtype->isunsigned());
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
500 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
501 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
502 llvm::GlobalVariable* civar = new llvm::GlobalVariable(memty,true,llvm::GlobalValue::InternalLinkage,ci,ciname,gIR->module);
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 173
diff changeset
503 LLConstant* cicast = llvm::ConstantExpr::getBitCast(civar, initpt);
133
44a95ac7368a [svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents: 132
diff changeset
504 size_t cisize = getTypeStoreSize(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
505 sinits.push_back(DtoConstSlice(DtoConstSize_t(cisize), cicast));
758
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
506 #endif
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
507 }
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
508
797
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
509 // create the inititalizer
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
510 LLConstant* tiInit = llvm::ConstantStruct::get(sinits);
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
511
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
512 // refine global type
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
513 llvm::cast<llvm::OpaqueType>(ir.irGlobal->type.get())->refineAbstractTypeTo(tiInit->getType());
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
514
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
515 // set the initializer
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
516 isaGlobalVar(ir.irGlobal->value)->setInitializer(tiInit);
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
517 }
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
518
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
519 void TypeInfoEnumDeclaration::toDt(dt_t **pdt)
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
520 {
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
521 assert(0);
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
522 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
523
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
524 /* ========================================================================= */
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
525
880
2dfd05525e2e Fixed bad return types in typinf.cpp
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 797
diff changeset
526 static void LLVM_D_Declare_TypeInfoBase(TypeInfoDeclaration* tid, ClassDeclaration* cd)
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
527 {
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
528 ClassDeclaration* base = cd;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
529 DtoResolveClass(base);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
530
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
531 // create the symbol
918
a4fcc13da3cd Changed templates and typeinfo to use linkonce linkage instead of weak linkage, this should fix inlining problems, fixing bug #197 . If problems show up, it's easy to change it back by changing the define in mars.h . I'm 95% sure this is safe, given how we handle templates.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 880
diff changeset
532 tid->ir.irGlobal->value = new llvm::GlobalVariable(tid->ir.irGlobal->type.get(), true, TYPEINFO_LINKAGE_TYPE, NULL, tid->toChars(), gIR->module);
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
533 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
534
880
2dfd05525e2e Fixed bad return types in typinf.cpp
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 797
diff changeset
535 static void 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
536 {
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
537 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
538 DtoForceConstInitDsymbol(base);
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
539
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
540 // vtbl
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 173
diff changeset
541 std::vector<LLConstant*> sinits;
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 163
diff changeset
542 sinits.push_back(base->ir.irStruct->vtbl);
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
543
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
544 // monitor
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 213
diff changeset
545 sinits.push_back(llvm::ConstantPointerNull::get(getPtrToType(LLType::Int8Ty)));
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
546
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
547 // TypeInfo base
275
665b81613475 [svn r296] Removed: the 'suite' dir, it never took off!
lindquist
parents: 244
diff changeset
548 LLConstant* castbase = DtoTypeInfoOf(basetype, true);
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
549 sinits.push_back(castbase);
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
550
797
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
551 // create the inititalizer
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
552 LLConstant* tiInit = llvm::ConstantStruct::get(sinits);
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
553
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
554 // refine global type
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
555 llvm::cast<llvm::OpaqueType>(tid->ir.irGlobal->type.get())->refineAbstractTypeTo(tiInit->getType());
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
556
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
557 // set the initializer
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 163
diff changeset
558 isaGlobalVar(tid->ir.irGlobal->value)->setInitializer(tiInit);
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
559 }
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
560
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
561 /* ========================================================================= */
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
562
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
563 void TypeInfoPointerDeclaration::llvmDeclare()
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
564 {
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
565 Logger::println("TypeInfoPointerDeclaration::llvmDeclare() %s", toChars());
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
566 LOG_SCOPE;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
567
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
568 assert(tinfo->ty == Tpointer);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
569 TypePointer *tc = (TypePointer *)tinfo;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
570
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
571 LLVM_D_Declare_TypeInfoBase(this, Type::typeinfopointer);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
572 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
573
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
574 void TypeInfoPointerDeclaration::llvmDefine()
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 Logger::println("TypeInfoPointerDeclaration::llvmDefine() %s", toChars());
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
577 LOG_SCOPE;
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
578
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
579 assert(tinfo->ty == Tpointer);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
580 TypePointer *tc = (TypePointer *)tinfo;
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
581
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
582 LLVM_D_Define_TypeInfoBase(tc->next, this, Type::typeinfopointer);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
583 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
584
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
585 void TypeInfoPointerDeclaration::toDt(dt_t **pdt)
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 assert(0);
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
588 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
589
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
590 /* ========================================================================= */
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
591
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
592 void TypeInfoArrayDeclaration::llvmDeclare()
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
593 {
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
594 Logger::println("TypeInfoArrayDeclaration::llvmDeclare() %s", toChars());
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
595 LOG_SCOPE;
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
596
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
597 assert(tinfo->ty == Tarray);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
598 TypeDArray *tc = (TypeDArray *)tinfo;
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
599
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
600 LLVM_D_Declare_TypeInfoBase(this, Type::typeinfoarray);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
601 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
602
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
603 void TypeInfoArrayDeclaration::llvmDefine()
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
604 {
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
605 Logger::println("TypeInfoArrayDeclaration::llvmDefine() %s", toChars());
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
606 LOG_SCOPE;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
607
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
608 assert(tinfo->ty == Tarray);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
609 TypeDArray *tc = (TypeDArray *)tinfo;
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 LLVM_D_Define_TypeInfoBase(tc->next, this, Type::typeinfoarray);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
612 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
613
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
614 void TypeInfoArrayDeclaration::toDt(dt_t **pdt)
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
615 {
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
616 assert(0);
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
617 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
618
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
619 /* ========================================================================= */
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
620
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
621 void TypeInfoStaticArrayDeclaration::llvmDeclare()
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
622 {
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
623 Logger::println("TypeInfoStaticArrayDeclaration::toDt() %s", toChars());
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
624 LOG_SCOPE;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
625
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
626 // init typeinfo class
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
627 ClassDeclaration* base = Type::typeinfostaticarray;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
628 DtoResolveClass(base);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
629
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
630 // create the symbol
918
a4fcc13da3cd Changed templates and typeinfo to use linkonce linkage instead of weak linkage, this should fix inlining problems, fixing bug #197 . If problems show up, it's easy to change it back by changing the define in mars.h . I'm 95% sure this is safe, given how we handle templates.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 880
diff changeset
631 ir.irGlobal->value = new llvm::GlobalVariable(ir.irGlobal->type.get(), true, TYPEINFO_LINKAGE_TYPE, NULL, toChars(), gIR->module);
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
632 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
633
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
634 void TypeInfoStaticArrayDeclaration::llvmDefine()
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
635 {
105
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
636 Logger::println("TypeInfoStaticArrayDeclaration::toDt() %s", toChars());
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
637 LOG_SCOPE;
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
638
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
639 // init typeinfo class
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
640 ClassDeclaration* base = Type::typeinfostaticarray;
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
641 DtoForceConstInitDsymbol(base);
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
642
105
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
643 // get type of typeinfo class
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 213
diff changeset
644 const LLStructType* stype = isaStruct(base->type->ir.type->get());
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
645
105
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
646 // initializer vector
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 173
diff changeset
647 std::vector<LLConstant*> sinits;
105
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
648 // first is always the vtable
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 163
diff changeset
649 sinits.push_back(base->ir.irStruct->vtbl);
105
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
650
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
651 // monitor
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 213
diff changeset
652 sinits.push_back(llvm::ConstantPointerNull::get(getPtrToType(LLType::Int8Ty)));
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
653
105
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
654 // value typeinfo
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
655 assert(tinfo->ty == Tsarray);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
656 TypeSArray *tc = (TypeSArray *)tinfo;
275
665b81613475 [svn r296] Removed: the 'suite' dir, it never took off!
lindquist
parents: 244
diff changeset
657 LLConstant* castbase = DtoTypeInfoOf(tc->next, true);
665b81613475 [svn r296] Removed: the 'suite' dir, it never took off!
lindquist
parents: 244
diff changeset
658 assert(castbase->getType() == stype->getElementType(2));
105
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
659 sinits.push_back(castbase);
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
660
105
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
661 // length
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
662 sinits.push_back(DtoConstSize_t(tc->dim->toInteger()));
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
663
797
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
664 // create the inititalizer
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
665 LLConstant* tiInit = llvm::ConstantStruct::get(sinits);
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
666
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
667 // refine global type
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
668 llvm::cast<llvm::OpaqueType>(ir.irGlobal->type.get())->refineAbstractTypeTo(tiInit->getType());
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
669
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
670 // set the initializer
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
671 isaGlobalVar(ir.irGlobal->value)->setInitializer(tiInit);
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
672 }
105
182b41f56b7f [svn r109] Fixed support for static array TypeInfo
lindquist
parents: 102
diff changeset
673
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
674 void TypeInfoStaticArrayDeclaration::toDt(dt_t **pdt)
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
675 {
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
676 assert(0);
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
677 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
678
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
679 /* ========================================================================= */
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
680
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
681 void TypeInfoAssociativeArrayDeclaration::llvmDeclare()
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
682 {
109
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
683 Logger::println("TypeInfoAssociativeArrayDeclaration::toDt() %s", toChars());
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
684 LOG_SCOPE;
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
685
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
686 // init typeinfo class
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
687 ClassDeclaration* base = Type::typeinfoassociativearray;
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
688 DtoResolveClass(base);
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
689
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
690 // create the symbol
918
a4fcc13da3cd Changed templates and typeinfo to use linkonce linkage instead of weak linkage, this should fix inlining problems, fixing bug #197 . If problems show up, it's easy to change it back by changing the define in mars.h . I'm 95% sure this is safe, given how we handle templates.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 880
diff changeset
691 ir.irGlobal->value = new llvm::GlobalVariable(ir.irGlobal->type.get(), true, TYPEINFO_LINKAGE_TYPE, NULL, toChars(), gIR->module);
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
692 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
693
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
694 void TypeInfoAssociativeArrayDeclaration::llvmDefine()
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
695 {
109
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
696 Logger::println("TypeInfoAssociativeArrayDeclaration::toDt() %s", toChars());
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
697 LOG_SCOPE;
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
698
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
699 // init typeinfo class
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
700 ClassDeclaration* base = Type::typeinfoassociativearray;
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
701 DtoForceConstInitDsymbol(base);
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
702
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
703 // initializer vector
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 173
diff changeset
704 std::vector<LLConstant*> sinits;
109
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
705 // first is always the vtable
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 163
diff changeset
706 sinits.push_back(base->ir.irStruct->vtbl);
109
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
707
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
708 // monitor
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 213
diff changeset
709 sinits.push_back(llvm::ConstantPointerNull::get(getPtrToType(LLType::Int8Ty)));
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
710
109
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
711 // get type
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
712 assert(tinfo->ty == Taarray);
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
713 TypeAArray *tc = (TypeAArray *)tinfo;
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
714
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
715 // value typeinfo
275
665b81613475 [svn r296] Removed: the 'suite' dir, it never took off!
lindquist
parents: 244
diff changeset
716 LLConstant* castbase = DtoTypeInfoOf(tc->next, true);
109
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
717 sinits.push_back(castbase);
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
718
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
719 // key typeinfo
275
665b81613475 [svn r296] Removed: the 'suite' dir, it never took off!
lindquist
parents: 244
diff changeset
720 castbase = DtoTypeInfoOf(tc->index, true);
109
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
721 sinits.push_back(castbase);
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
722
797
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
723 // create the inititalizer
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
724 LLConstant* tiInit = llvm::ConstantStruct::get(sinits);
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
725
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
726 // refine global type
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
727 llvm::cast<llvm::OpaqueType>(ir.irGlobal->type.get())->refineAbstractTypeTo(tiInit->getType());
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
728
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
729 // set the initializer
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
730 isaGlobalVar(ir.irGlobal->value)->setInitializer(tiInit);
106
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
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
733 void TypeInfoAssociativeArrayDeclaration::toDt(dt_t **pdt)
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
734 {
109
5ab8e92611f9 [svn r113] Added initial support for associative arrays (AAs).
lindquist
parents: 106
diff changeset
735 assert(0);
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
736 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
737
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
738 /* ========================================================================= */
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
739
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
740 void TypeInfoFunctionDeclaration::llvmDeclare()
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
741 {
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
742 Logger::println("TypeInfoFunctionDeclaration::toDt() %s", toChars());
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
743 LOG_SCOPE;
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 assert(tinfo->ty == Tfunction);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
746 TypeFunction *tc = (TypeFunction *)tinfo;
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 LLVM_D_Declare_TypeInfoBase(this, Type::typeinfofunction);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
749 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
750
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
751 void TypeInfoFunctionDeclaration::llvmDefine()
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
752 {
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
753 Logger::println("TypeInfoFunctionDeclaration::toDt() %s", toChars());
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
754 LOG_SCOPE;
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
755
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
756 assert(tinfo->ty == Tfunction);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
757 TypeFunction *tc = (TypeFunction *)tinfo;
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
758
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
759 LLVM_D_Define_TypeInfoBase(tc->next, this, Type::typeinfofunction);
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
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
762 void TypeInfoFunctionDeclaration::toDt(dt_t **pdt)
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 assert(0);
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
765 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
766
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
767 /* ========================================================================= */
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
768
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
769 void TypeInfoDelegateDeclaration::llvmDeclare()
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
770 {
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
771 Logger::println("TypeInfoDelegateDeclaration::toDt() %s", toChars());
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
772 LOG_SCOPE;
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 assert(tinfo->ty == Tdelegate);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
775 TypeDelegate *tc = (TypeDelegate *)tinfo;
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 LLVM_D_Declare_TypeInfoBase(this, Type::typeinfodelegate);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
778 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
779
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
780 void TypeInfoDelegateDeclaration::llvmDefine()
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
781 {
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
782 Logger::println("TypeInfoDelegateDeclaration::toDt() %s", toChars());
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
783 LOG_SCOPE;
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
784
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
785 assert(tinfo->ty == Tdelegate);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
786 TypeDelegate *tc = (TypeDelegate *)tinfo;
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
787
758
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
788 LLVM_D_Define_TypeInfoBase(tc->nextOf()->nextOf(), this, Type::typeinfodelegate);
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
789 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
790
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
791 void TypeInfoDelegateDeclaration::toDt(dt_t **pdt)
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
792 {
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
793 assert(0);
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
794 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
795
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
796 /* ========================================================================= */
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
797
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
798 void TypeInfoStructDeclaration::llvmDeclare()
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
799 {
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
800 Logger::println("TypeInfoStructDeclaration::llvmDeclare() %s", toChars());
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
801 LOG_SCOPE;
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 assert(tinfo->ty == Tstruct);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
804 TypeStruct *tc = (TypeStruct *)tinfo;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
805 StructDeclaration *sd = tc->sym;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
806 DtoResolveDsymbol(sd);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
807
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
808 ClassDeclaration* base = Type::typeinfostruct;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
809 DtoResolveClass(base);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
810
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
811 // create the symbol
918
a4fcc13da3cd Changed templates and typeinfo to use linkonce linkage instead of weak linkage, this should fix inlining problems, fixing bug #197 . If problems show up, it's easy to change it back by changing the define in mars.h . I'm 95% sure this is safe, given how we handle templates.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 880
diff changeset
812 ir.irGlobal->value = new llvm::GlobalVariable(ir.irGlobal->type.get(), true, TYPEINFO_LINKAGE_TYPE, NULL, toChars(), gIR->module);
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
813 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
814
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
815 void TypeInfoStructDeclaration::llvmDefine()
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
816 {
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
817 Logger::println("TypeInfoStructDeclaration::llvmDefine() %s", toChars());
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
818 LOG_SCOPE;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
819
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
820 assert(tinfo->ty == Tstruct);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
821 TypeStruct *tc = (TypeStruct *)tinfo;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
822 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
823 DtoForceConstInitDsymbol(sd);
72
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 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
826 DtoForceConstInitDsymbol(base);
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
827
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 213
diff changeset
828 const LLStructType* stype = isaStruct(base->type->ir.type->get());
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
829
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
830 // vtbl
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 173
diff changeset
831 std::vector<LLConstant*> sinits;
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 163
diff changeset
832 sinits.push_back(base->ir.irStruct->vtbl);
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
833
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
834 // monitor
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 213
diff changeset
835 sinits.push_back(llvm::ConstantPointerNull::get(getPtrToType(LLType::Int8Ty)));
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
836
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
837 // char[] name
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
838 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
839 sinits.push_back(DtoConstString(name));
110
e8da7856a260 [svn r114] Implemented the ClassInfo.offTi member.
lindquist
parents: 109
diff changeset
840 //Logger::println("************** A");
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
841 assert(sinits.back()->getType() == stype->getElementType(2));
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
842
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
843 // void[] init
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 213
diff changeset
844 const LLPointerType* initpt = getPtrToType(LLType::Int8Ty);
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 173
diff changeset
845 #if 0
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 173
diff changeset
846 // the implementation of TypeInfo_Struct uses this to determine size. :/
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
847 if (sd->zeroInit) // 0 initializer, or the same as the base type
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
848 {
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
849 sinits.push_back(DtoConstSlice(DtoConstSize_t(0), llvm::ConstantPointerNull::get(initpt)));
72
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 else
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 173
diff changeset
852 #endif
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
853 {
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 163
diff changeset
854 size_t cisize = getTypeStoreSize(tc->ir.type->get());
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 173
diff changeset
855 LLConstant* cicast = llvm::ConstantExpr::getBitCast(sd->ir.irStruct->init, 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
856 sinits.push_back(DtoConstSlice(DtoConstSize_t(cisize), cicast));
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
857 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
858
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
859 // toX functions ground work
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
860 FuncDeclaration *fd;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
861 FuncDeclaration *fdx;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
862 TypeFunction *tf;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
863 Type *ta;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
864 Dsymbol *s;
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 static TypeFunction *tftohash;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
867 static TypeFunction *tftostring;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
868
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
869 if (!tftohash)
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 Scope sc;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
872
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
873 tftohash = new TypeFunction(NULL, Type::thash_t, 0, LINKd);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
874 tftohash = (TypeFunction *)tftohash->semantic(0, &sc);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
875
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
876 tftostring = new TypeFunction(NULL, Type::tchar->arrayOf(), 0, LINKd);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
877 tftostring = (TypeFunction *)tftostring->semantic(0, &sc);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
878 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
879
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
880 TypeFunction *tfeqptr;
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 Scope sc;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
883 Arguments *arguments = new Arguments;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
884 Argument *arg = new Argument(STCin, tc->pointerTo(), NULL, NULL);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
885
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
886 arguments->push(arg);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
887 tfeqptr = new TypeFunction(arguments, Type::tint32, 0, LINKd);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
888 tfeqptr = (TypeFunction *)tfeqptr->semantic(0, &sc);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
889 }
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 #if 0
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
892 TypeFunction *tfeq;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
893 {
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
894 Scope sc;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
895 Array *arguments = new Array;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
896 Argument *arg = new Argument(In, tc, NULL, NULL);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
897
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
898 arguments->push(arg);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
899 tfeq = new TypeFunction(arguments, Type::tint32, 0, LINKd);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
900 tfeq = (TypeFunction *)tfeq->semantic(0, &sc);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
901 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
902 #endif
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
903
110
e8da7856a260 [svn r114] Implemented the ClassInfo.offTi member.
lindquist
parents: 109
diff changeset
904 //Logger::println("************** B");
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 213
diff changeset
905 const LLPointerType* ptty = isaPointer(stype->getElementType(4));
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
906 assert(ptty);
72
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::tohash);
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 if (fdx)
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
911 {
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
912 fd = fdx->overloadExactMatch(tftohash);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
913 if (fd) {
132
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
914 DtoForceDeclareDsymbol(fd);
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 163
diff changeset
915 assert(fd->ir.irFunc->func != 0);
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 173
diff changeset
916 LLConstant* c = isaConstant(fd->ir.irFunc->func);
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
917 assert(c);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
918 c = llvm::ConstantExpr::getBitCast(c, ptty);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
919 sinits.push_back(c);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
920 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
921 else {
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
922 //fdx->error("must be declared as extern (D) uint toHash()");
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
923 sinits.push_back(llvm::ConstantPointerNull::get(ptty));
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
924 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
925 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
926 else {
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
927 sinits.push_back(llvm::ConstantPointerNull::get(ptty));
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
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
930 s = search_function(sd, Id::eq);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
931 fdx = s ? s->isFuncDeclaration() : NULL;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
932 for (int i = 0; i < 2; i++)
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
933 {
110
e8da7856a260 [svn r114] Implemented the ClassInfo.offTi member.
lindquist
parents: 109
diff changeset
934 //Logger::println("************** C %d", i);
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
935 ptty = isaPointer(stype->getElementType(5+i));
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
936 if (fdx)
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
937 {
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
938 fd = fdx->overloadExactMatch(tfeqptr);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
939 if (fd) {
132
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
940 DtoForceDeclareDsymbol(fd);
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 163
diff changeset
941 assert(fd->ir.irFunc->func != 0);
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 173
diff changeset
942 LLConstant* c = isaConstant(fd->ir.irFunc->func);
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
943 assert(c);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
944 c = llvm::ConstantExpr::getBitCast(c, ptty);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
945 sinits.push_back(c);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
946 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
947 else {
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
948 //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
949 sinits.push_back(llvm::ConstantPointerNull::get(ptty));
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 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
952 else {
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 s = search_function(sd, Id::cmp);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
957 fdx = s ? s->isFuncDeclaration() : NULL;
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
110
e8da7856a260 [svn r114] Implemented the ClassInfo.offTi member.
lindquist
parents: 109
diff changeset
960 //Logger::println("************** D");
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
961 ptty = isaPointer(stype->getElementType(7));
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
962 s = search_function(sd, Id::tostring);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
963 fdx = s ? s->isFuncDeclaration() : NULL;
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
964 if (fdx)
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
965 {
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
966 fd = fdx->overloadExactMatch(tftostring);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
967 if (fd) {
132
1700239cab2e [svn r136] MAJOR UNSTABLE UPDATE!!!
lindquist
parents: 121
diff changeset
968 DtoForceDeclareDsymbol(fd);
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 163
diff changeset
969 assert(fd->ir.irFunc->func != 0);
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 173
diff changeset
970 LLConstant* c = isaConstant(fd->ir.irFunc->func);
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
971 assert(c);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
972 c = llvm::ConstantExpr::getBitCast(c, ptty);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
973 sinits.push_back(c);
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
974 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
975 else {
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
976 //fdx->error("must be declared as extern (D) char[] toString()");
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
977 sinits.push_back(llvm::ConstantPointerNull::get(ptty));
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
978 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
979 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
980 else {
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
981 sinits.push_back(llvm::ConstantPointerNull::get(ptty));
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
982 }
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
983
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
984 // 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
985 sinits.push_back(DtoConstUint(tc->hasPointers()));
72
d7e764e62462 [svn r76] Fixed: TypeInfo for structs.
lindquist
parents: 71
diff changeset
986
758
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
987 #if DMDV2
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
988
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
989 // const(MemberInfo[]) function(in char[]) xgetMembers;
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
990 sinits.push_back(LLConstant::getNullValue(stype->getElementType(sinits.size())));
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
991
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
992 //void function(void*) xdtor;
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
993 sinits.push_back(LLConstant::getNullValue(stype->getElementType(sinits.size())));
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
994
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
995 //void function(void*) xpostblit;
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
996 sinits.push_back(LLConstant::getNullValue(stype->getElementType(sinits.size())));
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
997
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
998 #endif
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
999
797
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
1000 // create the inititalizer
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
1001 LLConstant* tiInit = llvm::ConstantStruct::get(sinits);
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
1002
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
1003 // refine global type
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
1004 llvm::cast<llvm::OpaqueType>(ir.irGlobal->type.get())->refineAbstractTypeTo(tiInit->getType());
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
1005
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
1006 // set the initializer
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
1007 isaGlobalVar(ir.irGlobal->value)->setInitializer(tiInit);
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1008 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1009
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1010 void TypeInfoStructDeclaration::toDt(dt_t **pdt)
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 assert(0);
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
1013 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
1014
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
1015 /* ========================================================================= */
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
1016
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1017 void TypeInfoClassDeclaration::llvmDeclare()
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1018 {
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1019 Logger::println("TypeInfoClassDeclaration::llvmDeclare() %s", toChars());
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1020 LOG_SCOPE;
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 // init typeinfo class
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1023 ClassDeclaration* base = Type::typeinfoclass;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1024 assert(base);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1025 DtoResolveClass(base);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1026
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1027 // create the symbol
918
a4fcc13da3cd Changed templates and typeinfo to use linkonce linkage instead of weak linkage, this should fix inlining problems, fixing bug #197 . If problems show up, it's easy to change it back by changing the define in mars.h . I'm 95% sure this is safe, given how we handle templates.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 880
diff changeset
1028 ir.irGlobal->value = new llvm::GlobalVariable(ir.irGlobal->type.get(), true, TYPEINFO_LINKAGE_TYPE, NULL, toChars(), gIR->module);
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1029 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1030
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1031 void TypeInfoClassDeclaration::llvmDefine()
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1032 {
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1033 Logger::println("TypeInfoClassDeclaration::llvmDefine() %s", toChars());
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1034 LOG_SCOPE;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1035
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1036 // init typeinfo class
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1037 ClassDeclaration* base = Type::typeinfoclass;
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1038 assert(base);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1039 DtoForceConstInitDsymbol(base);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1040
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1041 // initializer vector
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 173
diff changeset
1042 std::vector<LLConstant*> sinits;
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1043 // first is always the vtable
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 163
diff changeset
1044 sinits.push_back(base->ir.irStruct->vtbl);
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1045
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
1046 // monitor
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 213
diff changeset
1047 sinits.push_back(llvm::ConstantPointerNull::get(getPtrToType(LLType::Int8Ty)));
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
1048
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1049 // get classinfo
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1050 assert(tinfo->ty == Tclass);
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1051 TypeClass *tc = (TypeClass *)tinfo;
163
a8cd9bc1021a [svn r179] lots and lots of fixes, much more of tango now compiles/works.
lindquist
parents: 157
diff changeset
1052 DtoForceDeclareDsymbol(tc->sym);
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 163
diff changeset
1053 assert(tc->sym->ir.irStruct->classInfo);
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 163
diff changeset
1054 sinits.push_back(tc->sym->ir.irStruct->classInfo);
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1055
797
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
1056 // create the inititalizer
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
1057 LLConstant* tiInit = llvm::ConstantStruct::get(sinits);
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
1058
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
1059 // refine global type
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
1060 llvm::cast<llvm::OpaqueType>(ir.irGlobal->type.get())->refineAbstractTypeTo(tiInit->getType());
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
1061
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
1062 // set the initializer
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
1063 isaGlobalVar(ir.irGlobal->value)->setInitializer(tiInit);
106
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
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
1066 void TypeInfoClassDeclaration::toDt(dt_t **pdt)
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
1067 {
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1068 assert(0);
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
1069 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
1070
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
1071 /* ========================================================================= */
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
1072
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1073 void TypeInfoInterfaceDeclaration::llvmDeclare()
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1074 {
113
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1075 Logger::println("TypeInfoInterfaceDeclaration::llvmDeclare() %s", toChars());
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1076 LOG_SCOPE;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1077
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1078 // init typeinfo class
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1079 ClassDeclaration* base = Type::typeinfointerface;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1080 assert(base);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1081 DtoResolveClass(base);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1082
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1083 // create the symbol
918
a4fcc13da3cd Changed templates and typeinfo to use linkonce linkage instead of weak linkage, this should fix inlining problems, fixing bug #197 . If problems show up, it's easy to change it back by changing the define in mars.h . I'm 95% sure this is safe, given how we handle templates.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 880
diff changeset
1084 ir.irGlobal->value = new llvm::GlobalVariable(ir.irGlobal->type.get(), true, TYPEINFO_LINKAGE_TYPE, NULL, toChars(), gIR->module);
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1085 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1086
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1087 void TypeInfoInterfaceDeclaration::llvmDefine()
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1088 {
113
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1089 Logger::println("TypeInfoInterfaceDeclaration::llvmDefine() %s", toChars());
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1090 LOG_SCOPE;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1091
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1092 // init typeinfo class
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1093 ClassDeclaration* base = Type::typeinfointerface;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1094 assert(base);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1095 DtoForceConstInitDsymbol(base);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1096
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1097 // get type of typeinfo class
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 213
diff changeset
1098 const LLStructType* stype = isaStruct(base->type->ir.type->get());
113
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1099
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1100 // initializer vector
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 173
diff changeset
1101 std::vector<LLConstant*> sinits;
113
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1102 // first is always the vtable
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 163
diff changeset
1103 sinits.push_back(base->ir.irStruct->vtbl);
113
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1104
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
1105 // monitor
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 213
diff changeset
1106 sinits.push_back(llvm::ConstantPointerNull::get(getPtrToType(LLType::Int8Ty)));
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
1107
113
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1108 // get classinfo
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1109 assert(tinfo->ty == Tclass);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1110 TypeClass *tc = (TypeClass *)tinfo;
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 163
diff changeset
1111 assert(tc->sym->ir.irStruct->classInfo);
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 163
diff changeset
1112 sinits.push_back(tc->sym->ir.irStruct->classInfo);
113
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1113
797
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
1114 // create the inititalizer
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
1115 LLConstant* tiInit = llvm::ConstantStruct::get(sinits);
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
1116
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
1117 // refine global type
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
1118 llvm::cast<llvm::OpaqueType>(ir.irGlobal->type.get())->refineAbstractTypeTo(tiInit->getType());
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
1119
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
1120 // set the initializer
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
1121 isaGlobalVar(ir.irGlobal->value)->setInitializer(tiInit);
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1122 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1123
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
1124 void TypeInfoInterfaceDeclaration::toDt(dt_t **pdt)
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
1125 {
113
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1126 assert(0);
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
1127 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
1128
58
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
1129 /* ========================================================================= */
2c3cd3596187 [svn r62] Added support for TypeInfo _Array, _Function, _Pointer, _Delegate, _Enum
lindquist
parents: 57
diff changeset
1130
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1131 void TypeInfoTupleDeclaration::llvmDeclare()
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1132 {
113
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1133 Logger::println("TypeInfoTupleDeclaration::llvmDeclare() %s", toChars());
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1134 LOG_SCOPE;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1135
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1136 // init typeinfo class
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1137 ClassDeclaration* base = Type::typeinfotypelist;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1138 assert(base);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1139 DtoResolveClass(base);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1140
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1141 // create the symbol
918
a4fcc13da3cd Changed templates and typeinfo to use linkonce linkage instead of weak linkage, this should fix inlining problems, fixing bug #197 . If problems show up, it's easy to change it back by changing the define in mars.h . I'm 95% sure this is safe, given how we handle templates.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 880
diff changeset
1142 ir.irGlobal->value = new llvm::GlobalVariable(ir.irGlobal->type.get(), true, TYPEINFO_LINKAGE_TYPE, NULL, toChars(), gIR->module);
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1143 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1144
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1145 void TypeInfoTupleDeclaration::llvmDefine()
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1146 {
113
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1147 Logger::println("TypeInfoTupleDeclaration::llvmDefine() %s", toChars());
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1148 LOG_SCOPE;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1149
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1150 // init typeinfo class
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1151 ClassDeclaration* base = Type::typeinfotypelist;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1152 assert(base);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1153 DtoForceConstInitDsymbol(base);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1154
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1155 // get type of typeinfo class
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 213
diff changeset
1156 const LLStructType* stype = isaStruct(base->type->ir.type->get());
113
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1157
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1158 // initializer vector
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 173
diff changeset
1159 std::vector<LLConstant*> sinits;
113
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1160 // first is always the vtable
173
db9890b3fb64 [svn r189] moving IR data back into DMD frontend nodes
ChristianK
parents: 163
diff changeset
1161 sinits.push_back(base->ir.irStruct->vtbl);
113
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1162
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
1163 // monitor
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 213
diff changeset
1164 sinits.push_back(llvm::ConstantPointerNull::get(getPtrToType(LLType::Int8Ty)));
115
5ba6d286c941 [svn r119] Added the monitor data field that comes after the vtable pointer to all classes. Represented as a void* initialized to zero.
lindquist
parents: 113
diff changeset
1165
113
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1166 // create elements array
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1167 assert(tinfo->ty == Ttuple);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1168 TypeTuple *tu = (TypeTuple *)tinfo;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1169
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1170 size_t dim = tu->arguments->dim;
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 173
diff changeset
1171 std::vector<LLConstant*> arrInits;
113
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1172
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 173
diff changeset
1173 const LLType* tiTy = Type::typeinfo->type->ir.type->get();
133
44a95ac7368a [svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
lindquist
parents: 132
diff changeset
1174 tiTy = getPtrToType(tiTy);
113
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1175
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1176 for (size_t i = 0; i < dim; i++)
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1177 {
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1178 Argument *arg = (Argument *)tu->arguments->data[i];
275
665b81613475 [svn r296] Removed: the 'suite' dir, it never took off!
lindquist
parents: 244
diff changeset
1179 LLConstant* castbase = DtoTypeInfoOf(arg->type, true);
665b81613475 [svn r296] Removed: the 'suite' dir, it never took off!
lindquist
parents: 244
diff changeset
1180 assert(castbase->getType() == tiTy);
665b81613475 [svn r296] Removed: the 'suite' dir, it never took off!
lindquist
parents: 244
diff changeset
1181 arrInits.push_back(castbase);
113
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1182 }
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1183
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1184 // build array type
244
a95056b3c996 [svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents: 213
diff changeset
1185 const LLArrayType* arrTy = LLArrayType::get(tiTy, dim);
213
7816aafeea3c [svn r229] Updated the object.d implementation to the latest Tango.
lindquist
parents: 173
diff changeset
1186 LLConstant* arrC = llvm::ConstantArray::get(arrTy, arrInits);
113
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1187
522
cd4eeb6cc5f6 Fix TypeInfo_Tuple array initialization.
Christian Kamm <kamm incasoftware de>
parents: 508
diff changeset
1188 // need the pointer to the first element of arrC, so create a global for it
918
a4fcc13da3cd Changed templates and typeinfo to use linkonce linkage instead of weak linkage, this should fix inlining problems, fixing bug #197 . If problems show up, it's easy to change it back by changing the define in mars.h . I'm 95% sure this is safe, given how we handle templates.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 880
diff changeset
1189 llvm::GlobalValue::LinkageTypes _linkage = llvm::GlobalValue::InternalLinkage;
522
cd4eeb6cc5f6 Fix TypeInfo_Tuple array initialization.
Christian Kamm <kamm incasoftware de>
parents: 508
diff changeset
1190 llvm::GlobalVariable* gvar = new llvm::GlobalVariable(arrTy,true,_linkage,arrC,".tupleelements",gIR->module);
cd4eeb6cc5f6 Fix TypeInfo_Tuple array initialization.
Christian Kamm <kamm incasoftware de>
parents: 508
diff changeset
1191
cd4eeb6cc5f6 Fix TypeInfo_Tuple array initialization.
Christian Kamm <kamm incasoftware de>
parents: 508
diff changeset
1192 // get pointer to first element
cd4eeb6cc5f6 Fix TypeInfo_Tuple array initialization.
Christian Kamm <kamm incasoftware de>
parents: 508
diff changeset
1193 llvm::ConstantInt* zero = DtoConstSize_t(0);
cd4eeb6cc5f6 Fix TypeInfo_Tuple array initialization.
Christian Kamm <kamm incasoftware de>
parents: 508
diff changeset
1194 LLConstant* idxs[2] = { zero, zero };
cd4eeb6cc5f6 Fix TypeInfo_Tuple array initialization.
Christian Kamm <kamm incasoftware de>
parents: 508
diff changeset
1195 LLConstant* arrptr = llvm::ConstantExpr::getGetElementPtr(gvar, idxs, 2);
cd4eeb6cc5f6 Fix TypeInfo_Tuple array initialization.
Christian Kamm <kamm incasoftware de>
parents: 508
diff changeset
1196
113
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1197 // build the slice
522
cd4eeb6cc5f6 Fix TypeInfo_Tuple array initialization.
Christian Kamm <kamm incasoftware de>
parents: 508
diff changeset
1198 LLConstant* slice = DtoConstSlice(DtoConstSize_t(dim), arrptr);
113
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1199 sinits.push_back(slice);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1200
797
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
1201 // create the inititalizer
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
1202 LLConstant* tiInit = llvm::ConstantStruct::get(sinits);
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
1203
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
1204 // refine global type
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
1205 llvm::cast<llvm::OpaqueType>(ir.irGlobal->type.get())->refineAbstractTypeTo(tiInit->getType());
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
1206
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
1207 // set the initializer
340acf1535d0 Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 796
diff changeset
1208 isaGlobalVar(ir.irGlobal->value)->setInitializer(tiInit);
106
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1209 }
5b5194b25f33 [svn r110] Fixed typeinfo for classes.
lindquist
parents: 105
diff changeset
1210
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
1211 void TypeInfoTupleDeclaration::toDt(dt_t **pdt)
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
1212 {
113
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents: 110
diff changeset
1213 assert(0);
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 4
diff changeset
1214 }
758
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1215
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1216 /* ========================================================================= */
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1217
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1218 #if DMDV2
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1219
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1220 void TypeInfoConstDeclaration::llvmDeclare()
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1221 {
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1222 Logger::println("TypeInfoConstDeclaration::toDt() %s", toChars());
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1223 LOG_SCOPE;
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1224
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1225 LLVM_D_Declare_TypeInfoBase(this, Type::typeinfoconst);
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1226 }
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1227
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1228 void TypeInfoConstDeclaration::llvmDefine()
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1229 {
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1230 Logger::println("TypeInfoConstDeclaration::toDt() %s", toChars());
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1231 LOG_SCOPE;
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1232
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1233 Type *tm = tinfo->mutableOf();
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1234 tm = tm->merge();
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1235
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1236 LLVM_D_Define_TypeInfoBase(tm, this, Type::typeinfoconst);
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1237 }
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1238
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1239 void TypeInfoConstDeclaration::toDt(dt_t **pdt)
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1240 {
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1241 assert(0);
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1242 }
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1243
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1244 ///////////////////////////////////////////////////////////
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1245
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1246 /* ========================================================================= */
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1247
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1248 void TypeInfoInvariantDeclaration::llvmDeclare()
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1249 {
761
fa306ca8843b Applied fvbommel's patch from #112
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 758
diff changeset
1250 Logger::println("TypeInfoInvariantDeclaration::toDt() %s", toChars());
fa306ca8843b Applied fvbommel's patch from #112
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 758
diff changeset
1251 LOG_SCOPE;
fa306ca8843b Applied fvbommel's patch from #112
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 758
diff changeset
1252
fa306ca8843b Applied fvbommel's patch from #112
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 758
diff changeset
1253 LLVM_D_Declare_TypeInfoBase(this, Type::typeinfoinvariant);
758
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1254 }
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1255
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1256 void TypeInfoInvariantDeclaration::llvmDefine()
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1257 {
761
fa306ca8843b Applied fvbommel's patch from #112
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 758
diff changeset
1258 Logger::println("TypeInfoInvariantDeclaration::toDt() %s", toChars());
fa306ca8843b Applied fvbommel's patch from #112
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 758
diff changeset
1259 LOG_SCOPE;
fa306ca8843b Applied fvbommel's patch from #112
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 758
diff changeset
1260
fa306ca8843b Applied fvbommel's patch from #112
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 758
diff changeset
1261 Type *tm = tinfo->mutableOf();
fa306ca8843b Applied fvbommel's patch from #112
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 758
diff changeset
1262 tm = tm->merge();
fa306ca8843b Applied fvbommel's patch from #112
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 758
diff changeset
1263
fa306ca8843b Applied fvbommel's patch from #112
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 758
diff changeset
1264 LLVM_D_Define_TypeInfoBase(tm, this, Type::typeinfoinvariant);
758
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1265 }
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1266
761
fa306ca8843b Applied fvbommel's patch from #112
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 758
diff changeset
1267 void TypeInfoInvariantDeclaration::toDt(dt_t **pdt)
fa306ca8843b Applied fvbommel's patch from #112
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 758
diff changeset
1268 {
fa306ca8843b Applied fvbommel's patch from #112
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 758
diff changeset
1269 assert(0);
fa306ca8843b Applied fvbommel's patch from #112
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 758
diff changeset
1270 }
758
f04dde6e882c Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 663
diff changeset
1271
766
af04bbae8553 D2: Fixed global constants not initialized until module constructor.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 764
diff changeset
1272 #endif