kumquat-buildroot/package/gcc/11.4.0/0005-fixinc-don-t-fix-machine-names-in-__has_include-.-PR.patch

125 lines
4.4 KiB
Diff
Raw Normal View History

From 3e878f9d1c473f91a1377193d4d8d2616357bed1 Mon Sep 17 00:00:00 2001
package/gcc: add patch to fix glibc header conflict This commit backports the patch "fixinc: don't "fix" machine names in __has_include(...)" from upstream GCC, which is needed to resolve a header conflict between glibc headers and kernel headers, which has appeared since we bumped glibc to version 2.36 in commit 80c8c15c8534a24382b900a07082a289a368f736. The problem comes from the "fixinc" logic used by gcc to fixup some headers files, generated inside an include-fixed/ folder. This logic ended up replacing "linux/mount.h" by "__linux__/mount.h" in __has_include() invocation, like this: #ifdef __has_include # if __has_include ("__linux__/mount.h") # include "linux/mount.h" # endif #endif in build/host-gcc-final-11.3.0/build/gcc/include-fixed/sys/mount.h. With this fix in place, this "include-fixed" header is no longer generated, avoiding the problem. This issue was visible in two different ways in glibc configurations: - As a build failure during the gcc build itself, for architectures that support libsanitizer, as libsanitizer includes mount.h, and would therefore encounter the header conflict. - As a build failure during another user-space package (such as sysvinit for example), on architectures when libsanitizer isn't used, and therefore for which the gcc build was successful, but the header conflict shows up when building some "random" user-space package. The problem is already fixed in GCC 12.2.0, so no patch is required. The problem did not exist back in GCC 8.4.0, so this version does not need patching. Consequently, the patch is only needed for GCC 10.4.0, GCC 11.3.0 and the special ARC 2020.09-release version. Fixes: (gcc build issue, on architecture that supports libsanitizer) http://autobuild.buildroot.net/results/90fe4c3b8b72a2c28555674383de9bbd9e8ae09a/ (sysvinit build issue, on architecture that does not support libsanitizer) http://autobuild.buildroot.net/results/d7bf5795b7621a92be32f18794e3e67944fb96db/ (crun) http://autobuild.buildroot.net/results/e3e8da4f797dced48aedf8c636db983d36849850/ (libarchive) http://autobuild.buildroot.net/results/9fcbf0c036a97b2e9a4fcc6e173bcfa09e1b3dac/ Thanks a lot to Peter Seiderer for pointing the relevant GCC commit. Fixes: https://bugs.busybox.net/show_bug.cgi?id=15021 Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com> Reviewed-by: Romain Naour <romain.naour@smile.fr> Acked-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
2022-10-25 22:13:59 +02:00
From: Xi Ruoyao <xry111@mengyan1223.wang>
Date: Mon, 28 Jun 2021 13:54:58 +0800
Subject: [PATCH] fixinc: don't "fix" machine names in __has_include(...)
[PR91085]
fixincludes/
PR other/91085
* fixfixes.c (check_has_inc): New static function.
(machine_name_fix): Don't replace header names in
__has_include(...).
* inclhack.def (machine_name): Adjust test.
* tests/base/testing.h: Update.
Upstream: 6bf383c37e6131a8e247e8a0997d55d65c830b6d
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
---
fixincludes/fixfixes.c | 45 ++++++++++++++++++++++++++++++--
fixincludes/inclhack.def | 3 ++-
fixincludes/tests/base/testing.h | 2 +-
3 files changed, 46 insertions(+), 4 deletions(-)
diff --git a/fixincludes/fixfixes.c b/fixincludes/fixfixes.c
index 5b23a8b640d..404b420f302 100644
--- a/fixincludes/fixfixes.c
+++ b/fixincludes/fixfixes.c
@@ -477,6 +477,39 @@ FIX_PROC_HEAD( char_macro_def_fix )
fputs (text, stdout);
}
+/* Check if the pattern at pos is actually in a "__has_include(...)"
+ directive. Return the pointer to the ')' of this
+ "__has_include(...)" if it is, NULL otherwise. */
+static const char *
+check_has_inc (const char *begin, const char *pos, const char *end)
+{
+ static const char has_inc[] = "__has_include";
+ const size_t has_inc_len = sizeof (has_inc) - 1;
+ const char *p;
+
+ for (p = memmem (begin, pos - begin, has_inc, has_inc_len);
+ p != NULL;
+ p = memmem (p, pos - p, has_inc, has_inc_len))
+ {
+ p += has_inc_len;
+ while (p < end && ISSPACE (*p))
+ p++;
+
+ /* "__has_include" may appear as "defined(__has_include)",
+ search for the next appearance then. */
+ if (*p != '(')
+ continue;
+
+ /* To avoid too much complexity, just hope there is never a
+ ')' in a header name. */
+ p = memchr (p, ')', end - p);
+ if (p == NULL || p > pos)
+ return p;
+ }
+
+ return NULL;
+}
+
/* Fix for machine name #ifdefs that are not in the namespace reserved
by the C standard. They won't be defined if compiling with -ansi,
and the headers will break. We go to some trouble to only change
@@ -524,7 +557,7 @@ FIX_PROC_HEAD( machine_name_fix )
/* If the 'name_pat' matches in between base and limit, we have
a bogon. It is not worth the hassle of excluding comments
because comments on #if/#ifdef lines are rare, and strings on
- such lines are illegal.
+ such lines are only legal in a "__has_include" directive.
REG_NOTBOL means 'base' is not at the beginning of a line, which
shouldn't matter since the name_re has no ^ anchor, but let's
@@ -544,8 +577,16 @@ FIX_PROC_HEAD( machine_name_fix )
break;
p = base + match[0].rm_so;
- base += match[0].rm_eo;
+ /* Check if the match is in __has_include(...) (PR 91085). */
+ q = check_has_inc (base, p, limit);
+ if (q)
+ {
+ base = q + 1;
+ goto again;
+ }
+
+ base += match[0].rm_eo;
/* One more test: if on the same line we have the same string
with the appropriate underscores, then leave it alone.
We want exactly two leading and trailing underscores. */
diff --git a/fixincludes/inclhack.def b/fixincludes/inclhack.def
index c2f54d1189a..b2841d384f3 100644
package/gcc: add patch to fix glibc header conflict This commit backports the patch "fixinc: don't "fix" machine names in __has_include(...)" from upstream GCC, which is needed to resolve a header conflict between glibc headers and kernel headers, which has appeared since we bumped glibc to version 2.36 in commit 80c8c15c8534a24382b900a07082a289a368f736. The problem comes from the "fixinc" logic used by gcc to fixup some headers files, generated inside an include-fixed/ folder. This logic ended up replacing "linux/mount.h" by "__linux__/mount.h" in __has_include() invocation, like this: #ifdef __has_include # if __has_include ("__linux__/mount.h") # include "linux/mount.h" # endif #endif in build/host-gcc-final-11.3.0/build/gcc/include-fixed/sys/mount.h. With this fix in place, this "include-fixed" header is no longer generated, avoiding the problem. This issue was visible in two different ways in glibc configurations: - As a build failure during the gcc build itself, for architectures that support libsanitizer, as libsanitizer includes mount.h, and would therefore encounter the header conflict. - As a build failure during another user-space package (such as sysvinit for example), on architectures when libsanitizer isn't used, and therefore for which the gcc build was successful, but the header conflict shows up when building some "random" user-space package. The problem is already fixed in GCC 12.2.0, so no patch is required. The problem did not exist back in GCC 8.4.0, so this version does not need patching. Consequently, the patch is only needed for GCC 10.4.0, GCC 11.3.0 and the special ARC 2020.09-release version. Fixes: (gcc build issue, on architecture that supports libsanitizer) http://autobuild.buildroot.net/results/90fe4c3b8b72a2c28555674383de9bbd9e8ae09a/ (sysvinit build issue, on architecture that does not support libsanitizer) http://autobuild.buildroot.net/results/d7bf5795b7621a92be32f18794e3e67944fb96db/ (crun) http://autobuild.buildroot.net/results/e3e8da4f797dced48aedf8c636db983d36849850/ (libarchive) http://autobuild.buildroot.net/results/9fcbf0c036a97b2e9a4fcc6e173bcfa09e1b3dac/ Thanks a lot to Peter Seiderer for pointing the relevant GCC commit. Fixes: https://bugs.busybox.net/show_bug.cgi?id=15021 Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com> Reviewed-by: Romain Naour <romain.naour@smile.fr> Acked-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
2022-10-25 22:13:59 +02:00
--- a/fixincludes/inclhack.def
+++ b/fixincludes/inclhack.def
@@ -3201,7 +3201,8 @@ fix = {
package/gcc: add patch to fix glibc header conflict This commit backports the patch "fixinc: don't "fix" machine names in __has_include(...)" from upstream GCC, which is needed to resolve a header conflict between glibc headers and kernel headers, which has appeared since we bumped glibc to version 2.36 in commit 80c8c15c8534a24382b900a07082a289a368f736. The problem comes from the "fixinc" logic used by gcc to fixup some headers files, generated inside an include-fixed/ folder. This logic ended up replacing "linux/mount.h" by "__linux__/mount.h" in __has_include() invocation, like this: #ifdef __has_include # if __has_include ("__linux__/mount.h") # include "linux/mount.h" # endif #endif in build/host-gcc-final-11.3.0/build/gcc/include-fixed/sys/mount.h. With this fix in place, this "include-fixed" header is no longer generated, avoiding the problem. This issue was visible in two different ways in glibc configurations: - As a build failure during the gcc build itself, for architectures that support libsanitizer, as libsanitizer includes mount.h, and would therefore encounter the header conflict. - As a build failure during another user-space package (such as sysvinit for example), on architectures when libsanitizer isn't used, and therefore for which the gcc build was successful, but the header conflict shows up when building some "random" user-space package. The problem is already fixed in GCC 12.2.0, so no patch is required. The problem did not exist back in GCC 8.4.0, so this version does not need patching. Consequently, the patch is only needed for GCC 10.4.0, GCC 11.3.0 and the special ARC 2020.09-release version. Fixes: (gcc build issue, on architecture that supports libsanitizer) http://autobuild.buildroot.net/results/90fe4c3b8b72a2c28555674383de9bbd9e8ae09a/ (sysvinit build issue, on architecture that does not support libsanitizer) http://autobuild.buildroot.net/results/d7bf5795b7621a92be32f18794e3e67944fb96db/ (crun) http://autobuild.buildroot.net/results/e3e8da4f797dced48aedf8c636db983d36849850/ (libarchive) http://autobuild.buildroot.net/results/9fcbf0c036a97b2e9a4fcc6e173bcfa09e1b3dac/ Thanks a lot to Peter Seiderer for pointing the relevant GCC commit. Fixes: https://bugs.busybox.net/show_bug.cgi?id=15021 Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com> Reviewed-by: Romain Naour <romain.naour@smile.fr> Acked-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
2022-10-25 22:13:59 +02:00
c_fix = machine_name;
test_text = "/* MACH_DIFF: */\n"
- "#if defined( i386 ) || defined( sparc ) || defined( vax )"
+ "#if defined( i386 ) || defined( sparc ) || defined( vax ) || "
+ "defined( linux ) || __has_include ( <linux.h> )"
"\n/* no uniform test, so be careful :-) */";
};
diff --git a/fixincludes/tests/base/testing.h b/fixincludes/tests/base/testing.h
index cf95321fb86..8b3accaf04e 100644
--- a/fixincludes/tests/base/testing.h
+++ b/fixincludes/tests/base/testing.h
@@ -64,7 +64,7 @@ BSD43__IOWR('T', 1) /* Some are multi-line */
#if defined( MACHINE_NAME_CHECK )
/* MACH_DIFF: */
-#if defined( i386 ) || defined( sparc ) || defined( vax )
+#if defined( i386 ) || defined( sparc ) || defined( vax ) || defined( linux ) || __has_include ( <linux.h> )
/* no uniform test, so be careful :-) */
#endif /* MACHINE_NAME_CHECK */
--
2.34.3
package/gcc: add patch to fix glibc header conflict This commit backports the patch "fixinc: don't "fix" machine names in __has_include(...)" from upstream GCC, which is needed to resolve a header conflict between glibc headers and kernel headers, which has appeared since we bumped glibc to version 2.36 in commit 80c8c15c8534a24382b900a07082a289a368f736. The problem comes from the "fixinc" logic used by gcc to fixup some headers files, generated inside an include-fixed/ folder. This logic ended up replacing "linux/mount.h" by "__linux__/mount.h" in __has_include() invocation, like this: #ifdef __has_include # if __has_include ("__linux__/mount.h") # include "linux/mount.h" # endif #endif in build/host-gcc-final-11.3.0/build/gcc/include-fixed/sys/mount.h. With this fix in place, this "include-fixed" header is no longer generated, avoiding the problem. This issue was visible in two different ways in glibc configurations: - As a build failure during the gcc build itself, for architectures that support libsanitizer, as libsanitizer includes mount.h, and would therefore encounter the header conflict. - As a build failure during another user-space package (such as sysvinit for example), on architectures when libsanitizer isn't used, and therefore for which the gcc build was successful, but the header conflict shows up when building some "random" user-space package. The problem is already fixed in GCC 12.2.0, so no patch is required. The problem did not exist back in GCC 8.4.0, so this version does not need patching. Consequently, the patch is only needed for GCC 10.4.0, GCC 11.3.0 and the special ARC 2020.09-release version. Fixes: (gcc build issue, on architecture that supports libsanitizer) http://autobuild.buildroot.net/results/90fe4c3b8b72a2c28555674383de9bbd9e8ae09a/ (sysvinit build issue, on architecture that does not support libsanitizer) http://autobuild.buildroot.net/results/d7bf5795b7621a92be32f18794e3e67944fb96db/ (crun) http://autobuild.buildroot.net/results/e3e8da4f797dced48aedf8c636db983d36849850/ (libarchive) http://autobuild.buildroot.net/results/9fcbf0c036a97b2e9a4fcc6e173bcfa09e1b3dac/ Thanks a lot to Peter Seiderer for pointing the relevant GCC commit. Fixes: https://bugs.busybox.net/show_bug.cgi?id=15021 Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com> Reviewed-by: Romain Naour <romain.naour@smile.fr> Acked-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
2022-10-25 22:13:59 +02:00