2 static char rcsid[] = "$Id: backward.c,v 2.12 1994/06/24 10:39:46 ceriel Exp $";
20 * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
21 * See the copyright notice in the ACK home directory, in the file "Copyright".
23 * Author: Hans van Staveren
26 #define local(x) ((((x)->s_flags&SYMKNOWN) == 0 && \
27 ((x)->s_flags &= ~ SYMGLOBAL)),\
28 (x)->s_flags |= SYMSEEN)
29 #define global(x) ((((x)->s_flags&SYMKNOWN) == 0 && \
30 ((x)->s_flags |= SYMGLOBAL)), \
31 (x)->s_flags |= SYMSEEN)
39 short curfrag = 3; /* see also peephole.c */
40 offset rombuf[MAXROM];
55 for (lnp = curpro.lastline; lnp != (line_p) 0; lnp = next) {
57 switch(lnp->l_optyp) {
59 global(lnp->l_a.la_sp);
62 global(lnp->l_a.la_sval.lasv_sp);
65 global(lnp->l_a.la_lval.lalv_sp);
69 while (ap != (arg_p) 0 ) {
75 global(ap->a_a.a_val.av_sp);
83 * references to symbols are processed now.
84 * for plain instructions nothing else is needed
87 switch(lnp->l_instr&BMASK) {
89 * count all local occurences for register counts;
90 * op_lal is omitted and not by accident.
101 switch(lnp->l_optyp) {
110 incregusage(lnp->l_a.la_offset);
113 incregusage((offset)lnp->l_a.la_short);
116 incregusage((offset)(lnp->l_optyp&BMASK)-Z_OPMINI);
119 /* fall through !! */
121 assert((lnp->l_instr&BMASK)<=op_last);
128 if (curdtyp == DTYPROM && goodrom) {
129 sp->s_rom = newrom();
131 sp->s_rom[n] = rombuf[n];
133 sp->s_frag = curfrag;
144 if (curdtyp != DTYPCON) {
150 if (curdtyp != DTYPROM) {
154 ap = lnp->l_a.la_arg;
156 while (ap != (arg_p) 0 && rc < MAXROM) {
157 if (ap->a_typ == ARGOFF) {
158 rombuf[rc++] = ap->a_a.a_offset;
167 ((int) aoff(lnp->l_a.la_arg, 0) == ms_std ||
168 (int) aoff(lnp->l_a.la_arg, 0) == ms_stb ||
169 (int) aoff(lnp->l_a.la_arg, 0) == ms_ego)) {
177 local(lnp->l_a.la_sp);
188 local(curpro.symbol);
189 instrs = i; pseudos = p; curpro.lastline = (line_p) 0;