diff options
author | Xi Ruoyao <xry111@mengyan1223.wang> | 2021-06-28 13:54:58 +0800 |
---|---|---|
committer | Xi Ruoyao <xry111@mengyan1223.wang> | 2021-06-30 10:43:20 +0800 |
commit | 6bf383c37e6131a8e247e8a0997d55d65c830b6d (patch) | |
tree | 490acc40b9a3bddc68906ea347bff939b3798e3c /fixincludes | |
parent | ed392e9db434898eccec81edd85323d21d555fe9 (diff) | |
download | gcc-6bf383c37e6131a8e247e8a0997d55d65c830b6d.tar.gz |
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.
Diffstat (limited to 'fixincludes')
-rw-r--r-- | fixincludes/fixfixes.c | 45 | ||||
-rw-r--r-- | fixincludes/inclhack.def | 3 | ||||
-rw-r--r-- | 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 3a4cfe06542..4db311713ef 100644 --- a/fixincludes/inclhack.def +++ b/fixincludes/inclhack.def @@ -3151,7 +3151,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 */ |