| From 3e878f9d1c473f91a1377193d4d8d2616357bed1 Mon Sep 17 00:00:00 2001 |
| 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 |
| --- a/fixincludes/inclhack.def |
| +++ b/fixincludes/inclhack.def |
| @@ -3201,7 +3201,8 @@ fix = { |
| 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 |
| |