diff options
| -rw-r--r-- | scripts/genksyms/genksyms.c | 80 | ||||
| -rw-r--r-- | scripts/genksyms/genksyms.h | 57 |
2 files changed, 43 insertions, 94 deletions
diff --git a/scripts/genksyms/genksyms.c b/scripts/genksyms/genksyms.c index b798e284e1fc..5b0344e20d61 100644 --- a/scripts/genksyms/genksyms.c +++ b/scripts/genksyms/genksyms.c | |||
| @@ -37,14 +37,14 @@ | |||
| 37 | #define HASH_BUCKETS 4096 | 37 | #define HASH_BUCKETS 4096 |
| 38 | 38 | ||
| 39 | static struct symbol *symtab[HASH_BUCKETS]; | 39 | static struct symbol *symtab[HASH_BUCKETS]; |
| 40 | FILE *debugfile; | 40 | static FILE *debugfile; |
| 41 | 41 | ||
| 42 | int cur_line = 1; | 42 | int cur_line = 1; |
| 43 | char *cur_filename, *output_directory; | 43 | char *cur_filename; |
| 44 | 44 | ||
| 45 | int flag_debug, flag_dump_defs, flag_warnings; | 45 | static int flag_debug, flag_dump_defs, flag_warnings; |
| 46 | const char *arch = ""; | 46 | static const char *arch = ""; |
| 47 | const char *mod_prefix = ""; | 47 | static const char *mod_prefix = ""; |
| 48 | 48 | ||
| 49 | static int errors; | 49 | static int errors; |
| 50 | static int nsyms; | 50 | static int nsyms; |
| @@ -55,6 +55,9 @@ static const char *const symbol_type_name[] = { | |||
| 55 | "normal", "typedef", "enum", "struct", "union" | 55 | "normal", "typedef", "enum", "struct", "union" |
| 56 | }; | 56 | }; |
| 57 | 57 | ||
| 58 | static int equal_list(struct string_list *a, struct string_list *b); | ||
| 59 | static void print_list(FILE * f, struct string_list *list); | ||
| 60 | |||
| 58 | /*----------------------------------------------------------------------*/ | 61 | /*----------------------------------------------------------------------*/ |
| 59 | 62 | ||
| 60 | static const unsigned int crctab32[] = { | 63 | static const unsigned int crctab32[] = { |
| @@ -112,27 +115,26 @@ static const unsigned int crctab32[] = { | |||
| 112 | 0x2d02ef8dU | 115 | 0x2d02ef8dU |
| 113 | }; | 116 | }; |
| 114 | 117 | ||
| 115 | static inline unsigned long | 118 | static unsigned long partial_crc32_one(unsigned char c, unsigned long crc) |
| 116 | partial_crc32_one(unsigned char c, unsigned long crc) | ||
| 117 | { | 119 | { |
| 118 | return crctab32[(crc ^ c) & 0xff] ^ (crc >> 8); | 120 | return crctab32[(crc ^ c) & 0xff] ^ (crc >> 8); |
| 119 | } | 121 | } |
| 120 | 122 | ||
| 121 | static inline unsigned long partial_crc32(const char *s, unsigned long crc) | 123 | static unsigned long partial_crc32(const char *s, unsigned long crc) |
| 122 | { | 124 | { |
| 123 | while (*s) | 125 | while (*s) |
| 124 | crc = partial_crc32_one(*s++, crc); | 126 | crc = partial_crc32_one(*s++, crc); |
| 125 | return crc; | 127 | return crc; |
| 126 | } | 128 | } |
| 127 | 129 | ||
| 128 | static inline unsigned long crc32(const char *s) | 130 | static unsigned long crc32(const char *s) |
| 129 | { | 131 | { |
| 130 | return partial_crc32(s, 0xffffffff) ^ 0xffffffff; | 132 | return partial_crc32(s, 0xffffffff) ^ 0xffffffff; |
| 131 | } | 133 | } |
| 132 | 134 | ||
| 133 | /*----------------------------------------------------------------------*/ | 135 | /*----------------------------------------------------------------------*/ |
| 134 | 136 | ||
| 135 | static inline enum symbol_type map_to_ns(enum symbol_type t) | 137 | static enum symbol_type map_to_ns(enum symbol_type t) |
| 136 | { | 138 | { |
| 137 | if (t == SYM_TYPEDEF) | 139 | if (t == SYM_TYPEDEF) |
| 138 | t = SYM_NORMAL; | 140 | t = SYM_NORMAL; |
| @@ -147,8 +149,8 @@ struct symbol *find_symbol(const char *name, enum symbol_type ns) | |||
| 147 | struct symbol *sym; | 149 | struct symbol *sym; |
| 148 | 150 | ||
| 149 | for (sym = symtab[h]; sym; sym = sym->hash_next) | 151 | for (sym = symtab[h]; sym; sym = sym->hash_next) |
| 150 | if (map_to_ns(sym->type) == map_to_ns(ns) | 152 | if (map_to_ns(sym->type) == map_to_ns(ns) && |
| 151 | && strcmp(name, sym->name) == 0) | 153 | strcmp(name, sym->name) == 0) |
| 152 | break; | 154 | break; |
| 153 | 155 | ||
| 154 | return sym; | 156 | return sym; |
| @@ -160,13 +162,14 @@ struct symbol *add_symbol(const char *name, enum symbol_type type, | |||
| 160 | unsigned long h = crc32(name) % HASH_BUCKETS; | 162 | unsigned long h = crc32(name) % HASH_BUCKETS; |
| 161 | struct symbol *sym; | 163 | struct symbol *sym; |
| 162 | 164 | ||
| 163 | for (sym = symtab[h]; sym; sym = sym->hash_next) | 165 | for (sym = symtab[h]; sym; sym = sym->hash_next) { |
| 164 | if (map_to_ns(sym->type) == map_to_ns(type) | 166 | if (map_to_ns(sym->type) == map_to_ns(type) |
| 165 | && strcmp(name, sym->name) == 0) { | 167 | && strcmp(name, sym->name) == 0) { |
| 166 | if (!equal_list(sym->defn, defn)) | 168 | if (!equal_list(sym->defn, defn)) |
| 167 | error_with_pos("redefinition of %s", name); | 169 | error_with_pos("redefinition of %s", name); |
| 168 | return sym; | 170 | return sym; |
| 169 | } | 171 | } |
| 172 | } | ||
| 170 | 173 | ||
| 171 | sym = xmalloc(sizeof(*sym)); | 174 | sym = xmalloc(sizeof(*sym)); |
| 172 | sym->name = name; | 175 | sym->name = name; |
| @@ -193,7 +196,7 @@ struct symbol *add_symbol(const char *name, enum symbol_type type, | |||
| 193 | 196 | ||
| 194 | /*----------------------------------------------------------------------*/ | 197 | /*----------------------------------------------------------------------*/ |
| 195 | 198 | ||
| 196 | inline void free_node(struct string_list *node) | 199 | void free_node(struct string_list *node) |
| 197 | { | 200 | { |
| 198 | free(node->string); | 201 | free(node->string); |
| 199 | free(node); | 202 | free(node); |
| @@ -208,7 +211,7 @@ void free_list(struct string_list *s, struct string_list *e) | |||
| 208 | } | 211 | } |
| 209 | } | 212 | } |
| 210 | 213 | ||
| 211 | inline struct string_list *copy_node(struct string_list *node) | 214 | struct string_list *copy_node(struct string_list *node) |
| 212 | { | 215 | { |
| 213 | struct string_list *newnode; | 216 | struct string_list *newnode; |
| 214 | 217 | ||
| @@ -219,22 +222,7 @@ inline struct string_list *copy_node(struct string_list *node) | |||
| 219 | return newnode; | 222 | return newnode; |
| 220 | } | 223 | } |
| 221 | 224 | ||
| 222 | struct string_list *copy_list(struct string_list *s, struct string_list *e) | 225 | static int equal_list(struct string_list *a, struct string_list *b) |
| 223 | { | ||
| 224 | struct string_list *h, *p; | ||
| 225 | |||
| 226 | if (s == e) | ||
| 227 | return NULL; | ||
| 228 | |||
| 229 | p = h = copy_node(s); | ||
| 230 | while ((s = s->next) != e) | ||
| 231 | p = p->next = copy_node(s); | ||
| 232 | p->next = NULL; | ||
| 233 | |||
| 234 | return h; | ||
| 235 | } | ||
| 236 | |||
| 237 | int equal_list(struct string_list *a, struct string_list *b) | ||
| 238 | { | 226 | { |
| 239 | while (a && b) { | 227 | while (a && b) { |
| 240 | if (a->tag != b->tag || strcmp(a->string, b->string)) | 228 | if (a->tag != b->tag || strcmp(a->string, b->string)) |
| @@ -246,7 +234,7 @@ int equal_list(struct string_list *a, struct string_list *b) | |||
| 246 | return !a && !b; | 234 | return !a && !b; |
| 247 | } | 235 | } |
| 248 | 236 | ||
| 249 | static inline void print_node(FILE * f, struct string_list *list) | 237 | static void print_node(FILE * f, struct string_list *list) |
| 250 | { | 238 | { |
| 251 | switch (list->tag) { | 239 | switch (list->tag) { |
| 252 | case SYM_STRUCT: | 240 | case SYM_STRUCT: |
| @@ -270,7 +258,7 @@ static inline void print_node(FILE * f, struct string_list *list) | |||
| 270 | } | 258 | } |
| 271 | } | 259 | } |
| 272 | 260 | ||
| 273 | void print_list(FILE * f, struct string_list *list) | 261 | static void print_list(FILE * f, struct string_list *list) |
| 274 | { | 262 | { |
| 275 | struct string_list **e, **b; | 263 | struct string_list **e, **b; |
| 276 | struct string_list *tmp, **tmp2; | 264 | struct string_list *tmp, **tmp2; |
| @@ -299,8 +287,8 @@ void print_list(FILE * f, struct string_list *list) | |||
| 299 | } | 287 | } |
| 300 | } | 288 | } |
| 301 | 289 | ||
| 302 | static unsigned long | 290 | static unsigned long expand_and_crc_list(struct string_list *list, |
| 303 | expand_and_crc_list(struct string_list *list, unsigned long crc) | 291 | unsigned long crc) |
| 304 | { | 292 | { |
| 305 | struct string_list **e, **b; | 293 | struct string_list **e, **b; |
| 306 | struct string_list *tmp, **tmp2; | 294 | struct string_list *tmp, **tmp2; |
| @@ -386,9 +374,8 @@ expand_and_crc_list(struct string_list *list, unsigned long crc) | |||
| 386 | cur->string); | 374 | cur->string); |
| 387 | } | 375 | } |
| 388 | 376 | ||
| 389 | crc = | 377 | crc = partial_crc32(symbol_type_name[cur->tag], |
| 390 | partial_crc32(symbol_type_name[cur->tag], | 378 | crc); |
| 391 | crc); | ||
| 392 | crc = partial_crc32_one(' ', crc); | 379 | crc = partial_crc32_one(' ', crc); |
| 393 | crc = partial_crc32(cur->string, crc); | 380 | crc = partial_crc32(cur->string, crc); |
| 394 | crc = partial_crc32_one(' ', crc); | 381 | crc = partial_crc32_one(' ', crc); |
| @@ -437,21 +424,6 @@ void export_symbol(const char *name) | |||
| 437 | } | 424 | } |
| 438 | 425 | ||
| 439 | /*----------------------------------------------------------------------*/ | 426 | /*----------------------------------------------------------------------*/ |
| 440 | |||
| 441 | void error(const char *fmt, ...) | ||
| 442 | { | ||
| 443 | va_list args; | ||
| 444 | |||
| 445 | if (flag_warnings) { | ||
| 446 | va_start(args, fmt); | ||
| 447 | vfprintf(stderr, fmt, args); | ||
| 448 | va_end(args); | ||
| 449 | putc('\n', stderr); | ||
| 450 | |||
| 451 | errors++; | ||
| 452 | } | ||
| 453 | } | ||
| 454 | |||
| 455 | void error_with_pos(const char *fmt, ...) | 427 | void error_with_pos(const char *fmt, ...) |
| 456 | { | 428 | { |
| 457 | va_list args; | 429 | va_list args; |
| @@ -469,7 +441,7 @@ void error_with_pos(const char *fmt, ...) | |||
| 469 | } | 441 | } |
| 470 | } | 442 | } |
| 471 | 443 | ||
| 472 | void genksyms_usage(void) | 444 | static void genksyms_usage(void) |
| 473 | { | 445 | { |
| 474 | fputs("Usage:\n" "genksyms [-dDwqhV] > /path/to/.tmp_obj.ver\n" "\n" | 446 | fputs("Usage:\n" "genksyms [-dDwqhV] > /path/to/.tmp_obj.ver\n" "\n" |
| 475 | #ifdef __GNU_LIBRARY__ | 447 | #ifdef __GNU_LIBRARY__ |
diff --git a/scripts/genksyms/genksyms.h b/scripts/genksyms/genksyms.h index f09af47ab281..ab6f34f38735 100644 --- a/scripts/genksyms/genksyms.h +++ b/scripts/genksyms/genksyms.h | |||
| @@ -20,74 +20,51 @@ | |||
| 20 | along with this program; if not, write to the Free Software Foundation, | 20 | along with this program; if not, write to the Free Software Foundation, |
| 21 | Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | 21 | Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ |
| 22 | 22 | ||
| 23 | |||
| 24 | #ifndef MODUTILS_GENKSYMS_H | 23 | #ifndef MODUTILS_GENKSYMS_H |
| 25 | #define MODUTILS_GENKSYMS_H 1 | 24 | #define MODUTILS_GENKSYMS_H 1 |
| 26 | 25 | ||
| 27 | #include <stdio.h> | 26 | #include <stdio.h> |
| 28 | 27 | ||
| 29 | 28 | enum symbol_type { | |
| 30 | enum symbol_type | 29 | SYM_NORMAL, SYM_TYPEDEF, SYM_ENUM, SYM_STRUCT, SYM_UNION |
| 31 | { | ||
| 32 | SYM_NORMAL, SYM_TYPEDEF, SYM_ENUM, SYM_STRUCT, SYM_UNION | ||
| 33 | }; | 30 | }; |
| 34 | 31 | ||
| 35 | struct string_list | 32 | struct string_list { |
| 36 | { | 33 | struct string_list *next; |
| 37 | struct string_list *next; | 34 | enum symbol_type tag; |
| 38 | enum symbol_type tag; | 35 | char *string; |
| 39 | char *string; | ||
| 40 | }; | 36 | }; |
| 41 | 37 | ||
| 42 | struct symbol | 38 | struct symbol { |
| 43 | { | 39 | struct symbol *hash_next; |
| 44 | struct symbol *hash_next; | 40 | const char *name; |
| 45 | const char *name; | 41 | enum symbol_type type; |
| 46 | enum symbol_type type; | 42 | struct string_list *defn; |
| 47 | struct string_list *defn; | 43 | struct symbol *expansion_trail; |
| 48 | struct symbol *expansion_trail; | 44 | int is_extern; |
| 49 | int is_extern; | ||
| 50 | }; | 45 | }; |
| 51 | 46 | ||
| 52 | typedef struct string_list **yystype; | 47 | typedef struct string_list **yystype; |
| 53 | #define YYSTYPE yystype | 48 | #define YYSTYPE yystype |
| 54 | 49 | ||
| 55 | extern FILE *outfile, *debugfile; | ||
| 56 | |||
| 57 | extern int cur_line; | 50 | extern int cur_line; |
| 58 | extern char *cur_filename, *output_directory; | 51 | extern char *cur_filename; |
| 59 | |||
| 60 | extern int flag_debug, flag_dump_defs, flag_warnings; | ||
| 61 | extern int checksum_version, kernel_version; | ||
| 62 | |||
| 63 | extern int want_brace_phrase, want_exp_phrase, discard_phrase_contents; | ||
| 64 | extern struct string_list *current_list, *next_list; | ||
| 65 | |||
| 66 | 52 | ||
| 67 | struct symbol *find_symbol(const char *name, enum symbol_type ns); | 53 | struct symbol *find_symbol(const char *name, enum symbol_type ns); |
| 68 | struct symbol *add_symbol(const char *name, enum symbol_type type, | 54 | struct symbol *add_symbol(const char *name, enum symbol_type type, |
| 69 | struct string_list *defn, int is_extern); | 55 | struct string_list *defn, int is_extern); |
| 70 | void export_symbol(const char *); | 56 | void export_symbol(const char *); |
| 71 | 57 | ||
| 72 | struct string_list *reset_list(void); | ||
| 73 | void free_list(struct string_list *s, struct string_list *e); | ||
| 74 | void free_node(struct string_list *list); | 58 | void free_node(struct string_list *list); |
| 59 | void free_list(struct string_list *s, struct string_list *e); | ||
| 75 | struct string_list *copy_node(struct string_list *); | 60 | struct string_list *copy_node(struct string_list *); |
| 76 | struct string_list *copy_list(struct string_list *s, struct string_list *e); | ||
| 77 | int equal_list(struct string_list *a, struct string_list *b); | ||
| 78 | void print_list(FILE *, struct string_list *list); | ||
| 79 | 61 | ||
| 80 | int yylex(void); | 62 | int yylex(void); |
| 81 | int yyparse(void); | 63 | int yyparse(void); |
| 82 | 64 | ||
| 83 | void error_with_pos(const char *, ...); | 65 | void error_with_pos(const char *, ...); |
| 84 | 66 | ||
| 85 | #define version(a,b,c) ((a << 16) | (b << 8) | (c)) | ||
| 86 | |||
| 87 | /*----------------------------------------------------------------------*/ | 67 | /*----------------------------------------------------------------------*/ |
| 88 | |||
| 89 | #define MODUTILS_VERSION "<in-kernel>" | ||
| 90 | |||
| 91 | #define xmalloc(size) ({ void *__ptr = malloc(size); \ | 68 | #define xmalloc(size) ({ void *__ptr = malloc(size); \ |
| 92 | if(!__ptr && size != 0) { \ | 69 | if(!__ptr && size != 0) { \ |
| 93 | fprintf(stderr, "out of memory\n"); \ | 70 | fprintf(stderr, "out of memory\n"); \ |
| @@ -101,4 +78,4 @@ void error_with_pos(const char *, ...); | |||
| 101 | } \ | 78 | } \ |
| 102 | __str; }) | 79 | __str; }) |
| 103 | 80 | ||
| 104 | #endif /* genksyms.h */ | 81 | #endif /* genksyms.h */ |
