|
|
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.