annotate dmd2/mangle.c @ 1577:e4f7b5d9c68a

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