diff options
Diffstat (limited to 'scripts/genksyms/genksyms.c')
-rw-r--r-- | scripts/genksyms/genksyms.c | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/scripts/genksyms/genksyms.c b/scripts/genksyms/genksyms.c index ddac1746908e..3a8297b5184c 100644 --- a/scripts/genksyms/genksyms.c +++ b/scripts/genksyms/genksyms.c | |||
@@ -191,11 +191,26 @@ struct symbol *__add_symbol(const char *name, enum symbol_type type, | |||
191 | /* fall through */ ; | 191 | /* fall through */ ; |
192 | else if (sym->type == type && | 192 | else if (sym->type == type && |
193 | equal_list(sym->defn, defn)) { | 193 | equal_list(sym->defn, defn)) { |
194 | if (!sym->is_declared && sym->is_override) { | ||
195 | print_location(); | ||
196 | print_type_name(type, name); | ||
197 | fprintf(stderr, " modversion is " | ||
198 | "unchanged\n"); | ||
199 | } | ||
194 | sym->is_declared = 1; | 200 | sym->is_declared = 1; |
195 | return sym; | 201 | return sym; |
196 | } else if (!sym->is_declared) { | 202 | } else if (!sym->is_declared) { |
197 | status = is_unknown_symbol(sym) ? | 203 | if (sym->is_override && flag_preserve) { |
198 | STATUS_DEFINED : STATUS_MODIFIED; | 204 | print_location(); |
205 | fprintf(stderr, "ignoring "); | ||
206 | print_type_name(type, name); | ||
207 | fprintf(stderr, " modversion change\n"); | ||
208 | sym->is_declared = 1; | ||
209 | return sym; | ||
210 | } else { | ||
211 | status = is_unknown_symbol(sym) ? | ||
212 | STATUS_DEFINED : STATUS_MODIFIED; | ||
213 | } | ||
199 | } else { | 214 | } else { |
200 | error_with_pos("redefinition of %s", name); | 215 | error_with_pos("redefinition of %s", name); |
201 | return sym; | 216 | return sym; |
@@ -229,6 +244,7 @@ struct symbol *__add_symbol(const char *name, enum symbol_type type, | |||
229 | 244 | ||
230 | sym->is_declared = !is_reference; | 245 | sym->is_declared = !is_reference; |
231 | sym->status = status; | 246 | sym->status = status; |
247 | sym->is_override = 0; | ||
232 | 248 | ||
233 | if (flag_debug) { | 249 | if (flag_debug) { |
234 | fprintf(debugfile, "Defn for %s %s == <", | 250 | fprintf(debugfile, "Defn for %s %s == <", |
@@ -348,9 +364,16 @@ static void read_reference(FILE *f) | |||
348 | while (!feof(f)) { | 364 | while (!feof(f)) { |
349 | struct string_list *defn = NULL; | 365 | struct string_list *defn = NULL; |
350 | struct string_list *sym, *def; | 366 | struct string_list *sym, *def; |
351 | int is_extern = 0; | 367 | int is_extern = 0, is_override = 0; |
368 | struct symbol *subsym; | ||
352 | 369 | ||
353 | sym = read_node(f); | 370 | sym = read_node(f); |
371 | if (sym && sym->tag == SYM_NORMAL && | ||
372 | !strcmp(sym->string, "override")) { | ||
373 | is_override = 1; | ||
374 | free_node(sym); | ||
375 | sym = read_node(f); | ||
376 | } | ||
354 | if (!sym) | 377 | if (!sym) |
355 | continue; | 378 | continue; |
356 | def = read_node(f); | 379 | def = read_node(f); |
@@ -365,8 +388,9 @@ static void read_reference(FILE *f) | |||
365 | defn = def; | 388 | defn = def; |
366 | def = read_node(f); | 389 | def = read_node(f); |
367 | } | 390 | } |
368 | add_reference_symbol(xstrdup(sym->string), sym->tag, | 391 | subsym = add_reference_symbol(xstrdup(sym->string), sym->tag, |
369 | defn, is_extern); | 392 | defn, is_extern); |
393 | subsym->is_override = is_override; | ||
370 | free_node(sym); | 394 | free_node(sym); |
371 | } | 395 | } |
372 | } | 396 | } |
@@ -743,6 +767,8 @@ int main(int argc, char **argv) | |||
743 | while (visited_symbols != (struct symbol *)-1L) { | 767 | while (visited_symbols != (struct symbol *)-1L) { |
744 | struct symbol *sym = visited_symbols; | 768 | struct symbol *sym = visited_symbols; |
745 | 769 | ||
770 | if (sym->is_override) | ||
771 | fputs("override ", dumpfile); | ||
746 | if (sym->type != SYM_NORMAL) { | 772 | if (sym->type != SYM_NORMAL) { |
747 | putc(symbol_type_name[sym->type][0], dumpfile); | 773 | putc(symbol_type_name[sym->type][0], dumpfile); |
748 | putc('#', dumpfile); | 774 | putc('#', dumpfile); |