Commit 01762c4e authored by Michal Marek's avatar Michal Marek

genksyms: simplify usage of find_symbol()

Allow searching for symbols of an exact type. The lexer does this and a
subsequent patch will add one more usage.
Signed-off-by: default avatarMichal Marek <mmarek@suse.cz>
Acked-by: default avatarSam Ravnborg <sam@ravnborg.org>
parent 68eb8563
...@@ -156,7 +156,7 @@ static enum symbol_type map_to_ns(enum symbol_type t) ...@@ -156,7 +156,7 @@ static enum symbol_type map_to_ns(enum symbol_type t)
return t; return t;
} }
struct symbol *find_symbol(const char *name, enum symbol_type ns) struct symbol *find_symbol(const char *name, enum symbol_type ns, int exact)
{ {
unsigned long h = crc32(name) % HASH_BUCKETS; unsigned long h = crc32(name) % HASH_BUCKETS;
struct symbol *sym; struct symbol *sym;
...@@ -167,6 +167,8 @@ struct symbol *find_symbol(const char *name, enum symbol_type ns) ...@@ -167,6 +167,8 @@ struct symbol *find_symbol(const char *name, enum symbol_type ns)
sym->is_declared) sym->is_declared)
break; break;
if (exact && sym && sym->type != ns)
return NULL;
return sym; return sym;
} }
...@@ -511,7 +513,7 @@ static unsigned long expand_and_crc_sym(struct symbol *sym, unsigned long crc) ...@@ -511,7 +513,7 @@ static unsigned long expand_and_crc_sym(struct symbol *sym, unsigned long crc)
break; break;
case SYM_TYPEDEF: case SYM_TYPEDEF:
subsym = find_symbol(cur->string, cur->tag); subsym = find_symbol(cur->string, cur->tag, 0);
/* FIXME: Bad reference files can segfault here. */ /* FIXME: Bad reference files can segfault here. */
if (subsym->expansion_trail) { if (subsym->expansion_trail) {
if (flag_dump_defs) if (flag_dump_defs)
...@@ -528,7 +530,7 @@ static unsigned long expand_and_crc_sym(struct symbol *sym, unsigned long crc) ...@@ -528,7 +530,7 @@ static unsigned long expand_and_crc_sym(struct symbol *sym, unsigned long crc)
case SYM_STRUCT: case SYM_STRUCT:
case SYM_UNION: case SYM_UNION:
case SYM_ENUM: case SYM_ENUM:
subsym = find_symbol(cur->string, cur->tag); subsym = find_symbol(cur->string, cur->tag, 0);
if (!subsym) { if (!subsym) {
struct string_list *n; struct string_list *n;
...@@ -582,7 +584,7 @@ void export_symbol(const char *name) ...@@ -582,7 +584,7 @@ void export_symbol(const char *name)
{ {
struct symbol *sym; struct symbol *sym;
sym = find_symbol(name, SYM_NORMAL); sym = find_symbol(name, SYM_NORMAL, 0);
if (!sym) if (!sym)
error_with_pos("export undefined symbol %s", name); error_with_pos("export undefined symbol %s", name);
else { else {
......
...@@ -58,7 +58,7 @@ typedef struct string_list **yystype; ...@@ -58,7 +58,7 @@ typedef struct string_list **yystype;
extern int cur_line; extern int cur_line;
extern char *cur_filename; extern char *cur_filename;
struct symbol *find_symbol(const char *name, enum symbol_type ns); struct symbol *find_symbol(const char *name, enum symbol_type ns, int exact);
struct symbol *add_symbol(const char *name, enum symbol_type type, struct symbol *add_symbol(const char *name, enum symbol_type type,
struct string_list *defn, int is_extern); struct string_list *defn, int is_extern);
void export_symbol(const char *); void export_symbol(const char *);
......
...@@ -2347,8 +2347,7 @@ repeat: ...@@ -2347,8 +2347,7 @@ repeat:
} }
if (!suppress_type_lookup) if (!suppress_type_lookup)
{ {
struct symbol *sym = find_symbol(yytext, SYM_TYPEDEF); if (find_symbol(yytext, SYM_TYPEDEF, 1))
if (sym && sym->type == SYM_TYPEDEF)
token = TYPE; token = TYPE;
} }
} }
......
...@@ -193,8 +193,7 @@ repeat: ...@@ -193,8 +193,7 @@ repeat:
} }
if (!suppress_type_lookup) if (!suppress_type_lookup)
{ {
struct symbol *sym = find_symbol(yytext, SYM_TYPEDEF); if (find_symbol(yytext, SYM_TYPEDEF, 1))
if (sym && sym->type == SYM_TYPEDEF)
token = TYPE; token = TYPE;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment