🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

1 total messages Started by Andrew J. Schorr Wed, 27 Nov 1996 00:00
possible gcc 2.7.2 bug on sparc/solaris 2.5.1
#6102
Author: Andrew J. Schorr
Date: Wed, 27 Nov 1996 00:00
576 lines
12103 bytes
I am having a problem with gcc version 2.7.2 on a Sun SPARCstation 20.

uname -a:
SunOS ead32 5.5.1 Generic_103640-03 sun4m sparc sun4m

gcc -v:
Reading specs from /extras/local/gnu/gcc-2.7.2/lib/gcc-lib/sparc-sun-solaris2.5.1/2.7.2/specs
gcc version 2.7.2

I built a shared library that caused a program to get a SEGV, and, upon
further investigation, I found that one of the functions in the library
would work fine when compiled with -fpic, but would cause a core
dump when compiled with -O -fpic.

So, there is a problem when gcc is invoked this way:
   gcc -msupersparc  -O -fpic
But everything works OK when -O is not supplied, or if -fpic is not used.

In fact, it turns out that when -O is not used,
the assembler produced is essentially identical with and without -fpic:

   schorr@ead32: diff sparc/bug.nopic.s sparc/bug.pic.s
   11d10
   <       !#PROLOGUE# 1

But, when -O is added, there is a difference in the result:

   schorr@ead32: diff sparc/bug.nopic.O.s sparc/bug.pic.O.s
   16d15
   <       !#PROLOGUE# 1
   38,39c37,38
   <       sethi %hi(.LLC0),%o2
   <       ldd [%o2+%lo(.LLC0)],%f2
   ---
   >       ld [%l7+.LLC0],%o2
   >       ldd [%o2],%f2

I do not understand SPARC assembly language, but this difference ends up
causing my program to dump core with a segmentation violation.
Here is the source code of the problematic function (and yes, I know it is
a really stupid function, but the person who wrote it no longer works
here; and yes, when I rewrite the function in a more intelligent fashion,
the problem does go away):

extern double ceil (double);
extern double floor (double);

typedef enum {
   DGPlotterMMTPMIN,
   DGPlotterMMTPMAX
} DGPlotterMMTPType;

double
CalDateMMTP(type, min, max, ticFreq, mult)
   DGPlotterMMTPType    type;
   double               min;
   double               max;
   double               ticFreq;
   int                  mult;
{
   if (type == DGPlotterMMTPMIN) {
      if (mult == 7) {
	 ticFreq *= mult;
	 return ceil(min/ticFreq) * ticFreq; /* day 0 was Sunday */
      }
      else {
	 ticFreq *= mult;
	 return ceil(min/ticFreq) * ticFreq;
      }
   }
   else {
      if (mult == 7) {
	 ticFreq *= mult;
	 return floor(max/ticFreq) * ticFreq;
      }
      else {
	 ticFreq *= mult;
	 return floor(max/ticFreq) * ticFreq;
      }
   }
}

I am including below the various assembler files produced by my compiler.
They were produced as follows:

    gcc -O -fpic -S bug.c -o bug.pic.O.s
    gcc -O -S bug.c -o bug.nopic.O.s
    gcc -S bug.c -o bug.nopic.s
    gcc -fpic -S bug.c -o bug.pic.s

Thank you for your help,
Andy

=============================
Andrew Schorr, SVP
Daiwa Securities America Inc.
Financial Square
32 Old Slip, 12th Floor
New York, NY 10005-3538

e-mail: schorr@ead.dsa.com
phone:  212-612-6574
fax:    212-612-7115

