LOG 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. From lcc 4.0 to 4.1:
  2. Changes:
  3. See doc/4.html for changes in the code-generation interface.
  4. Warns about constants that are too large, eg, short x = 70000;
  5. Warns about expressions that have no effect.
  6. Unsigned shorts are now used for wide-character constants, and
  7. wchar_t is a typedef for unsigned short.
  8. More assertions in gen.c to confirm that the register allocator is
  9. configured correctly; ie, that the various masks, wildcards,
  10. clobbers, and targets are internally consistent. Full checking
  11. appears impractical, but there's still more than than there was
  12. before.
  13. On the SPARC, lcc now emits .type and .size directives
  14. unconditionally.
  15. On the x86, constants are now emitted into the text segment.
  16. If the environment variable "LCCDIR" is defined, it gives the directory
  17. that contains the preprocessor, the compiler proper, and the
  18. lcc-specific libraries.
  19. Under Windows, lcc searches the directories named in the environment
  20. variable "include" for header files.
  21. Errors fixed:
  22. Erroneously complained about unknown sizes for some const fields, eg,
  23. typedef struct foo ref; struct foo { const ref *q; int a; };
  24. f(ref *p, int i) { return p->q[i].a; }
  25. -A -A erroneously complained about static main's that didn't conform
  26. to the ANSI-mandated "int main(void)" or "int main(int, char **)".
  27. Silently generated incorrect code for a structure copy with a
  28. post-incremented target, eg,
  29. struct { int x; } data = {1}, copy[2], *q = copy;
  30. main() { *q++ = data; }
  31. Generated incorrect values in some expressions with constant pointers.
  32. Silently truncated string literals longer than 4095 characters.
  33. Failed to emit debugging information for uninitialized globals.
  34. Failed to diagnose missing sizes in some multi-dimensioned array
  35. declarators, eg, extern int x[][10]; int x[5][];
  36. Silently emitted incorrect sizes and initalizations for some
  37. incomplete multi-dimensioned arrays involving pointers and whose size
  38. is determined by the number of initializers.
  39. Set only the x.name field for some back-end symbols (eg, wildcards),
  40. and the uninitialized name field crashed some debugging output.
  41. uses() failed to check the register *set* as well as the register
  42. mask. There's no known bug demo, but a wildcard set might be
  43. contrived that would need the test.
  44. Crashed with -b on some conditional expressions involving calls, eg,
  45. int p; void g(void) { p ? f() : 1; }
  46. On the MIPS, sometimes generated an incorrect frame size and thus a
  47. crash when floating-point registers were saved.
  48. On the SPARC, erroneously reused a register variable as a temporary
  49. when the variable is compiler-generated.
  50. On the SPARC with -b, emitted incorrect code for returning structs.
  51. On the x86, conversion from float to int rounded instead of truncated
  52. with the default floating-point mode.
  53. On the x86, eliminate rtargets for kids after the first (see p. 419).
  54. On the x86, substitute reg for freg, in order to use the common reg
  55. rules. Needed only for debugging output, since we're not using any
  56. float regs as regs at this time.
  57. On the x86, "double f(); main(){f();}" wasn't popping the FP register stack.
  58. On the x86, ECX was saved by the callee, when it should have been
  59. saved by the caller.
  60. $Id: LOG 145 2001-10-17 21:53:10Z timo $