aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/genksyms
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/genksyms')
-rw-r--r--scripts/genksyms/genksyms.c843
-rw-r--r--scripts/genksyms/genksyms.h57
2 files changed, 410 insertions, 490 deletions
diff --git a/scripts/genksyms/genksyms.c b/scripts/genksyms/genksyms.c
index 416a694b0998..5b0344e20d61 100644
--- a/scripts/genksyms/genksyms.c
+++ b/scripts/genksyms/genksyms.c
@@ -29,481 +29,421 @@
29#include <stdarg.h> 29#include <stdarg.h>
30#ifdef __GNU_LIBRARY__ 30#ifdef __GNU_LIBRARY__
31#include <getopt.h> 31#include <getopt.h>
32#endif /* __GNU_LIBRARY__ */ 32#endif /* __GNU_LIBRARY__ */
33 33
34#include "genksyms.h" 34#include "genksyms.h"
35
36/*----------------------------------------------------------------------*/ 35/*----------------------------------------------------------------------*/
37 36
38#define HASH_BUCKETS 4096 37#define HASH_BUCKETS 4096
39 38
40static struct symbol *symtab[HASH_BUCKETS]; 39static struct symbol *symtab[HASH_BUCKETS];
41FILE *debugfile; 40static FILE *debugfile;
42 41
43int cur_line = 1; 42int cur_line = 1;
44char *cur_filename, *output_directory; 43char *cur_filename;
45 44
46int flag_debug, flag_dump_defs, flag_warnings; 45static int flag_debug, flag_dump_defs, flag_warnings;
46static const char *arch = "";
47static const char *mod_prefix = "";
47 48
48static int errors; 49static int errors;
49static int nsyms; 50static int nsyms;
50 51
51static struct symbol *expansion_trail; 52static struct symbol *expansion_trail;
52 53
53static const char * const symbol_type_name[] = { 54static const char *const symbol_type_name[] = {
54 "normal", "typedef", "enum", "struct", "union" 55 "normal", "typedef", "enum", "struct", "union"
55}; 56};
56 57
58static int equal_list(struct string_list *a, struct string_list *b);
59static void print_list(FILE * f, struct string_list *list);
60
57/*----------------------------------------------------------------------*/ 61/*----------------------------------------------------------------------*/
58 62
59static const unsigned int crctab32[] = 63static const unsigned int crctab32[] = {
60{ 64 0x00000000U, 0x77073096U, 0xee0e612cU, 0x990951baU, 0x076dc419U,
61 0x00000000U, 0x77073096U, 0xee0e612cU, 0x990951baU, 0x076dc419U, 65 0x706af48fU, 0xe963a535U, 0x9e6495a3U, 0x0edb8832U, 0x79dcb8a4U,
62 0x706af48fU, 0xe963a535U, 0x9e6495a3U, 0x0edb8832U, 0x79dcb8a4U, 66 0xe0d5e91eU, 0x97d2d988U, 0x09b64c2bU, 0x7eb17cbdU, 0xe7b82d07U,
63 0xe0d5e91eU, 0x97d2d988U, 0x09b64c2bU, 0x7eb17cbdU, 0xe7b82d07U, 67 0x90bf1d91U, 0x1db71064U, 0x6ab020f2U, 0xf3b97148U, 0x84be41deU,
64 0x90bf1d91U, 0x1db71064U, 0x6ab020f2U, 0xf3b97148U, 0x84be41deU, 68 0x1adad47dU, 0x6ddde4ebU, 0xf4d4b551U, 0x83d385c7U, 0x136c9856U,
65 0x1adad47dU, 0x6ddde4ebU, 0xf4d4b551U, 0x83d385c7U, 0x136c9856U, 69 0x646ba8c0U, 0xfd62f97aU, 0x8a65c9ecU, 0x14015c4fU, 0x63066cd9U,
66 0x646ba8c0U, 0xfd62f97aU, 0x8a65c9ecU, 0x14015c4fU, 0x63066cd9U, 70 0xfa0f3d63U, 0x8d080df5U, 0x3b6e20c8U, 0x4c69105eU, 0xd56041e4U,
67 0xfa0f3d63U, 0x8d080df5U, 0x3b6e20c8U, 0x4c69105eU, 0xd56041e4U, 71 0xa2677172U, 0x3c03e4d1U, 0x4b04d447U, 0xd20d85fdU, 0xa50ab56bU,
68 0xa2677172U, 0x3c03e4d1U, 0x4b04d447U, 0xd20d85fdU, 0xa50ab56bU, 72 0x35b5a8faU, 0x42b2986cU, 0xdbbbc9d6U, 0xacbcf940U, 0x32d86ce3U,
69 0x35b5a8faU, 0x42b2986cU, 0xdbbbc9d6U, 0xacbcf940U, 0x32d86ce3U, 73 0x45df5c75U, 0xdcd60dcfU, 0xabd13d59U, 0x26d930acU, 0x51de003aU,
70 0x45df5c75U, 0xdcd60dcfU, 0xabd13d59U, 0x26d930acU, 0x51de003aU, 74 0xc8d75180U, 0xbfd06116U, 0x21b4f4b5U, 0x56b3c423U, 0xcfba9599U,
71 0xc8d75180U, 0xbfd06116U, 0x21b4f4b5U, 0x56b3c423U, 0xcfba9599U, 75 0xb8bda50fU, 0x2802b89eU, 0x5f058808U, 0xc60cd9b2U, 0xb10be924U,
72 0xb8bda50fU, 0x2802b89eU, 0x5f058808U, 0xc60cd9b2U, 0xb10be924U, 76 0x2f6f7c87U, 0x58684c11U, 0xc1611dabU, 0xb6662d3dU, 0x76dc4190U,
73 0x2f6f7c87U, 0x58684c11U, 0xc1611dabU, 0xb6662d3dU, 0x76dc4190U, 77 0x01db7106U, 0x98d220bcU, 0xefd5102aU, 0x71b18589U, 0x06b6b51fU,
74 0x01db7106U, 0x98d220bcU, 0xefd5102aU, 0x71b18589U, 0x06b6b51fU, 78 0x9fbfe4a5U, 0xe8b8d433U, 0x7807c9a2U, 0x0f00f934U, 0x9609a88eU,
75 0x9fbfe4a5U, 0xe8b8d433U, 0x7807c9a2U, 0x0f00f934U, 0x9609a88eU, 79 0xe10e9818U, 0x7f6a0dbbU, 0x086d3d2dU, 0x91646c97U, 0xe6635c01U,
76 0xe10e9818U, 0x7f6a0dbbU, 0x086d3d2dU, 0x91646c97U, 0xe6635c01U, 80 0x6b6b51f4U, 0x1c6c6162U, 0x856530d8U, 0xf262004eU, 0x6c0695edU,
77 0x6b6b51f4U, 0x1c6c6162U, 0x856530d8U, 0xf262004eU, 0x6c0695edU, 81 0x1b01a57bU, 0x8208f4c1U, 0xf50fc457U, 0x65b0d9c6U, 0x12b7e950U,
78 0x1b01a57bU, 0x8208f4c1U, 0xf50fc457U, 0x65b0d9c6U, 0x12b7e950U, 82 0x8bbeb8eaU, 0xfcb9887cU, 0x62dd1ddfU, 0x15da2d49U, 0x8cd37cf3U,
79 0x8bbeb8eaU, 0xfcb9887cU, 0x62dd1ddfU, 0x15da2d49U, 0x8cd37cf3U, 83 0xfbd44c65U, 0x4db26158U, 0x3ab551ceU, 0xa3bc0074U, 0xd4bb30e2U,
80 0xfbd44c65U, 0x4db26158U, 0x3ab551ceU, 0xa3bc0074U, 0xd4bb30e2U, 84 0x4adfa541U, 0x3dd895d7U, 0xa4d1c46dU, 0xd3d6f4fbU, 0x4369e96aU,
81 0x4adfa541U, 0x3dd895d7U, 0xa4d1c46dU, 0xd3d6f4fbU, 0x4369e96aU, 85 0x346ed9fcU, 0xad678846U, 0xda60b8d0U, 0x44042d73U, 0x33031de5U,
82 0x346ed9fcU, 0xad678846U, 0xda60b8d0U, 0x44042d73U, 0x33031de5U, 86 0xaa0a4c5fU, 0xdd0d7cc9U, 0x5005713cU, 0x270241aaU, 0xbe0b1010U,
83 0xaa0a4c5fU, 0xdd0d7cc9U, 0x5005713cU, 0x270241aaU, 0xbe0b1010U, 87 0xc90c2086U, 0x5768b525U, 0x206f85b3U, 0xb966d409U, 0xce61e49fU,
84 0xc90c2086U, 0x5768b525U, 0x206f85b3U, 0xb966d409U, 0xce61e49fU, 88 0x5edef90eU, 0x29d9c998U, 0xb0d09822U, 0xc7d7a8b4U, 0x59b33d17U,
85 0x5edef90eU, 0x29d9c998U, 0xb0d09822U, 0xc7d7a8b4U, 0x59b33d17U, 89 0x2eb40d81U, 0xb7bd5c3bU, 0xc0ba6cadU, 0xedb88320U, 0x9abfb3b6U,
86 0x2eb40d81U, 0xb7bd5c3bU, 0xc0ba6cadU, 0xedb88320U, 0x9abfb3b6U, 90 0x03b6e20cU, 0x74b1d29aU, 0xead54739U, 0x9dd277afU, 0x04db2615U,
87 0x03b6e20cU, 0x74b1d29aU, 0xead54739U, 0x9dd277afU, 0x04db2615U, 91 0x73dc1683U, 0xe3630b12U, 0x94643b84U, 0x0d6d6a3eU, 0x7a6a5aa8U,
88 0x73dc1683U, 0xe3630b12U, 0x94643b84U, 0x0d6d6a3eU, 0x7a6a5aa8U, 92 0xe40ecf0bU, 0x9309ff9dU, 0x0a00ae27U, 0x7d079eb1U, 0xf00f9344U,
89 0xe40ecf0bU, 0x9309ff9dU, 0x0a00ae27U, 0x7d079eb1U, 0xf00f9344U, 93 0x8708a3d2U, 0x1e01f268U, 0x6906c2feU, 0xf762575dU, 0x806567cbU,
90 0x8708a3d2U, 0x1e01f268U, 0x6906c2feU, 0xf762575dU, 0x806567cbU, 94 0x196c3671U, 0x6e6b06e7U, 0xfed41b76U, 0x89d32be0U, 0x10da7a5aU,
91 0x196c3671U, 0x6e6b06e7U, 0xfed41b76U, 0x89d32be0U, 0x10da7a5aU, 95 0x67dd4accU, 0xf9b9df6fU, 0x8ebeeff9U, 0x17b7be43U, 0x60b08ed5U,
92 0x67dd4accU, 0xf9b9df6fU, 0x8ebeeff9U, 0x17b7be43U, 0x60b08ed5U, 96 0xd6d6a3e8U, 0xa1d1937eU, 0x38d8c2c4U, 0x4fdff252U, 0xd1bb67f1U,
93 0xd6d6a3e8U, 0xa1d1937eU, 0x38d8c2c4U, 0x4fdff252U, 0xd1bb67f1U, 97 0xa6bc5767U, 0x3fb506ddU, 0x48b2364bU, 0xd80d2bdaU, 0xaf0a1b4cU,
94 0xa6bc5767U, 0x3fb506ddU, 0x48b2364bU, 0xd80d2bdaU, 0xaf0a1b4cU, 98 0x36034af6U, 0x41047a60U, 0xdf60efc3U, 0xa867df55U, 0x316e8eefU,
95 0x36034af6U, 0x41047a60U, 0xdf60efc3U, 0xa867df55U, 0x316e8eefU, 99 0x4669be79U, 0xcb61b38cU, 0xbc66831aU, 0x256fd2a0U, 0x5268e236U,
96 0x4669be79U, 0xcb61b38cU, 0xbc66831aU, 0x256fd2a0U, 0x5268e236U, 100 0xcc0c7795U, 0xbb0b4703U, 0x220216b9U, 0x5505262fU, 0xc5ba3bbeU,
97 0xcc0c7795U, 0xbb0b4703U, 0x220216b9U, 0x5505262fU, 0xc5ba3bbeU, 101 0xb2bd0b28U, 0x2bb45a92U, 0x5cb36a04U, 0xc2d7ffa7U, 0xb5d0cf31U,
98 0xb2bd0b28U, 0x2bb45a92U, 0x5cb36a04U, 0xc2d7ffa7U, 0xb5d0cf31U, 102 0x2cd99e8bU, 0x5bdeae1dU, 0x9b64c2b0U, 0xec63f226U, 0x756aa39cU,
99 0x2cd99e8bU, 0x5bdeae1dU, 0x9b64c2b0U, 0xec63f226U, 0x756aa39cU, 103 0x026d930aU, 0x9c0906a9U, 0xeb0e363fU, 0x72076785U, 0x05005713U,
100 0x026d930aU, 0x9c0906a9U, 0xeb0e363fU, 0x72076785U, 0x05005713U, 104 0x95bf4a82U, 0xe2b87a14U, 0x7bb12baeU, 0x0cb61b38U, 0x92d28e9bU,
101 0x95bf4a82U, 0xe2b87a14U, 0x7bb12baeU, 0x0cb61b38U, 0x92d28e9bU, 105 0xe5d5be0dU, 0x7cdcefb7U, 0x0bdbdf21U, 0x86d3d2d4U, 0xf1d4e242U,
102 0xe5d5be0dU, 0x7cdcefb7U, 0x0bdbdf21U, 0x86d3d2d4U, 0xf1d4e242U, 106 0x68ddb3f8U, 0x1fda836eU, 0x81be16cdU, 0xf6b9265bU, 0x6fb077e1U,
103 0x68ddb3f8U, 0x1fda836eU, 0x81be16cdU, 0xf6b9265bU, 0x6fb077e1U, 107 0x18b74777U, 0x88085ae6U, 0xff0f6a70U, 0x66063bcaU, 0x11010b5cU,
104 0x18b74777U, 0x88085ae6U, 0xff0f6a70U, 0x66063bcaU, 0x11010b5cU, 108 0x8f659effU, 0xf862ae69U, 0x616bffd3U, 0x166ccf45U, 0xa00ae278U,
105 0x8f659effU, 0xf862ae69U, 0x616bffd3U, 0x166ccf45U, 0xa00ae278U, 109 0xd70dd2eeU, 0x4e048354U, 0x3903b3c2U, 0xa7672661U, 0xd06016f7U,
106 0xd70dd2eeU, 0x4e048354U, 0x3903b3c2U, 0xa7672661U, 0xd06016f7U, 110 0x4969474dU, 0x3e6e77dbU, 0xaed16a4aU, 0xd9d65adcU, 0x40df0b66U,
107 0x4969474dU, 0x3e6e77dbU, 0xaed16a4aU, 0xd9d65adcU, 0x40df0b66U, 111 0x37d83bf0U, 0xa9bcae53U, 0xdebb9ec5U, 0x47b2cf7fU, 0x30b5ffe9U,
108 0x37d83bf0U, 0xa9bcae53U, 0xdebb9ec5U, 0x47b2cf7fU, 0x30b5ffe9U, 112 0xbdbdf21cU, 0xcabac28aU, 0x53b39330U, 0x24b4a3a6U, 0xbad03605U,
109 0xbdbdf21cU, 0xcabac28aU, 0x53b39330U, 0x24b4a3a6U, 0xbad03605U, 113 0xcdd70693U, 0x54de5729U, 0x23d967bfU, 0xb3667a2eU, 0xc4614ab8U,
110 0xcdd70693U, 0x54de5729U, 0x23d967bfU, 0xb3667a2eU, 0xc4614ab8U, 114 0x5d681b02U, 0x2a6f2b94U, 0xb40bbe37U, 0xc30c8ea1U, 0x5a05df1bU,
111 0x5d681b02U, 0x2a6f2b94U, 0xb40bbe37U, 0xc30c8ea1U, 0x5a05df1bU, 115 0x2d02ef8dU
112 0x2d02ef8dU
113}; 116};
114 117
115static inline unsigned long 118static unsigned long partial_crc32_one(unsigned char c, unsigned long crc)
116partial_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
121static inline unsigned long 123static unsigned long partial_crc32(const char *s, unsigned long crc)
122partial_crc32(const char *s, unsigned long crc)
123{ 124{
124 while (*s) 125 while (*s)
125 crc = partial_crc32_one(*s++, crc); 126 crc = partial_crc32_one(*s++, crc);
126 return crc; 127 return crc;
127} 128}
128 129
129static inline unsigned long 130static unsigned long crc32(const char *s)
130crc32(const char *s)
131{ 131{
132 return partial_crc32(s, 0xffffffff) ^ 0xffffffff; 132 return partial_crc32(s, 0xffffffff) ^ 0xffffffff;
133} 133}
134 134
135
136/*----------------------------------------------------------------------*/ 135/*----------------------------------------------------------------------*/
137 136
138static inline enum symbol_type 137static enum symbol_type map_to_ns(enum symbol_type t)
139map_to_ns(enum symbol_type t)
140{ 138{
141 if (t == SYM_TYPEDEF) 139 if (t == SYM_TYPEDEF)
142 t = SYM_NORMAL; 140 t = SYM_NORMAL;
143 else if (t == SYM_UNION) 141 else if (t == SYM_UNION)
144 t = SYM_STRUCT; 142 t = SYM_STRUCT;
145 return t; 143 return t;
146} 144}
147 145
148struct symbol * 146struct symbol *find_symbol(const char *name, enum symbol_type ns)
149find_symbol(const char *name, enum symbol_type ns)
150{ 147{
151 unsigned long h = crc32(name) % HASH_BUCKETS; 148 unsigned long h = crc32(name) % HASH_BUCKETS;
152 struct symbol *sym; 149 struct symbol *sym;
153 150
154 for (sym = symtab[h]; sym ; sym = sym->hash_next) 151 for (sym = symtab[h]; sym; sym = sym->hash_next)
155 if (map_to_ns(sym->type) == map_to_ns(ns) && strcmp(name, sym->name) == 0) 152 if (map_to_ns(sym->type) == map_to_ns(ns) &&
156 break; 153 strcmp(name, sym->name) == 0)
154 break;
157 155
158 return sym; 156 return sym;
159} 157}
160 158
161struct symbol * 159struct symbol *add_symbol(const char *name, enum symbol_type type,
162add_symbol(const char *name, enum symbol_type type, struct string_list *defn, int is_extern) 160 struct string_list *defn, int is_extern)
163{ 161{
164 unsigned long h = crc32(name) % HASH_BUCKETS; 162 unsigned long h = crc32(name) % HASH_BUCKETS;
165 struct symbol *sym; 163 struct symbol *sym;
166 164
167 for (sym = symtab[h]; sym ; sym = sym->hash_next) 165 for (sym = symtab[h]; sym; sym = sym->hash_next) {
168 if (map_to_ns(sym->type) == map_to_ns(type) 166 if (map_to_ns(sym->type) == map_to_ns(type)
169 && strcmp(name, sym->name) == 0) 167 && strcmp(name, sym->name) == 0) {
170 { 168 if (!equal_list(sym->defn, defn))
171 if (!equal_list(sym->defn, defn)) 169 error_with_pos("redefinition of %s", name);
172 error_with_pos("redefinition of %s", name); 170 return sym;
171 }
172 }
173
174 sym = xmalloc(sizeof(*sym));
175 sym->name = name;
176 sym->type = type;
177 sym->defn = defn;
178 sym->expansion_trail = NULL;
179 sym->is_extern = is_extern;
180
181 sym->hash_next = symtab[h];
182 symtab[h] = sym;
183
184 if (flag_debug) {
185 fprintf(debugfile, "Defn for %s %s == <",
186 symbol_type_name[type], name);
187 if (is_extern)
188 fputs("extern ", debugfile);
189 print_list(debugfile, defn);
190 fputs(">\n", debugfile);
191 }
192
193 ++nsyms;
173 return sym; 194 return sym;
174 }
175
176 sym = xmalloc(sizeof(*sym));
177 sym->name = name;
178 sym->type = type;
179 sym->defn = defn;
180 sym->expansion_trail = NULL;
181 sym->is_extern = is_extern;
182
183 sym->hash_next = symtab[h];
184 symtab[h] = sym;
185
186 if (flag_debug)
187 {
188 fprintf(debugfile, "Defn for %s %s == <", symbol_type_name[type], name);
189 if (is_extern)
190 fputs("extern ", debugfile);
191 print_list(debugfile, defn);
192 fputs(">\n", debugfile);
193 }
194
195 ++nsyms;
196 return sym;
197} 195}
198 196
199
200/*----------------------------------------------------------------------*/ 197/*----------------------------------------------------------------------*/
201 198
202inline void 199void free_node(struct string_list *node)
203free_node(struct string_list *node)
204{ 200{
205 free(node->string); 201 free(node->string);
206 free(node); 202 free(node);
207} 203}
208 204
209void 205void free_list(struct string_list *s, struct string_list *e)
210free_list(struct string_list *s, struct string_list *e)
211{ 206{
212 while (s != e) 207 while (s != e) {
213 { 208 struct string_list *next = s->next;
214 struct string_list *next = s->next; 209 free_node(s);
215 free_node(s); 210 s = next;
216 s = next; 211 }
217 }
218} 212}
219 213
220inline struct string_list * 214struct string_list *copy_node(struct string_list *node)
221copy_node(struct string_list *node)
222{ 215{
223 struct string_list *newnode; 216 struct string_list *newnode;
224 217
225 newnode = xmalloc(sizeof(*newnode)); 218 newnode = xmalloc(sizeof(*newnode));
226 newnode->string = xstrdup(node->string); 219 newnode->string = xstrdup(node->string);
227 newnode->tag = node->tag; 220 newnode->tag = node->tag;
228 221
229 return newnode; 222 return newnode;
230} 223}
231 224
232struct string_list * 225static int equal_list(struct string_list *a, struct string_list *b)
233copy_list(struct string_list *s, struct string_list *e)
234{ 226{
235 struct string_list *h, *p; 227 while (a && b) {
236 228 if (a->tag != b->tag || strcmp(a->string, b->string))
237 if (s == e) 229 return 0;
238 return NULL; 230 a = a->next;
239 231 b = b->next;
240 p = h = copy_node(s); 232 }
241 while ((s = s->next) != e)
242 p = p->next = copy_node(s);
243 p->next = NULL;
244
245 return h;
246}
247 233
248int 234 return !a && !b;
249equal_list(struct string_list *a, struct string_list *b)
250{
251 while (a && b)
252 {
253 if (a->tag != b->tag || strcmp(a->string, b->string))
254 return 0;
255 a = a->next;
256 b = b->next;
257 }
258
259 return !a && !b;
260} 235}
261 236
262static inline void 237static void print_node(FILE * f, struct string_list *list)
263print_node(FILE *f, struct string_list *list)
264{ 238{
265 switch (list->tag) 239 switch (list->tag) {
266 { 240 case SYM_STRUCT:
267 case SYM_STRUCT: 241 putc('s', f);
268 putc('s', f); 242 goto printit;
269 goto printit; 243 case SYM_UNION:
270 case SYM_UNION: 244 putc('u', f);
271 putc('u', f); 245 goto printit;
272 goto printit; 246 case SYM_ENUM:
273 case SYM_ENUM: 247 putc('e', f);
274 putc('e', f); 248 goto printit;
275 goto printit; 249 case SYM_TYPEDEF:
276 case SYM_TYPEDEF: 250 putc('t', f);
277 putc('t', f); 251 goto printit;
278 goto printit;
279
280 printit:
281 putc('#', f);
282 case SYM_NORMAL:
283 fputs(list->string, f);
284 break;
285 }
286}
287 252
288void 253 printit:
289print_list(FILE *f, struct string_list *list) 254 putc('#', f);
290{ 255 case SYM_NORMAL:
291 struct string_list **e, **b; 256 fputs(list->string, f);
292 struct string_list *tmp, **tmp2; 257 break;
293 int elem = 1; 258 }
294
295 if (list == NULL)
296 {
297 fputs("(nil)", f);
298 return;
299 }
300
301 tmp = list;
302 while((tmp = tmp->next) != NULL)
303 elem++;
304
305 b = alloca(elem * sizeof(*e));
306 e = b + elem;
307 tmp2 = e - 1;
308
309 (*tmp2--) = list;
310 while((list = list->next) != NULL)
311 *(tmp2--) = list;
312
313 while (b != e)
314 {
315 print_node(f, *b++);
316 putc(' ', f);
317 }
318} 259}
319 260
320static unsigned long 261static void print_list(FILE * f, struct string_list *list)
321expand_and_crc_list(struct string_list *list, unsigned long crc)
322{ 262{
323 struct string_list **e, **b; 263 struct string_list **e, **b;
324 struct string_list *tmp, **tmp2; 264 struct string_list *tmp, **tmp2;
325 int elem = 1; 265 int elem = 1;
326
327 if (!list)
328 return crc;
329 266
330 tmp = list; 267 if (list == NULL) {
331 while((tmp = tmp->next) != NULL) 268 fputs("(nil)", f);
332 elem++; 269 return;
333 270 }
334 b = alloca(elem * sizeof(*e));
335 e = b + elem;
336 tmp2 = e - 1;
337 271
338 *(tmp2--) = list; 272 tmp = list;
339 while ((list = list->next) != NULL) 273 while ((tmp = tmp->next) != NULL)
340 *(tmp2--) = list; 274 elem++;
341 275
342 while (b != e) 276 b = alloca(elem * sizeof(*e));
343 { 277 e = b + elem;
344 struct string_list *cur; 278 tmp2 = e - 1;
345 struct symbol *subsym;
346 279
347 cur = *(b++); 280 (*tmp2--) = list;
348 switch (cur->tag) 281 while ((list = list->next) != NULL)
349 { 282 *(tmp2--) = list;
350 case SYM_NORMAL:
351 if (flag_dump_defs)
352 fprintf(debugfile, "%s ", cur->string);
353 crc = partial_crc32(cur->string, crc);
354 crc = partial_crc32_one(' ', crc);
355 break;
356 283
357 case SYM_TYPEDEF: 284 while (b != e) {
358 subsym = find_symbol(cur->string, cur->tag); 285 print_node(f, *b++);
359 if (subsym->expansion_trail) 286 putc(' ', f);
360 { 287 }
361 if (flag_dump_defs) 288}
362 fprintf(debugfile, "%s ", cur->string);
363 crc = partial_crc32(cur->string, crc);
364 crc = partial_crc32_one(' ', crc);
365 }
366 else
367 {
368 subsym->expansion_trail = expansion_trail;
369 expansion_trail = subsym;
370 crc = expand_and_crc_list(subsym->defn, crc);
371 }
372 break;
373 289
374 case SYM_STRUCT: 290static unsigned long expand_and_crc_list(struct string_list *list,
375 case SYM_UNION: 291 unsigned long crc)
376 case SYM_ENUM: 292{
377 subsym = find_symbol(cur->string, cur->tag); 293 struct string_list **e, **b;
378 if (!subsym) 294 struct string_list *tmp, **tmp2;
379 { 295 int elem = 1;
380 struct string_list *n, *t = NULL; 296
381 297 if (!list)
382 error_with_pos("expand undefined %s %s", 298 return crc;
383 symbol_type_name[cur->tag], cur->string); 299
384 300 tmp = list;
385 n = xmalloc(sizeof(*n)); 301 while ((tmp = tmp->next) != NULL)
386 n->string = xstrdup(symbol_type_name[cur->tag]); 302 elem++;
387 n->tag = SYM_NORMAL; 303
388 n->next = t; 304 b = alloca(elem * sizeof(*e));
389 t = n; 305 e = b + elem;
390 306 tmp2 = e - 1;
391 n = xmalloc(sizeof(*n)); 307
392 n->string = xstrdup(cur->string); 308 *(tmp2--) = list;
393 n->tag = SYM_NORMAL; 309 while ((list = list->next) != NULL)
394 n->next = t; 310 *(tmp2--) = list;
395 t = n; 311
396 312 while (b != e) {
397 n = xmalloc(sizeof(*n)); 313 struct string_list *cur;
398 n->string = xstrdup("{ UNKNOWN }"); 314 struct symbol *subsym;
399 n->tag = SYM_NORMAL; 315
400 n->next = t; 316 cur = *(b++);
401 317 switch (cur->tag) {
402 subsym = add_symbol(cur->string, cur->tag, n, 0); 318 case SYM_NORMAL:
403 } 319 if (flag_dump_defs)
404 if (subsym->expansion_trail) 320 fprintf(debugfile, "%s ", cur->string);
405 { 321 crc = partial_crc32(cur->string, crc);
406 if (flag_dump_defs) 322 crc = partial_crc32_one(' ', crc);
407 { 323 break;
408 fprintf(debugfile, "%s %s ", symbol_type_name[cur->tag], 324
409 cur->string); 325 case SYM_TYPEDEF:
326 subsym = find_symbol(cur->string, cur->tag);
327 if (subsym->expansion_trail) {
328 if (flag_dump_defs)
329 fprintf(debugfile, "%s ", cur->string);
330 crc = partial_crc32(cur->string, crc);
331 crc = partial_crc32_one(' ', crc);
332 } else {
333 subsym->expansion_trail = expansion_trail;
334 expansion_trail = subsym;
335 crc = expand_and_crc_list(subsym->defn, crc);
336 }
337 break;
338
339 case SYM_STRUCT:
340 case SYM_UNION:
341 case SYM_ENUM:
342 subsym = find_symbol(cur->string, cur->tag);
343 if (!subsym) {
344 struct string_list *n, *t = NULL;
345
346 error_with_pos("expand undefined %s %s",
347 symbol_type_name[cur->tag],
348 cur->string);
349
350 n = xmalloc(sizeof(*n));
351 n->string = xstrdup(symbol_type_name[cur->tag]);
352 n->tag = SYM_NORMAL;
353 n->next = t;
354 t = n;
355
356 n = xmalloc(sizeof(*n));
357 n->string = xstrdup(cur->string);
358 n->tag = SYM_NORMAL;
359 n->next = t;
360 t = n;
361
362 n = xmalloc(sizeof(*n));
363 n->string = xstrdup("{ UNKNOWN }");
364 n->tag = SYM_NORMAL;
365 n->next = t;
366
367 subsym =
368 add_symbol(cur->string, cur->tag, n, 0);
369 }
370 if (subsym->expansion_trail) {
371 if (flag_dump_defs) {
372 fprintf(debugfile, "%s %s ",
373 symbol_type_name[cur->tag],
374 cur->string);
375 }
376
377 crc = partial_crc32(symbol_type_name[cur->tag],
378 crc);
379 crc = partial_crc32_one(' ', crc);
380 crc = partial_crc32(cur->string, crc);
381 crc = partial_crc32_one(' ', crc);
382 } else {
383 subsym->expansion_trail = expansion_trail;
384 expansion_trail = subsym;
385 crc = expand_and_crc_list(subsym->defn, crc);
386 }
387 break;
410 } 388 }
411
412 crc = partial_crc32(symbol_type_name[cur->tag], crc);
413 crc = partial_crc32_one(' ', crc);
414 crc = partial_crc32(cur->string, crc);
415 crc = partial_crc32_one(' ', crc);
416 }
417 else
418 {
419 subsym->expansion_trail = expansion_trail;
420 expansion_trail = subsym;
421 crc = expand_and_crc_list(subsym->defn, crc);
422 }
423 break;
424 } 389 }
425 }
426 390
427 return crc; 391 return crc;
428} 392}
429 393
430void 394void export_symbol(const char *name)
431export_symbol(const char *name)
432{ 395{
433 struct symbol *sym; 396 struct symbol *sym;
434 397
435 sym = find_symbol(name, SYM_NORMAL); 398 sym = find_symbol(name, SYM_NORMAL);
436 if (!sym) 399 if (!sym)
437 error_with_pos("export undefined symbol %s", name); 400 error_with_pos("export undefined symbol %s", name);
438 else 401 else {
439 { 402 unsigned long crc;
440 unsigned long crc;
441 403
442 if (flag_dump_defs) 404 if (flag_dump_defs)
443 fprintf(debugfile, "Export %s == <", name); 405 fprintf(debugfile, "Export %s == <", name);
444 406
445 expansion_trail = (struct symbol *)-1L; 407 expansion_trail = (struct symbol *)-1L;
446 408
447 crc = expand_and_crc_list(sym->defn, 0xffffffff) ^ 0xffffffff; 409 crc = expand_and_crc_list(sym->defn, 0xffffffff) ^ 0xffffffff;
448 410
449 sym = expansion_trail; 411 sym = expansion_trail;
450 while (sym != (struct symbol *)-1L) 412 while (sym != (struct symbol *)-1L) {
451 { 413 struct symbol *n = sym->expansion_trail;
452 struct symbol *n = sym->expansion_trail; 414 sym->expansion_trail = 0;
453 sym->expansion_trail = 0; 415 sym = n;
454 sym = n; 416 }
455 }
456 417
457 if (flag_dump_defs) 418 if (flag_dump_defs)
458 fputs(">\n", debugfile); 419 fputs(">\n", debugfile);
459 420
460 /* Used as a linker script. */ 421 /* Used as a linker script. */
461 printf("__crc_%s = 0x%08lx ;\n", name, crc); 422 printf("%s__crc_%s = 0x%08lx ;\n", mod_prefix, name, crc);
462 } 423 }
463} 424}
464 425
465/*----------------------------------------------------------------------*/ 426/*----------------------------------------------------------------------*/
466 427void error_with_pos(const char *fmt, ...)
467void
468error(const char *fmt, ...)
469{
470 va_list args;
471
472 if (flag_warnings)
473 {
474 va_start(args, fmt);
475 vfprintf(stderr, fmt, args);
476 va_end(args);
477 putc('\n', stderr);
478
479 errors++;
480 }
481}
482
483void
484error_with_pos(const char *fmt, ...)
485{ 428{
486 va_list args; 429 va_list args;
487 430
488 if (flag_warnings) 431 if (flag_warnings) {
489 { 432 fprintf(stderr, "%s:%d: ", cur_filename ? : "<stdin>",
490 fprintf(stderr, "%s:%d: ", cur_filename ? : "<stdin>", cur_line); 433 cur_line);
491 434
492 va_start(args, fmt); 435 va_start(args, fmt);
493 vfprintf(stderr, fmt, args); 436 vfprintf(stderr, fmt, args);
494 va_end(args); 437 va_end(args);
495 putc('\n', stderr); 438 putc('\n', stderr);
496 439
497 errors++; 440 errors++;
498 } 441 }
499} 442}
500 443
501 444static void genksyms_usage(void)
502void genksyms_usage(void)
503{ 445{
504 fputs("Usage:\n" 446 fputs("Usage:\n" "genksyms [-dDwqhV] > /path/to/.tmp_obj.ver\n" "\n"
505 "genksyms [-dDwqhV] > /path/to/.tmp_obj.ver\n"
506 "\n"
507#ifdef __GNU_LIBRARY__ 447#ifdef __GNU_LIBRARY__
508 " -d, --debug Increment the debug level (repeatable)\n" 448 " -d, --debug Increment the debug level (repeatable)\n"
509 " -D, --dump Dump expanded symbol defs (for debugging only)\n" 449 " -D, --dump Dump expanded symbol defs (for debugging only)\n"
@@ -511,81 +451,84 @@ void genksyms_usage(void)
511 " -q, --quiet Disable warnings (default)\n" 451 " -q, --quiet Disable warnings (default)\n"
512 " -h, --help Print this message\n" 452 " -h, --help Print this message\n"
513 " -V, --version Print the release version\n" 453 " -V, --version Print the release version\n"
514#else /* __GNU_LIBRARY__ */ 454#else /* __GNU_LIBRARY__ */
515 " -d Increment the debug level (repeatable)\n" 455 " -d Increment the debug level (repeatable)\n"
516 " -D Dump expanded symbol defs (for debugging only)\n" 456 " -D Dump expanded symbol defs (for debugging only)\n"
517 " -w Enable warnings\n" 457 " -w Enable warnings\n"
518 " -q Disable warnings (default)\n" 458 " -q Disable warnings (default)\n"
519 " -h Print this message\n" 459 " -h Print this message\n"
520 " -V Print the release version\n" 460 " -V Print the release version\n"
521#endif /* __GNU_LIBRARY__ */ 461#endif /* __GNU_LIBRARY__ */
522 , stderr); 462 , stderr);
523} 463}
524 464
525int 465int main(int argc, char **argv)
526main(int argc, char **argv)
527{ 466{
528 int o; 467 int o;
529 468
530#ifdef __GNU_LIBRARY__ 469#ifdef __GNU_LIBRARY__
531 struct option long_opts[] = { 470 struct option long_opts[] = {
532 {"debug", 0, 0, 'd'}, 471 {"arch", 1, 0, 'a'},
533 {"warnings", 0, 0, 'w'}, 472 {"debug", 0, 0, 'd'},
534 {"quiet", 0, 0, 'q'}, 473 {"warnings", 0, 0, 'w'},
535 {"dump", 0, 0, 'D'}, 474 {"quiet", 0, 0, 'q'},
536 {"version", 0, 0, 'V'}, 475 {"dump", 0, 0, 'D'},
537 {"help", 0, 0, 'h'}, 476 {"version", 0, 0, 'V'},
538 {0, 0, 0, 0} 477 {"help", 0, 0, 'h'},
539 }; 478 {0, 0, 0, 0}
540 479 };
541 while ((o = getopt_long(argc, argv, "dwqVDk:p:", 480
542 &long_opts[0], NULL)) != EOF) 481 while ((o = getopt_long(argc, argv, "a:dwqVDk:p:",
543#else /* __GNU_LIBRARY__ */ 482 &long_opts[0], NULL)) != EOF)
544 while ((o = getopt(argc, argv, "dwqVDk:p:")) != EOF) 483#else /* __GNU_LIBRARY__ */
545#endif /* __GNU_LIBRARY__ */ 484 while ((o = getopt(argc, argv, "a:dwqVDk:p:")) != EOF)
546 switch (o) 485#endif /* __GNU_LIBRARY__ */
547 { 486 switch (o) {
548 case 'd': 487 case 'a':
549 flag_debug++; 488 arch = optarg;
550 break; 489 break;
551 case 'w': 490 case 'd':
552 flag_warnings = 1; 491 flag_debug++;
553 break; 492 break;
554 case 'q': 493 case 'w':
555 flag_warnings = 0; 494 flag_warnings = 1;
556 break; 495 break;
557 case 'V': 496 case 'q':
558 fputs("genksyms version 2.5.60\n", stderr); 497 flag_warnings = 0;
559 break; 498 break;
560 case 'D': 499 case 'V':
561 flag_dump_defs = 1; 500 fputs("genksyms version 2.5.60\n", stderr);
562 break; 501 break;
563 case 'h': 502 case 'D':
564 genksyms_usage(); 503 flag_dump_defs = 1;
565 return 0; 504 break;
566 default: 505 case 'h':
567 genksyms_usage(); 506 genksyms_usage();
568 return 1; 507 return 0;
569 } 508 default:
570 509 genksyms_usage();
571 { 510 return 1;
572 extern int yydebug; 511 }
573 extern int yy_flex_debug; 512 if ((strcmp(arch, "v850") == 0) || (strcmp(arch, "h8300") == 0))
574 513 mod_prefix = "_";
575 yydebug = (flag_debug > 1); 514 {
576 yy_flex_debug = (flag_debug > 2); 515 extern int yydebug;
577 516 extern int yy_flex_debug;
578 debugfile = stderr; 517
579 /* setlinebuf(debugfile); */ 518 yydebug = (flag_debug > 1);
580 } 519 yy_flex_debug = (flag_debug > 2);
581 520
582 yyparse(); 521 debugfile = stderr;
583 522 /* setlinebuf(debugfile); */
584 if (flag_debug) 523 }
585 { 524
586 fprintf(debugfile, "Hash table occupancy %d/%d = %g\n", 525 yyparse();
587 nsyms, HASH_BUCKETS, (double)nsyms / (double)HASH_BUCKETS); 526
588 } 527 if (flag_debug) {
589 528 fprintf(debugfile, "Hash table occupancy %d/%d = %g\n",
590 return errors != 0; 529 nsyms, HASH_BUCKETS,
530 (double)nsyms / (double)HASH_BUCKETS);
531 }
532
533 return errors != 0;
591} 534}
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 28enum symbol_type {
30enum 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
35struct string_list 32struct 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
42struct symbol 38struct 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
52typedef struct string_list **yystype; 47typedef struct string_list **yystype;
53#define YYSTYPE yystype 48#define YYSTYPE yystype
54 49
55extern FILE *outfile, *debugfile;
56
57extern int cur_line; 50extern int cur_line;
58extern char *cur_filename, *output_directory; 51extern char *cur_filename;
59
60extern int flag_debug, flag_dump_defs, flag_warnings;
61extern int checksum_version, kernel_version;
62
63extern int want_brace_phrase, want_exp_phrase, discard_phrase_contents;
64extern struct string_list *current_list, *next_list;
65
66 52
67struct symbol *find_symbol(const char *name, enum symbol_type ns); 53struct symbol *find_symbol(const char *name, enum symbol_type ns);
68struct symbol *add_symbol(const char *name, enum symbol_type type, 54struct 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);
70void export_symbol(const char *); 56void export_symbol(const char *);
71 57
72struct string_list *reset_list(void);
73void free_list(struct string_list *s, struct string_list *e);
74void free_node(struct string_list *list); 58void free_node(struct string_list *list);
59void free_list(struct string_list *s, struct string_list *e);
75struct string_list *copy_node(struct string_list *); 60struct string_list *copy_node(struct string_list *);
76struct string_list *copy_list(struct string_list *s, struct string_list *e);
77int equal_list(struct string_list *a, struct string_list *b);
78void print_list(FILE *, struct string_list *list);
79 61
80int yylex(void); 62int yylex(void);
81int yyparse(void); 63int yyparse(void);
82 64
83void error_with_pos(const char *, ...); 65void 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 */