montnaro@sprite.steinmetz.ge.com (Skip Montanaro) (10/21/88)
I tried sending the following to Doug Lea, but it bounced. (I think I muffed
the address.) Doug, if you're out there (or anyone else who's got any idea
what's going on):
I'm trying to build libg++ 1.25.0 using GNU C++ 1.27.0 and GCC 1.27.
When run, test0 gets a segmentation fault in fprintf (Environment ==
Sun-3/260 running SunOS 3.4):
----------
sprite% test0
Memory fault - core dumped
sprite% gdbplus test0 core
GDB 2.8.0 (GNU C++ 1.27.0 compatible), Copyright (C) 1988 Free Software
Foundation, Inc.
There is ABSOLUTELY NO WARRANTY for GDB; type "info warranty" for details.
GDB is free software and you are welcome to distribute copies of it
under certain conditions; type "info copying" to see the conditions.
Reading symbol data from /usr/karnack/u6/montnaro/libg++-1.25.0/test0...done.
Core file is from "test0".
Program terminated with signal 11, Segmentation fault.
Type "help" for a list of commands.
(gdb+) bt
#0 0x4b58 in fprintf ()
#1 0x2200 in op$alshift_expr_PSofile_PQI ($this=(struct ofile *) 0x20034, p=(char *) 0x2652 "Enter file to link: (test.bye or test.bye2 or test.shell)\n") (test0.h line 69)
#2 0x270a in main ((anon)=1, argv=(char **) 0xefff7f8) (test.hello.cc line 107)
(gdb+)
----------
I also get warnings when compiling test0 :
----------
cd /usr/karnack/u3/montnaro/u6/libg++-1.25.0/
make test0
/usr/karnack/u6/montnaro/g++/bin/g++ -c -v -g -O -fchar-charconst -B/usr/karnack/u6/montnaro/g++/bin/ test.hello.cc -o test.hello.o
g++ version 1.27.0
/usr/karnack/u6/montnaro/g++/lib/gcc-cpp+ -v -undef -D__GNU__ -D__GNUG__ -Dmc68000 -Dsun -Dunix -D__OPTIMIZE__ test.hello.cc /tmp/cca02915.cpp
GNU CPP version 1.27.0
/usr/karnack/u6/montnaro/g++/lib/gcc-c++ /tmp/cca02915.cpp -quiet -dumpbase test.hello.cc -fchar-charconst -opt -version -G -o /tmp/cca02915.s
GNU C++ version 1.27.0 (68k, MIT syntax) compiled by GNU C version 1.27.
At top level:
/usr/include/sys/fcntl.h:64: warning: type declaration of flock shadows previous declaration
/usr/include/sys/fcntl.h:64: warning: `flock' was declared `extern' and later `static'
test.hello.cc:114: warning: initialization between incompatible pointer types
test.hello.cc:123: warning: assignment between incompatible pointer types
as -mc68020 /tmp/cca02915.s -o test.hello.o
install -c dummylibg++.a /usr/karnack/u6/montnaro/g++/lib/libg++.a
ranlib /usr/karnack/u6/montnaro/g++/lib/libg++.a
/usr/karnack/u6/montnaro/g++/bin/g++ -v -g -O -fchar-charconst -B/usr/karnack/u6/montnaro/g++/bin/ test.hello.o -o test0
g++ version 1.27.0
/usr/karnack/u6/montnaro/g++/lib/gcc-ld++ -C -o test0 /lib/crt0.o /lib/Mcrt1.o test.hello.o -lg++ /usr/karnack/u6/montnaro/g++/lib/gcc-gnulib+ -lg -lc
please run test0 and follow instructions
Compilation finished at Mon Oct 17 16:01:25
----------
As far as I can tell, I've got GNU C++ installed properly. Notice that
bindir and libdir are different than the distribution. This is so I can test
the new version before final installation. I discovered a couple problems.
One, there were some hard-coded references to /usr/local/lib scattered
throughout the code. Two, _test0_message was undefined, because
/usr/local/lib was being searched first and an old version of libg++.a (from
1.21.0) was being used. I eventually resorted to renaming all G++-related
files in /usr/local/lib to *-1.21.0 to prevent that from occurring, however,
I'm still getting core dumps. I guess my next step will be to actually
install G++ in the production directories before testing, but I'd rather
avoid that if possible.
Further investigation with gdb+ shows that the fp class variable in the
ofile class is apparently not getting initialized (i.e., out.fp == 0), so
when
out << "...";
gets executed, fprintf gets called with a NULL stream arg. Since all the
constructor/destructor stuff is implicit, it looks like there's a bug in GNU
C++. I can't see any call to initialize out's private variables before the
first use of out when I examine test.hello.s.
Any help would be appreciated. Test.hello.cc (after cpp+ and squishing blank
lines) and test.hello.s follow.
test.hello.cc:
-------------
sprite% ../g++/bin/g++ -v -B../g++/lib/ -E test.hello.cc
g++ version 1.27.0
/usr/karnack/u6/montnaro/g++/lib/gcc-cpp+ -v -undef -D__GNU__ -D__GNUG__ -Dmc68000 -Dsun -Dunix test.hello.cc
GNU CPP version 1.27.0
# 1 "test.hello.cc"
# 1 "test0.h"
# 1 "/usr/karnack/u6/montnaro/g++/lib/g++-include/std.h"
overload abs;
extern void _exit (int) asm ("_" "_exit") ;
extern void abort () asm ("_" "abort") ;
extern int abs (int) asm ("_" "abs") ;
extern int access (const char*, int) asm ("_" "access") ;
extern int acct (const char*) asm ("_" "acct") ;
extern unsigned alarm (unsigned) asm ("_" "alarm") ;
extern void* alloca (int) asm ("_" "alloca") ;
extern double atof (const char*) asm ("_" "atof") ;
extern int atoi (const char*) asm ("_" "atoi") ;
extern long atol (const char*) asm ("_" "atol") ;
extern int bcmp (const void*, const void*, int) asm ("_" "bcmp") ;
extern int bcopy (const void*, void*, int) asm ("_" "bcopy") ;
extern void* brk (void*) asm ("_" "brk") ;
extern int bzero (void*, int) asm ("_" "bzero") ;
extern void* calloc (unsigned, unsigned) asm ("_" "calloc") ;
extern void cfree (void*) asm ("_" "cfree") ;
extern int chdir (const char*) asm ("_" "chdir") ;
extern int chmod (const char*, int) asm ("_" "chmod") ;
extern int chown (const char*, int, int) asm ("_" "chown") ;
extern long clock () asm ("_" "clock") ;
extern int close (int) asm ("_" "close") ;
extern int creat (const char*, int) asm ("_" "creat") ;
extern char* crypt (const char*, const char*) asm ("_" "crypt") ;
extern char* ctermid (char*) asm ("_" "ctermid") ;
extern char* cuserid (char*) asm ("_" "cuserid") ;
extern double drand48 () asm ("_" "drand48") ;
extern int dup (int) asm ("_" "dup") ;
extern int dup2 (int, int) asm ("_" "dup2") ;
extern int dysize (int) asm ("_" "dysize") ;
extern char* ecvt (double, int, int*, int*) asm ("_" "ecvt") ;
extern char* encrypt (char*, int) asm ("_" "encrypt") ;
extern double erand (short*) asm ("_" "erand") ;
extern int execl (const char*, const char *, ...) asm ("_" "execl") ;
extern int execle (const char*, const char *, ...) asm ("_" "execle") ;
extern int execlp (const char*, const char*, ...) asm ("_" "execlp") ;
extern int exect (const char*, const char**, char**) asm ("_" "exect") ;
extern int execv (const char*, const char**) asm ("_" "execv") ;
extern int execve (const char*, const char**, char**) asm ("_" "execve") ;
extern int execvp (const char*, const char**) asm ("_" "execvp") ;
extern void exit (int) asm ("_" "exit") ;
extern int fchmod (int, int) asm ("_" "fchmod") ;
extern int fchown (int, int, int) asm ("_" "fchown") ;
extern int fcntl (int, int, int) asm ("_" "fcntl") ;
extern char* fcvt (double, int, int*, int*) asm ("_" "fcvt") ;
extern int ffs (int) asm ("_" "ffs") ;
extern int flock (int, int) asm ("_" "flock") ;
extern int fork () asm ("_" "fork") ;
extern void free (void*) asm ("_" "free") ;
extern int fsync (int) asm ("_" "fsync") ;
extern long ftok (const char*, int) asm ("_" "ftok") ;
extern int ftruncate (int, unsigned long) asm ("_" "ftruncate") ;
extern char* gcvt (double, int, char*) asm ("_" "gcvt") ;
extern char* getcwd (char*, int) asm ("_" "getcwd") ;
extern int getdomainname (char*, int) asm ("_" "getdomainname") ;
extern int getdtablesize () asm ("_" "getdtablesize") ;
extern int getegid () asm ("_" "getegid") ;
extern char* getenv (const char*) asm ("_" "getenv") ;
extern int geteuid () asm ("_" "geteuid") ;
extern int getgid () asm ("_" "getgid") ;
extern int getgroups (int, int*) asm ("_" "getgroups") ;
extern long gethostid () asm ("_" "gethostid") ;
extern int gethostname (char*, int) asm ("_" "gethostname") ;
extern char* getlogin () asm ("_" "getlogin") ;
extern int getopt (int, char**, char*) asm ("_" "getopt") ;
extern int getpagesize () asm ("_" "getpagesize") ;
extern char* getpass (const char*) asm ("_" "getpass") ;
extern int getpgrp () asm ("_" "getpgrp") ;
extern int getpid () asm ("_" "getpid") ;
extern int getppid () asm ("_" "getppid") ;
extern int getpriority (int, int) asm ("_" "getpriority") ;
extern int getpw (int, char*) asm ("_" "getpw") ;
extern unsigned getuid () asm ("_" "getuid") ;
extern char* getwd (const char*) asm ("_" "getwd") ;
extern char* index (const char*, int) asm ("_" "index") ;
extern char* initstate (unsigned, char*, int) asm ("_" "initstate") ;
extern int ioctl (int, int, char*) asm ("_" "ioctl") ;
extern int isatty (int) asm ("_" "isatty") ;
extern long jrand48 (short*) asm ("_" "jrand48") ;
extern int kill (int, int) asm ("_" "kill") ;
extern int killpg (int, int) asm ("_" "killpg") ;
extern void lcong48 (short*) asm ("_" "lcong48") ;
extern int link (const char*, const char*) asm ("_" "link") ;
extern int lock (int, int, long) asm ("_" "lock") ;
extern long lrand48 () asm ("_" "lrand48") ;
extern long lseek (int, long, int) asm ("_" "lseek") ;
extern void* malloc (unsigned) asm ("_" "malloc") ;
extern void* memalign (unsigned, unsigned) asm ("_" "memalign") ;
extern void* memccpy (void*, const void*, int, int) asm ("_" "memccpy") ;
extern void* memchr (const void*, int, int) asm ("_" "memchr") ;
extern int memcmp (const void*, const void*, int) asm ("_" "memcmp") ;
extern void* memcpy (void*, const void*, int) asm ("_" "memcpy") ;
extern void* memset (void*, int, int) asm ("_" "memset") ;
extern int mkdir (const char*, int) asm ("_" "mkdir") ;
extern int mknod (const char*, int, int) asm ("_" "mknod") ;
extern char* mkstemp (char*) asm ("_" "mkstemp") ;
extern char* mktemp (char*) asm ("_" "mktemp") ;
extern long mrand48 () asm ("_" "mrand48") ;
extern int nice (int) asm ("_" "nice") ;
extern long nrand48 (short*) asm ("_" "nrand48") ;
extern int open (const char*, int, ...) asm ("_" "open") ;
extern void pause () asm ("_" "pause") ;
extern void perror (const char*) asm ("_" "perror") ;
extern int pipe (int*) asm ("_" "pipe") ;
extern void profil (char*, int, int, int) asm ("_" "profil") ;
extern int psignal (unsigned, char*) asm ("_" "psignal") ;
extern int ptrace (int, int, int, int) asm ("_" "ptrace") ;
extern int putenv (const char*) asm ("_" "putenv") ;
extern int rand () asm ("_" "rand") ;
extern long random () asm ("_" "random") ;
extern int read (int, void*, unsigned) asm ("_" "read") ;
extern int readlink (const char*, char*, int) asm ("_" "readlink") ;
extern void* realloc (void*, unsigned) asm ("_" "realloc") ;
extern int rename (const char*, const char*) asm ("_" "rename") ;
extern char* rindex (const char*, int) asm ("_" "rindex") ;
extern int rmdir (const char*) asm ("_" "rmdir") ;
extern void* sbrk (int) asm ("_" "sbrk") ;
extern short* seed48 (short*) asm ("_" "seed48") ;
extern int send (int, char*, int, int) asm ("_" "send") ;
extern int setgid (int) asm ("_" "setgid") ;
extern int sethostname (char*, int) asm ("_" "sethostname") ;
extern int setkey (const char*) asm ("_" "setkey") ;
extern int setpgrp (int, int) asm ("_" "setpgrp") ;
extern int setpriority (int, int, int) asm ("_" "setpriority") ;
extern int setregid (int, int) asm ("_" "setregid") ;
extern int setreuid (int, int) asm ("_" "setreuid") ;
extern char* setstate (char*) asm ("_" "setstate") ;
extern int setuid (int) asm ("_" "setuid") ;
extern int sigblock (int) asm ("_" "sigblock") ;
extern int siginterrupt (int, int) asm ("_" "siginterrupt") ;
extern int sigpause (int) asm ("_" "sigpause") ;
extern int sigsetmask (int) asm ("_" "sigsetmask") ;
extern unsigned sleep (unsigned) asm ("_" "sleep") ;
extern int srand (int) asm ("_" "srand") ;
extern void srand48 (long) asm ("_" "srand48") ;
extern void srandom (int) asm ("_" "srandom") ;
extern int stime (long*) asm ("_" "stime") ;
extern char* strcat (char*, const char*) asm ("_" "strcat") ;
extern char* strchr (const char*, int) asm ("_" "strchr") ;
extern int strcmp (const char*, const char*) asm ("_" "strcmp") ;
extern char* strcpy (char*, const char*) asm ("_" "strcpy") ;
extern int strcspn (const char*, const char*) asm ("_" "strcspn") ;
extern char* strdup (const char*) asm ("_" "strdup") ;
extern int strlen (const char*) asm ("_" "strlen") ;
extern char* strncat (char*, const char*, int) asm ("_" "strncat") ;
extern int strncmp (const char*, const char*, int) asm ("_" "strncmp") ;
extern char* strncpy (char*, const char*, int) asm ("_" "strncpy") ;
extern char* strpbrk (const char*, const char*) asm ("_" "strpbrk") ;
extern char* strrchr (const char*, int) asm ("_" "strrchr") ;
extern int strspn (const char*, const char*) asm ("_" "strspn") ;
extern double strtod (const char*, char**) asm ("_" "strtod") ;
extern char* strtok (char*, const char*) asm ("_" "strtok") ;
extern long strtol (const char*, char**, int) asm ("_" "strtol") ;
extern void swab (void*, void*, int) asm ("_" "swab") ;
extern int symlink (const char*, const char*) asm ("_" "symlink") ;
extern int syscall (int, ...) asm ("_" "syscall") ;
extern int system (const char*) asm ("_" "system") ;
extern char* tempnam (char*, char*) asm ("_" "tempnam") ;
extern long time (long*) asm ("_" "time") ;
extern char* tmpnam (char*) asm ("_" "tmpnam") ;
extern int truncate (const char*, unsigned long) asm ("_" "truncate") ;
extern char* ttyname (int) asm ("_" "ttyname") ;
extern int ttyslot () asm ("_" "ttyslot") ;
extern unsigned ualarm (unsigned, unsigned) asm ("_" "ualarm") ;
extern long ulimit (int, long) asm ("_" "ulimit") ;
extern int umask (int) asm ("_" "umask") ;
extern int unlink (const char*) asm ("_" "unlink") ;
extern unsigned usleep (unsigned) asm ("_" "usleep") ;
extern int vadvise (int) asm ("_" "vadvise") ;
extern void* valloc (unsigned) asm ("_" "valloc") ;
extern int vfork () asm ("_" "vfork") ;
extern int vhangup () asm ("_" "vhangup") ;
extern int wait (int*) asm ("_" "wait") ;
extern int write (int, const void*, unsigned) asm ("_" "write") ;
extern char** environ;
extern int errno;
extern char* sys_errlist[];
extern int sys_nerr;
extern char* optarg;
extern int opterr;
extern int optind;
# 1 "test0.h"
# 1 "/usr/karnack/u6/montnaro/g++/lib/g++-include/stdio.h"
extern struct _iobuf {
int _cnt;
char* _ptr;
char* _base;
int _bufsiz;
short _flag;
char _file;
} _iob[];
extern int _doprnt(const char*, void*, struct _iobuf *);
extern int _doscan( struct _iobuf *, const char*, void*);
extern int _filbuf( struct _iobuf *);
extern int _flsbuf(unsigned, struct _iobuf *);
extern int fclose( struct _iobuf *);
extern struct _iobuf * fdopen(int, const char*);
extern int fflush( struct _iobuf *);
extern int fgetc( struct _iobuf *);
extern char* fgets(char*, int, struct _iobuf *);
extern struct _iobuf * fopen(const char*, const char*);
extern int fprintf( struct _iobuf *, const char* ...);
extern int fputc(int, struct _iobuf *);
extern int fputs(const char*, struct _iobuf *);
extern int fread(void*, int, int, struct _iobuf *);
extern struct _iobuf * freopen(const char*, const char*, struct _iobuf *);
extern int fscanf( struct _iobuf *, const char* ...);
extern int fseek( struct _iobuf *, long, int);
extern long ftell( struct _iobuf *);
extern int fwrite(const void*, int, int, struct _iobuf *);
extern char* gets(char*);
extern int getw( struct _iobuf *);
extern int pclose( struct _iobuf *);
extern struct _iobuf * popen(const char*, const char*);
extern int printf(const char* ...);
extern void puts(const char*);
extern int putw(int, struct _iobuf *);
extern int scanf(const char* ...);
extern void setbuf( struct _iobuf *, char*);
extern void setbuffer( struct _iobuf *, char*, int);
extern void setlinebuf( struct _iobuf *);
extern void setvbuf( struct _iobuf *, char*, int, int);
extern int sscanf(char*, const char* ...);
extern struct _iobuf * tmpfile();
extern int ungetc(int, struct _iobuf *);
extern int vfprintf( struct _iobuf *, const char*, void* ap);
extern int vprintf(const char*, void* ap);
extern int vsprintf(char*, const char*, void* ap);
extern int sprintf(char*, const char* ...);
# 2 "test0.h"
# 1 "/usr/karnack/u6/montnaro/g++/lib/g++-include/stddef.h"
enum bool
{
FALSE = 0,
TRUE = 1
};
typedef void (*one_arg_error_handler_t)(char*);
# 3 "test0.h"
class ifile
{
struct _iobuf *fp;
char *name;
public:
ifile (char *name)
{
this->name = new char[strlen(name) + 1];
strcpy (this->name, name);
if ((fp = fopen (name, "r")) == 0 )
{
fprintf ( (&_iob[2]) , "could not open input file `%s'\n", name);
exit (1);
}
}
~ifile ()
{
fclose (fp);
if (fp) fprintf ( (&_iob[2]) , "closing input file `%s'\n", name);
}
ifile& operator>> (int &i)
{ fscanf (fp, "%d", &i); return *this; }
ifile& operator>> (char *p)
{ fscanf (fp, "%s", p); return *this; }
};
class ofile
{
struct _iobuf *fp;
char *name;
public:
ofile (char *name)
{
this->name = new char[strlen(name) + 1];
strcpy (this->name, name);
if ((fp = fopen (name, "w")) == 0 )
{
fprintf ( (&_iob[2]) , "could not open output file `%s'\n", name);
exit (1);
}
}
~ofile ()
{
fclose (fp);
if (fp) fprintf ( (&_iob[2]) , "closing output file `%s'\n", name);
}
ofile& operator<< (int i)
{
fprintf (fp, "%d", i);
fflush (fp);
return *this;
}
ofile& operator<< (char *p)
{
fprintf (fp, "%s", p);
fflush (fp);
return *this;
}
};
# 9 "test.hello.cc"
# 1 "/usr/include/a.out.h"
# 1 "/usr/include/sys/exec.h"
struct exec {
unsigned short a_machtype;
unsigned short a_magic;
unsigned long a_text;
unsigned long a_data;
unsigned long a_bss;
unsigned long a_syms;
unsigned long a_entry;
unsigned long a_trsize;
unsigned long a_drsize;
};
# 3 "/usr/include/a.out.h"
struct relocation_info {
long r_address;
unsigned int r_symbolnum:24,
r_pcrel:1,
r_length:2,
r_extern:1,
:4;
};
struct nlist {
union {
char *n_name;
long n_strx;
} n_un;
unsigned char n_type;
char n_other;
short n_desc;
unsigned long n_value;
};
# 10 "test.hello.cc"
# 1 "/usr/include/sys/file.h"
# 1 "/usr/include/sys/fcntl.h"
struct flock {
short l_type;
short l_whence;
long l_start;
long l_len;
short l_pid;
short l_xxx;
};
# 9 "/usr/include/sys/file.h"
# 37 "/usr/include/sys/file.h"
# 84 "/usr/include/sys/file.h"
# 11 "test.hello.cc"
void test0_message();
class tfile
{
char tname[ (sizeof( "/tmp/" ) + 15) ];
static char *orig_name;
char *this_name;
exec header;
public:
tfile (char*);
~tfile ();
void* load ();
};
tfile::tfile (char *p)
{
int fd;
strcpy (tname, "hack.XXXXXX");
mktemp (tname);
this_name = new char[strlen (p) + 1];
strcpy (this_name, p);
if ((fd = open (this_name, 2, 0)) < 0)
{
fprintf ( (&_iob[2]) , "Unable to open file %s\n", p);
exit (1);
}
if (read (fd, (void*) &header, sizeof (header)) <= 0)
{
fprintf ( (&_iob[2]) , "Error in reading file %s\n", p);
}
close (fd);
}
tfile::~tfile ()
{
unlink (tname);
}
void *tfile::load ()
{
int size = header.a_text + header.a_data;
int pagsiz = 0x2000 ;
if (size < (pagsiz))
size = (pagsiz);
int init_fn = (int) new short[size];
init_fn += pagsiz-1;
init_fn &= ~(pagsiz-1);
fprintf ( (&_iob[2]) , "\n ... timing incremental load...\n");
char command[512], *cmd = command;
sprintf (cmd, "time %s -C -N -A %s -T %x %s %s -o %s",
"/usr/karnack/u6/montnaro/g++/lib/gcc-ld++" , orig_name, init_fn, "/usr/karnack/u6/montnaro/g++/lib/gcc-crt1+.o" , this_name, tname);
if (system (cmd))
{
fprintf ( (&_iob[2]) , "Error in linking file bye\n");
delete this;
exit (1);
}
int fd = open (tname, 2, 0);
if (lseek (fd, sizeof (header), 0 ) < 0)
{
perror ("Error in temp file seek\n");
delete this;
exit (1);
}
read (fd, (char*) init_fn, size);
close (fd);
fprintf ( (&_iob[2]) , "load symbol-table at address 0x%x\n", init_fn);
return (void *)init_fn;
}
ifile in ("/dev/tty");
ofile out ("/dev/tty");
main (int, char *argv[])
{
char buf[4096];
out << "Enter file to link: (test.bye or test.bye2 or test.shell)\n";
in >> buf;
out << "Hello! linking `" << buf << "'...\n";
tfile::orig_name = argv[0];
tfile temp (buf);
register void (*init_fn)() = temp.load ();
fprintf ( (&_iob[2]) , "\n if execution now aborts, your crt1+.o is bad\n");
(*init_fn) ();
out << "Enter another file to link: ";
in >> buf;
out << "Hello! linking `" << buf << "'...\n";
tfile temp2 (buf);
init_fn = temp2.load ();
(*init_fn)();
test0_message();
}
test.hello.s:
-------------
#NO_APP
.text
LC0:
.ascii "%s\0"
.even
_op$arshift_expr_PSifile_PQI:
link a6,#0
movel d2,sp@-
movel a6@(12),sp@-
pea LC0
movel a6@(8),a0
movel a0@,sp@-
jbsr _fscanf
movel a6@(8),d2
movel d2,d0
addw #12,sp
jra L1
L1:
movel a6@(-4),d2
unlk a6
rts
LC1:
.ascii "%d\0"
.even
_op$arshift_expr_PSifile_SI:
link a6,#0
movel d2,sp@-
movel a6@(12),sp@-
pea LC1
movel a6@(8),a0
movel a0@,sp@-
jbsr _fscanf
movel a6@(8),d2
movel d2,d0
addw #12,sp
jra L2
L2:
movel a6@(-4),d2
unlk a6
rts
LC2:
.ascii "r\0"
LC3:
.ascii "could not open input file `%s'\12\0"
.even
_ifile_PSifile_PQI:
link a6,#0
movel d2,sp@-
tstl a6@(8)
jne L5
pea 8:w
jbsr ___builtin_new
movel d0,a6@(8)
addqw #4,sp
L5:
movel a6@(12),sp@-
jbsr _strlen
movel d0,d0
addql #1,d0
movel d0,sp@-
jbsr ___builtin_new
movel d0,d0
movel a6@(8),a0
movel d0,a0@(4)
movel a6@(12),sp@-
movel a6@(8),a0
movel a0@(4),sp@-
jbsr _strcpy
pea LC2
movel a6@(12),sp@-
jbsr _fopen
movel d0,d0
movel a6@(8),a0
movel d0,d0
movel d0,a0@
addw #24,sp
tstl d0
jne L4
movel a6@(12),sp@-
pea LC3
moveq #40,d0
addl #__iob,d0
movel d0,sp@-
jbsr _fprintf
pea 1:w
jbsr _exit
addw #16,sp
L4:
movel a6@(8),d2
movel d2,d0
jra L3
L3:
movel a6@(-4),d2
unlk a6
rts
LC4:
.ascii "closing input file `%s'\12\0"
.even
__$_ifile:
link a6,#0
tstl a6@(8)
jeq L9
movel a6@(8),a0
movel a0@,sp@-
jbsr _fclose
movel a6@(8),a0
addqw #4,sp
tstl a0@
jeq L7
movel a6@(8),a0
movel a0@(4),sp@-
pea LC4
moveq #40,d0
addl #__iob,d0
movel d0,sp@-
jbsr _fprintf
addw #12,sp
L7:
tstl a6@(12)
jeq L8
L8:
L9:
L6:
unlk a6
rts
.even
_op$alshift_expr_PSofile_PQI:
link a6,#0
movel d2,sp@-
movel a6@(12),sp@-
pea LC0
movel a6@(8),a0
movel a0@,sp@-
jbsr _fprintf
movel a6@(8),a0
movel a0@,sp@-
jbsr _fflush
movel a6@(8),d2
movel d2,d0
addw #16,sp
jra L10
L10:
movel a6@(-4),d2
unlk a6
rts
.even
_op$alshift_expr_PSofile_SI:
link a6,#0
movel d2,sp@-
movel a6@(12),sp@-
pea LC1
movel a6@(8),a0
movel a0@,sp@-
jbsr _fprintf
movel a6@(8),a0
movel a0@,sp@-
jbsr _fflush
movel a6@(8),d2
movel d2,d0
addw #16,sp
jra L11
L11:
movel a6@(-4),d2
unlk a6
rts
LC5:
.ascii "w\0"
LC6:
.ascii "could not open output file `%s'\12\0"
.even
_ofile_PSofile_PQI:
link a6,#0
movel d2,sp@-
tstl a6@(8)
jne L14
pea 8:w
jbsr ___builtin_new
movel d0,a6@(8)
addqw #4,sp
L14:
movel a6@(12),sp@-
jbsr _strlen
movel d0,d0
addql #1,d0
movel d0,sp@-
jbsr ___builtin_new
movel d0,d0
movel a6@(8),a0
movel d0,a0@(4)
movel a6@(12),sp@-
movel a6@(8),a0
movel a0@(4),sp@-
jbsr _strcpy
pea LC5
movel a6@(12),sp@-
jbsr _fopen
movel d0,d0
movel a6@(8),a0
movel d0,d0
movel d0,a0@
addw #24,sp
tstl d0
jne L13
movel a6@(12),sp@-
pea LC6
moveq #40,d0
addl #__iob,d0
movel d0,sp@-
jbsr _fprintf
pea 1:w
jbsr _exit
addw #16,sp
L13:
movel a6@(8),d2
movel d2,d0
jra L12
L12:
movel a6@(-4),d2
unlk a6
rts
LC7:
.ascii "closing output file `%s'\12\0"
.even
__$_ofile:
link a6,#0
tstl a6@(8)
jeq L18
movel a6@(8),a0
movel a0@,sp@-
jbsr _fclose
movel a6@(8),a0
addqw #4,sp
tstl a0@
jeq L16
movel a6@(8),a0
movel a0@(4),sp@-
pea LC7
moveq #40,d0
addl #__iob,d0
movel d0,sp@-
jbsr _fprintf
addw #12,sp
L16:
tstl a6@(12)
jeq L17
L17:
L18:
L15:
unlk a6
rts
LC8:
.ascii "hack.XXXXXX\0"
LC9:
.ascii "Unable to open file %s\12\0"
LC10:
.ascii "Error in reading file %s\12\0"
.even
.globl _tfile_PStfile_PQI
_tfile_PStfile_PQI:
link a6,#-4
movel d2,sp@-
tstl a6@(8)
jne L22
pea 58:w
jbsr ___builtin_new
movel d0,a6@(8)
addqw #4,sp
L22:
pea LC8
movel a6@(8),d0
movel d0,sp@-
jbsr _strcpy
movel a6@(8),d0
movel d0,sp@-
jbsr _mktemp
movel a6@(12),sp@-
jbsr _strlen
movel d0,d0
addql #1,d0
movel d0,sp@-
jbsr ___builtin_new
movel d0,d0
movel a6@(8),a0
movel d0,a0@(22)
movel a6@(12),sp@-
movel a6@(8),a0
movel a0@(22),sp@-
jbsr _strcpy
clrl sp@-
pea 2:w
movel a6@(8),a0
movel a0@(22),sp@-
jbsr _open
movel d0,d0
movel d0,d0
movel d0,a6@(-4)
addw #40,sp
tstl d0
jge L20
movel a6@(12),sp@-
pea LC9
moveq #40,d0
addl #__iob,d0
movel d0,sp@-
jbsr _fprintf
pea 1:w
jbsr _exit
addw #16,sp
L20:
pea 32:w
moveq #26,d0
addl a6@(8),d0
movel d0,sp@-
movel a6@(-4),sp@-
jbsr _read
movel d0,d0
addw #12,sp
tstl d0
jgt L21
movel a6@(12),sp@-
pea LC10
moveq #40,d0
addl #__iob,d0
movel d0,sp@-
jbsr _fprintf
addw #12,sp
L21:
movel a6@(-4),sp@-
jbsr _close
addqw #4,sp
movel a6@(8),d2
movel d2,d0
jra L19
L19:
movel a6@(-8),d2
unlk a6
rts
.even
.globl __$_tfile
__$_tfile:
link a6,#0
tstl a6@(8)
jeq L25
movel a6@(8),d0
movel d0,sp@-
jbsr _unlink
addqw #4,sp
tstl a6@(12)
jeq L24
L24:
L25:
L23:
unlk a6
rts
LC11:
.ascii "\12 ... timing incremental load...\12\0"
LC12:
.ascii "/usr/karnack/u6/montnaro/g++/lib/gcc-crt1+.o\0"
LC13:
.ascii "/usr/karnack/u6/montnaro/g++/lib/gcc-ld++\0"
LC14:
.ascii "time %s -C -N -A %s -T %x %s %s -o %s\0"
LC15:
.ascii "Error in linking file bye\12\0"
LC16:
.ascii "Error in temp file seek\12\0"
LC17:
.ascii "load symbol-table at address 0x%x\12\0"
.even
.globl _load_PStfile
_load_PStfile:
link a6,#-532
movel d2,sp@-
movel a6@(8),a0
movel a6@(8),a1
movel a0@(30),d1
addl a1@(34),d1
movel d1,a6@(-4)
movel #8192,a6@(-8)
movel a6@(-4),d1
cmpl a6@(-8),d1
jge L27
movel a6@(-8),a6@(-4)
L27:
movel a6@(-4),d0
asll #1,d0
movel d0,sp@-
jbsr ___builtin_new
movel d0,a6@(-12)
movel d0,d0
subql #1,d0
movel d0,d1
addl a6@(-8),d1
movel d1,a6@(-12)
movel a6@(-8),d0
subql #1,d0
notl d0
andl d0,a6@(-12)
pea LC11
moveq #40,d0
addl #__iob,d0
movel d0,sp@-
jbsr _fprintf
movel a6,d1
addl #-524,d1
movel d1,a6@(-528)
movel a6@(8),d0
movel d0,sp@-
movel a6@(8),a0
movel a0@(22),sp@-
pea LC12
movel a6@(-12),sp@-
movel __tfile$orig_name,sp@-
pea LC13
pea LC14
movel a6@(-528),sp@-
jbsr _sprintf
addw #44,sp
movel a6@(-528),sp@-
jbsr _system
movel d0,d0
addqw #4,sp
tstl d0
jeq L28
pea LC15
moveq #40,d0
addl #__iob,d0
movel d0,sp@-
jbsr _fprintf
pea 1:w
movel a6@(8),sp@-
jbsr __$_tfile
pea 1:w
jbsr _exit
addw #20,sp
L28:
clrl sp@-
pea 2:w
movel a6@(8),d0
movel d0,sp@-
jbsr _open
movel d0,a6@(-532)
clrl sp@-
pea 32:w
movel a6@(-532),sp@-
jbsr _lseek
movel d0,d0
addw #24,sp
tstl d0
jge L29
pea LC16
jbsr _perror
pea 1:w
movel a6@(8),sp@-
jbsr __$_tfile
pea 1:w
jbsr _exit
addw #16,sp
L29:
movel a6@(-4),sp@-
movel a6@(-12),sp@-
movel a6@(-532),sp@-
jbsr _read
movel a6@(-532),sp@-
jbsr _close
movel a6@(-12),sp@-
pea LC17
moveq #40,d0
addl #__iob,d0
movel d0,sp@-
jbsr _fprintf
movel a6@(-12),d2
movel d2,d0
addw #28,sp
jra L26
L26:
movel a6@(-536),d2
unlk a6
rts
LC18:
.ascii "Enter file to link: (test.bye or test.bye2 or test.shell)\12\0"
LC19:
.ascii "'...\12\0"
LC20:
.ascii "Hello! linking `\0"
LC21:
.ascii "\12 if execution now aborts, your crt1+.o is bad\12\0"
LC22:
.ascii "Enter another file to link: \0"
.even
.globl _main
_main:
link a6,#-4212
movel a2,sp@-
pea LC18
pea _out
jbsr _op$alshift_expr_PSofile_PQI
movel a6,d0
addl #-4096,d0
movel d0,sp@-
pea _in
jbsr _op$arshift_expr_PSifile_PQI
pea LC19
movel a6,d0
addl #-4096,d0
movel d0,sp@-
pea LC20
pea _out
jbsr _op$alshift_expr_PSofile_PQI
addqw #8,sp
movel d0,d0
movel d0,sp@-
jbsr _op$alshift_expr_PSofile_PQI
addqw #8,sp
movel d0,d0
movel d0,sp@-
jbsr _op$alshift_expr_PSofile_PQI
movel a6@(12),a0
movel a0@,__tfile$orig_name
movel a6,d0
addl #-4096,d0
movel d0,sp@-
movel a6,d0
addl #-4154,d0
movel d0,sp@-
jbsr _tfile_PStfile_PQI
addw #32,sp
movel a6,d0
addl #-4154,d0
movel d0,sp@-
jbsr _load_PStfile
movel d0,a2
pea LC21
moveq #40,d0
addl #__iob,d0
movel d0,sp@-
jbsr _fprintf
jbsr a2@
pea LC22
pea _out
jbsr _op$alshift_expr_PSofile_PQI
movel a6,d0
addl #-4096,d0
movel d0,sp@-
pea _in
jbsr _op$arshift_expr_PSifile_PQI
pea LC19
movel a6,d0
addl #-4096,d0
movel d0,sp@-
pea LC20
pea _out
jbsr _op$alshift_expr_PSofile_PQI
addqw #8,sp
movel d0,d0
movel d0,sp@-
jbsr _op$alshift_expr_PSofile_PQI
addqw #8,sp
movel d0,d0
movel d0,sp@-
jbsr _op$alshift_expr_PSofile_PQI
addw #36,sp
movel a6,d0
addl #-4096,d0
movel d0,sp@-
movel a6,d0
addl #-4212,d0
movel d0,sp@-
jbsr _tfile_PStfile_PQI
movel a6,d0
addl #-4212,d0
movel d0,sp@-
jbsr _load_PStfile
movel d0,a2
jbsr a2@
jbsr _test0_message
clrl sp@-
movel a6,d0
addl #-4212,d0
movel d0,sp@-
jbsr __$_tfile
clrl sp@-
movel a6,d0
addl #-4154,d0
movel d0,sp@-
jbsr __$_tfile
addw #28,sp
L30:
movel a6@(-4216),a2
unlk a6
rts
.even
.globl __GLOBAL_$D$test_hello_cc
__GLOBAL_$D$test_hello_cc:
link a6,#0
clrl sp@-
pea _out
jbsr __$_ofile
clrl sp@-
pea _in
jbsr __$_ifile
addw #16,sp
L31:
unlk a6
rts
LC23:
.ascii "/dev/tty\0"
.even
.globl __GLOBAL_$I$test_hello_cc
__GLOBAL_$I$test_hello_cc:
link a6,#0
pea LC23
pea _in
jbsr _ifile_PSifile_PQI
pea LC23
pea _out
jbsr _ofile_PSofile_PQI
addw #16,sp
L32:
unlk a6
rts
.globl _out
.data
.even
_out:
.skip 8
.globl _in
.even
_in:
.skip 8
.comm __tfile$orig_name,4
--
Skip Montanaro (montanaro@sprite.steinmetz.ge.com, montanaro@ge-crd.arpa)