This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
program compiled incorrectly by gcc
- To: gcc-bugs at gcc dot gnu dot org
- Subject: program compiled incorrectly by gcc
- From: "e. boasson" <eboasson at signaal dot nl>
- Date: Tue, 24 Aug 1999 12:10:04 +0200
- Organization: Hollandse Signaalapparaten b.v.
The attached program causes gcc to generate incorrect code.
suns25c388% gcc -v
Reading specs from
/work/asr/de614/gcc/lib/gcc-lib/sparc-sun-solaris2.6/2.95.1/specs
gcc version 2.95.1 19990816 (release)
suns25c388% more config.status
./configure --prefix=/work/asr/de614/gcc
suns25c388% uname -a
SunOS suns25c388 5.6 Generic_105181-09 sun4u sparc SUNW,Ultra-60
suns25c388% gcc -save-temps -g -O4 -Wall -mcpu=supersparc -mno-app-regs
bug.c -o bug
suns25c388% bug
begin
Bus Error (core dumped)
In the following excerpt from bug.s:
(loads %g1)
38: st %g1, [%fp-20]
(code not using %g1)
41: call printf, 0
42: mov 0, %i0
(code not using %g1)
46: st %o0, [%g1+92]
(code not using %g1)
71: ld [%fp-20], %g1
(lots of stores following using %g1 as a base address)
%g1 is saved on the stack before calling printf(), is modified by
printf(), and is then used before restoring it from the stack.
According to gdb, the store in bug.s:46 corresponds to bug.c:61.
Thanks in advance,
Regards,
Erik Boasson.
--
[Unclassified]
#include <stdio.h>
#include <string.h>
#define ST(Xi, Xname, Xtype, Xdata) do { \
strcpy (s->stats[Xi].name, Xname); \
s->stats[Xi].type = st_##Xtype; \
s->stats[Xi].data.Xtype = Xdata; \
} while (0)
enum stat_type
{
st_i,
st_ui,
st_l
};
union stat_data
{
int i;
unsigned int ui;
long long l;
};
struct stat
{
char name[20];
enum stat_type type;
union stat_data data;
};
struct stat_sort
{
int n_stats;
struct stat stats[4];
};
struct db
{
int length;
long long lengthtime;
unsigned int n_direct;
unsigned int n_queue;
};
struct db gdb;
struct stat_sort gs;
int main ()
{
struct db *db = &gdb;
struct stat_sort *s = &gs;
if (s == NULL)
return 1;
s->n_stats = 4;
printf ("begin\n");
ST (0, "length", i, db->length);
ST (1, "lengthtime", l, db->lengthtime);
ST (2, "direct", ui, db->n_direct);
ST (3, "queue", ui, db->n_queue);
printf ("end\n");
return 0;
}
# 1 "bug.c"
# 1 "/usr/include/stdio.h" 1 3
#pragma ident "@(#)stdio.h 1.49 97/05/09 SMI"
# 1 "/usr/include/sys/feature_tests.h" 1 3
#pragma ident "@(#)feature_tests.h 1.13 97/06/26 SMI"
# 17 "/usr/include/stdio.h" 2 3
# 1 "/usr/include/sys/va_list.h" 1 3
#pragma ident "@(#)va_list.h 1.6 96/01/26 SMI"
# 41 "/usr/include/sys/va_list.h" 3
typedef void *__va_list;
# 18 "/usr/include/stdio.h" 2 3
typedef unsigned int size_t;
typedef long long __longlong_t;
typedef long off_t;
typedef __longlong_t off64_t;
typedef long fpos_t;
typedef __longlong_t fpos64_t;
# 122 "/usr/include/stdio.h" 3
typedef struct
{
int _cnt;
unsigned char *_ptr;
unsigned char *_base;
unsigned char _flag;
unsigned char _file;
} FILE;
extern FILE __iob[20 ];
extern FILE *_lastbuf;
extern unsigned char *_bufendtab[];
extern unsigned char _sibuf[], _sobuf[];
# 222 "/usr/include/stdio.h" 3
extern int remove(const char *);
extern int rename(const char *, const char *);
extern FILE *tmpfile(void);
extern char *tmpnam(char *);
extern int fclose(FILE *);
extern int fflush(FILE *);
extern FILE *fopen(const char *, const char *);
extern FILE *freopen(const char *, const char *, FILE *);
extern void setbuf(FILE *, char *);
extern void setbuffer(FILE *, char *, size_t);
extern int setlinebuf(FILE *);
extern int setvbuf(FILE *, char *, int, size_t);
extern int fprintf(FILE *, const char *, ...);
extern int fscanf(FILE *, const char *, ...);
extern int printf(const char *, ...);
extern int scanf(const char *, ...);
extern int snprintf(char *, size_t, const char *, ...);
extern int sprintf(char *, const char *, ...);
extern int sscanf(const char *, const char *, ...);
extern int vfprintf(FILE *, const char *, __va_list);
extern int vprintf(const char *, __va_list);
extern int vsnprintf(char *, size_t, const char *, __va_list);
extern int vsprintf(char *, const char *, __va_list);
extern int fgetc(FILE *);
extern char *fgets(char *, int, FILE *);
extern int fputc(int, FILE *);
extern int fputs(const char *, FILE *);
extern int getc(FILE *);
extern int getchar(void);
extern char *gets(char *);
extern int putc(int, FILE *);
extern int putchar(int);
extern int puts(const char *);
extern int ungetc(int, FILE *);
extern size_t fread(void *, size_t, size_t, FILE *);
extern size_t fwrite(const void *, size_t, size_t, FILE *);
extern int fgetpos(FILE *, fpos_t *);
extern int fseek(FILE *, long, int);
extern int fsetpos(FILE *, const fpos_t *);
extern long ftell(FILE *);
extern void rewind(FILE *);
extern void clearerr(FILE *);
extern int feof(FILE *);
extern int ferror(FILE *);
extern void perror(const char *);
extern int __filbuf(FILE *);
extern int __flsbuf(int, FILE *);
extern FILE *fdopen(int, const char *);
extern char *ctermid(char *);
extern int fileno(FILE *);
# 319 "/usr/include/stdio.h" 3
extern FILE *popen(const char *, const char *);
extern char *cuserid(char *);
extern char *tempnam(const char *, const char *);
extern int getopt(int, char *const *, const char *);
extern int getsubopt(char **, char *const *, char **);
extern char *optarg;
extern int optind, opterr, optopt;
extern int getw(FILE *);
extern int putw(int, FILE *);
extern int pclose(FILE *);
extern int fseeko(FILE *, off_t, int);
extern off_t ftello(FILE *);
extern FILE *fopen64(const char *, const char *);
extern FILE *freopen64(const char *, const char *, FILE *);
extern FILE *tmpfile64(void);
extern int fgetpos64(FILE *, fpos64_t *);
extern int fsetpos64(FILE *, const fpos64_t *);
extern int fseeko64(FILE *, off64_t, int);
extern off64_t ftello64(FILE *);
# 467 "/usr/include/stdio.h" 3
# 515 "/usr/include/stdio.h" 3
# 1 "bug.c" 2
# 1 "/usr/include/string.h" 1 3
#pragma ident "@(#)string.h 1.19 96/03/12 SMI"
extern void *memcpy(void *, const void *, size_t);
extern void *memmove(void *, const void *, size_t);
extern char *strcpy(char *, const char *);
extern char *strncpy(char *, const char *, size_t);
extern char *strcat(char *, const char *);
extern char *strncat(char *, const char *, size_t);
extern int memcmp(const void *, const void *, size_t);
extern int strcmp(const char *, const char *);
extern int strcoll(const char *, const char *);
extern int strncmp(const char *, const char *, size_t);
extern size_t strxfrm(char *, const char *, size_t);
extern void *memchr(const void *, int, size_t);
extern char *strchr(const char *, int);
extern size_t strcspn(const char *, const char *);
extern char *strpbrk(const char *, const char *);
extern char *strrchr(const char *, int);
extern size_t strspn(const char *, const char *);
extern char *strstr(const char *, const char *);
extern char *strtok(char *, const char *);
extern void *memset(void *, int, size_t);
extern char *strerror(int);
extern size_t strlen(const char *);
extern void *memccpy(void *, const void *, int, size_t);
extern char *strsignal(int);
extern int ffs(int);
extern int strcasecmp(const char *, const char *);
extern int strncasecmp(const char *, const char *, size_t);
extern char *strdup(const char *);
# 136 "/usr/include/string.h" 3
# 2 "bug.c" 2
enum stat_type
{
st_i,
st_ui,
st_l,
};
union stat_data
{
int i;
unsigned int ui;
long long l;
};
struct stat
{
char name[20];
enum stat_type type;
union stat_data data;
};
struct stat_sort
{
int n_stats;
struct stat stats[4];
};
struct db
{
int length;
long long lengthtime;
unsigned int n_direct;
unsigned int n_queue;
};
struct db gdb;
struct stat_sort gs;
int main ()
{
struct db *db = &gdb;
struct stat_sort *s = &gs;
if (s == 0 )
return 1;
s->n_stats = 4;
printf ("begin\n");
do { strcpy (s->stats[ 0 ].name, "length" ); s->stats[ 0 ].type = st_i ; s->stats[ 0 ].data. i = db->length ; } while (0) ;
do { strcpy (s->stats[ 1 ].name, "lengthtime" ); s->stats[ 1 ].type = st_l ; s->stats[ 1 ].data. l = db->lengthtime ; } while (0) ;
do { strcpy (s->stats[ 2 ].name, "direct" ); s->stats[ 2 ].type = st_ui ; s->stats[ 2 ].data. ui = db->n_direct ; } while (0) ;
do { strcpy (s->stats[ 3 ].name, "queue" ); s->stats[ 3 ].type = st_ui ; s->stats[ 3 ].data. ui = db->n_queue ; } while (0) ;
printf ("end\n");
return 0;
}
.file "bug.c"
.stabs "/work/splice/de614/tmp/GCCBUG/",100,0,0,.LLtext0
.stabs "bug.c",100,0,0,.LLtext0
.section ".text"
.LLtext0:
.stabs "gcc2_compiled.", 0x3c, 0, 0, 0
.stabs "int:t(0,1)=r(0,1);0020000000000;0017777777777;",128,0,0,0
.stabs "char:t(0,2)=r(0,2);0;127;",128,0,0,0
.stabs "long int:t(0,3)=r(0,1);0020000000000;0017777777777;",128,0,0,0
.stabs "unsigned int:t(0,4)=r(0,1);0000000000000;0037777777777;",128,0,0,0
.stabs "long unsigned int:t(0,5)=r(0,1);0000000000000;0037777777777;",128,0,0,0
.stabs "long long int:t(0,6)=r(0,1);01000000000000000000000;0777777777777777777777;",128,0,0,0
.stabs "long long unsigned int:t(0,7)=r(0,1);0000000000000;01777777777777777777777;",128,0,0,0
.stabs "short int:t(0,8)=r(0,8);-32768;32767;",128,0,0,0
.stabs "short unsigned int:t(0,9)=r(0,9);0;65535;",128,0,0,0
.stabs "signed char:t(0,10)=r(0,10);-128;127;",128,0,0,0
.stabs "unsigned char:t(0,11)=r(0,11);0;255;",128,0,0,0
.stabs "float:t(0,12)=r(0,1);4;0;",128,0,0,0
.stabs "double:t(0,13)=r(0,1);8;0;",128,0,0,0
.stabs "long double:t(0,14)=r(0,1);16;0;",128,0,0,0
.stabs "complex int:t(0,15)=s8real:(0,1),0,32;imag:(0,1),32,32;;",128,0,0,0
.stabs "complex float:t(0,16)=r(0,16);4;0;",128,0,0,0
.stabs "complex double:t(0,17)=r(0,17);8;0;",128,0,0,0
.stabs "complex long double:t(0,18)=r(0,18);16;0;",128,0,0,0
.stabs "void:t(0,19)=(0,19)",128,0,0,0
.stabs "/usr/include/stdio.h",130,0,0,0
.stabs "/usr/include/sys/feature_tests.h",130,0,0,0
.stabn 162,0,0,0
.stabs "/usr/include/sys/va_list.h",130,0,0,0
.stabs "__va_list:t(3,1)=(3,2)=*(0,19)",128,0,44,0
.stabn 162,0,0,0
.stabs "size_t:t(1,1)=(0,4)",128,0,34,0
.stabs "__longlong_t:t(1,2)=(0,6)",128,0,44,0
.stabs "off_t:t(1,3)=(0,3)",128,0,58,0
.stabs "off64_t:t(1,4)=(1,2)",128,0,63,0
.stabs "fpos_t:t(1,5)=(0,3)",128,0,69,0
.stabs "fpos64_t:t(1,6)=(1,2)",128,0,74,0
.stabs "FILE:t(1,7)=(1,8)=s16_cnt:(0,1),0,32;_ptr:(1,9)=*(0,11),32,32;_base:(1,9),64,32;_flag:(0,11),96,8;_file:(0,11),104,8;;",128,0,186,0
.stabn 162,0,0,0
.stabs "/usr/include/string.h",130,0,0,0
.stabn 162,0,0,0
.stabs "stat_type:T(0,20)=est_i:0,st_ui:1,st_l:2,;",128,0,0,0
.stabs "stat_data:T(0,21)=u8i:(0,1),0,32;ui:(0,4),0,32;l:(0,6),0,64;;",128,0,0,0
.stabs "stat:T(0,22)=s32name:(0,23)=ar(0,1);0;19;(0,2),0,160;type:(0,20),160,32;data:(0,21),192,64;;",128,0,0,0
.stabs "stat_sort:T(0,24)=s136n_stats:(0,1),0,32;stats:(0,25)=ar(0,1);0;3;(0,22),64,1024;;",128,0,0,0
.stabs "db:T(0,26)=s24length:(0,1),0,32;lengthtime:(0,6),64,64;n_direct:(0,4),128,32;n_queue:(0,4),160,32;;",128,0,0,0
.section ".rodata"
.align 8
.LLC0:
.asciz "begin\n"
.align 8
.LLC1:
.asciz "length"
.align 8
.LLC2:
.asciz "lengthtime"
.align 8
.LLC3:
.asciz "direct"
.align 8
.LLC4:
.asciz "queue"
.align 8
.LLC5:
.asciz "end\n"
.section ".text"
.align 4
.stabs "main:F(0,1)",36,0,49,main
.global main
.type main,#function
.proc 04
main:
.stabn 68,0,49,.LLM1-main
.LLM1:
!#PROLOGUE# 0
save %sp, -120, %sp
!#PROLOGUE# 1
.stabn 68,0,50,.LLM2-main
.LLM2:
.LLBB2:
.stabn 68,0,51,.LLM3-main
.LLM3:
sethi %hi(gs), %o2
.stabn 68,0,51,.LLM4-main
.LLM4:
or %o2, %lo(gs), %g1
.stabn 68,0,53,.LLM5-main
.LLM5:
cmp %g1, 0
be .LL3
sethi %hi(gdb), %i5
.stabn 68,0,56,.LLM6-main
.LLM6:
mov 4, %o1
.stabn 68,0,58,.LLM7-main
.LLM7:
sethi %hi(.LLC0), %o0
st %g1, [%fp-20]
.stabn 68,0,56,.LLM8-main
.LLM8:
st %o1, [%o2+%lo(gs)]
.stabn 68,0,58,.LLM9-main
.LLM9:
or %o0, %lo(.LLC0), %o0
.stabn 68,0,58,.LLM10-main
.LLM10:
call printf, 0
mov 0, %i0
.stabn 68,0,62,.LLM11-main
.LLM11:
sethi %hi(.LLC4), %o7
.stabn 68,0,61,.LLM12-main
.LLM12:
mov 1, %o0
.stabn 68,0,60,.LLM13-main
.LLM13:
sethi %hi(.LLC2), %o2
.stabn 68,0,61,.LLM14-main
.LLM14:
st %o0, [%g1+92]
.stabn 68,0,62,.LLM15-main
.LLM15:
or %o7, %lo(.LLC4), %l0
.stabn 68,0,59,.LLM16-main
.LLM16:
sethi %hi(.LLC1), %o1
.stabn 68,0,62,.LLM17-main
.LLM17:
lduh [%l0+4], %i3
.stabn 68,0,60,.LLM18-main
.LLM18:
or %o2, %lo(.LLC2), %l2
.stabn 68,0,61,.LLM19-main
.LLM19:
sethi %hi(.LLC3), %o3
.stabn 68,0,60,.LLM20-main
.LLM20:
ldub [%l2+10], %l6
.stabn 68,0,61,.LLM21-main
.LLM21:
or %o3, %lo(.LLC3), %l3
.stabn 68,0,60,.LLM22-main
.LLM22:
mov 2, %i4
lduh [%l2+8], %l0
.stabn 68,0,59,.LLM23-main
.LLM23:
or %o1, %lo(.LLC1), %l1
.stabn 68,0,63,.LLM24-main
.LLM24:
sethi %hi(.LLC5), %o0
.stabn 68,0,60,.LLM25-main
.LLM25:
mov %i5, %l2
.stabn 68,0,59,.LLM26-main
.LLM26:
ld [%o1+%lo(.LLC1)], %l5
.stabn 68,0,63,.LLM27-main
.LLM27:
or %o0, %lo(.LLC5), %o0
.stabn 68,0,60,.LLM28-main
.LLM28:
ldd [%o2+%lo(.LLC2)], %o4
or %l2, %lo(gdb), %l2
.stabn 68,0,61,.LLM29-main
.LLM29:
ld [%o3+%lo(.LLC3)], %l7
.stabn 68,0,59,.LLM30-main
.LLM30:
lduh [%l1+4], %o1
ldub [%l1+6], %l4
.stabn 68,0,62,.LLM31-main
.LLM31:
ld [%o7+%lo(.LLC4)], %i2
.stabn 68,0,60,.LLM32-main
.LLM32:
ldd [%l2+8], %o2
.stabn 68,0,61,.LLM33-main
.LLM33:
ldub [%l3+6], %i1
lduh [%l3+4], %l1
.stabn 68,0,59,.LLM34-main
.LLM34:
ld [%fp-20], %g1
ld [%i5+%lo(gdb)], %o7
.stabn 68,0,61,.LLM35-main
.LLM35:
ld [%l2+16], %l2
.stabn 68,0,60,.LLM36-main
.LLM36:
std %o2, [%g1+64]
.stabn 68,0,62,.LLM37-main
.LLM37:
mov %i5, %o2
.stabn 68,0,59,.LLM38-main
.LLM38:
st %l5, [%g1+8]
sth %o1, [%g1+12]
.stabn 68,0,62,.LLM39-main
.LLM39:
or %o2, %lo(gdb), %o2
.stabn 68,0,59,.LLM40-main
.LLM40:
stb %l4, [%g1+14]
st %o7, [%g1+32]
.stabn 68,0,60,.LLM41-main
.LLM41:
std %o4, [%g1+40]
sth %l0, [%g1+48]
stb %l6, [%g1+50]
.stabn 68,0,61,.LLM42-main
.LLM42:
st %l7, [%g1+72]
sth %l1, [%g1+76]
stb %i1, [%g1+78]
st %l2, [%g1+96]
.stabn 68,0,62,.LLM43-main
.LLM43:
st %i2, [%g1+104]
sth %i3, [%g1+108]
ld [%g1+92], %l3
.stabn 68,0,60,.LLM44-main
.LLM44:
st %i4, [%g1+60]
.stabn 68,0,62,.LLM45-main
.LLM45:
st %l3, [%g1+124]
ld [%o2+20], %o1
.stabn 68,0,59,.LLM46-main
.LLM46:
st %g0, [%g1+28]
.stabn 68,0,63,.LLM47-main
.LLM47:
call printf, 0
st %o1, [%g1+128]
.stabn 68,0,65,.LLM48-main
.LLM48:
b,a .LL20
.LL3:
.stabn 68,0,54,.LLM49-main
.LLM49:
mov 1, %i0
.LL20:
.stabn 68,0,66,.LLM50-main
.LLM50:
.LLBE2:
ret
restore
.LLfe1:
.size main,.LLfe1-main
.stabs "s:r(0,27)=*(0,24)",64,0,51,1
.stabn 192,0,0,.LLBB2-main
.stabn 224,0,0,.LLBE2-main
.LLscope0:
.stabs "",36,0,0,.LLscope0-main
.stabs "gdb:G(0,26)",32,0,45,0
.common gdb,24,8
.stabs "gs:G(0,24)",32,0,46,0
.common gs,136,8
.text
.stabs "",100,0,0,Letext
Letext:
.ident "GCC: (GNU) 2.95.1 19990816 (release)"