diff options
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; } } |