From: Bob Drzyzgula
Subject: Trouble Compiling KCL on Sun3/SunOS4
Date:
Message-ID: <476@arcfs1.fed.FRB.GOV>
In trying to compile KCL version 1.25 on a Sun 3/60 running SunOS 4.0,
I get the following error:
(...)
Initializing cmptop...
Initializing cmpvar...
Initializing cmpvs...
Initializing cmpwt...
Loading ../cmpnew/cmpmain.lsp
sh: 11220 Memory fault - core dumped
*** Error code 139
make: Fatal error: Command failed for target `saved_kcl'
Current working directory /tmp_mnt/auto9a08975/kcl/unixport
*** Error code 1
make: Fatal error: Command failed for target `all'
The Sun 3 has 8 MB memory & 57MB paging space. Stack size limit is set
at 10MB. Paging space use during the compile hit a maximum of 7.8MB.
The machine exhibits no other abnormal behavior. Nothing was done with
o/makefile or unixport/makefile other than to make sure that
MACHINE = SUN3 was set. The only other errors in the make were of the
"loop not entered at top", "illegal pointer combination", and
"statement not reached" sort. The header to cmpmain.lsp says specifically
that that file is machine/os dependant.
Anyone know what to do here?
Thanks,
Bob Drzyzgula
···@fed.frb.gov, uunet!fed!rcd
Federal Reserve Board, Washington, DC 20551
From: Bob Drzyzgula
Subject: Re: Trouble Compiling KCL on Sun3/SunOS4
Date:
Message-ID: <478@arcfs1.fed.FRB.GOV>
Thank you all very much for your responses. There were four basic
suggestions:
1. Use the gcc compiler. (Moises Lejter)
2. Use -Bstatic on the Sun C compiler. (Mark Lerner)
(to Mark: You suggest that there is a step in the beginning
where the makefiles get rewritten. I have looked again
through all of the distribution, and I cannot find
any such configuration process. I got my copy from uunet.
Am I missing something?)
3. Patch the source (Taizo Kojima's patches are included here).
4. Buy IBCL. (a solicitation from the purveyor)
So, I first tried using the gcc comiler. To do this, I wound up having
to make two changes: I put -w in the gcc commands, since it got *real*
upset about one of the header files (external.h) not meeting gnu's
specs. I also had to patch the dpp preprocessor to make it generate
gnu-standard #line directives. (gnu uses # linenum filename, and the
filename has to be in double quotes in the general case. Sun's cc uses
#line linenum filename, and doesn't need the quotes. This is real easy
to find... search for #line in dpp.c). This got past loading cmpmain.lsp,
but choked on another memory error soon after loading setdoc.lsp
(transcript later).
Second, I tried putting -Bstatic on Sun's cc (yes, including the
one at the bottom of unixport/makefile that doesn't use CFLAGS). This
made no discernable difference in the outcome.
This was when Taizo Kojima's mail came in. I applied that patch, and
the Sun cc version ran through the cmpmain.lsp, but *failed in exactly
the same place as gcc*. So although I have achieved syncronization
between the two compilers, I have not gotten a running kcl. You've done
great so far, any more ideas? (Yes, I have run memory diagnostics on
my Sun and even tried a seperate compile on a different machine
[a 3/180])
Again, thanks. Transcript of failure follows, followed by Taizo
Kojima's patches:
Initializing cmpvar...
Initializing cmpvs...
Initializing cmpwt...
Loading ../cmpnew/cmpmain.lsp
Finished loading ../cmpnew/cmpmain.lsp
Loading ../cmpnew/lfun_list.lsp
Finished loading ../cmpnew/lfun_list.lsp
Loading ../cmpnew/cmpopt.lsp
Finished loading ../cmpnew/cmpopt.lsp
Warning: COMPILE-FILE is being redefined.
Warning: COMPILE is being redefined.
Warning: DISASSEMBLE is being redefined.
Loading ../lsp/setdoc.lsp
Finished loading ../lsp/setdoc.lsp
Warning: LISP-IMPLEMENTATION-VERSION is being redefined.sh: 954 Memory
fault - core dumped
*** Error code 139
make: Fatal error: Command failed for target `saved_kcl'
Current working directory /src/kcl/unixport
*** Error code 1
make: Fatal error: Command failed for target `all'
>Hello Mr.Drzyzgula
>
> The reason of a memory fault is the implicit return value of
>new Sun C compiler.
> To avoid this, you must add 2 lines at bottom of the functions
>using asm() statement, get_mark_bit() and get_set_mark_bit() in
>c/bitop.c:
>
>======= in bitop.c
>get_mark_bit(x)
>int *x;
>{
> asm(" movl ··@(8),d0");
> asm(" lsrl #2,d0");
> asm(" movl d0,d1");
> asm(" lsrl #3,d1");
> asm(" movl _mark_table,a0");
> asm(" btst d0,··@(0,d1:L)");
> asm(" sne d0");
> asm(" andl #1,d0");
>
> asm(" unlk a6"); /* for SunOS4.0 */
> asm(" rts"); /* for SunOS4.0 */
>
>}
>
>get_set_mark_bit(x)
>int *x;
>{
> asm(" movl ··@(8),d0");
> asm(" lsrl #2,d0");
> asm(" movl d0,d1");
> asm(" lsrl #3,d1");
> asm(" movl _mark_table,a0");
> asm(" bset d0,··@(0,d1:L)");
> asm(" sne d0");
> asm(" andl #1,d0");
>
> asm(" unlk a6"); /* for SunOS4.0 */
> asm(" rts"); /* for SunOS4.0 */
>}
>
>
>Next, CFLAGS in unixport/makefile, add '-Bstatic' option for static binding,
>and add '-Bstatic' option where '/bin/ld' is called in file c/unixfasl.c
>
>- - Bye.
>PS:
> Sorry of my poor English X-<.
> Mitsubishi Electric, Amagasaki, Japan
> Taizo Kojima
Bob Drzyzgula
···@fed.frb.gov, uunet!fed!rcd
Federal Reserve Board, Washington, DC 20551
I went through my copy of the KCL code, and there is one more
change I made that could have something to do with it -
I don't remember what the symptoms were that made me realize
it was a problem. KCL was originally written for 4.2 BSD
systems, and then the kernel allocated a fixed-size table of
FILE structures. KCL knew about that table, and used that
knowledge to close all open files, when needed.
Unfortunately, 4.3 BSD and SunOS 4.0 systems allocate new FILE
structures dynamically (only the initial stdin, stdout, stderr
are in a preallocated table), so the trick KCL uses does not work
anymore (I believe it causes seg faults, when KCL tries to
access and close the fourth file).
If you look at the code in unixsave.c, function Lsave(),
you will see it loops over the (nonexistent) file table,
closing any open files it finds. At Brown, I added the following
three functions to unixfsys.c, and then replaced all
calls everywhere to fopen() and fclose() to calls to these
functions. I also had Lsave() call the function closeAllOpenFiles(),
instead of looping as it does.
At the end of this message you will find context diffs of
unixfsys.c, unixsave.c, unixfasl.c, main.c, and file.d to
achieve this. Note that to have these changes actually
manifest themselves, you have to #define BRUNIX. I hadn't
intended then to make these changes public...
Moises
-----------------------------------------------------------------------------
Internet/CSnet: ···@cs.brown.edu BITNET: ···@browncs.BITNET
UUCP: ...!uunet!brunix!mlm Phone: (401)863-7664
USmail: Moises Lejter, Box 1910 Brown University, Providence RI 02912
-----context diffs follow-----
*** unixfsys.c.orig Tue Jan 26 17:10:36 1988
--- unixfsys.c Thu Oct 13 14:31:16 1988
***************
*** 4,9 ****
--- 4,20 ----
proper "License Agreement for Kyoto Common LISP" with SIGLISP.
*/
+ /*
+ * Modification History:
+ * 88.02 - File access routines
+ * Author: Moises Lejter
+ * Description:
+ * KCL as supplied assumes BSD4.2 implementation of internal file table.
+ * Calls to "fopen()" and "fclose()" were replaced with calls to
+ * "openFile()" and "closeFile()", which guarantee assumption will
+ * hold even though internal opsys implementation may change.
+ */
+
#include "include.h"
#include <sys/types.h>
#include <sys/stat.h>
***************
*** 10,15 ****
--- 21,33 ----
#include <pwd.h>
+ #ifdef BRUNIX
+ #define fopen( file, mode ) openFile( file, mode )
+ #define fclose( file ) closeFile( file )
+ extern FILE *openFile();
+ #endif
+
+
#define MAXPATHLEN 1024
object Kwild;
***************
*** 641,643 ****
--- 659,710 ----
make_si_function("CHDIR", siLchdir);
}
+
+
+ #ifdef BRUNIX
+
+ #undef fopen
+ #undef fclose
+
+ FILE **filesAlreadyOpened = NULL;
+
+ FILE *openFile( file, mode )
+ char *file, *mode;
+ {
+ FILE *newFile = fopen( file, mode );
+
+ if (! newFile) return( newFile );
+
+ if (! filesAlreadyOpened)
+ filesAlreadyOpened =
+ (FILE **) calloc( getdtablesize(), sizeof( FILE * ));
+
+ return( filesAlreadyOpened[ fileno( newFile ) ] = newFile );
+ }
+
+
+ int closeFile( someFile )
+ FILE *someFile;
+ {
+ int result = fclose( someFile );
+
+ if (filesAlreadyOpened)
+ filesAlreadyOpened[ fileno( someFile ) ] = NULL;
+
+ return( result );
+ }
+
+
+ void closeAllOpenFiles()
+ {
+ if (filesAlreadyOpened)
+ {
+ FILE **ptr, **end = filesAlreadyOpened + getdtablesize();
+
+ for (ptr = filesAlreadyOpened; ptr < end; ptr++ )
+ if (*ptr) fclose( *ptr );
+ }
+ }
+
+ #endif
+
*** unixsave.c.orig Tue Jan 26 17:10:33 1988
--- unixsave.c Thu Oct 13 14:31:35 1988
***************
*** 8,15 ****
--- 8,34 ----
unixsave.c
*/
+ /*
+ * Modification History:
+ * 88.02 - File access routines
+ * Author: Moises Lejter
+ * Description:
+ * KCL as supplied assumes BSD4.2 implementation of internal file table.
+ * Calls to "fopen()" and "fclose()" were replaced with calls to
+ * "openFile()" and "closeFile()", which guarantee assumption will
+ * hold even though internal opsys implementation may change.
+ */
+
#include "include.h"
+
+ #ifdef BRUNIX
+ #define fopen( file, mode ) openFile( file, mode )
+ #define fclose( file ) closeFile( file )
+ extern FILE *openFile();
+ #endif
+
+
/* When MACHINE is S3000, use fcntl.h */
#ifdef S3000
#include <fcntl.h>
***************
*** 318,323 ****
--- 337,345 ----
/*
_cleanup();
*/
+ #ifdef BRUNIX
+ closeAllOpenFiles();
+ #else
{
FILE *p;
int nfile;
***************
*** 330,335 ****
--- 352,358 ----
for (p = &_iob[3]; p < &_iob[nfile]; p++)
fclose(p);
}
+ #endif
memory_save(kcl_self, filename);
/*
_exit(0);
*** unixfasl.c.orig Tue Jan 26 17:10:28 1988
--- unixfasl.c Thu Oct 13 14:32:49 1988
***************
*** 4,10 ****
--- 4,28 ----
proper "License Agreement for Kyoto Common LISP" with SIGLISP.
*/
+ /*
+ * Modification History:
+ * 88.02 - File access routines
+ * Author: Moises Lejter
+ * Description:
+ * KCL as supplied assumes BSD4.2 implementation of internal file table.
+ * Calls to "fopen()" and "fclose()" were replaced with calls to
+ * "openFile()" and "closeFile()", which guarantee assumption will
+ * hold even though internal opsys implementation may change.
+ */
+
#include "include.h"
+
+
+ #ifdef BRUNIX
+ #define fopen( file, mode ) openFile( file, mode )
+ #define fclose( file ) closeFile( file )
+ extern FILE *openFile();
+ #endif
#ifdef BSD
*** main.c.orig Tue Jan 26 17:10:21 1988
--- main.c Thu Oct 13 14:32:10 1988
***************
*** 9,15 ****
--- 9,34 ----
IMPLEMENTATION-DEPENDENT
*/
+ /*
+ * Modification History:
+ * 88.02 - File access routines
+ * Author: Moises Lejter
+ * Description:
+ * KCL as supplied assumes BSD4.2 implementation of internal file table.
+ * Calls to "fopen()" and "fclose()" were replaced with calls to
+ * "openFile()" and "closeFile()", which guarantee assumption will
+ * hold even though internal opsys implementation may change.
+ */
+
#include "include.h"
+
+
+ #ifdef BRUNIX
+ #define fopen( file, mode ) openFile( file, mode )
+ #define fclose( file ) closeFile( file )
+ extern FILE *openFile();
+ #endif
+
bool saving_system = FALSE;
*** file.d.orig Tue Jan 26 17:10:28 1988
--- file.d Fri Mar 25 23:23:23 1988
***************
*** 15,21 ****
--- 15,42 ----
It also contains read_fasl_data.
*/
+ /*
+ * Modification History:
+ * 88.02 - File access routines
+ * Author: Moises Lejter
+ * Description:
+ * KCL as supplied assumes BSD4.2 implementation of internal file table.
+ * Calls to "fopen()" and "fclose()" were replaced with calls to
+ * "openFile()" and "closeFile()", which guarantee assumption will
+ * hold even though internal opsys implementation may change.
+ */
+
#include "include.h"
+
+
+ #ifdef VAX
+ #ifdef BRUNIX
+ #define fopen( file, mode ) openFile( file, mode )
+ #define fclose( file ) closeFile( file )
+ extern FILE *openFile();
+ #endif
+ #endif
+
#define kclgetc(FP) getc(FP)
#define kclungetc(C, FP) ungetc(C, FP)
-----------------------------------------------------------------------------
Internet/CSnet: ···@cs.brown.edu BITNET: ···@browncs.BITNET
UUCP: ...!uunet!brunix!mlm Phone: (401)863-7664
USmail: Moises Lejter, Box 1910 Brown University, Providence RI 02912