diff options
| author | forsyth <forsyth@vitanuova.com> | 2010-04-27 12:51:13 +0100 |
|---|---|---|
| committer | forsyth <forsyth@vitanuova.com> | 2010-04-27 12:51:13 +0100 |
| commit | d67b7dad77bb8aa973dad1f7c3ab0c309b114278 (patch) | |
| tree | 6794120fb327d6de19cf05eed53f80d877781a3e /utils/ql/obj.c | |
| parent | 09da2e137d5eb0c940df35d989e4c31ec0654fc4 (diff) | |
20100427-1251
Diffstat (limited to 'utils/ql/obj.c')
| -rw-r--r-- | utils/ql/obj.c | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/utils/ql/obj.c b/utils/ql/obj.c index a4e76c1c..adff8dfd 100644 --- a/utils/ql/obj.c +++ b/utils/ql/obj.c @@ -6,6 +6,9 @@ #define DEFAULT '9' #endif +#define OANAME 229 /* old ANAME */ + + char *noname = "<none>"; char symname[] = SYMDEF; char thechar = 'q'; @@ -718,35 +721,39 @@ loop: bloc = buf.xbuf; goto loop; } - o = bloc[0]; /* as */ + o = bloc[0] | (bloc[1] << 8); /* as */ + if(bloc[0] == OANAME && o != OANAME) { + diag("%s: probably old .q file\n", pn); + errorexit(); + } if(o <= 0 || o >= ALAST) { diag("%s: opcode out of range %d", pn, o); - print(" probably not a .q file\n"); + print(" probably not a .%c file\n", thechar); errorexit(); } if(o == ANAME || o == ASIGNAME) { sig = 0; if(o == ASIGNAME) { - sig = bloc[1] | (bloc[2]<<8) | (bloc[3]<<16) | (bloc[4]<<24); + sig = bloc[2] | (bloc[3]<<8) | (bloc[4]<<16) | (bloc[5]<<24); bloc += 4; c -= 4; } - stop = memchr(&bloc[3], 0, bsize-&bloc[3]); + stop = memchr(&bloc[4], 0, bsize-&bloc[4]); if(stop == 0){ bsize = readsome(f, buf.xbuf, bloc, bsize, c); if(bsize == 0) goto eof; bloc = buf.xbuf; - stop = memchr(&bloc[3], 0, bsize-&bloc[3]); + stop = memchr(&bloc[4], 0, bsize-&bloc[4]); if(stop == 0){ fprint(2, "%s: name too long\n", pn); errorexit(); } } - v = bloc[1]; /* type */ - o = bloc[2]; /* sym */ - bloc += 3; - c -= 3; + v = bloc[2]; /* type */ + o = bloc[3]; /* sym */ + bloc += 4; + c -= 4; r = 0; if(v == D_STATIC) @@ -789,12 +796,12 @@ loop: hunk += sizeof(Prog); p->as = o; - p->reg = bloc[1] & 0x3f; - if(bloc[1] & 0x80) + p->reg = bloc[2] & 0x3f; + if(bloc[2] & 0x80) p->mark = NOSCHED; - p->line = bloc[2] | (bloc[3]<<8) | (bloc[4]<<16) | (bloc[5]<<24); - r = zaddr(bloc+6, &p->from, h) + 6; - if(bloc[1] & 0x40) + p->line = bloc[3] | (bloc[4]<<8) | (bloc[5]<<16) | (bloc[6]<<24); + r = zaddr(bloc+7, &p->from, h) + 7; + if(bloc[2] & 0x40) r += zaddr(bloc+r, &p->from3, h); else p->from3 = zprg.from3; |
