diff options
author | Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2007-11-08 19:19:50 +0000 |
---|---|---|
committer | François-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2007-11-08 19:19:50 +0000 |
commit | 4cdf766ef65b67a2479d82e222dc0b12f6d43f7f (patch) | |
tree | 093ca7e9e5c8fa4f11db0934ed92e173a7487a56 /gcc/fortran/scanner.c | |
parent | 66ec5f8742ac9a9bc6401886f3e81ed61ef974f1 (diff) | |
download | gcc-4cdf766ef65b67a2479d82e222dc0b12f6d43f7f.zip gcc-4cdf766ef65b67a2479d82e222dc0b12f6d43f7f.tar.gz gcc-4cdf766ef65b67a2479d82e222dc0b12f6d43f7f.tar.bz2 |
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
Diffstat (limited to 'gcc/fortran/scanner.c')
-rw-r--r-- | gcc/fortran/scanner.c | 56 |
1 files changed, 50 insertions, 6 deletions
diff --git a/gcc/fortran/scanner.c b/gcc/fortran/scanner.c index b9e7114..89aef49 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; } } |