From 4cdf766ef65b67a2479d82e222dc0b12f6d43f7f Mon Sep 17 00:00:00 2001 From: Francois-Xavier Coudert Date: Thu, 8 Nov 2007 19:19:50 +0000 Subject: [PATCH] re PR debug/33739 (Failure of gfortran.dg/literal_character_constant_1_*.F with -m64 -g on Darwin) PR fortran/33739 * scanner.c (start_source_file, end_source_file, exit_remaining_files): New functions. (gfc_advance_line): Use the new functions. From-SVN: r130016 --- gcc/fortran/ChangeLog | 7 ++++++ gcc/fortran/scanner.c | 56 ++++++++++++++++++++++++++++++++++++++----- 2 files changed, 57 insertions(+), 6 deletions(-) diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 0ce1bfa6c6a..4306a92078d 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2007-11-08 Francois-Xavier Coudert + + PR fortran/33739 + * scanner.c (start_source_file, end_source_file, + exit_remaining_files): New functions. + (gfc_advance_line): Use the new functions. + 2007-11-08 Francois-Xavier Coudert PR fortran/34028 diff --git a/gcc/fortran/scanner.c b/gcc/fortran/scanner.c index b9e71149110..89aef49b086 100644 --- a/gcc/fortran/scanner.c +++ b/gcc/fortran/scanner.c @@ -300,13 +300,59 @@ gfc_at_eol (void) } +struct file_entered_chainon +{ + gfc_file *file; + struct file_entered_chainon *prev; +}; + +static struct file_entered_chainon *last_file_entered = NULL; + +static void +start_source_file (int line, gfc_file *file) +{ + struct file_entered_chainon *f = gfc_getmem (sizeof + (struct file_entered_chainon)); + + f->file = file; + f->prev = last_file_entered; + last_file_entered = f; + + (*debug_hooks->start_source_file) (line, file->filename); +} + +static void +end_source_file (int line) +{ + gcc_assert (last_file_entered); + last_file_entered = last_file_entered->prev; + (*debug_hooks->end_source_file) (line); +} + +static void +exit_remaining_files (void) +{ + struct file_entered_chainon *f = last_file_entered; + while (f) + { + /* The line number doesn't matter much, because we're at the end of + the toplevel file anyway. */ + (*debug_hooks->end_source_file) (0); + + f = f->prev; + } +} + /* Advance the current line pointer to the next line. */ void gfc_advance_line (void) { if (gfc_at_end ()) - return; + { + exit_remaining_files (); + return; + } if (gfc_current_locus.lb == NULL) { @@ -322,17 +368,15 @@ gfc_advance_line (void) && 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)); + 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); + start_source_file (gfc_linebuf_linenum (gfc_current_locus.lb), + gfc_current_locus.lb->next->file); gfc_current_locus.lb->next->dbg_emitted = true; } }