mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 21:21:41 +00:00
genksyms: Ignore module scoped _Static_assert()
The C11 _Static_assert() keyword may be used at module scope, and we need to teach genksyms about it to not abort with an error. We currently have a growing number of static_assert() (but also direct usage of _Static_assert()) users at module scope: git grep -E '^_Static_assert\(|^static_assert\(' | grep -v '^tools' | wc -l 135 More recently, when enabling CONFIG_MODVERSIONS with CONFIG_KCSAN, we observe a number of warnings: WARNING: modpost: EXPORT symbol "<..all kcsan symbols..>" [vmlinux] [...] When running a preprocessed source through 'genksyms -w' a number of syntax errors point at usage of static_assert()s. In the case of kernel/kcsan/encoding.h, new static_assert()s had been introduced which used expressions that appear to cause genksyms to not even be able to recover from the syntax error gracefully (as it appears was the case previously). Therefore, make genksyms ignore all _Static_assert() and the contained expression. With the fix, usage of _Static_assert() no longer cause "syntax error" all over the kernel, and the above modpost warnings for KCSAN are gone, too. Signed-off-by: Marco Elver <elver@google.com> Acked-by: Nick Desaulniers <ndesaulniers@google.com> Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
This commit is contained in:
parent
b9ed847b5a
commit
9ab55d7f24
@ -32,6 +32,9 @@ static struct resword {
|
|||||||
{ "restrict", RESTRICT_KEYW },
|
{ "restrict", RESTRICT_KEYW },
|
||||||
{ "asm", ASM_KEYW },
|
{ "asm", ASM_KEYW },
|
||||||
|
|
||||||
|
// c11 keywords that can be used at module scope
|
||||||
|
{ "_Static_assert", STATIC_ASSERT_KEYW },
|
||||||
|
|
||||||
// attribute commented out in modutils 2.4.2. People are using 'attribute' as a
|
// attribute commented out in modutils 2.4.2. People are using 'attribute' as a
|
||||||
// field name which breaks the genksyms parser. It is not a gcc keyword anyway.
|
// field name which breaks the genksyms parser. It is not a gcc keyword anyway.
|
||||||
// KAO. },
|
// KAO. },
|
||||||
|
@ -118,7 +118,7 @@ yylex(void)
|
|||||||
{
|
{
|
||||||
static enum {
|
static enum {
|
||||||
ST_NOTSTARTED, ST_NORMAL, ST_ATTRIBUTE, ST_ASM, ST_TYPEOF, ST_TYPEOF_1,
|
ST_NOTSTARTED, ST_NORMAL, ST_ATTRIBUTE, ST_ASM, ST_TYPEOF, ST_TYPEOF_1,
|
||||||
ST_BRACKET, ST_BRACE, ST_EXPRESSION,
|
ST_BRACKET, ST_BRACE, ST_EXPRESSION, ST_STATIC_ASSERT,
|
||||||
ST_TABLE_1, ST_TABLE_2, ST_TABLE_3, ST_TABLE_4,
|
ST_TABLE_1, ST_TABLE_2, ST_TABLE_3, ST_TABLE_4,
|
||||||
ST_TABLE_5, ST_TABLE_6
|
ST_TABLE_5, ST_TABLE_6
|
||||||
} lexstate = ST_NOTSTARTED;
|
} lexstate = ST_NOTSTARTED;
|
||||||
@ -201,6 +201,11 @@ repeat:
|
|||||||
|
|
||||||
case EXPORT_SYMBOL_KEYW:
|
case EXPORT_SYMBOL_KEYW:
|
||||||
goto fini;
|
goto fini;
|
||||||
|
|
||||||
|
case STATIC_ASSERT_KEYW:
|
||||||
|
lexstate = ST_STATIC_ASSERT;
|
||||||
|
count = 0;
|
||||||
|
goto repeat;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!suppress_type_lookup)
|
if (!suppress_type_lookup)
|
||||||
@ -401,6 +406,26 @@ repeat:
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ST_STATIC_ASSERT:
|
||||||
|
APP;
|
||||||
|
switch (token)
|
||||||
|
{
|
||||||
|
case '(':
|
||||||
|
++count;
|
||||||
|
goto repeat;
|
||||||
|
case ')':
|
||||||
|
if (--count == 0)
|
||||||
|
{
|
||||||
|
lexstate = ST_NORMAL;
|
||||||
|
token = STATIC_ASSERT_PHRASE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
goto repeat;
|
||||||
|
default:
|
||||||
|
goto repeat;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case ST_TABLE_1:
|
case ST_TABLE_1:
|
||||||
goto repeat;
|
goto repeat;
|
||||||
|
|
||||||
|
@ -80,6 +80,7 @@ static void record_compound(struct string_list **keyw,
|
|||||||
%token SHORT_KEYW
|
%token SHORT_KEYW
|
||||||
%token SIGNED_KEYW
|
%token SIGNED_KEYW
|
||||||
%token STATIC_KEYW
|
%token STATIC_KEYW
|
||||||
|
%token STATIC_ASSERT_KEYW
|
||||||
%token STRUCT_KEYW
|
%token STRUCT_KEYW
|
||||||
%token TYPEDEF_KEYW
|
%token TYPEDEF_KEYW
|
||||||
%token UNION_KEYW
|
%token UNION_KEYW
|
||||||
@ -97,6 +98,7 @@ static void record_compound(struct string_list **keyw,
|
|||||||
%token BRACE_PHRASE
|
%token BRACE_PHRASE
|
||||||
%token BRACKET_PHRASE
|
%token BRACKET_PHRASE
|
||||||
%token EXPRESSION_PHRASE
|
%token EXPRESSION_PHRASE
|
||||||
|
%token STATIC_ASSERT_PHRASE
|
||||||
|
|
||||||
%token CHAR
|
%token CHAR
|
||||||
%token DOTS
|
%token DOTS
|
||||||
@ -130,6 +132,7 @@ declaration1:
|
|||||||
| function_definition
|
| function_definition
|
||||||
| asm_definition
|
| asm_definition
|
||||||
| export_definition
|
| export_definition
|
||||||
|
| static_assert
|
||||||
| error ';' { $$ = $2; }
|
| error ';' { $$ = $2; }
|
||||||
| error '}' { $$ = $2; }
|
| error '}' { $$ = $2; }
|
||||||
;
|
;
|
||||||
@ -493,6 +496,10 @@ export_definition:
|
|||||||
{ export_symbol((*$3)->string); $$ = $5; }
|
{ export_symbol((*$3)->string); $$ = $5; }
|
||||||
;
|
;
|
||||||
|
|
||||||
|
/* Ignore any module scoped _Static_assert(...) */
|
||||||
|
static_assert:
|
||||||
|
STATIC_ASSERT_PHRASE ';' { $$ = $2; }
|
||||||
|
;
|
||||||
|
|
||||||
%%
|
%%
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user