debug/101473 - apply debug prefix maps before checksumming DIEs

Message ID 7r2no9op-poq7-qs93-q445-p275p1n9pr3@fhfr.qr
State New
Headers show
Series
  • debug/101473 - apply debug prefix maps before checksumming DIEs
Related show

Commit Message

Richard Biener July 20, 2021, 9:07 a.m.
The following makes sure to apply the debug prefix maps to filenames
before checksumming DIEs to create the global symbol for the CU DIE
used by LTO to link the late debug to the early debug.  This avoids
binary differences (in said symbol) when compiling with toolchains
installed under a different path and that compensated with appropriate
-fdebug-prefix-map options.

The easiest and most scalable way is to record both the unmapped
and the remapped filename in the dwarf_file_data so the remapping
process takes place at a single point and only once (otherwise it
creates GC garbage at each point doing that).

Bootstrapped and tested on x86_64-unknown-linux-gnu.  OK?

Thanks,
Richard.

2021-07-20  Richard Biener  <rguenther@suse.de>

	PR debug/101473
	* dwarf2out.h (dwarf_file_data): Add key member.
	* dwarf2out.c (dwarf_file_hasher::equal): Compare key.
	(dwarf_file_hasher::hash): Hash key.
	(lookup_filename): Remap the filename and store it in the
	filename member of dwarf_file_data when creating a new
	dwarf_file_data.
	(file_name_acquire): Do not remap the filename again.
	(maybe_emit_file): Likewise.
---
 gcc/dwarf2out.c | 12 ++++++------
 gcc/dwarf2out.h |  1 +
 2 files changed, 7 insertions(+), 6 deletions(-)

-- 
2.26.2

Comments

Martin Sebor via Gcc-patches July 20, 2021, 10:16 a.m. | #1
On Tue, Jul 20, 2021 at 11:07:26AM +0200, Richard Biener wrote:
> The following makes sure to apply the debug prefix maps to filenames

> before checksumming DIEs to create the global symbol for the CU DIE

> used by LTO to link the late debug to the early debug.  This avoids

> binary differences (in said symbol) when compiling with toolchains

> installed under a different path and that compensated with appropriate

> -fdebug-prefix-map options.

> 

> The easiest and most scalable way is to record both the unmapped

> and the remapped filename in the dwarf_file_data so the remapping

> process takes place at a single point and only once (otherwise it

> creates GC garbage at each point doing that).

> 

> Bootstrapped and tested on x86_64-unknown-linux-gnu.  OK?

> 

> Thanks,

> Richard.

> 

> 2021-07-20  Richard Biener  <rguenther@suse.de>

> 

> 	PR debug/101473

> 	* dwarf2out.h (dwarf_file_data): Add key member.

> 	* dwarf2out.c (dwarf_file_hasher::equal): Compare key.

> 	(dwarf_file_hasher::hash): Hash key.

> 	(lookup_filename): Remap the filename and store it in the

> 	filename member of dwarf_file_data when creating a new

> 	dwarf_file_data.

> 	(file_name_acquire): Do not remap the filename again.

> 	(maybe_emit_file): Likewise.


Ok.

	Jakub

Patch

diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 82783c4968b..884f1e191c6 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -12424,7 +12424,7 @@  file_name_acquire (dwarf_file_data **slot, file_name_acquire_data *fnad)
 
   fi = fnad->files + fnad->used_files++;
 
-  f = remap_debug_filename (d->filename);
+  f = d->filename;
 
   /* Skip all leading "./".  */
   while (f[0] == '.' && IS_DIR_SEPARATOR (f[1]))
@@ -27460,13 +27460,13 @@  dwarf2out_ignore_block (const_tree block)
 bool
 dwarf_file_hasher::equal (dwarf_file_data *p1, const char *p2)
 {
-  return filename_cmp (p1->filename, p2) == 0;
+  return filename_cmp (p1->key, p2) == 0;
 }
 
 hashval_t
 dwarf_file_hasher::hash (dwarf_file_data *p)
 {
-  return htab_hash_string (p->filename);
+  return htab_hash_string (p->key);
 }
 
 /* Lookup FILE_NAME (in the list of filenames that we know about here in
@@ -27496,7 +27496,8 @@  lookup_filename (const char *file_name)
     return *slot;
 
   created = ggc_alloc<dwarf_file_data> ();
-  created->filename = file_name;
+  created->key = file_name;
+  created->filename = remap_debug_filename (file_name);
   created->emitted_number = 0;
   *slot = created;
   return created;
@@ -27522,8 +27523,7 @@  maybe_emit_file (struct dwarf_file_data * fd)
       if (output_asm_line_debug_info ())
 	{
 	  fprintf (asm_out_file, "\t.file %u ", fd->emitted_number);
-	  output_quoted_string (asm_out_file,
-				remap_debug_filename (fd->filename));
+	  output_quoted_string (asm_out_file, fd->filename);
 	  fputc ('\n', asm_out_file);
 	}
     }
diff --git a/gcc/dwarf2out.h b/gcc/dwarf2out.h
index 057afdb53a0..b2152a53bf9 100644
--- a/gcc/dwarf2out.h
+++ b/gcc/dwarf2out.h
@@ -424,6 +424,7 @@  extern enum dwarf_tag dw_get_die_tag (dw_die_ref);
 
 /* Data about a single source file.  */
 struct GTY((for_user)) dwarf_file_data {
+  const char * key;
   const char * filename;
   int emitted_number;
 };