|
|
1.1 ! root 1: 10/25/88: ! 2: lcc is an ANSI C compiler available to friendly users on coma. ! 3: ! 4: Bit fields are parsed but ignored. Trigraph sequences and the extended ! 5: character set are not supported. The code for register variables needs ! 6: improvement. The only cases now known to yield incorrect code involve ! 7: C++ output and programs that run out of registers, but there must be ! 8: more. -g seems to work with pi, but it's very green. ! 9: ! 10: ANSI-style header files are in /usr/include/lcc, which lcc searches. ! 11: A few prototypes may differ from what is actually in libc.a; the ! 12: consequence is usually a type error. A header file for some V9 ! 13: functions is on the way; more later on this. ! 14: ! 15: For a man page, run "man lcc" or "troff -man /usr/cwf/book/man/lcc.1.v9". ! 16: Mail bug reports to both cwf and princeton!drh (Dave Hanson). ! 17: Please include a short program that exposes the bug. Thanks. ! 18: ! 19: 11/8/88: ! 20: fixes several bugs with error handling, float and string constants, ! 21: register structs, and programs that exhaust register variables. ! 22: makes code for char and short int functions compatible with cc's code. ! 23: ! 24: 11/17/88: ! 25: fixes bugs in spills, in the declaration of longjump in lcc's ! 26: <setjmp.h>, and in the type system ("char" had compared equal to ! 27: "signed char", which ansi forbids). improves error recovery. plus ! 28: internal changes that are theoretically invisible. ! 29: ! 30: it also puts some formals and locals in registers; "man lcc" elaborates. ! 31: the increased demand for registers may expose compiler bugs that have ! 32: been in hiding. if you have regression tests, try them. ! 33: ! 34: 12/8/88: ! 35: fixes sizeof("x"), overzealous reuse of common subexprs, and a loop in ! 36: the spill emitter. improves error reporting and code for many ++/-- ! 37: ops (but prefix versions on registers still need work). folds the ! 38: difference of two constant pointers. defines standard "offsetof" ! 39: macro. ! 40: ! 41: 12/13/88: ! 42: fixes compiler crashes on certain spills in nested conditional exprs. ! 43: fixes bugs in hex char constants, in exprs with chains of unsigned ! 44: mods and divisions, and in *x=*x when x is volatile. uses gcc's ! 45: preprocessor to offer more ANSI extensions. adds bit fields, tho ! 46: they're pretty green, the layout's unique (see the man page), and the ! 47: code needs optimization. ! 48: ! 49: 12/19/88: ! 50: changes some diagnostics. handles arbitrarily long lines. emits ! 51: slightly better code for switches and functions that return structs. ! 52: fixes an infinite loop when undeclared identifiers appeared in ! 53: initializers, an incorrectly formatted error message for illegal ! 54: characters, and bad code for x:goto x and for *f()=g() when g returns ! 55: a struct. ignores -O, because /lib/c2 can trash lcc's code. adds -n, ! 56: which compiles code to detect certain zero-pointer errors; the man ! 57: page elaborates. ! 58: ! 59: 1/5/89: ! 60: improves diagnostics. deletes warnings about unused return values, ! 61: except when they're structures. fixes minor errors in the standard ! 62: include files. stops losing the token following asm("..."). emits ! 63: slightly worse code for nested calls, in preparation for a mips ! 64: target. several internal changes that should have no effect. ! 65: ! 66: 1/9/89: ! 67: improves entry code for some functions. gets clr/inc instructions even ! 68: if the 0/1 is expressed oddly (eg, 0x1). corrects bad code for ! 69: (unsigned)c==0xff, for f(g().b) when b's offset >0, and for -u>0 for ! 70: unsigned u. returns to the old code for nested calls, so f(x?h():0), ! 71: f(x&&h()), and f(x||h()) work again. corrects minor flaws in string.h. ! 72: ! 73: 2/1/89: ! 74: ! 75: improves diagnostics. improves handling of long parameter lists, long ! 76: string constants, and integral constants between 2^31-1 and 2^32-1. ! 77: responds to constant overflow in a machine-independent fashion. ! 78: flattens nested calls (for the mips target). corrects bad code for ! 79: a[2*i]=f(a[2*i]), (double)(float)0.3, stab entries for initialized ! 80: statics, and some nested conditionals. assigns registers differently: ! 81: r0-5 are now for temporaries, and r6-11 for variables. fixes several ! 82: crashes and assertion failures: if you've had some, try them now; ! 83: otherwise ignore. ! 84: ! 85: 2/10/89: ! 86: ! 87: -A now warns about calls to functions without prototypes. diagnostics ! 88: now include only the line number and omit the character position. ! 89: empty declarations in parameter lists (eg, "f() struct s {int x;};") ! 90: are now errors, and other empty declarations (eg, "int;") now draw ! 91: warnings. no longer forbids const struct members (eg, "struct {const ! 92: int a,b;}"). several internal but theoretically invisible changes. ! 93: ! 94: 2/11/89: ! 95: ! 96: fixes an endless compiler loop and a bug in bit field initialization ! 97: that showed up only on the mips. ! 98: ! 99: 2/14/89: ! 100: ! 101: improves constant folding (eg, 0&&x, -1&x). fixes bugs: applying ! 102: sizeof to explicit array types sometimes made lcc loop or crash; some ! 103: dissimilar floating point constants (eg, -111111.0 and ! 104: -111111.00000000002) were treated as equivalent during constant ! 105: folding; some conditional exprs involving constants gave a compiler ! 106: error (eg, i = 5.6 && i ? 1 : 2;) or bad code (eg, *p = (int *)0 && ! 107: *(int *)0 ? 4 : 5;). fixes a bug in the code that spills a temporary ! 108: register when they're all gone; numerical programs were the most likely ! 109: to have been effected. ! 110: ! 111: 2/17/89: ! 112: ! 113: fixes an assertion failure in the code that spills a register. ! 114: ! 115: 2/24/89: ! 116: ! 117: /usr/include/nlcc shipped. it's a directory of mostly new .h files for ! 118: lcc. in 10 days or so, these files will replace those now in ! 119: /usr/include/lcc, which lcc searches before /usr/include. ! 120: ! 121: fio.h, libc.h, and u.h are non-ansi local contributions from various ! 122: sources. the rest are intended to match the standard, which can be ! 123: irritating but is necessary for portability. the standard errno.h is ! 124: omitted because the local one suits ansi. ! 125: ! 126: users interested more in convenience than in portability are welcome ! 127: to edit fio.h, libc.h, and u.h and to add new .h files; do so on ! 128: bowell or your changes will get lost. don't edit the other headers -- ! 129: they're maintained mechanically from another source. if you find a bug ! 130: in one of these, post cwf and princeton!drh. for portability, we want ! 131: to keep non-standard stuff out of these files, but we do want to hear ! 132: about bugs. ! 133: ! 134: these are just headers. lcc will continue to use cc's libraries ! 135: indefinitely. ! 136: ! 137: 3/1/89: ! 138: ! 139: in the absence of -g, removes immediate tail recursion from ! 140: non-variadic functions. old-style, variadic, tail-recursive functions ! 141: are optimized incorrectly, so give a prototype. ! 142: ! 143: -s now controls which switches become branch tables; the man page ! 144: elaborates. also, the man page now warns of bad code for switches over ! 145: 32kb; repairs soon. ! 146: ! 147: fixes bug that put formals in scope too early, which caused bad code ! 148: or core dumps for some programs like "int a;f(a)int a[sizeof a];{}". ! 149: no longer treats 1/0 and similar expressions as constant expressions. ! 150: corrects diagnostics and compiler crashes for certain erroneous ! 151: inputs. ! 152: ! 153: adds gauss to distribution list. ! 154: ! 155: 3/10/89: ! 156: ! 157: implements 2c's structure extensions, except for in-line structure ! 158: exprs. replaces -s with -d to avoid conflict with ld's -s. adds -v, ! 159: which prints commands as they are executed; see the man page. uses the ! 160: two-operand instructions like addl2 a little more often. places ! 161: initialized const data in a readonly segment. bags casel ! 162: instructions, so switches over 32kb now work. no longer omits ! 163: unreferenced, anonymous types from -g symbol tables. improves ! 164: diagnostics. ! 165: ! 166: corrects a few bugs in /usr/include/nlcc, which replaces ! 167: /usr/include/lcc on 3/14. speak now or forever hold your peace. ! 168: ! 169: 3/11/89: ! 170: ! 171: corrects bad code for switches and for "y>(float)0.0?y:-(double)y". ! 172: avoids an ld bug with external initialized consts. ! 173: deletes -B's "using" message. ! 174: ! 175: 3/16/89: ! 176: ! 177: /usr/include/lcc shipped, a couple of days later than promised. it's ! 178: exactly what's been soaking in /usr/include/nlcc, in which fio.h, ! 179: libc.h, and u.h were the latest local contributions (at least on ! 180: coma), and the rest were conformed with the standard, except that the ! 181: standard errno.h was omitted because the local one suits ansi. ! 182: ! 183: the old headers are in /usr/include/olcc, so try -I/usr/include/olcc ! 184: if you get in a jam. /usr/include/nlcc unshipped. ! 185: ! 186: users interested more in convenience than in portability are welcome ! 187: to edit fio.h, libc.h, and u.h and to add new .h files; do so on ! 188: bowell or your changes will get lost. don't edit the other headers -- ! 189: they're maintained mechanically from another source. ! 190: ! 191: these are just headers. lcc continues to use cc's libraries. ! 192: ! 193: 3/23/89: ! 194: ! 195: fixes a register fragmentation bug by eschewing odd double registers; ! 196: if you use a lot of doubles, retry any regression tests that you might ! 197: have. fixes bugs in a few diagnostics. assert.h may now be included ! 198: more than once without calamity. -P prints function prototypes for all ! 199: defined functions and globals in a form suitable for use in header ! 200: files; see the man page. plus several internal changes that should ! 201: have no effect. ! 202: ! 203: 3/29/89: ! 204: ! 205: fixes several spill bugs; code with large double exprs is most ! 206: likely to have been bogus. accepts wide-character literals and treats ! 207: them like ordinary character literals. treats `long int' and `long ! 208: double' as types distinct from int and double, but with the same sizes ! 209: and alignments; they had been treated as identical types, which is ! 210: wrong. deletes bogus diagnostics for: ! 211: ! 212: int *const p = (int *const)0; ! 213: int *x = (f(), 0); ! 214: typedef int I;main(){I I(I);} ! 215: ! 216: 3/29/89: ! 217: ! 218: fixes two bugs new in this morning's (3/29) lcc: ! 219: ! 220: calls to char and short functions gave a fatal compiler error. ! 221: ! 222: type `unsigned long int' was missing; variables so declared were taken ! 223: to be `long int', so, for example, right shift of an unsigned long ! 224: erroneously extended the sign bit. the repair causes non-trivial ! 225: expressions involving long int, long unsigned, and long double to have ! 226: types int, unsigned, and double, respectively. this behavior should ! 227: not affect the generated code because ints *are* long ints, etc., but ! 228: it might mask type errors. ! 229: ! 230: 4/16/89: ! 231: ! 232: bug fixed: casts to enum types weren't treated as ints. ! 233: ! 234: new feature: in asm("string") occurrences of `%name' are replaced by ! 235: the address or register for the identifier `name' if `name' is ! 236: visible. the man page elaborates. ! 237: ! 238: /usr/include/lcc now holds only the headers specified by the ANSI ! 239: standard. The local headers (fio.h, libc.h, u.h) and a local version ! 240: of stdio.h are now in /usr/include/libc. lcc now searches the latter ! 241: before the former, so the default will find the local stdio.h. -N ! 242: tells lcc to discard its usual search list and use only directories ! 243: named in explicit -I args. So use "lcc -N -I/usr/include/lcc" to ! 244: ensure conformance with the ANSI standard. Report bugs in the standard ! 245: headers to cwf. Report bugs in the local headers to rob. Don't edit ! 246: either set directly -- they're maintained mechanically from central ! 247: sources, so edits will get lost. ! 248: ! 249: 4/19/89: ! 250: ! 251: some function definitions inconsistent their prototypes went ! 252: undetected (eg, extern int f(int); void f(x)int x;{}). ! 253: ! 254: long ints were erroneously promoted to ints. this bug showed up in ! 255: prototype errors (eg, extern f(long); f(n) long n; {}). ! 256: ! 257: implements 2c's in-line struct exprs ((struct foo) {...}). the code's ! 258: poor, and run-time alignment errors can occur for incomplete exprs. ! 259: improvements soon. ! 260: ! 261: structs have always been aligned to suit their strictest member. to ! 262: fix some alignment crashes on the mips, they are now additionally ! 263: guaranteed int alignment (four bytes on all current targets). so ! 264: recompile all modules that use structures composed entirely of chars ! 265: and shorts. yacc and lex produce some. ! 266: ! 267: 4/28/89: ! 268: ! 269: "-(unsigned long)x" crashed the compiler. bit fields and functions ! 270: were erroneously permitted as arguments to sizeof. pointers to enums ! 271: were not treated as pointers to ints, which drew erroneous type errors ! 272: (eg, in "enum {...} *ap; int *x = ap;"). ! 273: ! 274: local arrays are now guaranteed int alignment. the old, weaker ! 275: alignment sometimes made array initialization code crash on the mips. ! 276: ! 277: "#pragma ref id" now simulates a reference to id; it may be used to ! 278: suppress a warning about an otherwise unreferenced variable (eg, a ! 279: sccs id). ! 280: ! 281: -N now turns off the non-ansi local extensions in addition to restricting ! 282: the search for header files to only those directories named by -I. ! 283: ! 284: 5/1/89: ! 285: ! 286: fixes bug in some subscript computations for multi-dimensioned char ! 287: arrays of length 4 or less. this bug occurred only in the presence of ! 288: char arrays in which each element was initialized or initialized ! 289: structs with bit fields. ! 290: ! 291: 5/11/89: ! 292: ! 293: improves code for arithmetic and boolean ops on chars and shorts. if ! 294: you use these a lot, run any regression tests that you have. ! 295: ! 296: the algorithm used to induce register variables has been changed. ! 297: registers are assigned to locals and parameters if their weighted ! 298: reference count is at least 3. each reference counts adds X, where X ! 299: starts out at 1 and is multiplied by 10 in each loop, by 1/2 in each ! 300: then/else, and by 1/10 in each switch. ! 301: ! 302: 4/28's fix that made `pointer to enum' equivalent to `pointer to int' ! 303: was too permissive. warnings are now issued for assignments between ! 304: `pointer to int' and `pointer to enum'. all other combinations are ! 305: errors. ! 306: ! 307: structs are no longer guaranteed int alignment. they are still aligned ! 308: to suit their strictest member. recompile modules that use structures ! 309: composed entirely of chars and shorts. yacc and lex produce some. ! 310: ! 311: tail recursion is no longer removed. errors occurred when locals were ! 312: aliased. ! 313: ! 314: some valid combinations of qualified pointers in result arms of ?: ! 315: caused erroneous diagnostics, and incorrect uses of types pointer and ! 316: int in result arms of ?: went undetected. ! 317: ! 318: some subscript computations for multi-dimensioned char arrays of ! 319: length 4 or less were incorrect because their types were mangled. ! 320: this bug occurred only in the presence of char arrays in which each ! 321: element was initialized or initialized structs with bit fields. ! 322: ! 323: casts from integer types to long double were silently ignored. real ! 324: constants suffixed by "l" or "L" were erroneously type double; they're ! 325: now type long double. ! 326: ! 327: UINT_MAX was missing from <limits.h>. time_t, wchar_t, size_t and ! 328: clock_t are now protected from redefinition. the compiler erroneously ! 329: accepted and silently ignored preprocessor statements; except for ! 330: #pragma, they now draw an error. ! 331: ! 332: 5/19/89: ! 333: ! 334: f(){int (*a)[];(*a)[5] = 0;} is now accepted. ! 335: ! 336: variables referenced mainly in deeply nested control structure were ! 337: erroneously reported as unreferenced. ! 338: ! 339: no more arbitrary limit on the number of scope levels. ! 340: ! 341: 5/27/89: ! 342: ! 343: Type casts were erroneously accepted as l-values. On the vax, bad code ! 344: was silently generated for signed div and mod ops when the destination ! 345: was a (signed or unsigned) char or short. ! 346: ! 347: 6/2/89: ! 348: ! 349: now accepts "int a = 3;extern int a;". some constant expressions with ! 350: casts were not accepted as constants (eg, ~((unsigned short) 0)). ! 351: fixes bad code for struct args whose size is not divisible by four. ! 352: ! 353: 6/8/89: ! 354: ! 355: improves diagnostics. some valid field references in extended ! 356: structures were erroneously flagged as errors. e&0 always returned 0 ! 357: and never evaluated e, even if e had side effects. ignores ! 358: unrecognized preprocessor control lines. ! 359: ! 360: 8/3/89: ! 361: ! 362: fixes compiler crashes caused by long string constants with lots of ! 363: escaped characters. ! 364: ! 365: the va_start macro in stdarg.h did not handle char or short arguments ! 366: correctly. ! 367: ! 368: on the vax, bad code was generated for some assignments to unsigned ! 369: char (eg, "char a[10]; unsigned char b = a[i];"). ! 370: ! 371: signed divisions by a constant power of two are no longer performed by ! 372: shifts; the results were inconsistent with the standard, which ! 373: requires that (a/b)*b + a%b == a. ! 374: ! 375: some illegal casts in constant expressions were erroneously accepted ! 376: (eg, "int x, y=(int)&x;"). ! 377: ! 378: missing tags were erroneously permitted in some struct declarations ! 379: (eg, "struct *p;"). ! 380: ! 381: now allows a terminal comma in enums, unless -N (strict ANSI) is ! 382: specified. ! 383: ! 384: warns about switch statements with no cases and about functions ! 385: declared static but never defined or referenced. ! 386: ! 387: with -A, warnings about missing prototypes are now issued only once ! 388: instead of once per call. ! 389: ! 390: doug has merged the man pages for cc and lcc. ! 391: ! 392: 8/8/89: ! 393: ! 394: fixes bad code for x=y<<1 when x is a short. ! 395: ! 396: 8/29/89: ! 397: ! 398: preprocessor generated lines of the form `# n "name"' and `# n' are ! 399: accepted. ! 400: ! 401: repeated initializations of an array type defined by a typedef ! 402: (typedef char str[]; str a = "hi", b = "there";) elicited incorrect ! 403: error messages. ! 404: ! 405: on the mips, some initialized structures that began with a char or ! 406: short were misaligned. ! 407: ! 408: shamash and bartok added to the shipping list. ! 409: ! 410: 9/16/89: ! 411: ! 412: better code for comparing bit fields with 0 and for setting them to all ! 413: 1s or 0s; manipulating 1-bit fields is as efficient as using flags with ! 414: explicit | and & operators. ! 415: ! 416: eliminates more dead code. ! 417: ! 418: eliminates multiple copies of some constants. ! 419: ! 420: fixes bad code for multiple assignment to bit fields in the same word ! 421: (eg, struct { unsigned x:1,y:1; } *p; p->x = p->y = 1;). ! 422: ! 423: fixes bad code for some logical operators with constant operands (eg, ! 424: x||1). ! 425: ! 426: fixes a compiler crash on the mips for some calls that pass a float and ! 427: return a struct. ! 428: ! 429: 9/29/89: ! 430: ! 431: takes care to emit only non-empty .s files on the mips, whose assembler ! 432: cares. corrects bad mips code in some cases when one of the first four ! 433: formals gets assigned to a register and is declared (old-style) to be a ! 434: (single-precision) float. ! 435: ! 436: 10/4/89: ! 437: ! 438: in unions with bit fields, the offsets for subsequent fields were ! 439: wrong. unions comprised entirely of bit fields were thought to be of ! 440: size 0, which drew a bad diagnostic. math.h's HUGE_VAL is now less ! 441: conservative. several numbers in limits.h were wrong. ! 442: ! 443: 10/21/89: ! 444: ! 445: hex escapes now properly include the longest possible run of hex digits ! 446: after the \x, even when the value is too big for a char. lcc truncates ! 447: and warns about octal and hex escapes with values that won't fit in 8 ! 448: bits. it also warns about undefined escapes like \c. ! 449: ! 450: local declarations of static functions that were previously defined ! 451: drew erroneous mismatched declaration warnings. ! 452: ! 453: better code for e1?e2:0. ! 454: ! 455: fixes bad struct returns for functions that explicitly declare more ! 456: register locals than lcc allows for the target. ! 457: ! 458: different code for spills. ! 459: ! 460: on the 68020, fixes bad code for "return i%j". ! 461: ! 462: limits.m4 now casts INT_MIN to int and LONG_MIN to long. without the ! 463: casts, the 0x80000000 ended up unsigned. ! 464: ! 465: 10/24/89: ! 466: ! 467: for new-style functions, float actuals corresponding to int or long ! 468: formals went unconverted. eg, "f(int x) { float y; f(y); }" failed to ! 469: convert y. ! 470: ! 471: error messages for the redeclaration of enum ids misreported the ! 472: location of the previous declaration. ! 473: ! 474: on the vax, <unsigned constant> >> <anything> generated bad code. ! 475: ! 476: on the vax, casts that narrowed and then widened an indexing expr ! 477: generated bad code. ! 478: ! 479: limits.h substitutes exprs for some hard constants to reduce machine ! 480: dependencies. ! 481: ! 482: 11/3/89: ! 483: ! 484: a missing } at the end of file drew a garbled diagnostic. ! 485: ! 486: lcc crashed when a conditional expr fed a binary op that fed a ! 487: bit field assignment. ! 488: ! 489: lcc crashed when the value of x?y:0 was not used. ! 490: ! 491: new driver for lcc. no -M. preprocessor and compiler are now ! 492: connected with a pipe. flags must now precede file names and ! 493: libraries. ! 494: ! 495: 11/7/89: ! 496: ! 497: on the vax, fixed bad code for *s&&*s++. ! 498: ! 499: 11/17/89: ! 500: ! 501: casts of constants to illegal types caused an assertion failure. no ! 502: longer warns about switches with only the default case. now allows ! 503: more generated labels. the new driver hung on long programs with too ! 504: many errors. ! 505: ! 506: on v9 vaxes, now supplies -J to the assembler. ! 507: ! 508: on tempel, RAND_MAX was too small. on all mips machines, lcc exited ! 509: with status 0 even with errors. an omission from the mipsco docs led ! 510: to an incompatibility with code from cc for new-style functions with ! 511: single-precision floats as arguments 2, 3, or 4. ! 512: ! 513: 12/26/89: ! 514: ! 515: constants burn less time and space. large initializations compile much ! 516: faster. ! 517: ! 518: vertical tabs and form feeds were previously treated as newlines; ! 519: they're now treated as blanks. ! 520: ! 521: ~~x and -(-x) have been replaced with just x. ! 522: ! 523: specifying both -A and -n drew inappropriate missing prototype ! 524: messages. ! 525: ! 526: types defined in parameter lists were inaccessible within the ! 527: function. ! 528: ! 529: the compiler crashed when the value of "x,y" was used and y was a ! 530: relational or conditional expr. ! 531: ! 532: the compiler crashed when a void (eg, via a cast) was assigned to a bit ! 533: field. ! 534: ! 535: on the mips, an invalid instruction was generated for a register float ! 536: used as argument 2, 3, or 4. the assembler rejected it. ! 537: ! 538: on the mips, literals have been moved to the text segment. ! 539: ! 540: on the mips, -p now works. as with cc on (only) these machines, it ! 541: does not count calls. for that, use "pixie", which works with lcc's ! 542: a.outs. ! 543: ! 544: on the 68020, -g generated incomplete symbol table information for ! 545: structures that were used before being defined ! 546: (eg "struct A; g(struct A *x) {} struct A { int a,b; };") ! 547: ! 548: CLOCKS_PER_SECOND is now 1000000 everywhere. that's now consistent ! 549: with the clock function on the mips and 68020 machines, and it's ! 550: irrelevant on the vaxes, because their libraries don't include the ! 551: function. ! 552: ! 553: numerous internal improvements, all theoretically invisible. ! 554: ! 555: 2/2/90: ! 556: ! 557: sizeof erroneously returned an int. it now returns an unsigned as ! 558: dictated by ANSI. WARNING: the pre-ANSI sizeof returned an int, so lcc ! 559: has been masking a potential problem with the conversion of pre-ANSI ! 560: programs. ! 561: ! 562: casts in integer constant exprs in array bounds, enum defs, and field ! 563: widths sometimes gave bad values. ! 564: ! 565: string constant arguments of asm directives were handled wrong, which ! 566: made the compiler crash or emit bad diagnostics. ! 567: ! 568: comparisons of ints and pointers like i==(int*)1 crashed the compiler. ! 569: ! 570: arrays with unspecified bounds are now noted as an `incomplete array' ! 571: in error messages. ! 572: ! 573: reuses of common subexprs in conditional exprs sometimes generated bad ! 574: code. ! 575: ! 576: on the vax, bad code was generated for unsigned right shift by a ! 577: non-constant when r0 was busy. ! 578: ! 579: on the suns, the register save mask at function entry and exit for ! 580: floating point registers was incorrect. ! 581: ! 582: lcc -E foo.i (foo.s) erroneously compiled (assembled) the given file. ! 583: ! 584: several theoretically transparent internal changes. ! 585: ! 586: 2/20/90: ! 587: ! 588: lcc no longer crashes when presented with local arrays of undefined ! 589: structs or with calls to functions that return const structs. ! 590: ! 591: u%2^n now generates the same code as u&(2^n-1) for unsigned u and ! 592: constant 2^n. ! 593: ! 594: on the suns, RAND_MAX is now 2^31-1, which contradicts the man page but ! 595: is consistent with what rand() seems to do. ! 596: ! 597: 2/21/90: ! 598: ! 599: fixes bad code introduced yesterday on all targets for u%2^n for ! 600: unsigned u and constant 2^n. ! 601: ! 602: 2/28/90: ! 603: ! 604: multiple assignments to bit fields in the first word of a struct (like ! 605: struct {unsigned a:1,b:1;} x; x.a=x.b=1;) no longer generate bad code. ! 606: ! 607: extra parentheses in declarations (like int *(x(int));) sometimes crashed ! 608: the compiler. ! 609: ! 610: the driver sometimes erroneously removed input .o files. ! 611: ! 612: -Wp<arg> now passes <arg> to the preprocessor. -Wa, -Wl, and -Wf do ! 613: likewise for the assembler, linker, and compiler proper. <arg> is ! 614: passed untouched; if the recipient expects a leading dash, give it ! 615: explicitly. ! 616: ! 617: -T is gone. use -Wp-T instead. ! 618: ! 619: 3/2/90: ! 620: ! 621: fixed incorrect optimization of i%1 on all machines. ! 622: ! 623: on the vax, -Wf-k now avoids some of the instructions that may fail ! 624: when used to access i/o space. it does not protect against all ! 625: dangers: don't touch i/o space via the program counter, floating point ! 626: instructions, struct copies (including struct args and return values), ! 627: or calls (eg, don't index a table of function pointers with an i/o ! 628: cell). i can't thoroughly test this option myself, so beware. ! 629: ! 630: 3/8/90: ! 631: ! 632: relaxes an overzealous assert() in the register spiller. ! 633: ! 634: many internal cleanups, all theoretically invisible outside. ! 635: ! 636: 3/17/90: ! 637: ! 638: the compiler was crashing on x+=(const int)1 ! 639: ! 640: on the mips, fixes bad code for functions that take a double or float ! 641: as arg#1 and return a struct. ! 642: ! 643: on the vax, slightly different tradeoffs between movl $_x and moval _x. ! 644: ! 645: 3/26/90: ! 646: ! 647: better assignment of variables to registers. explicit register dcls ! 648: are still obeyed first, but any remaining regs are now assigned to ! 649: variables in order of estimated payoff. ! 650: ! 651: bad floating constants like 1e and 1e+ were erroneously accepted. ! 652: ! 653: diagnostics for illegal break and continue statements were garbled. ! 654: ! 655: inline struct expressions now accept struct-valued fields, eg ! 656: struct Point { int x, y; } p, q; ! 657: struct Rectangle { struct Point min, max;} r = (struct Rectangle){p, q}; ! 658: ! 659: on v9 vaxes, lcc now emits some symbol table data even without -g. the ! 660: intent is to mimic cc, though lcc documents globals as well as locals ! 661: and formals. ! 662: ! 663: compiler flags are no longer required to precede filenames. like cc, ! 664: they may appear anywhere but are processed before any files. ! 665: ! 666: lcc, like cc, now removes a .o file iff exactly one source file (.c, ! 667: .s, .i) appears and no other file (source, object, library) or -l ! 668: option appears. ! 669: ! 670: 5/9/90: ! 671: ! 672: warnings are no longer issued for calls to struct functions in which ! 673: the returned struct is not used. ! 674: ! 675: lines containing only white space and one # are now ignored. ! 676: ! 677: -N now suppresses recognition of asm("..."). ! 678: ! 679: ansi multibyte characters like 'abc' are now accepted, and lcc warns ! 680: about ignoring the excess characters. ! 681: ! 682: -P now prints char* even if a typedef for char* has been defined. ! 683: ! 684: sizeof(L'x') is now correctly the same as sizeof(wchar_t), which is 1. ! 685: sizeof('x') is still the same as sizeof(int), as it must be. ! 686: ! 687: for constant y, 0&&y (0||y) erroneously returned y instead of y!=0. ! 688: ! 689: initializing char a[N] with a string of exactly N chars caused the ! 690: trailing null byte to be omitted from other N-char strings appearing ! 691: before the offending initialization. ! 692: ! 693: the value of bit field assignments was erroneously taken to be the ! 694: right operand instead of the value of the left operand. eg, for ! 695: an unsigned 3-bit field x, f(b.x=15) passed 15. it now passes 7. ! 696: ! 697: casts and structs returned by functions were erroneously permitted as ! 698: l-values. ! 699: ! 700: exprs like &(((struct foo)0)->x[0]) and array-sizeof(array) were not ! 701: recognized as constant. they were thus erroneously forbidden in ! 702: initializers. ! 703: ! 704: casts in the operands of ?: sometimes caused an assertion failure. ! 705: ! 706: using the value from a postincrement or postdecrement of a bit field ! 707: caused an assertion failure. ! 708: ! 709: legal comparisons of qualified and unqualified compatible pointers were ! 710: erroneously diagnosed as type errors. ! 711: ! 712: for function f, &f was erroneously diagnosed as an error. ! 713: ! 714: types `function returning T' and `array of T' were not uniformly converted ! 715: to `pointer to function returning T' and `pointer to T', respectively. ! 716: ! 717: char *a; void *b; a?b:c was erroneously diagnosed as a type error. ! 718: ! 719: initialization of automatic structs with const fields was erroneously ! 720: diagnosed as an assignment error. ! 721: ! 722: types other than int, signed int, or unsigned int were erroneously ! 723: permitted for bit fields and const and volatile qualifiers were ! 724: erroneously forbidden. ! 725: ! 726: repeated block-level declarations for functions were erroneously ! 727: diagnosed as redeclaration errors. ! 728: ! 729: valid assignment of pointers to qualified or unqualified versions of ! 730: compatible types was erroneously diagnosed as a type error, e.g., ! 731: const char *a;const char *volatile *b=&a; ! 732: ! 733: on the 68020, lcc gave bad code for x=f(x) where f returns a struct. ! 734: ! 735: on the 68020, lcc erroneously converted floats and doubles to ints by ! 736: rounding. it now correctly truncates any fraction. ! 737: ! 738: on the 68020 and mips, lcc gave bad code for calls in which the ! 739: function was computed with another call, like (*g(f(1)))(2). ! 740: ! 741: on the mips, -p caused prof to report incorrect file names. ! 742: ! 743: on the mips, fixes bad code for f(x<op>y) when x is a floating point ! 744: register and <op> is an augmented assignment. ! 745: ! 746: on the vax, fixes bad code for signed comparisons of chars with ! 747: constants not in [-0x80..0x7f] and of shorts with constants not in ! 748: [-0x8000..0x7fff]. lcc treats plain chars as signed chars, so they ! 749: were afflicted too. ! 750: ! 751: on the vax, fixes bad code for u>0 and u<=0, for any unsigned expr u. ! 752: ! 753: the dummy parameter names were removed from the ansi include files. ! 754: eg, f(int x) is now f(int) instead. ! 755: ! 756: limits.h was rewritten to use simpler exprs and to avoid casts. ! 757: #if misevaluated some of the old exprs, and it doesn't do casts. ! 758: ! 759: don't use the unsigned constant suffix (eg, 0u) in #if commands. ! 760: the preprocessor can't cope. ! 761: ! 762: numerous theoretically invisible internal improvements. ! 763: ! 764: 5/9/90: ! 765: ! 766: The lcc compiler now passes the conformance section of Version 1.09 of ! 767: the Plum Hall Validation Suite for ANSI C, subject to the restrictions ! 768: below. ! 769: ! 770: We do not have a conforming preprocessor or library. ! 771: ! 772: The lcc command must use -N and enable trigraphs with -Wp-T. It must ! 773: use -I to search only the ANSI standard headers. It may need to ! 774: undefine some of the system-specific pre-defined symbols; -v exposes ! 775: these. ! 776: ! 777: The only versions of lcc tested to date are the ones running on the SGI ! 778: 4D/240S under IRIX System V Release 3.2.1, on the VAX 8550 under ! 779: UNIX V10, and on the Sun-3 under SunOS Release 4.0. ! 780: ! 781: 5/11/90: ! 782: ! 783: for float constant x, -x was not recognized as constant. ! 784: ! 785: for volatile x, x++ drew unwarranted warnings. ! 786: ! 787: 7/6/90: ! 788: ! 789: stores enums in unsigned/signed chars, unsigned/signed shorts, or ints ! 790: depending on the range of the enum constants. this change may alter ! 791: struct layouts and the size of globals, so discard old object files ! 792: that use enums. it also causes diagnostics when new-style declarations ! 793: are mixed with old-style definitions for functions with enum arguments, ! 794: so enum foo {a,b,c}; int f(enum foo); ... f(x) enum foo x; {...} ! 795: is equivalent to int f(char); ... f(x) char x; {...} ! 796: which is an error because the prototype in the declaration doesn't ! 797: match the prototype inferred from the definition (which is int f(int)). ! 798: ! 799: permits up to 127 formals. ! 800: ! 801: limits identifiers and numeric constants to 64 characters; ! 802: string constants can have up to 4096 characters. ! 803: ! 804: better diagnostics; some warnings are now errors. ! 805: ! 806: eliminates more branch chains. ! 807: ! 808: on the mips, lcc now truncates constant shift counts to 5 bits. the ! 809: assembler did this before, but it squawked first. ! 810: ! 811: -t produces code to print trace messages at function entry & exit. ! 812: ! 813: the driver now ignores duplicate `.o' files, eg, `lcc x.c x.o' is ! 814: identical to `lcc x.c'. ! 815: ! 816: provides errno.h, which simply includes /usr/include/errno.h. ! 817: ! 818: numerous internal improvements, all theoretically invisible. ! 819: ! 820: errors fixed: ! 821: ! 822: erroneously permitted 0x as a hexadecimal constant. ! 823: ! 824: failed to treat (double)<unsigned constant> as constant. ! 825: ! 826: did not detect overflow in enumeration constants, eg, for B in ! 827: enum {A=INT_MAX, B}. it still fails to detect underflow/overflow in ! 828: constant expressions, which it really ought to do. ! 829: ! 830: erroneously permitted declarations and definitions for functions ! 831: returning unknown structures. ! 832: ! 833: erroneously permitted application of unary + to any scalar type. ! 834: ! 835: erroneously permitted comma expressions in constant expressions. ! 836: ! 837: erroneously permitted negative bit field widths. ! 838: ! 839: did not recognize simple function types in casts, eg, int(). ! 840: ! 841: incorrectly used the type of x or y for c?x:y where c is a constant; ! 842: the correct type is the composite type of x and y; eg, the type of ! 843: 1?(char*)p:(const char*q) is const char* not char* . ! 844: ! 845: `lcc -g foo.i' emitted incorrect line number information if foo.i ! 846: didn't include `# n file' directives. ! 847: ! 848: -g did not emit line number information for initialized locals. ! 849: ! 850: 7/9/90: ! 851: ! 852: on the vax, lcc generated code that wouldn't even assemble for ! 853: char c;unsigned short *v;f(){c = v[c];} ! 854: ! 855: 8/27/90: ! 856: ! 857: -b produces code that writes an expression-level profile into ! 858: prof.out. bprint turns the data into an annotated listing, and lcc ! 859: -Wf-a uses it to improve register assignments. the man pages for lcc ! 860: and bprint elaborate. ! 861: ! 862: warns about implicit returns for functions that return other than int ! 863: or void; -A includes int functions. ! 864: ! 865: -E now preprocesses unsuffixed file arguments. ! 866: ! 867: sign extends integer right shift in constant expressions on all targets. ! 868: ! 869: many internal improvements, all theoretically invisible. ! 870: ! 871: errors fixed: ! 872: ! 873: -t caused an erroneous redeclaration message for printf. ! 874: ! 875: failed to convert x from double to float in f(x) const/volatile float x; {...} ! 876: ! 877: erroneously forbid const/volatile enum {...} x in switch (x) and in int y=x. ! 878: ! 879: erroneously forbid enum bit fields for enum types that are compatible ! 880: with int, signed int, or unsigned. ! 881: ! 882: variadic functions with structure arguments did not work; 1 and 2-byte ! 883: structs still fail on big endians (non-DEC MIPS, Motorola, SPARC), and ! 884: 8-byte structs and those holding doubles fail on all MIPSes. ! 885: ! 886: with -g on V10 VAXes, bad symbol table names for anonymous structs, ! 887: unions, and enums. ! 888: ! 889: with -g on the Sun (68020 & SPARC), bad symbol table entries for ! 890: mutually referential structs. ! 891: ! 892: with -g, misplaced or omitted symbol table entries for statics, ! 893: externs, typedefs, and types defined in nested blocks. ! 894: ! 895: assertion failure on illegal casts of constants, eg, (struct foo)0. ! 896: ! 897: assertion failure on switch(x.y) {...} where y is an undefined field. ! 898: ! 899: 8/28/90: ! 900: ! 901: on the vax, an unsigned div/mod common subexpr that was also an ! 902: argument caused lcc to loop. on the sparc, it happened for all ! 903: int/unsigned div/mod/mul operations. ! 904: ! 905: 9/5/90: ! 906: ! 907: now permits any number of parameters. ! 908: ! 909: volatile locals and parameters are no longer assigned to registers. ! 910: ! 911: with -g, parameters are no longer assigned to registers; some debuggers ! 912: couldn't cope. ! 913: ! 914: generated bad symbolic addresses in constant expressions involving ! 915: externals declared inside blocks. ! 916: ! 917: misdiagnosed as errors some multiple assignments of returned structs, ! 918: eg, struct p {...} f(); struct r {struct p c;} x,y; x.c = y.c = f(); ! 919: ! 920: on sparcs, generated unaligned code after some initialized const data. ! 921: ! 922: 9/13/90: ! 923: ! 924: erroneously elided calls to struct functions in conditional expressions ! 925: where the resulting value went unused, eg, i?y:f() ! 926: ! 927: assertion failure on conditional expressions with calls to struct ! 928: functions, eg, x=i?y:f() ! 929: ! 930: improved diagnostics. ! 931: ! 932: theoretically invisible internal improvements. ! 933: ! 934: 9/14/90: ! 935: ! 936: lcc crashed on f(){const struct { int a; } *fp;fp++;} ! 937: ! 938: 9/21/90: ! 939: ! 940: dropped backslashes that appeared at positions evenly divided by 4096. ! 941: ! 942: on v10 vaxes, now emits stab entries for locals even without -g, ! 943: for consistency with cc. ! 944: ! 945: on sparcs, fixes bad code for some argument lists that perform ! 946: a mul/div/mod after the third argument. ! 947: ! 948: 10/22/90: ! 949: ! 950: improvements/changes: ! 951: warns about static declarations that specify incomplete types. ! 952: ! 953: diagnoses declarations that specify objects with sizes >= 2^31. ! 954: ! 955: detects overflow in constant expressions and treats such expressions ! 956: as non-constant expressions; compiling old code may fail. ! 957: ! 958: better register allocation for leaf functions. on sparcs, better ! 959: register allocation for all functions. ! 960: ! 961: elides unreferenced locals. ! 962: ! 963: warns about bit-field initializers that are too big. ! 964: ! 965: with -N, duplicate global definitions in separately compiled ! 966: files cause loader errors; compiling old code may fail. ! 967: ! 968: improved diagnostics. ! 969: ! 970: errors fixed: ! 971: erroneously permitted static function declarations in blocks. ! 972: ! 973: erroneously diagnosed valid multiple declarations within blocks. ! 974: ! 975: computed incorrect composite types from multiple declarations. ! 976: ! 977: with -g, the Sun assembler choked on long symbol table entries; ! 978: continuations are now emitted. ! 979: ! 980: with -t, assertion failure on `return f(x)' where f returns a struct. ! 981: ! 982: bad values for (unsigned)d when 2147483647 < double d <= 4294967295. ! 983: ! 984: erroneously forbid carriage returns in strings. ! 985: ! 986: 10/23/90: ! 987: ! 988: fixes floating overflow in constant multiplications in which one ! 989: nonzero argument is between -1.0 and 1.0. ! 990: ! 991: 11/28/90: ! 992: ! 993: Now accepts #line. It has for a month, but I forgot to say so before. ! 994: ! 995: Now ignores multiple occurrences of just `.o' file arguments. ! 996: Formerly, it ignored multiple occurrences of ALL file arguments. ! 997: ! 998: With -A, now warns about declarations and casts with prototype-less ! 999: function types. Formerly, it warned only at calls. ! 1000: ! 1001: Warns about casts from pointers to integral types that are too small. ! 1002: ! 1003: Overflow in constant exprs has been demoted from an error to a warning. ! 1004: ! 1005: Conversions between pointers to objects and pointers to functions are ! 1006: now properly diagnosed. ! 1007: ! 1008: Void and struct operands to bitwise and, or and xor operators no longer ! 1009: cause an assertion failure. ! 1010: ! 1011: With -t, an illegal void return value or argument no longer causes an ! 1012: assertion failure. ! 1013: ! 1014: On MIPSes, functions with 3 or more float arguments no longer cause an ! 1015: assertion failure. ! 1016: ! 1017: On Suns and V10 Vaxes, now detects overflow in float and double ! 1018: constants. It is supposed to do so on all targets, but some of them ! 1019: have sub-standard strtod's. ! 1020: ! 1021: On Suns, lcc now accepts the ld options -Bstatic and -Bdynamic. ! 1022: ! 1023: On SPARCs, fixes bad code when passing structures followed by ! 1024: floats/doubles. ! 1025: ! 1026: On SPARCs, -p and -pg now work. ! 1027: ! 1028: On V10 VAXes, formals may now get assigned to registers. An error ! 1029: introduced several months ago had been forcing them into the stack. ! 1030: ! 1031: 12/6/90: ! 1032: ! 1033: The compiler crashed after diagnosing some syntax errors involving ! 1034: top-level functions (eg, "void *a();static b(int)c(){}"). ! 1035: ! 1036: With -b, the execution count for e2 in "for(e1;e2;e3)S" was wrong for ! 1037: loops not guaranteed to execute at least once. ! 1038: ! 1039: On the MIPS, the compiler crashed when frequently referenced locals ! 1040: were used in deeply nested loops. The reference count estimate ! 1041: overflowed. ! 1042: ! 1043: On the SPARC, fixes (again!) bad code when passing structures followed ! 1044: by floats/doubles. ! 1045: ! 1046: On the SPARC, adds missing prototype to infinity() in math.h. ! 1047: ! 1048: 12/13/90: ! 1049: ! 1050: Since 10/26/90, -N has arranged loader diagnostics for duplicate global ! 1051: definitions in separately compiled modules. The arrangement, however, ! 1052: placed uninitialized globals in the data segment, which made some .o ! 1053: files huge. Such globals have now been shifted back to the bss ! 1054: segment, saving space without losing the loader diagnostics. On the ! 1055: MIPS, discard old .o files created with -N; they might be compatable ! 1056: with new ones, but only an ld expert could guarantee it. ! 1057: ! 1058: [Without -N, uninitialized globals are emitted as "common" blocks, so ! 1059: loaders -- contrary to ANSI -- may silently merge duplicate ! 1060: definitions. -N is overloaded: it also forbids extensions and searches ! 1061: for includes in only directories given by -I options.] ! 1062: ! 1063: lcc crashed when unknown enum types were used in contexts that required ! 1064: their sizes. ! 1065: ! 1066: lcc crashed or died with an assertion failure when parameter names were ! 1067: missing from new-style function definitions (eg, f(int){}). ! 1068: ! 1069: bprint crashed when prof.out had data for functions with >200 execution ! 1070: point counters. ! 1071: ! 1072: 12/21/90: ! 1073: ! 1074: lcc issued an erroneous ``lvalue required'' diagnostic for x[0]=f() ! 1075: when f returns a struct. ! 1076: ! 1077: 1/24/91: ! 1078: ! 1079: now reports as errors identifiers longer than 64 characters when they ! 1080: may cause parsing errors (because they span input buffers). ! 1081: ! 1082: erroneously forbid initialized local const arrays: ! 1083: f(){const char msg[]="hi";} ! 1084: ! 1085: erroneously warned about missing return values for: ! 1086: const void f(){} ! 1087: volatile void f(){} ! 1088: ! 1089: erroneously permitted function definitions with invalid uses of void ! 1090: arguments, some of which caused the compiler to crash: ! 1091: f(void,...){} ! 1092: g(void, int){} ! 1093: h(void, void){} ! 1094: ! 1095: aborted with an assertion failure on casts of a return value to void: ! 1096: void f(){return(void)23;} ! 1097: ! 1098: crashed when printing warnings about unreferenced const volatile statics. ! 1099: ! 1100: [I can't reach the Sun-3's or quetzal now. I'll update these machines ! 1101: later.] ! 1102: ! 1103: 2/14/91: ! 1104: ! 1105: Misidentified characters with ASCII codes greater than 127. ! 1106: ! 1107: switch(x) where x is a struct or union caused an assertion failure. ! 1108: ! 1109: On the vax, silently generated bad code for ! 1110: *<expr with ++ or --> = <expr with unsigned div/mod> ! 1111: (This was fixed last time, but I forgot to announce it.) ! 1112: ! 1113: On the vax, does a better job of using two-operand instructions (eg, ! 1114: addl2) and deleting gratuitous tst instructions. ! 1115: ! 1116: The warnings have been regularized somewhat. Use "-A -A" to flag ! 1117: missing prototypes and as many undefined behaviors as possible; use ! 1118: "-A" to flag little more than missing prototypes; use no -A options for ! 1119: relative quiet. ! 1120: ! 1121: with -A, warns about: ! 1122: missing prototypes in function types ! 1123: missing return value in a return from an int function ! 1124: *assignments between pointers to ints and pointers to enumerations ! 1125: *conversions from pointers to smaller integral types ! 1126: ! 1127: a second -A also warns about: ! 1128: non-ANSI language extensions ! 1129: non-ANSI source characters in character and string literals ! 1130: *unrecognized control lines ! 1131: *unreferenced variables and static functions ! 1132: *more than 32kb in an array, struct, or union ! 1133: more than 509 characters in a string literal ! 1134: more than 127 case labels in a switch statement ! 1135: more than 31 formal parameters ! 1136: more than 15 levels of nested statements ! 1137: more than 127 identifiers declared in a block ! 1138: more than 511 external identifiers ! 1139: more than 127 fields in a struct or union ! 1140: more than 127 enumeration constants in an enumeration ! 1141: ! 1142: * marks those warnings that were given *without* -A previously. ! 1143: ! 1144: Formerly, -N cleared the #include search list, disabled language ! 1145: extensions, and arranged for duplicate global definitions in separately ! 1146: compiled files to cause loader errors. It now fools only with ! 1147: #includes; -A -A handles the others. ! 1148: ! 1149: [I can't reach the Sun-4's now. I'll update them later.] ! 1150: ! 1151: 5/4/91: ! 1152: ! 1153: -A -A now warns about using function designators in conditionals ! 1154: (eg, f(){int g();if(g);}) ! 1155: ! 1156: Null characters in string and character literals are now accepted. ! 1157: ! 1158: Returning the address of a parameter or a local is now an error. ! 1159: ! 1160: The compiler proper no longer ignores \<newline> in string and ! 1161: character literals; `line splicing' must be done by preprocessors. ! 1162: ! 1163: Erroneously complained about some valid uses of function types, ! 1164: (eg, int f(int (int));) ! 1165: ! 1166: Using -b to append data to a prof.out compressed by bprint -c corrupted ! 1167: the execution counts. ! 1168: ! 1169: Erroneously complained about a typedef name used as a label at the ! 1170: first token in a compound statement (eg, typedef int T; f(){T:;}) ! 1171: ! 1172: Erroneously permitted array fields of structs returned by functions to ! 1173: be passed as arguments (eg, struct foo {char s[63];} g(); f(g().s);) ! 1174: ! 1175: Subsequent definition of unknown enums caused an assertion failure, ! 1176: (eg, enum foo x; enum foo {a,b,c};) ! 1177: ! 1178: Failed to diagnose empty extern/static declarations of enums or ! 1179: structs (eg, extern enum foo {a};) ! 1180: ! 1181: Failed to ignore leading white space that spanned input buffers. ! 1182: ! 1183: Failed to promote case labels to the promoted type of the switch ! 1184: expression (eg, case (char)16.2:). ! 1185: ! 1186: In structs/unions without named bit fields, padding specified by ! 1187: unnamed bit fields was erroneously omitted in initializations. (eg, ! 1188: struct { char a; int:0; char b; } x = {'a','b'} misinitialized x.b.) ! 1189: ! 1190: Erroneously complained about extern declarations of sizeless arrays ! 1191: with block scope that referred to statics with file scope (eg, static ! 1192: int a[3]; f() { extern int a[]; ...}) ! 1193: ! 1194: On the MIPS, better code for conversions from char/short to unsigned. ! 1195: ! 1196: On the MIPS, failed to detect overflow in (1<<31)[*/](-1) and crashed. ! 1197: ! 1198: On the SPARC, taking the address of an argument in leaf functions ! 1199: caused junk to be stored in the actual argument, eg, f(x){int *p = &x;} ! 1200: ! 1201: On the SPARC, stdlib.h erroneously defined toupper() and tolower() as ! 1202: macros; they're library functions. ! 1203: ! 1204: On the SPARC, RAND_MAX in stdlib.h was erroneously defined as 32767; it ! 1205: should be 2^31-1. ! 1206: ! 1207: On Suns, -target sun[34] is now recognized (and ignored). ! 1208: ! 1209: 8/2/91: ! 1210: ! 1211: Now permits -o to name the output file for -c and -S when ! 1212: invoked with exactly one source file. ! 1213: ! 1214: -t now prints char*'s as a address in hex and as a string. ! 1215: ! 1216: Constants cast to const/volatile were not treated as constant operands ! 1217: (eg, (const int)23 + 80 was not accepted as a constant expression). ! 1218: ! 1219: Some generated labels were not of the form Ln, which clogged symbol ! 1220: tables and confused profilers on some targets. ! 1221: ! 1222: The declaration `struct S;' failed to introduce a new type when a ! 1223: struct S was defined in an enclosing scope. ! 1224: ! 1225: When built with a compiler where `char' is unsigned, lcc failed to ! 1226: sign-extend `signed char' in constant expressions (eg, (signed char)-4 ! 1227: became 252 instead of -4.) ! 1228: ! 1229: In structs/unions with bit fields, intra-word padding specified by ! 1230: unnamed bit fields was erroneously omitted in initializations (eg, ! 1231: struct {int :8;int a:3;}x={1} initialized x.a to 0 instead of 1). ! 1232: ! 1233: Crashed when case labels were given outside of switches. ! 1234: ! 1235: Sometimes computed incorrect values for relationals over two floating ! 1236: point constants. ! 1237: ! 1238: Erroneously permitted old-style parameter lists in function ! 1239: delarators. Some caused the compiler to crash, eg, ! 1240: int(*f)(a);g(){(*f)(0);} ! 1241: ! 1242: On the 68020, SPARC and VAX, -g emitted bad symbol table data for ! 1243: typedefs of const/volatile types. ! 1244: ! 1245: On the 68020, lcc suffered an assertion failure occasionally when it ! 1246: ran out of floating point registers. ! 1247: ! 1248: On the MIPS, now places constants in the read-only data segment instead ! 1249: of the text segment. ! 1250: ! 1251: On the SPARC, now recognizes as leaves functions that return floats or ! 1252: doubles but use no other floating-point registers, eg, float f(float ! 1253: x){return x;} ! 1254: ! 1255: On the SPARC, emitted bad code for leaf functions that took the address ! 1256: of a float/double argument. ! 1257: ! 1258: 8/13/91: ! 1259: ! 1260: Generated bad code for expressions with multiple references to fields ! 1261: of structs returned by functions (eg, f().a + g().b). ! 1262: ! 1263: Erroneously diagnosed as errors valid function definitions in which ! 1264: old-style parameters appeared in a declarator nested in parens (eg, int ! 1265: (*f(a,b))() int a,b; {}). ! 1266: ! 1267: 9/30/91: ! 1268: ! 1269: "struct S;" is now never an error, even if repeated. ! 1270: ! 1271: Fixed assertion failure when a comparison was used as a value in an ! 1272: expression that had a type error, like char*f(){int x;x=(x==1|f());} ! 1273: ! 1274: -b profiled "while (e) S" wrong when e is constant and under -g. ! 1275: ! 1276: -P failed to include "const" and "volatile" in its output declarations. ! 1277: ! 1278: On the 68020, the driver now supplies -Dmc68000O in addition to ! 1279: -Dmc68000. ! 1280: ! 1281: On the MIPS, -Wf-Gn specifies the maximum size for data placed in the ! 1282: "short data" segment ala cc(1); the default is 8, and 0 causes all data ! 1283: to be placed in the "data" segment. -Wa-Gn and -Wl-Gn pass similar ! 1284: flags to the assembler and linker, resp. ! 1285: ! 1286: On the SPARC, structures are now passed using Sun's conventions. ! 1287: Discard old .o files. ! 1288: ! 1289: If bprint sees that it's about to print a count INSIDE a number or ! 1290: identifier, it moves the count to just BEFORE the token. This ! 1291: heuristic applies only when macros or comments have confused bprint ! 1292: about the source code. (Thanks to Doug.) ! 1293: ! 1294: 10/7/91: ! 1295: ! 1296: On the SPARC, generated bad code for functions that are declared to ! 1297: return a struct but then fail to, like struct node f(){}. ! 1298: ! 1299: -P failed to include "const" and "volatile" in its output declarations. ! 1300: ! 1301: 1/4/92: ! 1302: ! 1303: lcc formerly stopped compiling after 20 errors; -Wf-e<n> now sets the ! 1304: error limit to <n>. ! 1305: ! 1306: The driver now checks for non-existent or unreadable .c or .i files and ! 1307: does not try to compile them. ! 1308: ! 1309: Crashed when an unknown typedef declared parameters in old-style ! 1310: function definitions, like "f(x) T x; {...}". ! 1311: ! 1312: Crashed when both -b and -n were specified. ! 1313: ! 1314: Failed to fold case labels that exceeded the limits of the type of the ! 1315: associated switch expression, like "int i; switch (i) {case0xeb010000:;}". ! 1316: This yielded bad duplicate case label diagnostics or incorrect code. ! 1317: ! 1318: Failed to recognize unsigned comparisons with zero as constant expressions. ! 1319: For example, "int i=5U>=0;" is now accepted. ! 1320: ! 1321: Failed to diagnose structure initializations with excess initializers, ! 1322: like "struct { int a,b; } x = { 1,2,3 };". ! 1323: ! 1324: Failed to count as references occurrences of identifiers in asm, so ! 1325: locals with no other references were erroneously deleted. ! 1326: ! 1327: Failed to make each parameter visible at the end of its declarator, ! 1328: which led to erroneous diagnostics for valid prototypes. For example, ! 1329: "f(int a, int b[sizeof a])" is now accepted. ! 1330: ! 1331: errno.h defined more error codes than are specified by the standard; it ! 1332: now defines only EDOM and ERANGE. ! 1333: ! 1334: assert.h, errno.h, locale.h, stdio.h, stdlib.h, string.h, and time.h ! 1335: included other headers and thus defined symbols beyond those permitted ! 1336: by the standard. They now define only the specified symbols, except for ! 1337: assert.h, which defines write, sprintf, and abort on some targets. ! 1338: ! 1339: On the MIPS and SPARC, better code for structure assignment and ! 1340: structure arguments. ! 1341: ! 1342: On the SPARC with -g, gdb and dbx printed incorrect values for parameters ! 1343: that were changed because of extraneous symbol table entries. ! 1344: ! 1345: On the MIPS with -g, gdb and dbx mislocated some source files when ! 1346: #include directions contained function and variable definitions. ! 1347: ! 1348: 2/11/92: ! 1349: ! 1350: Erroneously identified T* as the offending type when sizeof(T) is ! 1351: unknown or 0 (eg, "void *a,*b;a-b;"). Now correctly fingers T ! 1352: instead. ! 1353: ! 1354: Erroneously allowed arithmetic on `void *const' pointers (eg, ! 1355: "void *const p; int i; p+i;"). ! 1356: ! 1357: Crashed when comparing prototypes with an argument that is a pointer to ! 1358: a function with a prototype, like ! 1359: int (*g)(char *,...); void f(int (*)(char *,...)) {} ... f(g); ! 1360: ! 1361: On Suns and BSD VAXes, ctype.h defined static functions _tolower and ! 1362: _toupper, which prompted `unreferenced' warnings if they weren't used. ! 1363: ! 1364: 4/13/92: ! 1365: ! 1366: Crashed when comparing prototypes that differ in only top-level ! 1367: qualifiers (eg, int f(int); int f(const int);) ! 1368: ! 1369: The driver no longer ignores extra characters after flags. As always, ! 1370: unrecognized flags are sent to the linker; eg, -cg was formerly treated ! 1371: like -c, but it's now sent to ld, which will complain. ! 1372: ! 1373: Now recognizes the identity u/1U == u for unsigned u. ! 1374: ! 1375: -A -A now correctly complains about switch statements with more than ! 1376: 257 cases instead of 127. ! 1377: ! 1378: On the SPARC, generated incorrect code for calls with a floating-point ! 1379: argument followed anywhere by an argument involving an integer or ! 1380: unsigned division, multiplication, or modulus (eg, int i,j; f() { ! 1381: f(1.0,i/j); }) ! 1382: ! 1383: On the SPARC, generated invalid assembly code for assignments of ! 1384: structures over 4095 bytes. ! 1385: ! 1386: 12/16/92: ! 1387: ! 1388: changes/improvements: ! 1389: with -d0, warns about switch statements with huge jump tables, eg, ! 1390: switch (i) { case INT_MAX: ...; case INT_MIN: ... } ! 1391: ! 1392: now accepts identifiers up to 4096 characters long, although the ANSI ! 1393: standard requires that only the first 31 be examined. ! 1394: ! 1395: returning a pointer to a local variable now elicits a warning ! 1396: instead of an error. ! 1397: ! 1398: now warns about eliding references to incomplete types, eg, ! 1399: void *x; *x; ! 1400: ! 1401: with -A -A, now warns when declaring arrays incomplete types, ! 1402: eg, extern struct s x[]; ! 1403: ! 1404: offsetof is less machine-specific but equivalent to the old one. ! 1405: ! 1406: On the MIPS, uses fewer of the assembler's pseudo-ops. The assembly ! 1407: code looks longer, but it should generate about the same machine code. ! 1408: ! 1409: On the MIPS, a few stack frames may be larger, to enforce stricter ! 1410: alignment for the R4000. ! 1411: ! 1412: errors fixed: ! 1413: with -n, failed to recognize expressions that dereferenced constant ! 1414: pointers as valid constant expressions, eg, ! 1415: struct foo { int a, b; }; ! 1416: unsigned off = (char *)&((struct foo *)0)->b - (char *)0; ! 1417: ! 1418: generated bad code for some inputs for which the compiler needed ! 1419: numerous temporaries. ! 1420: ! 1421: failed to accept function definitions with multiple top-level ! 1422: prototypes, eg, int (*g(int c))(char) { c = 0; } ! 1423: ! 1424: failed to warn about overflow in enumeration values, eg, ! 1425: enum { X = ~0U }; ! 1426: ! 1427: ignored trailing characters of long file names in some "#" lines, which ! 1428: caused erroneous diagnostics. now accepts names upto 512 characters, and ! 1429: warns about longer ones. ! 1430: ! 1431: erroneously made enumerations visible before their optional values, eg, ! 1432: enum{A=2}; f() { enum {A=A} i = A; } assigned 0 to i instead of 2. ! 1433: ! 1434: exited with a code of 0 instead of 1 when there was exactly one ! 1435: "found X expecting Y" diagnostic. ! 1436: ! 1437: failed to detect overflow in hex character constants, eg, '\x100000000'. ! 1438: ! 1439: failed to accept assignment of 0U to pointers. ! 1440: ! 1441: failed to associate tags defined in a parameter list with defining ! 1442: declarations inside a function, eg, ! 1443: f(struct S *s) { struct S { int a; }; s->a = 1; } ! 1444: ! 1445: failed to reject function definitions with storage class typedef. ! 1446: ! 1447: failed to accept a trailing `,' in initializers for scalars ! 1448: and unions, eg, int x = {1,}; ! 1449: ! 1450: erroneously defined wchar_t as `char' instead of `unsigned char'; ! 1451: L'\xff' must have the integer value 0xff. ! 1452: ! 1453: failed to reject type `array of void'. ! 1454: ! 1455: failed to reject comparing a pointer to an object type ! 1456: with a pointer to an incomplete type, eg, ! 1457: extern int (*a)[],(*b)[10]; ...; if (a == b) ... ! 1458: ! 1459: failed to warn about comparing a function pointer with a void*, ! 1460: eg, int (*fp)(); ... if (fp == (void *)0) ... ! 1461: ! 1462: failed to reject (..., 0) as a null pointer constant. ! 1463: ! 1464: failed to accept redeclaration of functions with differently ! 1465: qualified parameters, eg, f(int); f(const int); ! 1466: ! 1467: on the SPARC, under -b, exit() failed to close all open files. ! 1468: ! 1469: on the MIPS, generated bad code for calls to variadic functions ! 1470: with a leading floating point arg (eg, f(double x,...)) when ! 1471: the 2nd actual argument was a float or a double. ! 1472: ! 1473: 12/17/92: ! 1474: ! 1475: fix bug introduced yesterday into stddef.h's offsetof macro. ! 1476: ! 1477: 12/18/92: ! 1478: ! 1479: On the MIPS, fixes code generated since 12/16 that crashes most ! 1480: procedures with >32kb of locals. ! 1481: ! 1482: 2/18/93: ! 1483: ! 1484: On the MIPS, silently generated incorrect code for some programs that ! 1485: mix (single-precision) float register variables with int conditional ! 1486: exprs or int register variables with float conditional exprs. ! 1487: ! 1488: next: ! 1489: ! 1490: all enums are now ints; old .o files that use enums are incompatible ! 1491: with new ones. ! 1492: ! 1493: asm("...") is gone. ! 1494: ! 1495: Erroneously treated the constant -0.0 as 0.0, which IEEE forbids. ! 1496: ! 1497: Erroneously diagnosed tentative unsized array definitions, eg, ! 1498: a lone "int x[]" is treated as "int x[]={0}"
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.