.he "C68 Parser"Change Log"Page %" .de bg .sp .in +5 .. .de eg .sp .ne 8 .in -5 .. 1. 4/12/82 - Undefined symbols not being detected .bg This was caused by expr setting the defined flag for the symbol and then setting its type to label. Solution was to check for undefined symbol in expr and output error message there, since the only place an undefined symbol can occur in a statement is after a goto. This results in all undefined symbols in statements having one error message output on the line the symbol is used, and all undefined labels error messages being output once at the end of the function. .eg 2. 4/12/82 - Operand stack underflow problem .bg Error recovery not very effective, skipped over closing right bracket, which cascaded errors. Changed synerr to put back the syncronizing token, no matter which it was. Also changed stmt to not call expr when the first token on the line was right bracket. This resulted in "operand stack underflow" errors when a label immediately preceded a right bracket, e.g. at the end of a function or at the end of a switch statement. Also added logic in expr and popopd so that the "invalid expression" error would be output rather than "operand stack underflow". .eg 3. 4/13/82 - Error message cleanup .bg Changed "expression too complex" messages and "invalid structure proto" message. .eg 4. 4/13/82 - Missing =% operator .bg Lex did not check for =% operator, added it. .eg 5. 4/16/82 - Bad function declarations .bg The functions lookup, tnalloc and sbrk were not declared as returning pointers. .eg 6. 4/19/82 - Added static declarations .bg Declaring functions and external variables as static did not work. Added fixes to gettype, doextdef, dodecl and expr to correctly handle static variable and function declartions. .eg 7. 4/23/82 - Typedef stuff again.... .bg Adding declarator info to typedef declaration in cast did not work correctly. This required adding typedef info carefully into the type info already obtained from gettype. The routine addtdtype was added to do all this jazz correctly. Also, declarator was changed so that it would return the super-type info in the correct (rather than reverse) order. Both expr and dodecl were changed to reflect the the addtdtype routine. Also, it turned out that expr was being recursively called the declarator (via cexpr). This required the careful setting of the pointers (opp, opdp, exprp, opap) to the expression stacks and workspace. This resulted in changes to doreturn and to copyargs, which require the expression area be set up. .eg 8. 4/26/82 - structure pointer initialization .bg A pointer to a structure could not be initialized, problem in initlist checking only for a structure being an aggregate type. added (btype(type)==STRUCT) && notpointer(type) into aggregate type test. .eg 9. 4/26/82 - memory fault after invalid conversion error .bg cvopgen was not setting rtp pointer if invalid conversion, resulting in invalid address in tree. Changed cvopgen so it would return tp upon invalid conversion problem. .eg 10. 5/4/82 - external definition syntax loop .bg The error "external definition syntax" would not necessarily skip the offending token. Changed next(RCURBR) to gettok()!=RCURBR to insure token was skipped. .eg 11. 5/4/82 - Char pointer array string init error .bg The syntax: char *x[] {"xx"}; would not work because the type given to oneinit was ARRAY of CHAR. Added code in initlist to give oneinit the "basic" type of the data structure. Also added routine revsp. This routine doesn't fix anything, but it's probably clearer what's going on... .eg 12. 5/4/82 - Declarator syntax problem .bg The syntax: int (*x)(); would not work because the check for a valid declarator in getdecl was to check sp, a local register, rather than dsp, the declarator symbol pointer. The parenthesis caused a recursive call, and the local sp was set in the recursive instance, rather than the one that did the check. .eg 13. 5/5/82 - Missing } error for non-aggregate inits .bg Got "missing }" for: char *p {"xx"}; had mistakenly changed next(RCURBR)==0 to next(RCURBR) in initlist when fixing bug 10. .eg 14. 5/10/82 - Braces around string init for char array .bg Got "invalid initializer" for: char x[] {"xx"}; was not checking for this case in initlist. Added code in initlist to check for this. .eg 15. 5/12/82 - Integer initialization in long or pointer data type .bg The case: char *x[] { 0 }; only resulted in an integer initialization. Fixed oneinit to extend int to long and output as long constant. .eg 16. 5/20/82 - Long -1 initialization .bg The syntax: long x -1; initialized x to 1, added check in cexpr to add check after '-' for CINT as well as CLONG. .eg 17. 5/27/82 - sizeof structure prototype .bg The syntax: sizeof( struct x ) where x is a structure prototype name was not working (although this is not part of OFFICIAL C syntax anyway). Added code in expr to do right thing with type STRUCT. Also saw and fixed some STRPROTO bugs in gettype and dodecl. .eg 18. 6/1/82 - int to pointer conversion not getting error .bg Test in maketree for integer to pointer conversion was not correct. Changed test in maketree to flag any INT or UNSN assignment conversion if the right hand side was not an constant. .eg 19. 6/2/82 - int to pointer conversion again .bg Test in maketree fixing bug 18 was not quite correct, did not allow *p =+ i; added check in maketree for only assignment operator. .eg 20. 6/2/82 - line numbers on error messages .bg Line numbers on error messages sometimes off by one. This is because expr or stmt can gobble up one or two tokens, thereby incrementing the line number. .eg 21. 6/17/82 - unsigned initialization .bg Couldn't do: unsigned x = 1; There were no entries in oneinit for a base type of UNSIGNED... .eg 22. 11/23/82 - nonunique structure names .bg Added the system III capability to handle structures which have elements which have the same name, but different types and/or structure offsets. .eg 23. 12/06/82 - forward referenced structures .bg Forward referenced structures are now allowed, checking to be sure that they are defined is left until end of file is reached. .eg 24. 12/13/82 - structure assignments [vlh] 4.0 .bg One structure may be assigned to another provided that the one on the right is smaller than or equal to the left one in size. .eg 25. 12/16/82 - Don't generate .globl's for external func's [vlh] 4.0 .bg Don't automatically generate .globl's for external functions, avoids automatically loading routines which may never be used (like stdio). .eg 26. 1/5/83 - sizeof as array size specification [vlh] 4.0 .bg Recursive call to 'getdecl' caused the size specified using sizeof to be lost. .eg 27. 1/12/83 - procedure/function name as identifier [vlh] 4.0 .bg Generated "tst.l #_ident" for "if (ident) ;" where ident is a procedure or function name. Changed this to generate as true instead. .eg 28. 1/25/83 - outgoto macro [vlh] 4.0 .bg Made the outgoto procedure a macro, requires it's single parameter to be a constant. .eg 29. 2/8/83 - typedef of forward referenced structures [vlh] 4.0 .bg The dimension table pointer of a typedefed forward referenced structure was being initialized incorrectly. .eg 30. 2/12/83 - Pointer to structure comparisons to integers [vlh] 4.0 .bg Previously the integer value was being multiplied by the size of the structure in words. .eg 31. 2/19/83 - Pointers assigned to structure array element [vlh] 4.1 .bg struct {char d[10];} *p; char *q; q = &p->d; .eg 32. 2/28/83 - For loop construction [vlh] 4.1 .bg Altered the code that is generated so that only one branch is inside the for loop. Better code is now generated. .eg 33. 3/1/83 - While loop construction [vlh] 4.1 .bg Altered the code that is generated so that only one branch is inside the while loop. Better code is now generated. .eg 34. 3/1/83 - Char and char * casting [vlh] 4.1 .bg Added the docast unary operator to fix the char cast problem in the parser, changed the char * cast to do a int to long conv in the case of a char *. .eg 35. 3/7/83 - Unsigned/int global initialization [vlh] 4.1 .bg Initialization of integer to -32768 generated an error, as did unsigned initializations > 32767. .eg 36. 3/29/83 - string defines [vlh] 4.1 .bg Initialization's of strings has been broken up into dc.b's of no greater than 32 bytes at a time. This is to avoid building one which is too long for the assembler and the editor. .eg 37. 4/21/83 - structure alignment [vlh] 4.1 .bg Fixed the structure alignment call to salign which caused character pointers to not be aligned properly. .eg 38. 4/22/83 - structure fields with same names [vlh] 4.1 .bg Structure fields with the same names were only being inserted into the symbol table once. Required a test to ensure that all declarations of fields are inserted and just statement handling is allowed to short circuit it. .eg 39. 5/2/83 - added '\f' recognization [vlh] 4.1 .bg Added recognizing and proper treatment of the form feed escaped character '\f'. .eg 40. 5/10/83 - multi-dimensional arrays [vlh] 4.1 .bg The indices into multi-dimensional arrays were being computed incorrectly. The arrayref routine was setting the proper dimension table pointer, and then resetting it to it's parent's value. .eg 41. 5/11/83 - int to long constant conversion [vlh] 4.1 .bg Constants were not being converted until the code generation pass. For this reason certain constants were not being calculated correctly. The long constant 0x8000 was left as an integer constant value of -32768 and passed to the code generator. The codegenerator does not know what the original value was. Constant conversions from integers to longs needed to be done in the parser. .eg 42. 6/6/83 - return with null expression [vlh] 4.1 .bg A return call which included parenthesis but a null expression caused the parser to generate an error and bus error. There was no test of expr's return value in case of an error in which the expression tree would be non-existent. Need to check for parens without expression. .eg 43. 6/8/83 - sizeof array as a structure field [vlh] 4.1 .bg The sizeof all types of values was being treated as a single node. If the item in question was an array element ensconsed in a structure the value was always determined to be the size of a pointer. This required the addition of a new subroutine which in the case of an array inside a structure traversed the tree and took into account the two nodes nearest to the tips of the tree. .eg 44. 6/13/83 - added block declarations [vlh] 4.2 .bg Reworked original link and movem to be done at the bottom of the routine at which time the number of variables register and stack will be known. This requires an extra branch at the top and bottom of each function. .eg 45. 6/14/83 - added auto initilization [vlh] 4.2 .bg Added the recognizing of the equal sign as a local variable initialization. Faked out expression by handling the symbol internally. Turned on commastop to ensure only one variable is parsed at a time. .eg 46. 6/15/83 - local/global same name [vlh] 4.2 .bg Added the facility to the parser to allow for local/global/block/nested block variables with the same name. This required the addition of a scope level to the symbol table node. Global scope is 0. Function parameters and local variables are at level 1, etcetera. Each left curly brace signifies and additional nesting level. This requires freeing symbols at every right curly brace if there are any at that level. Added an array to keep track of what levels have variables declared so that the symbol table did not have to be searched for every curly brace. .eg 47. 6/21/83 - link file [vlh] 4.2 .bg Added the link file. Writes link information (link and movem instructions) into this file for remerging by the codegenerator. This was added in order to produce cleaner code with the addition of block variables and local initializations. .eg 48. 6/22/83 - structures [vlh] 4.2 .bg Rewrote all the code to deal with structures and their elements and how and where they are put into the symbol table. Necessitated the addition of two more symbol table pointers: a child link (pointer from structure to it's first element), and a sibling link (linking together all the elements in a structure). Every unnamed structure is now being added to the symbol table with a fake name. .eg 49. 6/27/83 - asm [vlh] 4.2 .bg Added the asm instruction to the parser in order to generate assembly language code directly into the C source. .eg 50. 6/28/83 - bit fields [vlh] 4.2 .bg Bit fields where not being aligned on a word boundary when necessary. Also the value of s_dp which was used to decided the bit offset of the field was not being reset if an int bit field followed a character bit field. .eg 51. 6/28/83 - structure initialization and alignment [vlh] 4.2 .bg Rewrote all code which deals with initializing structures. It now compares the sizes and types of the structure fields against the objects which are used to initialize the structures. It defines space for padding properly. Arrays inside of structures are now being initialized properly. They are truncated at the appropriate space if required, otherwise they are terminated by a null byte and padded to the appropriate size. If they are truncated then the parser generates a warning message. .eg 52. 7/7/83 - scope problem [vlh] 4.2 .bg Variables which were declared on more than one scoping level were not always being identified properly. In particular, if a variable is accessed on a nesting level different from it's declaration it would not always choose the right declaration. .eg 53. 7/13/83 - long vs. short vs. int [vlh] 4.2 .bg All references to int variables have been changed to shorts. This is for the sake of portability between regulus and the vax. .eg 54. 7/20/83 - bit field initialization [vlh] 4.2 .bg Added a routine called bfield_init which outputs the word or character once it is built. Added code to oneinit to build the bit fields as they were evaluated. .eg 55. 7/20/83 - symbolic debugger flag [vlh] 4.2 .bg Added recognizing of the '-g' flag. Output the label required before the link instruction. .eg 56. 7/25/83 - fixed structure assignments again [vlh] 4.2 .bg Move the structure assignment size test into the maketree routine. Make a right side structure larger than a left only a warning. Determine the size of the structures in the maketree routine before the original tree nodes are altered beyond comprehension. .eg 57. 7/25/83 - unsigned char/long [vlh] 4.2 .bg Initial changes required to allow unsigned char and unsigned long types. .eg 58. 7/29/83 - long constant conversion to int [vlh] 4.2 .bg Operations in which one operand is a long constant and the other is an integer will cause the long constant to be converted at all times. Caused an additional condition to be added to the conversion code in the maketree routine. .eg 59. 8/1/83 - frstruct pointer as struct element [vlh] 4.2 .bg A pointer to a forward referenced structure was being incorrectly linked into the structure declaration. Required several tests and some additional code in the get_s_or_u and get_type routines. .eg 60. 8/5/83 - function label test [vlh] 4.2 .bg Bad code was being generated for a statement of the form "if(func_name)". The immediate value of the function label was being tested. Fixed this by adding a test in funcref() to not generate addresses if the operand is a SYMBOL or NOT. .eg 61. 8/8/83 - constant expression evaluation [vlh] 4.2 .bg Added a test to tree() to avoid adding conversion ops to an expression which involves only long/short constants. This ensures that they will be evaluated by the parser in binopeval. .eg 62. 8/9/83 - source file to cgen [vlh] 4.2 .bg Altered the macro which outputs the line number to the intermediate file to also output the file name, for use in generating errors in the code generator pass. .eg 63. 8/10/83 - constant test for long [vlh] 4.2 .bg Changed the gettok() routines test of a constant as a long to check to see if any of the high bits (0xffff0000) are set in the value. As all numbers are positive at the time of this evaluation it is the most sure fire way to decide. .eg 64. 8/12/83 - array dimension using sizeof [vlh] 4.2 .bg Fixed a rather obscure parser bug which involved specifying the dimensions of an array of structures using the sizeof operator on a structure. Required a reset in the getdecl routine of dp if cdp had been changed because of a sizeof operation. .eg 65. 8/24/83 - 16 bit hex and octal constants [vlh] 4.2 .bg By definition of Kernighan and Ritchie all octal and hex constants which fit as unsigned values into an integer size are defined to be integers. .eg 66. 8/25/83 - 2 dimensional array initialization [vlh] 4.2 .bg Two dimensional arrays were not being initialized properly in 4.2... Requires multiple calls to str_init. .eg 67. 9/2/83 - labels and function names [vlh] 4.2 .bg Fixed the compiler to handle local-globals with local labels which have the same name as functions. Fixes in stmt.c to force a new symbol table entry for the label. .eg 68. 9/6/83 - floating point constant, w/o preceding digit [vlh] 4.2 .bg Added a gettok entry for PERIOD to check for a floating point constant which does not contain a leading digit and thus process it as such. .eg