diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 15:20:36 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 15:20:36 -0700 |
commit | 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (patch) | |
tree | 0bba044c4ce775e45a88a51686b5d9f90697ea9d /scripts/genksyms |
Linux-2.6.12-rc2v2.6.12-rc2
Initial git repository build. I'm not bothering with the full history,
even though we have it. We can create a separate "historical" git
archive of that later if we want to, and in the meantime it's about
3.2GB when imported into git - space that would just make the early
git days unnecessarily complicated, when we don't have a lot of good
infrastructure for it.
Let it rip!
Diffstat (limited to 'scripts/genksyms')
-rw-r--r-- | scripts/genksyms/Makefile | 49 | ||||
-rw-r--r-- | scripts/genksyms/genksyms.c | 591 | ||||
-rw-r--r-- | scripts/genksyms/genksyms.h | 104 | ||||
-rw-r--r-- | scripts/genksyms/keywords.c_shipped | 145 | ||||
-rw-r--r-- | scripts/genksyms/keywords.gperf | 50 | ||||
-rw-r--r-- | scripts/genksyms/lex.c_shipped | 2084 | ||||
-rw-r--r-- | scripts/genksyms/lex.l | 407 | ||||
-rw-r--r-- | scripts/genksyms/parse.c_shipped | 1577 | ||||
-rw-r--r-- | scripts/genksyms/parse.h_shipped | 46 | ||||
-rw-r--r-- | scripts/genksyms/parse.y | 469 |
10 files changed, 5522 insertions, 0 deletions
diff --git a/scripts/genksyms/Makefile b/scripts/genksyms/Makefile new file mode 100644 index 00000000000..5875f29a860 --- /dev/null +++ b/scripts/genksyms/Makefile @@ -0,0 +1,49 @@ + +hostprogs-y := genksyms +always := $(hostprogs-y) + +genksyms-objs := genksyms.o parse.o lex.o + +# -I needed for generated C source (shipped source) +HOSTCFLAGS_parse.o := -Wno-uninitialized -I$(src) + +# dependencies on generated files need to be listed explicitly +$(obj)/lex.o: $(obj)/parse.h $(obj)/keywords.c + +# -I needed for generated C source (shipped source) +HOSTCFLAGS_lex.o := -I$(src) + +ifdef GENERATE_PARSER + +# gperf + +quiet_cmd_keywords.c = GPERF $@ + cmd_keywords.c = gperf -L ANSI-C -a -C -E -g -H is_reserved_hash \ + -k 1,3,$$ -N is_reserved_word -p -t $< > $@ + +$(obj)/keywords.c: $(obj)/keywords.gperf FORCE + $(call if_changed,keywords.c) + +# flex + +quiet_cmd_lex.c = FLEX $@ + cmd_lex.c = flex -o$@ -d $(filter-out FORCE,$^) + +$(obj)/lex.c: $(obj)/lex.l $(obj)/parse.h FORCE + $(call if_changed,lex.c) + +# bison + +quiet_cmd_parse.c = BISON $@ + cmd_parse.c = bison -o$@ -dtv $(filter-out FORCE,$^) + +$(obj)/parse.c: $(obj)/parse.y FORCE + $(call if_changed,parse.c) + +$(obj)/parse.h: $(obj)/parse.c ; + +clean-files += parse.output + +endif + +targets += keywords.c lex.c parse.c parse.h diff --git a/scripts/genksyms/genksyms.c b/scripts/genksyms/genksyms.c new file mode 100644 index 00000000000..416a694b099 --- /dev/null +++ b/scripts/genksyms/genksyms.c @@ -0,0 +1,591 @@ +/* Generate kernel symbol version hashes. + Copyright 1996, 1997 Linux International. + + New implementation contributed by Richard Henderson <rth@tamu.edu> + Based on original work by Bjorn Ekwall <bj0rn@blox.se> + + This file was part of the Linux modutils 2.4.22: moved back into the + kernel sources by Rusty Russell/Kai Germaschewski. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2 of the License, or (at your + option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <unistd.h> +#include <assert.h> +#include <stdarg.h> +#ifdef __GNU_LIBRARY__ +#include <getopt.h> +#endif /* __GNU_LIBRARY__ */ + +#include "genksyms.h" + +/*----------------------------------------------------------------------*/ + +#define HASH_BUCKETS 4096 + +static struct symbol *symtab[HASH_BUCKETS]; +FILE *debugfile; + +int cur_line = 1; +char *cur_filename, *output_directory; + +int flag_debug, flag_dump_defs, flag_warnings; + +static int errors; +static int nsyms; + +static struct symbol *expansion_trail; + +static const char * const symbol_type_name[] = { + "normal", "typedef", "enum", "struct", "union" +}; + +/*----------------------------------------------------------------------*/ + +static const unsigned int crctab32[] = +{ + 0x00000000U, 0x77073096U, 0xee0e612cU, 0x990951baU, 0x076dc419U, + 0x706af48fU, 0xe963a535U, 0x9e6495a3U, 0x0edb8832U, 0x79dcb8a4U, + 0xe0d5e91eU, 0x97d2d988U, 0x09b64c2bU, 0x7eb17cbdU, 0xe7b82d07U, + 0x90bf1d91U, 0x1db71064U, 0x6ab020f2U, 0xf3b97148U, 0x84be41deU, + 0x1adad47dU, 0x6ddde4ebU, 0xf4d4b551U, 0x83d385c7U, 0x136c9856U, + 0x646ba8c0U, 0xfd62f97aU, 0x8a65c9ecU, 0x14015c4fU, 0x63066cd9U, + 0xfa0f3d63U, 0x8d080df5U, 0x3b6e20c8U, 0x4c69105eU, 0xd56041e4U, + 0xa2677172U, 0x3c03e4d1U, 0x4b04d447U, 0xd20d85fdU, 0xa50ab56bU, + 0x35b5a8faU, 0x42b2986cU, 0xdbbbc9d6U, 0xacbcf940U, 0x32d86ce3U, + 0x45df5c75U, 0xdcd60dcfU, 0xabd13d59U, 0x26d930acU, 0x51de003aU, + 0xc8d75180U, 0xbfd06116U, 0x21b4f4b5U, 0x56b3c423U, 0xcfba9599U, + 0xb8bda50fU, 0x2802b89eU, 0x5f058808U, 0xc60cd9b2U, 0xb10be924U, + 0x2f6f7c87U, 0x58684c11U, 0xc1611dabU, 0xb6662d3dU, 0x76dc4190U, + 0x01db7106U, 0x98d220bcU, 0xefd5102aU, 0x71b18589U, 0x06b6b51fU, + 0x9fbfe4a5U, 0xe8b8d433U, 0x7807c9a2U, 0x0f00f934U, 0x9609a88eU, + 0xe10e9818U, 0x7f6a0dbbU, 0x086d3d2dU, 0x91646c97U, 0xe6635c01U, + 0x6b6b51f4U, 0x1c6c6162U, 0x856530d8U, 0xf262004eU, 0x6c0695edU, + 0x1b01a57bU, 0x8208f4c1U, 0xf50fc457U, 0x65b0d9c6U, 0x12b7e950U, + 0x8bbeb8eaU, 0xfcb9887cU, 0x62dd1ddfU, 0x15da2d49U, 0x8cd37cf3U, + 0xfbd44c65U, 0x4db26158U, 0x3ab551ceU, 0xa3bc0074U, 0xd4bb30e2U, + 0x4adfa541U, 0x3dd895d7U, 0xa4d1c46dU, 0xd3d6f4fbU, 0x4369e96aU, + 0x346ed9fcU, 0xad678846U, 0xda60b8d0U, 0x44042d73U, 0x33031de5U, + 0xaa0a4c5fU, 0xdd0d7cc9U, 0x5005713cU, 0x270241aaU, 0xbe0b1010U, + 0xc90c2086U, 0x5768b525U, 0x206f85b3U, 0xb966d409U, 0xce61e49fU, + 0x5edef90eU, 0x29d9c998U, 0xb0d09822U, 0xc7d7a8b4U, 0x59b33d17U, + 0x2eb40d81U, 0xb7bd5c3bU, 0xc0ba6cadU, 0xedb88320U, 0x9abfb3b6U, + 0x03b6e20cU, 0x74b1d29aU, 0xead54739U, 0x9dd277afU, 0x04db2615U, + 0x73dc1683U, 0xe3630b12U, 0x94643b84U, 0x0d6d6a3eU, 0x7a6a5aa8U, + 0xe40ecf0bU, 0x9309ff9dU, 0x0a00ae27U, 0x7d079eb1U, 0xf00f9344U, + 0x8708a3d2U, 0x1e01f268U, 0x6906c2feU, 0xf762575dU, 0x806567cbU, + 0x196c3671U, 0x6e6b06e7U, 0xfed41b76U, 0x89d32be0U, 0x10da7a5aU, + 0x67dd4accU, 0xf9b9df6fU, 0x8ebeeff9U, 0x17b7be43U, 0x60b08ed5U, + 0xd6d6a3e8U, 0xa1d1937eU, 0x38d8c2c4U, 0x4fdff252U, 0xd1bb67f1U, + 0xa6bc5767U, 0x3fb506ddU, 0x48b2364bU, 0xd80d2bdaU, 0xaf0a1b4cU, + 0x36034af6U, 0x41047a60U, 0xdf60efc3U, 0xa867df55U, 0x316e8eefU, + 0x4669be79U, 0xcb61b38cU, 0xbc66831aU, 0x256fd2a0U, 0x5268e236U, + 0xcc0c7795U, 0xbb0b4703U, 0x220216b9U, 0x5505262fU, 0xc5ba3bbeU, + 0xb2bd0b28U, 0x2bb45a92U, 0x5cb36a04U, 0xc2d7ffa7U, 0xb5d0cf31U, + 0x2cd99e8bU, 0x5bdeae1dU, 0x9b64c2b0U, 0xec63f226U, 0x756aa39cU, + 0x026d930aU, 0x9c0906a9U, 0xeb0e363fU, 0x72076785U, 0x05005713U, + 0x95bf4a82U, 0xe2b87a14U, 0x7bb12baeU, 0x0cb61b38U, 0x92d28e9bU, + 0xe5d5be0dU, 0x7cdcefb7U, 0x0bdbdf21U, 0x86d3d2d4U, 0xf1d4e242U, + 0x68ddb3f8U, 0x1fda836eU, 0x81be16cdU, 0xf6b9265bU, 0x6fb077e1U, + 0x18b74777U, 0x88085ae6U, 0xff0f6a70U, 0x66063bcaU, 0x11010b5cU, + 0x8f659effU, 0xf862ae69U, 0x616bffd3U, 0x166ccf45U, 0xa00ae278U, + 0xd70dd2eeU, 0x4e048354U, 0x3903b3c2U, 0xa7672661U, 0xd06016f7U, + 0x4969474dU, 0x3e6e77dbU, 0xaed16a4aU, 0xd9d65adcU, 0x40df0b66U, + 0x37d83bf0U, 0xa9bcae53U, 0xdebb9ec5U, 0x47b2cf7fU, 0x30b5ffe9U, + 0xbdbdf21cU, 0xcabac28aU, 0x53b39330U, 0x24b4a3a6U, 0xbad03605U, + 0xcdd70693U, 0x54de5729U, 0x23d967bfU, 0xb3667a2eU, 0xc4614ab8U, + 0x5d681b02U, 0x2a6f2b94U, 0xb40bbe37U, 0xc30c8ea1U, 0x5a05df1bU, + 0x2d02ef8dU +}; + +static inline unsigned long +partial_crc32_one(unsigned char c, unsigned long crc) +{ + return crctab32[(crc ^ c) & 0xff] ^ (crc >> 8); +} + +static inline unsigned long +partial_crc32(const char *s, unsigned long crc) +{ + while (*s) + crc = partial_crc32_one(*s++, crc); + return crc; +} + +static inline unsigned long +crc32(const char *s) +{ + return partial_crc32(s, 0xffffffff) ^ 0xffffffff; +} + + +/*----------------------------------------------------------------------*/ + +static inline enum symbol_type +map_to_ns(enum symbol_type t) +{ + if (t == SYM_TYPEDEF) + t = SYM_NORMAL; + else if (t == SYM_UNION) + t = SYM_STRUCT; + return t; +} + +struct symbol * +find_symbol(const char *name, enum symbol_type ns) +{ + unsigned long h = crc32(name) % HASH_BUCKETS; + struct symbol *sym; + + for (sym = symtab[h]; sym ; sym = sym->hash_next) + if (map_to_ns(sym->type) == map_to_ns(ns) && strcmp(name, sym->name) == 0) + break; + + return sym; +} + +struct symbol * +add_symbol(const char *name, enum symbol_type type, struct string_list *defn, int is_extern) +{ + unsigned long h = crc32(name) % HASH_BUCKETS; + struct symbol *sym; + + for (sym = symtab[h]; sym ; sym = sym->hash_next) + if (map_to_ns(sym->type) == map_to_ns(type) + && strcmp(name, sym->name) == 0) + { + if (!equal_list(sym->defn, defn)) + error_with_pos("redefinition of %s", name); + return sym; + } + + sym = xmalloc(sizeof(*sym)); + sym->name = name; + sym->type = type; + sym->defn = defn; + sym->expansion_trail = NULL; + sym->is_extern = is_extern; + + sym->hash_next = symtab[h]; + symtab[h] = sym; + + if (flag_debug) + { + fprintf(debugfile, "Defn for %s %s == <", symbol_type_name[type], name); + if (is_extern) + fputs("extern ", debugfile); + print_list(debugfile, defn); + fputs(">\n", debugfile); + } + + ++nsyms; + return sym; +} + + +/*----------------------------------------------------------------------*/ + +inline void +free_node(struct string_list *node) +{ + free(node->string); + free(node); +} + +void +free_list(struct string_list *s, struct string_list *e) +{ + while (s != e) + { + struct string_list *next = s->next; + free_node(s); + s = next; + } +} + +inline struct string_list * +copy_node(struct string_list *node) +{ + struct string_list *newnode; + + newnode = xmalloc(sizeof(*newnode)); + newnode->string = xstrdup(node->string); + newnode->tag = node->tag; + + return newnode; +} + +struct string_list * +copy_list(struct string_list *s, struct string_list *e) +{ + struct string_list *h, *p; + + if (s == e) + return NULL; + + p = h = copy_node(s); + while ((s = s->next) != e) + p = p->next = copy_node(s); + p->next = NULL; + + return h; +} + +int +equal_list(struct string_list *a, struct string_list *b) +{ + while (a && b) + { + if (a->tag != b->tag || strcmp(a->string, b->string)) + return 0; + a = a->next; + b = b->next; + } + + return !a && !b; +} + +static inline void +print_node(FILE *f, struct string_list *list) +{ + switch (list->tag) + { + case SYM_STRUCT: + putc('s', f); + goto printit; + case SYM_UNION: + putc('u', f); + goto printit; + case SYM_ENUM: + putc('e', f); + goto printit; + case SYM_TYPEDEF: + putc('t', f); + goto printit; + + printit: + putc('#', f); + case SYM_NORMAL: + fputs(list->string, f); + break; + } +} + +void +print_list(FILE *f, struct string_list *list) +{ + struct string_list **e, **b; + struct string_list *tmp, **tmp2; + int elem = 1; + + if (list == NULL) + { + fputs("(nil)", f); + return; + } + + tmp = list; + while((tmp = tmp->next) != NULL) + elem++; + + b = alloca(elem * sizeof(*e)); + e = b + elem; + tmp2 = e - 1; + + (*tmp2--) = list; + while((list = list->next) != NULL) + *(tmp2--) = list; + + while (b != e) + { + print_node(f, *b++); + putc(' ', f); + } +} + +static unsigned long +expand_and_crc_list(struct string_list *list, unsigned long crc) +{ + struct string_list **e, **b; + struct string_list *tmp, **tmp2; + int elem = 1; + + if (!list) + return crc; + + tmp = list; + while((tmp = tmp->next) != NULL) + elem++; + + b = alloca(elem * sizeof(*e)); + e = b + elem; + tmp2 = e - 1; + + *(tmp2--) = list; + while ((list = list->next) != NULL) + *(tmp2--) = list; + + while (b != e) + { + struct string_list *cur; + struct symbol *subsym; + + cur = *(b++); + switch (cur->tag) + { + case SYM_NORMAL: + if (flag_dump_defs) + fprintf(debugfile, "%s ", cur->string); + crc = partial_crc32(cur->string, crc); + crc = partial_crc32_one(' ', crc); + break; + + case SYM_TYPEDEF: + subsym = find_symbol(cur->string, cur->tag); + if (subsym->expansion_trail) + { + if (flag_dump_defs) + fprintf(debugfile, "%s ", cur->string); + crc = partial_crc32(cur->string, crc); + crc = partial_crc32_one(' ', crc); + } + else + { + subsym->expansion_trail = expansion_trail; + expansion_trail = subsym; + crc = expand_and_crc_list(subsym->defn, crc); + } + break; + + case SYM_STRUCT: + case SYM_UNION: + case SYM_ENUM: + subsym = find_symbol(cur->string, cur->tag); + if (!subsym) + { + struct string_list *n, *t = NULL; + + error_with_pos("expand undefined %s %s", + symbol_type_name[cur->tag], cur->string); + + n = xmalloc(sizeof(*n)); + n->string = xstrdup(symbol_type_name[cur->tag]); + n->tag = SYM_NORMAL; + n->next = t; + t = n; + + n = xmalloc(sizeof(*n)); + n->string = xstrdup(cur->string); + n->tag = SYM_NORMAL; + n->next = t; + t = n; + + n = xmalloc(sizeof(*n)); + n->string = xstrdup("{ UNKNOWN }"); + n->tag = SYM_NORMAL; + n->next = t; + + subsym = add_symbol(cur->string, cur->tag, n, 0); + } + if (subsym->expansion_trail) + { + if (flag_dump_defs) + { + fprintf(debugfile, "%s %s ", symbol_type_name[cur->tag], + cur->string); + } + + crc = partial_crc32(symbol_type_name[cur->tag], crc); + crc = partial_crc32_one(' ', crc); + crc = partial_crc32(cur->string, crc); + crc = partial_crc32_one(' ', crc); + } + else + { + subsym->expansion_trail = expansion_trail; + expansion_trail = subsym; + crc = expand_and_crc_list(subsym->defn, crc); + } + break; + } + } + + return crc; +} + +void +export_symbol(const char *name) +{ + struct symbol *sym; + + sym = find_symbol(name, SYM_NORMAL); + if (!sym) + error_with_pos("export undefined symbol %s", name); + else + { + unsigned long crc; + + if (flag_dump_defs) + fprintf(debugfile, "Export %s == <", name); + + expansion_trail = (struct symbol *)-1L; + + crc = expand_and_crc_list(sym->defn, 0xffffffff) ^ 0xffffffff; + + sym = expansion_trail; + while (sym != (struct symbol *)-1L) + { + struct symbol *n = sym->expansion_trail; + sym->expansion_trail = 0; + sym = n; + } + + if (flag_dump_defs) + fputs(">\n", debugfile); + + /* Used as a linker script. */ + printf("__crc_%s = 0x%08lx ;\n", name, crc); + } +} + +/*----------------------------------------------------------------------*/ + +void +error(const char *fmt, ...) +{ + va_list args; + + if (flag_warnings) + { + va_start(args, fmt); + vfprintf(stderr, fmt, args); + va_end(args); + putc('\n', stderr); + + errors++; + } +} + +void +error_with_pos(const char *fmt, ...) +{ + va_list args; + + if (flag_warnings) + { + fprintf(stderr, "%s:%d: ", cur_filename ? : "<stdin>", cur_line); + + va_start(args, fmt); + vfprintf(stderr, fmt, args); + va_end(args); + putc('\n', stderr); + + errors++; + } +} + + +void genksyms_usage(void) +{ + fputs("Usage:\n" + "genksyms [-dDwqhV] > /path/to/.tmp_obj.ver\n" + "\n" +#ifdef __GNU_LIBRARY__ + " -d, --debug Increment the debug level (repeatable)\n" + " -D, --dump Dump expanded symbol defs (for debugging only)\n" + " -w, --warnings Enable warnings\n" + " -q, --quiet Disable warnings (default)\n" + " -h, --help Print this message\n" + " -V, --version Print the release version\n" +#else /* __GNU_LIBRARY__ */ + " -d Increment the debug level (repeatable)\n" + " -D Dump expanded symbol defs (for debugging only)\n" + " -w Enable warnings\n" + " -q Disable warnings (default)\n" + " -h Print this message\n" + " -V Print the release version\n" +#endif /* __GNU_LIBRARY__ */ + , stderr); +} + +int +main(int argc, char **argv) +{ + int o; + +#ifdef __GNU_LIBRARY__ + struct option long_opts[] = { + {"debug", 0, 0, 'd'}, + {"warnings", 0, 0, 'w'}, + {"quiet", 0, 0, 'q'}, + {"dump", 0, 0, 'D'}, + {"version", 0, 0, 'V'}, + {"help", 0, 0, 'h'}, + {0, 0, 0, 0} + }; + + while ((o = getopt_long(argc, argv, "dwqVDk:p:", + &long_opts[0], NULL)) != EOF) +#else /* __GNU_LIBRARY__ */ + while ((o = getopt(argc, argv, "dwqVDk:p:")) != EOF) +#endif /* __GNU_LIBRARY__ */ + switch (o) + { + case 'd': + flag_debug++; + break; + case 'w': + flag_warnings = 1; + break; + case 'q': + flag_warnings = 0; + break; + case 'V': + fputs("genksyms version 2.5.60\n", stderr); + break; + case 'D': + flag_dump_defs = 1; + break; + case 'h': + genksyms_usage(); + return 0; + default: + genksyms_usage(); + return 1; + } + + { + extern int yydebug; + extern int yy_flex_debug; + + yydebug = (flag_debug > 1); + yy_flex_debug = (flag_debug > 2); + + debugfile = stderr; + /* setlinebuf(debugfile); */ + } + + yyparse(); + + if (flag_debug) + { + fprintf(debugfile, "Hash table occupancy %d/%d = %g\n", + nsyms, HASH_BUCKETS, (double)nsyms / (double)HASH_BUCKETS); + } + + return errors != 0; +} diff --git a/scripts/genksyms/genksyms.h b/scripts/genksyms/genksyms.h new file mode 100644 index 00000000000..f09af47ab28 --- /dev/null +++ b/scripts/genksyms/genksyms.h @@ -0,0 +1,104 @@ +/* Generate kernel symbol version hashes. + Copyright 1996, 1997 Linux International. + + New implementation contributed by Richard Henderson <rth@tamu.edu> + Based on original work by Bjorn Ekwall <bj0rn@blox.se> + + This file is part of the Linux modutils. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2 of the License, or (at your + option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + + +#ifndef MODUTILS_GENKSYMS_H +#define MODUTILS_GENKSYMS_H 1 + +#include <stdio.h> + + +enum symbol_type +{ + SYM_NORMAL, SYM_TYPEDEF, SYM_ENUM, SYM_STRUCT, SYM_UNION +}; + +struct string_list +{ + struct string_list *next; + enum symbol_type tag; + char *string; +}; + +struct symbol +{ + struct symbol *hash_next; + const char *name; + enum symbol_type type; + struct string_list *defn; + struct symbol *expansion_trail; + int is_extern; +}; + +typedef struct string_list **yystype; +#define YYSTYPE yystype + +extern FILE *outfile, *debugfile; + +extern int cur_line; +extern char *cur_filename, *output_directory; + +extern int flag_debug, flag_dump_defs, flag_warnings; +extern int checksum_version, kernel_version; + +extern int want_brace_phrase, want_exp_phrase, discard_phrase_contents; +extern struct string_list *current_list, *next_list; + + +struct symbol *find_symbol(const char *name, enum symbol_type ns); +struct symbol *add_symbol(const char *name, enum symbol_type type, + struct string_list *defn, int is_extern); +void export_symbol(const char *); + +struct string_list *reset_list(void); +void free_list(struct string_list *s, struct string_list *e); +void free_node(struct string_list *list); +struct string_list *copy_node(struct string_list *); +struct string_list *copy_list(struct string_list *s, struct string_list *e); +int equal_list(struct string_list *a, struct string_list *b); +void print_list(FILE *, struct string_list *list); + +int yylex(void); +int yyparse(void); + +void error_with_pos(const char *, ...); + +#define version(a,b,c) ((a << 16) | (b << 8) | (c)) + +/*----------------------------------------------------------------------*/ + +#define MODUTILS_VERSION "<in-kernel>" + +#define xmalloc(size) ({ void *__ptr = malloc(size); \ + if(!__ptr && size != 0) { \ + fprintf(stderr, "out of memory\n"); \ + exit(1); \ + } \ + __ptr; }) +#define xstrdup(str) ({ char *__str = strdup(str); \ + if (!__str) { \ + fprintf(stderr, "out of memory\n"); \ + exit(1); \ + } \ + __str; }) + +#endif /* genksyms.h */ diff --git a/scripts/genksyms/keywords.c_shipped b/scripts/genksyms/keywords.c_shipped new file mode 100644 index 00000000000..eabaf7401cd --- /dev/null +++ b/scripts/genksyms/keywords.c_shipped @@ -0,0 +1,145 @@ +/* ANSI-C code produced by gperf version 2.7.2 */ +/* Command-line: gperf -L ANSI-C -a -C -E -g -H is_reserved_hash -k '1,3,$' -N is_reserved_word -p -t scripts/genksyms/keywords.gperf */ +struct resword { const char *name; int token; }; +/* maximum key range = 109, 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[] = + { + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 5, + 113, 113, 113, 113, 113, 113, 0, 113, 113, 113, + 0, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 0, 113, 0, 113, 20, + 25, 0, 35, 30, 113, 20, 113, 113, 40, 30, + 30, 0, 0, 113, 0, 51, 0, 15, 5, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113 + }; + return len + asso_values[(unsigned char)str[2]] + asso_values[(unsigned char)str[0]] + asso_values[(unsigned char)str[len - 1]]; +} + +#ifdef __GNUC__ +__inline +#endif +const struct resword * +is_reserved_word (register const char *str, register unsigned int len) +{ + enum + { + TOTAL_KEYWORDS = 41, + MIN_WORD_LENGTH = 3, + MAX_WORD_LENGTH = 17, + MIN_HASH_VALUE = 4, + MAX_HASH_VALUE = 112 + }; + + static const struct resword wordlist[] = + { + {""}, {""}, {""}, {""}, + {"auto", AUTO_KEYW}, + {""}, {""}, + {"__asm__", ASM_KEYW}, + {""}, + {"_restrict", RESTRICT_KEYW}, + {"__typeof__", TYPEOF_KEYW}, + {"__attribute", ATTRIBUTE_KEYW}, + {"__restrict__", RESTRICT_KEYW}, + {"__attribute__", ATTRIBUTE_KEYW}, + {""}, + {"__volatile", VOLATILE_KEYW}, + {""}, + {"__volatile__", VOLATILE_KEYW}, + {"EXPORT_SYMBOL", EXPORT_SYMBOL_KEYW}, + {""}, {""}, {""}, + {"EXPORT_SYMBOL_GPL", EXPORT_SYMBOL_KEYW}, + {"int", INT_KEYW}, + {"char", CHAR_KEYW}, + {""}, {""}, + {"__const", CONST_KEYW}, + {"__inline", INLINE_KEYW}, + {"__const__", CONST_KEYW}, + {"__inline__", INLINE_KEYW}, + {""}, {""}, {""}, {""}, + {"__asm", ASM_KEYW}, + {"extern", EXTERN_KEYW}, + {""}, + {"register", REGISTER_KEYW}, + {""}, + {"float", FLOAT_KEYW}, + {"typeof", TYPEOF_KEYW}, + {"typedef", TYPEDEF_KEYW}, + {""}, {""}, + {"_Bool", BOOL_KEYW}, + {"double", DOUBLE_KEYW}, + {""}, {""}, + {"enum", ENUM_KEYW}, + {""}, {""}, {""}, + {"volatile", VOLATILE_KEYW}, + {"void", VOID_KEYW}, + {"const", CONST_KEYW}, + {"short", SHORT_KEYW}, + {"struct", STRUCT_KEYW}, + {""}, + {"restrict", RESTRICT_KEYW}, + {""}, + {"__signed__", SIGNED_KEYW}, + {""}, + {"asm", ASM_KEYW}, + {""}, {""}, + {"inline", INLINE_KEYW}, + {""}, {""}, {""}, + {"union", UNION_KEYW}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"static", STATIC_KEYW}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"__signed", SIGNED_KEYW}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, + {"unsigned", UNSIGNED_KEYW}, + {""}, {""}, {""}, {""}, + {"long", LONG_KEYW}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"signed", SIGNED_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/keywords.gperf b/scripts/genksyms/keywords.gperf new file mode 100644 index 00000000000..b6bec765996 --- /dev/null +++ b/scripts/genksyms/keywords.gperf @@ -0,0 +1,50 @@ +%{ +%} +struct resword { const char *name; int token; } +%% +EXPORT_SYMBOL, EXPORT_SYMBOL_KEYW +EXPORT_SYMBOL_GPL, EXPORT_SYMBOL_KEYW +__asm, ASM_KEYW +__asm__, ASM_KEYW +__attribute, ATTRIBUTE_KEYW +__attribute__, ATTRIBUTE_KEYW +__const, CONST_KEYW +__const__, CONST_KEYW +__inline, INLINE_KEYW +__inline__, INLINE_KEYW +__signed, SIGNED_KEYW +__signed__, SIGNED_KEYW +__volatile, VOLATILE_KEYW +__volatile__, VOLATILE_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 +union, UNION_KEYW +unsigned, UNSIGNED_KEYW +void, VOID_KEYW +volatile, VOLATILE_KEYW +typeof, TYPEOF_KEYW +__typeof__, TYPEOF_KEYW diff --git a/scripts/genksyms/lex.c_shipped b/scripts/genksyms/lex.c_shipped new file mode 100644 index 00000000000..d9bfbb5948f --- /dev/null +++ b/scripts/genksyms/lex.c_shipped @@ -0,0 +1,2084 @@ +#line 2 "scripts/genksyms/lex.c" +/* A lexical scanner generated by flex */ + +/* Scanner skeleton version: + * $Header: /home/daffy/u0/vern/flex/RCS/flex.skl,v 2.91 96/09/10 16:58:48 vern Exp $ + */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 + +#include <stdio.h> +#include <unistd.h> + + +/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ +#ifdef c_plusplus +#ifndef __cplusplus +#define __cplusplus +#endif +#endif + + +#ifdef __cplusplus + +#include <stdlib.h> + +/* Use prototypes in function declarations. */ +#define YY_USE_PROTOS + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +#if __STDC__ + +#define YY_USE_PROTOS +#define YY_USE_CONST + +#endif /* __STDC__ */ +#endif /* ! __cplusplus */ + +#ifdef __TURBOC__ + #pragma warn -rch + #pragma warn -use +#include <io.h> +#include <stdlib.h> +#define YY_USE_CONST +#define YY_USE_PROTOS +#endif + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + + +#ifdef YY_USE_PROTOS +#define YY_PROTO(proto) proto +#else +#define YY_PROTO(proto) () +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN yy_start = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START ((yy_start - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart( yyin ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#define YY_BUF_SIZE 16384 + +typedef struct yy_buffer_state *YY_BUFFER_STATE; + +extern int yyleng; +extern FILE *yyin, *yyout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + +/* The funky do-while in the following #define is used to turn the definition + * int a single C statement (which needs a semi-colon terminator). This + * avoids problems with code like: + * + * if ( condition_holds ) + * yyless( 5 ); + * else + * do_something_else(); + * + * Prior to using the do-while the compiler would get upset at the + * "else" because it interpreted the "if" statement as being all + * done when it reached the ';' after the yyless() call. + */ + +/* Return all but the first 'n' matched characters back to the input stream. */ |