Sender: bill AT taniwha DOT tssc DOT co DOT nz Message-ID: <359A09C6.6BDEFD1C@taniwha.tssc.co.nz> Date: Wed, 01 Jul 1998 22:04:54 +1200 From: Bill Currie MIME-Version: 1.0 To: DJ Delorie , djgpp-workers AT delorie DOT com Subject: Re: djasm patches References: <199806301654 DOT MAA10970 AT delorie DOT com> <3599E5B4 DOT 6C2A0DC9 AT taniwha DOT tssc DOT co DOT nz> Content-Type: multipart/mixed; boundary="------------64F7C3356D5E5A4DCF881D8B" Precedence: bulk This is a multi-part message in MIME format. --------------64F7C3356D5E5A4DCF881D8B Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Bill Currie wrote: > I could help with the endian hunt if you like. Even though I don't have > access to an IRIX box, I do have access to both i860 and pa-risc 1.1 > boxen (both running big-endian and they both enforce alignment). I'm > quite willing to do this while I have access to these boxen for > testing. In fact, I'll get started shortly (tonight). That was easier than I thought! Although only .exe output is tested (other than .obj, the rest are a subset of .exe) I don't think I missed anything, there were only 4.5 locations that had to be modified in relation to endian-ness and alignment. There were a couple more warnings picked up by compiling on a different system that I fixed up as well. FWIW, my testing involved comparing the differences between the i386 and be-i860 builds of my lfn driver (a few k lines with lots of 32 bit consts) and cmp showed 2 bytes being different (the timestape in the exe header). Bill -- Leave others their otherness. --------------64F7C3356D5E5A4DCF881D8B Content-Type: text/plain; charset=us-ascii; name="djasm.diff.be" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="djasm.diff.be" *** djasm.y.old Wed Jul 1 00:45:06 1998 --- djasm.y Wed Jul 1 21:40:22 1998 *************** *** 1750,1756 **** switch (p->rel) { case REL_abs32: ! o = *((int *)cp); break; case REL_abs: case REL_16: --- 1750,1756 ---- switch (p->rel) { case REL_abs32: ! o = (signed int)(cp[0] | (cp[1] << 8) | (cp[2] << 16) | (cp[3] << 24)); break; case REL_abs: case REL_16: *************** *** 1764,1771 **** switch (p->rel) { case REL_abs32: ! *((int *)cp) = o; ! break; case REL_abs: case REL_16: cp[1] = o>>8; --- 1764,1772 ---- switch (p->rel) { case REL_abs32: ! cp[3]=o>>24; ! cp[2]=o>>16; ! /* FALL THROUGH */ case REL_abs: case REL_16: cp[1] = o>>8; *************** *** 2382,2391 **** { if (symname[0] != '@') return 0; if (which) if (symname[1] != which) return 0; else if (symname[1] != 'f' && symname[1] != 'b') return 0; ! if (!isdigit(symname[2])) return 0; if (symname[3]) return 0; return 1; } --- 2383,2396 ---- { if (symname[0] != '@') return 0; if (which) + { if (symname[1] != which) return 0; + } else + { if (symname[1] != 'f' && symname[1] != 'b') return 0; ! } ! if (!isdigit((unsigned char)symname[2])) return 0; if (symname[3]) return 0; return 1; } *************** *** 2705,2712 **** --- 2710,2722 ---- for (; cnt > 0; cnt--, rp++) { Symbol *s=0; + unsigned char *vaddr_ptr=outbin + textbase + rp->r_vaddr; + int vaddr; int delta; + vaddr=vaddr_ptr[0] | (vaddr_ptr[1] << 8) | + (vaddr_ptr[2] << 16) | (vaddr_ptr[3] << 24); + if (symbol[rp->r_symndx].e.e.e_zeroes == 0) p = base + symbol[rp->r_symndx].e.e.e_offset; else *************** *** 2722,2728 **** rp->r_type, symbol[rp->r_symndx].e_scnum, s ? s->value : 0, ! *((int *) (outbin + textbase + rp->r_vaddr)), p); #endif if (!strcmp (p, _TEXT)) --- 2732,2738 ---- rp->r_type, symbol[rp->r_symndx].e_scnum, s ? s->value : 0, ! vaddr, p); #endif if (!strcmp (p, _TEXT)) *************** *** 2772,2778 **** inname, lineno, filename, rp->r_type); delta = 0; } ! *((int *)(outbin + textbase + rp->r_vaddr)) += delta; } } } --- 2782,2792 ---- inname, lineno, filename, rp->r_type); delta = 0; } ! vaddr += delta; ! vaddr_ptr[0]=vaddr; ! vaddr_ptr[1]=vaddr>>8; ! vaddr_ptr[2]=vaddr>>16; ! vaddr_ptr[3]=vaddr>>24; } } } --------------64F7C3356D5E5A4DCF881D8B--