re PR fortran/33502 (gfortran with .F suffix and -g3 option chokes on preprocessor...
authorFrancois-Xavier Coudert <fxcoudert@gcc.gnu.org>
Thu, 4 Oct 2007 15:04:09 +0000 (15:04 +0000)
committerFrançois-Xavier Coudert <fxcoudert@gcc.gnu.org>
Thu, 4 Oct 2007 15:04:09 +0000 (15:04 +0000)
PR fortran/33502
* scanner.c (gfc_advance_line): Call debug_hooks->end_source_file
and debug_hooks->start_source_file when appropriate, and set
dbg_emitted.
(gfc_define_undef_line): New function.
(load_file): Don't error out on #define and #undef lines.
* parse.c (next_statement): Call gfc_define_undef_line.
(gfc_parse_file): Call debug_hooks->start_source_file and
debug_hooks->end_source_file for the main source file if
required.
* gfortran.h (gfc_linebuf): Add dbg_emitted field.
(gfc_define_undef_line): New prototype.

From-SVN: r129011

gcc/fortran/ChangeLog
gcc/fortran/gfortran.h
gcc/fortran/parse.c
gcc/fortran/scanner.c

index aaf9163..d9e368b 100644 (file)
@@ -1,3 +1,18 @@
+2007-10-04  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
+
+       PR fortran/33502
+       * scanner.c (gfc_advance_line): Call debug_hooks->end_source_file
+       and debug_hooks->start_source_file when appropriate, and set
+       dbg_emitted.
+       (gfc_define_undef_line): New function.
+       (load_file): Don't error out on #define and #undef lines.
+       * parse.c (next_statement): Call gfc_define_undef_line.
+       (gfc_parse_file): Call debug_hooks->start_source_file and
+       debug_hooks->end_source_file for the main source file if
+       required.
+       * gfortran.h (gfc_linebuf): Add dbg_emitted field.
+       (gfc_define_undef_line): New prototype.
+
 2007-10-04  Tobias Schlüter  <tobi@gcc.gnu.org>
 
        PR fortran/33626
index 42002ce..5495ae7 100644 (file)
@@ -723,6 +723,7 @@ typedef struct gfc_linebuf
   struct gfc_linebuf *next;
 
   int truncated;
+  bool dbg_emitted;
 
   char line[1];
 } gfc_linebuf;
@@ -1935,6 +1936,7 @@ int gfc_at_bol (void);
 int gfc_at_eol (void);
 void gfc_advance_line (void);
 int gfc_check_include (void);
+int gfc_define_undef_line (void);
 
 void gfc_skip_comments (void);
 int gfc_next_char_literal (int);
index 86e486c..14acb86 100644 (file)
@@ -25,6 +25,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "gfortran.h"
 #include "match.h"
 #include "parse.h"
+#include "debug.h"
 
 /* Current statement label.  Zero means no statement label.  Because new_st
    can get wiped during statement matching, we have to keep it separate.  */
@@ -673,6 +674,9 @@ next_statement (void)
          break;
        }
 
+      if (gfc_define_undef_line ())
+       continue;
+
       st = (gfc_current_form == FORM_FIXED) ? next_fixed () : next_free ();
 
       if (st != ST_NONE)
@@ -3270,6 +3274,11 @@ gfc_parse_file (void)
   gfc_statement st;
   locus prog_locus;
 
+  /* If the debugger wants the name of the main source file,
+     we give it.  */
+  if (debug_hooks->start_end_main_source_file)
+    (*debug_hooks->start_source_file) (0, gfc_source_file);
+
   top.state = COMP_NONE;
   top.sym = NULL;
   top.previous = NULL;
@@ -3380,6 +3389,9 @@ loop:
   goto loop;
 
 done:
+  if (debug_hooks->start_end_main_source_file)
+    (*debug_hooks->end_source_file) (0);
+
   return SUCCESS;
 
 duplicate_main:
index 682c60c..b9e7114 100644 (file)
@@ -45,6 +45,8 @@ along with GCC; see the file COPYING3.  If not see
 #include "system.h"
 #include "gfortran.h"
 #include "toplev.h"
+#include "debug.h"
+#include "flags.h"
 
 /* Structure for holding module and include file search path.  */
 typedef struct gfc_directorylist
@@ -312,6 +314,29 @@ gfc_advance_line (void)
       return;
     } 
 
+  if (gfc_current_locus.lb->next
+      && gfc_current_locus.lb->next->file != gfc_current_locus.lb->file)
+    {
+      if (gfc_current_locus.lb->next->file
+         && !gfc_current_locus.lb->next->dbg_emitted
+         && gfc_current_locus.lb->file->up == gfc_current_locus.lb->next->file)
+       {
+         /* We exit from an included file. */
+         (*debug_hooks->end_source_file)
+               (gfc_linebuf_linenum (gfc_current_locus.lb->next));
+         gfc_current_locus.lb->next->dbg_emitted = true;
+       }
+      else if (gfc_current_locus.lb->next->file != gfc_current_locus.lb->file
+              && !gfc_current_locus.lb->next->dbg_emitted)
+       {
+         /* We enter into a new file.  */
+         (*debug_hooks->start_source_file)
+               (gfc_linebuf_linenum (gfc_current_locus.lb),
+                gfc_current_locus.lb->next->file->filename);
+         gfc_current_locus.lb->next->dbg_emitted = true;
+       }
+    }
+
   gfc_current_locus.lb = gfc_current_locus.lb->next;
 
   if (gfc_current_locus.lb != NULL)     
@@ -372,6 +397,28 @@ skip_comment_line (void)
 }
 
 
+int
+gfc_define_undef_line (void)
+{
+  /* All lines beginning with '#' are either #define or #undef.  */
+  if (debug_info_level != DINFO_LEVEL_VERBOSE || gfc_peek_char () != '#')
+    return 0;
+
+  if (strncmp (gfc_current_locus.nextc, "#define ", 8) == 0)
+    (*debug_hooks->define) (gfc_linebuf_linenum (gfc_current_locus.lb),
+                           &(gfc_current_locus.nextc[8]));
+
+  if (strncmp (gfc_current_locus.nextc, "#undef ", 7) == 0)
+    (*debug_hooks->undef) (gfc_linebuf_linenum (gfc_current_locus.lb),
+                          &(gfc_current_locus.nextc[7]));
+
+  /* Skip the rest of the line.  */
+  skip_comment_line ();
+
+  return 1;
+}
+
+
 /* Comment lines are null lines, lines containing only blanks or lines
    on which the first nonblank line is a '!'.
    Return true if !$ openmp conditional compilation sentinel was
@@ -1505,8 +1552,18 @@ load_file (const char *filename, bool initial)
 
       if (line[0] == '#')
        {
-         preprocessor_line (line);
-         continue;
+         /* When -g3 is specified, it's possible that we emit #define
+            and #undef lines, which we need to pass to the middle-end
+            so that it can emit correct debug info.  */
+         if (debug_info_level == DINFO_LEVEL_VERBOSE
+             && (strncmp (line, "#define ", 8) == 0
+                 || strncmp (line, "#undef ", 7) == 0))
+           ;
+         else
+           {
+             preprocessor_line (line);
+             continue;
+           }
        }
 
       /* Preprocessed files have preprocessor lines added before the byte