hilfingr%tully.Berkeley.EDU@GINGER.BERKELEY.EDU (Paul Hilfinger) (09/23/88)
The following file causes gcc 1.28 on a Sun3 to bomb when compiled with or
without -g and -O. Using a typedef fixes the problem.
The error is a segmentation fault, which occurs in lookup_name_current_level.
P. Hilfinger
------ cut here -----------
void foo( enum { parAST, parNUM, parSTR, parID, parNONE } tag )
{
}
gordon%stats.ucl.ac.uk@NSS.CS.UCL.AC.UK (Gordon Joly Statistics UCL) (03/09/89)
| ststic int iii(); | syntax error; | main() | { | printf ("hello\n"); | second syntax error | } | | The compiler just stops compiling and reporting error messages | after the ststic line, whenever I put it. | The output of the compiler under the -v option is: | (the -ansi flag does not matter.) | | gcc -ansi foo.c -v | gcc version 1.31 | /usr/local/lib/gcc-cpp -v -undef -D__GNU__ -D__GNUC__ -T -$ -D__STRICT_ANSI__ - | GNU CPP version 1.31 | /usr/local/lib/gcc-cc1 /tmp/cca00754.cpp -quiet -dumpbase foo.c -ansi -version | GNU C version 1.31 (68k, MIT syntax) compiled by GNU C version 1.31. | as -mc68020 /tmp/cca00754.s -o foo.o | ld /lib/crt0.o /lib/Mcrt1.o foo.o /usr/local/lib/gcc-gnulib -lc | Undefined: | _main | Due to an old version of bison? Note: also seen in G++. I echo the plea for BISON to have a version number. Gordon.
cruff@NIWOT.UCAR.EDU (03/29/89)
Version: 1.34
Input file: (t.c)
------------------
main() {
}
------------------
Command arguments:
gcc -a t.c
Machine files:
tm.h: tm-sun3-nfp.h
md: m68k.md
Machine:
Sun-3, SunOS 4.0.1
Description:
Produces incorrect assembler opcode for call to the function
block profiler '__bb_init_func' using the Sun assembler.
Opcode produced, 'call', should be 'jsr'.
Compiler output:
-----------------
#NO_APP
gcc_compiled.:
.text
.even
.globl _main
_main:
link a6,#0
tstl LPBX0
bne LPI0
pea LPBX0
call ___bb_init_func
addql #4,sp
LPI0:
L1:
unlk a6
rts
.data
.even
LPBX0:
.long 0
.long LPBX1
.long LPBX2
.long 0
.long 0
.long LPBX3
LPBX1:
.ascii "t.c\0"
LPBX2:
.skip 0
.text
LPBX3:
.long LPBX3
-----------------
Source fix context diff:
-----------------
*** tm-m68k.h Fri Mar 24 09:21:18 1989
--- tm-m68k.h.old Wed Mar 8 08:20:45 1989
***************
*** 632,638 ****
basic block profiling info, if that has not already been done. */
#define FUNCTION_BLOCK_PROFILER(FILE, LABELNO) \
! fprintf (FILE, "\ttstl LPBX0\n\tbne LPI%d\n\tpea LPBX0\n\tjsr ___bb_init_func\n\taddql #4,sp\nLPI%d:\n", \
LABELNO, LABELNO);
/* Output assembler code to FILE to increment the entry-count for
--- 632,638 ----
basic block profiling info, if that has not already been done. */
#define FUNCTION_BLOCK_PROFILER(FILE, LABELNO) \
! fprintf (FILE, "\ttstl LPBX0\n\tbne LPI%d\n\tpea LPBX0\n\tcall ___bb_init_func\n\taddql #4,sp\nLPI%d:\n", \
LABELNO, LABELNO);
/* Output assembler code to FILE to increment the entry-count for
-----------------
wkd@CS.UTEXAS.EDU (Bill Duttweiler) (04/01/89)
gcc-1.34 on a SUN4/110 running 4.0.1. tm.h -> tm-sparc.h md -> sparc.md The following snippet of C code results in incorrect assembly code when compiled using: gcc -traditional -O -S -meager gcc-bug.c The -meager switch is clearly responsible. The .s file that comes out matches the dissassembly using adb. /* ** gcc-bug.c ** ** Demonstrates a bug in the SPARC processing of the -meager switch. ** */ #define SOME_CONSTANT (4) int Foo(status) { int return_code; return_code = (status >= SOME_CONSTANT); exit(return_code); } main() { Foo(0); } Here is the s file: gcc_compiled.: .text .align 4 .global _Foo .proc 1 _Foo: !#PROLOGUE# 0 save %sp,-112,%sp !#PROLOGUE# 1 mov 0,%o0 cmp %i0,3 ble L2 ! eager mov 1,%o0 L2: call _exit,0 nop ret restore .align 4 .global _main .proc 1 _main: !#PROLOGUE# 0 save %sp,-112,%sp !#PROLOGUE# 1 call _Foo,0 mov 0,%o0 ret restore
RIC@RML2.SRI.COM (Ric Steinberger) (05/20/89)
GCC (installed on a VAX 3600, running VMS 5.1) detects 3 errors when compiling compress.c (from compress.tar on prep.ai.mit.edu). The VAX C compiler has no problem with this. Any ideas. Is GNU C supposed to be completely compatible with other VAX languages? I have an example of a case where a c program, compiled by GNU, and called by a fortran program, dies with an access violation. The same c code, compiled by VAXC (version 3.0), linked with the fortran caller, runs fine. Do you want to see the source codes? -ric steinberger ric@rml2.sri.com -------
ney@PRINCETON.EDU (Neal Young) (05/30/89)
I think I've run across a gcc bug involving floating point constants.
Here is a .c file and a shell session demonstrating the bug.
(I'm running on a fairly large vax...)
tmp.c
-------------------------------------------------------------
main()
{
float i;
i = 1.0;
printf("%g is %s greater than zero\n", i, i > 0.0 ? "" : "not" );
}
-------------------------------------------------------------
Shell session:
-------------------------------------------------------------
notecnirp> gcc -v -o tmp tmp.c
gcc version 1.35
/usr/local/gnu/lib/gcc-cpp -v -undef -D__GNUC__ -Dvax -Dunix -D__vax__ -D__unix__ tmp.c /tmp/cc023377.cpp
GNU CPP version 1.35
/usr/local/gnu/lib/gcc-cc1 /tmp/cc023377.cpp -quiet -dumpbase tmp.c -version -o /tmp/cc023377.s
GNU C version 1.35 (vax) compiled by GNU C version 1.35.
tmp.c: In function main:
tmp.c:4: magnitude of constant too large for `float'
notecnirp>
----------------------------------------------------------------
I've also had problems with "gas" involving floating points. In
particular, the above program on one of our Suns compiles but the
assignment "i = 1.0" sets i to zero, so the program outputs "0 is not
greater than zero". I documented this form of the problem, which
seemed to be an assembler bug from examining the code produced etc.
and sent it to hack@gnu.ai.mit.edu.
Neal Young (ney@notecnirp.princeton.edu)
balen%camscan.uucp@nsfnet-relay.ac.uk (henry Balen) (10/04/89)
There appears to be a bug in the gcc version 1.35 running on the Sun386i.
I compiled the source that is listed below with
gcc -o add add.c
And when I run add it causes a segmentation violation! As you can see the
program is fairly small.
/*
*
*/
main()
{
int *x,*b,*c;
register int i;
x = (int*)malloc(sizeof(int)*10);
b = (int*)malloc(sizeof(int)*10);
c = (int*)malloc(sizeof(int)*10);
for ( i = 0; i < 10; i++ )
x[i] = c[i] + b[i];
/* the following works instead!
* for (i = 0; i < 10; i++) {
* x[i] = c[i];
* x[i] += b[i];
* }
*/
free(x);
free(b);
free(c);
}
wjj@SUN-VALLEY.STANFORD.EDU (Warren Jasper) (11/10/89)
Here is the source file - ----------------------------------------------------------------------- extern float a,b,s,c; __inline static const void sincos (float angle, float *sinval, float *cosval) { float s,c; __asm ("fsincosx %2,%0:%1" : "=f" (s), "=f" (c) : "f" (angle)); *sinval = s; *cosval = c; } void test(void) { sincos(a-b,&s,&c); } - ------------------------------------------------------------------------ Here is the command line used to compile it - ------------------------------------------------------------------------ gcc -O -Wall -fstrength-reduce -fcombine-regs -fomit-frame-pointer -finline-fun ctions -fforce-mem -fforce-addr -Dsun3 -m68020 -m68881 -D__HAVE_68881__ -S junk .c - ------------------------------------------------------------------------ and here is the result - ------------------------------------------------------------------------ /local/lib/sun3/gcc: Program cc1 got fatal signal 11. - ------------------------------------------------------------------------ -- Chris
rohit@MIPS.COM (Rohit Chandra) (01/18/90)
I am trying to compile g++ using gcc on a MIPS M-2000 running RISC/OS 4.0, (with one change in va-mips.h) when the compiler crashes with the message: Program cc1 got fatal signal 4, while trying to compile the file expr.c Details follow: Version: gcc version 1.36 Input file: expr.c from gcc version 1.36.1- (based on GCC 1.36) with the include files in that version of g++. (with one change in va-mips.h, described below). Options: -c -DGATHER_STATISTICS -Wunused -DUSE_COLLECT -DEXTENDED_COFF -DFASCIST_ASSEMBLER -I. -I./config tm.h = tm-mips-bsd.h md = mips.md [I have made some changes in the machine description files. I *believe* these should not affect the bug, and hope you can still reproduce it.] Machine = mips m2000-8, Running RISC/OS 4.0 Error: The compiler dies with the following message- > gcc: Program cc1 got fatal signal 4. > *** Error code 1 > > Stop. To Reproduce the bug: --------------------- I am CHANGING the definitions in va-mips.h, included through gvarargs.h in the input file expr.c. Specifically, I am changing (a) typedef struct { int pnt; char *stack; double *fpregs; } va_list ; to: (b) typdef char *va_list; Compilation goes through fine for definition (a) - the original one - and the bug appears for definition (b) of va_list. [I also make the corresponding changes in the related macros va_alist, va_dcl, va_start, va_arg, va_end, but they do not affect the bug since the bug remains even if I remove all uses of these macros from the input file expr.c ] Therefore, to reproduce the bug, all you should need to do is: change the typedef of va_list in va-mips.h to typedef char* va_list; and perhaps comment out the *statements* (not the declarations) within emit_library_call in expr.c since they use the macros va_start, va_arg, va_end and therefore depend on the typedef of va_list. Description of the bug: ----------------------- The error occurs while parsing the declaration CUMULATIVE_ARGS args_so_far; in the function expand_call in the file expr.c. CUMULATIVE_ARGS args_so_far is defined to be #define CUMULATIVE_ARGS struct { \ enum arg_state arg_rec_state;\ int restype,arg_num;\ } The stack at that point (while debugging cc1) is: (dbx) run expr.cpp init_comparisons init_expr enqueue_insn protect_from_queue queued_subexp_p emit_queue init_queue convert_move convert_to_mode integer_mode_p move_by_pieces move_by_pieces_ninsns move_by_pieces_1 emit_block_move move_block_to_reg move_block_from_reg use_regs clear_storage emit_move_insn push_block gen_push_operand emit_push_insn emit_library_call expand_assignment store_expr store_constructor store_field force_operand save_noncopied_parts init_noncopied_parts validate_subtarget expand_expr expr.c: In function expand_expr: expr.c:3014: warning:assignment of pointer from integer lacks a cast expr.c:3024: warning:assignment of pointer from integer lacks a cast expand_builtin expand_increment preexpand_calls prepare_call_address emit_call_1 init_pending_stack_adjust clear_pending_stack_adjust do_pending_stack_adjust expand_cleanups_to expand_call Illegal instruction [abort.abort:22 ,0x4ac920] Source not available (dbx) where > 0 abort.abort(0x100243c8, 0x10024458, 0x7fff9c98, 0x7fff999c, 0x42e550) ["ab ort.s":22, 0x4ac920] 1 .block44 ["expr.c":3122, 0x4308bc] 2 expand_expr(exp = 0x10024900, target = 0x10024ec8, tmode = VOIDmode, modif ier = EXPAND_NORMAL) ["expr.c":3122, 0x4308bc] 3 store_expr(exp = 0x10024900, target = 0x10024ec8, suggest_reg = 0) ["expr. c":1823, 0x42d07c] 4 .block26 ["expr.c":2268, 0x42e24c] 5 expand_expr(exp = 0x10024ea8, target = (nil), tmode = VOIDmode, modifier = EXPAND_NORMAL) ["expr.c":2268, 0x42e24c] 6 variable_size(0x7fff9c9a, 0x0, 0x40b064, 0x1001e510, 0xffffff8c) ["stor-la yout.c":161, 0x42031c] 7 layout_type(0x40bad4, 0x0, 0x10024ea8, 0x0, 0x74) ["stor-layout.c":929, 0x 4222bc] 8 finish_struct(0x10024d50, 0x10123a88, 0x10020828, 0x0, 0x0) ["c-decl.c":32 05, 0x40c17c] 9 yyparse(0x10008f74, 0x2000, 0xa, 0x0, 0x2) ["c-parse.tab.c":773, 0x401864] 10 compile_file(0x0, 0x0, 0x0, 0x0, 0x0) ["toplev.c":1113, 0x41708c] 11 main(0x7fff9f74, 0x7fff9f80, 0x0, 0x0, 0x0) ["toplev.c":1981, 0x418dcc] (dbx) It is somehow related to the declarations register va_list p; ... CUMULATIVE_ARGS args_so_far; in the function emit_library_call, the only function to use varargs in the entire file. (emit_library_call occurs before the function expand_call in expr.c). If I move the declaration of CUMULATIVE_ARGS within emit_library_call from: register va_list p; ... CUMULATIVE_ARGS args_so_far; to: CUMULATIVE_ARGS args_so_far; register va_list p; ... (same declarations in the original order) then the error goes away. Although this message is long, I wonder if I have described the bug well. I will be happy to answer any more questions that you have. You can reach me at: rohit@mips.com, or rohit@cs.stanford.edu 408-991-6545 (work)
seeversb@MIST.CS.ORST.EDU (Bradley Seevers) (02/10/90)
While using gcc 1.35 on a Sequent Balance 2100 ,(ns32k machine), I uncovered a bug with assigning constants to global varialbles of type float. At first I thought that switching over to gcc 1.36 would solve my problems. I ftp'd gcc 1.36 from prep.ai.mit.edu and rebuilt the compiler. To my suprise, the bug was virtualy identical. As an example, consider the following short program: # include <stdio.h> float a; main() { float x; a = 3.0; x = 3.0; printf("%f\n",a); } This program produced the following assembly output when compiled with the -O -S flags and gcc v 1.35: #NO_APP gcc_compiled.: .text .align 0 LC0: .ascii "%f %f\12\0" .align 1 .globl _main _main: enter [],0 movd 416652,_a movfl 0f3.00000000000000000000e+00,tos movfl _a,tos addr LC0,tos bsr _printf adjspb -20 exit [] ret 0 .comm _a,4 The line "movd 416652,_a" is incorrect. This is not the correct value for a single precision 3.0. Note that is does ok for the local variable x. Compiling the same program with gcc v 1.36 and flags -O -S produces this output: #NO_APP gcc_compiled.: .text LC0: .ascii "%f %f\12\0" .align 1 .globl _main _main: enter [],0 movd 0,_a movfl 0f3.00000000000000000000e+00,tos movfl _a,tos addr LC0,tos bsr _printf adjspb -20 exit [] ret 0 .comm _a,4 Agin, the line "movd 0,_a" is incorrect. This bug only appears when optimization is enabled (-O). So I set about to solve this problem, after all, I had the source. The problem seems to be that all floating point constants are represented as double precision numbers, and when they are assigned to a global varialble of type float, they are not converted to single precision first. To fix this, I modified the file 'ns32k.md', changeing lines 246 - to: else if (GET_CODE (operands[1]) == CONST_DOUBLE) { union {int i[2]; float f; double d;} convrt; convrt.i[0] = CONST_DOUBLE_LOW (operands[1]); convrt.i[1] = CONST_DOUBLE_HIGH (operands[1]); convrt.f = convrt.d; /* Is there a better machine-independent way to to this? */ operands[1] = gen_rtx (CONST_INT, VOIDmode, convrt.i[0]); return \"movd %1,%0\"; } Now the example c program generates the code: #NO_APP gcc_compiled.: .text LC0: .ascii "%f %f\12\0" .align 1 .globl _main _main: enter [],0 movd 1077936128,_a movfl 0f3.00000000000000000000e+00,tos movfl _a,tos addr LC0,tos bsr _printf adjspb -20 exit [] ret 0 .comm _a,4 This code produced the correct result. -brad (seeversb@mist.cs.orst.edu)