aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/scanner.c
diff options
context:
space:
mode:
authorFrancois-Xavier Coudert <fxcoudert@gcc.gnu.org>2007-09-22 15:03:24 +0000
committerFrançois-Xavier Coudert <fxcoudert@gcc.gnu.org>2007-09-22 15:03:24 +0000
commita3b2d4e56c6086a6af1aae2ef3a540171609e153 (patch)
tree2389a4ad99837b8fe86ec6a45f7d52d1eb8796e8 /gcc/fortran/scanner.c
parent9fa6cfec03275391d93cf67e1691f11c053f1220 (diff)
downloadgcc-a3b2d4e56c6086a6af1aae2ef3a540171609e153.zip
gcc-a3b2d4e56c6086a6af1aae2ef3a540171609e153.tar.gz
gcc-a3b2d4e56c6086a6af1aae2ef3a540171609e153.tar.bz2
re PR fortran/33502 (gfortran with .F suffix and -g3 option chokes on preprocessor syntax)
PR fortran/33502 * scanner.c (gfc_advance_line): Call debug_hooks->start_source_file and debug_hooks->end_source_file when entering and exiting included files. (gfc_define_undef_line): New function. (load_file): Ignore #define and #undef preprocessor lines while reading source files. * parse.c (next_statement): Handle #define and #undef preprocessor lines. (gfc_parse_file): Call debug_hooks->start_source_file and debug_hooks->end_source_file for the main source file if requested by the debug format. * gfortran.h (gfc_define_undef_line): Add prototype. From-SVN: r128671
Diffstat (limited to 'gcc/fortran/scanner.c')
-rw-r--r--gcc/fortran/scanner.c57
1 files changed, 55 insertions, 2 deletions
diff --git a/gcc/fortran/scanner.c b/gcc/fortran/scanner.c
index fe7d213..ef2bbcd9 100644
--- a/gcc/fortran/scanner.c
+++ b/gcc/fortran/scanner.c
@@ -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,20 @@ gfc_advance_line (void)
return;
}
+ if (gfc_current_locus.lb->next)
+ {
+ if (gfc_current_locus.lb->file->next
+ && gfc_current_locus.lb->file->up == gfc_current_locus.lb->file->next)
+ /* We exit from an included file. */
+ (*debug_hooks->end_source_file)
+ (gfc_linebuf_linenum (gfc_current_locus.lb->next));
+ else if (gfc_current_locus.lb->next->file != gfc_current_locus.lb->file)
+ /* 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 = gfc_current_locus.lb->next;
if (gfc_current_locus.lb != NULL)
@@ -372,6 +388,31 @@ 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
+ && (write_symbols == DWARF2_DEBUG
+ || write_symbols == VMS_AND_DWARF2_DEBUG))
+ || 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
@@ -1500,8 +1541,20 @@ 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
+ && (write_symbols == DWARF2_DEBUG
+ || write_symbols == VMS_AND_DWARF2_DEBUG)
+ && (strncmp (line, "#define ", 8) == 0
+ || strncmp (line, "#undef ", 7) == 0))
+ ;
+ else
+ {
+ preprocessor_line (line);
+ continue;
+ }
}
/* Preprocessed files have preprocessor lines added before the byte