This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
Re: Patch: Handle relative paths in .debug_line
- From: Garrison <garrison at mail dot ru>
- To: jimb at redhat dot com
- Cc: cagney at gnu dot org, gdb-patches at sources dot redhat dot com
- Date: Thu, 30 Sep 2004 04:43:10 +0400
- Subject: Re: Patch: Handle relative paths in .debug_line
Hi!
I've taken a look at dwarf standard, and I have a question (possibly
already answered elsewhere): it is specified that relative paths in list
are related to compilation directory, so why not make the substitution
while parsing the list? If it's OK please take a look at attached patch
(sorry if it wraps this time). It's against current CVS HEAD.
I'm not sure I got those make_cleanup() calls right, if so please correct
me.
--- dwarf2read.c.original 2004-09-27 23:28:12.000000000 +0400
+++ dwarf2read.c 2004-09-30 04:05:52.999436680 +0400
@@ -822,7 +822,7 @@
static struct line_header *(dwarf_decode_line_header
(unsigned int offset,
- bfd *abfd, struct dwarf2_cu *cu));
+ bfd *abfd, struct dwarf2_cu *cu, const char* comp_dir));
static void dwarf_decode_lines (struct line_header *, char *, bfd *,
struct dwarf2_cu *, struct partial_symtab *);
@@ -1359,7 +1359,7 @@
bfd *abfd = objfile->obfd;
struct line_header *lh;
- lh = dwarf_decode_line_header (pdi->line_offset, abfd, cu);
+ lh = dwarf_decode_line_header (pdi->line_offset, abfd, cu, pst->dirname);
if (lh == NULL)
return; /* No linetable, so no includes. */
@@ -2652,7 +2652,7 @@
if (attr)
{
unsigned int line_offset = DW_UNSND (attr);
- line_header = dwarf_decode_line_header (line_offset, abfd, cu);
+ line_header = dwarf_decode_line_header (line_offset, abfd, cu, comp_dir);
if (line_header)
{
make_cleanup ((make_cleanup_ftype *) free_line_header,
@@ -6013,6 +6013,23 @@
return follow_die_ref (dwarf2_get_ref_die_offset (spec_attr, cu));
}
+/* Create full path name from absolute and relative parts.
+ The result string should be freed by caller when necessary. */
+static char*
+make_full_path (const char *full_part, const char *rel_part)
+{
+ char *result;
+
+ int dir_len = strlen(full_part);
+
+ result = xmalloc(dir_len + 1 + strlen(rel_part) + 1);
+ strcpy (result, full_part);
+ result[dir_len] = '/';
+ strcpy (result + dir_len + 1, rel_part);
+
+ return result;
+}
+
/* Free the line_header structure *LH, and any arrays and strings it
refers to. */
static void
@@ -6026,18 +6043,19 @@
if (lh->file_names)
xfree (lh->file_names);
- /* Similarly for the include directory names. */
+ /* Similarly for the include directory names - they will be freed independently. */
if (lh->include_dirs)
xfree (lh->include_dirs);
xfree (lh);
}
-
/* Add an entry to LH's include directory table. */
static void
-add_include_dir (struct line_header *lh, char *include_dir)
+add_include_dir (struct line_header *lh, char *include_dir, const char *comp_dir)
{
+ char* real_dir;
+
/* Grow the array if necessary. */
if (lh->include_dirs_size == 0)
{
@@ -6053,9 +6071,19 @@
* sizeof (*lh->include_dirs)));
}
- lh->include_dirs[lh->num_include_dirs++] = include_dir;
+ if (!IS_ABSOLUTE_PATH(include_dir) && comp_dir != NULL)
+ {
+ real_dir = make_full_path(comp_dir, include_dir);
+ make_cleanup(xfree, real_dir);
+ }
+ else
+ {
+ real_dir = include_dir;
+ }
+
+ lh->include_dirs[lh->num_include_dirs++] = real_dir;
}
-
+
/* Add an entry to LH's file name table. */
static void
@@ -6100,7 +6128,7 @@
freed. */
static struct line_header *
dwarf_decode_line_header (unsigned int offset, bfd *abfd,
- struct dwarf2_cu *cu)
+ struct dwarf2_cu *cu, const char* comp_dir)
{
struct cleanup *back_to;
struct line_header *lh;
@@ -6168,7 +6196,7 @@
while ((cur_dir = read_string (abfd, line_ptr, &bytes_read)) != NULL)
{
line_ptr += bytes_read;
- add_include_dir (lh, cur_dir);
+ add_include_dir (lh, cur_dir, comp_dir);
}
line_ptr += bytes_read;
@@ -8669,12 +8697,7 @@
if (dir)
{
- dir_len = strlen (dir);
- full_name = xmalloc (dir_len + 1 + strlen (fe->name) + 1);
- strcpy (full_name, dir);
- full_name[dir_len] = '/';
- strcpy (full_name + dir_len + 1, fe->name);
- return full_name;
+ return make_full_path(dir, fe->name);
}
else
return xstrdup (fe->name);
-----------
Kind regards,
Igor V. Kovalenko