---- Cut Here and unpack ----
#!/bin/sh
# shar:	Shell Archiver  (v1.22)
#
#	Run the following text with /bin/sh to create:
#	  bug.nopic.O.s
#	  bug.nopic.s
#	  bug.pic.O.s
#	  bug.pic.s
#
if test -f bug.nopic.O.s; then echo "File bug.nopic.O.s exists"; else
echo "x - extracting bug.nopic.O.s (Text)"
sed 's/^X//' << 'SHAR_EOF' > bug.nopic.O.s &&
X	.file	"bug.c"
Xgcc2_compiled.:
X.section	".rodata"
X	.align 8
X.LLC0:
X	.long	0x401c0000
X	.long	0x0
X.section	".text"
X	.align 4
X	.global CalDateMMTP
X	.type	 CalDateMMTP,#function
X	.proc	07
XCalDateMMTP:
X	!#PROLOGUE# 0
X	save %sp,-120,%sp
X	!#PROLOGUE# 1
X	st %i1,[%fp-16]
X	st %i2,[%fp-12]
X	ldd [%fp-16],%f8
X	fmovs %f8,%f6
X	fmovs %f9,%f7
X	st %i3,[%fp-16]
X	st %i4,[%fp-12]
X	ldd [%fp-16],%f8
X	fmovs %f8,%f4
X	fmovs %f9,%f5
X	st %i5,[%fp+88]
X	ldd [%fp+88],%f8
X	std %f8,[%fp-24]
X	cmp %i0,0
X	bne .LL2
X	ld [%fp+96],%f2
X	st %f2,[%fp-16]
X	ld [%fp-16],%o2
X	cmp %o2,7
X	bne,a .LL3
X	fitod %f2,%f2
X	sethi %hi(.LLC0),%o2
X	ldd [%o2+%lo(.LLC0)],%f2
X	fmuld %f8,%f2,%f8
X	std %f8,[%fp-24]
X	fdivd %f6,%f8,%f8
X	std %f8,[%fp-16]
X	call ceil,0
X	ldd [%fp-16],%o0
X	b .LL10
X	ldd [%fp-24],%f8
X.LL3:
X	ldd [%fp-24],%f8
X	fmuld %f8,%f2,%f8
X	std %f8,[%fp-24]
X	fdivd %f6,%f8,%f8
X	std %f8,[%fp-16]
X	call ceil,0
X	ldd [%fp-16],%o0
X	b .LL10
X	ldd [%fp-24],%f8
X.LL2:
X	st %f2,[%fp-16]
X	ld [%fp-16],%o2
X	fitod %f2,%f2
X	ldd [%fp-24],%f8
X	fmuld %f8,%f2,%f8
X	std %f8,[%fp-24]
X	fdivd %f4,%f8,%f8
X	std %f8,[%fp-16]
X	call floor,0
X	ldd [%fp-16],%o0
X	ldd [%fp-24],%f8
X.LL10:
X	fmuld %f0,%f8,%f0
X	ret
X	restore
X.LLfe1:
X	.size	 CalDateMMTP,.LLfe1-CalDateMMTP
X	.ident	"GCC: (GNU) 2.7.2"
SHAR_EOF
chmod 0644 bug.nopic.O.s || echo "restore of bug.nopic.O.s fails"
set `wc -c bug.nopic.O.s`;Sum=$1
if test "$Sum" != "1220"
then echo original size 1220, current size $Sum;fi
fi
if test -f bug.nopic.s; then echo "File bug.nopic.s exists"; else
echo "x - extracting bug.nopic.s (Text)"
sed 's/^X//' << 'SHAR_EOF' > bug.nopic.s &&
X	.file	"bug.c"
Xgcc2_compiled.:
X.section	".text"
X	.align 4
X	.global CalDateMMTP
X	.type	 CalDateMMTP,#function
X	.proc	07
XCalDateMMTP:
X	!#PROLOGUE# 0
X	save %sp,-136,%sp
X	!#PROLOGUE# 1
X	st %i0,[%fp+68]
X	st %i1,[%fp-24]
X	st %i2,[%fp-20]
X	st %i3,[%fp-32]
X	st %i4,[%fp-28]
X	st %i5,[%fp+88]
X	ldd [%fp+88],%l0
X	std %l0,[%fp-40]
X	ld [%fp+68],%o0
X	cmp %o0,0
X	bne .LL2
X	nop
X	ld [%fp+96],%o0
X	cmp %o0,7
X	bne .LL3
X	nop
X	ld [%fp+96],%f4
X	fitod %f4,%f2
X	ldd [%fp-40],%f4
X	fmuld %f4,%f2,%f2
X	std %f2,[%fp-40]
X	ldd [%fp-24],%f2
X	ldd [%fp-40],%f4
X	fdivd %f2,%f4,%f6
X	std %f6,[%fp-16]
X	ldd [%fp-16],%o2
X	mov %o2,%o0
X	mov %o3,%o1
X	call ceil,0
X	nop
X	fmovs %f0,%f2
X	fmovs %f1,%f3
X	ldd [%fp-40],%f4
X	fmuld %f2,%f4,%f2
X	fmovs %f2,%f0
X	fmovs %f3,%f1
X	b .LL1
X	nop
X	b .LL4
X	nop
X.LL3:
X	ld [%fp+96],%f4
X	fitod %f4,%f2
X	ldd [%fp-40],%f4
X	fmuld %f4,%f2,%f2
X	std %f2,[%fp-40]
X	ldd [%fp-24],%f2
X	ldd [%fp-40],%f4
X	fdivd %f2,%f4,%f6
X	std %f6,[%fp-16]
X	ldd [%fp-16],%o2
X	mov %o2,%o0
X	mov %o3,%o1
X	call ceil,0
X	nop
X	fmovs %f0,%f2
X	fmovs %f1,%f3
X	ldd [%fp-40],%f4
X	fmuld %f2,%f4,%f2
X	fmovs %f2,%f0
X	fmovs %f3,%f1
X	b .LL1
X	nop
X.LL4:
X	b .LL5
X	nop
X.LL2:
X	ld [%fp+96],%o0
X	cmp %o0,7
X	bne .LL6
X	nop
X	ld [%fp+96],%f4
X	fitod %f4,%f2
X	ldd [%fp-40],%f4
X	fmuld %f4,%f2,%f2
X	std %f2,[%fp-40]
X	ldd [%fp-32],%f2
X	ldd [%fp-40],%f4
X	fdivd %f2,%f4,%f6
X	std %f6,[%fp-16]
X	ldd [%fp-16],%o2
X	mov %o2,%o0
X	mov %o3,%o1
X	call floor,0
X	nop
X	fmovs %f0,%f2
X	fmovs %f1,%f3
X	ldd [%fp-40],%f4
X	fmuld %f2,%f4,%f2
X	fmovs %f2,%f0
X	fmovs %f3,%f1
X	b .LL1
X	nop
X	b .LL7
X	nop
X.LL6:
X	ld [%fp+96],%f4
X	fitod %f4,%f2
X	ldd [%fp-40],%f4
X	fmuld %f4,%f2,%f2
X	std %f2,[%fp-40]
X	ldd [%fp-32],%f2
X	ldd [%fp-40],%f4
X	fdivd %f2,%f4,%f6
X	std %f6,[%fp-16]
X	ldd [%fp-16],%o2
X	mov %o2,%o0
X	mov %o3,%o1
X	call floor,0
X	nop
X	fmovs %f0,%f2
X	fmovs %f1,%f3
X	ldd [%fp-40],%f4
X	fmuld %f2,%f4,%f2
X	fmovs %f2,%f0
X	fmovs %f3,%f1
X	b .LL1
X	nop
X.LL7:
X.LL5:
X.LL1:
X	ret
X	restore
X.LLfe1:
X	.size	 CalDateMMTP,.LLfe1-CalDateMMTP
X	.ident	"GCC: (GNU) 2.7.2"
SHAR_EOF
chmod 0644 bug.nopic.s || echo "restore of bug.nopic.s fails"
set `wc -c bug.nopic.s`;Sum=$1
if test "$Sum" != "1947"
then echo original size 1947, current size $Sum;fi
fi
if test -f bug.pic.O.s; then echo "File bug.pic.O.s exists"; else
echo "x - extracting bug.pic.O.s (Text)"
sed 's/^X//' << 'SHAR_EOF' > bug.pic.O.s &&
X	.file	"bug.c"
Xgcc2_compiled.:
X.section	".rodata"
X	.align 8
X.LLC0:
X	.long	0x401c0000
X	.long	0x0
X.section	".text"
X	.align 4
X	.global CalDateMMTP
X	.type	 CalDateMMTP,#function
X	.proc	07
XCalDateMMTP:
X	!#PROLOGUE# 0
X	save %sp,-120,%sp
X	st %i1,[%fp-16]
X	st %i2,[%fp-12]
X	ldd [%fp-16],%f8
X	fmovs %f8,%f6
X	fmovs %f9,%f7
X	st %i3,[%fp-16]
X	st %i4,[%fp-12]
X	ldd [%fp-16],%f8
X	fmovs %f8,%f4
X	fmovs %f9,%f5
X	st %i5,[%fp+88]
X	ldd [%fp+88],%f8
X	std %f8,[%fp-24]
X	cmp %i0,0
X	bne .LL2
X	ld [%fp+96],%f2
X	st %f2,[%fp-16]
X	ld [%fp-16],%o2
X	cmp %o2,7
X	bne,a .LL3
X	fitod %f2,%f2
X	ld [%l7+.LLC0],%o2
X	ldd [%o2],%f2
X	fmuld %f8,%f2,%f8
X	std %f8,[%fp-24]
X	fdivd %f6,%f8,%f8
X	std %f8,[%fp-16]
X	call ceil,0
X	ldd [%fp-16],%o0
X	b .LL10
X	ldd [%fp-24],%f8
X.LL3:
X	ldd [%fp-24],%f8
X	fmuld %f8,%f2,%f8
X	std %f8,[%fp-24]
X	fdivd %f6,%f8,%f8
X	std %f8,[%fp-16]
X	call ceil,0
X	ldd [%fp-16],%o0
X	b .LL10
X	ldd [%fp-24],%f8
X.LL2:
X	st %f2,[%fp-16]
X	ld [%fp-16],%o2
X	fitod %f2,%f2
X	ldd [%fp-24],%f8
X	fmuld %f8,%f2,%f8
X	std %f8,[%fp-24]
X	fdivd %f4,%f8,%f8
X	std %f8,[%fp-16]
X	call floor,0
X	ldd [%fp-16],%o0
X	ldd [%fp-24],%f8
X.LL10:
X	fmuld %f0,%f8,%f0
X	ret
X	restore
X.LLfe1:
X	.size	 CalDateMMTP,.LLfe1-CalDateMMTP
X	.ident	"GCC: (GNU) 2.7.2"
SHAR_EOF
chmod 0644 bug.pic.O.s || echo "restore of bug.pic.O.s fails"
set `wc -c bug.pic.O.s`;Sum=$1
if test "$Sum" != "1192"
then echo original size 1192, current size $Sum;fi
fi
if test -f bug.pic.s; then echo "File bug.pic.s exists"; else
echo "x - extracting bug.pic.s (Text)"
sed 's/^X//' << 'SHAR_EOF' > bug.pic.s &&
X	.file	"bug.c"
Xgcc2_compiled.:
X.section	".text"
X	.align 4
X	.global CalDateMMTP
X	.type	 CalDateMMTP,#function
X	.proc	07
XCalDateMMTP:
X	!#PROLOGUE# 0
X	save %sp,-136,%sp
X	st %i0,[%fp+68]
X	st %i1,[%fp-24]
X	st %i2,[%fp-20]
X	st %i3,[%fp-32]
X	st %i4,[%fp-28]
X	st %i5,[%fp+88]
X	ldd [%fp+88],%l0
X	std %l0,[%fp-40]
X	ld [%fp+68],%o0
X	cmp %o0,0
X	bne .LL2
X	nop
X	ld [%fp+96],%o0
X	cmp %o0,7
X	bne .LL3
X	nop
X	ld [%fp+96],%f4
X	fitod %f4,%f2
X	ldd [%fp-40],%f4
X	fmuld %f4,%f2,%f2
X	std %f2,[%fp-40]
X	ldd [%fp-24],%f2
X	ldd [%fp-40],%f4
X	fdivd %f2,%f4,%f6
X	std %f6,[%fp-16]
X	ldd [%fp-16],%o2
X	mov %o2,%o0
X	mov %o3,%o1
X	call ceil,0
X	nop
X	fmovs %f0,%f2
X	fmovs %f1,%f3
X	ldd [%fp-40],%f4
X	fmuld %f2,%f4,%f2
X	fmovs %f2,%f0
X	fmovs %f3,%f1
X	b .LL1
X	nop
X	b .LL4
X	nop
X.LL3:
X	ld [%fp+96],%f4
X	fitod %f4,%f2
X	ldd [%fp-40],%f4
X	fmuld %f4,%f2,%f2
X	std %f2,[%fp-40]
X	ldd [%fp-24],%f2
X	ldd [%fp-40],%f4
X	fdivd %f2,%f4,%f6
X	std %f6,[%fp-16]
X	ldd [%fp-16],%o2
X	mov %o2,%o0
X	mov %o3,%o1
X	call ceil,0
X	nop
X	fmovs %f0,%f2
X	fmovs %f1,%f3
X	ldd [%fp-40],%f4
X	fmuld %f2,%f4,%f2
X	fmovs %f2,%f0
X	fmovs %f3,%f1
X	b .LL1
X	nop
X.LL4:
X	b .LL5
X	nop
X.LL2:
X	ld [%fp+96],%o0
X	cmp %o0,7
X	bne .LL6
X	nop
X	ld [%fp+96],%f4
X	fitod %f4,%f2
X	ldd [%fp-40],%f4
X	fmuld %f4,%f2,%f2
X	std %f2,[%fp-40]
X	ldd [%fp-32],%f2
X	ldd [%fp-40],%f4
X	fdivd %f2,%f4,%f6
X	std %f6,[%fp-16]
X	ldd [%fp-16],%o2
X	mov %o2,%o0
X	mov %o3,%o1
X	call floor,0
X	nop
X	fmovs %f0,%f2
X	fmovs %f1,%f3
X	ldd [%fp-40],%f4
X	fmuld %f2,%f4,%f2
X	fmovs %f2,%f0
X	fmovs %f3,%f1
X	b .LL1
X	nop
X	b .LL7
X	nop
X.LL6:
X	ld [%fp+96],%f4
X	fitod %f4,%f2
X	ldd [%fp-40],%f4
X	fmuld %f4,%f2,%f2
X	std %f2,[%fp-40]
X	ldd [%fp-32],%f2
X	ldd [%fp-40],%f4
X	fdivd %f2,%f4,%f6
X	std %f6,[%fp-16]
X	ldd [%fp-16],%o2
X	mov %o2,%o0
X	mov %o3,%o1
X	call floor,0
X	nop
X	fmovs %f0,%f2
X	fmovs %f1,%f3
X	ldd [%fp-40],%f4
X	fmuld %f2,%f4,%f2
X	fmovs %f2,%f0
X	fmovs %f3,%f1
X	b .LL1
X	nop
X.LL7:
X.LL5:
X.LL1:
X	ret
X	restore
X.LLfe1:
X	.size	 CalDateMMTP,.LLfe1-CalDateMMTP
X	.ident	"GCC: (GNU) 2.7.2"
SHAR_EOF
chmod 0644 bug.pic.s || echo "restore of bug.pic.s fails"
set `wc -c bug.pic.s`;Sum=$1
if test "$Sum" != "1932"
then echo original size 1932, current size $Sum;fi
fi
exit 0
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