annotate lwasm/pass7.c @ 550:c71c80a3b280 lwtools-4.21

Bump version in preparation for release
author William Astle <lost@l-w.ca>
date Sun, 23 Apr 2023 10:22:40 -0600
parents 71f507f404f1
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1 /*
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
2 pass7.c
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
3
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
4 Copyright © 2010 William Astle
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
5
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
6 This file is part of LWTOOLS.
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
7
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
8 LWTOOLS is free software: you can redistribute it and/or modify it under the
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
9 terms of the GNU General Public License as published by the Free Software
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
10 Foundation, either version 3 of the License, or (at your option) any later
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
11 version.
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
12
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
13 This program is distributed in the hope that it will be useful, but WITHOUT
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
16 more details.
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
17
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
18 You should have received a copy of the GNU General Public License along with
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
19 this program. If not, see <http://www.gnu.org/licenses/>.
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
20 */
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
21
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
22 #include <stdio.h>
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
23 #include <string.h>
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
24
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
25 #include <lw_alloc.h>
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
26 #include <lw_string.h>
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
27
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
28 #include "lwasm.h"
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
29 #include "instab.h"
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
30
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
31 /*
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
32 emit pass
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
33
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
34 Generate object code
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
35 */
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
36 void do_pass7(asmstate_t *as)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
37 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
38 line_t *cl;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
39
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
40 for (cl = as -> line_head; cl; cl = cl -> next)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
41 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
42 as -> cl = cl;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
43 if (cl -> insn != -1)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
44 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
45 if (instab[cl -> insn].emit)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
46 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
47 (instab[cl -> insn].emit)(as, cl);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
48 }
375
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 0
diff changeset
49
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 0
diff changeset
50 if (CURPRAGMA(cl, PRAGMA_TESTMODE))
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 0
diff changeset
51 {
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 0
diff changeset
52 char* buf;
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 0
diff changeset
53 int len;
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 0
diff changeset
54 lwasm_testflags_t flags;
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 0
diff changeset
55 lwasm_errorcode_t err;
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 0
diff changeset
56
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 0
diff changeset
57 lwasm_parse_testmode_comment(cl, &flags, &err, &len, &buf);
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 0
diff changeset
58
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 0
diff changeset
59 if (flags == TF_ERROR && cl -> err_testmode == 0)
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 0
diff changeset
60 {
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 0
diff changeset
61 char s[128];
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 0
diff changeset
62 sprintf(s, "expected %d but assembled OK", err);
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 0
diff changeset
63 lwasm_error_testmode(cl, s, 0);
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 0
diff changeset
64 }
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 0
diff changeset
65
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 0
diff changeset
66 if (flags == TF_EMIT)
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 0
diff changeset
67 {
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 0
diff changeset
68 if (cl -> len != len) lwasm_error_testmode(cl, "incorrect assembly (wrong length)", 0);
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 0
diff changeset
69 if (memcmp(buf, cl -> output, len) != 0) lwasm_error_testmode(cl, "incorrect assembly", 0);
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 0
diff changeset
70 lw_free(buf);
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 0
diff changeset
71 }
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 0
diff changeset
72 }
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
73 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
74 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
75 }