Copyright (c) 1992-1994 SAS Institute, Inc, Cary, NC All Rights Reserved This document describes bug fixes and enhancements made in the 6.51 release of the SAS/C Development System for AmigaDOS. To install the 6.51 patch, you must have version 6.50 of the SAS/C Development system installed. If this update does not fix a problem that you have been having, please contact our Technical Support Division for help as soon as possible. All reproducible reported CXERRs, Enforcer hits, and cases of bad code are fixed with each release. If you get one of these, please contact technical support immediately. It will help if you have a compilable test case. See chapter 3 of the User's Guide, Volume I for information on how to contact technical support and what information to provide. In addition to the specific bugs listed, several code generation bugs were fixed in the optimizers and the code generator (sc2). Since the code generation bugs did not affect most people, and they are not easy to describe or reproduce, we will not describe them individually here. We suggest that you recompile all your code if it is behaving strangely. Please report all enforcer hits and CXERRs to technical support. Also note that not all executables and shared libraries have been modified. Those that have not been modified keep their old version number (6.50). This is normal. A list of modified files appears at the end of this document. ***************************** IMPORTANT *************************** 1. The layout of bitfields was inadvertently changed between 6.0 and 6.50, which meant that structures containing bitfields were incompatible between the two versions. Bitfields have been changed back to the 6.0 method, with the exception of bitfields of size :0. :0 bitfields exhibited a bug in 6.0-6.3 and added extra unusable bytes to the structure. 6.50 bitfields do not add these extra bytes. 1. The __stack external variable sets the minimum stack size for your program, as documented in the Library Reference Manual and elsewhere. However, if you use it, you must set __stack to an even multiple of 4 bytes or risk having your machine crash. 2. Many users have inquired about the Quick Reference Guide for 6.50. There is no new Quick Reference Guide in 6.50; the 6.0 guide is shipped to all new 6.50 customers, and customers who are upgrading should continue to use their old Quick Reference Guide. 3. Many users have asked about disk 6 in the installation process. Disk 6 is used only if you do the floppy installation; hard disk users do not need this disk. 4. The compiler now defines a preprocessor symbol __AMIGADATE__. This preprocessor symbol resolves to a datestamp string in the format required for the AmigaDOS VERSION command. The format is "(dd.mm.yy)", where dd is the day (1-31), mm is the month (1-12), and yy is the year. __AMIGADATE__ is available from both C and C++. 5. The macros for some functions defined in the C header files, are now not defined if compiling C++. They conflicted with the names of some member items of C++ classes in or . Problem functions are /index(), /min(), max(), /open(), read(), write(), close(), /abs(). Many of these have alternate names using preceding underscores that can be used instead. 6. The priority of the autoinit functions for utility.library and the various Commodore math libraries has been changed to 100 (from 250). This allows the autoinitializer for the SPROF profiler code to use utility.library if it is compiled with UTILLIB. The following describe problems and bugs that have been addressed in the 6.51 release. ============================= Library and Header Changes ============================= COMMON global variables were not set to zero as expected in all cases. Source code to the file _iob.c, needed for stdio initialization, was not shipped as planned. The function scdir() did not work when called twice in a row. #including from C++ gave an error because the C++ keyword "template" was used as a parameter name in a prototype. Various header files contained macro defines for abs, min, max, etc. that conflicted with class member names in C++. These macros are now no longer defined when compiling C++. C++ iostream library was not handling bytes with the value 0xff correctly. __autoopenfail was modified to catch an error situation, to simplify the code, and to have it set return codes correctly. ctime() was not calculating leap years correctly in all cases. __stdargs version of SetRexxVar() was not working. It always returned an error code of '9' (string too long). The __stack external variable did not work when programs linked with cback.o were run from WorkBench. UNIX-style error codes (errno codes) were cleaned up to be more accurate. The file generated warning 148 (incomplete struct tag) if compiled with the STRICT or WARN 148 options. #pragmas have been added to suppress this warning. Executable names longer than 7 characters trashed part of the __stdiov37 string and caused the console window that opens to handle stdio under workbench to close immediately, rather than waiting for the user to click the close gadget. __tzset() did not free allocated memory until the program exited. This caused problems for programs that run a long time and call __tzset() repeatedly. dfind/dnext incorrectly modified fib_FileName. The field was converted to all lower case. _main.c did not handle arguments containing a starting quote but no closing quote correctly. _main.c defined ESCAPE to be '\027' when it should have been '\033'. dfind()/dnext() did not work correctly on drives formatted with the directory-caching file system. This caused the "grep" utility to fail on these drives as well. _CXD33 routine called the Commodore unsigned divide routine rather than the SAS/C provided signed routine. repmem() did not work in programs compiled with PARM=R. UNIX compatible functions did not always return -1 on failure. While this is legal according to the UNIX documentation, which says any nonzero value is OK, many UNIX programs depend on -1 specifically. Changed functions were unlink(), rename(), remove(), system(), setvbuf(), putenv(). __fpinit() did not use an autoinitializer to initialize the math coprocessor, if present. __fpinit() did not check for the presence of a math coprocessor before issuing math coprocessor instructions. __stdargs signal handlers did not get parameters passed to them correctly. assert() macro now explicitly casts its argument to int. fgetc(), fcloseall(), fdopen(), fread(), and flushall() referred to stdio and therefore linked in the stdio autoinitializer when called. fseek() did not work if you did a seek to SEEK_END after reading or writing earlier in the file. scanf() did not always return the number of arguments parsed correctly. The builtin versions of strcmp() and memcmp() were doing signed comparisons instead of unsigned comparisons. The restriction on the number of arguments to the program has been removed. The formal parameter name, "template", in mkstemp() and mktemp() has been changed to "template_arg" because template is a C++ keyword. ===================== CPR Debugger Changes ===================== The "break trace" command did not work as documented if the breakpoint was encountered while single-stepping. CPR left a lock on the current directory upon exit when invoked from CLI. Enforcer hits were generated when using the 'View/Modules' menu item and some other commands in a file with no debugging information. CALL command sometimes did not work if >2 parameters were used. CPR crashed if OpenDevice was called from a program outside of CPR's control. (If you have been using the -nolib option to work around this problem, you can remove the option now.) CATCH command did not work on tasks created outside of CPR's control. Starting CPR from WorkBench and giving the program extra arguments could crash the machine upon exiting CPR. CPR's mixed mode window repeated some source lines in some programs. When displaying multidimensional array members of structures via a pointer and using array slices, CPR displayed the data incorrectly and generated Enforcer hits in some instances. CPR could not correctly disassemble the DIVSL.L opcode. Global variables from one module were not accessible in the watch window when in other modules under some circumstances. The range option on the watch command displayed one element too few. d (char)-1 (and some other casts) caused the message "***floating point exception" from CPR. ============================== Parsing and Diagnostic Changes ============================== The C++ translator produced files with a .o extension instead of a .p extension when PPONLY was used. The C++ translator failed to issue an error for using the 'new' operator on an abstract class type. Compiler warned about different prototypes whose only difference was the use of the "signed" keyword on int, short, or long variables. Even with the nomultipleincludes option turned on, SC would include a header twice if the second include is in a different case than the first. Compiler did not complain when you tried to pass a structure in a register to an __asm function. The compiler was suppressing all errors and warnings to the console if SCMSG was shut down during a compilation. SC driver did not accept '.cc' file extensions for C++ files. Internal error in C++ when you defined the preprocessor symbol __cplusplus on the command line. C++ translator defined the preprocessor symbol __SASC__ instead of __SASC to identify the compiler. The C compiler defines the latter. IGNORE, ERROR and WARN had no effect on C++. SC only allowed a maximum OPTDEPTH of 6. This has been changed to 255. Please use this option and OPTRECURDEPTH sparingly, since excessive recursive inlining can increase the size of your program dramatically. ==================================== Code Generation/Optimization Changes ==================================== The allocation rules for bitfields were different in 6.50 than in 6.3, rendering structures with bitfields written by programs compiled with 6.3 unreadable with 6.50, and vice-versa. The 6.51 bitfields match the layout of 6.3, except as noted in "IMPORTANT" (see above), paragraph 1, for bitfields of size :0. Compiler called __asm function pointers in a function pointer array as __stdargs functions in some cases. Compiler generated bad code for a dense switch statement with large unsigned long numbers. Bug was fixed with the peephole optimizer that caused some void _STI routines to return a nonzero value and thereby terminate the program. DISASM option output had extra ',' between the EA and {offset:width} fields in 68020+ bitfield operations. GO did not respect 'volatile' status in certain rare cases. Structure copy did not clear all possibly aliased values in registers. Compiler generated a regargs version of a function in some rare cases. Compiler was trashing parameter if register A4 was used as a parameter register for an __asm function declared __saveds. Compiler was not allocating double and float register variables in math coprocessor mode. ================= SE Editor Changes ================= The CED macros were not installed completely. SE scrollbar behaved erratically. SE overwrote its own title bar after switching to a custom screen and back to WorkBench if a large font was chosen as the "Screen Text" font. SE locked up when the Zoom gadget was clicked, another file was loaded, then the scrollbar was moved to the bottom. SE crashed if you brought it up on the WorkBench screen, hit ENTER to put it on its own screen, then opened the configuration window, chose a new font, and clicked on the USE button. The '}' character used the tabstops instead of the autoindent stops when autoindent mode is on. ============================= SCMSG Message Browser Changes ============================= The text of some error messages did not appear when certain fonts were used on AGA machines. Hitting HELP on a C++ error message did not work. Double-clicking on messages generated by compiling from within the SE editor did not work. SCMSG failed to update the display after CTRL-D was used to delete a message other than the first one. ===================== Other Utility Changes ===================== LCTOSC locked up in infinite loop if given an invalid flag to the -L option. ASM could not handle source files with more than 32768 lines. ASM got Bcc offsets wrong if a DATA section occurred before the CODE section in a source file. ASM did not use BRIEF extension format where it could. ASM gave a syntax error for "dc.l %01". ASM required an extra ',' between the EA and {offset:width} fields in 68020+ bitfield operations. This is still accepted for compatibility with old code, but is no longer required. ASM generated illegal code for the CALLM opcode when register indirect with predecrement EA is used. This EA mode is illegal with the CALLM opcode, and should be flagged as such. ASM generated illegal code for a byte MOVE with address register indirect. This is an invalid mode, and is now flagged as an error. ASM generated incorrect code when indexed indirect with scaling mode is used. ASM didn't get the right bit pattern for the MOVE16 instruction. OMD output had extra ',' between the EA and {offset:width} fields in 68020+ bitfield operations. OMD could not correctly disassemble the DIVSL.L opcode. MKMK utility had problems with very long filenames. MKMK utility did not handle indentation correctly for long lines. SCSETUP failed if run from workbench. OML failed if the -t option is used and the temporary filename specified is on a different volume. OML always used the same filename for temporary files. It now uses different names to be more multitasking-friendly. New Manx-compatibility utilities crashed if given certain invalid parameters. SCOPTS had the default value for the LISTHEADERS option incorrect. SMAKE considered ~ to be a special escape character when included on a command line. SMAKE substituted trash for $< if you used it twice in one rule and there was no .c.o rule. =============================== Documentation/Help File Changes =============================== C++ error 1597 was not documented. It is now documented in the file sc:help/scmsg.guide. The Library Reference manual incorrectly showed the strstream constructor as having a default value of ios::out for the third formal parameter mode. Please cross out the "= ios::out" in the strstream constructor prototype described on page 684 of the Library Reference manual. This occurs in two places on page 684, once under the Synopsis section and once under the Constructors section. This has been corrected in the online sc_lib.guide file. The Library Reference manual descriptions of mkstemp() and mktemp() need to be changed on pages 349 and 351, respectively, to reflect the changes made in the header files. In both cases, the formal parameter, template should be be changed to template_arg. This has been corrected in the online sc_lib.guide file. ====================== List of Modified Files ====================== The following files were modified during the 6.51 patch installation process. If they have version numbers, the version should be 6.51. Drawer File(s) ------ ----- sc:c asm sc:c ccotsc sc:c cpr sc:c cprx sc:c cprk sc:c lntoslink sc:c mcc sc:c mkmk sc:c mln sc:c omd sc:c oml sc:c sc sc:c sc5 sc:c scopts sc:c scsetup sc:c se sc:c slink sc:c smake sc:cxxinclude iostream.h sc:extras/mkmk gensmake.c sc:extras/memlib mwcontrol.c sc:help sc.guide sc:help sc_lib.guide sc:help scmsg.guide sc:include assert.h sc:include fcntl.h sc:include string.h sc:include/sys commwben.h sc:lib cback.o sc:lib All library (.lib files) sc:libs sc1.library sc:libs sc2.library sc:libs scpeep.library sc:libs scgo.library sc:libs sccxx.library sc:source autoopenfail.c sc:source cback.a sc:source _fpinit.c sc:source _iob.c sc:source _main.c