From: Simon Marchi <simon.marchi@polymtl.ca>
To: gdb-patches@sourceware.org
Subject: [PATCH v3 3/7] gdb/dwarf: pass compilation directory to line header
Date: Wed, 27 Apr 2022 23:35:38 -0400 [thread overview]
Message-ID: <20220428033542.1636284-4-simon.marchi@polymtl.ca> (raw)
In-Reply-To: <20220428033542.1636284-1-simon.marchi@polymtl.ca>
The following patch changes line_header::file_file_name to prepend the
compilation directory to the file name, if needed. For that, the line
header needs to know about the compilation directory. Prepare for that
by adding a constructor that takes it as a parameter, and passing the
value down everywhere needed. Add a second constructor for the special
case of building a line_header for doing a hash table lookup, since that
case doesn't require a compilation directory value.
Change-Id: Iba3ba0293e4e2d13a64b257cf9a3094684d54330
---
| 5 ++--
| 26 +++++++++++++++---
gdb/dwarf2/read.c | 27 ++++++++++---------
.../gdb.dwarf2/dw2-compdir-oldgcc.exp | 2 +-
4 files changed, 42 insertions(+), 18 deletions(-)
--git a/gdb/dwarf2/line-header.c b/gdb/dwarf2/line-header.c
index 63230847568c..13379851b9b6 100644
--- a/gdb/dwarf2/line-header.c
+++ b/gdb/dwarf2/line-header.c
@@ -264,7 +264,8 @@ line_header_up
dwarf_decode_line_header (sect_offset sect_off, bool is_dwz,
dwarf2_per_objfile *per_objfile,
struct dwarf2_section_info *section,
- const struct comp_unit_head *cu_header)
+ const struct comp_unit_head *cu_header,
+ const char *comp_dir)
{
const gdb_byte *line_ptr;
unsigned int bytes_read, offset_size;
@@ -281,7 +282,7 @@ dwarf_decode_line_header (sect_offset sect_off, bool is_dwz,
return 0;
}
- line_header_up lh (new line_header ());
+ line_header_up lh (new line_header (comp_dir));
lh->sect_off = sect_off;
lh->offset_in_dwz = is_dwz;
--git a/gdb/dwarf2/line-header.h b/gdb/dwarf2/line-header.h
index 59b317d0d727..53db3a1d5aa8 100644
--- a/gdb/dwarf2/line-header.h
+++ b/gdb/dwarf2/line-header.h
@@ -68,8 +68,18 @@ struct file_entry
which contains the following information. */
struct line_header
{
- line_header ()
- : offset_in_dwz {}
+ /* COMP_DIR is the value of the DW_AT_comp_dir attribute of the compilation
+ unit in the context of which we are reading this line header, or nullptr
+ if not applicable. */
+ line_header (const char *comp_dir)
+ : m_comp_dir (comp_dir != nullptr ? comp_dir : "")
+ {}
+
+ /* This constructor should only be used to create line_header intances to do
+ hash table lookups. */
+ line_header (sect_offset sect_off, bool offset_in_dwz)
+ : sect_off (sect_off),
+ offset_in_dwz (offset_in_dwz)
{}
/* Add an entry to the include directory table. */
@@ -161,6 +171,11 @@ struct line_header
number FILE in this object's file name table. */
std::string file_file_name (int file) const;
+ /* Return the compilation directory of the compilation unit in the context of
+ which this line header is read. Return nullptr if non applicable. */
+ const char *comp_dir () const
+ { return !m_comp_dir.empty () ? m_comp_dir.c_str () : nullptr; }
+
private:
/* The include_directories table. Note these are observing
pointers. The memory is owned by debug_line_buffer. */
@@ -171,6 +186,10 @@ struct line_header
before, and is 0 in DWARF 5 and later). So the client should use
file_name_at method for access. */
std::vector<file_entry> m_file_names;
+
+ /* Compilation directory of the compilation unit in the context of which this
+ line header is read. */
+ std::string m_comp_dir;
};
typedef std::unique_ptr<line_header> line_header_up;
@@ -191,6 +210,7 @@ file_entry::include_dir (const line_header *lh) const
extern line_header_up dwarf_decode_line_header
(sect_offset sect_off, bool is_dwz, dwarf2_per_objfile *per_objfile,
- struct dwarf2_section_info *section, const struct comp_unit_head *cu_header);
+ struct dwarf2_section_info *section, const struct comp_unit_head *cu_header,
+ const char *comp_dir);
#endif /* DWARF2_LINE_HEADER_H */
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index d146d5250669..56f58a004af6 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -943,7 +943,8 @@ static struct die_info *die_specification (struct die_info *die,
struct dwarf2_cu **);
static line_header_up dwarf_decode_line_header (sect_offset sect_off,
- struct dwarf2_cu *cu);
+ struct dwarf2_cu *cu,
+ const char *comp_dir);
static void dwarf_decode_lines (struct line_header *,
struct dwarf2_cu *,
@@ -2738,6 +2739,8 @@ dw2_get_file_names_reader (const struct die_reader_specs *reader,
line_header_up lh;
sect_offset line_offset {};
+ file_and_directory &fnd = find_file_and_directory (comp_unit_die, cu);
+
attr = dwarf2_attr (comp_unit_die, DW_AT_stmt_list, cu);
if (attr != nullptr && attr->form_is_unsigned ())
{
@@ -2757,11 +2760,9 @@ dw2_get_file_names_reader (const struct die_reader_specs *reader,
return;
}
- lh = dwarf_decode_line_header (line_offset, cu);
+ lh = dwarf_decode_line_header (line_offset, cu, fnd.get_comp_dir ());
}
- file_and_directory &fnd = find_file_and_directory (comp_unit_die, cu);
-
int offset = 0;
if (!fnd.is_unknown ())
++offset;
@@ -9416,11 +9417,11 @@ find_file_and_directory (struct die_info *die, struct dwarf2_cu *cu)
static void
handle_DW_AT_stmt_list (struct die_info *die, struct dwarf2_cu *cu,
+ const file_and_directory &fnd,
CORE_ADDR lowpc) /* ARI: editCase function */
{
dwarf2_per_objfile *per_objfile = cu->per_objfile;
struct attribute *attr;
- struct line_header line_header_local;
hashval_t line_header_local_hash;
void **slot;
int decode_mapping;
@@ -9449,8 +9450,7 @@ handle_DW_AT_stmt_list (struct die_info *die, struct dwarf2_cu *cu,
xcalloc, xfree));
}
- line_header_local.sect_off = line_offset;
- line_header_local.offset_in_dwz = cu->per_cu->is_dwz;
+ line_header line_header_local (line_offset, cu->per_cu->is_dwz);
line_header_local_hash = line_header_hash (&line_header_local);
if (per_objfile->line_header_hash != NULL)
{
@@ -9471,7 +9471,8 @@ handle_DW_AT_stmt_list (struct die_info *die, struct dwarf2_cu *cu,
/* dwarf_decode_line_header does not yet provide sufficient information.
We always have to call also dwarf_decode_lines for it. */
- line_header_up lh = dwarf_decode_line_header (line_offset, cu);
+ line_header_up lh = dwarf_decode_line_header (line_offset, cu,
+ fnd.get_comp_dir ());
if (lh == NULL)
return;
@@ -9549,7 +9550,7 @@ read_file_scope (struct die_info *die, struct dwarf2_cu *cu)
lnp_state_machine::check_line_address) will fail to properly
exclude an entry that was removed via --gc-sections. */
if (lowpc != highpc)
- handle_DW_AT_stmt_list (die, cu, lowpc);
+ handle_DW_AT_stmt_list (die, cu, fnd, lowpc);
/* Process all dies in compilation unit. */
if (die->child != NULL)
@@ -9623,7 +9624,7 @@ dwarf2_cu::setup_type_unit_groups (struct die_info *die)
if (attr != NULL && attr->form_is_unsigned ())
{
sect_offset line_offset = (sect_offset) attr->as_unsigned ();
- lh = dwarf_decode_line_header (line_offset, this);
+ lh = dwarf_decode_line_header (line_offset, this, nullptr);
}
if (lh == NULL)
{
@@ -19664,7 +19665,8 @@ get_debug_line_section (struct dwarf2_cu *cu)
and must not be freed. */
static line_header_up
-dwarf_decode_line_header (sect_offset sect_off, struct dwarf2_cu *cu)
+dwarf_decode_line_header (sect_offset sect_off, struct dwarf2_cu *cu,
+ const char *comp_dir)
{
struct dwarf2_section_info *section;
dwarf2_per_objfile *per_objfile = cu->per_objfile;
@@ -19681,7 +19683,8 @@ dwarf_decode_line_header (sect_offset sect_off, struct dwarf2_cu *cu)
}
return dwarf_decode_line_header (sect_off, cu->per_cu->is_dwz,
- per_objfile, section, &cu->header);
+ per_objfile, section, &cu->header,
+ comp_dir);
}
/* Subroutine of dwarf_decode_lines to simplify it.
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-compdir-oldgcc.exp b/gdb/testsuite/gdb.dwarf2/dw2-compdir-oldgcc.exp
index 0766b9688aeb..0601d26f4e86 100644
--- a/gdb/testsuite/gdb.dwarf2/dw2-compdir-oldgcc.exp
+++ b/gdb/testsuite/gdb.dwarf2/dw2-compdir-oldgcc.exp
@@ -30,7 +30,7 @@ if {[prepare_for_testing "failed to prepare" $testfile $srcfile \
# Here should be GDB-computed "Compilation directory is".
gdb_test "list gcc42" ".*"
-gdb_test "info source" "\r\nCurrent source file is dw2-compdir-oldgcc42.S\r\nCompilation directory is /dir/d\r\n.*" \
+gdb_test "info source" "\r\nCurrent source file is /dir/d/dw2-compdir-oldgcc42.S\r\nCompilation directory is /dir/d\r\n.*" \
"info source gcc42"
# Here should not be GDB-computed "Compilation directory is".
--
2.35.2
next prev parent reply other threads:[~2022-04-28 3:35 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-04-28 3:35 [PATCH v3 0/7] Fix printing macros Simon Marchi
2022-04-28 3:35 ` [PATCH v3 1/7] gdb: introduce symtab_create_debug_printf Simon Marchi
2022-04-28 15:49 ` Tom Tromey
2022-04-28 3:35 ` [PATCH v3 2/7] gdb: add debug prints in buildsym.c Simon Marchi
2022-04-28 15:50 ` Tom Tromey
2022-04-28 3:35 ` Simon Marchi [this message]
2022-04-28 15:48 ` [PATCH v3 3/7] gdb/dwarf: pass compilation directory to line header Tom Tromey
2022-04-28 15:59 ` Simon Marchi
2022-04-28 3:35 ` [PATCH v3 4/7] gdb/dwarf: pass a file_entry to line_header::file_file_name Simon Marchi
2022-05-03 20:12 ` Bruno Larsen
2022-07-28 16:26 ` Simon Marchi
2022-04-28 3:35 ` [PATCH v3 5/7] gdb: add "id" fields to identify symtabs and subfiles Simon Marchi
2022-04-28 23:53 ` Lancelot SIX
2022-07-28 17:46 ` Simon Marchi
2022-04-28 3:35 ` [PATCH v3 6/7] gdb: remove code to prepend comp dir in buildsym_compunit::start_subfile Simon Marchi
2022-05-12 13:07 ` Bruno Larsen
2022-07-28 17:47 ` Simon Marchi
2022-04-28 3:35 ` [PATCH v3 7/7] gdb/testsuite: add macros test for source files compiled in various ways Simon Marchi
2022-05-12 13:17 ` Bruno Larsen
2022-07-28 17:51 ` Simon Marchi
2022-07-30 0:56 ` [PATCH v3 0/7] Fix printing macros Simon Marchi
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=20220428033542.1636284-4-simon.marchi@polymtl.ca \
--to=simon.marchi@polymtl.ca \
--cc=gdb-patches@sourceware.org \
/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;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).