This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

program compiled incorrectly by gcc


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)"

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]