public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* Debug info path remapping
@ 2007-07-05  5:02 Joseph S. Myers
  2007-07-05 20:04 ` Danny Backx
  2007-08-11 23:51 ` Ping " Joseph S. Myers
  0 siblings, 2 replies; 6+ messages in thread
From: Joseph S. Myers @ 2007-07-05  5:02 UTC (permalink / raw)
  To: gcc-patches, binutils

These GCC and GAS patches add compiler and assembler support for
remapping paths when generating debug information, as discussed in
<http://gcc.gnu.org/ml/gcc-patches/2006-10/msg00064.html> and thread.
This allows you to generate objects whose debug information references
a canonical location for source files, without the limitations of
postprocessing the objects (on lengths of paths involved etc.).

A GCC option -fdebug-prefix-map=OLD=NEW, a GAS option
--debug-prefix-map OLD=NEW, and a configure option
--with-debug-prefix-map="OLD1=NEW1 OLD2=NEW2 ..." are added.  The
configure option causes the -fdebug-prefix-map options to be passed
when building GCC's runtime libraries; when applied to src, it has the
same effect for building newlib.  GCC passes --debug-prefix-map to the
assembler if support was available at configure time.

The change to dwarf2out.c:file_table_relative_p deals with the case
where you compile a source file from an absolute path but with a
relative -I option; at the point dwarf2out_finish checks whether
DW_AT_comp_dir is needed, d->emitted_number is 0 and it only becomes 1
later.  This is needed to have correct debug information from which
the relocated paths to all source files can be found.

Tested with no regressions on i686-pc-linux-gnu.  OK to commit?

(For the GAS patch, see below the GCC one.)

2007-07-04  Paul Brook  <paul@codesourcery.com>
            Joseph Myers  <joseph@codesourcery.com>

	* Makefile.tpl (DEBUG_PREFIX_CFLAGS_FOR_TARGET): New.
	(CFLAGS_FOR_TARGET, CXXFLAGS_FOR_TARGET): Include it.
	* Makefile.in: Regenerate.
	* configure.ac (--with-debug-prefix-map): New.
	* configure: Regenerate.

config:
2007-07-04  Paul Brook  <paul@codesourcery.com>
            Joseph Myers  <joseph@codesourcery.com>

	* mt-gnu (CXXFLAGS_FOR_TARGET): Add
	$(DEBUG_PREFIX_CFLAGS_FOR_TARGET).

gcc:
2007-07-04  Paul Brook  <paul@codesourcery.com>
            Joseph Myers  <joseph@codesourcery.com>

	* common.opt (-fdebug-prefix-map=): New option.
	* opts.c: Include debug.h.
	(common_handle_option): Handle -fdebug-prefix-map.
	* final.c: Include ggc.h.
	(struct debug_prefix_map, debug_prefix_maps, add_debug_prefix_map,
	remap_debug_filename): New.
	* Makefile.in (final.o, opts.o): Update dependencies.
	* debug.h (remap_debug_filename, add_debug_prefix_map): Declare.
	* configure.ac: Check for assembler --debug-prefix-map support.
	* configure, config.in: Regenerate.
	* gcc.c (ASM_MAP): Define conditional on HAVE_AS_DEBUG_PREFIX_MAP.
	(ASM_DEBUG_SPEC): Include ASM_MAP.
	* doc/install.texi (--with-debug-prefix-map): Document.
	* doc/invoke.texi (-fdebug-prefix-map): Document.
	* dbxout.c (dbxout_init, dbxout_start_source_file,
	dbxout_source_file): Call remap_debug_filename.
	* dwarf2out.c (add_comp_dir_attribute, maybe_emit_file,
	dwarf2out_start_source_file, dwarf2out_finish): Call
	remap_debug_filename.
	(file_table_relative_p): Do not check d->emitted_number.
	* toplev.c (output_file_directive): Call remap_debug_filename.
	* vmsdbgout.c (write_srccorr): Call remap_debug_filename.
	* xcoffout.c (xcoffout_source_file): Call remap_debug_filename.

Index: gcc/doc/invoke.texi
===================================================================
--- gcc/doc/invoke.texi	(revision 126328)
+++ gcc/doc/invoke.texi	(working copy)
@@ -303,6 +303,7 @@
 -ftest-coverage  -ftime-report -fvar-tracking @gol
 -g  -g@var{level}  -gcoff -gdwarf-2 @gol
 -ggdb  -gstabs  -gstabs+  -gvms  -gxcoff  -gxcoff+ @gol
+-fdebug-prefix-map=@var{old}=@var{new} @gol
 -femit-struct-debug-baseonly -femit-struct-debug-reduced @gol
 -femit-struct-debug-detailed@r{[}=@var{spec-list}@r{]} @gol
 -p  -pg  -print-file-name=@var{library}  -print-libgcc-file-name @gol
@@ -4133,6 +4134,11 @@
 
 This option works only with DWARF 2.
 
+@item -fdebug-prefix-map=@var{old}=@var{new}
+@opindex fdebug-prefix-map
+When compiling files in directory @file{@var{old}}, record debugging
+information describing them as in @file{@var{new}} instead.
+
 @cindex @command{prof}
 @item -p
 @opindex p
Index: gcc/doc/install.texi
===================================================================
--- gcc/doc/install.texi	(revision 126328)
+++ gcc/doc/install.texi	(working copy)
@@ -1345,6 +1345,11 @@
 shorthand assumptions are not correct, you can use the explicit
 include and lib options directly.
 
+@item --with-debug-prefix-map=@var{map}
+Convert source directory names using @option{-fdebug-prefix-map} when
+building runtime libraries.  @samp{@var{map}} is a space-separated
+list of maps of the form @samp{@var{old}=@var{new}}.
+
 @end table
 
 @subheading Cross-Compiler-Specific Options
Index: gcc/final.c
===================================================================
--- gcc/final.c	(revision 126328)
+++ gcc/final.c	(working copy)
@@ -78,6 +78,7 @@
 #include "coverage.h"
 #include "df.h"
 #include "vecprim.h"
+#include "ggc.h"
 
 #ifdef XCOFF_DEBUGGING_INFO
 #include "xcoffout.h"		/* Needed for external data
@@ -1351,6 +1352,72 @@
 }
 #endif
 \f
+/* ??? This is probably the wrong place for these.  */
+/* Structure recording the mapping from source file and directory
+   names at compile time to those to be embedded in debug
+   information.  */
+typedef struct debug_prefix_map
+{
+  const char *old_prefix;
+  const char *new_prefix;
+  size_t old_len;
+  size_t new_len;
+  struct debug_prefix_map *next;
+} debug_prefix_map;
+
+/* Linked list of such structures.  */
+debug_prefix_map *debug_prefix_maps;
+
+
+/* Record a debug file prefix mapping.  ARG is the argument to
+   -fdebug-prefix-map and must be of the form OLD=NEW.  */
+
+void
+add_debug_prefix_map (const char *arg)
+{
+  debug_prefix_map *map;
+  const char *p;
+
+  p = strchr (arg, '=');
+  if (!p)
+    {
+      error ("invalid argument %qs to -fdebug-prefix-map", arg);
+      return;
+    }
+  map = XNEW (debug_prefix_map);
+  map->old_prefix = ggc_alloc_string (arg, p - arg);
+  map->old_len = p - arg;
+  p++;
+  map->new_prefix = ggc_strdup (p);
+  map->new_len = strlen (p);
+  map->next = debug_prefix_maps;
+  debug_prefix_maps = map;
+}
+
+/* Perform user-specified mapping of debug filename prefixes.  Return
+   the new name corresponding to FILENAME.  */
+
+const char *
+remap_debug_filename (const char *filename)
+{
+  debug_prefix_map *map;
+  char *s;
+  const char *name;
+  size_t name_len;
+
+  for (map = debug_prefix_maps; map; map = map->next)
+    if (strncmp (filename, map->old_prefix, map->old_len) == 0)
+      break;
+  if (!map)
+    return filename;
+  name = filename + map->old_len;
+  name_len = strlen (name) + 1;
+  s = (char *) alloca (name_len + map->new_len);
+  memcpy (s, map->new_prefix, map->new_len);
+  memcpy (s + map->new_len, name, name_len);
+  return ggc_strdup (s);
+}
+\f
 /* Output assembler code for the start of a function,
    and initialize some of the variables in this file
    for the new function.  The label for the function and associated
Index: gcc/gcc.c
===================================================================
--- gcc/gcc.c	(revision 126328)
+++ gcc/gcc.c	(working copy)
@@ -656,21 +656,27 @@
 #define LINKER_NAME "collect2"
 #endif
 
+#ifdef HAVE_AS_DEBUG_PREFIX_MAP
+#define ASM_MAP " %{fdebug-prefix-map=*:--debug-prefix-map %*}"
+#else
+#define ASM_MAP ""
+#endif
+
 /* Define ASM_DEBUG_SPEC to be a spec suitable for translating '-g'
    to the assembler.  */
 #ifndef ASM_DEBUG_SPEC
 # if defined(DBX_DEBUGGING_INFO) && defined(DWARF2_DEBUGGING_INFO) \
      && defined(HAVE_AS_GDWARF2_DEBUG_FLAG) && defined(HAVE_AS_GSTABS_DEBUG_FLAG)
-#  define ASM_DEBUG_SPEC					\
-      (PREFERRED_DEBUGGING_TYPE == DBX_DEBUG			\
-       ? "%{gdwarf-2*:--gdwarf2}%{!gdwarf-2*:%{g*:--gstabs}}"	\
-       : "%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}}")
+#  define ASM_DEBUG_SPEC						\
+      (PREFERRED_DEBUGGING_TYPE == DBX_DEBUG				\
+       ? "%{gdwarf-2*:--gdwarf2}%{!gdwarf-2*:%{g*:--gstabs}}" ASM_MAP	\
+       : "%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}}" ASM_MAP)
 # else
 #  if defined(DBX_DEBUGGING_INFO) && defined(HAVE_AS_GSTABS_DEBUG_FLAG)
-#   define ASM_DEBUG_SPEC "%{g*:--gstabs}"
+#   define ASM_DEBUG_SPEC "%{g*:--gstabs}" ASM_MAP
 #  endif
 #  if defined(DWARF2_DEBUGGING_INFO) && defined(HAVE_AS_GDWARF2_DEBUG_FLAG)
-#   define ASM_DEBUG_SPEC "%{g*:--gdwarf2}"
+#   define ASM_DEBUG_SPEC "%{g*:--gdwarf2}" ASM_MAP
 #  endif
 # endif
 #endif
Index: gcc/toplev.c
===================================================================
--- gcc/toplev.c	(revision 126328)
+++ gcc/toplev.c	(working copy)
@@ -702,6 +702,8 @@
 
   if (input_name == NULL)
     input_name = "<stdin>";
+  else
+    input_name = remap_debug_filename (input_name);
 
   len = strlen (input_name);
   na = input_name + len;
Index: gcc/vmsdbgout.c
===================================================================
--- gcc/vmsdbgout.c	(revision 126328)
+++ gcc/vmsdbgout.c	(working copy)
@@ -1150,7 +1150,8 @@
     (src_command.dst_a_src_cmd_fields.dst_a_src_decl_src.dst_b_src_df_filename,
      "source_corr (filename length)", dosizeonly);
 
-  totsize += write_debug_string (file_info_entry.file_name,
+  totsize += write_debug_string (remap_debug_filename (
+				    file_info_entry.file_name),
 				 "source file name", dosizeonly);
   totsize += write_debug_data1 (src_cmdtrlr.dst_b_src_df_libmodname,
 				"source_corr (libmodname)", dosizeonly);
Index: gcc/debug.h
===================================================================
--- gcc/debug.h	(revision 126328)
+++ gcc/debug.h	(working copy)
@@ -167,4 +167,7 @@
 extern int debug_nesting;
 extern int symbol_queue_index;
 
+const char *remap_debug_filename (const char *);
+void add_debug_prefix_map (const char *);
+
 #endif /* !GCC_DEBUG_H  */
Index: gcc/dbxout.c
===================================================================
--- gcc/dbxout.c	(revision 126328)
+++ gcc/dbxout.c	(working copy)
@@ -984,6 +984,7 @@
   char ltext_label_name[100];
   bool used_ltext_label_name = false;
   tree syms = lang_hooks.decls.getdecls ();
+  const char *mapped_name;
 
   typevec_len = 100;
   typevec = ggc_calloc (typevec_len, sizeof typevec[0]);
@@ -1009,6 +1010,7 @@
 	    cwd = "/";
 	  else if (!IS_DIR_SEPARATOR (cwd[strlen (cwd) - 1]))
 	    cwd = concat (cwd, "/", NULL);
+	  cwd = remap_debug_filename (cwd);
 	}
 #ifdef DBX_OUTPUT_MAIN_SOURCE_DIRECTORY
       DBX_OUTPUT_MAIN_SOURCE_DIRECTORY (asm_out_file, cwd);
@@ -1019,10 +1021,11 @@
 #endif /* no DBX_OUTPUT_MAIN_SOURCE_DIRECTORY */
     }
 
+  mapped_name = remap_debug_filename (input_file_name);
 #ifdef DBX_OUTPUT_MAIN_SOURCE_FILENAME
-  DBX_OUTPUT_MAIN_SOURCE_FILENAME (asm_out_file, input_file_name);
+  DBX_OUTPUT_MAIN_SOURCE_FILENAME (asm_out_file, mapped_name);
 #else
-  dbxout_begin_simple_stabs_desc (input_file_name, N_SO, get_lang_number ());
+  dbxout_begin_simple_stabs_desc (mapped_name, N_SO, get_lang_number ());
   dbxout_stab_value_label (ltext_label_name);
   used_ltext_label_name = true;
 #endif
@@ -1164,7 +1167,7 @@
   n->prev = NULL;
   current_file->prev = n;
   n->bincl_status = BINCL_PENDING;
-  n->pending_bincl_name = filename;
+  n->pending_bincl_name = remap_debug_filename (filename);
   pending_bincls = 1;
   current_file = n;
 #endif
@@ -1230,7 +1233,7 @@
       if (current_function_decl == NULL_TREE)
 	switch_to_section (text_section);
 
-      dbxout_begin_simple_stabs (filename, N_SOL);
+      dbxout_begin_simple_stabs (remap_debug_filename (filename), N_SOL);
       dbxout_stab_value_internal_label ("Ltext", &source_label_number);
       lastfile = filename;
     }
Index: gcc/xcoffout.c
===================================================================
--- gcc/xcoffout.c	(revision 126328)
+++ gcc/xcoffout.c	(working copy)
@@ -301,7 +301,8 @@
       if (xcoff_current_include_file)
 	{
 	  fprintf (file, "\t.ei\t");
-	  output_quoted_string (file, xcoff_current_include_file);
+	  output_quoted_string (file,
+	      remap_debug_filename (xcoff_current_include_file));
 	  fprintf (file, "\n");
 	  xcoff_current_include_file = NULL;
 	}
@@ -309,7 +310,7 @@
       if (strcmp (main_input_filename, filename) || inline_p)
 	{
 	  fprintf (file, "\t.bi\t");
-	  output_quoted_string (file, filename);
+	  output_quoted_string (file, remap_debug_filename (filename));
 	  fprintf (file, "\n");
 	  xcoff_current_include_file = filename;
 	}
Index: gcc/dwarf2out.c
===================================================================
--- gcc/dwarf2out.c	(revision 126328)
+++ gcc/dwarf2out.c	(working copy)
@@ -10734,7 +10734,7 @@
 {
   const char *wd = get_src_pwd ();
   if (wd != NULL)
-    add_AT_string (die, DW_AT_comp_dir, wd);
+    add_AT_string (die, DW_AT_comp_dir, remap_debug_filename (wd));
 }
 
 /* Given a tree node describing an array bound (either lower or upper) output
@@ -13827,7 +13827,8 @@
       if (DWARF2_ASM_LINE_DEBUG_INFO)
 	{
 	  fprintf (asm_out_file, "\t.file %u ", fd->emitted_number);
-	  output_quoted_string (asm_out_file, fd->filename);
+	  output_quoted_string (asm_out_file,
+				remap_debug_filename (fd->filename));
 	  fputc ('\n', asm_out_file);
 	}
     }
@@ -13994,7 +13995,7 @@
       dw_die_ref bincl_die;
 
       bincl_die = new_die (DW_TAG_GNU_BINCL, comp_unit_die, NULL);
-      add_AT_string (bincl_die, DW_AT_name, filename);
+      add_AT_string (bincl_die, DW_AT_name, remap_debug_filename (filename));
     }
 
   if (debug_info_level >= DINFO_LEVEL_VERBOSE)
@@ -14453,7 +14454,7 @@
 {
   bool *p = param;
   struct dwarf_file_data *d = *slot;
-  if (d->emitted_number && !IS_ABSOLUTE_PATH (d->filename))
+  if (!IS_ABSOLUTE_PATH (d->filename))
     {
       *p = true;
       return 0;
@@ -14472,7 +14473,7 @@
 
   /* Add the name for the main input file now.  We delayed this from
      dwarf2out_init to avoid complications with PCH.  */
-  add_name_attribute (comp_unit_die, filename);
+  add_name_attribute (comp_unit_die, remap_debug_filename (filename));
   if (!IS_ABSOLUTE_PATH (filename))
     add_comp_dir_attribute (comp_unit_die);
   else if (get_AT (comp_unit_die, DW_AT_comp_dir) == NULL)
Index: gcc/opts.c
===================================================================
--- gcc/opts.c	(revision 126328)
+++ gcc/opts.c	(working copy)
@@ -41,6 +41,7 @@
 #include "target.h"
 #include "tree-pass.h"
 #include "dbgcnt.h"
+#include "debug.h"
 
 /* Value of the -G xx switch, and whether it was passed or not.  */
 unsigned HOST_WIDE_INT g_switch_value;
@@ -1442,6 +1443,10 @@
       dbg_cnt_list_all_counters ();
       break;
 
+    case OPT_fdebug_prefix_map_:
+      add_debug_prefix_map (arg);
+      break;
+
     case OPT_fdiagnostics_show_location_:
       if (!strcmp (arg, "once"))
 	diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
Index: gcc/configure.ac
===================================================================
--- gcc/configure.ac	(revision 126328)
+++ gcc/configure.ac	(working copy)
@@ -3050,6 +3050,12 @@
    fi],
   [AC_DEFINE(HAVE_AS_GSTABS_DEBUG_FLAG, 1,
 [Define if your assembler supports the --gstabs option.])])
+
+ gcc_GAS_CHECK_FEATURE([--debug-prefix-map option],
+  gcc_cv_as_debug_prefix_map_flag,
+  [2,18,0], [--debug-prefix-map /a=/b], [$insn],,
+  [AC_DEFINE(HAVE_AS_DEBUG_PREFIX_MAP, 1,
+[Define if your assembler supports the --debug-prefix-map option.])])
 fi
 
 AC_CACHE_CHECK([assembler for tolerance to line number 0],
Index: gcc/common.opt
===================================================================
--- gcc/common.opt	(revision 126328)
+++ gcc/common.opt	(working copy)
@@ -400,6 +400,10 @@
 Common RejectNegative Joined
 -fdbg-cnt=<counter>:<limit>[,<counter>:<limit>,...]    Set the debug counter limit.   
 
+fdebug-prefix-map=
+Common Joined RejectNegative
+Map one directory name to another in debug information
+
 ; Nonzero for -fdefer-pop: don't pop args after each function call
 ; instead save them up to pop many calls' args with one insns.
 fdefer-pop
Index: gcc/Makefile.in
===================================================================
--- gcc/Makefile.in	(revision 126328)
+++ gcc/Makefile.in	(working copy)
@@ -2276,7 +2276,7 @@
 opts.o : opts.c opts.h options.h toplev.h $(CONFIG_H) $(SYSTEM_H) \
    coretypes.h $(TREE_H) $(TM_H) langhooks.h $(GGC_H) $(RTL_H) \
    output.h $(DIAGNOSTIC_H) $(TM_P_H) $(INSN_ATTR_H) intl.h $(TARGET_H) \
-   $(FLAGS_H) $(PARAMS_H) tree-pass.h $(DBGCNT_H)
+   $(FLAGS_H) $(PARAMS_H) tree-pass.h $(DBGCNT_H) debug.h
 opts-common.o : opts-common.c opts.h $(CONFIG_H) $(SYSTEM_H) \
    coretypes.h intl.h
 targhooks.o : targhooks.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TREE_H) \
@@ -2762,7 +2762,7 @@
    insn-config.h $(INSN_ATTR_H) $(FUNCTION_H) output.h hard-reg-set.h \
    except.h debug.h xcoffout.h toplev.h reload.h dwarf2out.h tree-pass.h \
    $(BASIC_BLOCK_H) $(TM_P_H) $(TARGET_H) $(EXPR_H) $(CFGLAYOUT_H) dbxout.h \
-   $(TIMEVAR_H) $(CGRAPH_H) $(COVERAGE_H) $(REAL_H) $(DF_H) vecprim.h
+   $(TIMEVAR_H) $(CGRAPH_H) $(COVERAGE_H) $(REAL_H) $(DF_H) vecprim.h $(GGC_H)
 recog.o : recog.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
    $(FUNCTION_H) $(BASIC_BLOCK_H) $(REGS_H) $(RECOG_H) $(EXPR_H) \
    $(FLAGS_H) insn-config.h $(INSN_ATTR_H) toplev.h output.h reload.h \
