Remove gperf usage from toolchain
It turns out that gperf-3.1 changed types in the generated code in ways that aren't even trivially detectable without having to generate a test-file. It's just not worth using tools and libraries from clowns that don't understand or care about compatibility. So get rid of gperf. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
@@ -9,6 +9,6 @@ HOSTCFLAGS_parse.tab.o := -I$(src)
|
||||
HOSTCFLAGS_lex.lex.o := -I$(src)
|
||||
|
||||
# dependencies on generated files need to be listed explicitly
|
||||
$(obj)/lex.lex.o: $(obj)/keywords.hash.c $(obj)/parse.tab.h
|
||||
$(obj)/lex.lex.o: $(obj)/parse.tab.h
|
||||
|
||||
clean-files := keywords.hash.c lex.lex.c parse.tab.c parse.tab.h
|
||||
clean-files := lex.lex.c parse.tab.c parse.tab.h
|
||||
|
74
scripts/genksyms/keywords.c
Normal file
74
scripts/genksyms/keywords.c
Normal file
@@ -0,0 +1,74 @@
|
||||
static struct resword {
|
||||
const char *name;
|
||||
int token;
|
||||
} keywords[] = {
|
||||
{ "EXPORT_SYMBOL", EXPORT_SYMBOL_KEYW },
|
||||
{ "EXPORT_SYMBOL_GPL", EXPORT_SYMBOL_KEYW },
|
||||
{ "EXPORT_SYMBOL_GPL_FUTURE", EXPORT_SYMBOL_KEYW },
|
||||
{ "EXPORT_UNUSED_SYMBOL", EXPORT_SYMBOL_KEYW },
|
||||
{ "EXPORT_UNUSED_SYMBOL_GPL", EXPORT_SYMBOL_KEYW },
|
||||
{ "__asm", ASM_KEYW },
|
||||
{ "__asm__", ASM_KEYW },
|
||||
{ "__attribute", ATTRIBUTE_KEYW },
|
||||
{ "__attribute__", ATTRIBUTE_KEYW },
|
||||
{ "__const", CONST_KEYW },
|
||||
{ "__const__", CONST_KEYW },
|
||||
{ "__extension__", EXTENSION_KEYW },
|
||||
{ "__inline", INLINE_KEYW },
|
||||
{ "__inline__", INLINE_KEYW },
|
||||
{ "__signed", SIGNED_KEYW },
|
||||
{ "__signed__", SIGNED_KEYW },
|
||||
{ "__typeof", TYPEOF_KEYW },
|
||||
{ "__typeof__", TYPEOF_KEYW },
|
||||
{ "__volatile", VOLATILE_KEYW },
|
||||
{ "__volatile__", VOLATILE_KEYW },
|
||||
{ "__builtin_va_list", VA_LIST_KEYW },
|
||||
|
||||
// According to rth, c99 defines "_Bool", __restrict", __restrict__", "restrict". KAO
|
||||
{ "_Bool", BOOL_KEYW },
|
||||
{ "_restrict", RESTRICT_KEYW },
|
||||
{ "__restrict__", RESTRICT_KEYW },
|
||||
{ "restrict", RESTRICT_KEYW },
|
||||
{ "asm", ASM_KEYW },
|
||||
|
||||
// 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.
|
||||
// KAO. },
|
||||
// { "attribute", ATTRIBUTE_KEYW },
|
||||
|
||||
{ "auto", AUTO_KEYW },
|
||||
{ "char", CHAR_KEYW },
|
||||
{ "const", CONST_KEYW },
|
||||
{ "double", DOUBLE_KEYW },
|
||||
{ "enum", ENUM_KEYW },
|
||||
{ "extern", EXTERN_KEYW },
|
||||
{ "float", FLOAT_KEYW },
|
||||
{ "inline", INLINE_KEYW },
|
||||
{ "int", INT_KEYW },
|
||||
{ "long", LONG_KEYW },
|
||||
{ "register", REGISTER_KEYW },
|
||||
{ "short", SHORT_KEYW },
|
||||
{ "signed", SIGNED_KEYW },
|
||||
{ "static", STATIC_KEYW },
|
||||
{ "struct", STRUCT_KEYW },
|
||||
{ "typedef", TYPEDEF_KEYW },
|
||||
{ "typeof", TYPEOF_KEYW },
|
||||
{ "union", UNION_KEYW },
|
||||
{ "unsigned", UNSIGNED_KEYW },
|
||||
{ "void", VOID_KEYW },
|
||||
{ "volatile", VOLATILE_KEYW },
|
||||
};
|
||||
|
||||
#define NR_KEYWORDS (sizeof(keywords)/sizeof(struct resword))
|
||||
|
||||
static int is_reserved_word(register const char *str, register unsigned int len)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < NR_KEYWORDS; i++) {
|
||||
struct resword *r = keywords + i;
|
||||
int l = strlen(r->name);
|
||||
if (len == l && !memcmp(str, r->name, len))
|
||||
return r->token;
|
||||
}
|
||||
return -1;
|
||||
}
|
@@ -1,61 +0,0 @@
|
||||
%language=ANSI-C
|
||||
%define hash-function-name is_reserved_hash
|
||||
%define lookup-function-name is_reserved_word
|
||||
%{
|
||||
struct resword;
|
||||
static const struct resword *is_reserved_word(register const char *str, register unsigned int len);
|
||||
%}
|
||||
struct resword { const char *name; int token; }
|
||||
%%
|
||||
EXPORT_SYMBOL, EXPORT_SYMBOL_KEYW
|
||||
EXPORT_SYMBOL_GPL, EXPORT_SYMBOL_KEYW
|
||||
EXPORT_SYMBOL_GPL_FUTURE, EXPORT_SYMBOL_KEYW
|
||||
EXPORT_UNUSED_SYMBOL, EXPORT_SYMBOL_KEYW
|
||||
EXPORT_UNUSED_SYMBOL_GPL, EXPORT_SYMBOL_KEYW
|
||||
__asm, ASM_KEYW
|
||||
__asm__, ASM_KEYW
|
||||
__attribute, ATTRIBUTE_KEYW
|
||||
__attribute__, ATTRIBUTE_KEYW
|
||||
__const, CONST_KEYW
|
||||
__const__, CONST_KEYW
|
||||
__extension__, EXTENSION_KEYW
|
||||
__inline, INLINE_KEYW
|
||||
__inline__, INLINE_KEYW
|
||||
__signed, SIGNED_KEYW
|
||||
__signed__, SIGNED_KEYW
|
||||
__typeof, TYPEOF_KEYW
|
||||
__typeof__, TYPEOF_KEYW
|
||||
__volatile, VOLATILE_KEYW
|
||||
__volatile__, VOLATILE_KEYW
|
||||
__builtin_va_list, VA_LIST_KEYW
|
||||
# According to rth, c99 defines _Bool, __restrict, __restrict__, restrict. KAO
|
||||
_Bool, BOOL_KEYW
|
||||
_restrict, RESTRICT_KEYW
|
||||
__restrict__, RESTRICT_KEYW
|
||||
restrict, RESTRICT_KEYW
|
||||
asm, ASM_KEYW
|
||||
# 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.
|
||||
# KAO.
|
||||
# attribute, ATTRIBUTE_KEYW
|
||||
auto, AUTO_KEYW
|
||||
char, CHAR_KEYW
|
||||
const, CONST_KEYW
|
||||
double, DOUBLE_KEYW
|
||||
enum, ENUM_KEYW
|
||||
extern, EXTERN_KEYW
|
||||
float, FLOAT_KEYW
|
||||
inline, INLINE_KEYW
|
||||
int, INT_KEYW
|
||||
long, LONG_KEYW
|
||||
register, REGISTER_KEYW
|
||||
short, SHORT_KEYW
|
||||
signed, SIGNED_KEYW
|
||||
static, STATIC_KEYW
|
||||
struct, STRUCT_KEYW
|
||||
typedef, TYPEDEF_KEYW
|
||||
typeof, TYPEOF_KEYW
|
||||
union, UNION_KEYW
|
||||
unsigned, UNSIGNED_KEYW
|
||||
void, VOID_KEYW
|
||||
volatile, VOLATILE_KEYW
|
@@ -1,230 +0,0 @@
|
||||
/* ANSI-C code produced by gperf version 3.0.4 */
|
||||
/* Command-line: gperf -t --output-file scripts/genksyms/keywords.hash.c_shipped -a -C -E -g -k '1,3,$' -p -t scripts/genksyms/keywords.gperf */
|
||||
|
||||
#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
|
||||
&& ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
|
||||
&& (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
|
||||
&& ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
|
||||
&& ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
|
||||
&& ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
|
||||
&& ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
|
||||
&& ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
|
||||
&& ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
|
||||
&& ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
|
||||
&& ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
|
||||
&& ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
|
||||
&& ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
|
||||
&& ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
|
||||
&& ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
|
||||
&& ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
|
||||
&& ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
|
||||
&& ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
|
||||
&& ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
|
||||
&& ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
|
||||
&& ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
|
||||
&& ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
|
||||
&& ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
|
||||
/* The character set is not based on ISO-646. */
|
||||
#error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
|
||||
#endif
|
||||
|
||||
#line 4 "scripts/genksyms/keywords.gperf"
|
||||
|
||||
struct resword;
|
||||
static const struct resword *is_reserved_word(register const char *str, register unsigned int len);
|
||||
#line 8 "scripts/genksyms/keywords.gperf"
|
||||
struct resword { const char *name; int token; };
|
||||
/* maximum key range = 98, duplicates = 0 */
|
||||
|
||||
#ifdef __GNUC__
|
||||
__inline
|
||||
#else
|
||||
#ifdef __cplusplus
|
||||
inline
|
||||
#endif
|
||||
#endif
|
||||
static unsigned int
|
||||
is_reserved_hash (register const char *str, register unsigned int len)
|
||||
{
|
||||
static const unsigned char asso_values[] =
|
||||
{
|
||||
101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
|
||||
101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
|
||||
101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
|
||||
101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
|
||||
101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
|
||||
101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
|
||||
101, 101, 101, 101, 101, 101, 101, 101, 101, 0,
|
||||
101, 101, 101, 101, 101, 101, 15, 101, 101, 101,
|
||||
0, 101, 101, 101, 101, 101, 101, 101, 101, 101,
|
||||
101, 101, 101, 101, 101, 0, 101, 0, 0, 5,
|
||||
25, 20, 55, 30, 101, 15, 101, 101, 10, 0,
|
||||
10, 40, 10, 101, 10, 5, 0, 10, 15, 101,
|
||||
101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
|
||||
101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
|
||||
101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
|
||||
101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
|
||||
101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
|
||||
101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
|
||||
101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
|
||||
101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
|
||||
101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
|
||||
101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
|
||||
101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
|
||||
101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
|
||||
101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
|
||||
101, 101, 101, 101, 101, 101
|
||||
};
|
||||
return len + asso_values[(unsigned char)str[2]] + asso_values[(unsigned char)str[0]] + asso_values[(unsigned char)str[len - 1]];
|
||||
}
|
||||
|
||||
#ifdef __GNUC__
|
||||
__inline
|
||||
#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
|
||||
__attribute__ ((__gnu_inline__))
|
||||
#endif
|
||||
#endif
|
||||
const struct resword *
|
||||
is_reserved_word (register const char *str, register unsigned int len)
|
||||
{
|
||||
enum
|
||||
{
|
||||
TOTAL_KEYWORDS = 47,
|
||||
MIN_WORD_LENGTH = 3,
|
||||
MAX_WORD_LENGTH = 24,
|
||||
MIN_HASH_VALUE = 3,
|
||||
MAX_HASH_VALUE = 100
|
||||
};
|
||||
|
||||
static const struct resword wordlist[] =
|
||||
{
|
||||
{""}, {""}, {""},
|
||||
#line 36 "scripts/genksyms/keywords.gperf"
|
||||
{"asm", ASM_KEYW},
|
||||
{""},
|
||||
#line 15 "scripts/genksyms/keywords.gperf"
|
||||
{"__asm", ASM_KEYW},
|
||||
{""},
|
||||
#line 16 "scripts/genksyms/keywords.gperf"
|
||||
{"__asm__", ASM_KEYW},
|
||||
{""}, {""},
|
||||
#line 27 "scripts/genksyms/keywords.gperf"
|
||||
{"__typeof__", TYPEOF_KEYW},
|
||||
{""},
|
||||
#line 19 "scripts/genksyms/keywords.gperf"
|
||||
{"__const", CONST_KEYW},
|
||||
#line 18 "scripts/genksyms/keywords.gperf"
|
||||
{"__attribute__", ATTRIBUTE_KEYW},
|
||||
#line 20 "scripts/genksyms/keywords.gperf"
|
||||
{"__const__", CONST_KEYW},
|
||||
#line 25 "scripts/genksyms/keywords.gperf"
|
||||
{"__signed__", SIGNED_KEYW},
|
||||
#line 54 "scripts/genksyms/keywords.gperf"
|
||||
{"static", STATIC_KEYW},
|
||||
#line 30 "scripts/genksyms/keywords.gperf"
|
||||
{"__builtin_va_list", VA_LIST_KEYW},
|
||||
#line 49 "scripts/genksyms/keywords.gperf"
|
||||
{"int", INT_KEYW},
|
||||
#line 42 "scripts/genksyms/keywords.gperf"
|
||||
{"char", CHAR_KEYW},
|
||||
#line 43 "scripts/genksyms/keywords.gperf"
|
||||
{"const", CONST_KEYW},
|
||||
#line 55 "scripts/genksyms/keywords.gperf"
|
||||
{"struct", STRUCT_KEYW},
|
||||
#line 34 "scripts/genksyms/keywords.gperf"
|
||||
{"__restrict__", RESTRICT_KEYW},
|
||||
#line 35 "scripts/genksyms/keywords.gperf"
|
||||
{"restrict", RESTRICT_KEYW},
|
||||
#line 12 "scripts/genksyms/keywords.gperf"
|
||||
{"EXPORT_SYMBOL_GPL_FUTURE", EXPORT_SYMBOL_KEYW},
|
||||
#line 23 "scripts/genksyms/keywords.gperf"
|
||||
{"__inline__", INLINE_KEYW},
|
||||
{""},
|
||||
#line 29 "scripts/genksyms/keywords.gperf"
|
||||
{"__volatile__", VOLATILE_KEYW},
|
||||
#line 10 "scripts/genksyms/keywords.gperf"
|
||||
{"EXPORT_SYMBOL", EXPORT_SYMBOL_KEYW},
|
||||
#line 33 "scripts/genksyms/keywords.gperf"
|
||||
{"_restrict", RESTRICT_KEYW},
|
||||
{""},
|
||||
#line 17 "scripts/genksyms/keywords.gperf"
|
||||
{"__attribute", ATTRIBUTE_KEYW},
|
||||
#line 11 "scripts/genksyms/keywords.gperf"
|
||||
{"EXPORT_SYMBOL_GPL", EXPORT_SYMBOL_KEYW},
|
||||
#line 21 "scripts/genksyms/keywords.gperf"
|
||||
{"__extension__", EXTENSION_KEYW},
|
||||
#line 45 "scripts/genksyms/keywords.gperf"
|
||||
{"enum", ENUM_KEYW},
|
||||
#line 13 "scripts/genksyms/keywords.gperf"
|
||||
{"EXPORT_UNUSED_SYMBOL", EXPORT_SYMBOL_KEYW},
|
||||
#line 46 "scripts/genksyms/keywords.gperf"
|
||||
{"extern", EXTERN_KEYW},
|
||||
{""},
|
||||
#line 24 "scripts/genksyms/keywords.gperf"
|
||||
{"__signed", SIGNED_KEYW},
|
||||
#line 14 "scripts/genksyms/keywords.gperf"
|
||||
{"EXPORT_UNUSED_SYMBOL_GPL", EXPORT_SYMBOL_KEYW},
|
||||
#line 58 "scripts/genksyms/keywords.gperf"
|
||||
{"union", UNION_KEYW},
|
||||
{""}, {""},
|
||||
#line 22 "scripts/genksyms/keywords.gperf"
|
||||
{"__inline", INLINE_KEYW},
|
||||
#line 41 "scripts/genksyms/keywords.gperf"
|
||||
{"auto", AUTO_KEYW},
|
||||
#line 28 "scripts/genksyms/keywords.gperf"
|
||||
{"__volatile", VOLATILE_KEYW},
|
||||
{""}, {""},
|
||||
#line 59 "scripts/genksyms/keywords.gperf"
|
||||
{"unsigned", UNSIGNED_KEYW},
|
||||
{""},
|
||||
#line 52 "scripts/genksyms/keywords.gperf"
|
||||
{"short", SHORT_KEYW},
|
||||
#line 48 "scripts/genksyms/keywords.gperf"
|
||||
{"inline", INLINE_KEYW},
|
||||
{""},
|
||||
#line 61 "scripts/genksyms/keywords.gperf"
|
||||
{"volatile", VOLATILE_KEYW},
|
||||
#line 50 "scripts/genksyms/keywords.gperf"
|
||||
{"long", LONG_KEYW},
|
||||
#line 32 "scripts/genksyms/keywords.gperf"
|
||||
{"_Bool", BOOL_KEYW},
|
||||
{""}, {""},
|
||||
#line 51 "scripts/genksyms/keywords.gperf"
|
||||
{"register", REGISTER_KEYW},
|
||||
#line 60 "scripts/genksyms/keywords.gperf"
|
||||
{"void", VOID_KEYW},
|
||||
{""},
|
||||
#line 44 "scripts/genksyms/keywords.gperf"
|
||||
{"double", DOUBLE_KEYW},
|
||||
{""},
|
||||
#line 26 "scripts/genksyms/keywords.gperf"
|
||||
{"__typeof", TYPEOF_KEYW},
|
||||
{""}, {""},
|
||||
#line 53 "scripts/genksyms/keywords.gperf"
|
||||
{"signed", SIGNED_KEYW},
|
||||
{""}, {""}, {""}, {""},
|
||||
#line 57 "scripts/genksyms/keywords.gperf"
|
||||
{"typeof", TYPEOF_KEYW},
|
||||
#line 56 "scripts/genksyms/keywords.gperf"
|
||||
{"typedef", TYPEDEF_KEYW},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
#line 47 "scripts/genksyms/keywords.gperf"
|
||||
{"float", FLOAT_KEYW}
|
||||
};
|
||||
|
||||
if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
|
||||
{
|
||||
register int key = is_reserved_hash (str, len);
|
||||
|
||||
if (key <= MAX_HASH_VALUE && key >= 0)
|
||||
{
|
||||
register const char *s = wordlist[key].name;
|
||||
|
||||
if (*str == *s && !strcmp (str + 1, s + 1))
|
||||
return &wordlist[key];
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
@@ -94,7 +94,7 @@ MC_TOKEN ([~%^&*+=|<>/-]=)|(&&)|("||")|(->)|(<<)|(>>)
|
||||
|
||||
/* Bring in the keyword recognizer. */
|
||||
|
||||
#include "keywords.hash.c"
|
||||
#include "keywords.c"
|
||||
|
||||
|
||||
/* Macros to append to our phrase collection list. */
|
||||
@@ -186,10 +186,10 @@ repeat:
|
||||
case IDENT:
|
||||
APP;
|
||||
{
|
||||
const struct resword *r = is_reserved_word(yytext, yyleng);
|
||||
if (r)
|
||||
int r = is_reserved_word(yytext, yyleng);
|
||||
if (r >= 0)
|
||||
{
|
||||
switch (token = r->token)
|
||||
switch (token = r)
|
||||
{
|
||||
case ATTRIBUTE_KEYW:
|
||||
lexstate = ST_ATTRIBUTE;
|
||||
|
@@ -1905,7 +1905,7 @@ void yyfree (void * ptr )
|
||||
|
||||
/* Bring in the keyword recognizer. */
|
||||
|
||||
#include "keywords.hash.c"
|
||||
#include "keywords.c"
|
||||
|
||||
/* Macros to append to our phrase collection list. */
|
||||
|
||||
@@ -1995,10 +1995,10 @@ repeat:
|
||||
case IDENT:
|
||||
APP;
|
||||
{
|
||||
const struct resword *r = is_reserved_word(yytext, yyleng);
|
||||
if (r)
|
||||
int r = is_reserved_word(yytext, yyleng);
|
||||
if (r >= 0)
|
||||
{
|
||||
switch (token = r->token)
|
||||
switch (token = r)
|
||||
{
|
||||
case ATTRIBUTE_KEYW:
|
||||
lexstate = ST_ATTRIBUTE;
|
||||
|
Reference in New Issue
Block a user