Annotation of 43BSDTahoe/lib/pcc/pcc.vax/LOG, revision 1.1.1.1

1.1       root        1: There was a bug which caused compiler errors when floating values were
                      2: assigned to bit fields.  Some overenthusiastic optimization on my part
                      3: led to a float-to-int conversion on the rhs of the assignment being
                      4: dropped.  Bit fields are now treated as a special case.  [pcc.vax:
                      5: local2.c]
                      6: 
                      7: At the instigation of Rob Pike, enums were neutered: they now behave
                      8: exactly like ints.  The only traces of Johnson's treatment of enums are
                      9: warnings about clashes between one enum type and another enum type in
                     10: certain expressions.  This fix was trickier than it looked; it would
                     11: have been much simpler to drop ALL warnings about enums, as Rob would
                     12: recommend.  [mip: trees.c]
                     13: 
                     14: Arthur Olsen pointed out a bug with the evaluation of constant
                     15: expressions -- the usual arithmetic conversions are not always
                     16: performed.  Rather than follow Arthur's simple suggestion, I decided to
                     17: be safe and arranged to use the same conversion code on constants that
                     18: we use on variables.  We short-cut the test if the operand(s) are ints,
                     19: which is the usual case, so the impact on compile time should be
                     20: small.  [mip: trees.c]
                     21: 
                     22: Guy Harris noted that chkpun() considered multiply dimensioned arrays
                     23: and multiply indirect pointers to be the same thing, which they are
                     24: most certainly not.  His fix causes an 'illegal pointer combination'
                     25: warning to be emitted for code like:
                     26: 
                     27:        char **cpp, c2a[10][20]; cpp = c2a; cpp[5][3] = 'a';
                     28: 
                     29: The new code is actually simpler than the old...  [mip: trees.c]
                     30: 
                     31: Another irritation of Rob Pike's is fixed -- the old-style assignment
                     32: ops have been ifdef'ed out.  No more of those obnoxious 'ambiguous
                     33: assignment: assignment op taken' messages!  [mip: scan.c]
                     34: 
                     35: Yet another Rob Pike complaint: you couldn't refer directly to the
                     36: members of a structure which had been returned by a function.  You may
                     37: now utter things like 'f().a' and get away with them.  The illegal form
                     38: '(&f())->a' used to work; since this has the same tree representation
                     39: as the legal form, an ugly wart was added to the action for '&' which
                     40: specifically rules this form out.  To be consistent, a similar
                     41: exception was made for expressions of the form '(a = b).c'.  [mip:
                     42: cgram.y]
                     43: 
                     44: Moved configuration flags from Makefile into macdefs.h and converted
                     45: some more trivial routines into macros.  This cleans up the Makefile
                     46: considerably and consolidates assembler-dependent flags.  [pcc.vax:
                     47: macdefs.h, code.c, order.c, Makefile; mip: onepass.h]
                     48: 
                     49: More efficiency hacks: the compiler now does its best to avoid emitting
                     50: ANY code after an error is detected.  Previously only code generation
                     51: through the code table was suppressed after an error.  This change can
                     52: buy up to 25% in speed improvements if the dbx stab flag is enabled.
                     53: The latest 'ccom' runs twice as fast as the 4.2 BSD compiler in this
                     54: situation...  [pcc.vax:  macdefs.h, local.c, code.c; mip: cgram.y,
                     55: scan.c, pftn.c]
                     56: 
                     57: For ANSI compatibility, we now accept void expressions in the colon
                     58: part of a conditional expression.  Both subexpressions under the colon
                     59: operator must be void if one is void.  The overall type of the
                     60: conditional expression is void in this case.  [mip: trees.c]
                     61: 
                     62: As long as we're doing away with old-fashioned assignment operators, we
                     63: might as well terminate old-fashioned initializations too.  [mip: cgram.y]
                     64: 
                     65: A fix from James Schoner for bitfield assignments was installed.  The
                     66: problem was that the rhs of a bitfield assignment was used as its
                     67: value, an overlooked aspect of the several earlier bug fixes for
                     68: problems of this variety.  The bug caused
                     69: 
                     70:        struct { unsigned a:4, b:3, c:2; } x;
                     71:        int i;
                     72:        i = x.b = 255;
                     73: 
                     74: to store 255 in i instead of 7.  [pcc.vax: table.c, local2.c]
                     75: 
                     76: Scanner code was added to handle the System V/ANSI preprocessor
                     77: extensions #ident and #pragma.  Currently #ident is ignored.  #pragma
                     78: may be used as a substitute for lint-style comment directives; e.g. use
                     79: '#pragma LINTLIBRARY' for '/* LINTLIBRARY */'.  The #pragma stuff
                     80: requires the hacked-up cpp with ANSI extensions which may eventually be
                     81: put into circulation here at Utah.  The #line control from cpp is now
                     82: recognized with the same syntax by ccom.  Unknown control lines elicit
                     83: a warning.  A small bug is fixed by this new code -- previously #ident
                     84: and other unknown controls caused the line control mechanism to get
                     85: screwed up, so that bogus dbx stabs were put in the output.  [mip:
                     86: scan.c]
                     87: 
                     88: There seems to be a loophole in initializations -- apparently it is
                     89: legal to initialize a bitfield with a symbolic constant (i.e. the
                     90: address of something).  No loader that I know of will handle this!  The
                     91: compiler now emits an error when someone tries this trick; it really
                     92: can't do any better.  [mip: pftn.c]
                     93: 
                     94: Someone complained that all illegal characters were being printed as
                     95: octal numbers in the error message.  This was changed so that printable
                     96: characters are printed normally, and all funny characters are printed
                     97: in C 'char' style.  [mip: scan.c]
                     98: 
                     99: Conversion of unsigned constants to floating point values was broken
                    100: because the requisite cast in makety() had been commented out!  Argh.
                    101: Unsigned comparisons of constants were similarly botched.  [mip: trees.c]
                    102: 
                    103: Ray Butterworth made a sensible suggestion that array definitions which
                    104: aren't external and allocate no storage should elicit errors.  I
                    105: modified his suggestion slightly by moving the test into nidcl(), where
                    106: we can be sure that an array isn't being initialized.  I also adopted
                    107: his suggestion for a lint warning for arrays with explicit dimensions
                    108: that are lost by the rule that converts array types into pointer types
                    109: in formal arguments; the warning is contingent on lint's -h flag.
                    110: [mip: pftn.c]
                    111: 
                    112: The structures for fpn and dpn nodes (floating point constants) were
                    113: changed to make them conform in shape to the other nodes.  [mip: ndu.h]
                    114: 
                    115: Overenthusiastic SCONV optimization code in optim2() led to functions
                    116: not cooperating with certain casts; e.g.
                    117: 
                    118:        unsigned char x(); ... y((char)x()) ...
                    119: 
                    120: failed to sign-extend the result of x().  [pcc.vax: local2.c]
                    121: 
                    122: A bug in outstruct() caused it to check 'stab[-1].name == NULL' for
                    123: unnamed structures.  For some reason this didn't break until my recent
                    124: lint fixes tweaked the compiler in some subtle way...  [pcc.vax: stab.c]
                    125: 
                    126: The makefile was changed to pass C options to lint properly and to drop
                    127: the '-a' flag to lint in the 'lintall' entry.  '-a' really ought to
                    128: work but unfortunately the arrangement of 'int'-like types in the
                    129: compiler is extremely confusing and inconsistent, so I eventually gave
                    130: up trying to force the issue.  Sam Leffler's 'rel.c' for release
                    131: information was also added.  [pcc.vax: Makefile, rel.c]
                    132: 
                    133: I fixed defid() so that it now insists that all argument type
                    134: declarations must refer to names in the argument list.  Previously you
                    135: could get away with:
                    136: 
                    137:        int a;
                    138:        x()
                    139:                int a;
                    140:        { ... }
                    141: 
                    142: Use of 'a' in the body of x() would elicit the immortal error message
                    143: 'warning: bad arg temp'.  [mip: pftn.c]
                    144: 
                    145: For some reason, mainp2() in the two-pass version of the compiler had a
                    146: switch statement with two 'default' cases.  I zapped the obvious one.
                    147: [mip: reader.c]
                    148: 
                    149: Botched initializations sometimes left the declarations code in a funny
                    150: state, so a fixinit() routine was invented to aid error recovery.  For
                    151: example, the following illegal program forced a core dump:
                    152: 
                    153:        char m[] = ;
                    154:        x() {
                    155:                y("splat");
                    156:        }
                    157: 
                    158: The compiler tried to read "splat" into m[] and died horribly.  [mip:
                    159: cgram.y, pftn.c]
                    160: 
                    161: The compiler now warns 'can't take size of function' when asked to do
                    162: something amazing like '... void f(); ... if (f[10]) ...'.  Previously
                    163: it produced a compiler error instead.  [mip: pftn.c]
                    164: 
                    165: If a program tried to access a value below the argument list on the
                    166: stack using the clever tactic of manipulating the address of an
                    167: argument, it drew a warning 'bad arg temp'.  For the sake of these
                    168: clever programs, the warning has been suppressed.  [pcc.vax: local2.c]
                    169: 
                    170: The assembler would sometimes print 'Branch too long: try -J flag' even
                    171: when you used the -J flag and when there was no reason for it to be
                    172: making long branches.  This was due to a bug in jxxxfix() which caused
                    173: tests for explodable branch instructions to terminate early in later
                    174: phases of the topological sort, because the loop termination code
                    175: didn't take into account the fact that not all code addresses are
                    176: updated by jxxxbump().  The fix is to match the pointer to the data
                    177: structure for the code in the sorted table rather than check for its
                    178: generated address.  [as: asjxxx.c]
                    179: 
                    180: The peephole optimizer normally compares instructions for equality
                    181: based on their instruction type and their operands.  Unfortunately
                    182: several instructions are too complex for c2 to handle and are given an
                    183: instruction type of 0; thus all such instructions compared equal.  The
                    184: equop() routine was changed to test the names of these '0' type
                    185: instructions for equality.  [c2: c21.c]
                    186: 
                    187: The compiler sometimes botched computations into stack temporaries by
                    188: treating expressions like '-40(fp)[r1]' as permissible temporaries.  I
                    189: rewrote the shtemp() routine to make it explicit that the 'stack
                    190: temporary' goal in code generation means precisely that the final
                    191: expression must not contain any references to temporary registers (like
                    192: r1).  I had to add a couple templates to the code table to push
                    193: exceedingly complex OREG expressions onto the stack when this goal is
                    194: attempted.  [pcc.vax: local2.c, table.c]
                    195: 
                    196: A bug sometimes caused a redeclaration of an array in an inner scope to
                    197: affect the outer array when the outer array was incompletely specified
                    198: (by leaving out the most significant dimension).  For example:
                    199: 
                    200:        extern int a[];
                    201:        x(){ int a[10]; }
                    202:        int a[20];
                    203: 
                    204: This code would elicit the error 'foo.c, line 3: redeclaration of a'.
                    205: The routine defid() is used to enter new definitions; for some reason
                    206: scope problems are not resolved in defid() until much other code has
                    207: been executed, including code that deals with filling out array sizes.
                    208: The change makes defid() notice inner scopes with auto and register
                    209: declarations earlier than usual.  [mip: pftn.c]
                    210: 
                    211: Case expressions are explicitly restricted to contain only int constants,
                    212: char constants and sizeof expressions (C Reference Manual section 15).
                    213: Previously the compiler didn't test for expressions like '(int) &foo[10]'
                    214: and thus it would generate some rather bogus code.  Expressions which
                    215: resolve to names now elicit the same 'non-constant case expression'
                    216: warning which you receive for variables.  [mip: cgram.y]
                    217: 
                    218: The value of an assignment to an unsigned bitfield was signed through
                    219: an oversight in the code table.  [pcc.vax: table.c]
                    220: 
                    221: From Sam Kendall, a fix to prevent structs, unions, floats, doubles
                    222: and void from being cast to pointer types.  [mip: trees.c]
                    223: 
                    224: Some relict code in moditype() was causing void functions not to be
                    225: converted into pointers in some situations.  [mip: trees.c]
                    226: 
                    227: A minor optimization -- when the lhs of a simple assignment op (&=, |=,
                    228: ^=, +-, -=) is smaller than int size, we can sometimes pun the rhs and
                    229: avoid promoting the lhs to int, performing the operation in int width
                    230: and converting from int back to the lhs type.  For example:
                    231: 
                    232:        register char *ap, *bp;
                    233:        *ap++ |= *bp << 1;
                    234: 
                    235: This used to require 7 instructions, but now needs only 3.  [pcc.vax:
                    236: table.c]
                    237: 
                    238: At some point I added code to conval() to balance types before
                    239: performing constant folding...  While hacking on the tahoe compiler, I
                    240: decided that this code was too complex and replaced it with equivalent
                    241: code that's shorter and easier to understand.  [mip: trees.c]
                    242: 
                    243: Lines containing multiple statements were broken up for the sake of
                    244: tracing with the source debugger in tcheck() and talloc().  [mip:
                    245: common.c]
                    246: 
                    247: I discovered that the C compiler called urem() in three different
                    248: places with a constant divisor...  In my subsequent rampage I hacked
                    249: the compiler to generate inline code for all unsigned division and
                    250: modulus operations with constant divisors.  The largest inline
                    251: expansion should use only 5 instructions, with most using just 3 or 4.
                    252: The changes touched several files but really weren't very messy.
                    253: [mip:  pass1.h, match.c; pcc.vax: local2.c, order.c, table.c]
                    254: 
                    255: A lot of new code was added to handle a really simple problem:
                    256: 
                    257:        unsigned char uc = 255;
                    258:        if (uc == -1) ...
                    259: 
                    260: This incorrectly tested true, because the compiler generated a test
                    261: that looked only at the low order byte of the constant.  Not only that,
                    262: but the compiler didn't realize that this test could be short-
                    263: circuited, since -1 is equal to 4294967295 unsigned and is hence out of
                    264: the range of an unsigned char.  Rather than add lots of cruft to the
                    265: code table, I shoved it into optim2() -- the compiler now picks up all
                    266: the absurd cases where a constant is out of the range of precision of
                    267: a variable it's tested against.  To avoid having to write lots of code
                    268: templates to handle unbalanced unsigned/signed expressions, I forced
                    269: tymatch() to take notice of unbalanced expressions and promote the
                    270: signed operand to unsigned (except with assignment operators, sigh).
                    271: This change in turned required tweaks in autoincr() and in the code
                    272: table to get code quality back.  I hope I can come up with a better way
                    273: to do this...  [mip: trees.c; pcc.vax: local2.c, order.c, table.c]
                    274: 
                    275: The value of TNULL was changed from 'pointer to undef' to 'pointer to
                    276: member of enum' so that 'void *' can be a real type.  TNULL is used to
                    277: tag unused symbol table slots.  [mip: manifest.h]
                    278: 
                    279: A bug in clearst() led to problems with 'schain botch' errors.  When a
                    280: hash collision occurs, a symbol is (linearly) rehashed; if the symbol
                    281: which forced the rehash is deleted, the relook() loop in clearst() will
                    282: cause another symbol with the same hash code to move up and replace the
                    283: deleted symbol.  Torek's 'schain' hack for speedy identification of
                    284: symbols at the same block level will get screwed up by this operation
                    285: since it relies on a linked list of table entries -- moving an entry
                    286: garbles the list.  How did this code ever work before?  [mip: pftn.c]
                    287: 
                    288: Changed putins() in ascode.c in the assembler to permit 0(pc) as a
                    289: write operand...  Previously the assembler automatically optimized
                    290: this to (pc), which is an illegal operand.  [as.vax: ascode.c]
                    291: 
                    292: The complement of an unsigned char or unsigned short value should have
                    293: its high bits set, since the 'usual arithmetic conversions' widen these
                    294: small integers 'before' the operation.  [pcc.vax: table.c]
                    295: 
                    296: A minor code improvement in ccom led to problems in c2 -- c2 was able
                    297: to optimize sequences like 'cvtbl -4(fp),r0; bicl2 $-256,r0' but not
                    298: the (shorter and faster) 'cvtbl -4(fp),r0; movzbl r0,r0'.  A change in
                    299: bflow() causes redundant conversions to be noted and removed, restoring
                    300: code quality.  [c2: c21.c]
                    301: 
                    302: A typo in the 'bitsize' array definition resulted in an unterminated
                    303: comment which screwed up the bit sizes for several types.  I only
                    304: noticed this because I ran the source off with vgrind and the error
                    305: was exposed by comment highlighting...  [c2: c21.c]
                    306: 
                    307: An earlier change to conval() caused LONG and ULONG types to be hacked
                    308: into INT and UNSIGNED; this was fine for the (VAX) compiler, but led
                    309: to inconsistencies with lint.  [mip: trees.c]
                    310: 
                    311: When a syntax error occurs, the parser throws away tokens until it can
                    312: enter a known state.  If a string or character constant delimiter is
                    313: tossed, the parser will try to interpret the contents of the constant
                    314: as code and can get very confused.  A hack was added to yylex() to
                    315: detect this situation -- basically, if a delimiter is seen but the
                    316: string or character constant has not been processed by lxstr() at the
                    317: next call to yylex(), yylex() will call lxstr() itself and dispose of
                    318: the rest of the constant.  [mip: scan.c]
                    319: 
                    320: Following a suggestion by Arthur Olsen, the production for 'switch' was
                    321: modified to complain about constant switch expressions with 'lint -h'.
                    322: [mip: cgram.y]
                    323: 
                    324: Another Arthur Olsen bug report pointed out a problem with increment
                    325: operations that don't match a code template...  Two attempts at
                    326: rewriting the increment are made: the first tries to turn the lvalue
                    327: operand into an OREG, and the second applies a tree transformation to
                    328: convert 'x++' into '(x += sizeof x) - sizeof x'.  A mistake in the
                    329: routine setincr() caused the lvalue operand in its entirety to be
                    330: generated into a register instead of just the lvalue operand's address,
                    331: producing something like 'r0 = x, (r0 += sizeof x) - sizeof x' instead
                    332: of 'r0 = &x, (*r0 += sizeof x) - sizeof x'.  [pcc.vax: order.c]
                    333: 
                    334: Better code for floating post-increment and -decrement can be generated
                    335: with a simple change to the code table and to zzzcode() so that the
                    336: same hack for ordinary post-increment will work for floating point too.
                    337: [pcc.vax: local2.c, table.c]
                    338: 
                    339: I added Arthur Olsen's massive lint fixes for typechecking printf().
                    340: It sure would be nice if there were a way to specify new printf-like
                    341: commands at execute time, perhaps through lint directives embedded in
                    342: include files.  [lint: lint.c]
                    343: 
                    344: Arthur's warning about superfluous backslashes was added to lxstr().
                    345: Rather than adding Arthur's (expensive) code for warning about the
                    346: use of '$', I simply made it illegal (unless 'VMS' is defined).  I
                    347: also took the opportunity to remove '`' gcos BCD constants.  I made
                    348: a slight alteration to yylex() to cause it to eat unknown characters
                    349: rather than punt, since this seemed more useful.  [mip: scan.c]
                    350: 
                    351: Lint would sometimes print a bogus 'i set but not used' warning in
                    352: situations like this:
                    353: 
                    354:        static int i;
                    355:        static int *ip = &i;
                    356: 
                    357:        i = 1;
                    358:        return *ip;
                    359: 
                    360: If you moved the initialization out of the declaration, the warning
                    361: disappeared.  I installed Arthur's hack for forcing lint to examine
                    362: initializations.  This causes lint to treat initializations of auto,
                    363: register and static variables as 'uses' and to ignore sizeof
                    364: expressions as 'uses'.  Also, '&i' in a static or external
                    365: initialization is now a 'set' and a 'use' of 'i'.  [lint: lint.c; mip:
                    366: cgram.y, pftn.c]
                    367: 
                    368: VARARGS0 is now correctly treated differently from plain VARARGS.
                    369: I don't remember who originally noticed this...  [lint: lint.c,
                    370: lpass2.c]
                    371: 
                    372: The register allocation code failed to 'share' register pairs.  I don't
                    373: know why this escaped notice for this long...  I added a bit in the
                    374: 'busy' array to keep track of pairs and modified the code in usable()
                    375: to notice pairs and try to 'share' them.  Some other code which treated
                    376: the values of busy[] elements as arithmetic values had to be changed;
                    377: there is now a macro which performs the proper test.  [mip: allo.c,
                    378: match.c, pass2.h]
                    379: 
                    380: Some extensive code tweaking...  (1) If order() is called on to rewrite
                    381: a UNARY MUL node and that node has a usable index expression, we now
                    382: try to rewrite the base into a register so that oreg2() will produce a
                    383: doubly-indexed OREG.  This is usually an impressive space saving.  (2)
                    384: Instead of laboriously copying a constant 0.0 in data space to clear a
                    385: double or a float, we issue the proper 'clrd' or 'clrf'.  This is done
                    386: by a trick using an alternate prtdcon() routine; I'm not sure who
                    387: invented it.  I guess I'm still not prepared to hack in support for
                    388: floating literals and immediate constants.  (3) The conversion code now
                    389: handles stack pushes directly, which often saves a spill to register.
                    390: With very little adjustment, this also buys us optimally small pushes
                    391: of constants.  (4) Pointer comparisons are now unsigned; I'm not sure
                    392: what this really buys us, but I added it anyway.  (5) AND tests against
                    393: constants are 'small' if both the constant and the other operand are
                    394: also 'small'.  (6) base() now recognizes that NAME nodes can be used in
                    395: pc relative deferred indexed addressing, which is much more compact
                    396: than the equivalent code to compute the address into a register and
                    397: indirect through it.  (7) The optimization code for ANDing with a
                    398: constant now tries to produce a positive mask when small types are used
                    399: so that literal operands are possible; a side effect is that the code
                    400: is more readable.  (8) UCHAR/USHORT to FLOAT/DOUBLE conversions take an
                    401: extra step through INT type to avoid the overhead of an UNSIGNED to
                    402: FLOAT/DOUBLE conversion.  (9) If a logical operator sits above a pair
                    403: of FLOAT to DOUBLE conversions, the conversions are deleted.  (10) Vast
                    404: numbers of redundant or useless templates were deleted from the code
                    405: table.  (11) Conversions to FLOAT in double-only arithmetic now go to
                    406: the trouble of clipping off excess precision from INT and DOUBLE
                    407: operands.  (12) DOUBLE to DOUBLE conversions introduced by reclaim()
                    408: are now silently deleted in the table.  (13) A few 'movd's were turned
                    409: into 'movq's -- more work needs to be done to make this consistent.
                    410: [mip: reader.c; pcc.vax: macdefs.h, local.c, local2.c, table.c]
                    411: 
                    412: A bug which caused assignment op expressions with an unsigned char or
                    413: unsigned short lhs and a floating rhs to treat the lhs as signed was
                    414: fixed.  Some conversion-related stuff which used to be done in the
                    415: table is now done in sconv() so that it's easier to handle and so that
                    416: zzzcode() and its descendants can more safely perform conversions by
                    417: calling zzzcode(p, 'A').  [pcc.vax: local2.c, table.c]
                    418: 
                    419: The code for setting the type of a floating point constant was bogus.
                    420: A floating constant was float if it fit in a float without loss of
                    421: precision, otherwise it was double.  This caused silliness like
                    422: unexpectedly losing low order bits of integers in mixed floating and
                    423: integral expressions.  The fix was to adopt the ANSI proposal that all
                    424: floating constants are type double unless they bear an 'f' or 'F'
                    425: suffix, in which case they are type float.  (Note that a cast to float
                    426: has the same effect as a 'f' suffix and is just as efficient, but I
                    427: conceded to the evident popularity of the 'f' suffix...)  [mip: scan.c;
                    428: pcc.vax: local.c]
                    429: 
                    430: The ASG OPSIMP templates that produce byte and word instructions for
                    431: byte and word destinations weren't being activated very often because
                    432: the constant operands weren't normalized.  I added code to optim2() to
                    433: appropriately reduce the range of constant operands of ASG OPSIMP
                    434: operators and sign-extend.  This blows away many useless conversions to
                    435: and from int.  [pcc.vax: local2.c]
                    436: 
                    437: The template for assignment ops with unsigned char/short lhs and
                    438: floating rhs indicated register sharing for the wrong operand...
                    439: [pcc.vax: table.c]
                    440: 
                    441: The new template that handled OREG for INTEMP failed to take into
                    442: account the size variation in OREG objects.  [pcc.vax: table.c]
                    443: 
                    444: The offstar() routine tries to tweak UNARY MUL trees so that they can
                    445: be handled most effectively by VAX addressing modes.  The code for
                    446: identifying index expressions was adjusted so that more indexed
                    447: addressing modes can be produced.  [pcc.vax: order.c]
                    448: 
                    449: Bogus error messages were being emitted for certain initializations
                    450: following an earlier legitimate error.  It turns out that the
                    451: optimization to prevent initialization code from being emitted after
                    452: errors was preventing the initializer offset counter from being
                    453: updated, and when this occurs, the initialization code screws up -- for
                    454: example, string constants appear to be zero length.  The initialization
                    455: code now always updates the offset even if errors have been detected,
                    456: although code generation is still suppressed.  [pcc.vax: local.c]
                    457: 
                    458: An assignment to a bitfield in an indexed int-width structure led to
                    459: code generation failure due to an indexed OREG child of FLD.  This is
                    460: taboo because the VAX field instructions have byte-size side effects,
                    461: and code in clocal() arranged for indexed structs to have int width.
                    462: I changed clocal() to use byte width instead and it appears to work now
                    463: (and even uses indexed byte addressing correctly).  [pcc.vax: local.c]
                    464: 
                    465: For some reason the unsigned-to-floating conversion code has always
                    466: been long and complex when it could be short and simple.  I used the
                    467: simple code in the Tahoe compiler but didn't think to put it in the VAX
                    468: compiler until prodded by Robert Firth...  [pcc.vax: local2.c]
                    469: 
                    470: John Gilmore noticed that the ! operator didn't work with floating
                    471: constants; this was pretty easy to fix.  [mip: trees.c]
                    472: 
                    473: For some reason, opact() put left and right shifts through tymatch().
                    474: The type balancing of tymatch() is wrong for shifts -- the type of the
                    475: shift depends only on the left operand, while the right operand is
                    476: converted to int.  We now use the shift special case in buildtree() to
                    477: fix the type.  [mip: trees.c]
                    478: 
                    479: Following ANSI (for once) we eliminate warnings for pointer conversions
                    480: involving void *.  [mip: trees.c]
                    481: 
                    482: There were at least a couple bugs in c2 with code that converts 'ashl
                    483: $2,rA,rB; movab _x[rB],rC' into 'moval _x[rB],rC'; one caused the type
                    484: to be wrong ('movab' for 'moval'), one caused neighboring instructions
                    485: to get deleted.  [c2.vax: c21.c]
                    486: 
                    487: A branch to a redundant test sometimes resulted in c2's deleting the
                    488: label too, even if the label itself was not redundant.  [c2.vax: c21.c]
                    489: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.