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
This commit is contained in:
Francois-Xavier Coudert 2007-11-08 19:19:50 +00:00 committed by François-Xavier Coudert
parent 66ec5f8742
commit 4cdf766ef6
2 changed files with 57 additions and 6 deletions

View File

@ -1,3 +1,10 @@
2007-11-08 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
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 <fxcoudert@gcc.gnu.org>
PR fortran/34028

View File

@ -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;
}
}