Thread View: gnu.gcc.bug
1 messages
1 total messages
Started by Tom Quinn
Thu, 22 Sep 1988 15:10
bug in sparc gcc 1.28
Author: 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;
}
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads