annotate dmd/mangle.c @ 1650:40bd4a0d4870

Update to work with LLVM 2.7. Removed use of dyn_cast, llvm no compiles without exceptions and rtti by default. We do need exceptions for the libconfig stuff, but rtti isn't necessary (anymore). Debug info needs to be rewritten, as in LLVM 2.7 the format has completely changed. To have something to look at while rewriting, the old code has been wrapped inside #ifndef DISABLE_DEBUG_INFO , this means that you have to define this to compile at the moment. Updated tango 0.99.9 patch to include updated EH runtime code, which is needed for LLVM 2.7 as well.
author Tomas Lindquist Olsen
date Wed, 19 May 2010 12:42:32 +0200
parents 44b145be2ef5
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2 // Compiler implementation of the D programming language
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3 // Copyright (c) 1999-2009 by Digital Mars
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
4 // All Rights Reserved
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
5 // written by Walter Bright
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
6 // http://www.digitalmars.com
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
7 // License for redistribution is by either the Artistic License
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
8 // in artistic.txt, or the GNU General Public License in gnu.txt.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
9 // See the included readme.txt for details.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
10
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
11 #include <stdio.h>
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
12 #include <string.h>
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
13 #include <ctype.h>
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
14 #include <assert.h>
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
15
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
16 #include "root.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
17
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
18 #include "init.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
19 #include "declaration.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
20 #include "aggregate.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
21 #include "mtype.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
22 #include "attrib.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
23 #include "template.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
24 #include "id.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
25 #include "module.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
26
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
27 #if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_SOLARIS
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
28 char *cpp_mangle(Dsymbol *s);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
29 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
30
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
31 char *mangle(Declaration *sthis)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
32 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
33 OutBuffer buf;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
34 char *id;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
35 Dsymbol *s;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
36
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
37 //printf("::mangle(%s)\n", sthis->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
38 s = sthis;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
39 do
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
40 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
41 //printf("mangle: s = %p, '%s', parent = %p\n", s, s->toChars(), s->parent);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
42 if (s->ident)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
43 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
44 FuncDeclaration *fd = s->isFuncDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
45 if (s != sthis && fd)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
46 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
47 id = mangle(fd);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
48 buf.prependstring(id);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
49 goto L1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
50 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
51 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
52 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
53 id = s->ident->toChars();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
54 int len = strlen(id);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
55 char tmp[sizeof(len) * 3 + 1];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
56 buf.prependstring(id);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
57 sprintf(tmp, "%d", len);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
58 buf.prependstring(tmp);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
59 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
60 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
61 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
62 buf.prependstring("0");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
63 s = s->parent;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
64 } while (s);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
65
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
66 // buf.prependstring("_D");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
67 L1:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
68 //printf("deco = '%s'\n", sthis->type->deco ? sthis->type->deco : "null");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
69 //printf("sthis->type = %s\n", sthis->type->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
70 FuncDeclaration *fd = sthis->isFuncDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
71 if (fd && (fd->needThis() || fd->isNested()))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
72 buf.writeByte(Type::needThisPrefix());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
73 if (sthis->type->deco)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
74 buf.writestring(sthis->type->deco);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
75 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
76 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
77 #ifdef DEBUG
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
78 if (!fd->inferRetType)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
79 printf("%s\n", fd->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
80 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
81 assert(fd && fd->inferRetType);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
82 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
83
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
84 id = buf.toChars();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
85 buf.data = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
86 return id;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
87 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
88
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
89 char *Declaration::mangle()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
90 #if __DMC__
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
91 __out(result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
92 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
93 int len = strlen(result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
94
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
95 assert(len > 0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
96 //printf("mangle: '%s' => '%s'\n", toChars(), result);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
97 for (int i = 0; i < len; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
98 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
99 assert(result[i] == '_' ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
100 result[i] == '@' ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
101 isalnum(result[i]) || result[i] & 0x80);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
102 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
103 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
104 __body
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
105 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
106 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
107 //printf("Declaration::mangle(this = %p, '%s', parent = '%s', linkage = %d)\n", this, toChars(), parent ? parent->toChars() : "null", linkage);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
108 if (!parent || parent->isModule()) // if at global scope
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
109 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
110 // If it's not a D declaration, no mangling
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
111 switch (linkage)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
112 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
113 case LINKd:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
114 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
115
1630
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1587
diff changeset
116 #if IN_LLVM
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
117 case LINKintrinsic:
1630
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1587
diff changeset
118 #endif
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
119 case LINKc:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
120 case LINKwindows:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
121 case LINKpascal:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
122 return ident->toChars();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
123
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
124 case LINKcpp:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
125 #if DMDV2 && (TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_SOLARIS)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
126 return cpp_mangle(this);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
127 #else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
128 // Windows C++ mangling is done by C++ back end
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
129 return ident->toChars();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
130 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
131
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
132 case LINKdefault:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
133 error("forward declaration");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
134 return ident->toChars();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
135
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
136 default:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
137 fprintf(stdmsg, "'%s', linkage = %d\n", toChars(), linkage);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
138 assert(0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
139 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
140 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
141 char *p = ::mangle(this);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
142 OutBuffer buf;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
143 buf.writestring("_D");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
144 buf.writestring(p);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
145 p = buf.toChars();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
146 buf.data = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
147 //printf("Declaration::mangle(this = %p, '%s', parent = '%s', linkage = %d) = %s\n", this, toChars(), parent ? parent->toChars() : "null", linkage, p);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
148 return p;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
149 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
150
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
151 char *FuncDeclaration::mangle()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
152 #if __DMC__
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
153 __out(result)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
154 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
155 assert(strlen(result) > 0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
156 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
157 __body
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
158 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
159 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
160 if (isMain())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
161 return (char *)"_Dmain";
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
162
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
163 if (isWinMain() || isDllMain())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
164 return ident->toChars();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
165
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
166 assert(this);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
167 return Declaration::mangle();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
168 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
169
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
170 char *StructDeclaration::mangle()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
171 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
172 //printf("StructDeclaration::mangle() '%s'\n", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
173 return Dsymbol::mangle();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
174 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
175
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
176
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
177 char *TypedefDeclaration::mangle()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
178 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
179 //printf("TypedefDeclaration::mangle() '%s'\n", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
180 return Dsymbol::mangle();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
181 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
182
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
183
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
184 char *ClassDeclaration::mangle()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
185 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
186 Dsymbol *parentsave = parent;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
187
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
188 //printf("ClassDeclaration::mangle() %s.%s\n", parent->toChars(), toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
189
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
190 /* These are reserved to the compiler, so keep simple
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
191 * names for them.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
192 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
193 if (ident == Id::Exception)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
194 { if (parent->ident == Id::object)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
195 parent = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
196 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
197 else if (ident == Id::TypeInfo ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
198 // ident == Id::Exception ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
199 ident == Id::TypeInfo_Struct ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
200 ident == Id::TypeInfo_Class ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
201 ident == Id::TypeInfo_Typedef ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
202 ident == Id::TypeInfo_Tuple ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
203 this == object ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
204 this == classinfo ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
205 this == Module::moduleinfo ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
206 memcmp(ident->toChars(), "TypeInfo_", 9) == 0
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
207 )
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
208 parent = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
209
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
210 char *id = Dsymbol::mangle();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
211 parent = parentsave;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
212 return id;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
213 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
214
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
215
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
216 char *TemplateInstance::mangle()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
217 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
218 OutBuffer buf;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
219 char *id;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
220
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
221 #if 0
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
222 printf("TemplateInstance::mangle() %s", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
223 if (parent)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
224 printf(" parent = %s %s", parent->kind(), parent->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
225 printf("\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
226 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
227 id = ident ? ident->toChars() : toChars();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
228 if (!tempdecl)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
229 error("is not defined");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
230 else if (tempdecl->parent)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
231 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
232 char *p = tempdecl->parent->mangle();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
233 if (p[0] == '_' && p[1] == 'D')
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
234 p += 2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
235 buf.writestring(p);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
236 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
237 buf.printf("%zu%s", strlen(id), id);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
238 id = buf.toChars();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
239 buf.data = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
240 //printf("TemplateInstance::mangle() %s = %s\n", toChars(), id);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
241 return id;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
242 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
243
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
244
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
245 char *TemplateMixin::mangle()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
246 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
247 OutBuffer buf;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
248 char *id;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
249
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
250 #if 0
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
251 printf("TemplateMixin::mangle() %s", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
252 if (parent)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
253 printf(" parent = %s %s", parent->kind(), parent->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
254 printf("\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
255 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
256 id = ident ? ident->toChars() : toChars();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
257 if (parent)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
258 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
259 char *p = parent->mangle();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
260 if (p[0] == '_' && p[1] == 'D')
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
261 p += 2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
262 buf.writestring(p);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
263 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
264 buf.printf("%zu%s", strlen(id), id);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
265 id = buf.toChars();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
266 buf.data = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
267 //printf("TemplateMixin::mangle() %s = %s\n", toChars(), id);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
268 return id;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
269 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
270
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
271 char *Dsymbol::mangle()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
272 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
273 OutBuffer buf;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
274 char *id;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
275
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
276 #if 0
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
277 printf("Dsymbol::mangle() '%s'", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
278 if (parent)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
279 printf(" parent = %s %s", parent->kind(), parent->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
280 printf("\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
281 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
282 id = ident ? ident->toChars() : toChars();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
283 if (parent)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
284 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
285 char *p = parent->mangle();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
286 if (p[0] == '_' && p[1] == 'D')
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
287 p += 2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
288 buf.writestring(p);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
289 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
290 buf.printf("%zu%s", strlen(id), id);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
291 id = buf.toChars();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
292 buf.data = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
293 //printf("Dsymbol::mangle() %s = %s\n", toChars(), id);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
294 return id;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
295 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
296
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
297