1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* Generate kernel symbol version hashes. 3*4882a593Smuzhiyun Copyright 1996, 1997 Linux International. 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun New implementation contributed by Richard Henderson <rth@tamu.edu> 6*4882a593Smuzhiyun Based on original work by Bjorn Ekwall <bj0rn@blox.se> 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun This file is part of the Linux modutils. 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun */ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #ifndef MODUTILS_GENKSYMS_H 13*4882a593Smuzhiyun #define MODUTILS_GENKSYMS_H 1 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #include <stdio.h> 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun enum symbol_type { 18*4882a593Smuzhiyun SYM_NORMAL, SYM_TYPEDEF, SYM_ENUM, SYM_STRUCT, SYM_UNION, 19*4882a593Smuzhiyun SYM_ENUM_CONST 20*4882a593Smuzhiyun }; 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun enum symbol_status { 23*4882a593Smuzhiyun STATUS_UNCHANGED, STATUS_DEFINED, STATUS_MODIFIED 24*4882a593Smuzhiyun }; 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun struct string_list { 27*4882a593Smuzhiyun struct string_list *next; 28*4882a593Smuzhiyun enum symbol_type tag; 29*4882a593Smuzhiyun int in_source_file; 30*4882a593Smuzhiyun char *string; 31*4882a593Smuzhiyun }; 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun struct symbol { 34*4882a593Smuzhiyun struct symbol *hash_next; 35*4882a593Smuzhiyun const char *name; 36*4882a593Smuzhiyun enum symbol_type type; 37*4882a593Smuzhiyun struct string_list *defn; 38*4882a593Smuzhiyun struct symbol *expansion_trail; 39*4882a593Smuzhiyun struct symbol *visited; 40*4882a593Smuzhiyun int is_extern; 41*4882a593Smuzhiyun int is_declared; 42*4882a593Smuzhiyun enum symbol_status status; 43*4882a593Smuzhiyun int is_override; 44*4882a593Smuzhiyun }; 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun typedef struct string_list **yystype; 47*4882a593Smuzhiyun #define YYSTYPE yystype 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun extern int cur_line; 50*4882a593Smuzhiyun extern char *cur_filename, *source_file; 51*4882a593Smuzhiyun extern int in_source_file; 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun struct symbol *find_symbol(const char *name, enum symbol_type ns, int exact); 54*4882a593Smuzhiyun struct symbol *add_symbol(const char *name, enum symbol_type type, 55*4882a593Smuzhiyun struct string_list *defn, int is_extern); 56*4882a593Smuzhiyun void export_symbol(const char *); 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun void free_node(struct string_list *list); 59*4882a593Smuzhiyun void free_list(struct string_list *s, struct string_list *e); 60*4882a593Smuzhiyun struct string_list *copy_node(struct string_list *); 61*4882a593Smuzhiyun struct string_list *copy_list_range(struct string_list *start, 62*4882a593Smuzhiyun struct string_list *end); 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun int yylex(void); 65*4882a593Smuzhiyun int yyparse(void); 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun void error_with_pos(const char *, ...) __attribute__ ((format(printf, 1, 2))); 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun /*----------------------------------------------------------------------*/ 70*4882a593Smuzhiyun #define xmalloc(size) ({ void *__ptr = malloc(size); \ 71*4882a593Smuzhiyun if(!__ptr && size != 0) { \ 72*4882a593Smuzhiyun fprintf(stderr, "out of memory\n"); \ 73*4882a593Smuzhiyun exit(1); \ 74*4882a593Smuzhiyun } \ 75*4882a593Smuzhiyun __ptr; }) 76*4882a593Smuzhiyun #define xstrdup(str) ({ char *__str = strdup(str); \ 77*4882a593Smuzhiyun if (!__str) { \ 78*4882a593Smuzhiyun fprintf(stderr, "out of memory\n"); \ 79*4882a593Smuzhiyun exit(1); \ 80*4882a593Smuzhiyun } \ 81*4882a593Smuzhiyun __str; }) 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun #endif /* genksyms.h */ 84