gcc: Resolve relative prefix-map filenames

Add a patch to gcc so that relative paths are handled by -fdebug-prefix-map
and friends. In OE we use relative paths in autotools and removing that
creates a lot of issues we'd have to fix. This alternative allows us to
fix the paths within gcc and improve our debug file coverage (and SPDX
manifests) accordingly.

(From OE-Core rev: 591cbe7140f01470b5799bc51e5b23f58bf95ffa)

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Richard Purdie
2022-08-12 17:17:20 +01:00
parent abbbc87129
commit abd30f85c6
2 changed files with 63 additions and 0 deletions

View File

@@ -65,6 +65,7 @@ SRC_URI = "${BASEURI} \
file://0025-Move-sched.h-include-ahead-of-user-headers.patch \
file://0026-rust-recursion-limit.patch \
file://0001-libsanitizer-cherry-pick-9cf13067cb5088626ba7-from-u.patch \
file://prefix-map-realpath.patch \
"
SRC_URI[sha256sum] = "62fd634889f31c02b64af2c468f064b47ad1ca78411c45abe6ac4b5f8dd19c7b"

View File

@@ -0,0 +1,62 @@
Relative paths don't work with -fdebug-prefix-map and friends. This
can lead to paths which the user wanted to be remapped being missed.
Setting -fdebug-prefix-map to work with a relative path isn't practical
either.
Instead, call gcc's realpath function on the incomming path name before
comparing it with the remapping. This means other issues like symlinks
are also accounted for and leads to a more consistent remapping experience.
Upstream-Status: Pending [need to see if gcc developers would accept this]
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Index: gcc-12.1.0/gcc/file-prefix-map.cc
===================================================================
--- gcc-12.1.0.orig/gcc/file-prefix-map.cc
+++ gcc-12.1.0/gcc/file-prefix-map.cc
@@ -70,19 +70,28 @@ remap_filename (file_prefix_map *maps, c
file_prefix_map *map;
char *s;
const char *name;
+ char *realname;
size_t name_len;
+ if (lbasename (filename) == filename)
+ return filename;
+
+ realname = lrealpath (filename);
+
for (map = maps; map; map = map->next)
- if (filename_ncmp (filename, map->old_prefix, map->old_len) == 0)
+ if (filename_ncmp (realname, map->old_prefix, map->old_len) == 0)
break;
- if (!map)
+ if (!map) {
+ free (realname);
return filename;
- name = filename + map->old_len;
+ }
+ name = realname + map->old_len;
name_len = strlen (name) + 1;
s = (char *) ggc_alloc_atomic (name_len + map->new_len);
memcpy (s, map->new_prefix, map->new_len);
memcpy (s + map->new_len, name, name_len);
+ free (realname);
return s;
}
Index: gcc-12.1.0/libcpp/macro.cc
===================================================================
--- gcc-12.1.0.orig/libcpp/macro.cc
+++ gcc-12.1.0/libcpp/macro.cc
@@ -563,7 +563,7 @@ _cpp_builtin_macro_text (cpp_reader *pfi
if (!name)
abort ();
}
- if (pfile->cb.remap_filename)
+ if (pfile->cb.remap_filename && !pfile->state.in_directive)
name = pfile->cb.remap_filename (name);
len = strlen (name);
buf = _cpp_unaligned_alloc (pfile, len * 2 + 3);