annotate lwasm/pseudo.c @ 159:71561c12b20b

Updated docs to reflect new cescapes pragma and discuss implicit assumption of the bss section flag for sections named bss and .bss
author lost
date Sat, 31 Jan 2009 06:32:27 +0000
parents f0527dc3804d
children b061350c17e4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
1 /*
4
34568fab6058 Fixed package to include all required files; also added copyright preamble to all source files
lost
parents: 0
diff changeset
2 pseudo.c
47
804d7465e0f9 Implemented ORG and fixed problems with constants using $, &, or @ to specify base
lost
parents: 4
diff changeset
3 Copyright © 2009 William Astle
4
34568fab6058 Fixed package to include all required files; also added copyright preamble to all source files
lost
parents: 0
diff changeset
4
34568fab6058 Fixed package to include all required files; also added copyright preamble to all source files
lost
parents: 0
diff changeset
5 This file is part of LWASM.
34568fab6058 Fixed package to include all required files; also added copyright preamble to all source files
lost
parents: 0
diff changeset
6
34568fab6058 Fixed package to include all required files; also added copyright preamble to all source files
lost
parents: 0
diff changeset
7 LWASM is free software: you can redistribute it and/or modify it under the
34568fab6058 Fixed package to include all required files; also added copyright preamble to all source files
lost
parents: 0
diff changeset
8 terms of the GNU General Public License as published by the Free Software
34568fab6058 Fixed package to include all required files; also added copyright preamble to all source files
lost
parents: 0
diff changeset
9 Foundation, either version 3 of the License, or (at your option) any later
34568fab6058 Fixed package to include all required files; also added copyright preamble to all source files
lost
parents: 0
diff changeset
10 version.
34568fab6058 Fixed package to include all required files; also added copyright preamble to all source files
lost
parents: 0
diff changeset
11
34568fab6058 Fixed package to include all required files; also added copyright preamble to all source files
lost
parents: 0
diff changeset
12 This program is distributed in the hope that it will be useful, but WITHOUT
34568fab6058 Fixed package to include all required files; also added copyright preamble to all source files
lost
parents: 0
diff changeset
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
34568fab6058 Fixed package to include all required files; also added copyright preamble to all source files
lost
parents: 0
diff changeset
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
34568fab6058 Fixed package to include all required files; also added copyright preamble to all source files
lost
parents: 0
diff changeset
15 more details.
34568fab6058 Fixed package to include all required files; also added copyright preamble to all source files
lost
parents: 0
diff changeset
16
34568fab6058 Fixed package to include all required files; also added copyright preamble to all source files
lost
parents: 0
diff changeset
17 You should have received a copy of the GNU General Public License along with
34568fab6058 Fixed package to include all required files; also added copyright preamble to all source files
lost
parents: 0
diff changeset
18 this program. If not, see <http://www.gnu.org/licenses/>.
34568fab6058 Fixed package to include all required files; also added copyright preamble to all source files
lost
parents: 0
diff changeset
19
34568fab6058 Fixed package to include all required files; also added copyright preamble to all source files
lost
parents: 0
diff changeset
20
34568fab6058 Fixed package to include all required files; also added copyright preamble to all source files
lost
parents: 0
diff changeset
21 This file implements the various pseudo operations.
34568fab6058 Fixed package to include all required files; also added copyright preamble to all source files
lost
parents: 0
diff changeset
22 */
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
23
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
24 #include <stdlib.h>
50
e672232caffe Added rmb pseudo op
lost
parents: 49
diff changeset
25 #include <string.h>
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
26 #include "lwasm.h"
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
27 #include "instab.h"
47
804d7465e0f9 Implemented ORG and fixed problems with constants using $, &, or @ to specify base
lost
parents: 4
diff changeset
28 #include "expr.h"
52
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
29 #include "util.h"
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
30
52
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
31 extern int lwasm_read_file(asmstate_t *as, const char *filename);
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
32
158
f0527dc3804d Added support for .globl <sym>, .area <section>, .word, .byte, .blkb, and a .module directive that does nothing
lost
parents: 151
diff changeset
33 OPFUNC(pseudo_noop)
f0527dc3804d Added support for .globl <sym>, .area <section>, .word, .byte, .blkb, and a .module directive that does nothing
lost
parents: 151
diff changeset
34 {
f0527dc3804d Added support for .globl <sym>, .area <section>, .word, .byte, .blkb, and a .module directive that does nothing
lost
parents: 151
diff changeset
35
f0527dc3804d Added support for .globl <sym>, .area <section>, .word, .byte, .blkb, and a .module directive that does nothing
lost
parents: 151
diff changeset
36 }
f0527dc3804d Added support for .globl <sym>, .area <section>, .word, .byte, .blkb, and a .module directive that does nothing
lost
parents: 151
diff changeset
37
47
804d7465e0f9 Implemented ORG and fixed problems with constants using $, &, or @ to specify base
lost
parents: 4
diff changeset
38 OPFUNC(pseudo_org)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
39 {
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
40 int v, r;
52
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
41
74
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
42 if (as -> csect)
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
43 {
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
44 register_error(as, l, 1, "ORG not allowed within sections");
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
45 return;
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
46 }
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
47
52
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
48 if (as -> passnum != 1)
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
49 {
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
50 // org is not needed to be processed on pass 2
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
51 // this will prevent phasing errors for forward references that
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
52 // resolve on the second pass
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
53 // we saved the org address in l -> codeaddr on pass 1
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
54 as -> addr = l -> codeaddr;
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
55 return;
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
56 }
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
57
47
804d7465e0f9 Implemented ORG and fixed problems with constants using $, &, or @ to specify base
lost
parents: 4
diff changeset
58 if (l -> sym)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
59 {
47
804d7465e0f9 Implemented ORG and fixed problems with constants using $, &, or @ to specify base
lost
parents: 4
diff changeset
60 register_error(as, l, 1, "No symbol allowed with ORG");
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
61 }
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
62
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
63 r = lwasm_expr_result2(as, l, p, EXPR_PASS1CONST, &v, 0);
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
64 if (r != 0)
47
804d7465e0f9 Implemented ORG and fixed problems with constants using $, &, or @ to specify base
lost
parents: 4
diff changeset
65 return;
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
66 l -> codeaddr = v;
49
21ae0fab469b Added needed infra for useful listing of EQU and ORG type statements
lost
parents: 47
diff changeset
67 l -> addrset = 1;
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
68 as -> addr = v;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
69 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
70
47
804d7465e0f9 Implemented ORG and fixed problems with constants using $, &, or @ to specify base
lost
parents: 4
diff changeset
71 /*
52
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
72 The operand for include is a string optionally enclosed in "
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
73 */
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
74 OPFUNC(pseudo_include)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
75 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
76 int v1;
52
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
77 char *fn;
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
78
52
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
79 // only include files on pass 1
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
80 // but make sure local include context is right
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
81 // for the next line...
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
82 if (as -> passnum != 1)
52
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
83 {
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
84 as -> context = lwasm_next_context(as);
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
85 return;
52
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
86 }
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
87
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
88 while (**p && isspace(**p))
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
89 (*p)++;
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
90
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
91 if (!**p)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
92 {
52
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
93 register_error(as, l, 1, "Bad file name");
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
94 return;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
95 }
52
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
96
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
97 if (**p == '"')
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
98 {
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
99 // search for ending "
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
100 (*p)++;
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
101 for (v1 = 0; *((*p)+v1) && *((*p)+v1) != '"'; v1++)
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
102 /* do nothing */ ;
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
103 if (*((*p)+v1) != '"')
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
104 {
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
105 register_error(as, l, 1, "Bad file name");
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
106 return;
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
107 }
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
108 }
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
109 else
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
110 {
52
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
111 // search for a space type character
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
112 for (v1 = 0; *((*p)+v1) && !isspace(*((*p)+v1)); v1++)
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
113 ;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
114 }
52
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
115
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
116 fn = lwasm_alloc(v1 + 1);
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
117 memcpy(fn, *p, v1);
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
118 fn[v1] = '\0';
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
119
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
120 // end local label context on include
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
121 as -> context = lwasm_next_context(as);
52
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
122 if (lwasm_read_file(as, fn) < 0)
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
123 {
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
124 register_error(as, l, 1, "File include error (%s)", fn);
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
125 }
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
126 lwasm_free(fn);
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
127 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
128
50
e672232caffe Added rmb pseudo op
lost
parents: 49
diff changeset
129 OPFUNC(pseudo_rmb)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
130 {
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
131 int r, v;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
132
95
f3497072ac44 Fixed think-o in rm* ops (reversed pass number test)
lost
parents: 94
diff changeset
133 if (as -> passnum == 2)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
134 {
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
135 as -> addr += l -> nocodelen;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
136 return;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
137 }
103
26c058fa0bc1 Fixed up some issues with pseudo ops and object target
lost
parents: 99
diff changeset
138 r = lwasm_expr_result2(as, l, p, EXPR_SECTCONST | EXPR_PASS1CONST, &v, -1);
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
139 if (r != 0)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
140 return;
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
141 l -> nocodelen = v;
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
142 as -> addr += v;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
143 }
53
493cb8ea50a0 Added rm[dq], zm[bdq]
lost
parents: 52
diff changeset
144
493cb8ea50a0 Added rm[dq], zm[bdq]
lost
parents: 52
diff changeset
145 OPFUNC(pseudo_rmd)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
146 {
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
147 int r, v;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
148
95
f3497072ac44 Fixed think-o in rm* ops (reversed pass number test)
lost
parents: 94
diff changeset
149 if (as -> passnum == 2)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
150 {
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
151 as -> addr += l -> nocodelen;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
152 return;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
153 }
103
26c058fa0bc1 Fixed up some issues with pseudo ops and object target
lost
parents: 99
diff changeset
154 r = lwasm_expr_result2(as, l, p, EXPR_SECTCONST | EXPR_PASS1CONST, &v, 0);
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
155 if (r != 0)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
156 return;
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
157 v *= 2;
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
158 l -> nocodelen = v;
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
159 as -> addr += v;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
160 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
161
53
493cb8ea50a0 Added rm[dq], zm[bdq]
lost
parents: 52
diff changeset
162 OPFUNC(pseudo_rmq)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
163 {
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
164 int r, v;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
165
95
f3497072ac44 Fixed think-o in rm* ops (reversed pass number test)
lost
parents: 94
diff changeset
166 if (as -> passnum == 2)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
167 {
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
168 as -> addr += l -> nocodelen;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
169 return;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
170 }
103
26c058fa0bc1 Fixed up some issues with pseudo ops and object target
lost
parents: 99
diff changeset
171 r = lwasm_expr_result2(as, l, p, EXPR_SECTCONST | EXPR_PASS1CONST, &v, 0);
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
172 if (r != 0)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
173 return;
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
174 v *= 4;
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
175 l -> nocodelen = v;
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
176 as -> addr += v;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
177 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
178
53
493cb8ea50a0 Added rm[dq], zm[bdq]
lost
parents: 52
diff changeset
179 OPFUNC(pseudo_zmb)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
180 {
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
181 int r, v;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
182
103
26c058fa0bc1 Fixed up some issues with pseudo ops and object target
lost
parents: 99
diff changeset
183 r = lwasm_expr_result2(as, l, p, EXPR_SECTCONST | EXPR_PASS1CONST, &v, 0);
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
184 if (r != 0)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
185 return;
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
186 while (v--)
53
493cb8ea50a0 Added rm[dq], zm[bdq]
lost
parents: 52
diff changeset
187 lwasm_emit(as, l, 0);
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
188 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
189
53
493cb8ea50a0 Added rm[dq], zm[bdq]
lost
parents: 52
diff changeset
190 OPFUNC(pseudo_zmd)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
191 {
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
192 int r, v;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
193
103
26c058fa0bc1 Fixed up some issues with pseudo ops and object target
lost
parents: 99
diff changeset
194 r = lwasm_expr_result2(as, l, p, EXPR_SECTCONST | EXPR_PASS1CONST, &v, 0);
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
195 if (r != 0)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
196 return;
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
197 v *= 2;
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
198 while (v--)
53
493cb8ea50a0 Added rm[dq], zm[bdq]
lost
parents: 52
diff changeset
199 lwasm_emit(as, l, 0);
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
200 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
201
53
493cb8ea50a0 Added rm[dq], zm[bdq]
lost
parents: 52
diff changeset
202 OPFUNC(pseudo_zmq)
493cb8ea50a0 Added rm[dq], zm[bdq]
lost
parents: 52
diff changeset
203 {
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
204 int r, v;
53
493cb8ea50a0 Added rm[dq], zm[bdq]
lost
parents: 52
diff changeset
205
103
26c058fa0bc1 Fixed up some issues with pseudo ops and object target
lost
parents: 99
diff changeset
206 r = lwasm_expr_result2(as, l, p, EXPR_SECTCONST | EXPR_PASS1CONST, &v, 0);
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
207 if (r != 0)
53
493cb8ea50a0 Added rm[dq], zm[bdq]
lost
parents: 52
diff changeset
208 return;
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
209 v *= 4;
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
210 while (v--)
53
493cb8ea50a0 Added rm[dq], zm[bdq]
lost
parents: 52
diff changeset
211 lwasm_emit(as, l, 0);
493cb8ea50a0 Added rm[dq], zm[bdq]
lost
parents: 52
diff changeset
212 }
493cb8ea50a0 Added rm[dq], zm[bdq]
lost
parents: 52
diff changeset
213
54
360d53062bb9 Fixed typo in instruction table and added END directive
lost
parents: 53
diff changeset
214 OPFUNC(pseudo_end)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
215 {
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
216 int r, v;
54
360d53062bb9 Fixed typo in instruction table and added END directive
lost
parents: 53
diff changeset
217 lwasm_expr_stack_t *s;
360d53062bb9 Fixed typo in instruction table and added END directive
lost
parents: 53
diff changeset
218
360d53062bb9 Fixed typo in instruction table and added END directive
lost
parents: 53
diff changeset
219
360d53062bb9 Fixed typo in instruction table and added END directive
lost
parents: 53
diff changeset
220 as -> endseen = 1;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
221
54
360d53062bb9 Fixed typo in instruction table and added END directive
lost
parents: 53
diff changeset
222 // address only matters for DECB output
360d53062bb9 Fixed typo in instruction table and added END directive
lost
parents: 53
diff changeset
223 if (as -> outformat != OUTPUT_DECB)
360d53062bb9 Fixed typo in instruction table and added END directive
lost
parents: 53
diff changeset
224 return;
360d53062bb9 Fixed typo in instruction table and added END directive
lost
parents: 53
diff changeset
225
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
226 r = lwasm_expr_result2(as, l, p, 0, &v, 0);
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
227 if (r != 0)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
228 {
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
229 register_error(as, l, 2, "Bad operand");
54
360d53062bb9 Fixed typo in instruction table and added END directive
lost
parents: 53
diff changeset
230 }
360d53062bb9 Fixed typo in instruction table and added END directive
lost
parents: 53
diff changeset
231
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
232 v = v & 0xffff;
54
360d53062bb9 Fixed typo in instruction table and added END directive
lost
parents: 53
diff changeset
233 if (as -> passnum == 2)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
234 {
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
235 as -> execaddr = v;
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
236 l -> symaddr = v;
54
360d53062bb9 Fixed typo in instruction table and added END directive
lost
parents: 53
diff changeset
237 l -> addrset = 2;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
238 }
54
360d53062bb9 Fixed typo in instruction table and added END directive
lost
parents: 53
diff changeset
239 }
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
240
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
241
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
242 OPFUNC(pseudo_align)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
243 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
244 int cn;
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
245 int r, v;
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
246
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
247 if (as -> passnum == 2)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
248 {
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
249 while (as -> addr < l -> symaddr)
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
250 lwasm_emit(as, l, 0);
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
251 return;
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
252 }
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
253
103
26c058fa0bc1 Fixed up some issues with pseudo ops and object target
lost
parents: 99
diff changeset
254 r = lwasm_expr_result2(as, l, p, EXPR_SECTCONST | EXPR_PASS1CONST, &v, 0);
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
255 if (r != 0)
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
256 {
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
257 l -> symaddr = as -> addr;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
258 return;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
259 }
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
260
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
261 if (v < 1)
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
262 {
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
263 register_error(as, l, 1, "Illegal alignment %d", v);
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
264 return;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
265 }
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
266
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
267 cn = l -> codeaddr % v;
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
268 if (cn)
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
269 cn = v - cn;
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
270
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
271 while (cn--)
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
272 {
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
273 lwasm_emit(as, l, 0);
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
274 }
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
275 l -> symaddr = as -> addr;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
276 }
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
277
50
e672232caffe Added rmb pseudo op
lost
parents: 49
diff changeset
278 OPFUNC(pseudo_equ)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
279 {
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
280 int r, v;
52
b9856da2674a Added file inclusion
lost
parents: 50
diff changeset
281
50
e672232caffe Added rmb pseudo op
lost
parents: 49
diff changeset
282 if (l -> sym == NULL)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
283 {
50
e672232caffe Added rmb pseudo op
lost
parents: 49
diff changeset
284 register_error(as, l, 1, "No symbol specified");
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
285 return;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
286 }
50
e672232caffe Added rmb pseudo op
lost
parents: 49
diff changeset
287
103
26c058fa0bc1 Fixed up some issues with pseudo ops and object target
lost
parents: 99
diff changeset
288 r = lwasm_expr_result2(as, l, p, EXPR_SECTCONST | EXPR_PASS1CONST, &v, 0);
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
289 if (r < 0)
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
290 v = 0;
63
d85ba47b1e8f Moved symbol registration so symbols that are in skipped code do not get registered and so EQU/SET can do their own registration
lost
parents: 57
diff changeset
291
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
292 l -> symaddr = v & 0xFFFF;
50
e672232caffe Added rmb pseudo op
lost
parents: 49
diff changeset
293 l -> addrset = 2;
63
d85ba47b1e8f Moved symbol registration so symbols that are in skipped code do not get registered and so EQU/SET can do their own registration
lost
parents: 57
diff changeset
294
79
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
295 // note: we need to do this because the symbol might have resolved
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
296 // to a constant!
78
121bf4a588ea Checkpointing deployment of non-constant expression handling
lost
parents: 74
diff changeset
297 lwasm_register_symbol(as, l, l -> sym, v, (r > 0 ? SYMBOL_COMPLEX: SYMBOL_NORM) | SYMBOL_FORCE);
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
298 }
63
d85ba47b1e8f Moved symbol registration so symbols that are in skipped code do not get registered and so EQU/SET can do their own registration
lost
parents: 57
diff changeset
299
d85ba47b1e8f Moved symbol registration so symbols that are in skipped code do not get registered and so EQU/SET can do their own registration
lost
parents: 57
diff changeset
300 OPFUNC(pseudo_set)
d85ba47b1e8f Moved symbol registration so symbols that are in skipped code do not get registered and so EQU/SET can do their own registration
lost
parents: 57
diff changeset
301 {
79
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
302 int r, v;
64
aaddd47219b4 Added the 'set' directive
lost
parents: 63
diff changeset
303
aaddd47219b4 Added the 'set' directive
lost
parents: 63
diff changeset
304 // set MUST run on both passes as the symbol value changes!
aaddd47219b4 Added the 'set' directive
lost
parents: 63
diff changeset
305
aaddd47219b4 Added the 'set' directive
lost
parents: 63
diff changeset
306 if (l -> sym == NULL)
aaddd47219b4 Added the 'set' directive
lost
parents: 63
diff changeset
307 {
aaddd47219b4 Added the 'set' directive
lost
parents: 63
diff changeset
308 register_error(as, l, 1, "No symbol specified");
aaddd47219b4 Added the 'set' directive
lost
parents: 63
diff changeset
309 return;
aaddd47219b4 Added the 'set' directive
lost
parents: 63
diff changeset
310 }
aaddd47219b4 Added the 'set' directive
lost
parents: 63
diff changeset
311
103
26c058fa0bc1 Fixed up some issues with pseudo ops and object target
lost
parents: 99
diff changeset
312 r = lwasm_expr_result2(as, l, p, EXPR_SECTCONST | EXPR_PASS1CONST, &v, 0);
79
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
313 if (r < 0)
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
314 v = 0;
64
aaddd47219b4 Added the 'set' directive
lost
parents: 63
diff changeset
315
79
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
316 l -> symaddr = v & 0xFFFF;
64
aaddd47219b4 Added the 'set' directive
lost
parents: 63
diff changeset
317 l -> addrset = 2;
aaddd47219b4 Added the 'set' directive
lost
parents: 63
diff changeset
318
79
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
319 lwasm_register_symbol(as, l, l -> sym, v, (r > 0 ? SYMBOL_COMPLEX: SYMBOL_NORM) | SYMBOL_SET);
63
d85ba47b1e8f Moved symbol registration so symbols that are in skipped code do not get registered and so EQU/SET can do their own registration
lost
parents: 57
diff changeset
320 }
d85ba47b1e8f Moved symbol registration so symbols that are in skipped code do not get registered and so EQU/SET can do their own registration
lost
parents: 57
diff changeset
321
65
31d8e85706e7 Implemented setdp and corrected handling of direct page detection in insn_gen_aux()
lost
parents: 64
diff changeset
322 OPFUNC(pseudo_setdp)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
323 {
79
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
324 int r, v;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
325
79
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
326 if (as -> outformat == OUTPUT_OBJ)
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
327 {
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
328 register_error(as, l, 1, "SETDP not permitted with OBJ target");
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
329 return;
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
330 }
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
331
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
332 // setdp is needed on both passes; must resolve to a constant on pass 1
103
26c058fa0bc1 Fixed up some issues with pseudo ops and object target
lost
parents: 99
diff changeset
333 r = lwasm_expr_result2(as, l, p, EXPR_SECTCONST | EXPR_PASS1CONST, &v, 0);
79
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
334 if (r != 0)
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
335 return;
65
31d8e85706e7 Implemented setdp and corrected handling of direct page detection in insn_gen_aux()
lost
parents: 64
diff changeset
336
79
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
337 if (v < -127 || v > 255)
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
338 {
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
339 register_error(as, l, 1, "Byte overflow");
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
340 return;
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
341 }
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
342
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
343 l -> symaddr = v & 0xFF;
65
31d8e85706e7 Implemented setdp and corrected handling of direct page detection in insn_gen_aux()
lost
parents: 64
diff changeset
344 l -> addrset = 2;
31d8e85706e7 Implemented setdp and corrected handling of direct page detection in insn_gen_aux()
lost
parents: 64
diff changeset
345
79
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
346 as -> dpval = v & 0xFF;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
347 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
348
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
349 OPFUNC(pseudo_fcc)
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
350 {
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
351 int delim = 0;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
352
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
353 delim = **p;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
354 if (!delim)
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
355 {
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
356 register_error(as, l, 1, "Bad operand");
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
357 return;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
358 }
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
359 *p += 1;
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
360 while (**p && **p != delim)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
361 {
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
362 lwasm_emit(as, l, **p);
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
363 (*p)++;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
364 }
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
365 if (**p)
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
366 (*p)++;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
367 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
368
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
369
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
370 OPFUNC(pseudo_fcs)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
371 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
372 int delim = 0;
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
373
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
374 delim = **p;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
375 if (!delim)
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
376 {
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
377 register_error(as, l, 1, "Bad operand");
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
378 return;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
379 }
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
380 *p += 1;
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
381 while (**p && **p != delim)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
382 {
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
383 if (!*((*p) + 1) || *((*p) + 1) == delim)
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
384 lwasm_emit(as, l, **p | 0x80);
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
385 else
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
386 lwasm_emit(as, l, **p);
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
387 (*p)++;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
388 }
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
389 if (**p)
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
390 (*p)++;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
391 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
392
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
393 OPFUNC(pseudo_fcn)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
394 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
395 int delim = 0;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
396
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
397 delim = **p;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
398 if (!delim)
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
399 {
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
400 register_error(as, l, 1, "Bad operand");
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
401 return;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
402 }
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
403 *p += 1;
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
404 while (**p && **p != delim)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
405 {
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
406 lwasm_emit(as, l, **p);
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
407 (*p)++;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
408 }
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
409 if (**p)
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
410 (*p)++;
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
411 lwasm_emit(as, l, 0);
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
412 }
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
413
79
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
414 // FIXME: handle external, etc., references in a useful manner
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
415 OPFUNC(pseudo_fcb)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
416 {
79
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
417 int r, v;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
418
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
419 fcb_again:
79
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
420 r = lwasm_expr_result2(as, l, p, 0, &v, -1);
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
421 if (r < 0)
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
422 return;
79
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
423
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
424 if (r > 0)
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
425 {
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
426 register_error(as, l, 2, "Illegal external or inter-segment reference");
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
427 v = 0;
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
428 }
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
429
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
430 if (v < -127 || v > 255)
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
431 {
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
432 register_error(as, l, 1, "Byte overflow");
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
433 }
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
434
79
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
435 lwasm_emit(as, l, v);
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
436 if (**p == ',')
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
437 {
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
438 (*p)++;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
439 goto fcb_again;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
440 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
441 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
442
79
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
443 // FIXME: handle external references in an intelligent way
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
444 OPFUNC(pseudo_fdb)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
445 {
79
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
446 int r, v;
103
26c058fa0bc1 Fixed up some issues with pseudo ops and object target
lost
parents: 99
diff changeset
447 int extseen = 0;
26c058fa0bc1 Fixed up some issues with pseudo ops and object target
lost
parents: 99
diff changeset
448 char *p1;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
449
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
450 fdb_again:
103
26c058fa0bc1 Fixed up some issues with pseudo ops and object target
lost
parents: 99
diff changeset
451 p1 = *p;
79
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
452 r = lwasm_expr_result2(as, l, p, 0, &v, -1);
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
453 if (r < 0)
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
454 return;
79
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
455
103
26c058fa0bc1 Fixed up some issues with pseudo ops and object target
lost
parents: 99
diff changeset
456 if (r > 0 && extseen == 1)
79
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
457 {
103
26c058fa0bc1 Fixed up some issues with pseudo ops and object target
lost
parents: 99
diff changeset
458 register_error(as, l, 2, "Illegal external or inter-segment reference (only 1 per FDB line)");
79
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
459 v = 0;
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
460 }
103
26c058fa0bc1 Fixed up some issues with pseudo ops and object target
lost
parents: 99
diff changeset
461 else if (r > 0)
26c058fa0bc1 Fixed up some issues with pseudo ops and object target
lost
parents: 99
diff changeset
462 {
26c058fa0bc1 Fixed up some issues with pseudo ops and object target
lost
parents: 99
diff changeset
463 l -> relocoff = as -> addr - l -> codeaddr;
26c058fa0bc1 Fixed up some issues with pseudo ops and object target
lost
parents: 99
diff changeset
464 *p = p1;
26c058fa0bc1 Fixed up some issues with pseudo ops and object target
lost
parents: 99
diff changeset
465 r = lwasm_expr_result2(as, l, p, 0, &v, 0);
26c058fa0bc1 Fixed up some issues with pseudo ops and object target
lost
parents: 99
diff changeset
466 }
79
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
467
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
468 lwasm_emit(as, l, v >> 8);
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
469 lwasm_emit(as, l, v & 0xff);
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
470 if (**p == ',')
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
471 {
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
472 (*p)++;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
473 goto fdb_again;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
474 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
475 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
476
79
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
477 // FIXME: handle external references in a sensible way
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
478 OPFUNC(pseudo_fqb)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
479 {
79
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
480 int r, v;
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
481
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
482 fqb_again:
79
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
483 r = lwasm_expr_result2(as, l, p, 0, &v, -1);
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
484 if (r < 0)
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
485 return;
79
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
486
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
487 if (r > 0)
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
488 {
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
489 register_error(as, l, 2, "Illegal external or inter-segment reference");
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
490 v = 0;
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
491 }
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
492
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
493 lwasm_emit(as, l, v >> 24);
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
494 lwasm_emit(as, l, v >> 16);
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
495 lwasm_emit(as, l, v >> 8);
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
496 lwasm_emit(as, l, v & 0xff);
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
497 if (**p == ',')
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
498 {
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
499 (*p)++;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
500 goto fqb_again;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
501 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
502 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
503
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
504 // don't need to do anything if we are executing one of these
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
505 OPFUNC(pseudo_endc)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
506 {
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
507 if (as -> skipcond && !(as -> skipmacro))
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
508 {
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
509 as -> skipcount -= 1;
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
510 if (as -> skipcount <= 0)
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
511 {
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
512 as -> skipcond = 0;
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
513 }
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
514 }
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
515 return;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
516 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
517
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
518 // if "else" executes, we must be going into an "ignore" state
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
519 OPFUNC(pseudo_else)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
520 {
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
521 if (as -> skipmacro)
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
522 return;
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
523
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
524 if (as -> skipcond)
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
525 {
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
526 if (as -> skipcount == 1)
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
527 {
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
528 as -> skipcount = 0;
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
529 as -> skipcond = 0;
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
530 }
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
531 return;
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
532 }
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
533
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
534 as -> skipcond = 1;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
535 as -> skipcount = 1;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
536 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
537
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
538 OPFUNC(pseudo_ifne)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
539 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
540 int v1;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
541 int rval;
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
542
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
543 if (as -> skipcond && !(as -> skipmacro))
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
544 {
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
545 as -> skipcount++;
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
546 return;
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
547 }
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
548
103
26c058fa0bc1 Fixed up some issues with pseudo ops and object target
lost
parents: 99
diff changeset
549 rval = lwasm_expr_result2(as, l, p, EXPR_SECTCONST | EXPR_PASS1CONST, &v1, 0);
79
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
550 if (rval != 0)
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
551 return;
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
552 if (!v1)
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
553 {
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
554 as -> skipcond = 1;
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
555 as -> skipcount = 1;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
556 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
557 }
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
558
104
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
559 OPFUNC(pseudo_ifdef)
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
560 {
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
561 lwasm_symbol_ent_t *se;
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
562 char *sym;
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
563 char *p2;
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
564
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
565 if (as -> skipcond && !(as -> skipmacro))
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
566 {
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
567 as -> skipcount++;
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
568 return;
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
569 }
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
570
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
571 if (as -> passnum != 1)
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
572 {
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
573 if (!(l -> fsize))
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
574 {
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
575 as -> skipcond = 1;
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
576 as -> skipcount = 1;
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
577 }
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
578 return;
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
579 }
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
580
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
581 if (!**p)
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
582 {
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
583 register_error(as, l, 1, "Need symbol name");
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
584 return;
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
585 }
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
586
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
587 for (p2 = *p; *p2 && !isspace(*p2); p2++)
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
588 /* do nothing */ ;
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
589
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
590 sym = lwasm_alloc(p2 - *p + 1);
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
591 memcpy(sym, *p, p2 - *p);
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
592 sym[p2 - *p] = '\0';
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
593
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
594 *p = p2;
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
595
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
596 se = lwasm_find_symbol(as, sym, l -> context);
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
597 if (!se)
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
598 se = lwasm_find_symbol(as, sym, -1);
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
599
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
600 lwasm_free(sym);
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
601
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
602 if (!se)
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
603 {
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
604 as -> skipcond = 1;
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
605 as -> skipcount = 1;
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
606 l -> fsize = 0;
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
607 }
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
608 else
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
609 {
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
610 l -> fsize = 1;
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
611 }
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
612 }
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
613
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
614 OPFUNC(pseudo_ifndef)
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
615 {
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
616 lwasm_symbol_ent_t *se;
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
617 char *sym;
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
618 char *p2;
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
619
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
620 if (as -> skipcond && !(as -> skipmacro))
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
621 {
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
622 as -> skipcount++;
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
623 return;
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
624 }
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
625
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
626 if (as -> passnum != 1)
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
627 {
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
628 if (l -> fsize)
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
629 {
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
630 as -> skipcond = 1;
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
631 as -> skipcount = 1;
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
632 }
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
633 return;
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
634 }
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
635
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
636 if (!**p)
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
637 {
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
638 register_error(as, l, 1, "Need symbol name");
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
639 return;
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
640 }
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
641
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
642 for (p2 = *p; *p2 && !isspace(*p2); p2++)
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
643 /* do nothing */ ;
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
644
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
645 sym = lwasm_alloc(p2 - *p + 1);
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
646 memcpy(sym, *p, p2 - *p);
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
647 sym[p2 - *p] = '\0';
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
648
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
649 *p = p2;
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
650
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
651 se = lwasm_find_symbol(as, sym, l -> context);
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
652 if (!se)
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
653 se = lwasm_find_symbol(as, sym, -1);
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
654
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
655 lwasm_free(sym);
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
656
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
657 if (se)
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
658 {
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
659 as -> skipcond = 1;
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
660 as -> skipcount = 1;
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
661 l -> fsize = 0;
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
662 }
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
663 else
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
664 {
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
665 l -> fsize = 1;
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
666 }
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
667 }
2ba8f9ef1417 Added ifdef/ifndef conditionals
lost
parents: 103
diff changeset
668
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
669 OPFUNC(pseudo_ifeq)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
670 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
671 int v1;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
672 int rval;
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
673
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
674 if (as -> skipcond && !(as -> skipmacro))
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
675 {
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
676 as -> skipcount++;
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
677 return;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
678 }
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
679
103
26c058fa0bc1 Fixed up some issues with pseudo ops and object target
lost
parents: 99
diff changeset
680 rval = lwasm_expr_result2(as, l, p, EXPR_SECTCONST | EXPR_PASS1CONST, &v1, 0);
79
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
681 if (rval != 0)
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
682 return;
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
683 if (v1)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
684 {
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
685 as -> skipcond = 1;
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
686 as -> skipcount = 1;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
687 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
688 }
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
689
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
690 OPFUNC(pseudo_iflt)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
691 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
692 int v1;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
693 int rval;
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
694
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
695 if (as -> skipcond && !(as -> skipmacro))
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
696 {
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
697 as -> skipcount++;
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
698 return;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
699 }
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
700
103
26c058fa0bc1 Fixed up some issues with pseudo ops and object target
lost
parents: 99
diff changeset
701 rval = lwasm_expr_result2(as, l, p, EXPR_SECTCONST | EXPR_PASS1CONST, &v1, 0);
79
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
702 if (rval != 0)
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
703 return;
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
704 if (v1 >= 0)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
705 {
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
706 as -> skipcond = 1;
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
707 as -> skipcount = 1;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
708 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
709 }
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
710
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
711 OPFUNC(pseudo_ifle)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
712 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
713 int v1;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
714 int rval;
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
715
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
716 if (as -> skipcond && !(as -> skipmacro))
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
717 {
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
718 as -> skipcount++;
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
719 return;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
720 }
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
721
103
26c058fa0bc1 Fixed up some issues with pseudo ops and object target
lost
parents: 99
diff changeset
722 rval = lwasm_expr_result2(as, l, p, EXPR_SECTCONST | EXPR_PASS1CONST, &v1, 0);
79
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
723 if (rval != 0)
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
724 return;
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
725 if (v1 > 0)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
726 {
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
727 as -> skipcond = 1;
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
728 as -> skipcount = 1;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
729 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
730 }
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
731
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
732 OPFUNC(pseudo_ifgt)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
733 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
734 int v1;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
735 int rval;
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
736
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
737 if (as -> skipcond && !(as -> skipmacro))
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
738 {
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
739 as -> skipcount++;
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
740 return;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
741 }
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
742
103
26c058fa0bc1 Fixed up some issues with pseudo ops and object target
lost
parents: 99
diff changeset
743 rval = lwasm_expr_result2(as, l, p, EXPR_SECTCONST | EXPR_PASS1CONST, &v1, 0);
79
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
744 if (rval != 0)
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
745 return;
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
746 if (v1 <= 0)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
747 {
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
748 as -> skipcond = 1;
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
749 as -> skipcount = 1;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
750 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
751 }
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
752
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
753 OPFUNC(pseudo_ifge)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
754 {
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
755 int v1;
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
756 int rval;
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
757
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
758 if (as -> skipcond && !(as -> skipmacro))
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
759 {
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
760 as -> skipcount++;
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
761 return;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
762 }
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
763
103
26c058fa0bc1 Fixed up some issues with pseudo ops and object target
lost
parents: 99
diff changeset
764 rval = lwasm_expr_result2(as, l, p, EXPR_SECTCONST | EXPR_PASS1CONST, &v1, 0);
79
d0ce3f5f6797 Checkpointing deployment of non-constant expression handling
lost
parents: 78
diff changeset
765 if (rval != 0)
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
766 return;
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
767 if (v1 < 0)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
768 {
57
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
769 as -> skipcond = 1;
035b95a3690f Added conditional assembly and macros
lost
parents: 56
diff changeset
770 as -> skipcount = 1;
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
771 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
772 }
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
773
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
774 OPFUNC(pseudo_error)
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
775 {
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
776 register_error(as, l, 1, "User error: %s", *p);
0
57495da01900 Initial checking of LWASM
lost
parents:
diff changeset
777 }
56
55260a178667 Added from f* pseudo ops
lost
parents: 54
diff changeset
778
74
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
779
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
780 OPFUNC(pseudo_section)
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
781 {
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
782 sectiontab_t *s;
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
783 char *p2;
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
784 char *sn;
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
785 char *opts;
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
786
99
3dcb12a6f4ff Fixed problem handling sections with options on pass 2
lost
parents: 95
diff changeset
787
74
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
788 if (as -> outformat != OUTPUT_OBJ)
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
789 {
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
790 register_error(as, l, 1, "Sections only supported for obj target");
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
791 return;
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
792 }
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
793
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
794 if (as -> csect)
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
795 {
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
796 as -> csect -> offset = as -> addr;
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
797 as -> csect = NULL;
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
798 }
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
799
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
800 if (!**p)
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
801 {
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
802 register_error(as, l, 1, "Need section name");
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
803 return;
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
804 }
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
805
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
806 for (p2 = *p; *p2 && !isspace(*p2); p2++)
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
807 /* do nothing */ ;
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
808
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
809 sn = lwasm_alloc(p2 - *p + 1);
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
810 memcpy(sn, *p, p2 - *p);
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
811 sn[p2 - *p] = '\0';
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
812
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
813 *p = p2;
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
814
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
815 opts = strchr(sn, ',');
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
816 if (opts)
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
817 {
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
818 *opts++ = '\0';
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
819 }
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
820
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
821 // have we seen the section name already?
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
822 for (s = as -> sections; s; s = s -> next)
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
823 {
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
824 if (!strcmp(s -> name, sn))
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
825 break;
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
826 }
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
827
99
3dcb12a6f4ff Fixed problem handling sections with options on pass 2
lost
parents: 95
diff changeset
828 if (s && as -> passnum == 1)
74
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
829 {
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
830 lwasm_free(sn);
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
831 if (opts)
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
832 {
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
833 register_error(as, l, 1, "Section options can only be specified the first time");
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
834 return;
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
835 }
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
836 }
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
837 else if (!s)
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
838 {
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
839 s = lwasm_alloc(sizeof(sectiontab_t));
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
840 s -> name = sn;
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
841 s -> offset = 0;
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
842 s -> flags = 0;
85
918be0c02239 Started adding object target output
lost
parents: 82
diff changeset
843 s -> obytes = NULL;
918be0c02239 Started adding object target output
lost
parents: 82
diff changeset
844 s -> oblen = 0;
918be0c02239 Started adding object target output
lost
parents: 82
diff changeset
845 s -> obsize = 0;
86
033a328a10ae Checkpoint: object target output
lost
parents: 85
diff changeset
846 s -> rl = NULL;
90
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
847 s -> exports = NULL;
74
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
848 // parse options; only one "bss"
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
849 if (opts && as -> passnum == 1)
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
850 {
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
851 if (!strcasecmp(opts, "bss"))
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
852 {
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
853 s -> flags = SECTION_BSS;
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
854 }
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
855 else
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
856 {
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
857 register_error(as, l, 1, "Unrecognized section option '%s'", opts);
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
858 lwasm_free(s -> name);
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
859 lwasm_free(s);
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
860 return;
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
861 }
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
862 }
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
863
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
864 s -> next = as -> sections;
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
865 as -> sections = s;
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
866 }
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
867 as -> addr = s -> offset;
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
868 as -> csect = s;
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
869 as -> context = lwasm_next_context(as);
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
870 }
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
871
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
872 OPFUNC(pseudo_endsection)
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
873 {
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
874 if (as -> outformat != OUTPUT_OBJ)
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
875 {
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
876 register_error(as, l, 1, "Sections only supported for obj target");
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
877 return;
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
878 }
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
879
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
880 if (!(as -> csect))
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
881 {
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
882 register_error(as, l, 1, "ENDSECTION when not in a section");
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
883 return;
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
884 }
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
885
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
886 as -> csect -> offset = as -> addr;
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
887 as -> addr = 0;
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
888 as -> csect = 0;
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
889 as -> context = lwasm_next_context(as);
c8c772ef5df9 Checkpointing object target implementation
lost
parents: 65
diff changeset
890 }
82
03be43ae19cf Added EXTERN directive
lost
parents: 79
diff changeset
891
03be43ae19cf Added EXTERN directive
lost
parents: 79
diff changeset
892 OPFUNC(pseudo_extern)
03be43ae19cf Added EXTERN directive
lost
parents: 79
diff changeset
893 {
03be43ae19cf Added EXTERN directive
lost
parents: 79
diff changeset
894 if (as -> passnum != 1)
03be43ae19cf Added EXTERN directive
lost
parents: 79
diff changeset
895 return;
03be43ae19cf Added EXTERN directive
lost
parents: 79
diff changeset
896
03be43ae19cf Added EXTERN directive
lost
parents: 79
diff changeset
897 if (as -> outformat != OUTPUT_OBJ)
03be43ae19cf Added EXTERN directive
lost
parents: 79
diff changeset
898 {
03be43ae19cf Added EXTERN directive
lost
parents: 79
diff changeset
899 register_error(as, l, 1, "External references only supported for obj target");
03be43ae19cf Added EXTERN directive
lost
parents: 79
diff changeset
900 return;
03be43ae19cf Added EXTERN directive
lost
parents: 79
diff changeset
901 }
03be43ae19cf Added EXTERN directive
lost
parents: 79
diff changeset
902
03be43ae19cf Added EXTERN directive
lost
parents: 79
diff changeset
903 if (as -> csect)
03be43ae19cf Added EXTERN directive
lost
parents: 79
diff changeset
904 {
03be43ae19cf Added EXTERN directive
lost
parents: 79
diff changeset
905 register_error(as, l, 1, "Cannot declare external symbols within a section");
03be43ae19cf Added EXTERN directive
lost
parents: 79
diff changeset
906 return;
03be43ae19cf Added EXTERN directive
lost
parents: 79
diff changeset
907 }
03be43ae19cf Added EXTERN directive
lost
parents: 79
diff changeset
908
03be43ae19cf Added EXTERN directive
lost
parents: 79
diff changeset
909 lwasm_register_symbol(as, l, l -> sym, 0, SYMBOL_EXTERN);
03be43ae19cf Added EXTERN directive
lost
parents: 79
diff changeset
910 }
90
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
911
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
912 OPFUNC(pseudo_export)
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
913 {
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
914 lwasm_symbol_ent_t *se;
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
915 export_list_t *ex;
158
f0527dc3804d Added support for .globl <sym>, .area <section>, .word, .byte, .blkb, and a .module directive that does nothing
lost
parents: 151
diff changeset
916 char *sym2, *sym3;
f0527dc3804d Added support for .globl <sym>, .area <section>, .word, .byte, .blkb, and a .module directive that does nothing
lost
parents: 151
diff changeset
917
90
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
918 if (as -> outformat != OUTPUT_OBJ)
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
919 {
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
920 register_error(as, l, 1, "Symbol exports only supported for obj target");
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
921 return;
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
922 }
158
f0527dc3804d Added support for .globl <sym>, .area <section>, .word, .byte, .blkb, and a .module directive that does nothing
lost
parents: 151
diff changeset
923
90
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
924 if (as -> passnum == 1)
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
925 return;
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
926
158
f0527dc3804d Added support for .globl <sym>, .area <section>, .word, .byte, .blkb, and a .module directive that does nothing
lost
parents: 151
diff changeset
927 if (!(l -> sym))
f0527dc3804d Added support for .globl <sym>, .area <section>, .word, .byte, .blkb, and a .module directive that does nothing
lost
parents: 151
diff changeset
928 {
f0527dc3804d Added support for .globl <sym>, .area <section>, .word, .byte, .blkb, and a .module directive that does nothing
lost
parents: 151
diff changeset
929 // look for symbol after op
f0527dc3804d Added support for .globl <sym>, .area <section>, .word, .byte, .blkb, and a .module directive that does nothing
lost
parents: 151
diff changeset
930 if (**p)
f0527dc3804d Added support for .globl <sym>, .area <section>, .word, .byte, .blkb, and a .module directive that does nothing
lost
parents: 151
diff changeset
931 {
f0527dc3804d Added support for .globl <sym>, .area <section>, .word, .byte, .blkb, and a .module directive that does nothing
lost
parents: 151
diff changeset
932 for (sym2 = *p; **p && !isspace(**p); (*p)++)
f0527dc3804d Added support for .globl <sym>, .area <section>, .word, .byte, .blkb, and a .module directive that does nothing
lost
parents: 151
diff changeset
933 /* do nothing */
f0527dc3804d Added support for .globl <sym>, .area <section>, .word, .byte, .blkb, and a .module directive that does nothing
lost
parents: 151
diff changeset
934 sym3 = lwasm_alloc(*p - sym2 + 1);
f0527dc3804d Added support for .globl <sym>, .area <section>, .word, .byte, .blkb, and a .module directive that does nothing
lost
parents: 151
diff changeset
935 memcpy(sym3, sym2, *p - sym2);
f0527dc3804d Added support for .globl <sym>, .area <section>, .word, .byte, .blkb, and a .module directive that does nothing
lost
parents: 151
diff changeset
936 sym3[*p - sym2] = '\0';
f0527dc3804d Added support for .globl <sym>, .area <section>, .word, .byte, .blkb, and a .module directive that does nothing
lost
parents: 151
diff changeset
937
f0527dc3804d Added support for .globl <sym>, .area <section>, .word, .byte, .blkb, and a .module directive that does nothing
lost
parents: 151
diff changeset
938 l -> sym = sym3;
f0527dc3804d Added support for .globl <sym>, .area <section>, .word, .byte, .blkb, and a .module directive that does nothing
lost
parents: 151
diff changeset
939 }
f0527dc3804d Added support for .globl <sym>, .area <section>, .word, .byte, .blkb, and a .module directive that does nothing
lost
parents: 151
diff changeset
940 }
f0527dc3804d Added support for .globl <sym>, .area <section>, .word, .byte, .blkb, and a .module directive that does nothing
lost
parents: 151
diff changeset
941
f0527dc3804d Added support for .globl <sym>, .area <section>, .word, .byte, .blkb, and a .module directive that does nothing
lost
parents: 151
diff changeset
942 if (!(l -> sym))
f0527dc3804d Added support for .globl <sym>, .area <section>, .word, .byte, .blkb, and a .module directive that does nothing
lost
parents: 151
diff changeset
943 {
f0527dc3804d Added support for .globl <sym>, .area <section>, .word, .byte, .blkb, and a .module directive that does nothing
lost
parents: 151
diff changeset
944 register_error(as, l, 2, "No symbol");
f0527dc3804d Added support for .globl <sym>, .area <section>, .word, .byte, .blkb, and a .module directive that does nothing
lost
parents: 151
diff changeset
945 return;
f0527dc3804d Added support for .globl <sym>, .area <section>, .word, .byte, .blkb, and a .module directive that does nothing
lost
parents: 151
diff changeset
946 }
f0527dc3804d Added support for .globl <sym>, .area <section>, .word, .byte, .blkb, and a .module directive that does nothing
lost
parents: 151
diff changeset
947
f0527dc3804d Added support for .globl <sym>, .area <section>, .word, .byte, .blkb, and a .module directive that does nothing
lost
parents: 151
diff changeset
948
90
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
949 // the symbol better be defined at this point (pass 2)
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
950 // local symbols cannot be exported nor can "global" symbols
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
951 se = lwasm_find_symbol(as, l -> sym, -1);
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
952 if (!se)
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
953 {
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
954 register_error(as, l, 2, "Exported symbols must be fully defined within a section");
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
955 return;
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
956 }
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
957 if (se -> sect == NULL)
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
958 {
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
959 register_error(as, l, 2, "Only non-local symbols within a section can be exported");
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
960 return;
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
961 }
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
962
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
963 if (se -> flags & SYMBOL_SET)
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
964 {
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
965 register_error(as, l, 2, "You cannot export symbols defined with SET");
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
966 return;
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
967 }
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
968
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
969 // if the symbol is not already a simple value, re-evaluate it
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
970 // and see if it becomes simple
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
971
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
972
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
973 if (se -> flags & SYMBOL_COMPLEX)
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
974 {
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
975 register_error(as, l, 2, "Exported symbols must be fully resolved on pass 2");
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
976 return;
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
977 }
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
978
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
979 // search for existing export
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
980 for (ex = se -> sect -> exports; ex; ex = ex -> next)
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
981 if (!strcmp(l -> sym, ex -> sym))
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
982 break;
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
983 if (ex)
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
984 {
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
985 register_error(as, l, 2, "Symbol %s already exported", l -> sym);
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
986 return;
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
987 }
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
988
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
989 // add an external reference
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
990 ex = lwasm_alloc(sizeof(export_list_t));
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
991 ex -> next = se -> sect -> exports;
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
992 se -> sect -> exports = ex;
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
993 ex -> offset = se -> value;
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
994 ex -> sym = lwasm_strdup(se -> sym);
6097cb1486f8 Added EXPORT pseudo op
lost
parents: 86
diff changeset
995 }