Article View: gnu.gcc.bug
Article #1691bug in sparc gcc 1.28
From: Tom Quinn
Date: Thu, 22 Sep 1988 15:10
Date: Thu, 22 Sep 1988 15:10
87 lines
2952 bytes
2952 bytes
The following code points out an alignment bug in sparc gcc version 1.28.
The static structure zero_time is given an alignment of 4, but an
"ldd" instruction, which requires an alignment of 8, is used to access
it, giving a Bus Error if you are unlucky. A quick fix would be in
output-sparc.c:output_move_double(): Delete the code following the
comment about knowing the structure is double aligned.
Tom Quinn Canadian Institute for Theoretical Astrophysics
trq@moose.cita.toronto.edu
SOON TO BE trq@moose.cita.utoronto.ca
UUCP - decvax!utgpu!moose!trq
BITNET - quinn@utorphys.bitnet
ARPA - trq%moose.cita.toronto.edu@relay.cs.net
The compile:
gcc -S -g -v -sun4 -c NextEvent.c
gcc version 1.28
/usr/local/lib/gcc-cpp -v -undef -D__GNU__ -D__GNUC__ -Dsparc -Dsun -Dunix NextEvent.c /tmp/cca14379.cpp
GNU CPP version 1.28
/usr/local/lib/gcc-cc1 /tmp/cca14379.cpp -quiet -dumpbase NextEvent.c -g -version -o NextEvent.s
GNU C version 1.28 (sparc) compiled by GNU C version 1.28.
Relavent assembler output:
.data
.align 4 <<< This should be 8
_zero_time.0:
.word 0
.word 0
.
.
.
.stabn 68,0,45,LM10
LM10:
set _zero_time.0,%l3
ldd [%l3],%o2 <<< Or this should be two instructions
std %o2,[%fp-72]
The code:
typedef char Boolean;
struct timeval {
long tv_sec;
long tv_usec;
};
struct timezone {
int tz_minuteswest;
int tz_dsttime;
};
typedef long xfd_mask;
typedef struct xfd_set {
xfd_mask fds_bits[(((256 )+(( (sizeof(xfd_mask) * 8))-1))/( (sizeof(xfd_mask) * 8))) ];
} xfd_set;
Boolean
_XtwaitForSomething(ignoreTimers, ignoreInputs, block, howlong)
Boolean ignoreTimers;
Boolean ignoreInputs;
Boolean block;
unsigned long *howlong;
{
struct timezone cur_timezone;
struct timeval cur_time;
struct timeval start_time;
struct timeval wait_time;
struct timeval new_time;
struct timeval time_spent;
struct timeval max_wait_time;
static struct timeval zero_time = { 0 , 0};
register struct timeval *wait_time_ptr;
xfd_set rmaskfd, wmaskfd, emaskfd;
static xfd_set zero = { 0 };
register int nfound, i;
Boolean ret;
if(block) {
(void) gettimeofday (&cur_time, &cur_timezone);
start_time = cur_time;
if(howlong == 0 ) {
wait_time_ptr = 0;
} else {
max_wait_time.tv_sec = *howlong/1000;
max_wait_time.tv_usec = (*howlong %1000)*1000;
wait_time_ptr = &max_wait_time;
}
} else {
max_wait_time = zero_time;
wait_time_ptr = &max_wait_time;
}
return ret;
}
Technical Details
Message-ID:
<8809221510.AA24703@moose.cita.toronto.edu>Path:
arc1-ca.pugleaf.net!utzoo!telly!ddsw1!lll-winken!killer!mit-eddie!bloom-beacon!tut.cis.ohio-state.edu!moose.cita.toronto.edu!trqShow Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!utzoo!telly!ddsw1!lll-winken!killer!mit-eddie!bloom-beacon!tut.cis.ohio-state.edu!moose.cita.toronto.edu!trq From: trq@moose.cita.toronto.edu (Tom Quinn) Newsgroups: gnu.gcc.bug Subject: bug in sparc gcc 1.28 Message-ID: <8809221510.AA24703@moose.cita.toronto.edu> Date: 22 Sep 88 15:10:15 GMT Sender: daemon@tut.cis.ohio-state.edu Distribution: gnu Organization: GNUs Not Usenet Lines: 86