Mercurial > hg-old > index.cgi
annotate lwasm/pass1.c @ 448:5cccf90bf838 3.0 tip
Fixed bug with complex external references generating invalid relocations in the object file
author | lost@l-w.ca |
---|---|
date | Fri, 05 Nov 2010 22:27:00 -0600 |
parents | 4b137a8cf32a |
children |
rev | line source |
---|---|
332 | 1 /* |
2 pass1.c | |
3 | |
4 Copyright © 2010 William Astle | |
5 | |
6 This file is part of LWTOOLS. | |
7 | |
8 LWTOOLS is free software: you can redistribute it and/or modify it under the | |
9 terms of the GNU General Public License as published by the Free Software | |
10 Foundation, either version 3 of the License, or (at your option) any later | |
11 version. | |
12 | |
13 This program is distributed in the hope that it will be useful, but WITHOUT | |
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | |
16 more details. | |
17 | |
18 You should have received a copy of the GNU General Public License along with | |
19 this program. If not, see <http://www.gnu.org/licenses/>. | |
20 */ | |
21 | |
22 #include <config.h> | |
23 | |
24 #include <stdio.h> | |
346
a82c55070624
Added expression parsing infrastructure and misc fixes
lost@starbug
parents:
345
diff
changeset
|
25 #include <string.h> |
332 | 26 |
27 #include <lw_alloc.h> | |
342 | 28 #include <lw_string.h> |
332 | 29 |
30 #include "lwasm.h" | |
342 | 31 #include "instab.h" |
332 | 32 #include "input.h" |
33 | |
389
fbb7bfed8076
Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents:
385
diff
changeset
|
34 extern int expand_macro(asmstate_t *as, line_t *l, char **p, char *opc); |
fbb7bfed8076
Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents:
385
diff
changeset
|
35 extern int expand_struct(asmstate_t *as, line_t *l, char **p, char *opc); |
fbb7bfed8076
Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents:
385
diff
changeset
|
36 |
337 | 37 /* |
38 pass 1: parse the lines | |
340 | 39 |
40 line format: | |
41 | |
42 [<symbol>] <opcode> <operand>[ <comment>] | |
43 | |
44 If <symbol> is followed by a :, whitespace may precede the symbol | |
45 | |
46 A line may optionally start with a number which must not be preceded by | |
47 white space and must be followed by a single whitespace character. After | |
48 that whitespace character, the line is parsed as if it had no line number. | |
49 | |
337 | 50 */ |
332 | 51 void do_pass1(asmstate_t *as) |
52 { | |
53 char *line; | |
337 | 54 line_t *cl; |
340 | 55 char *p1; |
342 | 56 int stspace; |
340 | 57 char *tok, *sym; |
58 int opnum; | |
383
848d3cca8078
Fixed imm8 to actually use expression and also fixed gen mode to respect > and <
lost@starbug
parents:
382
diff
changeset
|
59 int lc = 1; |
332 | 60 for (;;) |
61 { | |
340 | 62 sym = NULL; |
332 | 63 line = input_readline(as); |
64 if (!line) | |
65 break; | |
345
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
66 if (line[0] == 1 && line[1] == 1) |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
67 { |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
68 // special internal directive |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
69 // these DO NOT appear in the output anywhere |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
70 // they are generated by the parser to pass information |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
71 // forward |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
72 for (p1 = line + 2; *p1 && !isspace(*p1); p1++) |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
73 /* do nothing */ ; |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
74 *p1++ = '\0'; |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
75 if (!strcmp(line + 2, "SETCONTEXT")) |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
76 { |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
77 as -> context = strtol(p1, NULL, 10); |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
78 } |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
79 lw_free(line); |
383
848d3cca8078
Fixed imm8 to actually use expression and also fixed gen mode to respect > and <
lost@starbug
parents:
382
diff
changeset
|
80 lc = 1; |
345
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
81 continue; |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
82 } |
372
90de73ba0cac
Created a useful debug framework and adjusted lw_expr_print() to return a "static" dynamic string
lost@starbug
parents:
370
diff
changeset
|
83 debug_message(as, 75, "Read line: %s", line); |
337 | 84 |
85 cl = lw_alloc(sizeof(line_t)); | |
346
a82c55070624
Added expression parsing infrastructure and misc fixes
lost@starbug
parents:
345
diff
changeset
|
86 memset(cl, 0, sizeof(line_t)); |
374 | 87 cl -> outputl = -1; |
383
848d3cca8078
Fixed imm8 to actually use expression and also fixed gen mode to respect > and <
lost@starbug
parents:
382
diff
changeset
|
88 cl -> linespec = lw_strdup(input_curspec(as)); |
337 | 89 cl -> prev = as -> line_tail; |
90 cl -> insn = -1; | |
346
a82c55070624
Added expression parsing infrastructure and misc fixes
lost@starbug
parents:
345
diff
changeset
|
91 cl -> as = as; |
354 | 92 cl -> inmod = as -> inmod; |
93 cl -> csect = as -> csect; | |
360
7d91ab7ac7d6
Indexed stage 2; set line structure to track pragmas in effect for that line
lost@starbug
parents:
354
diff
changeset
|
94 cl -> pragmas = as -> pragmas; |
363
d96c30e60ddf
Added pass2 and various supporting logic including symbol lookups
lost@starbug
parents:
360
diff
changeset
|
95 cl -> context = as -> context; |
382 | 96 cl -> ltext = lw_strdup(line); |
389
fbb7bfed8076
Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents:
385
diff
changeset
|
97 cl -> soff = -1; |
fbb7bfed8076
Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents:
385
diff
changeset
|
98 cl -> dshow = -1; |
fbb7bfed8076
Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents:
385
diff
changeset
|
99 cl -> dsize = 0; |
fbb7bfed8076
Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents:
385
diff
changeset
|
100 cl -> dptr = NULL; |
418 | 101 cl -> isbrpt = 0; |
385 | 102 as -> cl = cl; |
337 | 103 if (!as -> line_tail) |
104 { | |
105 as -> line_head = cl; | |
106 cl -> addr = lw_expr_build(lw_expr_type_int, 0); | |
107 } | |
108 else | |
109 { | |
110 lw_expr_t te; | |
351 | 111 |
383
848d3cca8078
Fixed imm8 to actually use expression and also fixed gen mode to respect > and <
lost@starbug
parents:
382
diff
changeset
|
112 cl -> lineno = as -> line_tail -> lineno + 1; |
337 | 113 as -> line_tail -> next = cl; |
351 | 114 |
115 // set the line address | |
337 | 116 te = lw_expr_build(lw_expr_type_special, lwasm_expr_linelen, cl -> prev); |
117 cl -> addr = lw_expr_build(lw_expr_type_oper, lw_expr_oper_plus, cl -> prev -> addr, te); | |
118 lw_expr_destroy(te); | |
385 | 119 lwasm_reduce_expr(as, cl -> addr); |
120 // lw_expr_simplify(cl -> addr, as); | |
351 | 121 |
122 // carry DP value forward | |
123 cl -> dpval = cl -> prev -> dpval; | |
383
848d3cca8078
Fixed imm8 to actually use expression and also fixed gen mode to respect > and <
lost@starbug
parents:
382
diff
changeset
|
124 |
848d3cca8078
Fixed imm8 to actually use expression and also fixed gen mode to respect > and <
lost@starbug
parents:
382
diff
changeset
|
125 } |
848d3cca8078
Fixed imm8 to actually use expression and also fixed gen mode to respect > and <
lost@starbug
parents:
382
diff
changeset
|
126 if (!lc && strcmp(cl -> linespec, cl -> prev -> linespec)) |
848d3cca8078
Fixed imm8 to actually use expression and also fixed gen mode to respect > and <
lost@starbug
parents:
382
diff
changeset
|
127 lc = 1; |
848d3cca8078
Fixed imm8 to actually use expression and also fixed gen mode to respect > and <
lost@starbug
parents:
382
diff
changeset
|
128 if (lc) |
848d3cca8078
Fixed imm8 to actually use expression and also fixed gen mode to respect > and <
lost@starbug
parents:
382
diff
changeset
|
129 { |
848d3cca8078
Fixed imm8 to actually use expression and also fixed gen mode to respect > and <
lost@starbug
parents:
382
diff
changeset
|
130 cl -> lineno = 1; |
848d3cca8078
Fixed imm8 to actually use expression and also fixed gen mode to respect > and <
lost@starbug
parents:
382
diff
changeset
|
131 lc = 0; |
337 | 132 } |
133 as -> line_tail = cl; | |
340 | 134 // blank lines don't count for anything |
345
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
135 // except a local symbol context break |
340 | 136 if (!*line) |
137 { | |
345
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
138 as -> context = lwasm_next_context(as); |
340 | 139 goto nextline; |
140 } | |
141 | |
142 // skip comments | |
345
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
143 // commends do not create a context break |
340 | 144 if (*line == '*' || *line == ';' || *line == '#') |
145 goto nextline; | |
146 | |
147 p1 = line; | |
148 if (isdigit(*p1)) | |
149 { | |
150 // skip line number | |
151 while (*p1 && isdigit(*p1)) | |
152 p1++; | |
153 if (!*p1 && !isspace(*p1)) | |
154 p1 = line; | |
411
cac204676434
Allow symbols to start with digits if they contain $, ?, or @; numbered locals
lost@l-w.ca
parents:
410
diff
changeset
|
155 else if (*p1 && !isspace(*p1)) |
cac204676434
Allow symbols to start with digits if they contain $, ?, or @; numbered locals
lost@l-w.ca
parents:
410
diff
changeset
|
156 p1 = line; |
340 | 157 else if (*p1 && isspace(*p1)) |
158 p1++; | |
159 } | |
160 | |
345
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
161 // blank line - context break |
340 | 162 if (!*p1) |
345
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
163 { |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
164 as -> context = lwasm_next_context(as); |
340 | 165 goto nextline; |
345
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
166 } |
340 | 167 |
345
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
168 // comment - no context break |
340 | 169 if (*p1 == '*' || *p1 == ';' || *p1 == '#') |
170 goto nextline; | |
171 | |
172 if (isspace(*p1)) | |
173 { | |
174 for (; *p1 && isspace(*p1); p1++) | |
175 /* do nothing */ ; | |
176 stspace = 1; | |
177 } | |
178 else | |
179 stspace = 0; | |
180 | |
345
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
181 if (*p1 == '*' || *p1 == ';' || *p1 == '#') |
340 | 182 goto nextline; |
345
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
183 if (!*p1) |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
184 { |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
185 // nothing but whitespace - context break |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
186 as -> context = lwasm_next_context(as); |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
187 goto nextline; |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
188 } |
340 | 189 |
342 | 190 // find the end of the first token |
410 | 191 for (tok = p1; *p1 && !isspace(*p1) && *p1 != ':' && *p1 != '='; p1++) |
340 | 192 /* do nothing */ ; |
193 | |
410 | 194 if (*p1 == ':' || *p1 == '=' || stspace == 0) |
340 | 195 { |
196 // have a symbol here | |
197 sym = lw_strndup(tok, p1 - tok); | |
198 if (*p1 == ':') | |
199 p1++; | |
200 for (; *p1 && isspace(*p1); p1++) | |
201 /* do nothing */ ; | |
202 | |
410 | 203 if (*p1 == '=') |
204 { | |
205 tok = p1++; | |
206 } | |
207 else | |
208 { | |
209 for (tok = p1; *p1 && !isspace(*p1); p1++) | |
210 /* do nothing */ ; | |
211 } | |
340 | 212 } |
418 | 213 if (sym && strcmp(sym, "!") == 0) |
214 cl -> isbrpt = 1; | |
215 else if (sym) | |
370 | 216 cl -> sym = lw_strdup(sym); |
340 | 217 cl -> symset = 0; |
218 | |
219 // tok points to the opcode for the line or NUL if none | |
220 if (*tok) | |
221 { | |
222 // look up operation code | |
223 sym = lw_strndup(tok, p1 - tok); | |
370 | 224 for (; *p1 && isspace(*p1); p1++) |
340 | 225 /* do nothing */ ; |
226 | |
227 for (opnum = 0; instab[opnum].opcode; opnum++) | |
228 { | |
229 if (!strcasecmp(instab[opnum].opcode, sym)) | |
230 break; | |
231 } | |
232 | |
233 // p1 points to the start of the operand | |
234 | |
345
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
235 // if we're inside a macro definition and not at ENDM, |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
236 // add the line to the macro definition and continue |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
237 if (as -> inmacro && !(instab[opnum].flags & lwasm_insn_endm)) |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
238 { |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
239 add_macro_line(as, line); |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
240 goto linedone; |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
241 } |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
242 |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
243 // if skipping a condition and the operation code doesn't |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
244 // operate within a condition (not a conditional) |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
245 // do nothing |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
246 if (as -> skipcond && !(instab[opnum].flags & lwasm_insn_cond)) |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
247 goto linedone; |
389
fbb7bfed8076
Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents:
385
diff
changeset
|
248 |
340 | 249 if (instab[opnum].opcode == NULL) |
250 { | |
251 cl -> insn = -1; | |
252 if (*tok != ';' && *tok != '*') | |
253 { | |
254 // bad opcode; check for macro here | |
345
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
255 if (expand_macro(as, cl, &p1, sym) != 0) |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
256 { |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
257 // macro expansion failed |
389
fbb7bfed8076
Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents:
385
diff
changeset
|
258 if (expand_struct(as, cl, &p1, sym) != 0) |
fbb7bfed8076
Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents:
385
diff
changeset
|
259 { |
fbb7bfed8076
Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents:
385
diff
changeset
|
260 // structure expansion failed |
fbb7bfed8076
Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents:
385
diff
changeset
|
261 lwasm_register_error(as, cl, "Bad opcode"); |
fbb7bfed8076
Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents:
385
diff
changeset
|
262 } |
345
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
263 } |
340 | 264 } |
265 } | |
266 else | |
267 { | |
268 cl -> insn = opnum; | |
345
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
269 // no parse func means operand doesn't matter |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
270 if (instab[opnum].parse) |
340 | 271 { |
389
fbb7bfed8076
Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents:
385
diff
changeset
|
272 if (as -> instruct == 0 || instab[opnum].flags & lwasm_insn_struct) |
fbb7bfed8076
Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents:
385
diff
changeset
|
273 { |
fbb7bfed8076
Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents:
385
diff
changeset
|
274 cl -> len = -1; |
fbb7bfed8076
Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents:
385
diff
changeset
|
275 // call parse function |
fbb7bfed8076
Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents:
385
diff
changeset
|
276 (instab[opnum].parse)(as, cl, &p1); |
345
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
277 |
389
fbb7bfed8076
Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents:
385
diff
changeset
|
278 if (*p1 && !isspace(*p1)) |
fbb7bfed8076
Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents:
385
diff
changeset
|
279 { |
fbb7bfed8076
Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents:
385
diff
changeset
|
280 // flag bad operand error |
fbb7bfed8076
Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents:
385
diff
changeset
|
281 lwasm_register_error(as, cl, "Bad operand (%s)", p1); |
fbb7bfed8076
Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents:
385
diff
changeset
|
282 } |
fbb7bfed8076
Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents:
385
diff
changeset
|
283 } |
fbb7bfed8076
Added in structure support and fixed up some warts in the listing code (by adding more warts)
lost@l-w.ca
parents:
385
diff
changeset
|
284 else if (as -> instruct == 1) |
345
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
285 { |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
286 lwasm_register_error(as, cl, "Bad operand (%s)", p1); |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
287 } |
340 | 288 } |
289 } | |
290 } | |
345
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
291 |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
292 linedone: |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
293 lw_free(sym); |
340 | 294 |
345
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
295 if (!as -> skipcond && !as -> inmacro) |
340 | 296 { |
345
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
297 if (cl -> sym && cl -> symset == 0) |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
298 { |
372
90de73ba0cac
Created a useful debug framework and adjusted lw_expr_print() to return a "static" dynamic string
lost@starbug
parents:
370
diff
changeset
|
299 debug_message(as, 50, "Register symbol %s: %s", cl -> sym, lw_expr_print(cl -> addr)); |
345
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
300 |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
301 // register symbol at line address |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
302 if (!register_symbol(as, cl, cl -> sym, cl -> addr, symbol_flag_none)) |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
303 { |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
304 // symbol error |
370 | 305 // lwasm_register_error(as, cl, "Bad symbol '%s'", cl -> sym); |
345
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
306 } |
7416c3f9c321
Basic macro processor ported forward; added context break handling for local symbols
lost@starbug
parents:
344
diff
changeset
|
307 } |
372
90de73ba0cac
Created a useful debug framework and adjusted lw_expr_print() to return a "static" dynamic string
lost@starbug
parents:
370
diff
changeset
|
308 debug_message(as, 40, "Line address: %s", lw_expr_print(cl -> addr)); |
340 | 309 } |
310 | |
311 nextline: | |
332 | 312 lw_free(line); |
347 | 313 |
314 // if we've hit the "end" bit, finish out | |
315 if (as -> endseen) | |
316 return; | |
332 | 317 } |
318 } |