162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* Generate kernel symbol version hashes. 362306a36Sopenharmony_ci Copyright 1996, 1997 Linux International. 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci New implementation contributed by Richard Henderson <rth@tamu.edu> 662306a36Sopenharmony_ci Based on original work by Bjorn Ekwall <bj0rn@blox.se> 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci This file is part of the Linux modutils. 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci */ 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#ifndef MODUTILS_GENKSYMS_H 1362306a36Sopenharmony_ci#define MODUTILS_GENKSYMS_H 1 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#include <stdio.h> 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_cienum symbol_type { 1862306a36Sopenharmony_ci SYM_NORMAL, SYM_TYPEDEF, SYM_ENUM, SYM_STRUCT, SYM_UNION, 1962306a36Sopenharmony_ci SYM_ENUM_CONST 2062306a36Sopenharmony_ci}; 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_cienum symbol_status { 2362306a36Sopenharmony_ci STATUS_UNCHANGED, STATUS_DEFINED, STATUS_MODIFIED 2462306a36Sopenharmony_ci}; 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_cistruct string_list { 2762306a36Sopenharmony_ci struct string_list *next; 2862306a36Sopenharmony_ci enum symbol_type tag; 2962306a36Sopenharmony_ci int in_source_file; 3062306a36Sopenharmony_ci char *string; 3162306a36Sopenharmony_ci}; 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_cistruct symbol { 3462306a36Sopenharmony_ci struct symbol *hash_next; 3562306a36Sopenharmony_ci const char *name; 3662306a36Sopenharmony_ci enum symbol_type type; 3762306a36Sopenharmony_ci struct string_list *defn; 3862306a36Sopenharmony_ci struct symbol *expansion_trail; 3962306a36Sopenharmony_ci struct symbol *visited; 4062306a36Sopenharmony_ci int is_extern; 4162306a36Sopenharmony_ci int is_declared; 4262306a36Sopenharmony_ci enum symbol_status status; 4362306a36Sopenharmony_ci int is_override; 4462306a36Sopenharmony_ci}; 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_citypedef struct string_list **yystype; 4762306a36Sopenharmony_ci#define YYSTYPE yystype 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ciextern int cur_line; 5062306a36Sopenharmony_ciextern char *cur_filename; 5162306a36Sopenharmony_ciextern int in_source_file; 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_cistruct symbol *find_symbol(const char *name, enum symbol_type ns, int exact); 5462306a36Sopenharmony_cistruct symbol *add_symbol(const char *name, enum symbol_type type, 5562306a36Sopenharmony_ci struct string_list *defn, int is_extern); 5662306a36Sopenharmony_civoid export_symbol(const char *); 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_civoid free_node(struct string_list *list); 5962306a36Sopenharmony_civoid free_list(struct string_list *s, struct string_list *e); 6062306a36Sopenharmony_cistruct string_list *copy_node(struct string_list *); 6162306a36Sopenharmony_cistruct string_list *copy_list_range(struct string_list *start, 6262306a36Sopenharmony_ci struct string_list *end); 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ciint yylex(void); 6562306a36Sopenharmony_ciint yyparse(void); 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_civoid error_with_pos(const char *, ...) __attribute__ ((format(printf, 1, 2))); 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci/*----------------------------------------------------------------------*/ 7062306a36Sopenharmony_ci#define xmalloc(size) ({ void *__ptr = malloc(size); \ 7162306a36Sopenharmony_ci if(!__ptr && size != 0) { \ 7262306a36Sopenharmony_ci fprintf(stderr, "out of memory\n"); \ 7362306a36Sopenharmony_ci exit(1); \ 7462306a36Sopenharmony_ci } \ 7562306a36Sopenharmony_ci __ptr; }) 7662306a36Sopenharmony_ci#define xstrdup(str) ({ char *__str = strdup(str); \ 7762306a36Sopenharmony_ci if (!__str) { \ 7862306a36Sopenharmony_ci fprintf(stderr, "out of memory\n"); \ 7962306a36Sopenharmony_ci exit(1); \ 8062306a36Sopenharmony_ci } \ 8162306a36Sopenharmony_ci __str; }) 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci#endif /* genksyms.h */ 84