annotate dmd/PragmaDeclaration.d @ 178:e3afd1303184

Many small bugs fixed Made all classes derive from TObject to detect memory leaks (functionality is disabled for now) Began work on overriding backend memory allocations (to avoid memory leaks)
author korDen
date Sun, 17 Oct 2010 07:42:00 +0400
parents 438eaa11eed4
children 0622fff7810a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1 module dmd.PragmaDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2
114
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 95
diff changeset
3 import dmd.common;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4 import dmd.ArrayTypes;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5 import dmd.AttribDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6 import dmd.Loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
7 import dmd.Identifier;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
8 import dmd.StringExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
9 import dmd.TOK;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
10 import dmd.WANT;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
11 import dmd.Global;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
12 import dmd.Id;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
13 import dmd.Array;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
14 import dmd.Dsymbol;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
15 import dmd.Scope;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
16 import dmd.OutBuffer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
17 import dmd.HdrGenState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
18 import dmd.Expression;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
19 import dmd.FuncDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
20
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
21 import dmd.backend.Util;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
22 import dmd.backend.Symbol;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
23
4
d706d958e4e8 Step 2 of restoring GC functionality.
korDen
parents: 2
diff changeset
24 import core.memory;
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
25
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
26 class PragmaDeclaration : AttribDeclaration
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
27 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
28 Expressions args; // array of Expression's
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
29
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 72
diff changeset
30 this(Loc loc, Identifier ident, Expressions args, Dsymbols decl)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
31 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 162
diff changeset
32 register();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
33 super(decl);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
34 this.loc = loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
35 this.ident = ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
36 this.args = args;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
37 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
38
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 22
diff changeset
39 override Dsymbol syntaxCopy(Dsymbol s)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
40 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
41 //printf("PragmaDeclaration.syntaxCopy(%s)\n", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
42 PragmaDeclaration pd;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
43
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
44 assert(!s);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
45 pd = new PragmaDeclaration(loc, ident, Expression.arraySyntaxCopy(args), Dsymbol.arraySyntaxCopy(decl));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
46 return pd;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
47 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
48
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 22
diff changeset
49 override void semantic(Scope sc)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
50 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
51 // Should be merged with PragmaStatement
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
52
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
53 //printf("\tPragmaDeclaration.semantic '%s'\n",toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
54 if (ident == Id.msg)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
55 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
56 if (args)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
57 {
90
39648eb578f6 more Expressions work
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 84
diff changeset
58 foreach (e; args)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
59 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
60 e = e.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
61 e = e.optimize(WANTvalue | WANTinterpret);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
62 if (e.op == TOKstring)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
63 {
90
39648eb578f6 more Expressions work
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 84
diff changeset
64 auto se = cast(StringExp)e;
136
9d194c848e3a fixed a few null reference bugs, thx sagitario
Trass3r
parents: 130
diff changeset
65 writef("%s", se.toChars()[1..$-2]); // strip the '"'s, TODO: change to original?: /*se.len, cast(char*)se.string_*/
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
66 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
67 else
95
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 90
diff changeset
68 writef(e.toChars());
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
69 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
70 writef("\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
71 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
72 goto Lnodecl;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
73 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
74 else if (ident == Id.lib)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
75 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
76 if (!args || args.dim != 1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
77 error("string expected for library name");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
78 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
79 {
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 77
diff changeset
80 auto e = args[0];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
81
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
82 e = e.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
83 e = e.optimize(WANTvalue | WANTinterpret);
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 77
diff changeset
84 args[0] = e;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
85 if (e.op != TOKstring)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
86 error("string expected for library name, not '%s'", e.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
87 else if (global.params.verbose)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
88 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
89 StringExp se = cast(StringExp)e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
90 writef("library %.*s\n", cast(int)se.len, cast(char*)se.string_);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
91 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
92 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
93 goto Lnodecl;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
94 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
95 /// version (IN_GCC) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
96 /// else if (ident == Id.GNU_asm)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
97 /// {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
98 /// if (! args || args.dim != 2)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
99 /// error("identifier and string expected for asm name");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
100 /// else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
101 /// {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
102 /// Expression *e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
103 /// Declaration *d = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
104 /// StringExp *s = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
105 ///
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
106 /// e = (Expression *)args.data[0];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
107 /// e = e.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
108 /// if (e.op == TOKvar)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
109 /// {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
110 /// d = ((VarExp *)e).var;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
111 /// if (! d.isFuncDeclaration() && ! d.isVarDeclaration())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
112 /// d = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
113 /// }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
114 /// if (!d)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
115 /// error("first argument of GNU_asm must be a function or variable declaration");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
116 ///
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
117 /// e = (Expression *)args.data[1];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
118 /// e = e.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
119 /// e = e.optimize(WANTvalue);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
120 /// if (e.op == TOKstring && ((StringExp *)e).sz == 1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
121 /// s = ((StringExp *)e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
122 /// else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
123 /// error("second argument of GNU_asm must be a char string");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
124 ///
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
125 /// if (d && s)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
126 /// d.c_ident = Lexer.idPool((char*) s.string);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
127 /// }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
128 /// goto Lnodecl;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
129 /// }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
130 /// }
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 116
diff changeset
131 ///version(DMDV2) {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
132 else if (ident == Id.startaddress)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
133 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
134 if (!args || args.dim != 1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
135 error("function name expected for start address");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
136 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
137 {
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 77
diff changeset
138 auto e = args[0];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
139 e = e.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
140 e = e.optimize(WANTvalue | WANTinterpret);
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 77
diff changeset
141 args[0] = e;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
142 Dsymbol sa = getDsymbol(e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
143 if (!sa || !sa.isFuncDeclaration())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
144 error("function name expected for start address, not '%s'", e.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
145 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
146 goto Lnodecl;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
147 }
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 116
diff changeset
148 ///}
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
149 /// version (TARGET_NET) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
150 /// else if (ident == Lexer.idPool("assembly"))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
151 /// {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
152 /// }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
153 /// } // TARGET_NET
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
154 else if (global.params.ignoreUnsupportedPragmas)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
155 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
156 if (global.params.verbose)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
157 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
158 /* Print unrecognized pragmas
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
159 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
160 writef("pragma %s", ident.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
161 if (args)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
162 {
90
39648eb578f6 more Expressions work
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 84
diff changeset
163 foreach (size_t i, Expression e; args)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
164 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
165 e = e.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
166 e = e.optimize(WANTvalue | WANTinterpret);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
167 if (i == 0)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
168 writef(" (");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
169 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
170 writef(",");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
171 writef("%s", e.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
172 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
173 if (args.dim)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
174 writef(")");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
175 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
176 writef("\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
177 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
178 goto Lnodecl;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
179 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
180 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
181 error("unrecognized pragma(%s)", ident.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
182
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
183 if (decl)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
184 {
77
ad4792a1cfd6 more D-ification container accessing
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 74
diff changeset
185 foreach(Dsymbol s; decl)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
186 s.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
187 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
188 return;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
189
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
190 Lnodecl:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
191 if (decl)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
192 error("pragma is missing closing ';'");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
193 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
194
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 22
diff changeset
195 override void setScope(Scope sc)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
196 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
197 version (TARGET_NET) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
198 if (ident == Lexer.idPool("assembly"))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
199 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
200 if (!args || args.dim != 1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
201 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
202 error("pragma has invalid number of arguments");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
203 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
204 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
205 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
206 Expression e = cast(Expression)args.data[0];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
207 e = e.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
208 e = e.optimize(WANTvalue | WANTinterpret);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
209 args.data[0] = cast(void*)e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
210 if (e.op != TOKstring)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
211 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
212 error("string expected, not '%s'", e.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
213 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
214 PragmaScope pragma_ = new PragmaScope(this, sc.parent, cast(StringExp)e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
215
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
216 assert(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
217 pragma_.setScope(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
218
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
219 //add to module members
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
220 assert(sc.module_);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
221 assert(sc.module_.members);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
222 sc.module_.members.push(cast(void*)pragma_);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
223 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
224 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
225 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
226 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
227
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 22
diff changeset
228 override bool oneMember(Dsymbol* ps)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
229 {
162
438eaa11eed4 updated build script to use dmd2.039
korDen
parents: 136
diff changeset
230 *ps = null;
438eaa11eed4 updated build script to use dmd2.039
korDen
parents: 136
diff changeset
231 return true;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
232 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
233
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 22
diff changeset
234 override void toCBuffer(OutBuffer buf, HdrGenState* hgs)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
235 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
236 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
237 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
238
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 22
diff changeset
239 override string kind()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
240 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
241 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
242 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
243
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 22
diff changeset
244 override void toObjFile(int multiobj) // compile to .obj file
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
245 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
246 if (ident == Id.lib)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
247 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
248 assert(args && args.dim == 1);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
249
90
39648eb578f6 more Expressions work
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 84
diff changeset
250 auto e = args[0];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
251
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
252 assert(e.op == TOKstring);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
253
90
39648eb578f6 more Expressions work
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 84
diff changeset
254 auto se = cast(StringExp)e;
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
255 char* name = cast(char*)GC.malloc(se.len + 1);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
256 memcpy(name, se.string_, se.len);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
257 name[se.len] = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
258 version (OMFOBJ) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
259 /* The OMF format allows library names to be inserted
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
260 * into the object file. The linker will then automatically
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
261 * search that library, too.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
262 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
263 obj_includelib(name);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
264 } else version (ELFOBJ_OR_MACHOBJ) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
265 /* The format does not allow embedded library names,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
266 * so instead append the library name to the list to be passed
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
267 * to the linker.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
268 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
269 global.params.libfiles.push(cast(void*) name);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
270 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
271 error("pragma lib not supported");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
272 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
273 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
274 /// version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
275 else if (ident == Id.startaddress)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
276 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
277 assert(args && args.dim == 1);
90
39648eb578f6 more Expressions work
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 84
diff changeset
278 auto e = args[0];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
279 Dsymbol sa = getDsymbol(e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
280 FuncDeclaration f = sa.isFuncDeclaration();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
281 assert(f);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
282 Symbol* s = f.toSymbol();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
283 obj_startaddress(s);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
284 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
285 /// }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
286 AttribDeclaration.toObjFile(multiobj);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
287 }
22
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 4
diff changeset
288 }