* [RFC PATCH 0/3] kbuild: generate intermediate C files instead of copying _shipped files @ 2017-08-19 8:49 Masahiro Yamada 2017-08-19 8:49 ` [RFC PATCH 1/3] kbuild: generate *.hash.c during build Masahiro Yamada ` (3 more replies) 0 siblings, 4 replies; 16+ messages in thread From: Masahiro Yamada @ 2017-08-19 8:49 UTC (permalink / raw) To: Sam Ravnborg, Michal Marek, Linus Torvalds, linux-kbuild Cc: devicetree, Rob Herring, Jonathan Corbet, Richard Purdie, Greg Kroah-Hartman, Andrew Morton, Masahiro Yamada, Mauro Carvalho Chehab, Nicholas Piggin, linux-doc, Markus Heiser, linux-kernel, Frank Rowand, Rob Herring, SeongJae Park, Yann E. MORIN In Linux build system convention, we do not run tools such as flex, bison, gperf during the kernel building. Instead, manage generated C files in the repository with _shipped suffixes. They are simply shipped (copied) removing the _shipped suffixes during the kernel building. Commit 7373f4f83c71 ("kbuild: add implicit rules for parser generation") added a mechanism to regenerate intermediate C files easily. The build rules are surrounded with ifdef REGENERATE_PARSERS. So, we need to pass REGENERATE_PARSERS=1 from the command line when we want to update them. Here is one question. Is it acceptable to use those rules all the time? That is, generate those C files by flex, bison, gperf during the kernel building. This means, the build system depends on more external tools. From the users' point of view, they will need to install flex, bison, gperf in order to build the kernel. From the developers' point of view, the advantage is we do not need to version-control generated files, i.e. _shipped files will be deleted. I'd like to know if this is acceptable or not. For example, currently some files are simply shipped (copied) when building the kconfig program. $ make mrproper; make defconfig HOSTCC scripts/basic/fixdep HOSTCC scripts/kconfig/conf.o SHIPPED scripts/kconfig/zconf.tab.c SHIPPED scripts/kconfig/zconf.lex.c SHIPPED scripts/kconfig/zconf.hash.c HOSTCC scripts/kconfig/zconf.tab.o HOSTLD scripts/kconfig/conf *** Default configuration is based on 'x86_64_defconfig' # # configuration written to .config # With this series, they are created from *real* sources (*.y, *.l, *.gperf files). $ make mrproper; make defconfig HOSTCC scripts/basic/fixdep HOSTCC scripts/kconfig/conf.o YACC scripts/kconfig/zconf.tab.c LEX scripts/kconfig/zconf.lex.c GPERF scripts/kconfig/zconf.hash.c HOSTCC scripts/kconfig/zconf.tab.o HOSTLD scripts/kconfig/conf *** Default configuration is based on 'x86_64_defconfig' # # configuration written to .config # Note: The tool versions in Documentation/process/changes.rst are just place-holders for now. We need to figure out the minimal versions if we like to switch to this approach. Masahiro Yamada (3): kbuild: generate *.hash.c during build kbuild: generate *.lex.c during build kbuild: generate *.tab.c and *.tab.h during build Documentation/process/changes.rst | 36 + scripts/Makefile.lib | 26 +- scripts/dtc/Makefile | 6 +- scripts/dtc/dtc-lexer.lex.c_shipped | 2259 --------------------------- scripts/dtc/dtc-parser.tab.c_shipped | 2303 ---------------------------- scripts/dtc/dtc-parser.tab.h_shipped | 125 -- scripts/genksyms/Makefile | 4 +- scripts/genksyms/keywords.hash.c_shipped | 230 --- scripts/genksyms/lex.lex.c_shipped | 2291 --------------------------- scripts/genksyms/parse.tab.c_shipped | 2394 ----------------------------- scripts/genksyms/parse.tab.h_shipped | 119 -- scripts/kconfig/Makefile | 1 + scripts/kconfig/zconf.hash.c_shipped | 297 ---- scripts/kconfig/zconf.lex.c_shipped | 2473 ------------------------------ scripts/kconfig/zconf.tab.c_shipped | 2471 ----------------------------- 15 files changed, 53 insertions(+), 14982 deletions(-) delete mode 100644 scripts/dtc/dtc-lexer.lex.c_shipped delete mode 100644 scripts/dtc/dtc-parser.tab.c_shipped delete mode 100644 scripts/dtc/dtc-parser.tab.h_shipped delete mode 100644 scripts/genksyms/keywords.hash.c_shipped delete mode 100644 scripts/genksyms/lex.lex.c_shipped delete mode 100644 scripts/genksyms/parse.tab.c_shipped delete mode 100644 scripts/genksyms/parse.tab.h_shipped delete mode 100644 scripts/kconfig/zconf.hash.c_shipped delete mode 100644 scripts/kconfig/zconf.lex.c_shipped delete mode 100644 scripts/kconfig/zconf.tab.c_shipped -- 2.7.4 ^ permalink raw reply [flat|nested] 16+ messages in thread
* [RFC PATCH 1/3] kbuild: generate *.hash.c during build 2017-08-19 8:49 [RFC PATCH 0/3] kbuild: generate intermediate C files instead of copying _shipped files Masahiro Yamada @ 2017-08-19 8:49 ` Masahiro Yamada 2017-08-19 11:31 ` [RFC PATCH 0/3] kbuild: generate intermediate C files instead of copying _shipped files Cao jin ` (2 subsequent siblings) 3 siblings, 0 replies; 16+ messages in thread From: Masahiro Yamada @ 2017-08-19 8:49 UTC (permalink / raw) To: Sam Ravnborg, Michal Marek, Linus Torvalds, linux-kbuild Cc: devicetree, Rob Herring, Jonathan Corbet, Richard Purdie, Greg Kroah-Hartman, Andrew Morton, Masahiro Yamada, Mauro Carvalho Chehab, Nicholas Piggin, linux-doc, linux-kernel, SeongJae Park, Yann E. MORIN *.hash.c files are artifacts generated from *.gperf by using gperf. Instead of running gperf, we conventionally version-control *.hash.c_shipped files and copy them to *.hash.c during build. It is true that this approach can minimize external tool dependency, but we need to update the shipped files from time to time. This commit switches to build-time generation of the intermediate C files. Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> --- Documentation/process/changes.rst | 12 ++ scripts/Makefile.lib | 11 +- scripts/genksyms/Makefile | 1 + scripts/genksyms/keywords.hash.c_shipped | 230 ------------------------ scripts/kconfig/Makefile | 1 + scripts/kconfig/zconf.hash.c_shipped | 297 ------------------------------- 6 files changed, 19 insertions(+), 533 deletions(-) delete mode 100644 scripts/genksyms/keywords.hash.c_shipped delete mode 100644 scripts/kconfig/zconf.hash.c_shipped diff --git a/Documentation/process/changes.rst b/Documentation/process/changes.rst index adbb50ae5246..793e96fe47e3 100644 --- a/Documentation/process/changes.rst +++ b/Documentation/process/changes.rst @@ -31,6 +31,7 @@ you probably needn't concern yourself with isdn4k-utils. ====================== =============== ======================================== GNU C 3.2 gcc --version GNU make 3.81 make --version +gperf 3.0.4 gperf --version binutils 2.20 ld -v util-linux 2.10o fdformat --version module-init-tools 0.9.10 depmod -V @@ -72,6 +73,12 @@ Make You will need GNU make 3.81 or later to build the kernel. +gperf +----- + +Since Linux 4.14, the build system generates perfect hash functions +during build. This requires gperf 3.04 or later. + Binutils -------- @@ -338,6 +345,11 @@ Make - <ftp://ftp.gnu.org/gnu/make/> +gperf +----- + +- <ftp://ftp.gnu.org/gnu/gperf/> + Binutils -------- diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib index 58c05e5d9870..da7b42f7a5b8 100644 --- a/scripts/Makefile.lib +++ b/scripts/Makefile.lib @@ -192,16 +192,15 @@ $(foreach m, $(notdir $1), \ $(addprefix $(obj)/, $(foreach s, $3, $($(m:%$(strip $2)=%$(s))))))) endef -ifdef REGENERATE_PARSERS - # GPERF # --------------------------------------------------------------------------- -quiet_cmd_gperf = GPERF $@ +quiet_cmd_gperf = GPERF $@ cmd_gperf = gperf -t --output-file $@ -a -C -E -g -k 1,3,$$ -p -t $< -.PRECIOUS: $(src)/%.hash.c_shipped -$(src)/%.hash.c_shipped: $(src)/%.gperf - $(call cmd,gperf) +$(src)/%.hash.c: $(src)/%.gperf FORCE + $(call if_changed,gperf) + +ifdef REGENERATE_PARSERS # LEX # --------------------------------------------------------------------------- diff --git a/scripts/genksyms/Makefile b/scripts/genksyms/Makefile index aca33b98bf63..ce09b96fcb7b 100644 --- a/scripts/genksyms/Makefile +++ b/scripts/genksyms/Makefile @@ -11,4 +11,5 @@ 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 +targets := keywords.hash.c clean-files := keywords.hash.c lex.lex.c parse.tab.c parse.tab.h 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 @@ -/* 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; -} diff --git a/scripts/kconfig/Makefile b/scripts/kconfig/Makefile index eb8144643b78..a00fa0b1e8d3 100644 --- a/scripts/kconfig/Makefile +++ b/scripts/kconfig/Makefile @@ -190,6 +190,7 @@ gconf-objs := gconf.o zconf.tab.o hostprogs-y := conf nconf mconf kxgettext qconf gconf +targets := zconf.hash.c clean-files := qconf.moc .tmp_qtcheck .tmp_gtkcheck clean-files += zconf.tab.c zconf.lex.c zconf.hash.c gconf.glade.h clean-files += config.pot linux.pot diff --git a/scripts/kconfig/zconf.hash.c_shipped b/scripts/kconfig/zconf.hash.c_shipped deleted file mode 100644 index d51b15de074a..000000000000 --- a/scripts/kconfig/zconf.hash.c_shipped +++ /dev/null @@ -1,297 +0,0 @@ -/* ANSI-C code produced by gperf version 3.0.4 */ -/* Command-line: gperf -t --output-file scripts/kconfig/zconf.hash.c_shipped -a -C -E -g -k '1,3,$' -p -t scripts/kconfig/zconf.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 10 "scripts/kconfig/zconf.gperf" -struct kconf_id; - -static const struct kconf_id *kconf_id_lookup(register const char *str, register unsigned int len); -/* maximum key range = 71, duplicates = 0 */ - -#ifdef __GNUC__ -__inline -#else -#ifdef __cplusplus -inline -#endif -#endif -static unsigned int -kconf_id_hash (register const char *str, register unsigned int len) -{ - static const unsigned char asso_values[] = - { - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 0, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 10, 25, 25, - 0, 0, 0, 5, 0, 0, 73, 73, 5, 0, - 10, 5, 45, 73, 20, 20, 0, 15, 15, 73, - 20, 0, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73 - }; - register int hval = len; - - switch (hval) - { - default: - hval += asso_values[(unsigned char)str[2]]; - /*FALLTHROUGH*/ - case 2: - case 1: - hval += asso_values[(unsigned char)str[0]]; - break; - } - return hval + asso_values[(unsigned char)str[len - 1]]; -} - -struct kconf_id_strings_t - { - char kconf_id_strings_str2[sizeof("if")]; - char kconf_id_strings_str3[sizeof("int")]; - char kconf_id_strings_str5[sizeof("endif")]; - char kconf_id_strings_str7[sizeof("default")]; - char kconf_id_strings_str8[sizeof("tristate")]; - char kconf_id_strings_str9[sizeof("endchoice")]; - char kconf_id_strings_str10[sizeof("---help---")]; - char kconf_id_strings_str12[sizeof("def_tristate")]; - char kconf_id_strings_str13[sizeof("def_bool")]; - char kconf_id_strings_str14[sizeof("defconfig_list")]; - char kconf_id_strings_str17[sizeof("on")]; - char kconf_id_strings_str18[sizeof("optional")]; - char kconf_id_strings_str21[sizeof("option")]; - char kconf_id_strings_str22[sizeof("endmenu")]; - char kconf_id_strings_str23[sizeof("mainmenu")]; - char kconf_id_strings_str25[sizeof("menuconfig")]; - char kconf_id_strings_str27[sizeof("modules")]; - char kconf_id_strings_str28[sizeof("allnoconfig_y")]; - char kconf_id_strings_str29[sizeof("menu")]; - char kconf_id_strings_str31[sizeof("select")]; - char kconf_id_strings_str32[sizeof("comment")]; - char kconf_id_strings_str33[sizeof("env")]; - char kconf_id_strings_str35[sizeof("range")]; - char kconf_id_strings_str36[sizeof("choice")]; - char kconf_id_strings_str39[sizeof("bool")]; - char kconf_id_strings_str41[sizeof("source")]; - char kconf_id_strings_str42[sizeof("visible")]; - char kconf_id_strings_str43[sizeof("hex")]; - char kconf_id_strings_str46[sizeof("config")]; - char kconf_id_strings_str47[sizeof("boolean")]; - char kconf_id_strings_str50[sizeof("imply")]; - char kconf_id_strings_str51[sizeof("string")]; - char kconf_id_strings_str54[sizeof("help")]; - char kconf_id_strings_str56[sizeof("prompt")]; - char kconf_id_strings_str72[sizeof("depends")]; - }; -static const struct kconf_id_strings_t kconf_id_strings_contents = - { - "if", - "int", - "endif", - "default", - "tristate", - "endchoice", - "---help---", - "def_tristate", - "def_bool", - "defconfig_list", - "on", - "optional", - "option", - "endmenu", - "mainmenu", - "menuconfig", - "modules", - "allnoconfig_y", - "menu", - "select", - "comment", - "env", - "range", - "choice", - "bool", - "source", - "visible", - "hex", - "config", - "boolean", - "imply", - "string", - "help", - "prompt", - "depends" - }; -#define kconf_id_strings ((const char *) &kconf_id_strings_contents) -#ifdef __GNUC__ -__inline -#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__ -__attribute__ ((__gnu_inline__)) -#endif -#endif -const struct kconf_id * -kconf_id_lookup (register const char *str, register unsigned int len) -{ - enum - { - TOTAL_KEYWORDS = 35, - MIN_WORD_LENGTH = 2, - MAX_WORD_LENGTH = 14, - MIN_HASH_VALUE = 2, - MAX_HASH_VALUE = 72 - }; - - static const struct kconf_id wordlist[] = - { - {-1}, {-1}, -#line 26 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str2, T_IF, TF_COMMAND|TF_PARAM}, -#line 37 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str3, T_TYPE, TF_COMMAND, S_INT}, - {-1}, -#line 27 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str5, T_ENDIF, TF_COMMAND}, - {-1}, -#line 30 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str7, T_DEFAULT, TF_COMMAND, S_UNKNOWN}, -#line 32 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str8, T_TYPE, TF_COMMAND, S_TRISTATE}, -#line 20 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str9, T_ENDCHOICE, TF_COMMAND}, -#line 25 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str10, T_HELP, TF_COMMAND}, - {-1}, -#line 33 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str12, T_DEFAULT, TF_COMMAND, S_TRISTATE}, -#line 36 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str13, T_DEFAULT, TF_COMMAND, S_BOOLEAN}, -#line 47 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str14, T_OPT_DEFCONFIG_LIST,TF_OPTION}, - {-1}, {-1}, -#line 45 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str17, T_ON, TF_PARAM}, -#line 29 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str18, T_OPTIONAL, TF_COMMAND}, - {-1}, {-1}, -#line 44 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str21, T_OPTION, TF_COMMAND}, -#line 17 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str22, T_ENDMENU, TF_COMMAND}, -#line 15 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str23, T_MAINMENU, TF_COMMAND}, - {-1}, -#line 23 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str25, T_MENUCONFIG, TF_COMMAND}, - {-1}, -#line 46 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str27, T_OPT_MODULES, TF_OPTION}, -#line 49 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str28, T_OPT_ALLNOCONFIG_Y,TF_OPTION}, -#line 16 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str29, T_MENU, TF_COMMAND}, - {-1}, -#line 40 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str31, T_SELECT, TF_COMMAND}, -#line 21 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str32, T_COMMENT, TF_COMMAND}, -#line 48 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str33, T_OPT_ENV, TF_OPTION}, - {-1}, -#line 42 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str35, T_RANGE, TF_COMMAND}, -#line 19 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str36, T_CHOICE, TF_COMMAND}, - {-1}, {-1}, -#line 34 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str39, T_TYPE, TF_COMMAND, S_BOOLEAN}, - {-1}, -#line 18 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str41, T_SOURCE, TF_COMMAND}, -#line 43 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str42, T_VISIBLE, TF_COMMAND}, -#line 38 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str43, T_TYPE, TF_COMMAND, S_HEX}, - {-1}, {-1}, -#line 22 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str46, T_CONFIG, TF_COMMAND}, -#line 35 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str47, T_TYPE, TF_COMMAND, S_BOOLEAN}, - {-1}, {-1}, -#line 41 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str50, T_IMPLY, TF_COMMAND}, -#line 39 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str51, T_TYPE, TF_COMMAND, S_STRING}, - {-1}, {-1}, -#line 24 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str54, T_HELP, TF_COMMAND}, - {-1}, -#line 31 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str56, T_PROMPT, TF_COMMAND}, - {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, - {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, -#line 28 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str72, T_DEPENDS, TF_COMMAND} - }; - - if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) - { - register int key = kconf_id_hash (str, len); - - if (key <= MAX_HASH_VALUE && key >= 0) - { - register int o = wordlist[key].name; - if (o >= 0) - { - register const char *s = o + kconf_id_strings; - - if (*str == *s && !strncmp (str + 1, s + 1, len - 1) && s[len] == '\0') - return &wordlist[key]; - } - } - } - return 0; -} -#line 50 "scripts/kconfig/zconf.gperf" - -- 2.7.4 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [RFC PATCH 0/3] kbuild: generate intermediate C files instead of copying _shipped files 2017-08-19 8:49 [RFC PATCH 0/3] kbuild: generate intermediate C files instead of copying _shipped files Masahiro Yamada 2017-08-19 8:49 ` [RFC PATCH 1/3] kbuild: generate *.hash.c during build Masahiro Yamada @ 2017-08-19 11:31 ` Cao jin 2017-08-19 17:03 ` Linus Torvalds [not found] ` <1503132577-24423-4-git-send-email-yamada.masahiro@socionext.com> 3 siblings, 0 replies; 16+ messages in thread From: Cao jin @ 2017-08-19 11:31 UTC (permalink / raw) To: Masahiro Yamada, Sam Ravnborg, Michal Marek, Linus Torvalds, linux-kbuild Cc: devicetree, Rob Herring, Jonathan Corbet, Richard Purdie, Greg Kroah-Hartman, Andrew Morton, Mauro Carvalho Chehab, Nicholas Piggin, linux-doc, Markus Heiser, linux-kernel, Frank Rowand, Rob Herring, SeongJae Park, Yann E. MORIN Hi, I am stuck in a similar problem recent days by chance. I am just curious about the purpose of introduction of these *_shipped file, are they just for user's convenience when user doesn't install the those tools? -- Sincerely, Cao jin On 08/19/2017 04:49 PM, Masahiro Yamada wrote: > In Linux build system convention, we do not run tools such as > flex, bison, gperf during the kernel building. Instead, manage > generated C files in the repository with _shipped suffixes. > They are simply shipped (copied) removing the _shipped suffixes > during the kernel building. > > Commit 7373f4f83c71 ("kbuild: add implicit rules for parser generation") > added a mechanism to regenerate intermediate C files easily. > The build rules are surrounded with ifdef REGENERATE_PARSERS. > So, we need to pass REGENERATE_PARSERS=1 from the command line > when we want to update them. > > Here is one question. Is it acceptable to use those rules all the time? > That is, generate those C files by flex, bison, gperf during the > kernel building. > > This means, the build system depends on more external tools. >>From the users' point of view, they will need to install > flex, bison, gperf in order to build the kernel. >>From the developers' point of view, the advantage is > we do not need to version-control generated files, i.e. _shipped files > will be deleted. > > I'd like to know if this is acceptable or not. > > For example, currently some files are simply shipped (copied) > when building the kconfig program. > > $ make mrproper; make defconfig > HOSTCC scripts/basic/fixdep > HOSTCC scripts/kconfig/conf.o > SHIPPED scripts/kconfig/zconf.tab.c > SHIPPED scripts/kconfig/zconf.lex.c > SHIPPED scripts/kconfig/zconf.hash.c > HOSTCC scripts/kconfig/zconf.tab.o > HOSTLD scripts/kconfig/conf > *** Default configuration is based on 'x86_64_defconfig' > # > # configuration written to .config > # > > With this series, they are created from *real* sources > (*.y, *.l, *.gperf files). > > $ make mrproper; make defconfig > HOSTCC scripts/basic/fixdep > HOSTCC scripts/kconfig/conf.o > YACC scripts/kconfig/zconf.tab.c > LEX scripts/kconfig/zconf.lex.c > GPERF scripts/kconfig/zconf.hash.c > HOSTCC scripts/kconfig/zconf.tab.o > HOSTLD scripts/kconfig/conf > *** Default configuration is based on 'x86_64_defconfig' > # > # configuration written to .config > # > > Note: > The tool versions in Documentation/process/changes.rst are just > place-holders for now. We need to figure out the minimal versions > if we like to switch to this approach. > > > > Masahiro Yamada (3): > kbuild: generate *.hash.c during build > kbuild: generate *.lex.c during build > kbuild: generate *.tab.c and *.tab.h during build > > Documentation/process/changes.rst | 36 + > scripts/Makefile.lib | 26 +- > scripts/dtc/Makefile | 6 +- > scripts/dtc/dtc-lexer.lex.c_shipped | 2259 --------------------------- > scripts/dtc/dtc-parser.tab.c_shipped | 2303 ---------------------------- > scripts/dtc/dtc-parser.tab.h_shipped | 125 -- > scripts/genksyms/Makefile | 4 +- > scripts/genksyms/keywords.hash.c_shipped | 230 --- > scripts/genksyms/lex.lex.c_shipped | 2291 --------------------------- > scripts/genksyms/parse.tab.c_shipped | 2394 ----------------------------- > scripts/genksyms/parse.tab.h_shipped | 119 -- > scripts/kconfig/Makefile | 1 + > scripts/kconfig/zconf.hash.c_shipped | 297 ---- > scripts/kconfig/zconf.lex.c_shipped | 2473 ------------------------------ > scripts/kconfig/zconf.tab.c_shipped | 2471 ----------------------------- > 15 files changed, 53 insertions(+), 14982 deletions(-) > delete mode 100644 scripts/dtc/dtc-lexer.lex.c_shipped > delete mode 100644 scripts/dtc/dtc-parser.tab.c_shipped > delete mode 100644 scripts/dtc/dtc-parser.tab.h_shipped > delete mode 100644 scripts/genksyms/keywords.hash.c_shipped > delete mode 100644 scripts/genksyms/lex.lex.c_shipped > delete mode 100644 scripts/genksyms/parse.tab.c_shipped > delete mode 100644 scripts/genksyms/parse.tab.h_shipped > delete mode 100644 scripts/kconfig/zconf.hash.c_shipped > delete mode 100644 scripts/kconfig/zconf.lex.c_shipped > delete mode 100644 scripts/kconfig/zconf.tab.c_shipped > ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [RFC PATCH 0/3] kbuild: generate intermediate C files instead of copying _shipped files 2017-08-19 8:49 [RFC PATCH 0/3] kbuild: generate intermediate C files instead of copying _shipped files Masahiro Yamada 2017-08-19 8:49 ` [RFC PATCH 1/3] kbuild: generate *.hash.c during build Masahiro Yamada 2017-08-19 11:31 ` [RFC PATCH 0/3] kbuild: generate intermediate C files instead of copying _shipped files Cao jin @ 2017-08-19 17:03 ` Linus Torvalds 2017-08-19 17:14 ` Linus Torvalds [not found] ` <1503132577-24423-4-git-send-email-yamada.masahiro@socionext.com> 3 siblings, 1 reply; 16+ messages in thread From: Linus Torvalds @ 2017-08-19 17:03 UTC (permalink / raw) To: Masahiro Yamada Cc: Sam Ravnborg, Michal Marek, Linux Kbuild mailing list, devicetree, Rob Herring, Jonathan Corbet, Richard Purdie, Greg Kroah-Hartman, Andrew Morton, Mauro Carvalho Chehab, Nicholas Piggin, open list:DOCUMENTATION, Markus Heiser, Linux Kernel Mailing List, Frank Rowand, Rob Herring, SeongJae Park, Yann E. MORIN On Sat, Aug 19, 2017 at 1:49 AM, Masahiro Yamada <yamada.masahiro@socionext.com> wrote: > > Here is one question. Is it acceptable to use those rules all the time? > That is, generate those C files by flex, bison, gperf during the > kernel building. Yeah, I think we probably should do that. However, when I just tested, I noticed that we have issues with re-generating those files. With gperf 3.1 installed, I get In file included from scripts/kconfig/zconf.tab.c:213:0: scripts/kconfig/zconf.gperf:147:1: error: conflicting types for ‘kconf_id_lookup’ scripts/kconfig/zconf.gperf:12:31: note: previous declaration of ‘kconf_id_lookup’ was here static const struct kconf_id *kconf_id_lookup(register const char *str, register unsigned int len); ^~~~~~~~~~~~~~~ because gperf now generates const struct kconf_id * -kconf_id_lookup (register const char *str, register unsigned int len) +kconf_id_lookup (register const char *str, register size_t len) and I'm not sure how to detect that automatically. It seems to be a gperf-3.1 change, and gperf doesn't seem to generate any version markers. Working around that, I hit: In file included from scripts/genksyms/lex.lex.c:1921:0: scripts/genksyms/keywords.gperf:54:1: error: conflicting types for ‘is_reserved_word’ static, STATIC_KEYW ^~~~~~~~~~~~~~~~ In file included from scripts/genksyms/lex.lex.c:1921:0: scripts/genksyms/keywords.gperf:6:30: note: previous declaration of ‘is_reserved_word’ was here static const struct resword *is_reserved_word(register const char *str, register unsigned int len); ^~~~~~~~~~~~~~~~ so we have at least two cases of this in the source tree. So one of the advantages of the pre-shipped files is that we can avoid that kind of crazy version issues with the tools. But if we can solve the versioning thing easily, I certainly don't mind getting rid of the pre-generated files. Having to have flex/bison/gperf isn't a huge onus on the kernel build system. Linus ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [RFC PATCH 0/3] kbuild: generate intermediate C files instead of copying _shipped files 2017-08-19 17:03 ` Linus Torvalds @ 2017-08-19 17:14 ` Linus Torvalds 2017-08-19 18:12 ` Linus Torvalds 2017-09-08 6:18 ` Masahiro Yamada 0 siblings, 2 replies; 16+ messages in thread From: Linus Torvalds @ 2017-08-19 17:14 UTC (permalink / raw) To: Masahiro Yamada Cc: Sam Ravnborg, Michal Marek, Linux Kbuild mailing list, devicetree, Rob Herring, Jonathan Corbet, Richard Purdie, Greg Kroah-Hartman, Andrew Morton, Mauro Carvalho Chehab, Nicholas Piggin, open list:DOCUMENTATION, Markus Heiser, Linux Kernel Mailing List, Frank Rowand, Rob Herring, SeongJae Park, Yann E. MORIN On Sat, Aug 19, 2017 at 10:03 AM, Linus Torvalds <torvalds@linux-foundation.org> wrote: > > So one of the advantages of the pre-shipped files is that we can avoid > that kind of crazy version issues with the tools. Side note: the traditional way to handle this is autoconf etc. Since I think autoconf is evil crap, I refuse to have anything what-so-ever to do with it. gperf is clearly written by clowns that don't understand about compatibility issues - it would have been trivial for them to add some kind of marker define so that you could test for this directly rather than depend on some kind of autoconf "try to build and see if it fails" crap. So I think the best option would be to jhust get rid of gperf, and use a normal hash function instead (even if it isn't "perfect" - it's not like perfect hashes are so wonderful). I wonder if those two ID lookups are even worth hashing at all - the arrays aren't so big, and the uses aren't so timing-critical, so it's entirely possible that we could just get rid of any hashing at all and just use some stupid linear search thing. I assume that flex/bison are stable enough that we don't have the same kind of annoying stupid version issues with it. Anybody want to look at just getting rid of the gperf use? Linus ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [RFC PATCH 0/3] kbuild: generate intermediate C files instead of copying _shipped files 2017-08-19 17:14 ` Linus Torvalds @ 2017-08-19 18:12 ` Linus Torvalds 2017-09-08 6:18 ` Masahiro Yamada 1 sibling, 0 replies; 16+ messages in thread From: Linus Torvalds @ 2017-08-19 18:12 UTC (permalink / raw) To: Masahiro Yamada Cc: Sam Ravnborg, Michal Marek, Linux Kbuild mailing list, devicetree, Rob Herring, Jonathan Corbet, Richard Purdie, Greg Kroah-Hartman, Andrew Morton, Mauro Carvalho Chehab, Nicholas Piggin, open list:DOCUMENTATION, Markus Heiser, Linux Kernel Mailing List, Frank Rowand, Rob Herring, SeongJae Park, Yann E. MORIN [-- Attachment #1: Type: text/plain, Size: 879 bytes --] On Sat, Aug 19, 2017 at 10:14 AM, Linus Torvalds <torvalds@linux-foundation.org> wrote: > > Anybody want to look at just getting rid of the gperf use? I took a stab at it. It wasn't too bad, although I think this needs a *lot* of testing, and I think it needs checking of Makefile dependencies etc. NOTE NOTE NOTE! This may be *COMPLETELY* broken. It just happens to build for me. So when I say "it wasn't too bad", I really mean "it wasn't too bad, but I didn't spend a lot of effort on it either". Honestly, the code is better and more legible without gperf, imho. And it removes more lines than it adds - and even if you ignore changes to the shipped lines, it's only an additional 15 lines of code, It's likely not even any slower, but who the hell knows.. Do we even care? It's almost certainly faster if you compare to generating that gperf code. Linus [-- Attachment #2: 0001-Remove-gperf-usage-from-toolchain.patch --] [-- Type: text/x-patch, Size: 39163 bytes --] From bb3290d91695bb1ae78ab86f18fb4d7ad8e5ebcc Mon Sep 17 00:00:00 2001 From: Linus Torvalds <torvalds@linux-foundation.org> Date: Sat, 19 Aug 2017 10:17:02 -0700 Subject: [PATCH] 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> --- Documentation/dontdiff | 1 - scripts/genksyms/Makefile | 4 +- scripts/genksyms/keywords.c | 74 ++++++++ scripts/genksyms/keywords.gperf | 61 ------- scripts/genksyms/keywords.hash.c_shipped | 230 ------------------------ scripts/genksyms/lex.l | 8 +- scripts/genksyms/lex.lex.c_shipped | 8 +- scripts/kconfig/.gitignore | 1 - scripts/kconfig/Makefile | 4 +- scripts/kconfig/kconf_id.c | 54 ++++++ scripts/kconfig/lkc.h | 2 +- scripts/kconfig/zconf.gperf | 50 ------ scripts/kconfig/zconf.hash.c_shipped | 297 ------------------------------- scripts/kconfig/zconf.tab.c_shipped | 10 +- scripts/kconfig/zconf.y | 10 +- 15 files changed, 151 insertions(+), 663 deletions(-) create mode 100644 scripts/genksyms/keywords.c delete mode 100644 scripts/genksyms/keywords.gperf delete mode 100644 scripts/genksyms/keywords.hash.c_shipped create mode 100644 scripts/kconfig/kconf_id.c delete mode 100644 scripts/kconfig/zconf.gperf delete mode 100644 scripts/kconfig/zconf.hash.c_shipped diff --git a/Documentation/dontdiff b/Documentation/dontdiff index 358b47c06ad4..2228fcc8e29f 100644 --- a/Documentation/dontdiff +++ b/Documentation/dontdiff @@ -259,5 +259,4 @@ wakeup.bin wakeup.elf wakeup.lds zImage* -zconf.hash.c zoffset.h 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) 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 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 @@ +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; +} 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 @@ -%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 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 @@ -/* 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; -} 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 ([~%^&*+=|<>/-]=)|(&&)|("||")|(->)|(<<)|(>>) /* 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; 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 ) /* 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; diff --git a/scripts/kconfig/.gitignore b/scripts/kconfig/.gitignore index be603c4fef62..51f1c877b543 100644 --- a/scripts/kconfig/.gitignore +++ b/scripts/kconfig/.gitignore @@ -5,7 +5,6 @@ config* *.lex.c *.tab.c *.tab.h -zconf.hash.c *.moc gconf.glade.h *.pot diff --git a/scripts/kconfig/Makefile b/scripts/kconfig/Makefile index eb8144643b78..8c12c20c55a6 100644 --- a/scripts/kconfig/Makefile +++ b/scripts/kconfig/Makefile @@ -191,7 +191,7 @@ gconf-objs := gconf.o zconf.tab.o hostprogs-y := conf nconf mconf kxgettext qconf gconf clean-files := qconf.moc .tmp_qtcheck .tmp_gtkcheck -clean-files += zconf.tab.c zconf.lex.c zconf.hash.c gconf.glade.h +clean-files += zconf.tab.c zconf.lex.c gconf.glade.h clean-files += config.pot linux.pot # Check that we have the required ncurses stuff installed for lxdialog (menuconfig) @@ -280,7 +280,7 @@ $(obj)/.tmp_gtkcheck: fi endif -$(obj)/zconf.tab.o: $(obj)/zconf.lex.c $(obj)/zconf.hash.c +$(obj)/zconf.tab.o: $(obj)/zconf.lex.c $(obj)/qconf.o: $(obj)/qconf.moc diff --git a/scripts/kconfig/kconf_id.c b/scripts/kconfig/kconf_id.c new file mode 100644 index 000000000000..5abbc728fbc4 --- /dev/null +++ b/scripts/kconfig/kconf_id.c @@ -0,0 +1,54 @@ + +static struct kconf_id kconf_id_array[] = { + { "mainmenu", T_MAINMENU, TF_COMMAND }, + { "menu", T_MENU, TF_COMMAND }, + { "endmenu", T_ENDMENU, TF_COMMAND }, + { "source", T_SOURCE, TF_COMMAND }, + { "choice", T_CHOICE, TF_COMMAND }, + { "endchoice", T_ENDCHOICE, TF_COMMAND }, + { "comment", T_COMMENT, TF_COMMAND }, + { "config", T_CONFIG, TF_COMMAND }, + { "menuconfig", T_MENUCONFIG, TF_COMMAND }, + { "help", T_HELP, TF_COMMAND }, + { "---help---", T_HELP, TF_COMMAND }, + { "if", T_IF, TF_COMMAND|TF_PARAM }, + { "endif", T_ENDIF, TF_COMMAND }, + { "depends", T_DEPENDS, TF_COMMAND }, + { "optional", T_OPTIONAL, TF_COMMAND }, + { "default", T_DEFAULT, TF_COMMAND, S_UNKNOWN }, + { "prompt", T_PROMPT, TF_COMMAND }, + { "tristate", T_TYPE, TF_COMMAND, S_TRISTATE }, + { "def_tristate", T_DEFAULT, TF_COMMAND, S_TRISTATE }, + { "bool", T_TYPE, TF_COMMAND, S_BOOLEAN }, + { "boolean", T_TYPE, TF_COMMAND, S_BOOLEAN }, + { "def_bool", T_DEFAULT, TF_COMMAND, S_BOOLEAN }, + { "int", T_TYPE, TF_COMMAND, S_INT }, + { "hex", T_TYPE, TF_COMMAND, S_HEX }, + { "string", T_TYPE, TF_COMMAND, S_STRING }, + { "select", T_SELECT, TF_COMMAND }, + { "imply", T_IMPLY, TF_COMMAND }, + { "range", T_RANGE, TF_COMMAND }, + { "visible", T_VISIBLE, TF_COMMAND }, + { "option", T_OPTION, TF_COMMAND }, + { "on", T_ON, TF_PARAM }, + { "modules", T_OPT_MODULES, TF_OPTION }, + { "defconfig_list", T_OPT_DEFCONFIG_LIST, TF_OPTION }, + { "env", T_OPT_ENV, TF_OPTION }, + { "allnoconfig_y", T_OPT_ALLNOCONFIG_Y, TF_OPTION }, +}; + +#define KCONF_ID_ARRAY_SIZE (sizeof(kconf_id_array)/sizeof(struct kconf_id)) + +static const struct kconf_id *kconf_id_lookup(register const char *str, register unsigned int len) +{ + int i; + + for (i = 0; i < KCONF_ID_ARRAY_SIZE; i++) { + struct kconf_id *id = kconf_id_array+i; + int l = strlen(id->name); + + if (len == l && !memcmp(str, id->name, len)) + return id; + } + return NULL; +} diff --git a/scripts/kconfig/lkc.h b/scripts/kconfig/lkc.h index 91ca126ea080..cdcbe43e87b3 100644 --- a/scripts/kconfig/lkc.h +++ b/scripts/kconfig/lkc.h @@ -62,7 +62,7 @@ enum conf_def_mode { #define T_OPT_ALLNOCONFIG_Y 4 struct kconf_id { - int name; + const char *name; int token; unsigned int flags; enum symbol_type stype; diff --git a/scripts/kconfig/zconf.gperf b/scripts/kconfig/zconf.gperf deleted file mode 100644 index ead02edec936..000000000000 --- a/scripts/kconfig/zconf.gperf +++ /dev/null @@ -1,50 +0,0 @@ -%language=ANSI-C -%define hash-function-name kconf_id_hash -%define lookup-function-name kconf_id_lookup -%define string-pool-name kconf_id_strings -%compare-strncmp -%enum -%pic -%struct-type - -struct kconf_id; - -static const struct kconf_id *kconf_id_lookup(register const char *str, register unsigned int len); - -%% -mainmenu, T_MAINMENU, TF_COMMAND -menu, T_MENU, TF_COMMAND -endmenu, T_ENDMENU, TF_COMMAND -source, T_SOURCE, TF_COMMAND -choice, T_CHOICE, TF_COMMAND -endchoice, T_ENDCHOICE, TF_COMMAND -comment, T_COMMENT, TF_COMMAND -config, T_CONFIG, TF_COMMAND -menuconfig, T_MENUCONFIG, TF_COMMAND -help, T_HELP, TF_COMMAND ----help---, T_HELP, TF_COMMAND -if, T_IF, TF_COMMAND|TF_PARAM -endif, T_ENDIF, TF_COMMAND -depends, T_DEPENDS, TF_COMMAND -optional, T_OPTIONAL, TF_COMMAND -default, T_DEFAULT, TF_COMMAND, S_UNKNOWN -prompt, T_PROMPT, TF_COMMAND -tristate, T_TYPE, TF_COMMAND, S_TRISTATE -def_tristate, T_DEFAULT, TF_COMMAND, S_TRISTATE -bool, T_TYPE, TF_COMMAND, S_BOOLEAN -boolean, T_TYPE, TF_COMMAND, S_BOOLEAN -def_bool, T_DEFAULT, TF_COMMAND, S_BOOLEAN -int, T_TYPE, TF_COMMAND, S_INT -hex, T_TYPE, TF_COMMAND, S_HEX -string, T_TYPE, TF_COMMAND, S_STRING -select, T_SELECT, TF_COMMAND -imply, T_IMPLY, TF_COMMAND -range, T_RANGE, TF_COMMAND -visible, T_VISIBLE, TF_COMMAND -option, T_OPTION, TF_COMMAND -on, T_ON, TF_PARAM -modules, T_OPT_MODULES, TF_OPTION -defconfig_list, T_OPT_DEFCONFIG_LIST,TF_OPTION -env, T_OPT_ENV, TF_OPTION -allnoconfig_y, T_OPT_ALLNOCONFIG_Y,TF_OPTION -%% diff --git a/scripts/kconfig/zconf.hash.c_shipped b/scripts/kconfig/zconf.hash.c_shipped deleted file mode 100644 index d51b15de074a..000000000000 --- a/scripts/kconfig/zconf.hash.c_shipped +++ /dev/null @@ -1,297 +0,0 @@ -/* ANSI-C code produced by gperf version 3.0.4 */ -/* Command-line: gperf -t --output-file scripts/kconfig/zconf.hash.c_shipped -a -C -E -g -k '1,3,$' -p -t scripts/kconfig/zconf.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 10 "scripts/kconfig/zconf.gperf" -struct kconf_id; - -static const struct kconf_id *kconf_id_lookup(register const char *str, register unsigned int len); -/* maximum key range = 71, duplicates = 0 */ - -#ifdef __GNUC__ -__inline -#else -#ifdef __cplusplus -inline -#endif -#endif -static unsigned int -kconf_id_hash (register const char *str, register unsigned int len) -{ - static const unsigned char asso_values[] = - { - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 0, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 10, 25, 25, - 0, 0, 0, 5, 0, 0, 73, 73, 5, 0, - 10, 5, 45, 73, 20, 20, 0, 15, 15, 73, - 20, 0, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73 - }; - register int hval = len; - - switch (hval) - { - default: - hval += asso_values[(unsigned char)str[2]]; - /*FALLTHROUGH*/ - case 2: - case 1: - hval += asso_values[(unsigned char)str[0]]; - break; - } - return hval + asso_values[(unsigned char)str[len - 1]]; -} - -struct kconf_id_strings_t - { - char kconf_id_strings_str2[sizeof("if")]; - char kconf_id_strings_str3[sizeof("int")]; - char kconf_id_strings_str5[sizeof("endif")]; - char kconf_id_strings_str7[sizeof("default")]; - char kconf_id_strings_str8[sizeof("tristate")]; - char kconf_id_strings_str9[sizeof("endchoice")]; - char kconf_id_strings_str10[sizeof("---help---")]; - char kconf_id_strings_str12[sizeof("def_tristate")]; - char kconf_id_strings_str13[sizeof("def_bool")]; - char kconf_id_strings_str14[sizeof("defconfig_list")]; - char kconf_id_strings_str17[sizeof("on")]; - char kconf_id_strings_str18[sizeof("optional")]; - char kconf_id_strings_str21[sizeof("option")]; - char kconf_id_strings_str22[sizeof("endmenu")]; - char kconf_id_strings_str23[sizeof("mainmenu")]; - char kconf_id_strings_str25[sizeof("menuconfig")]; - char kconf_id_strings_str27[sizeof("modules")]; - char kconf_id_strings_str28[sizeof("allnoconfig_y")]; - char kconf_id_strings_str29[sizeof("menu")]; - char kconf_id_strings_str31[sizeof("select")]; - char kconf_id_strings_str32[sizeof("comment")]; - char kconf_id_strings_str33[sizeof("env")]; - char kconf_id_strings_str35[sizeof("range")]; - char kconf_id_strings_str36[sizeof("choice")]; - char kconf_id_strings_str39[sizeof("bool")]; - char kconf_id_strings_str41[sizeof("source")]; - char kconf_id_strings_str42[sizeof("visible")]; - char kconf_id_strings_str43[sizeof("hex")]; - char kconf_id_strings_str46[sizeof("config")]; - char kconf_id_strings_str47[sizeof("boolean")]; - char kconf_id_strings_str50[sizeof("imply")]; - char kconf_id_strings_str51[sizeof("string")]; - char kconf_id_strings_str54[sizeof("help")]; - char kconf_id_strings_str56[sizeof("prompt")]; - char kconf_id_strings_str72[sizeof("depends")]; - }; -static const struct kconf_id_strings_t kconf_id_strings_contents = - { - "if", - "int", - "endif", - "default", - "tristate", - "endchoice", - "---help---", - "def_tristate", - "def_bool", - "defconfig_list", - "on", - "optional", - "option", - "endmenu", - "mainmenu", - "menuconfig", - "modules", - "allnoconfig_y", - "menu", - "select", - "comment", - "env", - "range", - "choice", - "bool", - "source", - "visible", - "hex", - "config", - "boolean", - "imply", - "string", - "help", - "prompt", - "depends" - }; -#define kconf_id_strings ((const char *) &kconf_id_strings_contents) -#ifdef __GNUC__ -__inline -#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__ -__attribute__ ((__gnu_inline__)) -#endif -#endif -const struct kconf_id * -kconf_id_lookup (register const char *str, register unsigned int len) -{ - enum - { - TOTAL_KEYWORDS = 35, - MIN_WORD_LENGTH = 2, - MAX_WORD_LENGTH = 14, - MIN_HASH_VALUE = 2, - MAX_HASH_VALUE = 72 - }; - - static const struct kconf_id wordlist[] = - { - {-1}, {-1}, -#line 26 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str2, T_IF, TF_COMMAND|TF_PARAM}, -#line 37 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str3, T_TYPE, TF_COMMAND, S_INT}, - {-1}, -#line 27 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str5, T_ENDIF, TF_COMMAND}, - {-1}, -#line 30 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str7, T_DEFAULT, TF_COMMAND, S_UNKNOWN}, -#line 32 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str8, T_TYPE, TF_COMMAND, S_TRISTATE}, -#line 20 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str9, T_ENDCHOICE, TF_COMMAND}, -#line 25 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str10, T_HELP, TF_COMMAND}, - {-1}, -#line 33 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str12, T_DEFAULT, TF_COMMAND, S_TRISTATE}, -#line 36 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str13, T_DEFAULT, TF_COMMAND, S_BOOLEAN}, -#line 47 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str14, T_OPT_DEFCONFIG_LIST,TF_OPTION}, - {-1}, {-1}, -#line 45 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str17, T_ON, TF_PARAM}, -#line 29 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str18, T_OPTIONAL, TF_COMMAND}, - {-1}, {-1}, -#line 44 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str21, T_OPTION, TF_COMMAND}, -#line 17 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str22, T_ENDMENU, TF_COMMAND}, -#line 15 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str23, T_MAINMENU, TF_COMMAND}, - {-1}, -#line 23 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str25, T_MENUCONFIG, TF_COMMAND}, - {-1}, -#line 46 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str27, T_OPT_MODULES, TF_OPTION}, -#line 49 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str28, T_OPT_ALLNOCONFIG_Y,TF_OPTION}, -#line 16 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str29, T_MENU, TF_COMMAND}, - {-1}, -#line 40 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str31, T_SELECT, TF_COMMAND}, -#line 21 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str32, T_COMMENT, TF_COMMAND}, -#line 48 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str33, T_OPT_ENV, TF_OPTION}, - {-1}, -#line 42 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str35, T_RANGE, TF_COMMAND}, -#line 19 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str36, T_CHOICE, TF_COMMAND}, - {-1}, {-1}, -#line 34 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str39, T_TYPE, TF_COMMAND, S_BOOLEAN}, - {-1}, -#line 18 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str41, T_SOURCE, TF_COMMAND}, -#line 43 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str42, T_VISIBLE, TF_COMMAND}, -#line 38 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str43, T_TYPE, TF_COMMAND, S_HEX}, - {-1}, {-1}, -#line 22 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str46, T_CONFIG, TF_COMMAND}, -#line 35 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str47, T_TYPE, TF_COMMAND, S_BOOLEAN}, - {-1}, {-1}, -#line 41 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str50, T_IMPLY, TF_COMMAND}, -#line 39 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str51, T_TYPE, TF_COMMAND, S_STRING}, - {-1}, {-1}, -#line 24 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str54, T_HELP, TF_COMMAND}, - {-1}, -#line 31 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str56, T_PROMPT, TF_COMMAND}, - {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, - {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, -#line 28 "scripts/kconfig/zconf.gperf" - {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str72, T_DEPENDS, TF_COMMAND} - }; - - if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) - { - register int key = kconf_id_hash (str, len); - - if (key <= MAX_HASH_VALUE && key >= 0) - { - register int o = wordlist[key].name; - if (o >= 0) - { - register const char *s = o + kconf_id_strings; - - if (*str == *s && !strncmp (str + 1, s + 1, len - 1) && s[len] == '\0') - return &wordlist[key]; - } - } - } - return 0; -} -#line 50 "scripts/kconfig/zconf.gperf" - diff --git a/scripts/kconfig/zconf.tab.c_shipped b/scripts/kconfig/zconf.tab.c_shipped index 65b7515a577c..a22b285d759f 100644 --- a/scripts/kconfig/zconf.tab.c_shipped +++ b/scripts/kconfig/zconf.tab.c_shipped @@ -209,8 +209,8 @@ int zconfparse (void); /* Copy the second part of user declarations. */ -/* Include zconf.hash.c here so it can see the token constants. */ -#include "zconf.hash.c" +/* Include kconf_id.c here so it can see the token constants. */ +#include "kconf_id.c" @@ -1515,7 +1515,7 @@ yyreduce: case 12: { - zconf_error("unexpected option \"%s\"", kconf_id_strings + (yyvsp[-2].id)->name); + zconf_error("unexpected option \"%s\"", (yyvsp[-2].id)->name); } break; @@ -2268,13 +2268,13 @@ static bool zconf_endtoken(const struct kconf_id *id, int starttoken, int endtok { if (id->token != endtoken) { zconf_error("unexpected '%s' within %s block", - kconf_id_strings + id->name, zconf_tokenname(starttoken)); + id->name, zconf_tokenname(starttoken)); zconfnerrs++; return false; } if (current_menu->file != current_file) { zconf_error("'%s' in different file than '%s'", - kconf_id_strings + id->name, zconf_tokenname(starttoken)); + id->name, zconf_tokenname(starttoken)); fprintf(stderr, "%s:%d: location of the '%s'\n", current_menu->file->name, current_menu->lineno, zconf_tokenname(starttoken)); diff --git a/scripts/kconfig/zconf.y b/scripts/kconfig/zconf.y index 001305fa080b..c8f396c3b190 100644 --- a/scripts/kconfig/zconf.y +++ b/scripts/kconfig/zconf.y @@ -101,8 +101,8 @@ static struct menu *current_menu, *current_entry; } if_entry menu_entry choice_entry %{ -/* Include zconf.hash.c here so it can see the token constants. */ -#include "zconf.hash.c" +/* Include zconf_id.c here so it can see the token constants. */ +#include "kconf_id.c" %} %% @@ -119,7 +119,7 @@ stmt_list: | stmt_list T_WORD error T_EOL { zconf_error("unknown statement \"%s\"", $2); } | stmt_list option_name error T_EOL { - zconf_error("unexpected option \"%s\"", kconf_id_strings + $2->name); + zconf_error("unexpected option \"%s\"", $2->name); } | stmt_list error T_EOL { zconf_error("invalid statement"); } ; @@ -551,13 +551,13 @@ static bool zconf_endtoken(const struct kconf_id *id, int starttoken, int endtok { if (id->token != endtoken) { zconf_error("unexpected '%s' within %s block", - kconf_id_strings + id->name, zconf_tokenname(starttoken)); + id->name, zconf_tokenname(starttoken)); zconfnerrs++; return false; } if (current_menu->file != current_file) { zconf_error("'%s' in different file than '%s'", - kconf_id_strings + id->name, zconf_tokenname(starttoken)); + id->name, zconf_tokenname(starttoken)); fprintf(stderr, "%s:%d: location of the '%s'\n", current_menu->file->name, current_menu->lineno, zconf_tokenname(starttoken)); -- 2.14.0.rc1.2.g4c8247ec3 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [RFC PATCH 0/3] kbuild: generate intermediate C files instead of copying _shipped files 2017-08-19 17:14 ` Linus Torvalds 2017-08-19 18:12 ` Linus Torvalds @ 2017-09-08 6:18 ` Masahiro Yamada 2017-09-08 17:22 ` Linus Torvalds 1 sibling, 1 reply; 16+ messages in thread From: Masahiro Yamada @ 2017-09-08 6:18 UTC (permalink / raw) To: Linus Torvalds Cc: Sam Ravnborg, Michal Marek, Linux Kbuild mailing list, devicetree, Rob Herring, Jonathan Corbet, Richard Purdie, Greg Kroah-Hartman, Andrew Morton, Mauro Carvalho Chehab, Nicholas Piggin, open list:DOCUMENTATION, Markus Heiser, Linux Kernel Mailing List, Frank Rowand, Rob Herring, SeongJae Park, Yann E. MORIN Hi Linus, Very sorry that I had not responded quickly. When I was digging into tool version dependency, as you pointed out, gperf is a problem (but seemed one time breakage for gperf 3.1) flex seemed very stable for a long time. bison seemed a bit problem if old version is used. But, I did not have enough time to take a closer look. I thought I should respond after I tested more, but I has been pressed by my daily tasks, then time passed... Very sorry. Today, I just noticed gperf usage got dropped from the kernel. If CONFIG_MODVERSIONS is enabled, I notice lots of error messages. WARNING: EXPORT symbol "finish_open" [vmlinux] version generation failed, symbol will not be So, I think something was broken in scripts/genksyms/. Of course, it was a trivial conversion, so it should not be hard to fix... > gperf is clearly written by clowns that don't understand about > compatibility issues - it would have been trivial for them to add some > kind of marker define so that you could test for this directly rather > than depend on some kind of autoconf "try to build and see if it > fails" crap. One idea may be to process the output of "gperf -v" and embed GPERF_VERSION into the output .c files. But, if you are unhappy with gperf breakage this time, we can live without gperf. > It's likely not even any slower, but who the hell knows.. Do we even > care? It's almost certainly faster if you compare to generating that > gperf code. > For scripts/kconfig/, I think we do not care at all because we usually invoke it just once when we configure the build setting. If we enable CONFIG_MODVERSIONS, scripts/genksyms/ is invoked over and over again. Sorry, I have not evaluated if the perfect hash gives us noticeable advantage or not.. -- Best Regards Masahiro Yamada ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [RFC PATCH 0/3] kbuild: generate intermediate C files instead of copying _shipped files 2017-09-08 6:18 ` Masahiro Yamada @ 2017-09-08 17:22 ` Linus Torvalds 2017-09-08 18:01 ` Linus Torvalds 0 siblings, 1 reply; 16+ messages in thread From: Linus Torvalds @ 2017-09-08 17:22 UTC (permalink / raw) To: Masahiro Yamada Cc: Sam Ravnborg, Michal Marek, Linux Kbuild mailing list, devicetree, Rob Herring, Jonathan Corbet, Richard Purdie, Greg Kroah-Hartman, Andrew Morton, Mauro Carvalho Chehab, Nicholas Piggin, open list:DOCUMENTATION, Markus Heiser, Linux Kernel Mailing List, Frank Rowand, Rob Herring, SeongJae Park, Yann E. MORIN On Thu, Sep 7, 2017 at 11:18 PM, Masahiro Yamada <yamada.masahiro@socionext.com> wrote: > > If CONFIG_MODVERSIONS is enabled, > I notice lots of error messages. > WARNING: EXPORT symbol "finish_open" [vmlinux] version generation > failed, symbol will not be versioned > > So, I think something was broken in scripts/genksyms/. > > Of course, it was a trivial conversion, so it should not be hard to fix... Indeed, hopefully it would be trivial, but I don't even see the error here. Of course, I only did a "make allmodconfig" to test the MODVERSIONS case, I didn't actually install the modules. Is that error perhaps only detected at install time? I did build and install a kernel with that patch, but that's my actual "real" config for the machine, and it didn't have MODVERSIONS enabled. Oh, how I hate modversions. But I'll take a look if I can see what I did wrong in the "Trivial and Obvious(tm)" conversion. Linus ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [RFC PATCH 0/3] kbuild: generate intermediate C files instead of copying _shipped files 2017-09-08 17:22 ` Linus Torvalds @ 2017-09-08 18:01 ` Linus Torvalds 2017-09-08 18:39 ` Linus Torvalds 0 siblings, 1 reply; 16+ messages in thread From: Linus Torvalds @ 2017-09-08 18:01 UTC (permalink / raw) To: Masahiro Yamada Cc: Sam Ravnborg, Michal Marek, Linux Kbuild mailing list, devicetree, Rob Herring, Jonathan Corbet, Richard Purdie, Greg Kroah-Hartman, Andrew Morton, Mauro Carvalho Chehab, Nicholas Piggin, open list:DOCUMENTATION, Markus Heiser, Linux Kernel Mailing List, Frank Rowand, Rob Herring, SeongJae Park, Yann E. MORIN On Fri, Sep 8, 2017 at 10:22 AM, Linus Torvalds <torvalds@linux-foundation.org> wrote: > > Of course, I only did a "make allmodconfig" to test the MODVERSIONS > case, I didn't actually install the modules. Is that error perhaps > only detected at install time? Oh, I take that back. I just got a ton of warnings with my allmodconfig after doing a "git clean -dqfx". So I guess there is a dependency issue - my normal build test after the merge didn't show any issues, simply because the change in ksymoops didn't actually cause the version information to be re-generated. It doesn't seem to happen for every exported symbol, though. Odd. Looking at it, but not making sense of it yet. Linus ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [RFC PATCH 0/3] kbuild: generate intermediate C files instead of copying _shipped files 2017-09-08 18:01 ` Linus Torvalds @ 2017-09-08 18:39 ` Linus Torvalds 2017-09-08 21:38 ` Linus Torvalds 0 siblings, 1 reply; 16+ messages in thread From: Linus Torvalds @ 2017-09-08 18:39 UTC (permalink / raw) To: Masahiro Yamada Cc: Sam Ravnborg, Michal Marek, Linux Kbuild mailing list, devicetree, Rob Herring, Jonathan Corbet, Richard Purdie, Greg Kroah-Hartman, Andrew Morton, Mauro Carvalho Chehab, Nicholas Piggin, open list:DOCUMENTATION, Markus Heiser, Linux Kernel Mailing List, Frank Rowand, Rob Herring, SeongJae Park, Yann E. MORIN On Fri, Sep 8, 2017 at 11:01 AM, Linus Torvalds <torvalds@linux-foundation.org> wrote: > > It doesn't seem to happen for every exported symbol, though. Odd. Fascinating. Picking one file at random that shows this, I did net/ceph/mon_client.c. The version file that gets generated for that looks like this: __crc_ceph_monc_want_map = 0x3389a57e; __crc_ceph_monc_got_map = 0x707f45a2; __crc_ceph_monc_renew_subs = 0x9842030a; __crc_ceph_monc_wait_osdmap = 0xfe38746d; __crc_ceph_monc_open_session = 0xc9ba8a19; __crc_ceph_monc_do_statfs = 0xe878801b; __crc_ceph_monc_get_version = 0xfaac6ce0; __crc_ceph_monc_get_version_async = 0x3adefe28; __crc_ceph_monc_blacklist_add = 0xee71d0ef; __crc_ceph_monc_init = 0xfce99654; __crc_ceph_monc_stop = 0xb0d197d0; __crc_ceph_monc_validate_auth = 0xce1c6d69; and with the gperf-removal patch, it is 100% identical _except_ that the "__crc_ceph_monc_do_statfs" line is missing. Same hashes for everything else. But one missing line. WTF? What is special about that one particular function vs the other ones in that file? I have absolutely no idea. So the really odd thing here is how things clearly still _work_. The parser works fine for everything else. And looking at the gprof-removal patch it's not at all obvious how everything could work fine except for some random thing. Strange. Does anybody see what the pattern to the failure is? Linus ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [RFC PATCH 0/3] kbuild: generate intermediate C files instead of copying _shipped files 2017-09-08 18:39 ` Linus Torvalds @ 2017-09-08 21:38 ` Linus Torvalds 2017-09-09 6:39 ` Sam Ravnborg 2017-09-10 13:58 ` Masahiro Yamada 0 siblings, 2 replies; 16+ messages in thread From: Linus Torvalds @ 2017-09-08 21:38 UTC (permalink / raw) To: Masahiro Yamada Cc: Sam Ravnborg, Michal Marek, Linux Kbuild mailing list, devicetree, Rob Herring, Jonathan Corbet, Richard Purdie, Greg Kroah-Hartman, Andrew Morton, Mauro Carvalho Chehab, Nicholas Piggin, open list:DOCUMENTATION, Markus Heiser, Linux Kernel Mailing List, Frank Rowand, Rob Herring, SeongJae Park, Yann E. MORIN On Fri, Sep 8, 2017 at 11:39 AM, Linus Torvalds <torvalds@linux-foundation.org> wrote: > > Strange. Does anybody see what the pattern to the failure is? Found it. Stupid special case for 'typeof()' that used is_reserved_word() in ways I hadn't realized. Fix committed. Linus ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [RFC PATCH 0/3] kbuild: generate intermediate C files instead of copying _shipped files 2017-09-08 21:38 ` Linus Torvalds @ 2017-09-09 6:39 ` Sam Ravnborg 2017-09-10 13:59 ` Masahiro Yamada 2017-09-10 13:58 ` Masahiro Yamada 1 sibling, 1 reply; 16+ messages in thread From: Sam Ravnborg @ 2017-09-09 6:39 UTC (permalink / raw) To: Linus Torvalds Cc: Masahiro Yamada, Michal Marek, Linux Kbuild mailing list, devicetree, Rob Herring, Jonathan Corbet, Richard Purdie, Greg Kroah-Hartman, Andrew Morton, Mauro Carvalho Chehab, Nicholas Piggin, open list:DOCUMENTATION, Markus Heiser, Linux Kernel Mailing List, Frank Rowand, Rob Herring, SeongJae Park, Yann E. MORIN On Fri, Sep 08, 2017 at 02:38:23PM -0700, Linus Torvalds wrote: > On Fri, Sep 8, 2017 at 11:39 AM, Linus Torvalds > <torvalds@linux-foundation.org> wrote: > > > > Strange. Does anybody see what the pattern to the failure is? > > Found it. Stupid special case for 'typeof()' that used > is_reserved_word() in ways I hadn't realized. > > Fix committed. To get bonus points for this cleanup you should also remove the now unused gpref support in Makefile.lib Sam ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [RFC PATCH 0/3] kbuild: generate intermediate C files instead of copying _shipped files 2017-09-09 6:39 ` Sam Ravnborg @ 2017-09-10 13:59 ` Masahiro Yamada 0 siblings, 0 replies; 16+ messages in thread From: Masahiro Yamada @ 2017-09-10 13:59 UTC (permalink / raw) To: Sam Ravnborg Cc: Linus Torvalds, Michal Marek, Linux Kbuild mailing list, devicetree, Rob Herring, Jonathan Corbet, Richard Purdie, Greg Kroah-Hartman, Andrew Morton, Mauro Carvalho Chehab, Nicholas Piggin, open list:DOCUMENTATION, Markus Heiser, Linux Kernel Mailing List, Frank Rowand, Rob Herring, SeongJae Park, Yann E. MORIN Hi Sam, 2017-09-09 15:39 GMT+09:00 Sam Ravnborg <sam@ravnborg.org>: > On Fri, Sep 08, 2017 at 02:38:23PM -0700, Linus Torvalds wrote: >> On Fri, Sep 8, 2017 at 11:39 AM, Linus Torvalds >> <torvalds@linux-foundation.org> wrote: >> > >> > Strange. Does anybody see what the pattern to the failure is? >> >> Found it. Stupid special case for 'typeof()' that used >> is_reserved_word() in ways I hadn't realized. >> >> Fix committed. > > To get bonus points for this cleanup you should also remove > the now unused gpref support in Makefile.lib > > Sam Yes. Linus committed c054be10ffd Thanks! -- Best Regards Masahiro Yamada ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [RFC PATCH 0/3] kbuild: generate intermediate C files instead of copying _shipped files 2017-09-08 21:38 ` Linus Torvalds 2017-09-09 6:39 ` Sam Ravnborg @ 2017-09-10 13:58 ` Masahiro Yamada 2017-09-10 16:27 ` Linus Torvalds 1 sibling, 1 reply; 16+ messages in thread From: Masahiro Yamada @ 2017-09-10 13:58 UTC (permalink / raw) To: Linus Torvalds Cc: Sam Ravnborg, Michal Marek, Linux Kbuild mailing list, devicetree, Rob Herring, Jonathan Corbet, Richard Purdie, Greg Kroah-Hartman, Andrew Morton, Mauro Carvalho Chehab, Nicholas Piggin, open list:DOCUMENTATION, Markus Heiser, Linux Kernel Mailing List, Frank Rowand, Rob Herring, SeongJae Park, Yann E. MORIN Hi Linus, 2017-09-09 6:38 GMT+09:00 Linus Torvalds <torvalds@linux-foundation.org>: > On Fri, Sep 8, 2017 at 11:39 AM, Linus Torvalds > <torvalds@linux-foundation.org> wrote: >> >> Strange. Does anybody see what the pattern to the failure is? > > Found it. Stupid special case for 'typeof()' that used > is_reserved_word() in ways I hadn't realized. > > Fix committed. > > Linus "is_reserved_word()" sounds like a boolean function that returns 1 or 0. Maybe, the choice of the function name was not nice. Anyway, thanks a lot for taking care of all this! -- Best Regards Masahiro Yamada ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [RFC PATCH 0/3] kbuild: generate intermediate C files instead of copying _shipped files 2017-09-10 13:58 ` Masahiro Yamada @ 2017-09-10 16:27 ` Linus Torvalds 0 siblings, 0 replies; 16+ messages in thread From: Linus Torvalds @ 2017-09-10 16:27 UTC (permalink / raw) To: Masahiro Yamada Cc: Sam Ravnborg, Michal Marek, Linux Kbuild mailing list, devicetree, Rob Herring, Jonathan Corbet, Richard Purdie, Greg Kroah-Hartman, Andrew Morton, Mauro Carvalho Chehab, Nicholas Piggin, open list:DOCUMENTATION, Markus Heiser, Linux Kernel Mailing List, Frank Rowand, Rob Herring, SeongJae Park, Yann E. MORIN On Sun, Sep 10, 2017 at 6:58 AM, Masahiro Yamada <yamada.masahiro@socionext.com> wrote: > > "is_reserved_word()" sounds like a boolean function > that returns 1 or 0. > Maybe, the choice of the function name was not nice. Yeah, not great name. That's the old name, though - I didn't change that part, I just changed how it used to return the token structure pointer, which would be NULL when it wasn't a keyword. I actually *should* have made it just return 0 for the "not a keyword" case rather than -1, and that would have ended up being semantically closer to the old use (because you could treat the return value as a boolean, like you could with the token pointer). But it's been literally decades since I used bison/flex, and I didn't remember the rules for 'enum yytokentype', so I just thought "negative numbers for error" was safer. Zero would have been fine, no token can have that number anyway (it just means EOF). And negative wasn't safer, it caused that bug due to the bare boolean use I hadn't noticed. Oh well. Linus ^ permalink raw reply [flat|nested] 16+ messages in thread
[parent not found: <1503132577-24423-4-git-send-email-yamada.masahiro@socionext.com>]
* Re: [RFC PATCH 3/3] kbuild: generate *.tab.c and *.tab.h during build [not found] ` <1503132577-24423-4-git-send-email-yamada.masahiro@socionext.com> @ 2017-08-21 17:12 ` Rob Herring 0 siblings, 0 replies; 16+ messages in thread From: Rob Herring @ 2017-08-21 17:12 UTC (permalink / raw) To: Masahiro Yamada Cc: Sam Ravnborg, Michal Marek, Linus Torvalds, Linux Kbuild mailing list, devicetree, Jonathan Corbet, Richard Purdie, Greg Kroah-Hartman, Andrew Morton, Mauro Carvalho Chehab, Nicholas Piggin, linux-doc, linux-kernel, SeongJae Park, Frank Rowand, Yann E. MORIN On Sat, Aug 19, 2017 at 3:49 AM, Masahiro Yamada <yamada.masahiro@socionext.com> wrote: > *.tab.[ch] files are artifacts generated from *.y by using bison. > Instead of running bison, we conventionally version-control > *.tab.[ch]_shipped files and copy them to *.tab.[ch] during build. > > It is true that this approach can minimize external tool dependency, > but we need to update the shipped files from time to time. This > commit switches to build-time generation of the intermediate C files. When do we need to update them? > > Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> > --- > > Documentation/process/changes.rst | 12 + > scripts/Makefile.lib | 14 +- > scripts/dtc/Makefile | 9 +- > scripts/dtc/dtc-parser.tab.c_shipped | 2303 ------------------------------- > scripts/dtc/dtc-parser.tab.h_shipped | 125 -- The script to import dtc normally creates these. If you change this, please make sure the script still works. > scripts/genksyms/Makefile | 5 +- > scripts/genksyms/parse.tab.c_shipped | 2394 -------------------------------- > scripts/genksyms/parse.tab.h_shipped | 119 -- > scripts/kconfig/Makefile | 2 +- > scripts/kconfig/zconf.tab.c_shipped | 2471 ---------------------------------- > 10 files changed, 24 insertions(+), 7430 deletions(-) > delete mode 100644 scripts/dtc/dtc-parser.tab.c_shipped > delete mode 100644 scripts/dtc/dtc-parser.tab.h_shipped > delete mode 100644 scripts/genksyms/parse.tab.c_shipped > delete mode 100644 scripts/genksyms/parse.tab.h_shipped > delete mode 100644 scripts/kconfig/zconf.tab.c_shipped > ^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2017-09-10 16:28 UTC | newest] Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2017-08-19 8:49 [RFC PATCH 0/3] kbuild: generate intermediate C files instead of copying _shipped files Masahiro Yamada 2017-08-19 8:49 ` [RFC PATCH 1/3] kbuild: generate *.hash.c during build Masahiro Yamada 2017-08-19 11:31 ` [RFC PATCH 0/3] kbuild: generate intermediate C files instead of copying _shipped files Cao jin 2017-08-19 17:03 ` Linus Torvalds 2017-08-19 17:14 ` Linus Torvalds 2017-08-19 18:12 ` Linus Torvalds 2017-09-08 6:18 ` Masahiro Yamada 2017-09-08 17:22 ` Linus Torvalds 2017-09-08 18:01 ` Linus Torvalds 2017-09-08 18:39 ` Linus Torvalds 2017-09-08 21:38 ` Linus Torvalds 2017-09-09 6:39 ` Sam Ravnborg 2017-09-10 13:59 ` Masahiro Yamada 2017-09-10 13:58 ` Masahiro Yamada 2017-09-10 16:27 ` Linus Torvalds [not found] ` <1503132577-24423-4-git-send-email-yamada.masahiro@socionext.com> 2017-08-21 17:12 ` [RFC PATCH 3/3] kbuild: generate *.tab.c and *.tab.h during build Rob Herring
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).