aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/scanner.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/fortran/scanner.c')
-rw-r--r--gcc/fortran/scanner.c56
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;
}
}