Bug 3782 - [3.4 regression] -quiet -fstats produces a segmentation fault in cc1plus
Summary: [3.4 regression] -quiet -fstats produces a segmentation fault in cc1plus
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 3.0
: P3 normal
Target Milestone: 3.4.0
Assignee: Neil Booth
URL:
Keywords: ice-on-valid-code
: 9385 9409 (view as bug list)
Depends on:
Blocks:
 
Reported: 2001-07-23 14:56 UTC by Sylvain Pion
Modified: 2005-04-20 03:12 UTC (History)
8 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Sylvain Pion 2001-07-23 14:56:00 UTC
Compiling any file (C or C++), even an empty file,
with -fstats produces :

<internal>:0: Internal error: Segmentation fault
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://www.gnu.org/software/gcc/bugs.html> for instructions.

Release:
3.0

Environment:
Reading specs from ./gcc/Linux_CVS/bin/../lib/gcc-lib/i686-pc-linux-gnu/3.0/specs
Configured with: /u/zosma/0/prisme/spion/gcc/gcc/configure --enable-languages=c++
--prefix=/u/zosma/0/prisme/spion/gcc/Linux_CVS
Thread model: single
gcc version 3.0
Comment 1 Christian Ehrhardt 2002-12-09 11:20:25 UTC
State-Changed-From-To: open->feedback
State-Changed-Why: I can't reproduce this with recent gcc on a similar machine.
    Does this still happen with your setup?
Comment 2 Christian Ehrhardt 2002-12-10 04:19:54 UTC
State-Changed-From-To: feedback->analyzed
State-Changed-Why: Confirmed with recent cvs. This is a regression from 2.95.3,
    the easiest way to reproduce this is to call ``cc1plus -quiet -fstats''.
Comment 3 Sylvain Pion 2002-12-10 12:16:31 UTC
From: Sylvain Pion <Sylvain.Pion@sophia.inria.fr>
To: ehrhardt@mathematik.uni-ulm.de, Sylvain.Pion@sophia.inria.fr,
   gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org,
   gcc-gnats@gcc.gnu.org
Cc:  
Subject: Re: other/3782: -fstats produces a segmentation fault
Date: Tue, 10 Dec 2002 12:16:31 +0100

 On Mon, Dec 09, 2002 at 07:20:25PM -0000, ehrhardt@mathematik.uni-ulm.de wrote:
 >     I can't reproduce this with recent gcc on a similar machine.
 >     Does this still happen with your setup?
 
 Yes it does.  With current mainline, I get :
 
 spion@mpino1212:~/GCC$ ./Linux/bin/gcc -v
 Reading specs from ./Linux/bin/../lib/gcc-lib/i686-pc-linux-gnu/3.3/specs
 Configured with: ../gcc/configure --prefix=/home/spion/GCC/Linux
 --enable-languages=c++ --with-as=/home/spion/BINUTILS/Linux-2.13/bin/as
 --with-ld=/home/spion/BINUTILS/Linux-2.13/bin/ld
 Thread model: posix
 gcc version 3.3 20021210 (experimental)
 
 spion@mpino1212:~/GCC$ ./Linux/bin/gcc -fstats -c foo.c
 cc1: warning: "-fstats" is valid for C++ but not for C/ObjC
 
 spion@mpino1212:~/GCC$ ./Linux/bin/g++ -fstats -c foo.C
 <internal>:0: internal compiler error: Segmentation fault
 Please submit a full bug report,
 with preprocessed source if appropriate.
 See <URL:http://www.gnu.org/software/gcc/bugs.html> for instructions.
 
 
 -- 
 Sylvain

Comment 4 Christian Ehrhardt 2002-12-10 13:15:39 UTC
From: "Christian Ehrhardt" <ehrhardt@mathematik.uni-ulm.de>
To: Sylvain Pion <Sylvain.Pion@sophia.inria.fr>
Cc: gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org,
  gcc-gnats@gcc.gnu.org, gcc-patches@gcc.gnu.org
