tuck@CS.UNC.EDU (Russ Tuck) (07/07/89)
Return-Receipt-To: tuck@cs.unc.edu Enclosed is a shar file. The bug report is in the leading comment of the .c file (tuck0.c), and includes my address. Since I haven't found a work-around yet, I'd appreciate any advice, comments, work-arounds or fix. I appreciate all the good work that has gone into developing g++. Russ #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # tuck0.c # tuck0.s # tuck0.script # This archive created: Thu Jul 6 15:55:49 1989 # By: Russ Tuck () export PATH; PATH=/bin:$PATH echo shar: extracting "'tuck0.c'" '(1627 characters)' if test -f 'tuck0.c' then echo shar: will not over-write existing file "'tuck0.c'" else sed 's/^ X//' << \SHAR_EOF > 'tuck0.c' X/* G++ bug report. X This is file "tuck0.c". X Submitted by: X Russ Tuck internet: tuck@cs.unc.edu X Computer Science Dept., Sitterson Hall csnet: tuck@unc X University of North Carolina uucp: ...!mcnc!unc!tuck X Chapel Hill, NC 27599-3175, USA Phone: (919)962-1755 or 962-1932 X g++ version: 1.35.1- X cpu: Sun-4/280 (sparc) X os: SunOS Sys4-3.2 X date: 6 July 1989 X Summary: X 1) Particular expressions involving division (/) are sometimes evaluated X incorrectly at run time. (It appears to me that reg %o1 is not being X set before calling .div; it sometimes happens to have the right value.) X 2) g++ -O tuck0.c gets "fatal signal 4" in cc1plus X X I have not found a work-around yet. X X Enclosures: X tuck0.s -- assembler output from "g++ -g -S tuck0.c". X tuck0.script -- script showing compile and run of tuck0.c X*/ X X#include <stdio.h> X Xmain() X{ X printf("(5 + 32) / 32 evaluates to %d.\n", (5 + 32) / 32); X int ti = 32; X printf("(5 + ti) / ti evaluates to %d.\n", (5 + ti) / ti); X printf("(5 + ti) / ti evaluates to %d.\n", (5 + ti) / ti); X unsigned tu = 32; X printf("(5 + tu) / tu evaluates to %u.\n", (5 + tu) / tu); X printf("(5 + tu) / tu evaluates to %u.\n", (5 + tu) / tu); X X printf("37 / 32 evaluates to %d.\n", 37 / 32); X printf("37 / tu evaluates to %u.\n", 37 / tu); X printf("37 / tu evaluates to %u.\n", 37 / tu); X printf("37 / ti evaluates to %d.\n", 37 / ti); X printf("37 / ti evaluates to %d.\n", 37 / ti); X X int ti0 = 32; X int ti1 = 5 + ti0; X int ti2 = ti1 / ti0; X printf("ti0 = %d, ti1 = %d, ti2 = %d\n", ti0, ti1, ti2); X} SHAR_EOF if test 1627 -ne "`wc -c < 'tuck0.c'`" then echo shar: error transmitting "'tuck0.c'" '(should have been 1627 characters)' fi fi # end of overwriting check echo shar: extracting "'tuck0.s'" '(3557 characters)' if test -f 'tuck0.s' then echo shar: will not over-write existing file "'tuck0.s'" else sed 's/^ X//' << \SHAR_EOF > 'tuck0.s' Xgcc_compiled.: X .stabs "tuck0.c",100,0,0,Ltext XLtext: X.stabs "int:t1=r1;-2147483648;2147483647;",128,0,0,0 X.stabs "char:t2=r2;0;127;",128,0,0,0 X.stabs "long int:t3=r1;-2147483648;2147483647;",128,0,0,0 X.stabs "unsigned int:t4=r1;0;-1;",128,0,0,0 X.stabs "long unsigned int:t5=r1;0;-1;",128,0,0,0 X.stabs "short int:t6=r1;-32768;32767;",128,0,0,0 X.stabs "long long int:t7=r1;0;-1;",128,0,0,0 X.stabs "short unsigned int:t8=r1;0;65535;",128,0,0,0 X.stabs "long long unsigned int:t9=r1;0;-1;",128,0,0,0 X.stabs "signed char:t10=r1;-128;127;",128,0,0,0 X.stabs "unsigned char:t11=r1;0;255;",128,0,0,0 X.stabs "float:t12=r1;4;0;",128,0,0,0 X.stabs "double:t13=r1;8;0;",128,0,0,0 X.stabs "long double:t14=r1;8;0;",128,0,0,0 X.stabs "void:t15=15",128,0,0,0 X.stabs "$vtbl_ptr_type:t16=s8delta:/26,0,16;index:/26,16,16;pfn:/217=*15,32,32;delta2:/26,32,16;;~;",128,0,0,0 X.text XLC0: X .ascii "(5 + 32) / 32 evaluates to %d.\12\0" XLC1: X .ascii "(5 + ti) / ti evaluates to %d.\12\0" XLC2: X .ascii "(5 + tu) / tu evaluates to %u.\12\0" XLC3: X .ascii "37 / 32 evaluates to %d.\12\0" XLC4: X .ascii "37 / tu evaluates to %u.\12\0" XLC5: X .ascii "37 / ti evaluates to %d.\12\0" XLC6: X .ascii "ti0 = %d, ti1 = %d, ti2 = %d\12\0" X .align 4 X.global _main X .proc 1 X_main: X.stabn 68,0,28,LM1 XLM1: X !#PROLOGUE# 0 X save %sp,-152,%sp X !#PROLOGUE# 1 XLBB2: X.stabn 68,0,29,LM2 XLM2: X sethi %hi(LC0),%o0 X or %lo(LC0),%o0,%o0 X mov 1,%o1 X call _printf,0 X nop X.stabn 68,0,30,LM3 XLM3: X mov 32,%o4 X st %o4,[%fp-20] X.stabn 68,0,31,LM4 XLM4: X ld [%fp-20],%o0 X add %o0,5,%o0 X call .div,0 X nop X mov %o0,%o1 X sethi %hi(LC1),%o0 X or %lo(LC1),%o0,%o0 X mov %o1,%o1 X call _printf,0 X nop X.stabn 68,0,32,LM5 XLM5: X ld [%fp-20],%o0 X add %o0,5,%o0 X call .div,0 X nop X mov %o0,%o1 X sethi %hi(LC1),%o0 X or %lo(LC1),%o0,%o0 X mov %o1,%o1 X call _printf,0 X nop X.stabn 68,0,33,LM6 XLM6: X mov 32,%o4 X st %o4,[%fp-28] X.stabn 68,0,34,LM7 XLM7: X ld [%fp-28],%o0 X add %o0,5,%o0 X call .udiv,0 X nop X mov %o0,%o1 X sethi %hi(LC2),%o0 X or %lo(LC2),%o0,%o0 X mov %o1,%o1 X call _printf,0 X nop X.stabn 68,0,35,LM8 XLM8: X ld [%fp-28],%o0 X add %o0,5,%o0 X call .udiv,0 X nop X mov %o0,%o1 X sethi %hi(LC2),%o0 X or %lo(LC2),%o0,%o0 X mov %o1,%o1 X call _printf,0 X nop X.stabn 68,0,37,LM9 XLM9: X sethi %hi(LC3),%o0 X or %lo(LC3),%o0,%o0 X mov 1,%o1 X call _printf,0 X nop X.stabn 68,0,38,LM10 XLM10: X call .udiv,0 X nop X mov %o0,%o1 X sethi %hi(LC4),%o0 X or %lo(LC4),%o0,%o0 X mov %o1,%o1 X call _printf,0 X nop X.stabn 68,0,39,LM11 XLM11: X call .udiv,0 X nop X mov %o0,%o1 X sethi %hi(LC4),%o0 X or %lo(LC4),%o0,%o0 X mov %o1,%o1 X call _printf,0 X nop X.stabn 68,0,40,LM12 XLM12: X call .div,0 X nop X mov %o0,%o1 X sethi %hi(LC5),%o0 X or %lo(LC5),%o0,%o0 X mov %o1,%o1 X call _printf,0 X nop X.stabn 68,0,41,LM13 XLM13: X call .div,0 X nop X mov %o0,%o1 X sethi %hi(LC5),%o0 X or %lo(LC5),%o0,%o0 X mov %o1,%o1 X call _printf,0 X nop X.stabn 68,0,43,LM14 XLM14: X mov 32,%o4 X st %o4,[%fp-36] X.stabn 68,0,44,LM15 XLM15: X ld [%fp-36],%o0 X add %o0,5,%o0 X st %o0,[%fp-44] X.stabn 68,0,45,LM16 XLM16: X call .div,0 X nop X mov %o0,%o0 X st %o0,[%fp-52] X.stabn 68,0,46,LM17 XLM17: X sethi %hi(LC6),%o0 X or %lo(LC6),%o0,%o0 X ld [%fp-36],%o1 X ld [%fp-44],%o2 X ld [%fp-52],%o3 X call _printf,0 X nop XLBE2: X.stabn 68,0,47,LM18 XLM18: XL1: X ret X restore X.stabs "_iobuf:T18=s20_cnt:/21,0,32;_ptr:/219=*2,32,32;_base:/219,64,32;_bufsiz:/21,96,32;_flag:/26,128,16;_file:/22,144,8;;~;",128,0,0,0 X.stabs "_iobuf:t18",128,0,0,0 X.stabs "main:F1",36,0,0,_main X.stabs "ti:1",128,0,0,-20 X.stabs "tu:4",128,0,0,-28 X.stabs "ti0:1",128,0,0,-36 X.stabs "ti1:1",128,0,0,-44 X.stabs "ti2:1",128,0,0,-52 X.stabn 192,0,0,LBB2 X.stabn 224,0,0,LBE2 SHAR_EOF if test 3557 -ne "`wc -c < 'tuck0.s'`" then echo shar: error transmitting "'tuck0.s'" '(should have been 3557 characters)' fi fi # end of overwriting check echo shar: extracting "'tuck0.script'" '(1614 characters)' if test -f 'tuck0.script' then echo shar: will not over-write existing file "'tuck0.script'" else sed 's/^ X//' << \SHAR_EOF > 'tuck0.script' XScript started on Thu Jul 6 15:46:01 1989 Xtuck@jason> g++ -g tuck0.c Xtuck@jason> a.out X(5 + 32) / 32 evaluates to 1. X(5 + ti) / ti evaluates to 37. X(5 + ti) / ti evaluates to 1. X(5 + tu) / tu evaluates to 37. X(5 + tu) / tu evaluates to 1. X37 / 32 evaluates to 1. X37 / tu evaluates to 24. X37 / tu evaluates to 1. X37 / ti evaluates to 24. X37 / ti evaluates to 1. Xti0 = 32, ti1 = 37, ti2 = 37 Xtuck@jason> g++ -O tuck0.c Xg++: Program cc1plus got fatal signal 4. Xtuck@jason> g++ -v -g tuck0.c Xg++ version 1.35.1- X /mu/hedlund1/gnu/lib/SUN4/gcc-cpp -+ -v -undef -D__GNU__ -D__GNUG__ -D__cplusplus -Dsparc -Dsun -Dunix -D__sparc__ -D__sun__ -D__unix__ tuck0.c /tmp/cca09872.cpp XGNU CPP version 1.35 X /mu/hedlund1/gnu/lib/SUN4/gcc-cc1plus /tmp/cca09872.cpp -quiet -dumpbase tuck0.c -noreg -version -G -o /tmp/cca09872.s XGNU C++ version 1.35.1- (sparc) compiled by GNU C version 1.35. X as /tmp/cca09872.s -o tuck0.o X /mu/hedlund1/gnu/lib/SUN4/gcc-ld++ -C /mu/hedlund1/gnu/lib/SUN4/gcc-crt0+.o tuck0.o -lg++ /mu/hedlund1/gnu/lib/SUN4/gcc-gnulib -lg -lc Xtuck@jason> echo "CC (AT&T cfront 1.2.1) gives correct output" XCC (AT&T cfront 1.2.1) gives correct output Xtuck@jason> CC tuck0.c Xtuck@jason> a.out X(5 + 32) / 32 evaluates to 1. X(5 + ti) / ti evaluates to 1. X(5 + ti) / ti evaluates to 1. X(5 + tu) / tu evaluates to 1. X(5 + tu) / tu evaluates to 1. X37 / 32 evaluates to 1. X37 / tu evaluates to 1. X37 / tu evaluates to 1. X37 / ti evaluates to 1. X37 / ti evaluates to 1. Xti0 = 32, ti1 = 37, ti2 = 1 Xtuck@jason> g++ -g -S tuck0.c Xtuck@jason> ^D Xscript done on Thu Jul 6 15:48:22 1989 SHAR_EOF if test 1614 -ne "`wc -c < 'tuck0.script'`" then echo shar: error transmitting "'tuck0.script'" '(should have been 1614 characters)' fi fi # end of overwriting check # End of shell archive exit 0