aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/genksyms
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2017-08-19 13:17:02 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2017-08-19 14:02:53 -0400
commitbb3290d91695bb1ae78ab86f18fb4d7ad8e5ebcc (patch)
tree0e50ccf15e0ad847395593ce8e4b1b4c6eb50031 /scripts/genksyms
parent58d4e450a490d5f02183f6834c12550ba26d3b47 (diff)
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>
Diffstat (limited to 'scripts/genksyms')
-rw-r--r--scripts/genksyms/Makefile4
-rw-r--r--scripts/genksyms/keywords.c74
-rw-r--r--scripts/genksyms/keywords.gperf61
-rw-r--r--scripts/genksyms/keywords.hash.c_shipped230
-rw-r--r--scripts/genksyms/lex.l8
-rw-r--r--scripts/genksyms/lex.lex.c_shipped8
6 files changed, 84 insertions, 301 deletions
diff --git a/scripts/genksyms/Makefile b/scripts/genksyms/Makefile
index aca33b98bf63..3c23bab3367b 100644
--- a/scripts/genksyms/Makefile
+++ b/scripts/genksyms/Makefile
@@ -9,6 +9,6 @@ HOSTCFLAGS_parse.tab.o := -I$(src)
9HOSTCFLAGS_lex.lex.o := -I$(src) 9HOSTCFLAGS_lex.lex.o := -I$(src)
10 10
11# dependencies on generated files need to be listed explicitly 11# dependencies on generated files need to be listed explicitly
12$(obj)/lex.lex.o: $(obj)/keywords.hash.c $(obj)/parse.tab.h 12$(obj)/lex.lex.o: $(obj)/parse.tab.h
13 13
14clean-files := keywords.hash.c lex.lex.c parse.tab.c parse.tab.h 14clean-files := lex.lex.c parse.tab.c parse.tab.h
diff --git a/scripts/genksyms/keywords.c b/scripts/genksyms/keywords.c
new file mode 100644
index 000000000000..9f40bcd17d07
--- /dev/null
+++ b/scripts/genksyms/keywords.c
@@ -0,0 +1,74 @@
1static struct resword {
2 const char *name;
3 int token;
4} keywords[] = {
5 { "EXPORT_SYMBOL", EXPORT_SYMBOL_KEYW },
6 { "EXPORT_SYMBOL_GPL", EXPORT_SYMBOL_KEYW },
7 { "EXPORT_SYMBOL_GPL_FUTURE", EXPORT_SYMBOL_KEYW },
8 { "EXPORT_UNUSED_SYMBOL", EXPORT_SYMBOL_KEYW },
9 { "EXPORT_UNUSED_SYMBOL_GPL", EXPORT_SYMBOL_KEYW },
10 { "__asm", ASM_KEYW },
11 { "__asm__", ASM_KEYW },
12 { "__attribute", ATTRIBUTE_KEYW },
13 { "__attribute__", ATTRIBUTE_KEYW },
14 { "__const", CONST_KEYW },
15 { "__const__", CONST_KEYW },
16 { "__extension__", EXTENSION_KEYW },
17 { "__inline", INLINE_KEYW },
18 { "__inline__", INLINE_KEYW },
19 { "__signed", SIGNED_KEYW },
20 { "__signed__", SIGNED_KEYW },
21 { "__typeof", TYPEOF_KEYW },
22 { "__typeof__", TYPEOF_KEYW },
23 { "__volatile", VOLATILE_KEYW },
24 { "__volatile__", VOLATILE_KEYW },
25 { "__builtin_va_list", VA_LIST_KEYW },
26
27 // According to rth, c99 defines "_Bool", __restrict", __restrict__", "restrict". KAO
28 { "_Bool", BOOL_KEYW },
29 { "_restrict", RESTRICT_KEYW },
30 { "__restrict__", RESTRICT_KEYW },
31 { "restrict", RESTRICT_KEYW },
32 { "asm", ASM_KEYW },
33
34 // attribute commented out in modutils 2.4.2. People are using 'attribute' as a
35 // field name which breaks the genksyms parser. It is not a gcc keyword anyway.
36 // KAO. },
37 // { "attribute", ATTRIBUTE_KEYW },
38
39 { "auto", AUTO_KEYW },
40 { "char", CHAR_KEYW },
41 { "const", CONST_KEYW },
42 { "double", DOUBLE_KEYW },
43 { "enum", ENUM_KEYW },
44 { "extern", EXTERN_KEYW },
45 { "float", FLOAT_KEYW },
46 { "inline", INLINE_KEYW },
47 { "int", INT_KEYW },
48 { "long", LONG_KEYW },
49 { "register", REGISTER_KEYW },
50 { "short", SHORT_KEYW },
51 { "signed", SIGNED_KEYW },
52 { "static", STATIC_KEYW },
53 { "struct", STRUCT_KEYW },
54 { "typedef", TYPEDEF_KEYW },
55 { "typeof", TYPEOF_KEYW },
56 { "union", UNION_KEYW },
57 { "unsigned", UNSIGNED_KEYW },
58 { "void", VOID_KEYW },
59 { "volatile", VOLATILE_KEYW },
60};
61
62#define NR_KEYWORDS (sizeof(keywords)/sizeof(struct resword))
63
64static int is_reserved_word(register const char *str, register unsigned int len)
65{
66 int i;
67 for (i = 0; i < NR_KEYWORDS; i++) {
68 struct resword *r = keywords + i;
69 int l = strlen(r->name);
70 if (len == l && !memcmp(str, r->name, len))
71 return r->token;
72 }
73 return -1;
74}
diff --git a/scripts/genksyms/keywords.gperf b/scripts/genksyms/keywords.gperf
deleted file mode 100644
index bd4c4b235588..000000000000
--- a/scripts/genksyms/keywords.gperf
+++ /dev/null
@@ -1,61 +0,0 @@
1%language=ANSI-C
2%define hash-function-name is_reserved_hash
3%define lookup-function-name is_reserved_word
4%{
5struct resword;
6static const struct resword *is_reserved_word(register const char *str, register unsigned int len);
7%}
8struct resword { const char *name; int token; }
9%%
10EXPORT_SYMBOL, EXPORT_SYMBOL_KEYW
11EXPORT_SYMBOL_GPL, EXPORT_SYMBOL_KEYW
12EXPORT_SYMBOL_GPL_FUTURE, EXPORT_SYMBOL_KEYW
13EXPORT_UNUSED_SYMBOL, EXPORT_SYMBOL_KEYW
14EXPORT_UNUSED_SYMBOL_GPL, EXPORT_SYMBOL_KEYW
15__asm, ASM_KEYW
16__asm__, ASM_KEYW
17__attribute, ATTRIBUTE_KEYW
18__attribute__, ATTRIBUTE_KEYW
19__const, CONST_KEYW
20__const__, CONST_KEYW
21__extension__, EXTENSION_KEYW
22__inline, INLINE_KEYW
23__inline__, INLINE_KEYW
24__signed, SIGNED_KEYW
25__signed__, SIGNED_KEYW
26__typeof, TYPEOF_KEYW
27__typeof__, TYPEOF_KEYW
28__volatile, VOLATILE_KEYW
29__volatile__, VOLATILE_KEYW
30__builtin_va_list, VA_LIST_KEYW
31# According to rth, c99 defines _Bool, __restrict, __restrict__, restrict. KAO
32_Bool, BOOL_KEYW
33_restrict, RESTRICT_KEYW
34__restrict__, RESTRICT_KEYW
35restrict, RESTRICT_KEYW
36asm, ASM_KEYW
37# attribute commented out in modutils 2.4.2. People are using 'attribute' as a
38# field name which breaks the genksyms parser. It is not a gcc keyword anyway.
39# KAO.
40# attribute, ATTRIBUTE_KEYW
41auto, AUTO_KEYW
42char, CHAR_KEYW
43const, CONST_KEYW
44double, DOUBLE_KEYW
45enum, ENUM_KEYW
46extern, EXTERN_KEYW
47float, FLOAT_KEYW
48inline, INLINE_KEYW
49int, INT_KEYW
50long, LONG_KEYW
51register, REGISTER_KEYW
52short, SHORT_KEYW
53signed, SIGNED_KEYW
54static, STATIC_KEYW
55struct, STRUCT_KEYW
56typedef, TYPEDEF_KEYW
57typeof, TYPEOF_KEYW
58union, UNION_KEYW
59unsigned, UNSIGNED_KEYW
60void, VOID_KEYW
61volatile, VOLATILE_KEYW
diff --git a/scripts/genksyms/keywords.hash.c_shipped b/scripts/genksyms/keywords.hash.c_shipped
deleted file mode 100644
index 738018ba7375..000000000000
--- a/scripts/genksyms/keywords.hash.c_shipped
+++ /dev/null
@@ -1,230 +0,0 @@
1/* ANSI-C code produced by gperf version 3.0.4 */
2/* 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 */
3
4#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
5 && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
6 && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
7 && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
8 && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
9 && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
10 && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
11 && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
12 && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
13 && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
14 && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
15 && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
16 && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
17 && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
18 && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
19 && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
20 && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
21 && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
22 && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
23 && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
24 && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
25 && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
26 && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
27/* The character set is not based on ISO-646. */
28#error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
29#endif
30
31#line 4 "scripts/genksyms/keywords.gperf"
32
33struct resword;
34static const struct resword *is_reserved_word(register const char *str, register unsigned int len);
35#line 8 "scripts/genksyms/keywords.gperf"
36struct resword { const char *name; int token; };
37/* maximum key range = 98, duplicates = 0 */
38
39#ifdef __GNUC__
40__inline
41#else
42#ifdef __cplusplus
43inline
44#endif
45#endif
46static unsigned int
47is_reserved_hash (register const char *str, register unsigned int len)
48{
49 static const unsigned char asso_values[] =
50 {
51 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
52 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
53 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
54 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
55 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
56 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
57 101, 101, 101, 101, 101, 101, 101, 101, 101, 0,
58 101, 101, 101, 101, 101, 101, 15, 101, 101, 101,
59 0, 101, 101, 101, 101, 101, 101, 101, 101, 101,
60 101, 101, 101, 101, 101, 0, 101, 0, 0, 5,
61 25, 20, 55, 30, 101, 15, 101, 101, 10, 0,
62 10, 40, 10, 101, 10, 5, 0, 10, 15, 101,
63 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
64 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
65 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
66 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
67 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
68 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
69 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
70 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
71 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
72 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
73 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
74 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
75 101, 101, 101, 101, 101, 101, 101, 101, 101, 101,
76 101, 101, 101, 101, 101, 101
77 };
78 return len + asso_values[(unsigned char)str[2]] + asso_values[(unsigned char)str[0]] + asso_values[(unsigned char)str[len - 1]];
79}
80
81#ifdef __GNUC__
82__inline
83#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
84__attribute__ ((__gnu_inline__))
85#endif
86#endif
87const struct resword *
88is_reserved_word (register const char *str, register unsigned int len)
89{
90 enum
91 {
92 TOTAL_KEYWORDS = 47,
93 MIN_WORD_LENGTH = 3,
94 MAX_WORD_LENGTH = 24,
95 MIN_HASH_VALUE = 3,
96 MAX_HASH_VALUE = 100
97 };
98
99 static const struct resword wordlist[] =
100 {
101 {""}, {""}, {""},
102#line 36 "scripts/genksyms/keywords.gperf"
103 {"asm", ASM_KEYW},
104 {""},
105#line 15 "scripts/genksyms/keywords.gperf"
106 {"__asm", ASM_KEYW},
107 {""},
108#line 16 "scripts/genksyms/keywords.gperf"
109 {"__asm__", ASM_KEYW},
110 {""}, {""},
111#line 27 "scripts/genksyms/keywords.gperf"
112 {"__typeof__", TYPEOF_KEYW},
113 {""},
114#line 19 "scripts/genksyms/keywords.gperf"
115 {"__const", CONST_KEYW},
116#line 18 "scripts/genksyms/keywords.gperf"
117 {"__attribute__", ATTRIBUTE_KEYW},
118#line 20 "scripts/genksyms/keywords.gperf"
119 {"__const__", CONST_KEYW},
120#line 25 "scripts/genksyms/keywords.gperf"
121 {"__signed__", SIGNED_KEYW},
122#line 54 "scripts/genksyms/keywords.gperf"
123 {"static", STATIC_KEYW},
124#line 30 "scripts/genksyms/keywords.gperf"
125 {"__builtin_va_list", VA_LIST_KEYW},
126#line 49 "scripts/genksyms/keywords.gperf"
127 {"int", INT_KEYW},
128#line 42 "scripts/genksyms/keywords.gperf"
129 {"char", CHAR_KEYW},
130#line 43 "scripts/genksyms/keywords.gperf"
131 {"const", CONST_KEYW},
132#line 55 "scripts/genksyms/keywords.gperf"
133 {"struct", STRUCT_KEYW},
134#line 34 "scripts/genksyms/keywords.gperf"
135 {"__restrict__", RESTRICT_KEYW},
136#line 35 "scripts/genksyms/keywords.gperf"
137 {"restrict", RESTRICT_KEYW},
138#line 12 "scripts/genksyms/keywords.gperf"
139 {"EXPORT_SYMBOL_GPL_FUTURE", EXPORT_SYMBOL_KEYW},
140#line 23 "scripts/genksyms/keywords.gperf"
141 {"__inline__", INLINE_KEYW},
142 {""},
143#line 29 "scripts/genksyms/keywords.gperf"
144 {"__volatile__", VOLATILE_KEYW},
145#line 10 "scripts/genksyms/keywords.gperf"
146 {"EXPORT_SYMBOL", EXPORT_SYMBOL_KEYW},
147#line 33 "scripts/genksyms/keywords.gperf"
148 {"_restrict", RESTRICT_KEYW},
149 {""},
150#line 17 "scripts/genksyms/keywords.gperf"
151 {"__attribute", ATTRIBUTE_KEYW},
152#line 11 "scripts/genksyms/keywords.gperf"
153 {"EXPORT_SYMBOL_GPL", EXPORT_SYMBOL_KEYW},
154#line 21 "scripts/genksyms/keywords.gperf"
155 {"__extension__", EXTENSION_KEYW},
156#line 45 "scripts/genksyms/keywords.gperf"
157 {"enum", ENUM_KEYW},
158#line 13 "scripts/genksyms/keywords.gperf"
159 {"EXPORT_UNUSED_SYMBOL", EXPORT_SYMBOL_KEYW},
160#line 46 "scripts/genksyms/keywords.gperf"
161 {"extern", EXTERN_KEYW},
162 {""},
163#line 24 "scripts/genksyms/keywords.gperf"
164 {"__signed", SIGNED_KEYW},
165#line 14 "scripts/genksyms/keywords.gperf"
166 {"EXPORT_UNUSED_SYMBOL_GPL", EXPORT_SYMBOL_KEYW},
167#line 58 "scripts/genksyms/keywords.gperf"
168 {"union", UNION_KEYW},
169 {""}, {""},
170#line 22 "scripts/genksyms/keywords.gperf"
171 {"__inline", INLINE_KEYW},
172#line 41 "scripts/genksyms/keywords.gperf"
173 {"auto", AUTO_KEYW},
174#line 28 "scripts/genksyms/keywords.gperf"
175 {"__volatile", VOLATILE_KEYW},
176 {""}, {""},
177#line 59 "scripts/genksyms/keywords.gperf"
178 {"unsigned", UNSIGNED_KEYW},
179 {""},
180#line 52 "scripts/genksyms/keywords.gperf"
181 {"short", SHORT_KEYW},
182#line 48 "scripts/genksyms/keywords.gperf"
183 {"inline", INLINE_KEYW},
184 {""},
185#line 61 "scripts/genksyms/keywords.gperf"
186 {"volatile", VOLATILE_KEYW},
187#line 50 "scripts/genksyms/keywords.gperf"
188 {"long", LONG_KEYW},
189#line 32 "scripts/genksyms/keywords.gperf"
190 {"_Bool", BOOL_KEYW},
191 {""}, {""},
192#line 51 "scripts/genksyms/keywords.gperf"
193 {"register", REGISTER_KEYW},
194#line 60 "scripts/genksyms/keywords.gperf"
195 {"void", VOID_KEYW},
196 {""},
197#line 44 "scripts/genksyms/keywords.gperf"
198 {"double", DOUBLE_KEYW},
199 {""},
200#line 26 "scripts/genksyms/keywords.gperf"
201 {"__typeof", TYPEOF_KEYW},
202 {""}, {""},
203#line 53 "scripts/genksyms/keywords.gperf"
204 {"signed", SIGNED_KEYW},
205 {""}, {""}, {""}, {""},
206#line 57 "scripts/genksyms/keywords.gperf"
207 {"typeof", TYPEOF_KEYW},
208#line 56 "scripts/genksyms/keywords.gperf"
209 {"typedef", TYPEDEF_KEYW},
210 {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
211 {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
212 {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
213#line 47 "scripts/genksyms/keywords.gperf"
214 {"float", FLOAT_KEYW}
215 };
216
217 if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
218 {
219 register int key = is_reserved_hash (str, len);
220
221 if (key <= MAX_HASH_VALUE && key >= 0)
222 {
223 register const char *s = wordlist[key].name;
224
225 if (*str == *s && !strcmp (str + 1, s + 1))
226 return &wordlist[key];
227 }
228 }
229 return 0;
230}
diff --git a/scripts/genksyms/lex.l b/scripts/genksyms/lex.l
index 5235aa507ba5..5dc25ee01c77 100644
--- a/scripts/genksyms/lex.l
+++ b/scripts/genksyms/lex.l
@@ -94,7 +94,7 @@ MC_TOKEN ([~%^&*+=|<>/-]=)|(&&)|("||")|(->)|(<<)|(>>)
94 94
95/* Bring in the keyword recognizer. */ 95/* Bring in the keyword recognizer. */
96 96
97#include "keywords.hash.c" 97#include "keywords.c"
98 98
99 99
100/* Macros to append to our phrase collection list. */ 100/* Macros to append to our phrase collection list. */
@@ -186,10 +186,10 @@ repeat:
186 case IDENT: 186 case IDENT:
187 APP; 187 APP;
188 { 188 {
189 const struct resword *r = is_reserved_word(yytext, yyleng); 189 int r = is_reserved_word(yytext, yyleng);
190 if (r) 190 if (r >= 0)
191 { 191 {
192 switch (token = r->token) 192 switch (token = r)
193 { 193 {
194 case ATTRIBUTE_KEYW: 194 case ATTRIBUTE_KEYW:
195 lexstate = ST_ATTRIBUTE; 195 lexstate = ST_ATTRIBUTE;
diff --git a/scripts/genksyms/lex.lex.c_shipped b/scripts/genksyms/lex.lex.c_shipped
index 985c5541aae4..d5a7474b3e57 100644
--- a/scripts/genksyms/lex.lex.c_shipped
+++ b/scripts/genksyms/lex.lex.c_shipped
@@ -1905,7 +1905,7 @@ void yyfree (void * ptr )
1905 1905
1906/* Bring in the keyword recognizer. */ 1906/* Bring in the keyword recognizer. */
1907 1907
1908#include "keywords.hash.c" 1908#include "keywords.c"
1909 1909
1910/* Macros to append to our phrase collection list. */ 1910/* Macros to append to our phrase collection list. */
1911 1911
@@ -1995,10 +1995,10 @@ repeat:
1995 case IDENT: 1995 case IDENT:
1996 APP; 1996 APP;
1997 { 1997 {
1998 const struct resword *r = is_reserved_word(yytext, yyleng); 1998 int r = is_reserved_word(yytext, yyleng);
1999 if (r) 1999 if (r >= 0)
2000 { 2000 {
2001 switch (token = r->token) 2001 switch (token = r)
2002 { 2002 {
2003 case ATTRIBUTE_KEYW: 2003 case ATTRIBUTE_KEYW:
2004 lexstate = ST_ATTRIBUTE; 2004 lexstate = ST_ATTRIBUTE;