From: Frederic RISS <frederic.riss@st.com>
To: Jim Blandy <jimb@red-bean.com>
Cc: Daniel Jacobowitz <drow@false.org>,
GDB Patches <gdb-patches@sourceware.org>
Subject: Re: [RFC] Don't lose compilation directory in Dwarf2 line-tables
Date: Fri, 21 Apr 2006 08:35:00 -0000 [thread overview]
Message-ID: <1145608477.14807.1018.camel@crx549.cro.st.com> (raw)
In-Reply-To: <8f2776cb0604201809l68067aey47fa372a2468c8ea@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 1257 bytes --]
On Thu, 2006-04-20 at 18:09 -0700, Jim Blandy wrote:
> So, Frederic, your last patch doesn't introduce any new problems that
> I can see, and it does solve the problem you set out to solve
> originally (losing comp_dir), but if you're willing go around one more
> time, we can try to add the info consistently:
OK, here we go.
> - Leave the comparison loop alone, as in your last patch.
> - If dwarf2_start_subfile does have to start a subfile itself, always
> pass comp_dir as start_subfile's second argument, whether it's NULL or
> not (because this is what we do when calling start_symtab), and
> concatenate dirname, if it's non-null, with filename to get
> start_subfile's first argument. I think this means that 'fullname'
> always gets used, so you can hoist that computation and its xfree out
> of the 'if'.
But then, the loop in dwarf2_start_subfile doesn't serve any purpose,
because the loop at the beginning of start_subfile proper will do the
same work. Or maybe I'm missing something?
> Either way, this definitely needs a comment. If you'd like to write
> up one yourself, great; if not, that's fine; I'll put one in after
> your patch goes in.
Attached is a new patch that adds comments and removes the superfluous
loop. How's that?
[-- Attachment #2: dwarf2-keep-compdir.patch --]
[-- Type: text/x-patch, Size: 4620 bytes --]
2006-04-21 Frederic Riss <frederic.riss@st.com>
* dwarf2read.c (dwarf2_start_subfile): Change prototype to accept
compilation directory as last argument.
Always pass comp_dir as second argument to start_subfile and prepend
dirname to the filename when necessary.
Remove now superfluous search for pre-existing subfile.
(dwarf_decode_lines): Pass the compilation directory to
dwarf2_start_subfile.
--- dwarf2read.c.orig 2006-04-13 11:17:40.000000000 +0200
+++ dwarf2read.c 2006-04-21 10:02:08.000000000 +0200
@@ -846,7 +846,7 @@
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 *);
@@ -6529,13 +6529,12 @@
directory and file name numbers in the statement program
are 1-based. */
struct file_entry *fe = &lh->file_names[file - 1];
- char *dir;
+ char *dir = NULL;
if (fe->dir_index)
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. */
@@ -6627,17 +6626,16 @@
0-based, but the directory and file name numbers in
the statement program are 1-based. */
struct file_entry *fe;
- char *dir;
+ char *dir = NULL;
file = read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
line_ptr += bytes_read;
fe = &lh->file_names[file - 1];
if (fe->dir_index)
dir = lh->include_dirs[fe->dir_index - 1];
- 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:
@@ -6717,7 +6715,8 @@
/* Start a subfile for DWARF. FILENAME is the name of the file and
DIRNAME the name of the source directory which contains FILENAME
- or NULL if not known.
+ or NULL if not known. COMP_DIR is the compilation directory for the
+ linetable's compilation unit or NULL if not known.
This routine tries to keep line numbers from identical absolute and
relative file names in a common subfile.
@@ -6733,31 +6732,35 @@
files.files[1].dir: /srcdir
The line number information for list0.c has to end up in a single
- subfile, so that `break /srcdir/list0.c:1' works as expected. */
-
-static void
-dwarf2_start_subfile (char *filename, char *dirname)
-{
- /* If the filename isn't absolute, try to match an existing subfile
- with the full pathname. */
+ subfile, so that `break /srcdir/list0.c:1' works as expected.
+ start_subfile will ensure that this happens provided that we pass the
+ concatenation of files.files[1].dir and files.files[1].name as the
+ subfile's name. */
+
+static void
+dwarf2_start_subfile (char *filename, char *dirname, char *comp_dir)
+{
+ char *fullname;
+
+ /* While reading the DIEs, we call start_symtab(DW_AT_name, DW_AT_comp_dir).
+ `start_symtab' will always pass the contents of DW_AT_comp_dir as
+ second argument to start_subfile. To be consistent, we do the
+ same here. In order not to lose the line information directory,
+ we concatenate it to the filename when it makes sense.
+ Note that the Dwarf3 standard says (speaking of filenames in line
+ information): ``The directory index is ignored for file names
+ that represent full path names''. Thus ignoring dirname in the
+ `else' branch below isn't an issue. */
if (!IS_ABSOLUTE_PATH (filename) && dirname != NULL)
- {
- struct subfile *subfile;
- char *fullname = concat (dirname, "/", filename, (char *)NULL);
+ fullname = concat (dirname, SLASH_STRING, filename, (char *)NULL);
+ else
+ fullname = filename;
- for (subfile = subfiles; subfile; subfile = subfile->next)
- {
- if (FILENAME_CMP (subfile->name, fullname) == 0)
- {
- current_subfile = subfile;
- xfree (fullname);
- return;
- }
- }
- xfree (fullname);
- }
- start_subfile (filename, dirname);
+ start_subfile (fullname, comp_dir);
+
+ if (fullname != filename)
+ xfree (fullname);
}
static void
next prev parent reply other threads:[~2006-04-21 8:35 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-04-13 11:25 [RFC] Don't loose " Frederic RISS
2006-04-13 17:49 ` Jim Blandy
2006-04-14 7:32 ` [RFC] Don't lose " Frederic RISS
2006-04-14 7:41 ` Jim Blandy
2006-04-14 8:23 ` Frederic RISS
2006-04-14 14:04 ` Daniel Jacobowitz
2006-04-14 14:51 ` Frederic RISS
2006-04-18 12:32 ` Frederic RISS
2006-04-18 13:04 ` Daniel Jacobowitz
2006-04-18 14:00 ` Frederic RISS
2006-04-20 16:27 ` Daniel Jacobowitz
2006-04-21 7:14 ` Frederic RISS
2006-04-21 1:10 ` Jim Blandy
2006-04-21 8:35 ` Frederic RISS [this message]
2006-04-21 16:46 ` Jim Blandy
2006-04-21 17:00 ` Frederic RISS
2006-04-24 12:49 ` Andrew STUBBS
2006-04-14 8:44 ` Eli Zaretskii
2006-04-14 11:44 ` Frederic RISS
2006-04-14 13:08 ` Eli Zaretskii
2006-04-14 13:42 ` Frederic RISS
2006-04-14 14:21 ` Eli Zaretskii
2006-04-14 14:58 ` Daniel Jacobowitz
2006-04-14 15:03 ` Eli Zaretskii
2006-04-14 18:39 ` Frédéric Riss
2006-04-13 19:58 ` [RFC] Don't loose " Jason Molenda
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1145608477.14807.1018.camel@crx549.cro.st.com \
--to=frederic.riss@st.com \
--cc=drow@false.org \
--cc=gdb-patches@sourceware.org \
--cc=jimb@red-bean.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox