[debrepatch] 01/01: Add build-path-prefix-map patches for dpkg and gcc-6, will upload to our repo later

Ximin Luo infinity0 at debian.org
Wed Apr 5 02:27:41 UTC 2017


This is an automated email from the git hooks/post-receive script.

infinity0 pushed a commit to branch master
in repository debrepatch.

commit 4e63e3d3e708635f88fc4d1808e33aad09637d1e
Author: Ximin Luo <infinity0 at debian.org>
Date:   Wed Apr 5 04:27:24 2017 +0200

    Add build-path-prefix-map patches for dpkg and gcc-6, will upload to our repo later
---
 toolchain-patches/dpkg_BPPM.patch  | 170 +++++++
 toolchain-patches/gcc-6_BPPM.patch | 968 +++++++++++++++++++++++++++++++++++++
 2 files changed, 1138 insertions(+)

diff --git a/toolchain-patches/dpkg_BPPM.patch b/toolchain-patches/dpkg_BPPM.patch
new file mode 100644
index 0000000..e44a517
--- /dev/null
+++ b/toolchain-patches/dpkg_BPPM.patch
@@ -0,0 +1,170 @@
+From 6bac6d8a6c0aa697ae084e696d3d2c40c7e68771 Mon Sep 17 00:00:00 2001
+From: Ximin Luo <infinity0 at debian.org>
+Date: Sat, 1 Apr 2017 10:02:40 -0400
+Subject: [PATCH] BUILD_PATH_PREFIX_MAP
+
+---
+ debian/changelog              |  6 +++---
+ scripts/Dpkg/Path.pm          | 17 +++++++++++++++++
+ scripts/Dpkg/Vendor/Debian.pm |  2 +-
+ scripts/dpkg-buildpackage.pl  |  4 +++-
+ scripts/dpkg-genbuildinfo.pl  |  5 ++++-
+ scripts/dpkg-source.pl        |  3 +++
+ scripts/mk/pkg-info.mk        | 15 ++++++++++++++-
+ 7 files changed, 45 insertions(+), 7 deletions(-)
+
+diff --git a/debian/changelog b/debian/changelog
+index 374573c..97918d8 100644
+--- a/debian/changelog
++++ b/debian/changelog
+@@ -1,2 +1,8 @@
++dpkg (1.18.23.0~reproducible1) unstable; urgency=medium
++
++  * BUILD_PATH_PREFIX_MAP
++
++ -- Ximin Luo <infinity0 at debian.org>  Fri, 31 Mar 2017 15:58:56 -0400
++
+ dpkg (1.18.23) unstable; urgency=medium
+ 
+diff --git a/scripts/Dpkg/Path.pm b/scripts/Dpkg/Path.pm
+index f352cac..058ac85 100644
+--- a/scripts/Dpkg/Path.pm
++++ b/scripts/Dpkg/Path.pm
+@@ -30,6 +30,7 @@ our @EXPORT_OK = qw(
+     get_pkg_root_dir
+     guess_pkg_root_dir
+     relative_to_pkg_root
++    bppm_append
+ );
+ 
+ use Exporter qw(import);
+@@ -277,6 +278,22 @@ sub find_build_file($) {
+     return;
+ }
+ 
++sub bppm_enquote {
++    my $part = shift;
++    $part =~ s/%/%#/g;
++    $part =~ s/=/%+/g;
++    $part =~ s/:/%./g;
++    return $part;
++}
++
++sub bppm_append($$) {
++    my $dst = shift;
++    my $src = shift;
++    my $curmap = $ENV{"BUILD_PATH_PREFIX_MAP"};
++    $ENV{"BUILD_PATH_PREFIX_MAP"} = ($curmap ? $curmap . ":" : "") .
++        bppm_enquote($dst) . "=" . bppm_enquote($src);
++}
++
+ =back
+ 
+ =head1 CHANGES
+diff --git a/scripts/Dpkg/Vendor/Debian.pm b/scripts/Dpkg/Vendor/Debian.pm
+index 091ec42..2562b29 100644
+--- a/scripts/Dpkg/Vendor/Debian.pm
++++ b/scripts/Dpkg/Vendor/Debian.pm
+@@ -145,7 +145,7 @@ sub _add_reproducible_flags {
+     # Default feature states.
+     my %use_feature = (
+         timeless => 1,
+-        fixdebugpath => 1,
++        fixdebugpath => 0,
+     );
+ 
+     my $build_path;
+diff --git a/scripts/dpkg-buildpackage.pl b/scripts/dpkg-buildpackage.pl
+index 2eea203..0543205 100755
+--- a/scripts/dpkg-buildpackage.pl
++++ b/scripts/dpkg-buildpackage.pl
+@@ -43,7 +43,7 @@
+ use Dpkg::Control;
+ use Dpkg::Control::Info;
+ use Dpkg::Changelog::Parse;
+-use Dpkg::Path qw(find_command);
++use Dpkg::Path qw(find_command bppm_append);
+ use Dpkg::IPC;
+ 
+ textdomain('dpkg-dev');
+@@ -449,6 +449,8 @@ sub usage {
+ 
+ # <https://reproducible-builds.org/specs/source-date-epoch/>
+ $ENV{SOURCE_DATE_EPOCH} ||= $changelog->{timestamp} || time;
++# <https://reproducible-builds.org/specs/build-path-prefix-map/>
++bppm_append("${pkg}_${version}", $cwd);
+ 
+ my @arch_opts;
+ push @arch_opts, ('--host-arch', $host_arch) if $host_arch;
+diff --git a/scripts/dpkg-genbuildinfo.pl b/scripts/dpkg-genbuildinfo.pl
+index 27bf7dc..1e2d056 100755
+--- a/scripts/dpkg-genbuildinfo.pl
++++ b/scripts/dpkg-genbuildinfo.pl
+@@ -249,11 +249,14 @@ sub collect_installed_builddeps {
+ sub cleansed_environment {
+     # Consider only whitelisted variables which are not supposed to leak
+     # local user information.
++    my @env_whitelist = get_build_env_whitelist();
++    # See <https://reproducible-builds.org/specs/build-path-prefix-map>.
++    push(@env_whitelist, "BUILD_PATH_PREFIX_MAP") if ($use_feature{path});
+     my %env = map {
+         $_ => $ENV{$_}
+     } grep {
+         exists $ENV{$_}
+-    } get_build_env_whitelist();
++    } @env_whitelist;
+ 
+     # Record flags from dpkg-buildflags.
+     my $bf = Dpkg::BuildFlags->new();
+diff --git a/scripts/dpkg-source.pl b/scripts/dpkg-source.pl
+index dbb182f..c5fcaaa 100755
+--- a/scripts/dpkg-source.pl
++++ b/scripts/dpkg-source.pl
+@@ -48,6 +48,7 @@
+ use Dpkg::Version;
+ use Dpkg::Vars;
+ use Dpkg::Changelog::Parse;
++use Dpkg::Path qw(bppm_append);
+ use Dpkg::Source::Package qw(get_default_diff_ignore_regex
+                              set_default_diff_ignore_regex
+                              get_default_tar_ignore_pattern);
+@@ -238,6 +239,8 @@
+ 
+     # <https://reproducible-builds.org/specs/source-date-epoch/>
+     $ENV{SOURCE_DATE_EPOCH} ||= $changelog->{timestamp} || time;
++    # <https://reproducible-builds.org/specs/build-path-prefix-map/>
++    bppm_append($changelog->{source} . "_" . $changelog->{version}, Cwd::abs_path($dir));
+ 
+     my $srcpkg = Dpkg::Source::Package->new(options => \%options);
+     my $fields = $srcpkg->{fields};
+diff --git a/scripts/mk/pkg-info.mk b/scripts/mk/pkg-info.mk
+index 15322ce..ae2ce03 100644
+--- a/scripts/mk/pkg-info.mk
++++ b/scripts/mk/pkg-info.mk
+@@ -9,6 +9,10 @@
+ #
+ # SOURCE_DATE_EPOCH: the source release date as seconds since the epoch, as
+ #   specified by <https://reproducible-builds.org/specs/source-date-epoch/>
++#
++# BUILD_PATH_PREFIX_MAP: the package name and version mapped to the top-level
++#   absolute package directory, as specified by
++#   <https://reproducible-builds.org/specs/build-path-prefix-map/>
+ 
+ dpkg_late_eval ?= $(or $(value DPKG_CACHE_$(1)),$(eval DPKG_CACHE_$(1) := $(shell $(2)))$(value DPKG_CACHE_$(1)))
+ 
+@@ -20,5 +24,14 @@ DEB_VERSION_UPSTREAM = $(call dpkg_late_eval,DEB_VERSION_UPSTREAM,echo '$(DEB_VE
+ DEB_DISTRIBUTION = $(call dpkg_late_eval,DEB_DISTRIBUTION,dpkg-parsechangelog -SDistribution)
+ 
+ SOURCE_DATE_EPOCH ?= $(call dpkg_late_eval,SOURCE_DATE_EPOCH,dpkg-parsechangelog -STimestamp)
+-
+ export SOURCE_DATE_EPOCH
++
++bppm_enquote = $(subst :,%.,$(subst =,%+,$(subst %,%\#,$(1))))
++BUILD_PATH_PREFIX_MAP ?= $(call dpkg_late_eval,BUILD_PATH_PREFIX_MAP,echo\
++"$${BUILD_PATH_PREFIX_MAP:+$$BUILD_PATH_PREFIX_MAP:}"$(call\
++bppm_enquote,$(DEB_SOURCE)_$(DEB_VERSION))=$(call\
++bppm_enquote,$(CURDIR)))
++export BUILD_PATH_PREFIX_MAP
++
++# FIXME: "export" makes dpkg_late_eval completely pointless since it forces
++# evaluation. This is true for both SOURCE_DATE_EPOCH and BUILD_PATH_PREFIX_MAP
diff --git a/toolchain-patches/gcc-6_BPPM.patch b/toolchain-patches/gcc-6_BPPM.patch
new file mode 100644
index 0000000..f78a44f
--- /dev/null
+++ b/toolchain-patches/gcc-6_BPPM.patch
@@ -0,0 +1,968 @@
+diff -u gcc-6-6.3.0/debian/changelog gcc-6-6.3.0/debian/changelog
+--- gcc-6-6.3.0/debian/changelog
++++ gcc-6-6.3.0/debian/changelog
+@@ -1,3 +1,10 @@
++gcc-6 (6.3.0-11.0~reproducible1) unstable; urgency=medium
++
++  * Non-maintainer upload.
++  * Support BUILD_PATH_PREFIX_MAP.
++
++ -- Ximin Luo <infinity0 at debian.org>  Fri, 31 Mar 2017 19:13:44 -0400
++
+ gcc-6 (6.3.0-11) unstable; urgency=medium
+ 
+   * Fix PR target/78543 (PPC), taken from the gcc-6-branch. Closes: #856809.
+diff -u gcc-6-6.3.0/debian/rules.patch gcc-6-6.3.0/debian/rules.patch
+--- gcc-6-6.3.0/debian/rules.patch
++++ gcc-6-6.3.0/debian/rules.patch
+@@ -86,6 +86,9 @@
+ 	libjit-ldflags \
+ 	gcc-SOURCE_DATE_EPOCH \
+ 	gcc-SOURCE_DATE_EPOCH-2 \
++	BPPM_env_debuginfo \
++	BPPM_env_FILE_macro \
++	remap_whole_path_components \
+ 	cmd-go-combine-gccgo-s-ld-and-ldShared-methods \
+ 	libjava-mips64el \
+ 	gccgo-issue16780 \
+only in patch2:
+unchanged:
+--- gcc-6-6.3.0.orig/debian/patches/BPPM_env_FILE_macro.diff
++++ gcc-6-6.3.0/debian/patches/BPPM_env_FILE_macro.diff
+@@ -0,0 +1,229 @@
++Subject: [PATCH 2/3] Use BUILD_PATH_PREFIX_MAP envvar to transform __FILE__
++
++Use the BUILD_PATH_PREFIX_MAP environment variable when expanding the __FILE__
++macro, in the same way that debug-prefix-map works for debugging symbol paths.
++
++This patch follows similar lines to the earlier patch for SOURCE_DATE_EPOCH.
++Specifically, we read the environment variable not in libcpp but via a hook
++which has an implementation defined in gcc/c-family.  However, to achieve this
++is more complex than the earlier patch: we need to share the prefix_map data
++structure and associated functions between libcpp and c-family.  Therefore, we
++need to move these to libiberty.  (For comparison, the SOURCE_DATE_EPOCH patch
++did not need this because time_t et. al. are in the standard C library.)
++
++Acknowledgements
++----------------
++
++Dhole <dhole at openmailbox.org> who wrote the earlier patch for SOURCE_DATE_EPOCH
++which saved me a lot of time on figuring out what to edit.
++
++ChangeLogs
++----------
++
++gcc/c-family/ChangeLog:
++
++2017-03-27  Ximin Luo  <infinity0 at pwned.gg>
++
++	* c-common.c (cb_get_build_path_prefix_map): Define new call target.
++	* c-common.h (cb_get_build_path_prefix_map): Declare call target.
++	* c-lex.c (init_c_lex): Set the get_build_path_prefix_map callback.
++
++libcpp/ChangeLog:
++
++2017-03-27  Ximin Luo  <infinity0 at pwned.gg>
++
++	* include/cpplib.h (cpp_callbacks): Add get_build_path_prefix_map
++	callback.
++	* init.c (cpp_create_reader): Initialise build_path_prefix_map field.
++	* internal.h (cpp_reader): Add new field build_path_prefix_map.
++	* macro.c (_cpp_builtin_macro_text): Set the build_path_prefix_map
++	field if unset and apply it when expanding __FILE__ macros.
++
++gcc/testsuite/ChangeLog:
++
++2017-03-27  Ximin Luo  <infinity0 at pwned.gg>
++
++	* gcc.dg/cpp/build_path_prefix_map-1.c: New test.
++	* gcc.dg/cpp/build_path_prefix_map-2.c: New test.
++
++Index: b/src/gcc/c-family/c-common.c
++===================================================================
++--- a/src/gcc/c-family/c-common.c
+++++ b/src/gcc/c-family/c-common.c
++@@ -21,6 +21,7 @@ along with GCC; see the file COPYING3.
++ 
++ #include "config.h"
++ #include "system.h"
+++#include "prefix-map.h"
++ #include "coretypes.h"
++ #include "target.h"
++ #include "function.h"
++@@ -8005,4 +8006,23 @@ cb_get_source_date_epoch (cpp_reader *pf
++   return (time_t) epoch;
++ }
++ 
+++/* Read BUILD_PATH_PREFIX_MAP from environment to have deterministic relative
+++   paths to replace embedded absolute paths to get reproducible results.
+++   Returns NULL if BUILD_PATH_PREFIX_MAP is badly formed.  */
+++
+++prefix_map **
+++cb_get_build_path_prefix_map (cpp_reader *pfile ATTRIBUTE_UNUSED)
+++{
+++  prefix_map **map = XCNEW (prefix_map *);
+++
+++  const char *arg = getenv ("BUILD_PATH_PREFIX_MAP");
+++  if (!arg || prefix_map_parse (map, arg))
+++    return map;
+++
+++  free (map);
+++  error_at (input_location, "environment variable BUILD_PATH_PREFIX_MAP is "
+++	    "not well formed; see the GCC documentation for more details.");
+++  return NULL;
+++}
+++
++ #include "gt-c-family-c-common.h"
++Index: b/src/gcc/c-family/c-common.h
++===================================================================
++--- a/src/gcc/c-family/c-common.h
+++++ b/src/gcc/c-family/c-common.h
++@@ -1085,6 +1085,11 @@ extern time_t cb_get_source_date_epoch (
++    __TIME__ can store.  */
++ #define MAX_SOURCE_DATE_EPOCH HOST_WIDE_INT_C (253402300799)
++ 
+++/* Read BUILD_PATH_PREFIX_MAP from environment to have deterministic relative
+++   paths to replace embedded absolute paths to get reproducible results.
+++   Returns NULL if BUILD_PATH_PREFIX_MAP is badly formed.  */
+++extern prefix_map **cb_get_build_path_prefix_map (cpp_reader *pfile);
+++
++ /* In c-gimplify.c  */
++ extern void c_genericize (tree);
++ extern int c_gimplify_expr (tree *, gimple_seq *, gimple_seq *);
++Index: b/src/gcc/c-family/c-lex.c
++===================================================================
++--- a/src/gcc/c-family/c-lex.c
+++++ b/src/gcc/c-family/c-lex.c
++@@ -81,6 +81,7 @@ init_c_lex (void)
++   cb->read_pch = c_common_read_pch;
++   cb->has_attribute = c_common_has_attribute;
++   cb->get_source_date_epoch = cb_get_source_date_epoch;
+++  cb->get_build_path_prefix_map = cb_get_build_path_prefix_map;
++ 
++   /* Set the debug callbacks if we can use them.  */
++   if ((debug_info_level == DINFO_LEVEL_VERBOSE
++Index: b/src/libcpp/include/cpplib.h
++===================================================================
++--- a/src/libcpp/include/cpplib.h
+++++ b/src/libcpp/include/cpplib.h
++@@ -607,5 +607,8 @@ struct cpp_callbacks
++   /* Callback to parse SOURCE_DATE_EPOCH from environment.  */
++   time_t (*get_source_date_epoch) (cpp_reader *);
+++
+++  /* Callback to parse BUILD_PATH_PREFIX_MAP from environment.  */
+++  struct prefix_map **(*get_build_path_prefix_map) (cpp_reader *);
++ };
++ 
++ #ifdef VMS
++Index: b/src/libcpp/init.c
++===================================================================
++--- a/src/libcpp/init.c
+++++ b/src/libcpp/init.c
++@@ -261,6 +261,9 @@ cpp_create_reader (enum c_lang lang, cpp
++   /* Initialize source_date_epoch to -2 (not yet set).  */
++   pfile->source_date_epoch = (time_t) -2;
++ 
+++  /* Initialize build_path_prefix_map to NULL (not yet set).  */
+++  pfile->build_path_prefix_map = NULL;
+++
++   /* The expression parser stack.  */
++   _cpp_expand_op_stack (pfile);
++ 
++Index: b/src/libcpp/internal.h
++===================================================================
++--- a/src/libcpp/internal.h
+++++ b/src/libcpp/internal.h
++@@ -507,6 +507,11 @@ struct cpp_reader
++      set to -1 to disable it or to a non-negative value to enable it.  */
++   time_t source_date_epoch;
++ 
+++  /* Externally set prefix-map to transform absolute paths, useful for
+++     reproducibility.  It should be initialized to NULL (not yet set or
+++     disabled) or to a `struct prefix_map` double pointer to enable it.  */
+++  struct prefix_map **build_path_prefix_map;
+++
++   /* EOF token, and a token forcing paste avoidance.  */
++   cpp_token avoid_paste;
++   cpp_token eof;
++Index: b/src/libcpp/macro.c
++===================================================================
++--- a/src/libcpp/macro.c
+++++ b/src/libcpp/macro.c
++@@ -26,6 +26,7 @@ along with this program; see the file CO
++ #include "system.h"
++ #include "cpplib.h"
++ #include "internal.h"
+++#include "prefix-map.h"
++ 
++ typedef struct macro_arg macro_arg;
++ /* This structure represents the tokens of a macro argument.  These
++@@ -291,7 +292,17 @@ _cpp_builtin_macro_text (cpp_reader *pfi
++ 	unsigned int len;
++ 	const char *name;
++ 	uchar *buf;
+++	prefix_map **map = pfile->build_path_prefix_map;
++ 	
+++	/* Set a prefix-map for __FILE__ if BUILD_PATH_PREFIX_MAP is defined.  */
+++	if (map == NULL && pfile->cb.get_build_path_prefix_map != NULL)
+++	  {
+++	    map = pfile->cb.get_build_path_prefix_map (pfile);
+++	    if (map == NULL)
+++	      abort ();
+++	    pfile->build_path_prefix_map = map;
+++	  }
+++
++ 	if (node->value.builtin == BT_FILE)
++ 	  name = linemap_get_expansion_filename (pfile->line_table,
++ 						 pfile->line_table->highest_line);
++@@ -301,6 +312,11 @@ _cpp_builtin_macro_text (cpp_reader *pfi
++ 	    if (!name)
++ 	      abort ();
++ 	  }
+++
+++	/* Apply the prefix-map for deterministic path output.  */
+++	if (map != NULL)
+++	  name = prefix_map_remap_alloca (*map, name);
+++
++ 	len = strlen (name);
++ 	buf = _cpp_unaligned_alloc (pfile, len * 2 + 3);
++ 	result = buf;
++Index: b/src/gcc/testsuite/gcc.dg/cpp/build_path_prefix_map-1.c
++===================================================================
++--- /dev/null
+++++ b/src/gcc/testsuite/gcc.dg/cpp/build_path_prefix_map-1.c
++@@ -0,0 +1,11 @@
+++/* __FILE__ should strip BUILD_PATH_PREFIX_MAP if the latter is a prefix. */
+++/* { dg-do run } */
+++/* { dg-set-compiler-env-var BUILD_PATH_PREFIX_MAP "MACROTEST=$srcdir" } */
+++
+++int
+++main ()
+++{
+++  if (__builtin_strcmp (__FILE__, "MACROTEST/gcc.dg/cpp/build_path_prefix_map-1.c") != 0)
+++    __builtin_abort ();
+++  return 0;
+++}
++Index: b/src/gcc/testsuite/gcc.dg/cpp/build_path_prefix_map-2.c
++===================================================================
++--- /dev/null
+++++ b/src/gcc/testsuite/gcc.dg/cpp/build_path_prefix_map-2.c
++@@ -0,0 +1,11 @@
+++/* __FILE__ should not be relative if BUILD_PATH_PREFIX_MAP is not set, and gcc is
+++   asked to compile an absolute filename as is the case with this test.  */
+++/* { dg-do run } */
+++
+++int
+++main ()
+++{
+++  if (__builtin_strcmp (__FILE__, "./gcc.dg/cpp/build_path_prefix_map-1.c") == 0)
+++    __builtin_abort ();
+++  return 0;
+++}
+only in patch2:
+unchanged:
+--- gcc-6-6.3.0.orig/debian/patches/BPPM_env_debuginfo.diff
++++ gcc-6-6.3.0/debian/patches/BPPM_env_debuginfo.diff
+@@ -0,0 +1,625 @@
++Subject: [PATCH 1/3] Use BUILD_PATH_PREFIX_MAP envvar for debug-prefix-map
++
++Define the BUILD_PATH_PREFIX_MAP environment variable, and treat it as implicit
++-fdebug-prefix-map CLI options specified before any explicit such options.
++
++Much of the generic code for applying and parsing prefix-maps is implemented in
++libiberty instead of the dwarf2 parts of the code, in order to make subsequent
++patches unrelated to debuginfo easier.
++
++Acknowledgements
++----------------
++
++Daniel Kahn Gillmor who wrote the patch for r231835, which saved me a lot of
++time figuring out what to edit.
++
++HW42 for discussion on the details of the proposal, and for suggesting that we
++retain the ability to map the prefix to something other than ".".
++
++Other contributors to the BUILD_PATH_PREFIX_MAP specification, see
++https://reproducible-builds.org/specs/build-path-prefix-map/
++
++ChangeLogs
++----------
++
++include/ChangeLog:
++
++2017-03-27  Ximin Luo  <infinity0 at pwned.gg>
++
++	* prefix-map.h: New file implementing the BUILD_PATH_PREFIX_MAP
++	specification; includes code from /gcc/final.c and code adapted from
++	examples attached to the specification.
++
++libiberty/ChangeLog:
++
++2017-03-27  Ximin Luo  <infinity0 at pwned.gg>
++
++	* prefix-map.c: New file implementing the BUILD_PATH_PREFIX_MAP
++	specification; includes code from /gcc/final.c and code adapted from
++	examples attached to the specification.
++	* Makefile.in: Update for new files.
++
++gcc/ChangeLog:
++
++2017-03-27  Ximin Luo  <infinity0 at pwned.gg>
++
++	* debug.h: Declare add_debug_prefix_map_from_envvar.
++	* final.c: Define add_debug_prefix_map_from_envvar, and refactor
++	prefix-map utilities to use equivalent code from libiberty instead.
++	* opts-global.c: (handle_common_deferred_options): Call
++	add_debug_prefix_map_from_envvar before processing options.
++
++gcc/testsuite/ChangeLog:
++
++2017-03-27  Ximin Luo  <infinity0 at pwned.gg>
++
++	* gcc.dg/debug/dwarf2/build_path_prefix_map-1.c: New test.
++	* gcc.dg/debug/dwarf2/build_path_prefix_map-2.c: New test.
++
++Index: b/src/include/prefix-map.h
++===================================================================
++--- /dev/null
+++++ b/src/include/prefix-map.h
++@@ -0,0 +1,108 @@
+++/* Declarations for manipulating filename prefixes.
+++
+++   Copyright (C) 2017 Free Software Foundation, Inc.
+++
+++   This program 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.
+++
+++   This program 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 this program; if not, write to the Free Software Foundation,
+++   Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
+++
+++#ifndef _PREFIX_MAP_H
+++#define _PREFIX_MAP_H
+++
+++#ifdef __cplusplus
+++extern "C" {
+++#endif
+++
+++#ifdef HAVE_STDLIB_H
+++#include <stdlib.h>
+++#endif
+++
+++/* Linked-list of mappings from old prefixes to new prefixes.  */
+++
+++struct prefix_map
+++{
+++  const char *old_prefix;
+++  const char *new_prefix;
+++  size_t old_len;
+++  size_t new_len;
+++  struct prefix_map *next;
+++};
+++
+++
+++/* Find a mapping suitable for the given OLD_NAME in the linked list MAP.\
+++
+++   If a mapping is found, writes a pointer to the non-matching suffix part of
+++   OLD_NAME in SUFFIX, and its length in SUF_LEN.
+++
+++   Returns NULL if there was no suitable mapping.  */
+++struct prefix_map *
+++prefix_map_find (struct prefix_map *map, const char *old_name,
+++		 const char **suffix, size_t *suf_len);
+++
+++/* Prepend a prefix map before a given SUFFIX.
+++
+++   The remapped name is written to NEW_NAME and returned as a const pointer. No
+++   allocations are performed; the caller must ensure it can hold at least
+++   MAP->NEW_LEN + SUF_LEN + 1 characters.  */
+++const char *
+++prefix_map_prepend (struct prefix_map *map, char *new_name,
+++		    const char *suffix, size_t suf_len);
+++
+++/* Remap a filename.
+++
+++   Returns OLD_NAME unchanged if there was no remapping, otherwise returns a
+++   pointer to newly-allocated memory for the remapped filename.  The memory is
+++   allocated by the given ALLOC function, which also determines who is
+++   responsible for freeing it.  */
+++#define prefix_map_remap_alloc_(map_head, old_name, alloc)		       \
+++  __extension__								       \
+++  ({									       \
+++    const char *__suffix;						       \
+++    size_t __suf_len;							       \
+++    struct prefix_map *__map;						       \
+++    (__map = prefix_map_find ((map_head), (old_name), &__suffix, &__suf_len))  \
+++      ? prefix_map_prepend (__map,					       \
+++			    (char *) alloc (__map->new_len + __suf_len + 1),   \
+++			    __suffix, __suf_len)			       \
+++      : (old_name);							       \
+++  })
+++
+++/* Remap a filename.
+++
+++   Returns OLD_NAME unchanged if there was no remapping, otherwise returns a
+++   stack-allocated pointer to the newly-remapped filename.  */
+++#define prefix_map_remap_alloca(map_head, old_name) \
+++  prefix_map_remap_alloc_ (map_head, old_name, alloca)
+++
+++
+++/* Parse prefix-maps according to the BUILD_PATH_PREFIX_MAP standard.
+++
+++   The input string value is of the form
+++
+++     dst[0]=src[0]:dst[1]=src[1]...
+++
+++   Every dst[i] and src[i] has had "%", "=" and ":" characters replaced with
+++   "%#", "%+", and "%." respectively; this function reverses this replacement.
+++
+++   Rightmost entries are stored at the head of the parsed structure.
+++
+++   Returns 0 on failure and 1 on success.  */
+++int
+++prefix_map_parse (struct prefix_map **map_head, const char *arg);
+++
+++
+++#ifdef __cplusplus
+++}
+++#endif
+++
+++#endif /* _PREFIX_MAP_H */
++Index: b/src/libiberty/Makefile.in
++===================================================================
++--- a/src/libiberty/Makefile.in
+++++ b/src/libiberty/Makefile.in
++@@ -143,6 +143,7 @@ CFILES = alloca.c argv.c asprintf.c atex
++ 	 pex-common.c pex-djgpp.c pex-msdos.c pex-one.c			\
++ 	 pex-unix.c pex-win32.c						\
++          physmem.c putenv.c						\
+++	prefix-map.c \
++ 	random.c regex.c rename.c rindex.c				\
++ 	rust-demangle.c							\
++ 	safe-ctype.c setenv.c setproctitle.c sha1.c sigsetmask.c        \
++@@ -182,6 +183,7 @@ REQUIRED_OFILES =							\
++ 	./partition.$(objext) ./pexecute.$(objext) ./physmem.$(objext)	\
++ 	./pex-common.$(objext) ./pex-one.$(objext)			\
++ 	./@pexecute at .$(objext) ./vprintf-support.$(objext)		\
+++	./prefix-map.$(objext) \
++ 	./rust-demangle.$(objext)					\
++ 	./safe-ctype.$(objext)						\
++ 	./simple-object.$(objext) ./simple-object-coff.$(objext)	\
++@@ -757,7 +759,7 @@ $(CONFIGURED_OFILES): stamp-picdir stamp
++ 	$(COMPILE.c) $(srcdir)/fibheap.c $(OUTPUT_OPTION)
++ 
++ ./filename_cmp.$(objext): $(srcdir)/filename_cmp.c config.h $(INCDIR)/ansidecl.h \
++-	$(INCDIR)/filenames.h $(INCDIR)/hashtab.h \
+++	$(INCDIR)/filenames.h $(INCDIR)/hashtab.h $(INCDIR)/libiberty.h \
++ 	$(INCDIR)/safe-ctype.h
++ 	if [ x"$(PICFLAG)" != x ]; then \
++ 	  $(COMPILE.c) $(PICFLAG) $(srcdir)/filename_cmp.c -o pic/$@; \
++@@ -1104,7 +1106,8 @@ $(CONFIGURED_OFILES): stamp-picdir stamp
++ 	$(COMPILE.c) $(srcdir)/pex-one.c $(OUTPUT_OPTION)
++ 
++ ./pex-unix.$(objext): $(srcdir)/pex-unix.c config.h $(INCDIR)/ansidecl.h \
++-	$(INCDIR)/libiberty.h $(srcdir)/pex-common.h
+++	$(INCDIR)/environ.h $(INCDIR)/libiberty.h \
+++	$(srcdir)/pex-common.h
++ 	if [ x"$(PICFLAG)" != x ]; then \
++ 	  $(COMPILE.c) $(PICFLAG) $(srcdir)/pex-unix.c -o pic/$@; \
++ 	else true; fi
++@@ -1143,6 +1146,15 @@ $(CONFIGURED_OFILES): stamp-picdir stamp
++ 	else true; fi
++ 	$(COMPILE.c) $(srcdir)/physmem.c $(OUTPUT_OPTION)
++ 
+++./prefix-map.$(objext): $(srcdir)/prefix-map.c config.h $(INCDIR)/prefix-map.h
+++	if [ x"$(PICFLAG)" != x ]; then \
+++	  $(COMPILE.c) $(PICFLAG) $(srcdir)/prefix-map.c -o pic/$@; \
+++	else true; fi
+++	if [ x"$(NOASANFLAG)" != x ]; then \
+++	  $(COMPILE.c) $(PICFLAG) $(NOASANFLAG) $(srcdir)/prefix-map.c -o noasan/$@; \
+++	else true; fi
+++	$(COMPILE.c) $(srcdir)/prefix-map.c $(OUTPUT_OPTION)
+++
++ ./putenv.$(objext): $(srcdir)/putenv.c config.h $(INCDIR)/ansidecl.h
++ 	if [ x"$(PICFLAG)" != x ]; then \
++ 	  $(COMPILE.c) $(PICFLAG) $(srcdir)/putenv.c -o pic/$@; \
++@@ -1210,7 +1222,8 @@ $(CONFIGURED_OFILES): stamp-picdir stamp
++ 	else true; fi
++ 	$(COMPILE.c) $(srcdir)/safe-ctype.c $(OUTPUT_OPTION)
++ 
++-./setenv.$(objext): $(srcdir)/setenv.c config.h $(INCDIR)/ansidecl.h
+++./setenv.$(objext): $(srcdir)/setenv.c config.h $(INCDIR)/ansidecl.h \
+++	$(INCDIR)/environ.h
++ 	if [ x"$(PICFLAG)" != x ]; then \
++ 	  $(COMPILE.c) $(PICFLAG) $(srcdir)/setenv.c -o pic/$@; \
++ 	else true; fi
++@@ -1661,7 +1674,7 @@ $(CONFIGURED_OFILES): stamp-picdir stamp
++ 	$(COMPILE.c) $(srcdir)/xexit.c $(OUTPUT_OPTION)
++ 
++ ./xmalloc.$(objext): $(srcdir)/xmalloc.c config.h $(INCDIR)/ansidecl.h \
++-	$(INCDIR)/libiberty.h
+++	$(INCDIR)/environ.h $(INCDIR)/libiberty.h
++ 	if [ x"$(PICFLAG)" != x ]; then \
++ 	  $(COMPILE.c) $(PICFLAG) $(srcdir)/xmalloc.c -o pic/$@; \
++ 	else true; fi
++@@ -1719,3 +1732,4 @@ $(CONFIGURED_OFILES): stamp-picdir stamp
++ 	  $(COMPILE.c) $(PICFLAG) $(NOASANFLAG) $(srcdir)/xvasprintf.c -o noasan/$@; \
++ 	else true; fi
++ 	$(COMPILE.c) $(srcdir)/xvasprintf.c $(OUTPUT_OPTION)
+++
++Index: b/src/libiberty/prefix-map.c
++===================================================================
++--- /dev/null
+++++ b/src/libiberty/prefix-map.c
++@@ -0,0 +1,215 @@
+++/* Definitions for manipulating filename prefixes.
+++
+++   Copyright (C) 2017 Free Software Foundation, Inc.
+++
+++   This program 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.
+++
+++   This program 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 this program; if not, write to the Free Software Foundation,
+++   Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
+++
+++#ifdef HAVE_CONFIG_H
+++#include "config.h"
+++#endif
+++
+++#ifdef HAVE_STRING_H
+++#include <string.h>
+++#endif
+++
+++#ifdef HAVE_STDLIB_H
+++#include <stdlib.h>
+++#endif
+++
+++#include "filenames.h"
+++#include "libiberty.h"
+++#include "prefix-map.h"
+++
+++
+++/* Add a new mapping.
+++
+++   The input strings are duplicated and a new prefix_map struct is allocated.
+++   Ownership of the duplicates, as well as the new prefix_map, is the same as
+++   the ownership of the old struct.
+++
+++   Returns 0 on failure and 1 on success.  */
+++int
+++prefix_map_push (struct prefix_map **map_head,
+++		 const char *new_prefix, const char *old_prefix)
+++{
+++  struct prefix_map *map = XNEW (struct prefix_map);
+++  if (!map)
+++    goto rewind_0;
+++
+++  map->old_prefix = xstrdup (old_prefix);
+++  if (!map->old_prefix)
+++    goto rewind_1;
+++  map->old_len = strlen (old_prefix);
+++
+++  map->new_prefix = xstrdup (new_prefix);
+++  if (!map->new_prefix)
+++    goto rewind_2;
+++  map->new_len = strlen (new_prefix);
+++
+++  map->next = *map_head;
+++  *map_head = map;
+++  return 1;
+++
+++rewind_2:
+++  free ((void *) map->old_prefix);
+++rewind_1:
+++  free (map);
+++rewind_0:
+++  return 0;
+++}
+++
+++/* Rewind a prefix map.
+++
+++   Everything up to the given OLD_HEAD is freed.  */
+++void
+++prefix_map_pop_until (struct prefix_map **map_head, struct prefix_map *old_head)
+++{
+++  struct prefix_map *map;
+++  struct prefix_map *next;
+++
+++  for (map = *map_head; map != old_head; map = next)
+++    {
+++      free ((void *) map->old_prefix);
+++      free ((void *) map->new_prefix);
+++      next = map->next;
+++      free (map);
+++    }
+++
+++  *map_head = map;
+++}
+++
+++
+++/* Find a mapping suitable for the given OLD_NAME in the linked list MAP.\
+++
+++   If a mapping is found, writes a pointer to the non-matching suffix part of
+++   OLD_NAME in SUFFIX, and its length in SUF_LEN.
+++
+++   Returns NULL if there was no suitable mapping.  */
+++struct prefix_map *
+++prefix_map_find (struct prefix_map *map, const char *old_name,
+++		 const char **suffix, size_t *suf_len)
+++{
+++  for (; map; map = map->next)
+++    if (filename_ncmp (old_name, map->old_prefix, map->old_len) == 0)
+++      {
+++	*suf_len = strlen (*suffix = old_name + map->old_len);
+++	break;
+++      }
+++
+++  return map;
+++}
+++
+++/* Prepend a prefix map before a given SUFFIX.
+++
+++   The remapped name is written to NEW_NAME and returned as a const pointer. No
+++   allocations are performed; the caller must ensure it can hold at least
+++   MAP->NEW_LEN + SUF_LEN + 1 characters.  */
+++const char *
+++prefix_map_prepend (struct prefix_map *map, char *new_name,
+++		    const char *suffix, size_t suf_len)
+++{
+++  memcpy (new_name, map->new_prefix, map->new_len);
+++  memcpy (new_name + map->new_len, suffix, suf_len + 1);
+++  return new_name;
+++}
+++
+++
+++/* Parse a single part of a single prefix-map pair.
+++
+++   Returns 0 on failure and 1 on success.  */
+++int
+++prefix_map_parse_unquote (char *src)
+++{
+++  for (char *dest = src; 0 != (*dest = *src); ++dest, ++src)
+++    switch (*src)
+++      {
+++      case ':':
+++      case '=':
+++	return 0; // should have been escaped
+++      case '%':
+++	switch (*(src + 1))
+++	  {
+++	  case '.':
+++	    *dest = ':';
+++	    goto unquoted;
+++	  case '+':
+++	    *dest = '=';
+++	  unquoted:
+++	  case '#':
+++	    ++src;
+++	    break;
+++	  default:
+++	    return 0; // invalid
+++	  }
+++      }
+++  return 1;
+++}
+++
+++/* Parse a single prefix-map.
+++
+++   Returns 0 on failure and 1 on success.  */
+++int
+++prefix_map_parse1 (struct prefix_map **map_head, char *arg)
+++{
+++  char *p;
+++  p = strchr (arg, '=');
+++  if (!p)
+++    return 0;
+++  *p = '\0';
+++  if (!prefix_map_parse_unquote (arg))
+++    return 0;
+++  p++;
+++  if (!prefix_map_parse_unquote (p))
+++    return 0;
+++
+++  return prefix_map_push (map_head, arg, p);
+++}
+++
+++/* Parse a prefix-map according to the BUILD_PATH_PREFIX_MAP standard.
+++
+++   The input string value is of the form
+++
+++     dst[0]=src[0]:dst[1]=src[1]...
+++
+++   Every dst[i] and src[i] has had "%", "=" and ":" characters replaced with
+++   "%#", "%+", and "%." respectively; this function reverses this replacement.
+++
+++   Rightmost entries are stored at the head of the parsed structure.
+++
+++   Returns 0 on failure and 1 on success.  */
+++int
+++prefix_map_parse (struct prefix_map **map_head, const char *arg)
+++{
+++  struct prefix_map *old_head = *map_head;
+++
+++  size_t len = strlen (arg);
+++  char *copy = (char *) alloca (len + 1);
+++  memcpy (copy, arg, len + 1);
+++
+++  const char *sep = ":";
+++  char *end, *tok = strtok_r (copy, sep, &end);
+++  while (tok != NULL)
+++    {
+++      if (!prefix_map_parse1 (map_head, tok))
+++	{
+++	  prefix_map_pop_until (map_head, old_head);
+++	  return 0;
+++	}
+++
+++      tok = strtok_r (NULL, sep, &end);
+++    }
+++
+++  return 1;
+++}
++Index: b/src/gcc/debug.h
++===================================================================
++--- a/src/gcc/debug.h
+++++ b/src/gcc/debug.h
++@@ -236,6 +236,7 @@ extern void dwarf2out_switch_text_sectio
++ 
++ const char *remap_debug_filename (const char *);
++ void add_debug_prefix_map (const char *);
+++void add_debug_prefix_map_from_envvar ();
++ 
++ /* For -fdump-go-spec.  */
++ 
++Index: b/src/gcc/final.c
++===================================================================
++--- a/src/gcc/final.c
+++++ b/src/gcc/final.c
++@@ -46,6 +46,7 @@ along with GCC; see the file COPYING3.
++ #define INCLUDE_ALGORITHM /* reverse */
++ #include "system.h"
++ #include "coretypes.h"
+++#include "prefix-map.h"
++ #include "backend.h"
++ #include "target.h"
++ #include "rtl.h"
++@@ -1506,22 +1507,9 @@ asm_str_count (const char *templ)
++   return count;
++ }
++ 

++-/* ??? 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.  */
++-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;
++-};
++-
++-/* Linked list of such structures.  */
++-static debug_prefix_map *debug_prefix_maps;
++ 
+++/* Linked list of `struct prefix_map'.  */
+++static prefix_map *debug_prefix_maps = NULL;
++ 
++ /* Record a debug file prefix mapping.  ARG is the argument to
++    -fdebug-prefix-map and must be of the form OLD=NEW.  */
++@@ -1529,7 +1517,7 @@ static debug_prefix_map *debug_prefix_ma
++ void
++ add_debug_prefix_map (const char *arg)
++ {
++-  debug_prefix_map *map;
+++  prefix_map *map;
++   const char *p;
++ 
++   p = strchr (arg, '=');
++@@ -1538,7 +1526,7 @@ add_debug_prefix_map (const char *arg)
++       error ("invalid argument %qs to -fdebug-prefix-map", arg);
++       return;
++     }
++-  map = XNEW (debug_prefix_map);
+++  map = XNEW (prefix_map);
++   map->old_prefix = xstrndup (arg, p - arg);
++   map->old_len = p - arg;
++   p++;
++@@ -1548,28 +1536,32 @@ add_debug_prefix_map (const char *arg)
++   debug_prefix_maps = map;
++ }
++ 
+++/* Add debug-prefix-maps from BUILD_PATH_PREFIX_MAP environment variable.  */
+++
+++void
+++add_debug_prefix_map_from_envvar ()
+++{
+++  const char *arg = getenv ("BUILD_PATH_PREFIX_MAP");
+++
+++  if (!arg || prefix_map_parse (&debug_prefix_maps, arg))
+++    return;
+++
+++  error ("environment variable BUILD_PATH_PREFIX_MAP is "
+++	 "not well formed; see the GCC documentation for more details.");
+++}
+++
++ /* 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 (filename_ncmp (filename, map->old_prefix, map->old_len) == 0)
++-      break;
++-  if (!map)
+++  const char *name = prefix_map_remap_alloca (debug_prefix_maps, filename);
+++
+++  if (name == filename)
++     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);
+++
+++  return ggc_strdup (name);
++ }
++ 

++ /* Return true if DWARF2 debug info can be emitted for DECL.  */
++Index: b/src/gcc/opts-global.c
++===================================================================
++--- a/src/gcc/opts-global.c
+++++ b/src/gcc/opts-global.c
++@@ -335,6 +335,8 @@ handle_common_deferred_options (void)
++   if (flag_opt_info)
++     opt_info_switch_p (NULL);
++ 
+++  add_debug_prefix_map_from_envvar ();
+++
++   FOR_EACH_VEC_ELT (v, i, opt)
++     {
++       switch (opt->opt_index)
++Index: b/src/gcc/testsuite/gcc.dg/debug/dwarf2/build_path_prefix_map-1.c
++===================================================================
++--- /dev/null
+++++ b/src/gcc/testsuite/gcc.dg/debug/dwarf2/build_path_prefix_map-1.c
++@@ -0,0 +1,9 @@
+++/* DW_AT_comp_dir should be relative if BUILD_PATH_PREFIX_MAP is a prefix of it.  */
+++/* { dg-do compile } */
+++/* { dg-options "-gdwarf -dA" } */
+++/* { dg-set-compiler-env-var BUILD_PATH_PREFIX_MAP "DWARF2TEST=[file dirname [pwd]]" } */
+++/* { dg-final { scan-assembler "DW_AT_comp_dir: \"DWARF2TEST/gcc" } } */
+++
+++void func (void)
+++{
+++}
++Index: b/src/gcc/testsuite/gcc.dg/debug/dwarf2/build_path_prefix_map-2.c
++===================================================================
++--- /dev/null
+++++ b/src/gcc/testsuite/gcc.dg/debug/dwarf2/build_path_prefix_map-2.c
++@@ -0,0 +1,8 @@
+++/* DW_AT_comp_dir should be absolute if BUILD_PATH_PREFIX_MAP is not set.  */
+++/* { dg-do compile } */
+++/* { dg-options "-gdwarf -dA" } */
+++/* { dg-final { scan-assembler "DW_AT_comp_dir: \"/" } } */
+++
+++void func (void)
+++{
+++}
+only in patch2:
+unchanged:
+--- gcc-6-6.3.0.orig/debian/patches/remap_whole_path_components.diff
++++ gcc-6-6.3.0/debian/patches/remap_whole_path_components.diff
+@@ -0,0 +1,72 @@
++Subject: [PATCH 3/3] When remapping paths, only match whole path components
++
++Change the remapping algorithm so that each old_prefix only matches paths that
++have old_prefix as a whole path component prefix.  (A whole path component is a
++part of a path that begins and ends at a directory separator or at either end
++of the path string.)
++
++This remapping algorithm is more predictable than the old algorithm, because
++there is no chance of mappings for one directory interfering with mappings for
++other directories.  It contains less corner cases and is therefore nicer for
++clients to use.  For these reasons, in our BUILD_PATH_PREFIX_MAP specification
++we recommend this algorithm, and it would be good for GCC to follow suit.
++
++This does technically break backwards compatibility but I don't think anyone
++would be reasonably depending on the corner cases of the previous algorithm,
++which are surprising and counterintuitive.
++
++Acknowledgements
++----------------
++
++Discussions with Michael Woerister and other members of the Rust compiler team
++on Github, and discussions with Daniel Shahaf on the rb-general@ mailing list
++on lists.reproducible-builds.org.
++
++ChangeLogs
++----------
++
++gcc/ChangeLog:
++
++2017-03-27  Ximin Luo  <infinity0 at pwned.gg>
++
++	* doc/invoke.texi (Environment Variables): Document form and behaviour
++	of BUILD_PATH_PREFIX_MAP.
++
++libiberty/ChangeLog:
++
++2017-03-27  Ximin Luo  <infinity0 at pwned.gg>
++
++	* prefix-map.c: When remapping paths, only match whole path components.
++
++Index: b/src/libiberty/prefix-map.c
++===================================================================
++--- a/src/libiberty/prefix-map.c
+++++ b/src/libiberty/prefix-map.c
++@@ -101,12 +101,22 @@ struct prefix_map *
++ prefix_map_find (struct prefix_map *map, const char *old_name,
++ 		 const char **suffix, size_t *suf_len)
++ {
+++  size_t len;
+++
++   for (; map; map = map->next)
++-    if (filename_ncmp (old_name, map->old_prefix, map->old_len) == 0)
++-      {
++-	*suf_len = strlen (*suffix = old_name + map->old_len);
++-	break;
++-      }
+++    {
+++      len = map->old_len;
+++      /* Ignore trailing path separators at the end of old_prefix */
+++      while (len > 0 && IS_DIR_SEPARATOR (map->old_prefix[len-1])) len--;
+++      /* Check if old_name matches old_prefix at a path component boundary */
+++      if (! filename_ncmp (old_name, map->old_prefix, len)
+++	  && (IS_DIR_SEPARATOR (old_name[len])
+++	      || old_name[len] == '\0'))
+++	{
+++	  *suf_len = strlen (*suffix = old_name + len);
+++	  break;
+++	}
+++    }
++ 
++   return map;
++ }

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/reproducible/debrepatch.git



More information about the Reproducible-commits mailing list