jhh%thyme.Berkeley.EDU@GINGER.BERKELEY.EDU (John H. Hartman) (06/02/89)
There is a bug in Gcc 1.34 when it compiles optimized code for the 68k.
I've enclosed a file that produces the error. The original file was huge
and I managed to shrink it quite a bit. On line 167 a pointer is incremented.
If you compile using the -O flag the resulting assembly code does not
increment the pointer.
John
----------------- cut here --------------------------------
typedef int *ClientData;
typedef struct _file {
unsigned char *lastAccess;
int readCount;
int writeCount;
unsigned char *buffer;
int bufSize;
void (*readProc)();
void (*writeProc)();
int (*closeProc)();
ClientData clientData;
int status;
int flags;
struct _file *nextPtr;
} FILE;
extern FILE stdioInFile, stdioOutFile, stdioErrFile;
typedef unsigned char u_char;
typedef unsigned short u_short;
typedef unsigned int u_int;
typedef unsigned long u_long;
typedef unsigned short ushort;
typedef struct _physadr { short r[1]; } *physadr;
typedef struct label_t {
int val[13];
} label_t;
typedef struct _quad { long val[2]; } quad;
typedef long daddr_t;
typedef char * caddr_t;
typedef long * qaddr_t;
typedef u_long ino_t;
typedef long swblk_t;
typedef int size_t;
typedef long time_t;
typedef short dev_t;
typedef long off_t;
typedef u_short uid_t;
typedef u_short gid_t;
typedef long fd_mask;
typedef struct fd_set {
fd_mask fds_bits[(((256 )+(( (sizeof(fd_mask) * 8 ) )-1))/( (sizeof(fd_mask) * 8 ) )) ];
} fd_set;
struct stat
{
dev_t st_dev;
ino_t st_ino;
unsigned short st_mode;
short st_nlink;
uid_t st_uid;
gid_t st_gid;
dev_t st_rdev;
off_t st_size;
time_t st_atime;
int st_spare1;
time_t st_mtime;
int st_spare2;
time_t st_ctime;
int st_spare3;
long st_blksize;
long st_blocks;
long st_serverID;
long st_version;
long st_userType;
long st_devServerID;
};
extern char _ctype_bits[];
extern int errno;
extern int sys_nerr;
extern char *sys_errlist[];
typedef int NG_NUM;
typedef long ART_NUM;
typedef long ART_UNREAD;
typedef long ART_POS;
typedef int ART_LINE;
typedef short ACT_POS;
typedef unsigned int MEM_SIZE;
struct stat filestat;
char *index();
char *rindex();
char *getenv();
char *strcat();
char *strcpy();
char *sprintf();
char buf[1024 +1];
char cmd_buf[512 ];
char *indstr = ">" ;
char *cwd = ((char *)0) ;
char *dfltcmd = ((char *)0) ;
int debug = 0 ;
int scanon = 0 ;
char mbox_always = (0) ;
char norm_always = (0) ;
char checkflag = (0) ;
char suppress_cn = (0) ;
int countdown = 5 ;
char muck_up_clear = (0) ;
char erase_screen = (0) ;
char can_home_clear = (0) ;
char findlast = (0) ;
char typeahead = (0) ;
char verbose = (1) ;
char verify = (0) ;
int marking = 0 ;
ART_LINE initlines = 0 ;
long atol(), fseek(), ftell();
char in_ng = (0) ;
char mode = 'i' ;
FILE *tmpfp = ((FILE *)0) ;
NG_NUM nextrcline = 0 ;
extern errno;
char nullstr[] = "" ;
char sh[] = "/bin/sh" ;
char defeditor[] = "/sprite/cmds/vi" ;
char hforhelp[] = "Type h for help.\n" ;
char readerr[] = "rn read error" ;
char unsubto[] = "\n\nUnsubscribed to newsgroup %s\n" ;
char cantopen[] = "Can't open %s\n" ;
char cantcreate[] = "Can't create %s\n" ;
char nocd[] = "Can't chdir to directory %s\n" ;
char *
dointerp(dest,destsize,pattern,stoppers)
register char *dest;
register int destsize;
register char *pattern;
char *stoppers;
{
char *ngs_buf = 0 ;
char *path_buf = 0 ;
char *follow_buf = 0 ;
register char *s, *h;
register int i;
char scrbuf[512];
int metabit = 0;
while (*pattern && (!stoppers || !index(stoppers,*pattern))) {
if (debug & 8)
printf("dointerp till %s at %s\n",stoppers?stoppers:"",pattern);
if (*pattern == '%' && pattern[1]) {
for (s=0 ; !s; ) {
switch (*++pattern) {
case 'F':
{
int off;
s = ngs_buf = fetchlines();
if (h = instr(s,"net.general")) {
off = h-s;
strncpy(scrbuf,s,off+4);
strcpy(scrbuf+off+4,"followup");
safecpy(scrbuf+off+12,h+11,sizeof(scrbuf));
s = scrbuf;
}
}
break;
case 'T':
if (*pattern == 'T') {
s = path_buf = fetchlines();
i = strlen();
if ((!strncmp(s,s,i)) && s[i] == '!')
s += i + 1;
}
break;
}
}
if (s == dest) {
while (*dest) {
if (--destsize <= 0)
abort_interp();
*dest |= i;
dest++;
}
}
}
}
getout:
exit();
}