[gnu.g++.bug] G++ 1.27.0 Segementation Violation

cooper@gecrux.steinmetz.ge.com (Clark Cooper) (10/06/88)

Version:	G++ 1.27.0
Hardware:	Sun 3/50
OS:		SunOS 3.5
Configuration:	tm.h -> tm-sun3+.h
		md -> m68k.md

Input file:	scene.cc from InterViews 2.3

Symptoms:	Segmentation Violation in c++

=========================
Script started on Thu Oct  6 10:12:24 1988
sculptorq% g++ -v -g -O -DX11 -c scene.cc
g++ version 1.27.0
 /usr/local/lib/gcc-cpp+ -v -DX11 -undef -D__GNU__ -D__GNUG__ -Dmc68000 -Dsun -Dunix -D__OPTIMIZE__ scene.cc /tmp/cca01201.cpp
GNU CPP version 1.27.0
 /usr/local/lib/gcc-c++ /tmp/cca01201.cpp -quiet -dumpbase scene.cc -opt -version -G -o /tmp/cca01201.s
GNU C++ version 1.27.0 (68k, MIT syntax) compiled by CC.

At top level:
scene.cc:18: warning: use of obsolete scope operator `.'; use `::' instead

In function void Scene::DoMap (struct Interactor *):
scene.cc:336: Segmentation violation
/usr/sculptorq/gnu/src/g++/g++: Program c++ got fatal signal 11.
sculptorq% gdb+ /usr/sculptorq/gnu/gcc-c++ core
GDB 2.8.0 (GNU C++ 1.27.0 compatible), Copyright (C) 1988 Free Software Foundation, Inc.
There is ABSOLUTELY NO WARRANTY for GDB; type "info warranty" for details.
GDB is free software and you are welcome to distribute copies of it
 under certain conditions; type "info copying" to see the conditions.
Reading symbol data from /usr/sculptorq/gnu/gcc-c++...done.
Core file is from "gcc-c++".
Program terminated with signal 11, Segmentation fault.
Type "help" for a list of commands.
(gdb+) directory /usr/sculptorq/gnu/src/g++
Source directories searched: /usr.MC68020/sculptorq/gnu/src/InterViews/src/lib:/usr/sculptorq/gnu/src/g++
(gdb+) where
#0  0x3171e in fixup_memory_subreg (x=(rtx) 0x10f84c) (stmt.c line 2524)
#1  0x31204 in fixup_var_refs_1 (var=(rtx) 0x10f4c0, x=(rtx) 0x10f84c, insn=(rtx) 0x10f87c) (stmt.c line 2380)
#2  0x3168a in fixup_var_refs_1 (var=(rtx) 0x10f4c0, x=(rtx) 0x10f870, insn=(rtx) 0x10f87c) (stmt.c line 2499)
#3  0x3112a in fixup_var_refs (var=(rtx) 0x10f4c0) (stmt.c line 2327)
#4  0x31080 in put_var_into_stack (decl=(union tree_node *) 0x10f468) (stmt.c line 2300)
#5  0x1d92c in mark_addressable (exp=(union tree_node *) 0x10f468) (typecheck.c line 3476)
#6  0x1d192 in build_unary_op (code=ADDR_EXPR, xarg=(union tree_node *) 0x10f468, noconvert=0) (typecheck.c line 3197)
#7  0x1c8a6 in build_x_unary_op (code=ADDR_EXPR, xarg=(union tree_node *) 0x10f468) (typecheck.c line 2840)
#8  0x5428 in yyparse () (parse.y line 458)
#9  0x31f0 in compile_file (name=(char *) 0xefffd24 "/tmp/cca01201.cpp") (toplev.c line 905)
#10 0x4862 in main (argc=10, argv=(char **) 0xefffcbc, envp=(char **) 0xefffce8) (toplev.c line 1716)
(gdb+) list fixup_memory_subreg
2512	   return an rtx (MEM:m1 newaddr) which is equivalent.  */
2513	
2514	static rtx
2515	fixup_memory_subreg (x)
2516	     rtx x;
2517	{
2518	  int offset = SUBREG_WORD (x) * UNITS_PER_WORD;
2519	  rtx addr = XEXP (SUBREG_REG (x), 0);
2520	  enum machine_mode mode = GET_MODE (x);
2521	
(gdb+) 
2522	#ifdef BYTES_BIG_ENDIAN
2523	  offset += (MIN (UNITS_PER_WORD, GET_MODE_SIZE (SUBREG_REG (x)))
2524		     - MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (x))));
2525	#endif
2526	  return change_address (SUBREG_REG (x), mode,
2527				 plus_constant (addr, offset));
2528	}
2529	^L
2530	#if 0
2531	/* Fix up any references to stack slots that are invalid memory addresses
(gdb+) quit
sculptorq% ^D
script done on Thu Oct  6 10:14:55 1988
=========================

Recommended Patch:

*** stmt.c~     Sun Sep 11 00:54:53 1988
--- stmt.c      Thu Oct  6 10:16:15 1988
***************
*** 2519,2528 ****
    rtx addr = XEXP (SUBREG_REG (x), 0);
    enum machine_mode mode = GET_MODE (x);
  
  #ifdef BYTES_BIG_ENDIAN
!   offset += (MIN (UNITS_PER_WORD, GET_MODE_SIZE (SUBREG_REG (x)))
!            - MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (x))));
  #endif
    return change_address (SUBREG_REG (x), mode,
                         plus_constant (addr, offset));
  }
--- 2519,2528 ----
    rtx addr = XEXP (SUBREG_REG (x), 0);
    enum machine_mode mode = GET_MODE (x);
  
  #ifdef BYTES_BIG_ENDIAN
!   offset += (MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
!            - MIN (UNITS_PER_WORD, GET_MODE_SIZE (mode)));
  #endif
    return change_address (SUBREG_REG (x), mode,
                         plus_constant (addr, offset));
  }
--
Clark Cooper       cooper@gecrux.steinmetz.ge.com, coopercc@crd.ge.com,
                   coopercc@ge-crd.arpa, ...!uunet!steinmetz!cooper