From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 21142 invoked by alias); 30 Sep 2004 00:40:42 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 21129 invoked from network); 30 Sep 2004 00:40:39 -0000 Received: from unknown (HELO skysamba) (81.195.20.30) by sourceware.org with SMTP; 30 Sep 2004 00:40:39 -0000 Received: from garrisonhq ([127.0.0.1]) by skysamba with esmtp (Exim 4.42) id 1CCp2N-0007pN-C7; Thu, 30 Sep 2004 04:43:11 +0400 Message-ID: <415B569E.2080805@mail.ru> Date: Thu, 30 Sep 2004 00:40:00 -0000 From: Garrison User-Agent: Mozilla Thunderbird 0.6+ (X11/20040919) MIME-Version: 1.0 To: jimb@redhat.com CC: cagney@gnu.org, gdb-patches@sources.redhat.com Subject: Re: Patch: Handle relative paths in .debug_line X-Enigmail-Version: 0.86.0.0 X-Enigmail-Supports: pgp-inline, pgp-mime Content-Type: text/plain; charset=KOI8-R; format=flowed Content-Transfer-Encoding: 7bit X-SW-Source: 2004-09/txt/msg00483.txt.bz2 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