Index: configure.ac
===================================================================
--- configure.ac	(revision 126328)
+++ configure.ac	(working copy)
@@ -1590,6 +1590,18 @@
   [SYSROOT_CFLAGS_FOR_TARGET=])
 AC_SUBST(SYSROOT_CFLAGS_FOR_TARGET)
 
+AC_ARG_WITH([debug-prefix-map],
+  [  --with-debug-prefix-map='A=B C=D ...'
+                             map A to B, C to D ... in debug information],
+  [if test x"$withval" != x; then
+     DEBUG_PREFIX_CFLAGS_FOR_TARGET=
+     for debug_map in $withval; do
+       DEBUG_PREFIX_CFLAGS_FOR_TARGET="$DEBUG_PREFIX_CFLAGS_FOR_TARGET -fdebug-prefix-map=$debug_map"
+     done
+   fi],
+  [DEBUG_PREFIX_CFLAGS_FOR_TARGET=])
+AC_SUBST(DEBUG_PREFIX_CFLAGS_FOR_TARGET)
+
 # Handle --with-headers=XXX.  If the value is not "yes", the contents of
 # the named directory are copied to $(tooldir)/sys-include.
 if test x"${with_headers}" != x && test x"${with_headers}" != xno ; then
Index: Makefile.tpl
===================================================================
--- Makefile.tpl	(revision 126328)
+++ Makefile.tpl	(working copy)
@@ -361,9 +361,12 @@
 # CFLAGS will be just -g.  We want to ensure that TARGET libraries
 # (which we know are built with gcc) are built with optimizations so
 # prepend -O2 when setting CFLAGS_FOR_TARGET.
-CFLAGS_FOR_TARGET = -O2 $(CFLAGS) $(SYSROOT_CFLAGS_FOR_TARGET)
+CFLAGS_FOR_TARGET = -O2 $(CFLAGS) $(SYSROOT_CFLAGS_FOR_TARGET) \
+	$(DEBUG_PREFIX_CFLAGS_FOR_TARGET)
 SYSROOT_CFLAGS_FOR_TARGET = @SYSROOT_CFLAGS_FOR_TARGET@
-CXXFLAGS_FOR_TARGET = $(CXXFLAGS) $(SYSROOT_CFLAGS_FOR_TARGET)
+DEBUG_PREFIX_CFLAGS_FOR_TARGET = @DEBUG_PREFIX_CFLAGS_FOR_TARGET@
+CXXFLAGS_FOR_TARGET = $(CXXFLAGS) $(SYSROOT_CFLAGS_FOR_TARGET) \
+	$(DEBUG_PREFIX_CFLAGS_FOR_TARGET)
 LIBCFLAGS_FOR_TARGET = $(CFLAGS_FOR_TARGET)
 LIBCXXFLAGS_FOR_TARGET = $(CXXFLAGS_FOR_TARGET) -fno-implicit-templates
 LDFLAGS_FOR_TARGET = 
Index: config/mt-gnu
===================================================================
--- config/mt-gnu	(revision 126328)
+++ config/mt-gnu	(working copy)
@@ -1 +1,2 @@
-CXXFLAGS_FOR_TARGET = $(CXXFLAGS) $(SYSROOT_CFLAGS_FOR_TARGET) -D_GNU_SOURCE
+CXXFLAGS_FOR_TARGET = $(CXXFLAGS) $(SYSROOT_CFLAGS_FOR_TARGET) \
+	$(DEBUG_PREFIX_CFLAGS_FOR_TARGET) -D_GNU_SOURCE






2007-07-04  Joseph Myers  <joseph@codesourcery.com>
            Paul Brook  <paul@codesourcery.com>

	* remap.c: New.
	* as.h (remap_debug_filename, add_debug_prefix_map): Declare.
	* as.c (show_usage): Document --debug-prefix-map option.
	(parse_args): Handle --debug-prefix-map.
	* dwarf2dbg.c (out_file_list, out_debug_info): Remap debug paths.
	* stabs.c (stabs_generate_asm_file): Remap debug paths.
	* Makefile.am (GAS_CFILES): Add remap.c
	(GENERIC_OBJS): Add remap.o.
	Regenerate dependencies.
	* Makefile.in: Regenerate.
	* doc/as.texinfo (--debug-prefix-map): Document.

Index: gas/Makefile.am
===================================================================
RCS file: /cvs/src/src/gas/Makefile.am,v
retrieving revision 1.151
diff -u -r1.151 Makefile.am
--- gas/Makefile.am	2 Jul 2007 07:12:50 -0000	1.151
+++ gas/Makefile.am	4 Jul 2007 21:25:51 -0000
@@ -195,6 +195,7 @@
 	messages.c \
 	output-file.c \
 	read.c \
+	remap.c \
 	sb.c \
 	stabs.c \
 	subsegs.c \
@@ -439,6 +440,7 @@
 	messages.o \
 	output-file.o \
 	read.o \
+	remap.o \
 	subsegs.o \
 	symbols.o \
 	write.o \
@@ -1490,6 +1492,11 @@
   $(INCDIR)/bfdlink.h $(srcdir)/config/tc-bfin.h dwarf2dbg.h \
   $(INCDIR)/safe-ctype.h subsegs.h $(INCDIR)/obstack.h \
   $(INCDIR)/obstack.h struc-symbol.h dwarf2dbg.h $(INCDIR)/aout/aout64.h
+DEPOBJ_cr16_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \
+  $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \
+  $(INCDIR)/bfdlink.h $(srcdir)/config/tc-cr16.h dwarf2dbg.h \
+  $(INCDIR)/safe-ctype.h subsegs.h $(INCDIR)/obstack.h \
+  $(INCDIR)/obstack.h struc-symbol.h dwarf2dbg.h $(INCDIR)/aout/aout64.h
 DEPOBJ_cris_aout = $(srcdir)/config/obj-aout.h $(srcdir)/config/tc-cris.h \
   $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h $(INCDIR)/aout/aout64.h \
   $(INCDIR)/obstack.h
@@ -2158,6 +2165,7 @@
 output-file.o: output-file.c output-file.h
 read.o: read.c $(INCDIR)/safe-ctype.h subsegs.h $(INCDIR)/obstack.h \
   sb.h macro.h ecoff.h dw2gencfi.h $(INCDIR)/elf/dwarf2.h
+remap.o: remap.c
 sb.o: sb.c sb.h
 stabs.o: stabs.c $(INCDIR)/obstack.h subsegs.h ecoff.h \
   $(INCDIR)/aout/stab_gnu.h $(INCDIR)/aout/stab.def
