|
|
1.1 ! root 1: From zoo.toronto.edu!henry Thu Aug 16 13:39:15 EDT 1990 ! 2: Received: by dutoit; Thu Aug 16 13:39:39 EDT 1990 ! 3: Received: by inet.att.com; Thu Aug 16 13:39 EDT 1990 ! 4: From: [email protected] ! 5: Date: Thu, 16 Aug 90 13:39:15 EDT ! 6: To: [email protected] ! 7: Subject: bug fix to 11as ! 8: ! 9: Looks like I found a bug in the pdp11 cross-assembler. When the second ! 10: pass sees a change of segment, it forces dot to be even. Unfortunately, ! 11: the first pass is completely ignorant of this, and confusion and madness ! 12: result. For example, this program: ! 13: ! 14: .data ! 15: <a> ! 16: .data ! 17: b: <c> ! 18: ! 19: puts the "c" at address 1, but makes "b" equal 2. I ran into this with ! 20: a test program that flipped back and forth between data and text while ! 21: allocating strings. ! 22: ! 23: I conjecture that the old native version of the assembler may have ! 24: done the forcing in both passes. When I moved our major pdp11 stuff to ! 25: the cross-compiler, one of the things I had to do to get identical bytes ! 26: out the end was to add a ".even" in one place (after putting an odd- ! 27: length string into the text segment). Evidently there was a difference ! 28: in behavior between native and cross versions, but I didn't investigate ! 29: it closely at the time. I assumed that the native version had forced ! 30: alignment and the (newer) cross version had stopped doing so for some ! 31: reason, but it may well have been this bug manifesting itself. ! 32: ! 33: Simply taking out the force-even code in the second pass appears to be ! 34: a workable fix (see enclosed patch). It cures the problem in my test ! 35: program, and running all our major cross-compiled code through the new ! 36: version produces byte-for-byte-identical output, so it appears not to ! 37: be fouling up anything else. ! 38: ! 39: Henry Spencer at U of Toronto Zoology ! 40: [email protected] utzoo!henry ! 41: ! 42: *** as26.c.old Thu Aug 16 13:27:38 1990 ! 43: --- as26.c Thu Aug 16 13:27:18 1990 ! 44: *************** ! 45: *** 124,130 **** ! 46: case T__TEXT: ! 47: case T__DATA: ! 48: case T__BSS: ! 49: ! *dot=(*dot+1)&~1; ! 50: savdot[*dotrel-T_TEXT] = *dot; ! 51: if (passno!=0 && t!=T__BSS) { ! 52: fseek(txtf,tseek[t-T__TEXT],0); ! 53: --- 124,130 ---- ! 54: case T__TEXT: ! 55: case T__DATA: ! 56: case T__BSS: ! 57: ! /* *dot=(*dot+1)&~1; */ ! 58: savdot[*dotrel-T_TEXT] = *dot; ! 59: if (passno!=0 && t!=T__BSS) { ! 60: fseek(txtf,tseek[t-T__TEXT],0); ! 61:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.