diff options
Diffstat (limited to 'bcc/bcc.bugs')
-rw-r--r-- | bcc/bcc.bugs | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/bcc/bcc.bugs b/bcc/bcc.bugs new file mode 100644 index 0000000..52f6958 --- /dev/null +++ b/bcc/bcc.bugs @@ -0,0 +1,169 @@ +compiler limitations +-------------------- + +These are not implemented: + +a. bit fields + kludgily implemented (everything padded to char, int or long; can store + values wider than the specified field width) + +g. signed char type, other ANSI extensions + +compiler bugs +------------- + +6. weird but doable casts are not always done for initializers + +15. calls to a (casted) absolute address produce an immediate prefix. as386 + doesn't mind this but complains about the absolute address. as09 complains + about the prefix but can handle the absolute address + +23. char *f(); &f() is accepted as f() but produces botched nodetype + (calc char **). + +31. null byte in string initialiser should be ignored if it doesn't fit + Non-null bytes which don't fit should be ignored with a warning + +32. static char c = "xyz"; is allowed, and bad FCB is generated + +37. init of union will store multiple comma-separated entries + +38. arrays sizes larger than the amount of memory are accepted + +40. structure and union definitions are confused with each other. So + struct foo may be used in a declaration like "union foo bar;" + +42. pointer arithmetic is performed on pointers to undefined structures + (of unknown size). Size is taken as 0 although alignmask is set early + +59. preprocessor stuff (# lines or macro names) between the identifier for + a label and the colon for the label messes up the label + +60. some things involving switches are now broken for 6809 due to lack of + frame pointer + +61. assembler may get lost on lines of length exactly (?) 256 + +65. expressions in emum lists or not properly checked for overflow. They + should fit in ints. The ordinal number is allowed to overflow + +66. sizeof has type int instead of size_t + +68. "return expr;" in a function returning a void is reported as a compiler + bug not as a semantic error + +69. an argument declared as float is (correctly) promoted to double, but + not demoted to float when it is used + +71. identifiers longer than 64 are botched (scanning of the identifier is + stopped but the remaining characters in the identifier are left to + mess up the input stream + +72. check for too many macro parameters is not working + +74. union { char a, b; } foo; gives the wrong offset for b. Unions work OK + if the declaration lists have length 1 + +75. stack gets cleaned up too early in bee = foo ? bar : baz() where baz() + returns a struct although there is kludge to make plain bee = baz() work + +76. have reintroduced reduced-type bugs, so sizeof(1 ? 1 : 2) is 1 + +78. fix to require comma in arg list may be half-baked + +79. compiler starts trying to load the void expression (i ? (void)0 : (void)0) + +80. (unsigned char *) - (char *) causes error and message is obscure + +81. 'defined' is a reserved word + +82. conditionals with voids don't work + +83. float = 1e100 gets overflow exception + +84. #endif seems to be seen in +#if 1 +foo #endif bar + +85. line numbers from cpp are not quite right. + +bugs that may be fixed +---------------------- + +41. typedef's are not scoped properly + +nonstandard things that are not done quite right +------------------------------------------------ + +3. arguments declared as register are not being dumped by #asm, register + vars anyway not being passed to #asm + +26. should clear label ptrs when starting #asm + +things that have to be be done better +------------------------------------- + +11. push order reversed in genloads.c (temp) - might try to get DP order right + +12. need to clean up handling of sc specs (maybe rename flags to sc) + And local statics and externs + +24. gvarsc is not returned properly for struct/union since the members + affect gvarsc (incorrectly). There should be a flag set when + inside a struct/union definition to disable sc specs. This could + replace the tests in abdeclarator and declselt + Best may be to carry the sc along with the type a bit more (in a + global symbol structure). Also, the symbol should record sc in a better + way than now + +25. need to check stack sometimes. Xenix cc does it when allocating >= 100 + bytes locals and this is essential in Xenix as the stack is grown + dynamically + +68. overflow checking for constants + +things that could be done better +-------------------------------- + +4. install new 6809 code for branch patching (after redundancy checks) + +5. can improve code for compare with global adr in non-posindependent case + +6. char *s; long *pl; + code for *s += *pl is poor, for *s += (int) *pl is good + +7. most mov's from to ax would be faster and smaller done by xchg's + +7a. check ptr add/sub operations earlier + +8. tests for against 1 and -1 can sometimes be done with dec's and inc's + +9. __opreg is used unnec when the ptr is already in it + +9a. double indirect ptrs should maybe be made direct rather than singly + indirect by makelessindirect + +10. in cmpsmallconst(), the comparison constant should be incorporated in + the offset if the indcount is 0 and lea() called. It is harmless to + use the lea() trick for non-small constants + +20. when saved registers are popped in assign() they may overwrite the + expression value, anywhere else? May be fixed now + +27. better if loadexpression returned the register used + +28. better if source.c did not #include storage.h - it only references + DEFINITION, in some blank-skipping code which could be moved to + scan.c or preproc.c. preproc.c, scan.c and type.c also #include + storage.h, just to get at the DEFINITION and KEYWORD definitions + +29. need nodetype() to know about all optimisations in advance, including + int % small power of 2 (including 0, 1). Need to delete all type + assignments in final code gen, specially the one that convert short + to int + +30. overflow checking at runtime + +31. Use more than the first char from multiple character constants + +56. --i++ is not detected as an error in the parser |