Subject: Re: other/3782: -fstats produces a segmentation fault
Date: Tue, 10 Dec 2002 13:15:39 +0100

 On Tue, Dec 10, 2002 at 12:16:31PM +0100, Sylvain Pion wrote:
 > >     Does this still happen with your setup?
 > 
 > Yes it does.  With current mainline, I get :
 
 Thanks for the feedback. I only tried with gcc not with g++.
 I now can reproduce this, cc1plus segfaults even without ANY
 input file if -quiet and -fstats is passed. This one line patch
 (compiled but not bootstrap tested) fixes the ICE for me, not sure
 if this is the appropriate fix though. Someone please look at this
 and check it in if appropriate.
 
 
 --- gcc/timevar.c.orig	Tue Dec 10 13:01:22 2002
 +++ gcc/timevar.c	Tue Dec 10 13:05:28 2002
 @@ -404,7 +404,7 @@
        timevar_accumulate (elapsed, &tv->start_time, &now);
      }
    /* Or is TIMEVAR at the top of the timer stack?  */
 -  else if (stack->timevar == tv)
 +  else if (stack && stack->timevar == tv)
      {
        get_time (&now);
        timevar_accumulate (elapsed, &start_time, &now);
 
 
     regards   Christian
 
 -- 
 THAT'S ALL FOLKS!
Comment 5 s.bosscher 2003-02-20 10:35:04 UTC
From: Steven Bosscher <s.bosscher@student.tudelft.nl>
To: gcc-gnats@gcc.gnu.org, gcc-bugs@gcc.gnu.org,
	Sylvain.Pion@sophia.inria.fr, nobody@gcc.gnu.org, gcc-prs@gcc.gnu.org
Cc:  
Subject: Re: other/3782: [3.2/3.3/3.4 regression] -quiet -fstats produces
 a segmentation fault in cc1plus
Date: Thu, 20 Feb 2003 10:35:04 +0100

 http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=3782
 
 Approved patch pending:
 http://gcc.gnu.org/ml/gcc-patches/2003-02/msg01533.html
 http://gcc.gnu.org/ml/gcc-patches/2003-02/msg01547.html
 
 
Comment 6 Andreas Jaeger 2003-02-22 05:47:30 UTC
State-Changed-From-To: analyzed->closed
State-Changed-Why: Steven's patch was applied to 3.2/3.3 and mainline.
Comment 7 Volker Reichelt 2003-03-10 14:24:43 UTC
State-Changed-From-To: closed->open
State-Changed-Why: Crashes again on mainline (as of 20030310) :(
Comment 8 Christian Ehrhardt 2003-04-16 20:07:20 UTC
State-Changed-From-To: open->analyzed
State-Changed-Why: This PR is the cc1plus crash with -fstats. It now crashes due to a call
    to get_run_time in init_c_lex before timevar is initialized.
    
    Neil moved the call to init_c_lex from c_common_init to c_common_init to
    c_common_post_options with this patch:
    
    2003-03-08  Neil Booth  <neil@daikokuya.co.uk>
    
            * c-common.h (c_common_init, c_common_post_options): Update.
            * c-objc-common.c (c_objc_common_init): Update for new prototype.
            * c-opts.c (saved_lineno): New.
            (c_common_post_options, c_common_init): Update prototypes,
            move call to cpp_read_main_file from latter to former.
    
    Unfortunately c_common_post_options is called before timevar_init.
    
       regards  Christian
Comment 9 Steven Bosscher 2003-04-23 06:40:21 UTC
Responsible-Changed-From-To: unassigned->neil
Responsible-Changed-Why: Neil broke this, so he agreed it's his to fix.
Comment 10 Neil Booth 2003-04-26 14:04:02 UTC
From: Neil Booth <neil@daikokuya.co.uk>
To: steven@gcc.gnu.org, Sylvain.Pion@sophia.inria.fr, gcc-bugs@gcc.gnu.org,
	gcc-gnats@gcc.gnu.org
Cc:  
Subject: Re: c++/3782: [3.4 regression] -quiet -fstats produces a segmentation fault in cc1plus
Date: Sat, 26 Apr 2003 14:04:02 +0100

 steven@gcc.gnu.org wrote:-
 
 > Synopsis: [3.4 regression] -quiet -fstats produces a segmentation fault in cc1plus
 > 
 > Responsible-Changed-From-To: unassigned->neil
 > Responsible-Changed-By: steven
 > Responsible-Changed-When: Wed Apr 23 06:40:21 2003
 > Responsible-Changed-Why:
 >     Neil broke this, so he agreed it's his to fix.
 > 
 > http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=3782
 
 Fixed with this.  I took the opportunity to reduce global variable
 usage.
 
 I'm going to follow up with some timevar.c improvements.
 
 Neil.
 
 	* flags.h (time_report): Remove.
 	* timevar.c (timevar_enable): New.
 	(TIMEVAR_ENABLE): Remove, use timevar_enable.
 	(timevar_init): Rename from init_timevar.
 	* timevar.h (timevar_init): Rename from init_timevar.
 	* toplev.c (time_report): Make static.
 	(process_options): Conditionally call timevar_init first.
 
 
 Index: flags.h
 ===================================================================
 RCS file: /cvs/gcc/gcc/gcc/flags.h,v
 retrieving revision 1.105
 diff -u -p -r1.105 flags.h
 --- flags.h	12 Apr 2003 02:16:45 -0000	1.105
 +++ flags.h	26 Apr 2003 13:03:09 -0000
 @@ -72,10 +72,6 @@ extern int optimize_size;
  
  extern int quiet_flag;
  
 -/* Print times taken by the various passes.  -ftime-report.  */
 -
 -extern int time_report;
 -
  /* Print memory still in use at end of compilation (which may have little
     to do with peak memory consumption).  -fmem-report.  */
  
 Index: timevar.c
 ===================================================================
 RCS file: /cvs/gcc/gcc/gcc/timevar.c,v
 retrieving revision 1.27
 diff -u -p -r1.27 timevar.c
 --- timevar.c	31 Jan 2003 07:33:56 -0000	1.27
 +++ timevar.c	26 Apr 2003 13:03:09 -0000
 @@ -113,10 +113,9 @@ static double clocks_to_msec;
  #include "flags.h"
  #include "timevar.h"
  
 -/* See timevar.h for an explanation of timing variables.  */
 +static bool timevar_enable;
  
 -/* This macro evaluates to nonzero if timing variables are enabled.  */
 -#define TIMEVAR_ENABLE (time_report)
 +/* See timevar.h for an explanation of timing variables.  */
  
  /* A timing variable.  */
  
 @@ -187,7 +186,7 @@ get_time (now)
    now->sys  = 0;
    now->wall = 0;
  
 -  if (!TIMEVAR_ENABLE)
 +  if (!timevar_enable)
      return;
  
    {
 @@ -225,10 +224,9 @@ timevar_accumulate (timer, start_time, s
  /* Initialize timing variables.  */
  
  void
 -init_timevar ()
 +timevar_init ()
  {
 -  if (!TIMEVAR_ENABLE)
 -    return;
 +  timevar_enable = true;
  
    /* Zero all elapsed times.  */
    memset ((void *) timevars, 0, sizeof (timevars));
 @@ -262,7 +260,7 @@ timevar_push (timevar)
    struct timevar_stack_def *context;
    struct timevar_time_def now;
  
 -  if (!TIMEVAR_ENABLE)
 +  if (!timevar_enable)
      return;
  
    /* Mark this timing variable as used.  */
 @@ -314,7 +312,7 @@ timevar_pop (timevar)
    struct timevar_time_def now;
    struct timevar_stack_def *popped = stack;
  
 -  if (!TIMEVAR_ENABLE)
 +  if (!timevar_enable)
      return;
  
    if (&timevars[timevar] != stack->timevar)
 @@ -353,7 +351,7 @@ timevar_start (timevar)
  {
    struct timevar_def *tv = &timevars[timevar];
  
 -  if (!TIMEVAR_ENABLE)
 +  if (!timevar_enable)
      return;
  
    /* Mark this timing variable as used.  */
 @@ -378,7 +376,7 @@ timevar_stop (timevar)
    struct timevar_def *tv = &timevars[timevar];
    struct timevar_time_def now;
  
 -  if (!TIMEVAR_ENABLE)
 +  if (!timevar_enable)
      return;
  
    /* TIMEVAR must have been started via timevar_start.  */
 @@ -430,7 +428,7 @@ timevar_print (fp)
    struct timevar_time_def *total = &timevars[TV_TOTAL].elapsed;
    struct timevar_time_def now;
  
 -  if (!TIMEVAR_ENABLE)
 +  if (!timevar_enable)
      return;
  
    /* Update timing information in case we're calling this from GDB.  */
 Index: timevar.h
 ===================================================================
 RCS file: /cvs/gcc/gcc/gcc/timevar.h,v
 retrieving revision 1.10
 diff -u -p -r1.10 timevar.h
 --- timevar.h	13 Feb 2003 04:57:17 -0000	1.10
 +++ timevar.h	26 Apr 2003 13:03:09 -0000
 @@ -79,7 +79,7 @@ timevar_id_t;
  /* Execute the sequence: timevar_pop (TV), return (E);  */
  #define POP_TIMEVAR_AND_RETURN(TV, E)  return (timevar_pop (TV), (E))
  
 -extern void init_timevar PARAMS ((void));
 +extern void timevar_init PARAMS ((void));
  extern void timevar_push PARAMS ((timevar_id_t));
  extern void timevar_pop PARAMS ((timevar_id_t));
  extern void timevar_start PARAMS ((timevar_id_t));
 Index: toplev.c
 ===================================================================
 RCS file: /cvs/gcc/gcc/gcc/toplev.c,v
 retrieving revision 1.745
 diff -u -p -r1.745 toplev.c
 --- toplev.c	26 Apr 2003 03:27:07 -0000	1.745
 +++ toplev.c	26 Apr 2003 13:03:12 -0000
 @@ -431,7 +431,7 @@ int quiet_flag = 0;
  
  /* Print times taken by the various passes.  -ftime-report.  */
  
 -int time_report = 0;
 +static int time_report = 0;
  
  /* Print memory still in use at end of compilation (which may have little
     to do with peak memory consumption).  -fmem-report.  */
 @@ -5214,6 +5214,11 @@ parse_options_and_default_flags (argc, a
  static void
  process_options ()
  {
 +  /* Initialize timing first.  The C front ends read the main file in
 +     the post_options hook, and C++ does file timings.  */
 +  if (time_report || !quiet_flag  || flag_detailed_statistics)
 +    timevar_init ();
 +
    /* Allow the front end to perform consistency checks and do further
       initialization based on the command line options.  This hook also
       sets the original filename if appropriate (e.g. foo.i -> foo.c)
 @@ -5326,9 +5331,6 @@ process_options ()
  	print_switch_values (stderr, 0, MAX_LINE, "", " ", "\n");
      }
  
 -  if (! quiet_flag  || flag_detailed_statistics)
 -    time_report = 1;
 -
    if (flag_syntax_only)
      {
        write_symbols = NO_DEBUG;
 @@ -5562,9 +5564,6 @@ finalize ()
  static void
  do_compile ()
  {
 -  /* We cannot start timing until after options are processed since that
 -     says if we run timers or not.  */
 -  init_timevar ();
    timevar_start (TV_TOTAL);
  
    /* Set up the back-end if requested.  */
Comment 11 Steven Bosscher 2003-04-29 07:10:56 UTC
State-Changed-From-To: analyzed->closed
State-Changed-Why: fixed