annotate lwasm/lwasm.c @ 434:052c5f335a92

Fix bug in like terms collection in expression simplification Like term collection would lose the actual "variable" part of the term if the second term collected happened to have no coefficient. This would cause the expression to take the value of the calculated coefficient which is obviously wrong. Thanks to hider <stego@satx.rr.com> for reporting the bug and providing a proper test case. Observation: this bug has been present since the first pre-release of lwtools 3.0 when the algebraic expression system was introduced. Apparently people tend not to create expressions that trigger the like terms handler. The specific conditions require the symbol to be undefined and the second operand to the addition has to have no coefficient so it's likely a fairly rare scenario. Still, it is somewhat surprising that nobody tripped on it before now.
author William Astle <lost@l-w.ca>
date Mon, 23 Jan 2017 22:58:36 -0700
parents b1adf549d181
children cad5937314cb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1 /*
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
2 lwasm.c
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
3
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
4 Copyright © 2010 William Astle
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
5
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
6 This file is part of LWTOOLS.
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
7
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
8 LWTOOLS is free software: you can redistribute it and/or modify it under the
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
9 terms of the GNU General Public License as published by the Free Software
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
10 Foundation, either version 3 of the License, or (at your option) any later
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
11 version.
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
12
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
13 This program is distributed in the hope that it will be useful, but WITHOUT
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
16 more details.
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
17
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
18 You should have received a copy of the GNU General Public License along with
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
19 this program. If not, see <http://www.gnu.org/licenses/>.
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
20 */
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
21
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
22 #include <stdio.h>
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
23 #include <stdarg.h>
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
24 #include <string.h>
2
7317fbe024af Clean up insane number of compiler warnings under -Wall
lost@l-w.ca
parents: 0
diff changeset
25 #include <ctype.h>
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
26
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
27 #include <lw_expr.h>
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
28 #include <lw_alloc.h>
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
29 #include <lw_string.h>
375
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
30 #include <lw_error.h>
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
31
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
32 #include "lwasm.h"
336
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
33 #include "instab.h"
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
34
399
6153cb49403c Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents: 388
diff changeset
35 void lwasm_skip_to_next_token(line_t *cl, char **p)
6153cb49403c Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents: 388
diff changeset
36 {
6153cb49403c Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents: 388
diff changeset
37 if (CURPRAGMA(cl, PRAGMA_NEWSOURCE))
6153cb49403c Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents: 388
diff changeset
38 {
6153cb49403c Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents: 388
diff changeset
39 for (; **p && isspace(**p); (*p)++)
6153cb49403c Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents: 388
diff changeset
40 /* do nothing */ ;
6153cb49403c Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents: 388
diff changeset
41 }
6153cb49403c Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents: 388
diff changeset
42 }
6153cb49403c Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents: 388
diff changeset
43
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
44 int lwasm_expr_exportable(asmstate_t *as, lw_expr_t expr)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
45 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
46 return 0;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
47 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
48
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
49 int lwasm_expr_exportval(asmstate_t *as, lw_expr_t expr)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
50 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
51 return 0;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
52 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
53
249
1f1a28b797e1 Add trap for divide by zero in expression library
William Astle <lost@l-w.ca>
parents: 241
diff changeset
54 void lwasm_dividezero(void *priv)
1f1a28b797e1 Add trap for divide by zero in expression library
William Astle <lost@l-w.ca>
parents: 241
diff changeset
55 {
1f1a28b797e1 Add trap for divide by zero in expression library
William Astle <lost@l-w.ca>
parents: 241
diff changeset
56 asmstate_t *as = (asmstate_t *)priv;
370
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
57 lwasm_register_error(as, as -> cl, E_DIV0);
249
1f1a28b797e1 Add trap for divide by zero in expression library
William Astle <lost@l-w.ca>
parents: 241
diff changeset
58 }
1f1a28b797e1 Add trap for divide by zero in expression library
William Astle <lost@l-w.ca>
parents: 241
diff changeset
59
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
60 lw_expr_t lwasm_evaluate_var(char *var, void *priv)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
61 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
62 asmstate_t *as = (asmstate_t *)priv;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
63 lw_expr_t e;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
64 importlist_t *im;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
65 struct symtabe *s;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
66
433
b1adf549d181 Add some debugging instrumentation for tracking an expression bug
William Astle <lost@l-w.ca>
parents: 432
diff changeset
67 debug_message(as, 225, "eval var: look up %s", var);
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
68 s = lookup_symbol(as, as -> cl, var);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
69 if (s)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
70 {
433
b1adf549d181 Add some debugging instrumentation for tracking an expression bug
William Astle <lost@l-w.ca>
parents: 432
diff changeset
71 debug_message(as, 225, "eval var: symbol found %s = %s (%p)", s -> symbol, lw_expr_print(s -> value), s);
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
72 e = lw_expr_build(lw_expr_type_special, lwasm_expr_syment, s);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
73 return e;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
74 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
75
210
5d969517db74 Added condundefzero pragma
William Astle <lost@l-w.ca>
parents: 209
diff changeset
76 if (as -> undefzero)
5d969517db74 Added condundefzero pragma
William Astle <lost@l-w.ca>
parents: 209
diff changeset
77 {
433
b1adf549d181 Add some debugging instrumentation for tracking an expression bug
William Astle <lost@l-w.ca>
parents: 432
diff changeset
78 debug_message(as, 225, "eval var: undefined symbol treated as 0");
210
5d969517db74 Added condundefzero pragma
William Astle <lost@l-w.ca>
parents: 209
diff changeset
79 e = lw_expr_build(lw_expr_type_int, 0);
5d969517db74 Added condundefzero pragma
William Astle <lost@l-w.ca>
parents: 209
diff changeset
80 return e;
5d969517db74 Added condundefzero pragma
William Astle <lost@l-w.ca>
parents: 209
diff changeset
81 }
5d969517db74 Added condundefzero pragma
William Astle <lost@l-w.ca>
parents: 209
diff changeset
82
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
83 // undefined here is undefied unless output is object
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
84 if (as -> output_format != OUTPUT_OBJ)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
85 goto nomatch;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
86
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
87 // check for import
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
88 for (im = as -> importlist; im; im = im -> next)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
89 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
90 if (!strcmp(im -> symbol, var))
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
91 break;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
92 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
93
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
94 // check for "undefined" to import automatically
70
ceab04fd2969 Fixed premature installation of external reference under UNDEFEXTERN pragma; should not resolve to external references until after the initial parsing pass
lost@l-w.ca
parents: 44
diff changeset
95 if ((as -> passno != 0) && !im && CURPRAGMA(as -> cl, PRAGMA_UNDEFEXTERN))
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
96 {
433
b1adf549d181 Add some debugging instrumentation for tracking an expression bug
William Astle <lost@l-w.ca>
parents: 432
diff changeset
97 debug_message(as, 225, "eval var: importing undefined symbol");
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
98 im = lw_alloc(sizeof(importlist_t));
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
99 im -> symbol = lw_strdup(var);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
100 im -> next = as -> importlist;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
101 as -> importlist = im;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
102 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
103
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
104 if (!im)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
105 goto nomatch;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
106
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
107 e = lw_expr_build(lw_expr_type_special, lwasm_expr_import, im);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
108 return e;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
109
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
110 nomatch:
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
111 if (as -> badsymerr)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
112 {
370
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
113 lwasm_register_error2(as, as -> cl, E_SYMBOL_UNDEFINED, "%s", var);
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
114 }
433
b1adf549d181 Add some debugging instrumentation for tracking an expression bug
William Astle <lost@l-w.ca>
parents: 432
diff changeset
115 debug_message(as, 225, "eval var: undefined symbol - returning NULL");
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
116 return NULL;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
117 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
118
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
119 lw_expr_t lwasm_evaluate_special(int t, void *ptr, void *priv)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
120 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
121 switch (t)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
122 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
123 case lwasm_expr_secbase:
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
124 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
125 // sectiontab_t *s = priv;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
126 asmstate_t *as = priv;
432
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
127 if (((sectiontab_t *)ptr) -> tbase != -1)
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
128 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
129 return lw_expr_build(lw_expr_type_int, ((sectiontab_t *)ptr) -> tbase);
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
130 }
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
131 if (as -> exportcheck && ptr == as -> csect)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
132 return lw_expr_build(lw_expr_type_int, 0);
158
8dead67ba607 Make constant sections always resolve with a constant base offset of zero instead of an undefined reference
lost@l-w.ca
parents: 142
diff changeset
133 if (((sectiontab_t *)ptr) -> flags & section_flag_constant)
8dead67ba607 Make constant sections always resolve with a constant base offset of zero instead of an undefined reference
lost@l-w.ca
parents: 142
diff changeset
134 return lw_expr_build(lw_expr_type_int, 0);
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
135 return NULL;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
136 }
142
697bc543368c Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents: 113
diff changeset
137
697bc543368c Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents: 113
diff changeset
138 case lwasm_expr_linedlen:
697bc543368c Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents: 113
diff changeset
139 {
697bc543368c Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents: 113
diff changeset
140 line_t *cl = ptr;
697bc543368c Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents: 113
diff changeset
141 if (cl -> dlen == -1)
697bc543368c Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents: 113
diff changeset
142 return NULL;
697bc543368c Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents: 113
diff changeset
143 return lw_expr_build(lw_expr_type_int, cl -> dlen);
697bc543368c Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents: 113
diff changeset
144 }
697bc543368c Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents: 113
diff changeset
145 break;
697bc543368c Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents: 113
diff changeset
146
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
147 case lwasm_expr_linelen:
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
148 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
149 line_t *cl = ptr;
211
6f2e18f1fe67 Improve autobranchlength pragma
William Astle <lost@l-w.ca>
parents: 210
diff changeset
150 if (cl -> len != -1)
6f2e18f1fe67 Improve autobranchlength pragma
William Astle <lost@l-w.ca>
parents: 210
diff changeset
151 return lw_expr_build(lw_expr_type_int, cl -> len);
6f2e18f1fe67 Improve autobranchlength pragma
William Astle <lost@l-w.ca>
parents: 210
diff changeset
152
6f2e18f1fe67 Improve autobranchlength pragma
William Astle <lost@l-w.ca>
parents: 210
diff changeset
153 if (cl -> as -> pretendmax)
6f2e18f1fe67 Improve autobranchlength pragma
William Astle <lost@l-w.ca>
parents: 210
diff changeset
154 {
6f2e18f1fe67 Improve autobranchlength pragma
William Astle <lost@l-w.ca>
parents: 210
diff changeset
155 if (cl -> maxlen != 0)
6f2e18f1fe67 Improve autobranchlength pragma
William Astle <lost@l-w.ca>
parents: 210
diff changeset
156 {
240
41d64951eb32 Silence debug message
William Astle <lost@l-w.ca>
parents: 226
diff changeset
157 //fprintf(stderr, "Pretending max, len = %d\n", cl -> maxlen);
211
6f2e18f1fe67 Improve autobranchlength pragma
William Astle <lost@l-w.ca>
parents: 210
diff changeset
158 return lw_expr_build(lw_expr_type_int, cl -> maxlen);
6f2e18f1fe67 Improve autobranchlength pragma
William Astle <lost@l-w.ca>
parents: 210
diff changeset
159 }
6f2e18f1fe67 Improve autobranchlength pragma
William Astle <lost@l-w.ca>
parents: 210
diff changeset
160 }
6f2e18f1fe67 Improve autobranchlength pragma
William Astle <lost@l-w.ca>
parents: 210
diff changeset
161 return NULL;
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
162 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
163 break;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
164
142
697bc543368c Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents: 113
diff changeset
165 case lwasm_expr_linedaddr:
697bc543368c Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents: 113
diff changeset
166 {
697bc543368c Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents: 113
diff changeset
167 line_t *cl = ptr;
697bc543368c Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents: 113
diff changeset
168 return lw_expr_copy(cl -> daddr);
697bc543368c Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents: 113
diff changeset
169 }
697bc543368c Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents: 113
diff changeset
170
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
171 case lwasm_expr_lineaddr:
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
172 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
173 line_t *cl = ptr;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
174 if (cl -> addr)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
175 return lw_expr_copy(cl -> addr);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
176 else
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
177 return NULL;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
178 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
179
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
180 case lwasm_expr_syment:
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
181 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
182 struct symtabe *sym = ptr;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
183 return lw_expr_copy(sym -> value);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
184 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
185
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
186 case lwasm_expr_import:
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
187 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
188 return NULL;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
189 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
190
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
191 case lwasm_expr_nextbp:
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
192 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
193 line_t *cl = ptr;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
194 for (cl = cl -> next; cl; cl = cl -> next)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
195 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
196 if (cl -> isbrpt)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
197 break;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
198 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
199 if (cl)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
200 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
201 return lw_expr_copy(cl -> addr);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
202 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
203 return NULL;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
204 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
205
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
206 case lwasm_expr_prevbp:
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
207 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
208 line_t *cl = ptr;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
209 for (cl = cl -> prev; cl; cl = cl -> prev)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
210 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
211 if (cl -> isbrpt)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
212 break;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
213 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
214 if (cl)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
215 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
216 return lw_expr_copy(cl -> addr);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
217 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
218 return NULL;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
219 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
220 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
221 return NULL;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
222 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
223
370
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
224 const char* lwasm_lookup_error(lwasm_errorcode_t error_code)
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
225 {
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
226 switch (error_code)
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
227 {
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
228 case E_6309_INVALID: return "Illegal use of 6309 instruction in 6809 mode";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
229 case E_6809_INVALID: return "Illegal use of 6809 instruction in 6309 mode";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
230 case E_ALIGNMENT_INVALID: return "Invalid alignment";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
231 case E_BITNUMBER_INVALID: return "Invalid bit number";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
232 case E_BITNUMBER_UNRESOLVED: return "Bit number must be fully resolved";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
233 case E_BYTE_OVERFLOW: return "Byte overflow";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
234 case E_CONDITION_P1: return "Conditions must be constant on pass 1";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
235 case E_DIRECTIVE_OS9_ONLY: return "Directive only valid for OS9 target";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
236 case E_DIV0: return "Division by zero";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
237 case E_EXEC_ADDRESS: return "Exec address not constant!";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
238 case E_EXPRESSION_BAD: return "Bad expression";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
239 case E_EXPRESSION_NOT_CONST: return "Expression must be constant";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
240 case E_EXPRESSION_NOT_RESOLVED: return "Expression not fully resolved";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
241 case E_FILE_OPEN: return "Cannot open file";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
242 case E_FILENAME_MISSING: return "Missing filename";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
243 case E_FILL_INVALID: return "Invalid fill length";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
244 case E_IMMEDIATE_INVALID: return "Immediate mode not allowed";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
245 case E_IMMEDIATE_UNRESOLVED: return "Immediate byte must be fully resolved";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
246 case E_INSTRUCTION_FAILED: return "Instruction failed to resolve.";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
247 case E_INSTRUCTION_SECTION: return "Instruction generating output outside of a section";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
248 case E_LINE_ADDRESS: return "Cannot resolve line address";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
249 case E_LINED_ADDRESS: return "Cannot resolve line data address";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
250 case E_OBJTARGET_ONLY: return "Only supported for object target";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
251 case E_OPCODE_BAD: return "Bad opcode";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
252 case E_OPERAND_BAD: return "Bad operand";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
253 case E_PADDING_BAD: return "Bad padding";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
254 case E_PRAGMA_UNRECOGNIZED: return "Unrecognized pragma string";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
255 case E_REGISTER_BAD: return "Bad register";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
256 case E_SETDP_INVALID: return "SETDP not permitted for object target";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
257 case E_SETDP_NOT_CONST: return "SETDP must be constant on pass 1";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
258 case E_STRING_BAD: return "Bad string condition";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
259 case E_SYMBOL_BAD: return "Bad symbol";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
260 case E_SYMBOL_MISSING: return "Missing symbol";
412
f8e56377a32a lwasm: Add missing "Undefined symbol" error string
Tormod Volden <debian.tormod@gmail.com>
parents: 399
diff changeset
261 case E_SYMBOL_UNDEFINED: return "Undefined symbol";
370
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
262 case E_SYMBOL_UNDEFINED_EXPORT: return "Undefined exported symbol";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
263 case E_MACRO_DUPE: return "Duplicate macro definition";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
264 case E_MACRO_ENDM: return "ENDM without MACRO";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
265 case E_MACRO_NONAME: return "Missing macro name";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
266 case E_MACRO_RECURSE: return "Attempt to define a macro inside a macro";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
267 case E_MODULE_IN: return "Already in a module!";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
268 case E_MODULE_NOTIN: return "Not in a module!";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
269 case E_NEGATIVE_BLOCKSIZE: return "Negative block sizes make no sense!";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
270 case E_NEGATIVE_RESERVATION: return "Negative reservation sizes make no sense!";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
271 case E_NW_8: return "n,W cannot be 8 bit";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
272 case E_SECTION_END: return "ENDSECTION without SECTION";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
273 case E_SECTION_EXTDEP: return "EXTDEP must be within a section";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
274 case E_SECTION_FLAG: return "Unrecognized section flag";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
275 case E_SECTION_NAME: return "Need section name";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
276 case E_SECTION_TARGET: return "Cannot use sections unless using the object target";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
277 case E_STRUCT_DUPE: return "Duplicate structure definition";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
278 case E_STRUCT_NONAME: return "Cannot declare a structure without a symbol name.";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
279 case E_STRUCT_NOSYMBOL: return "Structure definition with no effect - no symbol";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
280 case E_STRUCT_RECURSE: return "Attempt to define a structure inside a structure";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
281 case E_SYMBOL_DUPE: return "Multiply defined symbol";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
282 case E_UNKNOWN_OPERATION: return "Unknown operation";
382
80d615a6642c Add REORG pseudo op
William Astle <lost@l-w.ca>
parents: 380
diff changeset
283 case E_ORG_NOT_FOUND: return "Previous ORG not found";
432
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
284 case E_COMPLEX_INCOMPLETE: return "Incomplete expression too complex";
413
5dc9f9d47064 Add error string for "user error"
William Astle <lost@l-w.ca>
parents: 412
diff changeset
285 case E_USER_SPECIFIED: return "User Specified:";
370
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
286
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
287 case W_ENDSTRUCT_WITHOUT: return "ENDSTRUCT without STRUCT";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
288 case W_DUPLICATE_SECTION: return "Section flags can only be specified the first time; ignoring duplicate definition";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
289 case W_NOT_SUPPORTED: return "Not supported";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
290
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
291 default: return "Error";
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
292 }
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
293 }
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
294
375
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
295 /* keeping this as a separate error output for stability in unit test scripts */
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
296 void lwasm_error_testmode(line_t *cl, const char* msg, int fatal)
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
297 {
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
298 cl -> as -> testmode_errorcount++;
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
299 fprintf(stderr, "line %d: %s : %s\n", cl->lineno, msg, cl->ltext);
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
300 if (fatal == 1) lw_error("aborting\n");
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
301 }
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
302
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
303 /* parse unit test input data from comment field */
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
304 void lwasm_parse_testmode_comment(line_t *l, lwasm_testflags_t *flags, lwasm_errorcode_t *err, int *len, char **buf)
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
305 {
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
306 *flags = 0;
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
307
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
308 if (!l)
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
309 return;
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
310
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
311 char* s = strstr(l -> ltext, ";.");
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
312 if (s == NULL) return;
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
313
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
314 char* t = strstr(s, ":");
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
315 if (t == NULL)
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
316 {
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
317 /* parse: ;.8E0FCE (emitted code) */
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
318
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
319 if (buf == NULL) return;
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
320
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
321 int i;
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
322 *flags = TF_EMIT;
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
323
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
324 s = s + 2; /* skip ;. prefix */
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
325 t = s;
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
326 while (*t > 32) t++;
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
327
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
328 if ((t - s) & 1)
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
329 {
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
330 lwasm_error_testmode(l, "bad test data (wrong length of hex chars)", 1);
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
331 return;
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
332 }
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
333
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
334 *len = (t - s) / 2;
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
335
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
336 t = lw_alloc(*len);
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
337 *buf = t;
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
338
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
339 for (i = 0; i < *len; i++)
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
340 {
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
341 int val;
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
342 sscanf(s, "%2x", &val);
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
343 *t++ = (char) val;
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
344 s += 2;
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
345 }
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
346 }
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
347 else
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
348 {
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
349 /* parse: ;.E:1000 or ;.E:7 (warnings or errors) */
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
350 *flags = TF_ERROR;
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
351
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
352 char ch = toupper(*(t - 1));
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
353 if (ch != 'E') lwasm_error_testmode(l, "bad test data (expected E: flag)", 1);
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
354 sscanf(t + 1, "%d", (int*) err);
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
355 }
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
356 }
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
357
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
358 void lwasm_register_error_real(asmstate_t *as, line_t *l, lwasm_errorcode_t error_code, const char *msg)
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
359 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
360 lwasm_error_t *e;
209
52d9dd71f555 Make warning actually work.
William Astle <lost@l-w.ca>
parents: 200
diff changeset
361
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
362 if (!l)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
363 return;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
364
375
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
365 if (CURPRAGMA(l, PRAGMA_TESTMODE))
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
366 {
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
367 lwasm_testflags_t flags;
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
368 lwasm_errorcode_t testmode_error_code;
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
369 lwasm_parse_testmode_comment(l, &flags, &testmode_error_code, NULL, NULL);
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
370 if (flags == TF_ERROR)
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
371 {
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
372 l -> len = 0; /* null out bogus line */
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
373 l -> insn = -1;
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
374 l -> err_testmode = error_code;
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
375 if (testmode_error_code == error_code) return; /* expected error: ignore and keep assembling */
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
376
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
377 char buf[128];
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
378 sprintf(buf, "wrong error code (%d)", error_code);
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
379 lwasm_error_testmode(l, buf, 0);
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
380 return;
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
381 }
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
382 }
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
383
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
384 e = lw_alloc(sizeof(lwasm_error_t));
226
7c2c2239ec9c Make unicorns grok errors and warnings.
William Astle <lost@l-w.ca>
parents: 216
diff changeset
385
375
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
386 if (error_code >= 1000)
370
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
387 {
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
388 e->next = l->warn;
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
389 l->warn = e;
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
390 as->warningcount++;
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
391 }
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
392 else
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
393 {
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
394 e->next = l->err;
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
395 l->err = e;
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
396 as->errorcount++;
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
397 }
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
398
375
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
399 e -> code = error_code;
370
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
400 e -> charpos = -1;
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
401
370
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
402 e -> mess = lw_strdup(msg);
226
7c2c2239ec9c Make unicorns grok errors and warnings.
William Astle <lost@l-w.ca>
parents: 216
diff changeset
403 }
7c2c2239ec9c Make unicorns grok errors and warnings.
William Astle <lost@l-w.ca>
parents: 216
diff changeset
404
370
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
405 void lwasm_register_error(asmstate_t *as, line_t *l, lwasm_errorcode_t err)
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
406 {
370
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
407 lwasm_register_error_real(as, l, err, lwasm_lookup_error(err));
226
7c2c2239ec9c Make unicorns grok errors and warnings.
William Astle <lost@l-w.ca>
parents: 216
diff changeset
408 }
7c2c2239ec9c Make unicorns grok errors and warnings.
William Astle <lost@l-w.ca>
parents: 216
diff changeset
409
370
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
410 void lwasm_register_error2(asmstate_t *as, line_t *l, lwasm_errorcode_t err, const char* fmt, ...)
226
7c2c2239ec9c Make unicorns grok errors and warnings.
William Astle <lost@l-w.ca>
parents: 216
diff changeset
411 {
370
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
412 char errbuff[1024];
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
413 char f[128];
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
414
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
415 sprintf(f, "%s %s", lwasm_lookup_error(err), fmt);
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
416
226
7c2c2239ec9c Make unicorns grok errors and warnings.
William Astle <lost@l-w.ca>
parents: 216
diff changeset
417 va_list args;
370
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
418
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
419 va_start(args, fmt);
226
7c2c2239ec9c Make unicorns grok errors and warnings.
William Astle <lost@l-w.ca>
parents: 216
diff changeset
420
370
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
421 (void) vsnprintf(errbuff, 1024, f, args);
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
422
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
423 lwasm_register_error_real(as, l, err, errbuff);
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
424
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
425 va_end(args);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
426 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
427
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
428 int lwasm_next_context(asmstate_t *as)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
429 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
430 int r;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
431 r = as -> nextcontext;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
432 as -> nextcontext++;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
433 return r;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
434 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
435
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
436 void lwasm_emit(line_t *cl, int byte)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
437 {
13
c80e5a063967 Brought forward patch to fix segfault with output outside of a section
lost@l-w.ca
parents: 2
diff changeset
438 if (cl -> as -> output_format == OUTPUT_OBJ && cl -> csect == NULL)
c80e5a063967 Brought forward patch to fix segfault with output outside of a section
lost@l-w.ca
parents: 2
diff changeset
439 {
370
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
440 lwasm_register_error(cl -> as, cl, E_INSTRUCTION_SECTION);
13
c80e5a063967 Brought forward patch to fix segfault with output outside of a section
lost@l-w.ca
parents: 2
diff changeset
441 return;
c80e5a063967 Brought forward patch to fix segfault with output outside of a section
lost@l-w.ca
parents: 2
diff changeset
442 }
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
443 if (cl -> outputl < 0)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
444 cl -> outputl = 0;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
445
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
446 if (cl -> outputl == cl -> outputbl)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
447 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
448 cl -> output = lw_realloc(cl -> output, cl -> outputbl + 8);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
449 cl -> outputbl += 8;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
450 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
451 cl -> output[cl -> outputl++] = byte & 0xff;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
452
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
453 if (cl -> inmod)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
454 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
455 asmstate_t *as = cl -> as;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
456 // update module CRC
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
457 // this is a direct transliteration from the nitros9 asm source
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
458 // to C; it can, no doubt, be optimized for 32 bit processing
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
459 byte &= 0xff;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
460
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
461 byte ^= (as -> crc)[0];
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
462 (as -> crc)[0] = (as -> crc)[1];
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
463 (as -> crc)[1] = (as -> crc)[2];
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
464 (as -> crc)[1] ^= (byte >> 7);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
465 (as -> crc)[2] = (byte << 1);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
466 (as -> crc)[1] ^= (byte >> 2);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
467 (as -> crc)[2] ^= (byte << 6);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
468 byte ^= (byte << 1);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
469 byte ^= (byte << 2);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
470 byte ^= (byte << 4);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
471 if (byte & 0x80)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
472 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
473 (as -> crc)[0] ^= 0x80;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
474 (as -> crc)[2] ^= 0x21;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
475 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
476 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
477 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
478
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
479 void lwasm_emitop(line_t *cl, int opc)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
480 {
376
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
481 if (cl->cycle_base == 0)
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
482 lwasm_cycle_update_count(cl, opc); /* only call first time, never on postbyte */
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
483
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
484 if (opc > 0x100)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
485 lwasm_emit(cl, opc >> 8);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
486 lwasm_emit(cl, opc);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
487 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
488
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
489 lw_expr_t lwasm_parse_term(char **p, void *priv)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
490 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
491 asmstate_t *as = priv;
44
1bff302e62a3 Accept negative sign after base prefix
lost@l-w.ca
parents: 38
diff changeset
492 int neg = 1;
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
493 int val;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
494
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
495 if (!**p)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
496 return NULL;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
497
142
697bc543368c Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents: 113
diff changeset
498 if (**p == '.'
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
499 && !((*p)[1] >= 'A' && (*p)[1] <= 'Z')
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
500 && !((*p)[1] >= 'a' && (*p)[1] <= 'z')
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
501 && !((*p)[1] >= '0' && (*p)[1] <= '9')
142
697bc543368c Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents: 113
diff changeset
502 )
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
503 {
142
697bc543368c Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents: 113
diff changeset
504 (*p)++;
697bc543368c Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents: 113
diff changeset
505 return lw_expr_build(lw_expr_type_special, lwasm_expr_linedaddr, as -> cl);
697bc543368c Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents: 113
diff changeset
506 }
697bc543368c Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents: 113
diff changeset
507
697bc543368c Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents: 113
diff changeset
508 if (**p == '*')
697bc543368c Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents: 113
diff changeset
509 {
697bc543368c Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents: 113
diff changeset
510 // special "symbol" for current line addr (*)
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
511 (*p)++;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
512 return lw_expr_build(lw_expr_type_special, lwasm_expr_lineaddr, as -> cl);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
513 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
514
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
515 // branch points
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
516 if (**p == '<')
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
517 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
518 (*p)++;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
519 return lw_expr_build(lw_expr_type_special, lwasm_expr_prevbp, as -> cl);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
520 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
521 if (**p == '>')
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
522 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
523 (*p)++;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
524 return lw_expr_build(lw_expr_type_special, lwasm_expr_nextbp, as -> cl);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
525 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
526
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
527 // double ascii constant
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
528 if (**p == '"')
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
529 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
530 int v;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
531 (*p)++;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
532 if (!**p)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
533 return NULL;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
534 if (!*((*p)+1))
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
535 return NULL;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
536 v = (unsigned char)**p << 8 | (unsigned char)*((*p)+1);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
537 (*p) += 2;
326
d399df78e1ab Allow trailing ' or " on ascii constants
Tom LeMense <tlemense@yahoo.com>
parents: 256
diff changeset
538
d399df78e1ab Allow trailing ' or " on ascii constants
Tom LeMense <tlemense@yahoo.com>
parents: 256
diff changeset
539 if (**p == '"')
d399df78e1ab Allow trailing ' or " on ascii constants
Tom LeMense <tlemense@yahoo.com>
parents: 256
diff changeset
540 (*p)++;
d399df78e1ab Allow trailing ' or " on ascii constants
Tom LeMense <tlemense@yahoo.com>
parents: 256
diff changeset
541
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
542 return lw_expr_build(lw_expr_type_int, v);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
543 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
544
380
17fcd0c3ee45 Allow multibyte ascii constants in m80ext mode
William Astle <lost@l-w.ca>
parents: 376
diff changeset
545 /* double ASCII constant, like LDD #'MG */
17fcd0c3ee45 Allow multibyte ascii constants in m80ext mode
William Astle <lost@l-w.ca>
parents: 376
diff changeset
546 if (CURPRAGMA(as->cl, PRAGMA_M80EXT))
17fcd0c3ee45 Allow multibyte ascii constants in m80ext mode
William Astle <lost@l-w.ca>
parents: 376
diff changeset
547 {
17fcd0c3ee45 Allow multibyte ascii constants in m80ext mode
William Astle <lost@l-w.ca>
parents: 376
diff changeset
548 if (((**p == '"') || (**p == '\'')) && (as->cl->genmode == 16))
17fcd0c3ee45 Allow multibyte ascii constants in m80ext mode
William Astle <lost@l-w.ca>
parents: 376
diff changeset
549 {
17fcd0c3ee45 Allow multibyte ascii constants in m80ext mode
William Astle <lost@l-w.ca>
parents: 376
diff changeset
550 int v;
17fcd0c3ee45 Allow multibyte ascii constants in m80ext mode
William Astle <lost@l-w.ca>
parents: 376
diff changeset
551 (*p)++;
17fcd0c3ee45 Allow multibyte ascii constants in m80ext mode
William Astle <lost@l-w.ca>
parents: 376
diff changeset
552 if (!**p)
17fcd0c3ee45 Allow multibyte ascii constants in m80ext mode
William Astle <lost@l-w.ca>
parents: 376
diff changeset
553 return NULL;
17fcd0c3ee45 Allow multibyte ascii constants in m80ext mode
William Astle <lost@l-w.ca>
parents: 376
diff changeset
554 if (!*((*p) + 1))
17fcd0c3ee45 Allow multibyte ascii constants in m80ext mode
William Astle <lost@l-w.ca>
parents: 376
diff changeset
555 return NULL;
17fcd0c3ee45 Allow multibyte ascii constants in m80ext mode
William Astle <lost@l-w.ca>
parents: 376
diff changeset
556 v = (unsigned char) **p << 8 | (unsigned char) *((*p) + 1);
17fcd0c3ee45 Allow multibyte ascii constants in m80ext mode
William Astle <lost@l-w.ca>
parents: 376
diff changeset
557 (*p) += 2;
17fcd0c3ee45 Allow multibyte ascii constants in m80ext mode
William Astle <lost@l-w.ca>
parents: 376
diff changeset
558
17fcd0c3ee45 Allow multibyte ascii constants in m80ext mode
William Astle <lost@l-w.ca>
parents: 376
diff changeset
559 if ((**p == '"') || (**p == '\''))
17fcd0c3ee45 Allow multibyte ascii constants in m80ext mode
William Astle <lost@l-w.ca>
parents: 376
diff changeset
560 (*p)++;
17fcd0c3ee45 Allow multibyte ascii constants in m80ext mode
William Astle <lost@l-w.ca>
parents: 376
diff changeset
561
17fcd0c3ee45 Allow multibyte ascii constants in m80ext mode
William Astle <lost@l-w.ca>
parents: 376
diff changeset
562 return lw_expr_build(lw_expr_type_int, v);
17fcd0c3ee45 Allow multibyte ascii constants in m80ext mode
William Astle <lost@l-w.ca>
parents: 376
diff changeset
563 }
17fcd0c3ee45 Allow multibyte ascii constants in m80ext mode
William Astle <lost@l-w.ca>
parents: 376
diff changeset
564 }
17fcd0c3ee45 Allow multibyte ascii constants in m80ext mode
William Astle <lost@l-w.ca>
parents: 376
diff changeset
565
17fcd0c3ee45 Allow multibyte ascii constants in m80ext mode
William Astle <lost@l-w.ca>
parents: 376
diff changeset
566 /* single ASCII constant, like LDA #'E */
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
567 if (**p == '\'')
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
568 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
569 int v;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
570
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
571 (*p)++;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
572 if (!**p)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
573 return NULL;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
574
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
575 v = (unsigned char)**p;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
576 (*p)++;
326
d399df78e1ab Allow trailing ' or " on ascii constants
Tom LeMense <tlemense@yahoo.com>
parents: 256
diff changeset
577
d399df78e1ab Allow trailing ' or " on ascii constants
Tom LeMense <tlemense@yahoo.com>
parents: 256
diff changeset
578 if (**p == '\'')
d399df78e1ab Allow trailing ' or " on ascii constants
Tom LeMense <tlemense@yahoo.com>
parents: 256
diff changeset
579 (*p)++;
d399df78e1ab Allow trailing ' or " on ascii constants
Tom LeMense <tlemense@yahoo.com>
parents: 256
diff changeset
580
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
581 return lw_expr_build(lw_expr_type_int, v);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
582 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
583
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
584 if (**p == '&')
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
585 {
113
7e621e00b887 Fixed uninitialized variable in &-prefix and %-prefix constant parsing
lost@l-w.ca
parents: 98
diff changeset
586 val = 0;
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
587 // decimal constant
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
588 (*p)++;
44
1bff302e62a3 Accept negative sign after base prefix
lost@l-w.ca
parents: 38
diff changeset
589
1bff302e62a3 Accept negative sign after base prefix
lost@l-w.ca
parents: 38
diff changeset
590 if (**p == '-')
1bff302e62a3 Accept negative sign after base prefix
lost@l-w.ca
parents: 38
diff changeset
591 {
1bff302e62a3 Accept negative sign after base prefix
lost@l-w.ca
parents: 38
diff changeset
592 (*p)++;
1bff302e62a3 Accept negative sign after base prefix
lost@l-w.ca
parents: 38
diff changeset
593 neg = -1;
1bff302e62a3 Accept negative sign after base prefix
lost@l-w.ca
parents: 38
diff changeset
594 }
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
595
354
433851a26794 Make base prefix sigils error out if no number following
William Astle <lost@l-w.ca>
parents: 336
diff changeset
596 if (!**p || !strchr("0123456789", **p))
433851a26794 Make base prefix sigils error out if no number following
William Astle <lost@l-w.ca>
parents: 336
diff changeset
597 {
433851a26794 Make base prefix sigils error out if no number following
William Astle <lost@l-w.ca>
parents: 336
diff changeset
598 (*p)--;
433851a26794 Make base prefix sigils error out if no number following
William Astle <lost@l-w.ca>
parents: 336
diff changeset
599 if (neg < 0)
433851a26794 Make base prefix sigils error out if no number following
William Astle <lost@l-w.ca>
parents: 336
diff changeset
600 (*p)--;
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
601 return NULL;
354
433851a26794 Make base prefix sigils error out if no number following
William Astle <lost@l-w.ca>
parents: 336
diff changeset
602 }
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
603
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
604 while (**p && strchr("0123456789", **p))
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
605 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
606 val = val * 10 + (**p - '0');
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
607 (*p)++;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
608 }
95
a23f732c5ce8 Fixed &-prefix decimal constant parse problem
lost@l-w.ca
parents: 94
diff changeset
609 return lw_expr_build(lw_expr_type_int, val * neg);
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
610 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
611
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
612 if (**p == '%')
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
613 {
113
7e621e00b887 Fixed uninitialized variable in &-prefix and %-prefix constant parsing
lost@l-w.ca
parents: 98
diff changeset
614 val = 0;
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
615 // binary constant
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
616 (*p)++;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
617
44
1bff302e62a3 Accept negative sign after base prefix
lost@l-w.ca
parents: 38
diff changeset
618 if (**p == '-')
1bff302e62a3 Accept negative sign after base prefix
lost@l-w.ca
parents: 38
diff changeset
619 {
1bff302e62a3 Accept negative sign after base prefix
lost@l-w.ca
parents: 38
diff changeset
620 (*p)++;
1bff302e62a3 Accept negative sign after base prefix
lost@l-w.ca
parents: 38
diff changeset
621 neg = -1;
1bff302e62a3 Accept negative sign after base prefix
lost@l-w.ca
parents: 38
diff changeset
622 }
1bff302e62a3 Accept negative sign after base prefix
lost@l-w.ca
parents: 38
diff changeset
623
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
624 if (**p != '0' && **p != '1')
354
433851a26794 Make base prefix sigils error out if no number following
William Astle <lost@l-w.ca>
parents: 336
diff changeset
625 {
433851a26794 Make base prefix sigils error out if no number following
William Astle <lost@l-w.ca>
parents: 336
diff changeset
626 (*p)--;
433851a26794 Make base prefix sigils error out if no number following
William Astle <lost@l-w.ca>
parents: 336
diff changeset
627 if (neg < 0)
433851a26794 Make base prefix sigils error out if no number following
William Astle <lost@l-w.ca>
parents: 336
diff changeset
628 (*p)--;
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
629 return NULL;
354
433851a26794 Make base prefix sigils error out if no number following
William Astle <lost@l-w.ca>
parents: 336
diff changeset
630 }
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
631
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
632 while (**p && (**p == '0' || **p == '1'))
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
633 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
634 val = val * 2 + (**p - '0');
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
635 (*p)++;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
636 }
94
61c084b2c727 Fixed bug parsing %-prefix binary constants
lost@l-w.ca
parents: 70
diff changeset
637 return lw_expr_build(lw_expr_type_int, val * neg);
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
638 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
639
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
640 if (**p == '$')
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
641 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
642 // hexadecimal constant
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
643 int v = 0, v2;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
644 (*p)++;
44
1bff302e62a3 Accept negative sign after base prefix
lost@l-w.ca
parents: 38
diff changeset
645 if (**p == '-')
1bff302e62a3 Accept negative sign after base prefix
lost@l-w.ca
parents: 38
diff changeset
646 {
1bff302e62a3 Accept negative sign after base prefix
lost@l-w.ca
parents: 38
diff changeset
647 (*p)++;
1bff302e62a3 Accept negative sign after base prefix
lost@l-w.ca
parents: 38
diff changeset
648 neg = -1;
1bff302e62a3 Accept negative sign after base prefix
lost@l-w.ca
parents: 38
diff changeset
649 }
1bff302e62a3 Accept negative sign after base prefix
lost@l-w.ca
parents: 38
diff changeset
650
354
433851a26794 Make base prefix sigils error out if no number following
William Astle <lost@l-w.ca>
parents: 336
diff changeset
651 if (!**p || !strchr("0123456789abcdefABCDEF", **p))
433851a26794 Make base prefix sigils error out if no number following
William Astle <lost@l-w.ca>
parents: 336
diff changeset
652 {
433851a26794 Make base prefix sigils error out if no number following
William Astle <lost@l-w.ca>
parents: 336
diff changeset
653 (*p)--;
433851a26794 Make base prefix sigils error out if no number following
William Astle <lost@l-w.ca>
parents: 336
diff changeset
654 if (neg < 0)
433851a26794 Make base prefix sigils error out if no number following
William Astle <lost@l-w.ca>
parents: 336
diff changeset
655 (*p)--;
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
656 return NULL;
354
433851a26794 Make base prefix sigils error out if no number following
William Astle <lost@l-w.ca>
parents: 336
diff changeset
657 }
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
658 while (**p && strchr("0123456789abcdefABCDEF", **p))
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
659 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
660 v2 = toupper(**p) - '0';
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
661 if (v2 > 9)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
662 v2 -= 7;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
663 v = v * 16 + v2;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
664 (*p)++;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
665 }
44
1bff302e62a3 Accept negative sign after base prefix
lost@l-w.ca
parents: 38
diff changeset
666 return lw_expr_build(lw_expr_type_int, v * neg);
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
667 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
668
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
669 if (**p == '0' && (*((*p)+1) == 'x' || *((*p)+1) == 'X'))
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
670 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
671 // hexadecimal constant, C style
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
672 int v = 0, v2;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
673 (*p)+=2;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
674
354
433851a26794 Make base prefix sigils error out if no number following
William Astle <lost@l-w.ca>
parents: 336
diff changeset
675 if (!**p || !strchr("0123456789abcdefABCDEF", **p))
433851a26794 Make base prefix sigils error out if no number following
William Astle <lost@l-w.ca>
parents: 336
diff changeset
676 {
433851a26794 Make base prefix sigils error out if no number following
William Astle <lost@l-w.ca>
parents: 336
diff changeset
677 (*p) -= 2;
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
678 return NULL;
354
433851a26794 Make base prefix sigils error out if no number following
William Astle <lost@l-w.ca>
parents: 336
diff changeset
679 }
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
680 while (**p && strchr("0123456789abcdefABCDEF", **p))
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
681 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
682 v2 = toupper(**p) - '0';
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
683 if (v2 > 9)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
684 v2 -= 7;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
685 v = v * 16 + v2;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
686 (*p)++;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
687 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
688 return lw_expr_build(lw_expr_type_int, v);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
689 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
690
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
691 if (**p == '@' && (*((*p)+1) >= '0' && *((*p)+1) <= '7'))
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
692 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
693 // octal constant
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
694 int v = 0;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
695 (*p)++;
44
1bff302e62a3 Accept negative sign after base prefix
lost@l-w.ca
parents: 38
diff changeset
696 if (**p == '-')
1bff302e62a3 Accept negative sign after base prefix
lost@l-w.ca
parents: 38
diff changeset
697 {
1bff302e62a3 Accept negative sign after base prefix
lost@l-w.ca
parents: 38
diff changeset
698 (*p)++;
1bff302e62a3 Accept negative sign after base prefix
lost@l-w.ca
parents: 38
diff changeset
699 neg = -1;
1bff302e62a3 Accept negative sign after base prefix
lost@l-w.ca
parents: 38
diff changeset
700 }
1bff302e62a3 Accept negative sign after base prefix
lost@l-w.ca
parents: 38
diff changeset
701
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
702
354
433851a26794 Make base prefix sigils error out if no number following
William Astle <lost@l-w.ca>
parents: 336
diff changeset
703 if (!**p || !strchr("01234567", **p))
433851a26794 Make base prefix sigils error out if no number following
William Astle <lost@l-w.ca>
parents: 336
diff changeset
704 {
433851a26794 Make base prefix sigils error out if no number following
William Astle <lost@l-w.ca>
parents: 336
diff changeset
705 (*p)--;
433851a26794 Make base prefix sigils error out if no number following
William Astle <lost@l-w.ca>
parents: 336
diff changeset
706 if (neg < 0)
433851a26794 Make base prefix sigils error out if no number following
William Astle <lost@l-w.ca>
parents: 336
diff changeset
707 (*p)--;
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
708 return NULL;
354
433851a26794 Make base prefix sigils error out if no number following
William Astle <lost@l-w.ca>
parents: 336
diff changeset
709 }
433851a26794 Make base prefix sigils error out if no number following
William Astle <lost@l-w.ca>
parents: 336
diff changeset
710
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
711 while (**p && strchr("01234567", **p))
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
712 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
713 v = v * 8 + (**p - '0');
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
714 (*p)++;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
715 }
44
1bff302e62a3 Accept negative sign after base prefix
lost@l-w.ca
parents: 38
diff changeset
716 return lw_expr_build(lw_expr_type_int, v * neg);
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
717 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
718
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
719
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
720 // symbol or bare decimal or suffix constant here
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
721 do
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
722 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
723 int havedol = 0;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
724 int l = 0;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
725
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
726 while ((*p)[l] && strchr(SYMCHARS, (*p)[l]))
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
727 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
728 if ((*p)[l] == '$')
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
729 havedol = 1;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
730 l++;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
731 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
732 if (l == 0)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
733 return NULL;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
734
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
735 if ((*p)[l] == '{')
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
736 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
737 while ((*p)[l] && (*p)[l] != '}')
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
738 l++;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
739 l++;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
740 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
741
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
742 if (havedol || **p < '0' || **p > '9')
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
743 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
744 // have a symbol here
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
745 char *sym;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
746 lw_expr_t term;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
747
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
748 sym = lw_strndup(*p, l);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
749 (*p) += l;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
750 term = lw_expr_build(lw_expr_type_var, sym);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
751 lw_free(sym);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
752 return term;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
753 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
754 } while (0);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
755
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
756 if (!**p)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
757 return NULL;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
758
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
759 // we have a numeric constant here, either decimal or postfix base notation
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
760 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
761 int decval = 0, binval = 0, hexval = 0, octval = 0;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
762 int valtype = 15; // 1 = bin, 2 = oct, 4 = dec, 8 = hex
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
763 int bindone = 0;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
764 int val;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
765 int dval;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
766
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
767 while (1)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
768 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
769 if (!**p || !strchr("0123456789ABCDEFabcdefqhoQHO", **p))
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
770 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
771 // we can legally be bin or decimal here
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
772 if (bindone)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
773 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
774 // just finished a binary value
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
775 val = binval;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
776 break;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
777 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
778 else if (valtype & 4)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
779 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
780 val = decval;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
781 break;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
782 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
783 else
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
784 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
785 // bad value
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
786 return NULL;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
787 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
788 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
789
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
790 dval = toupper(**p);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
791 (*p)++;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
792
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
793 if (bindone)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
794 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
795 // any characters past "B" means it is not binary
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
796 bindone = 0;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
797 valtype &= 14;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
798 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
799
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
800 switch (dval)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
801 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
802 case 'Q':
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
803 case 'O':
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
804 if (valtype & 2)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
805 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
806 val = octval;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
807 valtype = -1;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
808 break;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
809 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
810 else
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
811 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
812 return NULL;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
813 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
814 /* can't get here */
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
815
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
816 case 'H':
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
817 if (valtype & 8)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
818 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
819 val = hexval;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
820 valtype = -1;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
821 break;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
822 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
823 else
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
824 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
825 return NULL;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
826 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
827 /* can't get here */
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
828
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
829 case 'B':
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
830 // this is a bit of a sticky one since B may be a
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
831 // hex number instead of the end of a binary number
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
832 // so it falls through to the digit case
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
833 if (valtype & 1)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
834 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
835 // could still be binary of hex
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
836 bindone = 1;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
837 valtype = 9;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
838 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
839 /* fall through intented */
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
840
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
841 default:
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
842 // digit
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
843 dval -= '0';
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
844 if (dval > 9)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
845 dval -= 7;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
846 if (valtype & 8)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
847 hexval = hexval * 16 + dval;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
848 if (valtype & 4)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
849 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
850 if (dval > 9)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
851 valtype &= 11;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
852 else
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
853 decval = decval * 10 + dval;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
854 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
855 if (valtype & 2)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
856 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
857 if (dval > 7)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
858 valtype &= 13;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
859 else
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
860 octval = octval * 8 + dval;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
861 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
862 if (valtype & 1)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
863 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
864 if (dval > 1)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
865 valtype &= 14;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
866 else
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
867 binval = binval * 2 + dval;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
868 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
869 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
870 if (valtype == -1)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
871 break;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
872
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
873 // return if no more valid types
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
874 if (valtype == 0)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
875 return NULL;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
876
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
877 val = decval; // in case we fall through
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
878 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
879
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
880 // get here if we have a value
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
881 return lw_expr_build(lw_expr_type_int, val);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
882 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
883 // can't get here
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
884 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
885
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
886 lw_expr_t lwasm_parse_expr(asmstate_t *as, char **p)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
887 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
888 lw_expr_t e;
366
433dbc18fb41 Make byte overflow detection for 8 bit immediate not fail with COM operator
William Astle <lost@l-w.ca>
parents: 354
diff changeset
889
433dbc18fb41 Make byte overflow detection for 8 bit immediate not fail with COM operator
William Astle <lost@l-w.ca>
parents: 354
diff changeset
890 if (as->exprwidth != 16)
433dbc18fb41 Make byte overflow detection for 8 bit immediate not fail with COM operator
William Astle <lost@l-w.ca>
parents: 354
diff changeset
891 {
433dbc18fb41 Make byte overflow detection for 8 bit immediate not fail with COM operator
William Astle <lost@l-w.ca>
parents: 354
diff changeset
892 lw_expr_setwidth(as->exprwidth);
399
6153cb49403c Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents: 388
diff changeset
893 if (CURPRAGMA(as -> cl, PRAGMA_NEWSOURCE))
6153cb49403c Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents: 388
diff changeset
894 e = lw_expr_parse(p, as);
6153cb49403c Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents: 388
diff changeset
895 else
6153cb49403c Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents: 388
diff changeset
896 e = lw_expr_parse_compact(p, as);
366
433dbc18fb41 Make byte overflow detection for 8 bit immediate not fail with COM operator
William Astle <lost@l-w.ca>
parents: 354
diff changeset
897 lw_expr_setwidth(0);
433dbc18fb41 Make byte overflow detection for 8 bit immediate not fail with COM operator
William Astle <lost@l-w.ca>
parents: 354
diff changeset
898 }
433dbc18fb41 Make byte overflow detection for 8 bit immediate not fail with COM operator
William Astle <lost@l-w.ca>
parents: 354
diff changeset
899 else
433dbc18fb41 Make byte overflow detection for 8 bit immediate not fail with COM operator
William Astle <lost@l-w.ca>
parents: 354
diff changeset
900 {
399
6153cb49403c Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents: 388
diff changeset
901 if (CURPRAGMA(as -> cl, PRAGMA_NEWSOURCE))
6153cb49403c Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents: 388
diff changeset
902 e = lw_expr_parse(p, as);
6153cb49403c Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents: 388
diff changeset
903 else
6153cb49403c Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents: 388
diff changeset
904 e = lw_expr_parse_compact(p, as);
366
433dbc18fb41 Make byte overflow detection for 8 bit immediate not fail with COM operator
William Astle <lost@l-w.ca>
parents: 354
diff changeset
905 }
399
6153cb49403c Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents: 388
diff changeset
906 lwasm_skip_to_next_token(as -> cl, p);
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
907 return e;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
908 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
909
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
910 int lwasm_reduce_expr(asmstate_t *as, lw_expr_t expr)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
911 {
216
398773d7e504 Fix crash bug on indexed expression handling
William Astle <lost@l-w.ca>
parents: 211
diff changeset
912 if (expr)
398773d7e504 Fix crash bug on indexed expression handling
William Astle <lost@l-w.ca>
parents: 211
diff changeset
913 lw_expr_simplify(expr, as);
2
7317fbe024af Clean up insane number of compiler warnings under -Wall
lost@l-w.ca
parents: 0
diff changeset
914 return 0;
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
915 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
916
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
917 void lwasm_save_expr(line_t *cl, int id, lw_expr_t expr)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
918 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
919 struct line_expr_s *e;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
920
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
921 for (e = cl -> exprs; e; e = e -> next)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
922 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
923 if (e -> id == id)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
924 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
925 lw_expr_destroy(e -> expr);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
926 e -> expr = expr;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
927 return;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
928 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
929 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
930
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
931 e = lw_alloc(sizeof(struct line_expr_s));
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
932 e -> expr = expr;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
933 e -> id = id;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
934 e -> next = cl -> exprs;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
935 cl -> exprs = e;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
936 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
937
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
938 lw_expr_t lwasm_fetch_expr(line_t *cl, int id)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
939 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
940 struct line_expr_s *e;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
941
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
942 for (e = cl -> exprs; e; e = e -> next)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
943 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
944 if (e -> id == id)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
945 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
946 return e -> expr;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
947 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
948 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
949 return NULL;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
950 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
951
399
6153cb49403c Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents: 388
diff changeset
952 void skip_operand_real(line_t *cl, char **p)
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
953 {
399
6153cb49403c Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents: 388
diff changeset
954 if (CURPRAGMA(cl, PRAGMA_NEWSOURCE))
6153cb49403c Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents: 388
diff changeset
955 return;
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
956 for (; **p && !isspace(**p); (*p)++)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
957 /* do nothing */ ;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
958 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
959
432
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
960 struct auxdata {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
961 int v;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
962 int oc;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
963 int ms;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
964 };
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
965
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
966 int lwasm_emitexpr_auxlwmod(lw_expr_t expr, void *arg)
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
967 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
968 struct auxdata *ad = arg;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
969 if (lw_expr_istype(expr, lw_expr_type_int))
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
970 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
971 ad -> v = lw_expr_intval(expr);
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
972 return 0;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
973 }
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
974 if (lw_expr_istype(expr, lw_expr_type_special))
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
975 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
976 if (lw_expr_specint(expr) == lwasm_expr_secbase)
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
977 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
978 sectiontab_t *s;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
979 s = lw_expr_specptr(expr);
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
980 if (strcmp(s -> name, "main") == 0)
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
981 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
982 ad -> ms = 1;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
983 return 0;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
984 }
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
985 if (strcmp(s -> name, "bss"))
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
986 return -1;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
987 return 0;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
988 }
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
989 return -1;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
990 }
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
991 if (lw_expr_whichop(expr) == lw_expr_oper_plus)
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
992 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
993 if (ad -> oc)
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
994 return -1;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
995 ad -> oc = 1;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
996 return 0;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
997 }
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
998 return -1;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
999 }
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1000
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1001 int lwasm_emitexpr(line_t *l, lw_expr_t expr, int size)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1002 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1003 int v = 0;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1004 int ol;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1005
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1006 ol = l -> outputl;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1007 if (ol == -1)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1008 ol = 0;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1009
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1010 if (lw_expr_istype(expr, lw_expr_type_int))
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1011 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1012 v = lw_expr_intval(expr);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1013 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1014 // handle external/cross-section/incomplete references here
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1015 else
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1016 {
432
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1017 if (l -> as -> output_format == OUTPUT_LWMOD)
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1018 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1019 reloctab_t *re;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1020 lw_expr_t te;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1021 struct auxdata ad;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1022 ad.v = 0;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1023 ad.oc = 0;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1024 ad.ms = 0;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1025
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1026 if (l -> csect == NULL)
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1027 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1028 lwasm_register_error(l -> as, l, E_INSTRUCTION_SECTION);
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1029 return -1;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1030 }
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1031 if (size != 2)
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1032 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1033 lwasm_register_error(l -> as, l, E_OPERAND_BAD);
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1034 return -1;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1035 }
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1036 // we have a 16 bit reference here - we need to check to make sure
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1037 // it's at most a + or - with the BSS section base
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1038 v = lw_expr_whichop(expr);
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1039 if (v == -1)
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1040 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1041 v = 0;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1042 if (lw_expr_testterms(expr, lwasm_emitexpr_auxlwmod, &ad) != 0)
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1043 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1044 lwasm_register_error(l -> as, l, E_COMPLEX_INCOMPLETE);
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1045 return -1;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1046 }
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1047 v = ad.v;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1048 }
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1049 else if (v == lw_expr_oper_plus)
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1050 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1051 v = 0;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1052 if (lw_expr_operandcount(expr) > 2)
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1053 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1054 lwasm_register_error(l -> as, l, E_COMPLEX_INCOMPLETE);
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1055 return -1;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1056 }
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1057 if (lw_expr_testterms(expr, lwasm_emitexpr_auxlwmod, &ad) != 0)
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1058 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1059 lwasm_register_error(l -> as, l, E_COMPLEX_INCOMPLETE);
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1060 return -1;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1061 }
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1062 v = ad.v;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1063 }
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1064 else
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1065 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1066 lwasm_register_error(l -> as, l, E_COMPLEX_INCOMPLETE);
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1067 return -1;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1068 }
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1069
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1070 // add "expression" record to section table
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1071 re = lw_alloc(sizeof(reloctab_t));
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1072 re -> next = l -> csect -> reloctab;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1073 l -> csect -> reloctab = re;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1074 te = lw_expr_build(lw_expr_type_int, ol);
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1075 re -> offset = lw_expr_build(lw_expr_type_oper, lw_expr_oper_plus, l -> addr, te);
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1076 lw_expr_destroy(te);
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1077 lwasm_reduce_expr(l -> as, re -> offset);
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1078 re -> size = size;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1079 if (ad.ms == 1)
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1080 re -> expr = lw_expr_copy(expr);
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1081 else
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1082 re -> expr = NULL;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1083
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1084 lwasm_emit(l, v >> 8);
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1085 lwasm_emit(l, v & 0xff);
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1086 return 0;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1087 }
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 413
diff changeset
1088 else if (l -> as -> output_format == OUTPUT_OBJ)
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1089 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1090 reloctab_t *re;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1091 lw_expr_t te;
13
c80e5a063967 Brought forward patch to fix segfault with output outside of a section
lost@l-w.ca
parents: 2
diff changeset
1092
c80e5a063967 Brought forward patch to fix segfault with output outside of a section
lost@l-w.ca
parents: 2
diff changeset
1093 if (l -> csect == NULL)
c80e5a063967 Brought forward patch to fix segfault with output outside of a section
lost@l-w.ca
parents: 2
diff changeset
1094 {
370
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
1095 lwasm_register_error(l -> as, l, E_INSTRUCTION_SECTION);
24
421d7ceb4d86 Fixed missing return value
lost@l-w.ca
parents: 13
diff changeset
1096 return -1;
13
c80e5a063967 Brought forward patch to fix segfault with output outside of a section
lost@l-w.ca
parents: 2
diff changeset
1097 }
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1098
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1099 if (size == 4)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1100 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1101 // create a two part reference because lwlink doesn't
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1102 // support 32 bit references
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1103 lw_expr_t te2;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1104 te = lw_expr_build(lw_expr_type_int, 0x10000);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1105 te2 = lw_expr_build(lw_expr_type_oper, lw_expr_oper_divide, expr, te);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1106 lw_expr_destroy(te);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1107
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1108 re = lw_alloc(sizeof(reloctab_t));
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1109 re -> next = l -> csect -> reloctab;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1110 l -> csect -> reloctab = re;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1111 te = lw_expr_build(lw_expr_type_int, ol);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1112 re -> offset = lw_expr_build(lw_expr_type_oper, lw_expr_oper_plus, l -> addr, te);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1113 lw_expr_destroy(te);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1114 lwasm_reduce_expr(l -> as, re -> offset);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1115 re -> expr = te2;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1116 re -> size = 2;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1117
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1118 te = lw_expr_build(lw_expr_type_int, 0xFFFF);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1119 te2 = lw_expr_build(lw_expr_type_oper, lw_expr_oper_bwand, expr, te);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1120 lw_expr_destroy(te);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1121
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1122 re = lw_alloc(sizeof(reloctab_t));
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1123 re -> next = l -> csect -> reloctab;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1124 l -> csect -> reloctab = re;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1125 te = lw_expr_build(lw_expr_type_int, ol + 2);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1126 re -> offset = lw_expr_build(lw_expr_type_oper, lw_expr_oper_plus, l -> addr, te);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1127 lw_expr_destroy(te);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1128 lwasm_reduce_expr(l -> as, re -> offset);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1129 re -> expr = te2;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1130 re -> size = 2;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1131 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1132 else
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1133 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1134 // add "expression" record to section table
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1135 re = lw_alloc(sizeof(reloctab_t));
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1136 re -> next = l -> csect -> reloctab;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1137 l -> csect -> reloctab = re;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1138 te = lw_expr_build(lw_expr_type_int, ol);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1139 re -> offset = lw_expr_build(lw_expr_type_oper, lw_expr_oper_plus, l -> addr, te);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1140 lw_expr_destroy(te);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1141 lwasm_reduce_expr(l -> as, re -> offset);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1142 re -> size = size;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1143 re -> expr = lw_expr_copy(expr);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1144 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1145 for (v = 0; v < size; v++)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1146 lwasm_emit(l, 0);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1147 return 0;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1148 }
370
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
1149 lwasm_register_error(l->as, l, E_EXPRESSION_NOT_RESOLVED);
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1150 return -1;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1151 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1152
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1153 switch (size)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1154 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1155 case 4:
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1156 lwasm_emit(l, v >> 24);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1157 lwasm_emit(l, v >> 16);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1158 /* fallthrough intended */
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1159
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1160 case 2:
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1161 lwasm_emit(l, v >> 8);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1162 /* fallthrough intended */
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1163
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1164 case 1:
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1165 lwasm_emit(l, v);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1166 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1167
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1168 return 0;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1169 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1170
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1171 int lwasm_lookupreg2(const char *regs, char **p)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1172 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1173 int rval = 0;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1174
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1175 while (*regs)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1176 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1177 if (toupper(**p) == *regs)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1178 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1179 if (regs[1] == ' ' && !isalpha(*(*p + 1)))
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1180 break;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1181 if (toupper(*(*p + 1)) == regs[1])
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1182 break;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1183 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1184 regs += 2;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1185 rval++;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1186 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1187 if (!*regs)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1188 return -1;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1189 if (regs[1] == ' ')
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1190 (*p)++;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1191 else
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1192 (*p) += 2;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1193 return rval;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1194 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1195
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1196 int lwasm_lookupreg3(const char *regs, char **p)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1197 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1198 int rval = 0;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1199
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1200 while (*regs)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1201 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1202 if (toupper(**p) == *regs)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1203 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1204 if (regs[1] == ' ' && !isalpha(*(*p + 1)))
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1205 break;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1206 if (toupper(*(*p + 1)) == regs[1])
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1207 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1208 if (regs[2] == ' ' && !isalpha(*(*p + 2)))
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1209 break;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1210 if (toupper(*(*p + 2)) == regs[2])
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1211 break;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1212 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1213 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1214 regs += 3;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1215 rval++;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1216 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1217 if (!*regs)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1218 return -1;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1219 if (regs[1] == ' ')
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1220 (*p)++;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1221 else if (regs[2] == ' ')
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1222 (*p) += 2;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1223 else
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1224 (*p) += 3;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1225 return rval;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1226 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1227
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1228 void lwasm_show_errors(asmstate_t *as)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1229 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1230 line_t *cl;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1231 lwasm_error_t *e;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1232
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1233 for (cl = as -> line_head; cl; cl = cl -> next)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1234 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1235 if (!(cl -> err) && !(cl -> warn))
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1236 continue;
388
f813a56178c0 Make error output more friendly to IDEs
William Astle <lost@l-w.ca>
parents: 382
diff changeset
1237
f813a56178c0 Make error output more friendly to IDEs
William Astle <lost@l-w.ca>
parents: 382
diff changeset
1238 // trim "include:" if it appears
f813a56178c0 Make error output more friendly to IDEs
William Astle <lost@l-w.ca>
parents: 382
diff changeset
1239 char* s = cl->linespec;
f813a56178c0 Make error output more friendly to IDEs
William Astle <lost@l-w.ca>
parents: 382
diff changeset
1240 if ((strlen(s) > 8) && (s[7] == ':')) s += 8;
f813a56178c0 Make error output more friendly to IDEs
William Astle <lost@l-w.ca>
parents: 382
diff changeset
1241 while (*s == ' ') s++;
f813a56178c0 Make error output more friendly to IDEs
William Astle <lost@l-w.ca>
parents: 382
diff changeset
1242
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1243 for (e = cl -> err; e; e = e -> next)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1244 {
388
f813a56178c0 Make error output more friendly to IDEs
William Astle <lost@l-w.ca>
parents: 382
diff changeset
1245 fprintf(stderr, "%s(%d) : ERROR : %s\n", s, cl->lineno, e->mess);
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1246 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1247 for (e = cl -> warn; e; e = e -> next)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1248 {
388
f813a56178c0 Make error output more friendly to IDEs
William Astle <lost@l-w.ca>
parents: 382
diff changeset
1249 fprintf(stderr, "%s(%d) : WARNING : %s\n", s, cl->lineno, e->mess);
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1250 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1251 fprintf(stderr, "%s:%05d %s\n\n", cl -> linespec, cl -> lineno, cl -> ltext);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1252 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1253 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1254
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1255 /*
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1256 this does any passes and other gymnastics that might be useful
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1257 to see if an expression reduces early
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1258 */
374
8e25147c2aa8 Clean up various "externs"
William Astle <lost@l-w.ca>
parents: 370
diff changeset
1259 void do_pass3(asmstate_t *as);
8e25147c2aa8 Clean up various "externs"
William Astle <lost@l-w.ca>
parents: 370
diff changeset
1260 void do_pass4_aux(asmstate_t *as, int force);
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1261
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1262 void lwasm_interim_reduce(asmstate_t *as)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1263 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1264 do_pass3(as);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1265 // do_pass4_aux(as, 0);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1266 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1267
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1268 lw_expr_t lwasm_parse_cond(asmstate_t *as, char **p)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1269 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1270 lw_expr_t e;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1271
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1272 debug_message(as, 250, "Parsing condition");
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1273 e = lwasm_parse_expr(as, p);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1274 debug_message(as, 250, "COND EXPR: %s", lw_expr_print(e));
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1275
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1276 if (!e)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1277 {
370
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
1278 lwasm_register_error(as, as -> cl, E_EXPRESSION_BAD);
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1279 return NULL;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1280 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1281
210
5d969517db74 Added condundefzero pragma
William Astle <lost@l-w.ca>
parents: 209
diff changeset
1282 /* handle condundefzero */
5d969517db74 Added condundefzero pragma
William Astle <lost@l-w.ca>
parents: 209
diff changeset
1283 if (CURPRAGMA(as -> cl, PRAGMA_CONDUNDEFZERO))
5d969517db74 Added condundefzero pragma
William Astle <lost@l-w.ca>
parents: 209
diff changeset
1284 {
5d969517db74 Added condundefzero pragma
William Astle <lost@l-w.ca>
parents: 209
diff changeset
1285 as -> undefzero = 1;
5d969517db74 Added condundefzero pragma
William Astle <lost@l-w.ca>
parents: 209
diff changeset
1286 lwasm_reduce_expr(as, e);
5d969517db74 Added condundefzero pragma
William Astle <lost@l-w.ca>
parents: 209
diff changeset
1287 as -> undefzero = 0;
5d969517db74 Added condundefzero pragma
William Astle <lost@l-w.ca>
parents: 209
diff changeset
1288 }
5d969517db74 Added condundefzero pragma
William Astle <lost@l-w.ca>
parents: 209
diff changeset
1289
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1290 /* we need to simplify the expression here */
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1291 debug_message(as, 250, "Doing interim reductions");
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1292 lwasm_interim_reduce(as);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1293 debug_message(as, 250, "COND EXPR: %s", lw_expr_print(e));
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1294 debug_message(as, 250, "Reducing expression");
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1295 lwasm_reduce_expr(as, e);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1296 debug_message(as, 250, "COND EXPR: %s", lw_expr_print(e));
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1297 /* lwasm_reduce_expr(as, e);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1298 debug_message(as, 250, "COND EXPR: %s", lw_expr_print(e));
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1299 lwasm_reduce_expr(as, e);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1300 debug_message(as, 250, "COND EXPR: %s", lw_expr_print(e));
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1301 lwasm_reduce_expr(as, e);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1302 debug_message(as, 250, "COND EXPR: %s", lw_expr_print(e));
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1303 */
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1304
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1305 lwasm_save_expr(as -> cl, 4242, e);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1306
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1307 if (!lw_expr_istype(e, lw_expr_type_int))
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1308 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1309 debug_message(as, 250, "Non-constant expression");
370
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 366
diff changeset
1310 lwasm_register_error(as, as -> cl, E_CONDITION_P1);
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1311 return NULL;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1312 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1313 debug_message(as, 250, "Returning expression");
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1314 return e;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1315 }
241
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1316
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1317 struct range_data
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1318 {
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1319 int min;
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1320 int max;
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1321 asmstate_t *as;
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1322 };
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1323 int lwasm_calculate_range(asmstate_t *as, lw_expr_t expr, int *min, int *max);
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1324 int lwasm_calculate_range_tf(lw_expr_t e, void *info)
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1325 {
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1326 struct range_data *rd = info;
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1327 int i;
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1328
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1329 if (lw_expr_istype(e, lw_expr_type_int))
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1330 {
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1331 i = lw_expr_intval(e);
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1332 rd -> min += i;
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1333 rd -> max += i;
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1334 return 0;
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1335 }
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1336
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1337 if (lw_expr_istype(e, lw_expr_type_special))
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1338 {
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1339 line_t *l;
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1340 if (lw_expr_specint(e) != lwasm_expr_linelen)
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1341 {
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1342 rd -> min = -1;
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1343 return -1;
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1344 }
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1345 l = (line_t *)lw_expr_specptr(e);
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1346 if (l -> len == -1)
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1347 {
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1348 rd -> min += l -> minlen;
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1349 rd -> max += l -> maxlen;
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1350 }
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1351 else
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1352 {
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1353 rd -> min += l -> len;
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1354 }
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1355 return 0;
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1356 }
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1357
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1358 if (lw_expr_istype(e, lw_expr_type_var))
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1359 {
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1360 lw_expr_t te;
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1361 te = lw_expr_copy(e);
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1362 lwasm_reduce_expr(rd -> as, te);
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1363 if (lw_expr_istype(te, lw_expr_type_int))
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1364 {
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1365 i = lw_expr_intval(te);
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1366 rd -> min += i;
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1367 rd -> max += i;
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1368 }
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1369 else
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1370 {
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1371 rd -> min = -1;
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1372 }
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1373 lw_expr_destroy(te);
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1374 if (rd -> min == -1)
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1375 return -1;
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1376 return 0;
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1377 }
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1378
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1379 if (lw_expr_istype(e, lw_expr_type_oper))
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1380 {
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1381 if (lw_expr_whichop(e) == lw_expr_oper_plus)
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1382 return 0;
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1383 rd -> min = -1;
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1384 return -1;
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1385 }
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1386
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1387 rd -> min = -1;
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1388 return -1;
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1389 }
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1390
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1391 int lwasm_calculate_range(asmstate_t *as, lw_expr_t expr, int *min, int *max)
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1392 {
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1393 struct range_data rd;
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1394
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1395 rd.min = 0;
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1396 rd.max = 0;
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1397 rd.as = as;
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1398
256
bc25269d96bc Fix crash on expression range calculation
William Astle <lost@l-w.ca>
parents: 249
diff changeset
1399 if (!expr)
bc25269d96bc Fix crash on expression range calculation
William Astle <lost@l-w.ca>
parents: 249
diff changeset
1400 return -1;
bc25269d96bc Fix crash on expression range calculation
William Astle <lost@l-w.ca>
parents: 249
diff changeset
1401
241
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1402 lw_expr_testterms(expr, lwasm_calculate_range_tf, (void *)&rd);
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1403 *min = rd.min;
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1404 *max = rd.max;
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1405 if (rd.min == -1)
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1406 return -1;
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1407 return 0;
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 240
diff changeset
1408 }
336
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1409
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1410 void lwasm_reduce_line_exprs(line_t *cl)
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1411 {
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1412 asmstate_t *as;
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1413 struct line_expr_s *le;
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1414 int i;
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1415
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1416 as = cl -> as;
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1417 as -> cl = cl;
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1418
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1419 // simplify address
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1420 lwasm_reduce_expr(as, cl -> addr);
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1421
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1422 // simplify data address
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1423 lwasm_reduce_expr(as, cl -> daddr);
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1424
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1425 // simplify each expression
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1426 for (i = 0, le = cl -> exprs; le; le = le -> next, i++)
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1427 {
433
b1adf549d181 Add some debugging instrumentation for tracking an expression bug
William Astle <lost@l-w.ca>
parents: 432
diff changeset
1428 debug_message(as, 101, "Reduce expressions: (pre) exp[%d] = %s", i, lw_expr_print(le -> expr));
336
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1429 lwasm_reduce_expr(as, le -> expr);
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1430 debug_message(as, 100, "Reduce expressions: exp[%d] = %s", i, lw_expr_print(le -> expr));
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1431 }
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1432
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1433 if (cl -> len == -1 || cl -> dlen == -1)
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1434 {
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1435 // try resolving the instruction length
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1436 // but don't force resolution
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1437 if (cl -> insn >= 0 && instab[cl -> insn].resolve)
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1438 {
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1439 (instab[cl -> insn].resolve)(as, cl, 0);
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1440 if ((cl -> inmod == 0) && cl -> len >= 0 && cl -> dlen >= 0)
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1441 {
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1442 if (cl -> len == 0)
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1443 cl -> len = cl -> dlen;
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1444 else
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1445 cl -> dlen = cl -> len;
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1446 }
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1447 }
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1448 }
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1449 debug_message(as, 100, "Reduce expressions: len = %d", cl -> len);
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1450 debug_message(as, 100, "Reduce expressions: dlen = %d", cl -> dlen);
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1451 debug_message(as, 100, "Reduce expressions: addr = %s", lw_expr_print(cl -> addr));
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1452 debug_message(as, 100, "Reduce expressions: daddr = %s", lw_expr_print(cl -> daddr));
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 326
diff changeset
1453 }