--- dwarf2read.c.orig 2006-04-13 11:17:40.000000000 +0200 +++ dwarf2read.c 2006-04-13 11:25:48.000000000 +0200 @@ -846,7 +846,7 @@ static struct line_header *(dwarf_decode static void dwarf_decode_lines (struct line_header *, char *, bfd *, struct dwarf2_cu *, struct partial_symtab *); -static void dwarf2_start_subfile (char *, char *); +static void dwarf2_start_subfile (char *, char *, char *); static struct symbol *new_symbol (struct die_info *, struct type *, struct dwarf2_cu *); @@ -6535,7 +6535,7 @@ dwarf_decode_lines (struct line_header * dir = lh->include_dirs[fe->dir_index - 1]; else dir = comp_dir; - dwarf2_start_subfile (fe->name, dir); + dwarf2_start_subfile (fe->name, dir, comp_dir); } /* Decode the table. */ @@ -6637,7 +6637,7 @@ dwarf_decode_lines (struct line_header * else dir = comp_dir; if (!decode_for_pst_p) - dwarf2_start_subfile (fe->name, dir); + dwarf2_start_subfile (fe->name, dir, comp_dir); } break; case DW_LNS_set_column: @@ -6736,7 +6736,7 @@ dwarf_decode_lines (struct line_header * subfile, so that `break /srcdir/list0.c:1' works as expected. */ static void -dwarf2_start_subfile (char *filename, char *dirname) +dwarf2_start_subfile (char *filename, char *dirname, char *comp_dir) { /* If the filename isn't absolute, try to match an existing subfile with the full pathname. */ @@ -6744,7 +6744,7 @@ dwarf2_start_subfile (char *filename, ch if (!IS_ABSOLUTE_PATH (filename) && dirname != NULL) { struct subfile *subfile; - char *fullname = concat (dirname, "/", filename, (char *)NULL); + char *fullname = concat (dirname, SLASH_STRING, filename, (char *)NULL); for (subfile = subfiles; subfile; subfile = subfile->next) { @@ -6755,9 +6755,20 @@ dwarf2_start_subfile (char *filename, ch return; } } + + /* Make sure we don't loose the compilation directory + information. */ + if (dirname != comp_dir) + { + filename = fullname; + dirname = comp_dir; + } + + start_subfile (filename, dirname); xfree (fullname); } - start_subfile (filename, dirname); + else + start_subfile (filename, dirname); } static void