Index: gas/as.c
===================================================================
RCS file: /cvs/src/src/gas/as.c,v
retrieving revision 1.75
diff -u -r1.75 as.c
--- gas/as.c	3 Jul 2007 11:01:02 -0000	1.75
+++ gas/as.c	4 Jul 2007 21:25:52 -0000
@@ -244,6 +244,8 @@
   fprintf (stream, _("\
   -D                      produce assembler debugging messages\n"));
   fprintf (stream, _("\
+  --debug-prefix-map OLD=NEW  Map OLD to NEW in debug information\n"));
+  fprintf (stream, _("\
   --defsym SYM=VAL        define symbol SYM to given value\n"));
 #ifdef USE_EMULATIONS
   {
@@ -407,6 +409,7 @@
       OPTION_DUMPCONFIG,
       OPTION_VERBOSE,
       OPTION_EMULATION,
+      OPTION_DEBUG_PREFIX_MAP,
       OPTION_DEFSYM,
       OPTION_INSTTBL,
       OPTION_LISTING_LHS_WIDTH,
@@ -445,6 +448,7 @@
     ,{"a", optional_argument, NULL, 'a'}
     /* Handle -al=<FILE>.  */
     ,{"al", optional_argument, NULL, OPTION_AL}
+    ,{"debug-prefix-map", required_argument, NULL, OPTION_DEBUG_PREFIX_MAP}
     ,{"defsym", required_argument, NULL, OPTION_DEFSYM}
     ,{"dump-config", no_argument, NULL, OPTION_DUMPCONFIG}
     ,{"emulation", required_argument, NULL, OPTION_EMULATION}
@@ -620,6 +624,10 @@
 #endif
 	  exit (EXIT_SUCCESS);
 
+	case OPTION_DEBUG_PREFIX_MAP:
+	  add_debug_prefix_map (optarg);
+	  break;
+
 	case OPTION_DEFSYM:
 	  {
 	    char *s;
Index: gas/as.h
===================================================================
RCS file: /cvs/src/src/gas/as.h,v
retrieving revision 1.57
diff -u -r1.57 as.h
--- gas/as.h	3 Jul 2007 11:01:02 -0000	1.57
+++ gas/as.h	4 Jul 2007 21:25:52 -0000
@@ -567,6 +567,9 @@
 void   print_dependencies (void);
 segT   subseg_get (const char *, int);
 
+const char *remap_debug_filename (const char *);
+void add_debug_prefix_map (const char *);
+
 struct expressionS;
 struct fix;
 typedef struct symbol symbolS;
Index: gas/dwarf2dbg.c
===================================================================
RCS file: /cvs/src/src/gas/dwarf2dbg.c,v
retrieving revision 1.89
diff -u -r1.89 dwarf2dbg.c
--- gas/dwarf2dbg.c	3 Jul 2007 11:01:02 -0000	1.89
+++ gas/dwarf2dbg.c	4 Jul 2007 21:25:52 -0000
@@ -1224,15 +1224,17 @@
 out_file_list (void)
 {
   size_t size;
+  const char *dir;
   char *cp;
   unsigned int i;
 
   /* Emit directory list.  */
   for (i = 1; i < dirs_in_use; ++i)
     {
-      size = strlen (dirs[i]) + 1;
+      dir = remap_debug_filename (dirs[i]);
+      size = strlen (dir) + 1;
       cp = frag_more (size);
-      memcpy (cp, dirs[i], size);
+      memcpy (cp, dir, size);
     }
   /* Terminate it.  */
   out_byte ('\0');
@@ -1514,7 +1516,8 @@
 out_debug_info (segT info_seg, segT abbrev_seg, segT line_seg, segT ranges_seg)
 {
   char producer[128];
-  char *comp_dir;
+  const char *comp_dir;
+  const char *dirname;
   expressionS expr;
   symbolS *info_start;
   symbolS *info_end;
@@ -1604,9 +1607,10 @@
     abort ();
   if (files[1].dir)
     {
-      len = strlen (dirs[files[1].dir]);
+      dirname = remap_debug_filename (dirs[files[1].dir]);
+      len = strlen (dirname);
       p = frag_more (len + 1);
-      memcpy (p, dirs[files[1].dir], len);
+      memcpy (p, dirname, len);
       INSERT_DIR_SEPARATOR (p, len);
     }
   len = strlen (files[1].filename) + 1;
@@ -1614,7 +1618,7 @@
   memcpy (p, files[1].filename, len);
 
   /* DW_AT_comp_dir */
-  comp_dir = getpwd ();
+  comp_dir = remap_debug_filename (getpwd ());
   len = strlen (comp_dir) + 1;
   p = frag_more (len);
   memcpy (p, comp_dir, len);
Index: gas/remap.c
===================================================================
RCS file: gas/remap.c
diff -N gas/remap.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ gas/remap.c	4 Jul 2007 21:25:52 -0000
@@ -0,0 +1,89 @@
+/* Remap file names for debug info for GNU assembler.
+   Copyright 2007 Free Software Foundation, Inc.
+
+   This file is part of GAS, the GNU Assembler.
+
+   GAS is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   GAS is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with GAS; see the file COPYING.  If not, write to the Free
+   Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
+   02110-1301, USA.  */
+
+#include "as.h"
+
+/* Structure recording the mapping from source file and directory
+   names at compile time to those to be embedded in debug
+   information.  */
+typedef struct debug_prefix_map
+{
+  const char *old_prefix;
+  const char *new_prefix;
+  size_t old_len;
+  size_t new_len;
+  struct debug_prefix_map *next;
+} debug_prefix_map;
+
+/* Linked list of such structures.  */
+debug_prefix_map *debug_prefix_maps;
+
+
+/* Record a debug file prefix mapping.  ARG is the argument to
+   -fdebug-prefix-map and must be of the form OLD=NEW.  */
+
+void
+add_debug_prefix_map (const char *arg)
+{
+  debug_prefix_map *map;
+  const char *p;
+  char *o;
+
+  p = strchr (arg, '=');
+  if (!p)
+    {
+      as_fatal (_("invalid argument '%s' to -fdebug-prefix-map"), arg);
+      return;
+    }
+  map = xmalloc (sizeof (debug_prefix_map));
+  o = xstrdup (arg);
+  map->old_prefix = o;
+  map->old_len = p - arg;
+  o[map->old_len] = 0;
+  p++;
+  map->new_prefix = xstrdup (p);
+  map->new_len = strlen (p);
+  map->next = debug_prefix_maps;
+  debug_prefix_maps = map;
+}
+
+/* Perform user-specified mapping of debug filename prefixes.  Return
+   the new name corresponding to FILENAME.  */
+
+const char *
+remap_debug_filename (const char *filename)
+{
+  debug_prefix_map *map;
+  char *s;
+  const char *name;
+  size_t name_len;
+
+  for (map = debug_prefix_maps; map; map = map->next)
+    if (strncmp (filename, map->old_prefix, map->old_len) == 0)
+      break;
+  if (!map)
+    return filename;
+  name = filename + map->old_len;
+  name_len = strlen (name) + 1;
+  s = (char *) alloca (name_len + map->new_len);
+  memcpy (s, map->new_prefix, map->new_len);
+  memcpy (s + map->new_len, name, name_len);
+  return xstrdup (s);
+}
Index: gas/stabs.c
===================================================================
RCS file: /cvs/src/src/gas/stabs.c,v
retrieving revision 1.28
diff -u -r1.28 stabs.c
--- gas/stabs.c	3 Jul 2007 11:01:03 -0000	1.28
+++ gas/stabs.c	4 Jul 2007 21:25:52 -0000
@@ -492,9 +492,10 @@
   as_where (&file, &lineno);
   if (use_gnu_debug_info_extensions)
     {
-      char *dir, *dir2;
+      const char *dir;
+      char *dir2;
 
-      dir = getpwd ();
+      dir = remap_debug_filename (getpwd ());
       dir2 = alloca (strlen (dir) + 2);
       sprintf (dir2, "%s%s", dir, "/");
       generate_asm_file (N_SO, dir2);
Index: gas/doc/Makefile.in
===================================================================
RCS file: /cvs/src/src/gas/doc/Makefile.in,v
retrieving revision 1.92
diff -u -r1.92 Makefile.in
--- gas/doc/Makefile.in	2 Jul 2007 07:12:50 -0000	1.92
+++ gas/doc/Makefile.in	4 Jul 2007 21:25:52 -0000
@@ -295,9 +295,9 @@
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --cygnus  doc/Makefile'; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  doc/Makefile'; \
 	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --cygnus  doc/Makefile
+	  $(AUTOMAKE) --foreign  doc/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
Index: gas/doc/as.texinfo
===================================================================
RCS file: /cvs/src/src/gas/doc/as.texinfo,v
retrieving revision 1.166
diff -u -r1.166 as.texinfo
--- gas/doc/as.texinfo	29 Jun 2007 14:09:30 -0000	1.166
+++ gas/doc/as.texinfo	4 Jul 2007 21:25:54 -0000
@@ -226,6 +226,7 @@
 @smallexample
 @c man begin SYNOPSIS
 @value{AS} [@b{-a}[@b{cdhlns}][=@var{file}]] [@b{--alternate}] [@b{-D}]
+ [@b{--debug-prefix-map} @var{old}=@var{new}]
  [@b{--defsym} @var{sym}=@var{val}] [@b{-f}] [@b{-g}] [@b{--gstabs}]
  [@b{--gstabs+}] [@b{--gdwarf-2}] [@b{--help}] [@b{-I} @var{dir}] [@b{-J}]
  [@b{-K}] [@b{-L}] [@b{--listing-lhs-width}=@var{NUM}]
@@ -501,6 +502,10 @@
 Ignored.  This option is accepted for script compatibility with calls to
 other assemblers.
 
+@item --debug-prefix-map @var{old}=@var{new}
+When assembling files in directory @file{@var{old}}, record debugging
+information describing them as in @file{@var{new}} instead.
+
 @item --defsym @var{sym}=@var{value}
 Define the symbol @var{sym} to be @var{value} before assembling the input file.
 @var{value} must be an integer constant.  As in C, a leading @samp{0x}

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Debug info path remapping
  2007-07-05  5:02 Debug info path remapping Joseph S. Myers
@ 2007-07-05 20:04 ` Danny Backx
  2007-08-29 17:30   ` Joseph S. Myers
  2007-08-11 23:51 ` Ping " Joseph S. Myers
  1 sibling, 1 reply; 6+ messages in thread
From: Danny Backx @ 2007-07-05 20:04 UTC (permalink / raw)
  To: Joseph S. Myers; +Cc: gcc-patches, binutils

[-- Attachment #1: Type: text/plain, Size: 33512 bytes --]

On Thu, 2007-07-05 at 00:48 +0000, Joseph S. Myers wrote:
> These GCC and GAS patches add compiler and assembler support for
> remapping paths when generating debug information, as discussed in
> <http://gcc.gnu.org/ml/gcc-patches/2006-10/msg00064.html> and thread.
> This allows you to generate objects whose debug information references
> a canonical location for source files, without the limitations of
> postprocessing the objects (on lengths of paths involved etc.).

This looks remarkably like a patch I sent in on May 16 to do something
similar for gcov. The reason for my patch is cross-compilers which
target Windows CE systems, on which the original source path doesn't
exist.

Maybe the two patches should be considered together.

See http://gcc.gnu.org/ml/gcc-patches/2007-05/msg01087.html for mine.

> A GCC option -fdebug-prefix-map=OLD=NEW, a GAS option
> --debug-prefix-map OLD=NEW, and a configure option
> --with-debug-prefix-map="OLD1=NEW1 OLD2=NEW2 ..." are added.  The
> configure option causes the -fdebug-prefix-map options to be passed
> when building GCC's runtime libraries; when applied to src, it has the
> same effect for building newlib.  GCC passes --debug-prefix-map to the
> assembler if support was available at configure time.
> 
> The change to dwarf2out.c:file_table_relative_p deals with the case
> where you compile a source file from an absolute path but with a
> relative -I option; at the point dwarf2out_finish checks whether
> DW_AT_comp_dir is needed, d->emitted_number is 0 and it only becomes 1
> later.  This is needed to have correct debug information from which
> the relocated paths to all source files can be found.
> 
> Tested with no regressions on i686-pc-linux-gnu.  OK to commit?
> 
> (For the GAS patch, see below the GCC one.)
> 
> 2007-07-04  Paul Brook  <paul@codesourcery.com>
>             Joseph Myers  <joseph@codesourcery.com>
> 
> 	* Makefile.tpl (DEBUG_PREFIX_CFLAGS_FOR_TARGET): New.
> 	(CFLAGS_FOR_TARGET, CXXFLAGS_FOR_TARGET): Include it.
> 	* Makefile.in: Regenerate.
> 	* configure.ac (--with-debug-prefix-map): New.
> 	* configure: Regenerate.
> 
> config:
> 2007-07-04  Paul Brook  <paul@codesourcery.com>
>             Joseph Myers  <joseph@codesourcery.com>
> 
> 	* mt-gnu (CXXFLAGS_FOR_TARGET): Add
> 	$(DEBUG_PREFIX_CFLAGS_FOR_TARGET).
> 
> gcc:
> 2007-07-04  Paul Brook  <paul@codesourcery.com>
>             Joseph Myers  <joseph@codesourcery.com>
> 
> 	* common.opt (-fdebug-prefix-map=): New option.
> 	* opts.c: Include debug.h.
> 	(common_handle_option): Handle -fdebug-prefix-map.
> 	* final.c: Include ggc.h.
> 	(struct debug_prefix_map, debug_prefix_maps, add_debug_prefix_map,
> 	remap_debug_filename): New.
> 	* Makefile.in (final.o, opts.o): Update dependencies.
> 	* debug.h (remap_debug_filename, add_debug_prefix_map): Declare.
> 	* configure.ac: Check for assembler --debug-prefix-map support.
> 	* configure, config.in: Regenerate.
> 	* gcc.c (ASM_MAP): Define conditional on HAVE_AS_DEBUG_PREFIX_MAP.
> 	(ASM_DEBUG_SPEC): Include ASM_MAP.
> 	* doc/install.texi (--with-debug-prefix-map): Document.
> 	* doc/invoke.texi (-fdebug-prefix-map): Document.
> 	* dbxout.c (dbxout_init, dbxout_start_source_file,
> 	dbxout_source_file): Call remap_debug_filename.
> 	* dwarf2out.c (add_comp_dir_attribute, maybe_emit_file,
> 	dwarf2out_start_source_file, dwarf2out_finish): Call
> 	remap_debug_filename.
> 	(file_table_relative_p): Do not check d->emitted_number.
> 	* toplev.c (output_file_directive): Call remap_debug_filename.
> 	* vmsdbgout.c (write_srccorr): Call remap_debug_filename.
> 	* xcoffout.c (xcoffout_source_file): Call remap_debug_filename.
> 
> Index: gcc/doc/invoke.texi
> ===================================================================
> --- gcc/doc/invoke.texi	(revision 126328)
> +++ gcc/doc/invoke.texi	(working copy)
> @@ -303,6 +303,7 @@
>  -ftest-coverage  -ftime-report -fvar-tracking @gol
>  -g  -g@var{level}  -gcoff -gdwarf-2 @gol
>  -ggdb  -gstabs  -gstabs+  -gvms  -gxcoff  -gxcoff+ @gol
> +-fdebug-prefix-map=@var{old}=@var{new} @gol
>  -femit-struct-debug-baseonly -femit-struct-debug-reduced @gol
>  -femit-struct-debug-detailed@r{[}=@var{spec-list}@r{]} @gol
>  -p  -pg  -print-file-name=@var{library}  -print-libgcc-file-name @gol
> @@ -4133,6 +4134,11 @@
>  
>  This option works only with DWARF 2.
>  
> +@item -fdebug-prefix-map=@var{old}=@var{new}
> +@opindex fdebug-prefix-map
> +When compiling files in directory @file{@var{old}}, record debugging
> +information describing them as in @file{@var{new}} instead.
> +
>  @cindex @command{prof}
>  @item -p
>  @opindex p
> Index: gcc/doc/install.texi
> ===================================================================
> --- gcc/doc/install.texi	(revision 126328)
> +++ gcc/doc/install.texi	(working copy)
> @@ -1345,6 +1345,11 @@
>  shorthand assumptions are not correct, you can use the explicit
>  include and lib options directly.
>  
> +@item --with-debug-prefix-map=@var{map}
> +Convert source directory names using @option{-fdebug-prefix-map} when
> +building runtime libraries.  @samp{@var{map}} is a space-separated
> +list of maps of the form @samp{@var{old}=@var{new}}.
> +
>  @end table
>  
>  @subheading Cross-Compiler-Specific Options
> Index: gcc/final.c
> ===================================================================
> --- gcc/final.c	(revision 126328)
> +++ gcc/final.c	(working copy)
> @@ -78,6 +78,7 @@
>  #include "coverage.h"
>  #include "df.h"
>  #include "vecprim.h"
> +#include "ggc.h"
>  
>  #ifdef XCOFF_DEBUGGING_INFO
>  #include "xcoffout.h"		/* Needed for external data
> @@ -1351,6 +1352,72 @@
>  }
>  #endif
>  \f
> +/* ??? This is probably the wrong place for these.  */
> +/* Structure recording the mapping from source file and directory
> +   names at compile time to those to be embedded in debug
> +   information.  */
> +typedef struct debug_prefix_map
> +{
> +  const char *old_prefix;
> +  const char *new_prefix;
> +  size_t old_len;
> +  size_t new_len;
> +  struct debug_prefix_map *next;
> +} debug_prefix_map;
> +
> +/* Linked list of such structures.  */
> +debug_prefix_map *debug_prefix_maps;
> +
> +
> +/* Record a debug file prefix mapping.  ARG is the argument to
> +   -fdebug-prefix-map and must be of the form OLD=NEW.  */
> +
> +void
> +add_debug_prefix_map (const char *arg)
> +{
> +  debug_prefix_map *map;
> +  const char *p;
> +
> +  p = strchr (arg, '=');
> +  if (!p)
> +    {
> +      error ("invalid argument %qs to -fdebug-prefix-map", arg);
> +      return;
> +    }
> +  map = XNEW (debug_prefix_map);
> +  map->old_prefix = ggc_alloc_string (arg, p - arg);
> +  map->old_len = p - arg;
> +  p++;
> +  map->new_prefix = ggc_strdup (p);
> +  map->new_len = strlen (p);
> +  map->next = debug_prefix_maps;
> +  debug_prefix_maps = map;
> +}
> +
> +/* Perform user-specified mapping of debug filename prefixes.  Return
> +   the new name corresponding to FILENAME.  */
> +
> +const char *
> +remap_debug_filename (const char *filename)
> +{
> +  debug_prefix_map *map;
> +  char *s;
> +  const char *name;
> +  size_t name_len;
> +
> +  for (map = debug_prefix_maps; map; map = map->next)
> +    if (strncmp (filename, map->old_prefix, map->old_len) == 0)
> +      break;
> +  if (!map)
> +    return filename;
> +  name = filename + map->old_len;
> +  name_len = strlen (name) + 1;
> +  s = (char *) alloca (name_len + map->new_len);
> +  memcpy (s, map->new_prefix, map->new_len);
> +  memcpy (s + map->new_len, name, name_len);
> +  return ggc_strdup (s);
> +}
> +\f
>  /* Output assembler code for the start of a function,
>     and initialize some of the variables in this file
>     for the new function.  The label for the function and associated
> Index: gcc/gcc.c
> ===================================================================
> --- gcc/gcc.c	(revision 126328)
> +++ gcc/gcc.c	(working copy)
> @@ -656,21 +656,27 @@
>  #define LINKER_NAME "collect2"
>  #endif
>  
> +#ifdef HAVE_AS_DEBUG_PREFIX_MAP
> +#define ASM_MAP " %{fdebug-prefix-map=*:--debug-prefix-map %*}"
> +#else
> +#define ASM_MAP ""
> +#endif
> +
>  /* Define ASM_DEBUG_SPEC to be a spec suitable for translating '-g'
>     to the assembler.  */
>  #ifndef ASM_DEBUG_SPEC
>  # if defined(DBX_DEBUGGING_INFO) && defined(DWARF2_DEBUGGING_INFO) \
>       && defined(HAVE_AS_GDWARF2_DEBUG_FLAG) && defined(HAVE_AS_GSTABS_DEBUG_FLAG)
> -#  define ASM_DEBUG_SPEC					\
> -      (PREFERRED_DEBUGGING_TYPE == DBX_DEBUG			\
> -       ? "%{gdwarf-2*:--gdwarf2}%{!gdwarf-2*:%{g*:--gstabs}}"	\
> -       : "%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}}")
> +#  define ASM_DEBUG_SPEC						\
> +      (PREFERRED_DEBUGGING_TYPE == DBX_DEBUG				\
> +       ? "%{gdwarf-2*:--gdwarf2}%{!gdwarf-2*:%{g*:--gstabs}}" ASM_MAP	\
> +       : "%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}}" ASM_MAP)
>  # else
>  #  if defined(DBX_DEBUGGING_INFO) && defined(HAVE_AS_GSTABS_DEBUG_FLAG)
> -#   define ASM_DEBUG_SPEC "%{g*:--gstabs}"
> +#   define ASM_DEBUG_SPEC "%{g*:--gstabs}" ASM_MAP
>  #  endif
>  #  if defined(DWARF2_DEBUGGING_INFO) && defined(HAVE_AS_GDWARF2_DEBUG_FLAG)
> -#   define ASM_DEBUG_SPEC "%{g*:--gdwarf2}"
> +#   define ASM_DEBUG_SPEC "%{g*:--gdwarf2}" ASM_MAP
>  #  endif
>  # endif
>  #endif
> Index: gcc/toplev.c
> ===================================================================
> --- gcc/toplev.c	(revision 126328)
> +++ gcc/toplev.c	(working copy)
> @@ -702,6 +702,8 @@
>  
>    if (input_name == NULL)
>      input_name = "<stdin>";
> +  else
> +    input_name = remap_debug_filename (input_name);
>  
>    len = strlen (input_name);
>    na = input_name + len;
> Index: gcc/vmsdbgout.c
> ===================================================================
> --- gcc/vmsdbgout.c	(revision 126328)
> +++ gcc/vmsdbgout.c	(working copy)
> @@ -1150,7 +1150,8 @@
>      (src_command.dst_a_src_cmd_fields.dst_a_src_decl_src.dst_b_src_df_filename,
>       "source_corr (filename length)", dosizeonly);
>  
> -  totsize += write_debug_string (file_info_entry.file_name,
> +  totsize += write_debug_string (remap_debug_filename (
> +				    file_info_entry.file_name),
>  				 "source file name", dosizeonly);
>    totsize += write_debug_data1 (src_cmdtrlr.dst_b_src_df_libmodname,
>  				"source_corr (libmodname)", dosizeonly);
> Index: gcc/debug.h
> ===================================================================
> --- gcc/debug.h	(revision 126328)
> +++ gcc/debug.h	(working copy)
> @@ -167,4 +167,7 @@
>  extern int debug_nesting;
>  extern int symbol_queue_index;
>  
> +const char *remap_debug_filename (const char *);
> +void add_debug_prefix_map (const char *);
> +
>  #endif /* !GCC_DEBUG_H  */
> Index: gcc/dbxout.c
> ===================================================================
> --- gcc/dbxout.c	(revision 126328)
> +++ gcc/dbxout.c	(working copy)
> @@ -984,6 +984,7 @@
>    char ltext_label_name[100];
>    bool used_ltext_label_name = false;
>    tree syms = lang_hooks.decls.getdecls ();
> +  const char *mapped_name;
>  
>    typevec_len = 100;
>    typevec = ggc_calloc (typevec_len, sizeof typevec[0]);
> @@ -1009,6 +1010,7 @@
>  	    cwd = "/";
>  	  else if (!IS_DIR_SEPARATOR (cwd[strlen (cwd) - 1]))
>  	    cwd = concat (cwd, "/", NULL);
> +	  cwd = remap_debug_filename (cwd);
>  	}
>  #ifdef DBX_OUTPUT_MAIN_SOURCE_DIRECTORY
>        DBX_OUTPUT_MAIN_SOURCE_DIRECTORY (asm_out_file, cwd);
> @@ -1019,10 +1021,11 @@
>  #endif /* no DBX_OUTPUT_MAIN_SOURCE_DIRECTORY */
>      }
>  
> +  mapped_name = remap_debug_filename (input_file_name);
>  #ifdef DBX_OUTPUT_MAIN_SOURCE_FILENAME
> -  DBX_OUTPUT_MAIN_SOURCE_FILENAME (asm_out_file, input_file_name);
> +  DBX_OUTPUT_MAIN_SOURCE_FILENAME (asm_out_file, mapped_name);
>  #else
> -  dbxout_begin_simple_stabs_desc (input_file_name, N_SO, get_lang_number ());
> +  dbxout_begin_simple_stabs_desc (mapped_name, N_SO, get_lang_number ());
>    dbxout_stab_value_label (ltext_label_name);
>    used_ltext_label_name = true;
>  #endif
> @@ -1164,7 +1167,7 @@
>    n->prev = NULL;
>    current_file->prev = n;
>    n->bincl_status = BINCL_PENDING;
> -  n->pending_bincl_name = filename;
> +  n->pending_bincl_name = remap_debug_filename (filename);
>    pending_bincls = 1;
>    current_file = n;
>  #endif
> @@ -1230,7 +1233,7 @@
>        if (current_function_decl == NULL_TREE)
>  	switch_to_section (text_section);
>  
> -      dbxout_begin_simple_stabs (filename, N_SOL);
> +      dbxout_begin_simple_stabs (remap_debug_filename (filename), N_SOL);
>        dbxout_stab_value_internal_label ("Ltext", &source_label_number);
>        lastfile = filename;
>      }
> Index: gcc/xcoffout.c
> ===================================================================
> --- gcc/xcoffout.c	(revision 126328)
> +++ gcc/xcoffout.c	(working copy)
> @@ -301,7 +301,8 @@
>        if (xcoff_current_include_file)
>  	{
>  	  fprintf (file, "\t.ei\t");
> -	  output_quoted_string (file, xcoff_current_include_file);
> +	  output_quoted_string (file,
> +	      remap_debug_filename (xcoff_current_include_file));
>  	  fprintf (file, "\n");
>  	  xcoff_current_include_file = NULL;
>  	}
> @@ -309,7 +310,7 @@
>        if (strcmp (main_input_filename, filename) || inline_p)
>  	{
>  	  fprintf (file, "\t.bi\t");
> -	  output_quoted_string (file, filename);
> +	  output_quoted_string (file, remap_debug_filename (filename));
>  	  fprintf (file, "\n");
>  	  xcoff_current_include_file = filename;
>  	}
> Index: gcc/dwarf2out.c
> ===================================================================
> --- gcc/dwarf2out.c	(revision 126328)
> +++ gcc/dwarf2out.c	(working copy)
> @@ -10734,7 +10734,7 @@
>  {
>    const char *wd = get_src_pwd ();
>    if (wd != NULL)
> -    add_AT_string (die, DW_AT_comp_dir, wd);
> +    add_AT_string (die, DW_AT_comp_dir, remap_debug_filename (wd));
>  }
>  
>  /* Given a tree node describing an array bound (either lower or upper) output
> @@ -13827,7 +13827,8 @@
>        if (DWARF2_ASM_LINE_DEBUG_INFO)
>  	{
>  	  fprintf (asm_out_file, "\t.file %u ", fd->emitted_number);
> -	  output_quoted_string (asm_out_file, fd->filename);
> +	  output_quoted_string (asm_out_file,
> +				remap_debug_filename (fd->filename));
>  	  fputc ('\n', asm_out_file);
>  	}
>      }
> @@ -13994,7 +13995,7 @@
>        dw_die_ref bincl_die;
>  
>        bincl_die = new_die (DW_TAG_GNU_BINCL, comp_unit_die, NULL);
> -      add_AT_string (bincl_die, DW_AT_name, filename);
> +      add_AT_string (bincl_die, DW_AT_name, remap_debug_filename (filename));
>      }
>  
>    if (debug_info_level >= DINFO_LEVEL_VERBOSE)
> @@ -14453,7 +14454,7 @@
>  {
>    bool *p = param;
>    struct dwarf_file_data *d = *slot;
> -  if (d->emitted_number && !IS_ABSOLUTE_PATH (d->filename))
> +  if (!IS_ABSOLUTE_PATH (d->filename))
>      {
>        *p = true;
>        return 0;
> @@ -14472,7 +14473,7 @@
>  
>    /* Add the name for the main input file now.  We delayed this from
>       dwarf2out_init to avoid complications with PCH.  */
> -  add_name_attribute (comp_unit_die, filename);
> +  add_name_attribute (comp_unit_die, remap_debug_filename (filename));
>    if (!IS_ABSOLUTE_PATH (filename))
>      add_comp_dir_attribute (comp_unit_die);
>    else if (get_AT (comp_unit_die, DW_AT_comp_dir) == NULL)
> Index: gcc/opts.c
> ===================================================================
> --- gcc/opts.c	(revision 126328)
> +++ gcc/opts.c	(working copy)
> @@ -41,6 +41,7 @@
>  #include "target.h"
>  #include "tree-pass.h"
>  #include "dbgcnt.h"
> +#include "debug.h"
>  
>  /* Value of the -G xx switch, and whether it was passed or not.  */
>  unsigned HOST_WIDE_INT g_switch_value;
> @@ -1442,6 +1443,10 @@
>        dbg_cnt_list_all_counters ();
>        break;
>  
> +    case OPT_fdebug_prefix_map_:
> +      add_debug_prefix_map (arg);
> +      break;
> +
>      case OPT_fdiagnostics_show_location_:
>        if (!strcmp (arg, "once"))
>  	diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
> Index: gcc/configure.ac
> ===================================================================
> --- gcc/configure.ac	(revision 126328)
> +++ gcc/configure.ac	(working copy)
> @@ -3050,6 +3050,12 @@
>     fi],
>    [AC_DEFINE(HAVE_AS_GSTABS_DEBUG_FLAG, 1,
>  [Define if your assembler supports the --gstabs option.])])
> +
> + gcc_GAS_CHECK_FEATURE([--debug-prefix-map option],
> +  gcc_cv_as_debug_prefix_map_flag,
> +  [2,18,0], [--debug-prefix-map /a=/b], [$insn],,
> +  [AC_DEFINE(HAVE_AS_DEBUG_PREFIX_MAP, 1,
> +[Define if your assembler supports the --debug-prefix-map option.])])
>  fi
>  
>  AC_CACHE_CHECK([assembler for tolerance to line number 0],
> Index: gcc/common.opt
> ===================================================================
> --- gcc/common.opt	(revision 126328)
> +++ gcc/common.opt	(working copy)
> @@ -400,6 +400,10 @@
>  Common RejectNegative Joined
>  -fdbg-cnt=<counter>:<limit>[,<counter>:<limit>,...]    Set the debug counter limit.   
>  
> +fdebug-prefix-map=
> +Common Joined RejectNegative
> +Map one directory name to another in debug information
> +
>  ; Nonzero for -fdefer-pop: don't pop args after each function call
>  ; instead save them up to pop many calls' args with one insns.
>  fdefer-pop
> Index: gcc/Makefile.in
> ===================================================================
> --- gcc/Makefile.in	(revision 126328)
> +++ gcc/Makefile.in	(working copy)
> @@ -2276,7 +2276,7 @@
>  opts.o : opts.c opts.h options.h toplev.h $(CONFIG_H) $(SYSTEM_H) \
>     coretypes.h $(TREE_H) $(TM_H) langhooks.h $(GGC_H) $(RTL_H) \
>     output.h $(DIAGNOSTIC_H) $(TM_P_H) $(INSN_ATTR_H) intl.h $(TARGET_H) \
> -   $(FLAGS_H) $(PARAMS_H) tree-pass.h $(DBGCNT_H)
> +   $(FLAGS_H) $(PARAMS_H) tree-pass.h $(DBGCNT_H) debug.h
>  opts-common.o : opts-common.c opts.h $(CONFIG_H) $(SYSTEM_H) \
>     coretypes.h intl.h
>  targhooks.o : targhooks.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TREE_H) \
> @@ -2762,7 +2762,7 @@
>     insn-config.h $(INSN_ATTR_H) $(FUNCTION_H) output.h hard-reg-set.h \
>     except.h debug.h xcoffout.h toplev.h reload.h dwarf2out.h tree-pass.h \
>     $(BASIC_BLOCK_H) $(TM_P_H) $(TARGET_H) $(EXPR_H) $(CFGLAYOUT_H) dbxout.h \
> -   $(TIMEVAR_H) $(CGRAPH_H) $(COVERAGE_H) $(REAL_H) $(DF_H) vecprim.h
> +   $(TIMEVAR_H) $(CGRAPH_H) $(COVERAGE_H) $(REAL_H) $(DF_H) vecprim.h $(GGC_H)
>  recog.o : recog.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
>     $(FUNCTION_H) $(BASIC_BLOCK_H) $(REGS_H) $(RECOG_H) $(EXPR_H) \
>     $(FLAGS_H) insn-config.h $(INSN_ATTR_H) toplev.h output.h reload.h \
> Index: configure.ac
> ===================================================================
> --- configure.ac	(revision 126328)
> +++ configure.ac	(working copy)
> @@ -1590,6 +1590,18 @@
>    [SYSROOT_CFLAGS_FOR_TARGET=])
>  AC_SUBST(SYSROOT_CFLAGS_FOR_TARGET)
>  
> +AC_ARG_WITH([debug-prefix-map],
> +  [  --with-debug-prefix-map='A=B C=D ...'
> +                             map A to B, C to D ... in debug information],
> +  [if test x"$withval" != x; then
> +     DEBUG_PREFIX_CFLAGS_FOR_TARGET=
> +     for debug_map in $withval; do
> +       DEBUG_PREFIX_CFLAGS_FOR_TARGET="$DEBUG_PREFIX_CFLAGS_FOR_TARGET -fdebug-prefix-map=$debug_map"
> +     done
> +   fi],
> +  [DEBUG_PREFIX_CFLAGS_FOR_TARGET=])
> +AC_SUBST(DEBUG_PREFIX_CFLAGS_FOR_TARGET)
> +
>  # Handle --with-headers=XXX.  If the value is not "yes", the contents of
>  # the named directory are copied to $(tooldir)/sys-include.
>  if test x"${with_headers}" != x && test x"${with_headers}" != xno ; then
> Index: Makefile.tpl
> ===================================================================
> --- Makefile.tpl	(revision 126328)
> +++ Makefile.tpl	(working copy)
> @@ -361,9 +361,12 @@
>  # CFLAGS will be just -g.  We want to ensure that TARGET libraries
>  # (which we know are built with gcc) are built with optimizations so
>  # prepend -O2 when setting CFLAGS_FOR_TARGET.
> -CFLAGS_FOR_TARGET = -O2 $(CFLAGS) $(SYSROOT_CFLAGS_FOR_TARGET)
> +CFLAGS_FOR_TARGET = -O2 $(CFLAGS) $(SYSROOT_CFLAGS_FOR_TARGET) \
> +	$(DEBUG_PREFIX_CFLAGS_FOR_TARGET)
>  SYSROOT_CFLAGS_FOR_TARGET = @SYSROOT_CFLAGS_FOR_TARGET@
> -CXXFLAGS_FOR_TARGET = $(CXXFLAGS) $(SYSROOT_CFLAGS_FOR_TARGET)
> +DEBUG_PREFIX_CFLAGS_FOR_TARGET = @DEBUG_PREFIX_CFLAGS_FOR_TARGET@
> +CXXFLAGS_FOR_TARGET = $(CXXFLAGS) $(SYSROOT_CFLAGS_FOR_TARGET) \
> +	$(DEBUG_PREFIX_CFLAGS_FOR_TARGET)
>  LIBCFLAGS_FOR_TARGET = $(CFLAGS_FOR_TARGET)
>  LIBCXXFLAGS_FOR_TARGET = $(CXXFLAGS_FOR_TARGET) -fno-implicit-templates
>  LDFLAGS_FOR_TARGET = 
> Index: config/mt-gnu
> ===================================================================
> --- config/mt-gnu	(revision 126328)
> +++ config/mt-gnu	(working copy)
> @@ -1 +1,2 @@
> -CXXFLAGS_FOR_TARGET = $(CXXFLAGS) $(SYSROOT_CFLAGS_FOR_TARGET) -D_GNU_SOURCE
> +CXXFLAGS_FOR_TARGET = $(CXXFLAGS) $(SYSROOT_CFLAGS_FOR_TARGET) \
> +	$(DEBUG_PREFIX_CFLAGS_FOR_TARGET) -D_GNU_SOURCE
> 
> 
> 
> 
> 
> 
> 2007-07-04  Joseph Myers  <joseph@codesourcery.com>
>             Paul Brook  <paul@codesourcery.com>
> 
> 	* remap.c: New.
> 	* as.h (remap_debug_filename, add_debug_prefix_map): Declare.
> 	* as.c (show_usage): Document --debug-prefix-map option.
> 	(parse_args): Handle --debug-prefix-map.
> 	* dwarf2dbg.c (out_file_list, out_debug_info): Remap debug paths.
> 	* stabs.c (stabs_generate_asm_file): Remap debug paths.
> 	* Makefile.am (GAS_CFILES): Add remap.c
> 	(GENERIC_OBJS): Add remap.o.
> 	Regenerate dependencies.
> 	* Makefile.in: Regenerate.
> 	* doc/as.texinfo (--debug-prefix-map): Document.
> 
> Index: gas/Makefile.am
> ===================================================================
> RCS file: /cvs/src/src/gas/Makefile.am,v
> retrieving revision 1.151
> diff -u -r1.151 Makefile.am
> --- gas/Makefile.am	2 Jul 2007 07:12:50 -0000	1.151
> +++ gas/Makefile.am	4 Jul 2007 21:25:51 -0000
> @@ -195,6 +195,7 @@
>  	messages.c \
>  	output-file.c \
>  	read.c \
> +	remap.c \
>  	sb.c \
>  	stabs.c \
>  	subsegs.c \
> @@ -439,6 +440,7 @@
>  	messages.o \
>  	output-file.o \
>  	read.o \
> +	remap.o \
>  	subsegs.o \
>  	symbols.o \
>  	write.o \
> @@ -1490,6 +1492,11 @@
>    $(INCDIR)/bfdlink.h $(srcdir)/config/tc-bfin.h dwarf2dbg.h \
>    $(INCDIR)/safe-ctype.h subsegs.h $(INCDIR)/obstack.h \
>    $(INCDIR)/obstack.h struc-symbol.h dwarf2dbg.h $(INCDIR)/aout/aout64.h
> +DEPOBJ_cr16_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \
> +  $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \
> +  $(INCDIR)/bfdlink.h $(srcdir)/config/tc-cr16.h dwarf2dbg.h \
> +  $(INCDIR)/safe-ctype.h subsegs.h $(INCDIR)/obstack.h \
> +  $(INCDIR)/obstack.h struc-symbol.h dwarf2dbg.h $(INCDIR)/aout/aout64.h
>  DEPOBJ_cris_aout = $(srcdir)/config/obj-aout.h $(srcdir)/config/tc-cris.h \
>    $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h $(INCDIR)/aout/aout64.h \
>    $(INCDIR)/obstack.h
> @@ -2158,6 +2165,7 @@
>  output-file.o: output-file.c output-file.h
>  read.o: read.c $(INCDIR)/safe-ctype.h subsegs.h $(INCDIR)/obstack.h \
>    sb.h macro.h ecoff.h dw2gencfi.h $(INCDIR)/elf/dwarf2.h
> +remap.o: remap.c
>  sb.o: sb.c sb.h
>  stabs.o: stabs.c $(INCDIR)/obstack.h subsegs.h ecoff.h \
>    $(INCDIR)/aout/stab_gnu.h $(INCDIR)/aout/stab.def
> Index: gas/as.c
> ===================================================================
> RCS file: /cvs/src/src/gas/as.c,v
> retrieving revision 1.75
> diff -u -r1.75 as.c
> --- gas/as.c	3 Jul 2007 11:01:02 -0000	1.75
> +++ gas/as.c	4 Jul 2007 21:25:52 -0000
> @@ -244,6 +244,8 @@
>    fprintf (stream, _("\
>    -D                      produce assembler debugging messages\n"));
>    fprintf (stream, _("\
> +  --debug-prefix-map OLD=NEW  Map OLD to NEW in debug information\n"));
> +  fprintf (stream, _("\
>    --defsym SYM=VAL        define symbol SYM to given value\n"));
>  #ifdef USE_EMULATIONS
>    {
> @@ -407,6 +409,7 @@
>        OPTION_DUMPCONFIG,
>        OPTION_VERBOSE,
>        OPTION_EMULATION,
> +      OPTION_DEBUG_PREFIX_MAP,
>        OPTION_DEFSYM,
>        OPTION_INSTTBL,
>        OPTION_LISTING_LHS_WIDTH,
> @@ -445,6 +448,7 @@
>      ,{"a", optional_argument, NULL, 'a'}
>      /* Handle -al=<FILE>.  */
>      ,{"al", optional_argument, NULL, OPTION_AL}
> +    ,{"debug-prefix-map", required_argument, NULL, OPTION_DEBUG_PREFIX_MAP}
>      ,{"defsym", required_argument, NULL, OPTION_DEFSYM}
>      ,{"dump-config", no_argument, NULL, OPTION_DUMPCONFIG}
>      ,{"emulation", required_argument, NULL, OPTION_EMULATION}
> @@ -620,6 +624,10 @@
>  #endif
>  	  exit (EXIT_SUCCESS);
>  
> +	case OPTION_DEBUG_PREFIX_MAP:
> +	  add_debug_prefix_map (optarg);
> +	  break;
> +
>  	case OPTION_DEFSYM:
>  	  {
>  	    char *s;
> Index: gas/as.h
> ===================================================================
> RCS file: /cvs/src/src/gas/as.h,v
> retrieving revision 1.57
> diff -u -r1.57 as.h
> --- gas/as.h	3 Jul 2007 11:01:02 -0000	1.57
> +++ gas/as.h	4 Jul 2007 21:25:52 -0000
> @@ -567,6 +567,9 @@
>  void   print_dependencies (void);
>  segT   subseg_get (const char *, int);
>  
> +const char *remap_debug_filename (const char *);
> +void add_debug_prefix_map (const char *);
> +
>  struct expressionS;
>  struct fix;
>  typedef struct symbol symbolS;
> Index: gas/dwarf2dbg.c
> ===================================================================
> RCS file: /cvs/src/src/gas/dwarf2dbg.c,v
> retrieving revision 1.89
> diff -u -r1.89 dwarf2dbg.c
> --- gas/dwarf2dbg.c	3 Jul 2007 11:01:02 -0000	1.89
> +++ gas/dwarf2dbg.c	4 Jul 2007 21:25:52 -0000
> @@ -1224,15 +1224,17 @@
>  out_file_list (void)
>  {
>    size_t size;
> +  const char *dir;
>    char *cp;
>    unsigned int i;
>  
>    /* Emit directory list.  */
>    for (i = 1; i < dirs_in_use; ++i)
>      {
> -      size = strlen (dirs[i]) + 1;
> +      dir = remap_debug_filename (dirs[i]);
> +      size = strlen (dir) + 1;
>        cp = frag_more (size);
> -      memcpy (cp, dirs[i], size);
> +      memcpy (cp, dir, size);
>      }
>    /* Terminate it.  */
>    out_byte ('\0');
> @@ -1514,7 +1516,8 @@
>  out_debug_info (segT info_seg, segT abbrev_seg, segT line_seg, segT ranges_seg)
>  {
>    char producer[128];
> -  char *comp_dir;
> +  const char *comp_dir;
> +  const char *dirname;
>    expressionS expr;
>    symbolS *info_start;
>    symbolS *info_end;
> @@ -1604,9 +1607,10 @@
>      abort ();
>    if (files[1].dir)
>      {
> -      len = strlen (dirs[files[1].dir]);
> +      dirname = remap_debug_filename (dirs[files[1].dir]);
> +      len = strlen (dirname);
>        p = frag_more (len + 1);
> -      memcpy (p, dirs[files[1].dir], len);
> +      memcpy (p, dirname, len);
>        INSERT_DIR_SEPARATOR (p, len);
>      }
>    len = strlen (files[1].filename) + 1;
> @@ -1614,7 +1618,7 @@
>    memcpy (p, files[1].filename, len);
>  
>    /* DW_AT_comp_dir */
> -  comp_dir = getpwd ();
> +  comp_dir = remap_debug_filename (getpwd ());
>    len = strlen (comp_dir) + 1;
>    p = frag_more (len);
>    memcpy (p, comp_dir, len);
> Index: gas/remap.c
> ===================================================================
> RCS file: gas/remap.c
> diff -N gas/remap.c
> --- /dev/null	1 Jan 1970 00:00:00 -0000
> +++ gas/remap.c	4 Jul 2007 21:25:52 -0000
> @@ -0,0 +1,89 @@
> +/* Remap file names for debug info for GNU assembler.
> +   Copyright 2007 Free Software Foundation, Inc.
> +
> +   This file is part of GAS, the GNU Assembler.
> +
> +   GAS is free software; you can redistribute it and/or modify
> +   it under the terms of the GNU General Public License as published by
> +   the Free Software Foundation; either version 2, or (at your option)
> +   any later version.
> +
> +   GAS is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +   GNU General Public License for more details.
> +
> +   You should have received a copy of the GNU General Public License
> +   along with GAS; see the file COPYING.  If not, write to the Free
> +   Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
> +   02110-1301, USA.  */
> +
> +#include "as.h"
> +
> +/* Structure recording the mapping from source file and directory
> +   names at compile time to those to be embedded in debug
> +   information.  */
> +typedef struct debug_prefix_map
> +{
> +  const char *old_prefix;
> +  const char *new_prefix;
> +  size_t old_len;
> +  size_t new_len;
> +  struct debug_prefix_map *next;
> +} debug_prefix_map;
> +
> +/* Linked list of such structures.  */
> +debug_prefix_map *debug_prefix_maps;
> +
> +
> +/* Record a debug file prefix mapping.  ARG is the argument to
> +   -fdebug-prefix-map and must be of the form OLD=NEW.  */
> +
> +void
> +add_debug_prefix_map (const char *arg)
> +{
> +  debug_prefix_map *map;
> +  const char *p;
> +  char *o;
> +
> +  p = strchr (arg, '=');
> +  if (!p)
> +    {
> +      as_fatal (_("invalid argument '%s' to -fdebug-prefix-map"), arg);
> +      return;
> +    }
> +  map = xmalloc (sizeof (debug_prefix_map));
> +  o = xstrdup (arg);
> +  map->old_prefix = o;
> +  map->old_len = p - arg;
> +  o[map->old_len] = 0;
> +  p++;
> +  map->new_prefix = xstrdup (p);
> +  map->new_len = strlen (p);
> +  map->next = debug_prefix_maps;
> +  debug_prefix_maps = map;
> +}
> +
> +/* Perform user-specified mapping of debug filename prefixes.  Return
> +   the new name corresponding to FILENAME.  */
> +
> +const char *
> +remap_debug_filename (const char *filename)
> +{
> +  debug_prefix_map *map;
> +  char *s;
> +  const char *name;
> +  size_t name_len;
> +
> +  for (map = debug_prefix_maps; map; map = map->next)
> +    if (strncmp (filename, map->old_prefix, map->old_len) == 0)
> +      break;
> +  if (!map)
> +    return filename;
> +  name = filename + map->old_len;
> +  name_len = strlen (name) + 1;
> +  s = (char *) alloca (name_len + map->new_len);
> +  memcpy (s, map->new_prefix, map->new_len);
> +  memcpy (s + map->new_len, name, name_len);
> +  return xstrdup (s);
> +}
> Index: gas/stabs.c
> ===================================================================
> RCS file: /cvs/src/src/gas/stabs.c,v
> retrieving revision 1.28
> diff -u -r1.28 stabs.c
> --- gas/stabs.c	3 Jul 2007 11:01:03 -0000	1.28
> +++ gas/stabs.c	4 Jul 2007 21:25:52 -0000
> @@ -492,9 +492,10 @@
>    as_where (&file, &lineno);
>    if (use_gnu_debug_info_extensions)
>      {
> -      char *dir, *dir2;
> +      const char *dir;
> +      char *dir2;
>  
> -      dir = getpwd ();
> +      dir = remap_debug_filename (getpwd ());
>        dir2 = alloca (strlen (dir) + 2);
>        sprintf (dir2, "%s%s", dir, "/");
>        generate_asm_file (N_SO, dir2);
> Index: gas/doc/Makefile.in
> ===================================================================
> RCS file: /cvs/src/src/gas/doc/Makefile.in,v
> retrieving revision 1.92
> diff -u -r1.92 Makefile.in
> --- gas/doc/Makefile.in	2 Jul 2007 07:12:50 -0000	1.92
> +++ gas/doc/Makefile.in	4 Jul 2007 21:25:52 -0000
> @@ -295,9 +295,9 @@
>  	      exit 1;; \
>  	  esac; \
>  	done; \
> -	echo ' cd $(top_srcdir) && $(AUTOMAKE) --cygnus  doc/Makefile'; \
> +	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  doc/Makefile'; \
>  	cd $(top_srcdir) && \
> -	  $(AUTOMAKE) --cygnus  doc/Makefile
> +	  $(AUTOMAKE) --foreign  doc/Makefile
>  .PRECIOUS: Makefile
>  Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
>  	@case '$?' in \
> Index: gas/doc/as.texinfo
> ===================================================================
> RCS file: /cvs/src/src/gas/doc/as.texinfo,v
> retrieving revision 1.166
> diff -u -r1.166 as.texinfo
> --- gas/doc/as.texinfo	29 Jun 2007 14:09:30 -0000	1.166
> +++ gas/doc/as.texinfo	4 Jul 2007 21:25:54 -0000
> @@ -226,6 +226,7 @@
>  @smallexample
>  @c man begin SYNOPSIS
>  @value{AS} [@b{-a}[@b{cdhlns}][=@var{file}]] [@b{--alternate}] [@b{-D}]
> + [@b{--debug-prefix-map} @var{old}=@var{new}]
>   [@b{--defsym} @var{sym}=@var{val}] [@b{-f}] [@b{-g}] [@b{--gstabs}]
>   [@b{--gstabs+}] [@b{--gdwarf-2}] [@b{--help}] [@b{-I} @var{dir}] [@b{-J}]
>   [@b{-K}] [@b{-L}] [@b{--listing-lhs-width}=@var{NUM}]
> @@ -501,6 +502,10 @@
>  Ignored.  This option is accepted for script compatibility with calls to
>  other assemblers.
>  
> +@item --debug-prefix-map @var{old}=@var{new}
> +When assembling files in directory @file{@var{old}}, record debugging
> +information describing them as in @file{@var{new}} instead.
> +
>  @item --defsym @var{sym}=@var{value}
>  Define the symbol @var{sym} to be @var{value} before assembling the input file.
>  @var{value} must be an integer constant.  As in C, a leading @samp{0x}
> 
-- 
Danny Backx ; danny.backx - at - scarlet.be ; http://danny.backx.info

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 189 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Ping Re: Debug info path remapping
  2007-07-05  5:02 Debug info path remapping Joseph S. Myers
  2007-07-05 20:04 ` Danny Backx
@ 2007-08-11 23:51 ` Joseph S. Myers
  2007-08-15  7:11   ` Mark Mitchell
       [not found]   ` <Pine.LNX.4.64.0708171450040.23946@digraph.polyomino.org.uk>
  1 sibling, 2 replies; 6+ messages in thread
From: Joseph S. Myers @ 2007-08-11 23:51 UTC (permalink / raw)
  To: gcc-patches, binutils

Ping.  These patches to GCC and GAS 
<http://gcc.gnu.org/ml/gcc-patches/2007-07/msg00404.html> 
<http://sourceware.org/ml/binutils/2007-07/msg00113.html> are pending 
review.

(Presume that if applied now the GCC configure patch would be updated to 
reflect that the GAS changes would only be in 2.19 not 2.18.)

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Ping Re: Debug info path remapping
  2007-08-11 23:51 ` Ping " Joseph S. Myers
@ 2007-08-15  7:11   ` Mark Mitchell
       [not found]   ` <Pine.LNX.4.64.0708171450040.23946@digraph.polyomino.org.uk>
  1 sibling, 0 replies; 6+ messages in thread
From: Mark Mitchell @ 2007-08-15  7:11 UTC (permalink / raw)
  To: Joseph S. Myers; +Cc: gcc-patches, binutils

Joseph S. Myers wrote:
> Ping.  These patches to GCC and GAS 
> <http://gcc.gnu.org/ml/gcc-patches/2007-07/msg00404.html> 
> <http://sourceware.org/ml/binutils/2007-07/msg00113.html> are pending 
> review.
> 
> (Presume that if applied now the GCC configure patch would be updated to 
> reflect that the GAS changes would only be in 2.19 not 2.18.)

The GCC part is OK if no objections within 72 hours.

Thanks,

-- 
Mark Mitchell
CodeSourcery
mark@codesourcery.com
(650) 331-3385 x713

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Ping Re: Debug info path remapping
       [not found]     ` <20070824135238.GA6629@caradoc.them.org>
@ 2007-08-25 20:21       ` Joseph S. Myers
  0 siblings, 0 replies; 6+ messages in thread
From: Joseph S. Myers @ 2007-08-25 20:21 UTC (permalink / raw)
  To: gcc-patches

On Fri, 24 Aug 2007, Daniel Jacobowitz wrote:

> On Fri, Aug 17, 2007 at 02:52:30PM +0000, Joseph S. Myers wrote:
> > Ping again: this binutils patch 
> > <http://sourceware.org/ml/binutils/2007-07/msg00113.html> is pending 
> > review.  (Presume the new file would be updated on GPLv3 on commit.)
> 
> This patch is OK.  I got a request from Matthias to have this
> functionality on the branch; it's a bit of a stretch at this date
> (sorry, Ben!) but I think worth making an exception for since
> distributors are likely to apply it anyway.

I've applied the binutils patch to mainline and 2.18 branch, and 
accordingly applied as obvious this GCC patch to make the configure test 
use 2.18 again (as in the original submission before 2.18 branched) as the 
version where an in-tree assembler is presumed to have this feature.

Index: configure
===================================================================
--- configure	(revision 127799)
+++ configure	(working copy)
@@ -16276,7 +16276,7 @@
 else
   gcc_cv_as_debug_prefix_map_flag=no
     if test $in_tree_gas = yes; then
-    if test $gcc_cv_gas_vers -ge `expr \( \( 2 \* 1000 \) + 19 \) \* 1000 + 0`
+    if test $gcc_cv_gas_vers -ge `expr \( \( 2 \* 1000 \) + 18 \) \* 1000 + 0`
   then gcc_cv_as_debug_prefix_map_flag=yes
 fi
   elif test x$gcc_cv_as != x; then
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 127799)
+++ ChangeLog	(working copy)
@@ -1,3 +1,9 @@
+2007-08-25  Joseph Myers  <joseph@codesourcery.com>
+
+	* configure.ac (--debug-prefix-map check): Change assembler
+	version presumed to have feature to 2.18.
+	* configure: Regenerate.
+
 2007-08-25  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
 	* c-common.c (vector_types_convertible_p,
Index: configure.ac
===================================================================
--- configure.ac	(revision 127799)
+++ configure.ac	(working copy)
@@ -3103,7 +3103,7 @@
 
  gcc_GAS_CHECK_FEATURE([--debug-prefix-map option],
   gcc_cv_as_debug_prefix_map_flag,
-  [2,19,0], [--debug-prefix-map /a=/b], [$insn],,
+  [2,18,0], [--debug-prefix-map /a=/b], [$insn],,
   [AC_DEFINE(HAVE_AS_DEBUG_PREFIX_MAP, 1,
 [Define if your assembler supports the --debug-prefix-map option.])])
 fi

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Debug info path remapping
  2007-07-05 20:04 ` Danny Backx
@ 2007-08-29 17:30   ` Joseph S. Myers
  0 siblings, 0 replies; 6+ messages in thread
From: Joseph S. Myers @ 2007-08-29 17:30 UTC (permalink / raw)
  To: Danny Backx; +Cc: gcc-patches

On Thu, 5 Jul 2007, Danny Backx wrote:

> This looks remarkably like a patch I sent in on May 16 to do something
> similar for gcov. The reason for my patch is cross-compilers which
> target Windows CE systems, on which the original source path doesn't
> exist.
> 
> Maybe the two patches should be considered together.
> 
> See http://gcc.gnu.org/ml/gcc-patches/2007-05/msg01087.html for mine.

I think you need to keep pinging your patch until it gets reviewed.  It's 
also around the size where you may need to get the FSF copyright 
assignment in first before it can be committed.

The new option needs documenting in invoke.texi as well as gcov.texi.  
"xstrdup(arg)" should have a space: "xstrdup (arg)".  As you noted in your 
original submission, I think it would also be a good idea to separate the 
Windows CE patch to libgcov.c from the rest of the patch so they can be 
considered separately; it helps for patches to be submitted in minimal 
indivisible units.

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2007-08-29 17:20 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-07-05  5:02 Debug info path remapping Joseph S. Myers
2007-07-05 20:04 ` Danny Backx
2007-08-29 17:30   ` Joseph S. Myers
2007-08-11 23:51 ` Ping " Joseph S. Myers
2007-08-15  7:11   ` Mark Mitchell
     [not found]   ` <Pine.LNX.4.64.0708171450040.23946@digraph.polyomino.org.uk>
     [not found]     ` <20070824135238.GA6629@caradoc.them.org>
2007-08-25 20:21       ` Joseph S. Myers

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).