aboutsummaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorMichal Marek <mmarek@suse.cz>2011-03-17 15:15:18 +0100
committerMichal Marek <mmarek@suse.cz>2011-03-17 15:15:18 +0100
commita88bab9aeebe3118703e1532343d82688c12578e (patch)
treed6428e385b71d4bf8456ec8e919c7119a20505fb /scripts
parent00759c0ea0d3b4c918539ddd7cbbfbbb39a38fc7 (diff)
parent303fc01fb12d95cf9ab88c496df6651c887cef3c (diff)
Merge branch 'genksyms-enum' into kbuild/kbuild
Diffstat (limited to 'scripts')
-rw-r--r--scripts/genksyms/Makefile4
-rw-r--r--scripts/genksyms/genksyms.c192
-rw-r--r--scripts/genksyms/genksyms.h7
-rw-r--r--scripts/genksyms/lex.c_shipped427
-rw-r--r--scripts/genksyms/lex.l44
-rw-r--r--scripts/genksyms/parse.c_shipped1071
-rw-r--r--scripts/genksyms/parse.h_shipped72
-rw-r--r--scripts/genksyms/parse.y34
8 files changed, 988 insertions, 863 deletions
diff --git a/scripts/genksyms/Makefile b/scripts/genksyms/Makefile
index e420fe44001..13d03cf05d9 100644
--- a/scripts/genksyms/Makefile
+++ b/scripts/genksyms/Makefile
@@ -28,9 +28,9 @@ $(obj)/keywords.c: $(obj)/keywords.gperf FORCE
# flex
quiet_cmd_lex.c = FLEX $@
- cmd_lex.c = flex -o$@ -d $< $(obj)/parse.h
+ cmd_lex.c = flex -o$@ -d $<
-$(obj)/lex.c: $(obj)/lex.l $(obj)/parse.h $(obj)/keywords.c FORCE
+$(obj)/lex.c: $(obj)/lex.l $(obj)/keywords.c FORCE
$(call if_changed,lex.c)
cp $@ $@_shipped
diff --git a/scripts/genksyms/genksyms.c b/scripts/genksyms/genksyms.c
index f99115ebe92..f9e75531ea0 100644
--- a/scripts/genksyms/genksyms.c
+++ b/scripts/genksyms/genksyms.c
@@ -53,12 +53,22 @@ static int nsyms;
static struct symbol *expansion_trail;
static struct symbol *visited_symbols;
-static const char *const symbol_type_name[] = {
- "normal", "typedef", "enum", "struct", "union"
+static const struct {
+ int n;
+ const char *name;
+} symbol_types[] = {
+ [SYM_NORMAL] = { 0, NULL},
+ [SYM_TYPEDEF] = {'t', "typedef"},
+ [SYM_ENUM] = {'e', "enum"},
+ [SYM_STRUCT] = {'s', "struct"},
+ [SYM_UNION] = {'u', "union"},
+ [SYM_ENUM_CONST] = {'E', "enum constant"},
};
static int equal_list(struct string_list *a, struct string_list *b);
static void print_list(FILE * f, struct string_list *list);
+static struct string_list *concat_list(struct string_list *start, ...);
+static struct string_list *mk_node(const char *string);
static void print_location(void);
static void print_type_name(enum symbol_type type, const char *name);
@@ -140,14 +150,20 @@ static unsigned long crc32(const char *s)
static enum symbol_type map_to_ns(enum symbol_type t)
{
- if (t == SYM_TYPEDEF)
- t = SYM_NORMAL;
- else if (t == SYM_UNION)
- t = SYM_STRUCT;
+ switch (t) {
+ case SYM_ENUM_CONST:
+ case SYM_NORMAL:
+ case SYM_TYPEDEF:
+ return SYM_NORMAL;
+ case SYM_ENUM:
+ case SYM_STRUCT:
+ case SYM_UNION:
+ return SYM_STRUCT;
+ }
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;
struct symbol *sym;
@@ -158,6 +174,8 @@ struct symbol *find_symbol(const char *name, enum symbol_type ns)
sym->is_declared)
break;
+ if (exact && sym && sym->type != ns)
+ return NULL;
return sym;
}
@@ -180,10 +198,47 @@ static struct symbol *__add_symbol(const char *name, enum symbol_type type,
struct string_list *defn, int is_extern,
int is_reference)
{
- unsigned long h = crc32(name) % HASH_BUCKETS;
+ unsigned long h;
struct symbol *sym;
enum symbol_status status = STATUS_UNCHANGED;
+ /* The parser adds symbols in the order their declaration completes,
+ * so it is safe to store the value of the previous enum constant in
+ * a static variable.
+ */
+ static int enum_counter;
+ static struct string_list *last_enum_expr;
+
+ if (type == SYM_ENUM_CONST) {
+ if (defn) {
+ free_list(last_enum_expr, NULL);
+ last_enum_expr = copy_list_range(defn, NULL);
+ enum_counter = 1;
+ } else {
+ struct string_list *expr;
+ char buf[20];
+
+ snprintf(buf, sizeof(buf), "%d", enum_counter++);
+ if (last_enum_expr) {
+ expr = copy_list_range(last_enum_expr, NULL);
+ defn = concat_list(mk_node("("),
+ expr,
+ mk_node(")"),
+ mk_node("+"),
+ mk_node(buf), NULL);
+ } else {
+ defn = mk_node(buf);
+ }
+ }
+ } else if (type == SYM_ENUM) {
+ free_list(last_enum_expr, NULL);
+ last_enum_expr = NULL;
+ enum_counter = 0;
+ if (!name)
+ /* Anonymous enum definition, nothing more to do */
+ return NULL;
+ }
+ h = crc32(name) % HASH_BUCKETS;
for (sym = symtab[h]; sym; sym = sym->hash_next) {
if (map_to_ns(sym->type) == map_to_ns(type) &&
strcmp(name, sym->name) == 0) {
@@ -247,8 +302,12 @@ static struct symbol *__add_symbol(const char *name, enum symbol_type type,
sym->is_override = 0;
if (flag_debug) {
- fprintf(debugfile, "Defn for %s %s == <",
- symbol_type_name[type], name);
+ if (symbol_types[type].name)
+ fprintf(debugfile, "Defn for %s %s == <",
+ symbol_types[type].name, name);
+ else
+ fprintf(debugfile, "Defn for type%d %s == <",
+ type, name);
if (is_extern)
fputs("extern ", debugfile);
print_list(debugfile, defn);
@@ -288,6 +347,35 @@ void free_list(struct string_list *s, struct string_list *e)
}
}
+static struct string_list *mk_node(const char *string)
+{
+ struct string_list *newnode;
+
+ newnode = xmalloc(sizeof(*newnode));
+ newnode->string = xstrdup(string);
+ newnode->tag = SYM_NORMAL;
+ newnode->next = NULL;
+
+ return newnode;
+}
+
+static struct string_list *concat_list(struct string_list *start, ...)
+{
+ va_list ap;
+ struct string_list *n, *n2;
+
+ if (!start)
+ return NULL;
+ for (va_start(ap, start); (n = va_arg(ap, struct string_list *));) {
+ for (n2 = n; n2->next; n2 = n2->next)
+ ;
+ n2->next = start;
+ start = n;
+ }
+ va_end(ap);
+ return start;
+}
+
struct string_list *copy_node(struct string_list *node)
{
struct string_list *newnode;
@@ -299,6 +387,22 @@ struct string_list *copy_node(struct string_list *node)
return newnode;
}
+struct string_list *copy_list_range(struct string_list *start,
+ struct string_list *end)
+{
+ struct string_list *res, *n;
+
+ if (start == end)
+ return NULL;
+ n = res = copy_node(start);
+ for (start = start->next; start != end; start = start->next) {
+ n->next = copy_node(start);
+ n = n->next;
+ }
+ n->next = NULL;
+ return res;
+}
+
static int equal_list(struct string_list *a, struct string_list *b)
{
while (a && b) {
@@ -346,8 +450,8 @@ static struct string_list *read_node(FILE *f)
if (node.string[1] == '#') {
int n;
- for (n = 0; n < ARRAY_SIZE(symbol_type_name); n++) {
- if (node.string[0] == symbol_type_name[n][0]) {
+ for (n = 0; n < ARRAY_SIZE(symbol_types); n++) {
+ if (node.string[0] == symbol_types[n].n) {
node.tag = n;
node.string += 2;
return copy_node(&node);
@@ -397,8 +501,8 @@ static void read_reference(FILE *f)
static void print_node(FILE * f, struct string_list *list)
{
- if (list->tag != SYM_NORMAL) {
- putc(symbol_type_name[list->tag][0], f);
+ if (symbol_types[list->tag].n) {
+ putc(symbol_types[list->tag].n, f);
putc('#', f);
}
fputs(list->string, f);
@@ -468,8 +572,9 @@ static unsigned long expand_and_crc_sym(struct symbol *sym, unsigned long crc)
crc = partial_crc32_one(' ', crc);
break;
+ case SYM_ENUM_CONST:
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. */
if (subsym->expansion_trail) {
if (flag_dump_defs)
@@ -486,55 +591,30 @@ static unsigned long expand_and_crc_sym(struct symbol *sym, unsigned long crc)
case SYM_STRUCT:
case SYM_UNION:
case SYM_ENUM:
- subsym = find_symbol(cur->string, cur->tag);
+ subsym = find_symbol(cur->string, cur->tag, 0);
if (!subsym) {
- struct string_list *n, *t = NULL;
+ struct string_list *n;
error_with_pos("expand undefined %s %s",
- symbol_type_name[cur->tag],
+ symbol_types[cur->tag].name,
cur->string);
-
- n = xmalloc(sizeof(*n));
- n->string = xstrdup(symbol_type_name[cur->tag]);
- n->tag = SYM_NORMAL;
- n->next = t;
- t = n;
-
- n = xmalloc(sizeof(*n));
- n->string = xstrdup(cur->string);
- n->tag = SYM_NORMAL;
- n->next = t;
- t = n;
-
- n = xmalloc(sizeof(*n));
- n->string = xstrdup("{");
- n->tag = SYM_NORMAL;
- n->next = t;
- t = n;
-
- n = xmalloc(sizeof(*n));
- n->string = xstrdup("UNKNOWN");
- n->tag = SYM_NORMAL;
- n->next = t;
- t = n;
-
- n = xmalloc(sizeof(*n));
- n->string = xstrdup("}");
- n->tag = SYM_NORMAL;
- n->next = t;
- t = n;
-
+ n = concat_list(mk_node
+ (symbol_types[cur->tag].name),
+ mk_node(cur->string),
+ mk_node("{"),
+ mk_node("UNKNOWN"),
+ mk_node("}"), NULL);
subsym =
add_symbol(cur->string, cur->tag, n, 0);
}
if (subsym->expansion_trail) {
if (flag_dump_defs) {
fprintf(debugfile, "%s %s ",
- symbol_type_name[cur->tag],
+ symbol_types[cur->tag].name,
cur->string);
}
- crc = partial_crc32(symbol_type_name[cur->tag],
+ crc = partial_crc32(symbol_types[cur->tag].name,
crc);
crc = partial_crc32_one(' ', crc);
crc = partial_crc32(cur->string, crc);
@@ -565,7 +645,7 @@ void export_symbol(const char *name)
{
struct symbol *sym;
- sym = find_symbol(name, SYM_NORMAL);
+ sym = find_symbol(name, SYM_NORMAL, 0);
if (!sym)
error_with_pos("export undefined symbol %s", name);
else {
@@ -624,8 +704,8 @@ static void print_location(void)
static void print_type_name(enum symbol_type type, const char *name)
{
- if (type != SYM_NORMAL)
- fprintf(stderr, "%s %s", symbol_type_name[type], name);
+ if (symbol_types[type].name)
+ fprintf(stderr, "%s %s", symbol_types[type].name, name);
else
fprintf(stderr, "%s", name);
}
@@ -771,8 +851,8 @@ int main(int argc, char **argv)
if (sym->is_override)
fputs("override ", dumpfile);
- if (sym->type != SYM_NORMAL) {
- putc(symbol_type_name[sym->type][0], dumpfile);
+ if (symbol_types[sym->type].n) {
+ putc(symbol_types[sym->type].n, dumpfile);
putc('#', dumpfile);
}
fputs(sym->name, dumpfile);
diff --git a/scripts/genksyms/genksyms.h b/scripts/genksyms/genksyms.h
index 25c4d40cefc..7ec52ae3846 100644
--- a/scripts/genksyms/genksyms.h
+++ b/scripts/genksyms/genksyms.h
@@ -26,7 +26,8 @@
#include <stdio.h>
enum symbol_type {
- SYM_NORMAL, SYM_TYPEDEF, SYM_ENUM, SYM_STRUCT, SYM_UNION
+ SYM_NORMAL, SYM_TYPEDEF, SYM_ENUM, SYM_STRUCT, SYM_UNION,
+ SYM_ENUM_CONST
};
enum symbol_status {
@@ -58,7 +59,7 @@ typedef struct string_list **yystype;
extern int cur_line;
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 string_list *defn, int is_extern);
void export_symbol(const char *);
@@ -66,6 +67,8 @@ void export_symbol(const char *);
void free_node(struct string_list *list);
void free_list(struct string_list *s, struct string_list *e);
struct string_list *copy_node(struct string_list *);
+struct string_list *copy_list_range(struct string_list *start,
+ struct string_list *end);
int yylex(void);
int yyparse(void);
diff --git a/scripts/genksyms/lex.c_shipped b/scripts/genksyms/lex.c_shipped
index 2ac23bcca5b..af4939041e4 100644
--- a/scripts/genksyms/lex.c_shipped
+++ b/scripts/genksyms/lex.c_shipped
@@ -79,6 +79,7 @@ typedef int flex_int32_t;
typedef unsigned char flex_uint8_t;
typedef unsigned short int flex_uint16_t;
typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
/* Limits of integral types. */
#ifndef INT8_MIN
@@ -109,8 +110,6 @@ typedef unsigned int flex_uint32_t;
#define UINT32_MAX (4294967295U)
#endif
-#endif /* ! C99 */
-
#endif /* ! FLEXINT_H */
/* %endif */
@@ -456,16 +455,16 @@ struct yy_trans_info
flex_int32_t yy_verify;
flex_int32_t yy_nxt;
};
-static yyconst flex_int16_t yy_accept[76] =
+static yyconst flex_int16_t yy_accept[73] =
{ 0,
- 0, 0, 0, 0, 14, 12, 4, 3, 12, 7,
- 12, 12, 7, 12, 12, 12, 12, 12, 9, 9,
- 12, 12, 12, 4, 0, 5, 0, 7, 0, 6,
- 0, 0, 0, 0, 0, 0, 2, 8, 10, 10,
- 9, 0, 0, 9, 9, 0, 9, 0, 0, 11,
- 0, 0, 0, 10, 0, 10, 9, 9, 0, 0,
- 0, 0, 0, 0, 0, 10, 10, 0, 0, 0,
- 0, 0, 0, 1, 0
+ 0, 0, 14, 12, 4, 3, 12, 7, 12, 12,
+ 12, 12, 12, 9, 9, 12, 12, 7, 12, 12,
+ 4, 0, 5, 0, 7, 8, 0, 6, 0, 0,
+ 10, 10, 9, 0, 0, 9, 9, 0, 9, 0,
+ 0, 0, 0, 2, 0, 0, 11, 0, 10, 0,
+ 10, 9, 9, 0, 0, 0, 10, 10, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0
} ;
static yyconst flex_int32_t yy_ec[256] =
@@ -507,108 +506,104 @@ static yyconst flex_int32_t yy_meta[29] =
8, 7, 3, 3, 3, 1, 3, 1
} ;
-static yyconst flex_int16_t yy_base[88] =
+static yyconst flex_int16_t yy_base[85] =
{ 0,
- 0, 147, 21, 140, 145, 284, 39, 284, 26, 0,
- 32, 126, 40, 44, 115, 35, 36, 46, 50, 53,
- 39, 61, 54, 79, 65, 284, 0, 0, 66, 284,
- 0, 119, 79, 75, 123, 104, 284, 284, 107, 0,
- 79, 73, 76, 76, 66, 0, 0, 85, 86, 284,
- 133, 83, 91, 284, 99, 147, 284, 114, 122, 70,
- 107, 141, 172, 151, 135, 181, 284, 137, 114, 157,
- 149, 48, 45, 284, 284, 208, 214, 222, 230, 238,
- 246, 250, 255, 256, 261, 267, 275
+ 0, 145, 150, 266, 27, 266, 25, 0, 131, 23,
+ 23, 16, 23, 39, 31, 25, 39, 60, 22, 65,
+ 57, 43, 266, 0, 0, 266, 61, 266, 0, 128,
+ 74, 0, 113, 59, 62, 113, 52, 0, 0, 72,
+ 66, 110, 100, 266, 73, 74, 266, 70, 266, 90,
+ 103, 266, 84, 129, 108, 113, 143, 266, 107, 66,
+ 118, 137, 168, 120, 80, 91, 145, 143, 83, 41,
+ 266, 266, 190, 196, 204, 212, 220, 228, 232, 237,
+ 238, 243, 249, 257
} ;
-static yyconst flex_int16_t yy_def[88] =
+static yyconst flex_int16_t yy_def[85] =
{ 0,
- 75, 1, 1, 3, 75, 75, 75, 75, 76, 77,
- 78, 75, 77, 79, 75, 75, 75, 75, 75, 19,
- 75, 75, 75, 75, 76, 75, 80, 77, 78, 75,
- 81, 75, 76, 78, 79, 79, 75, 75, 75, 39,
- 19, 82, 83, 75, 75, 84, 20, 76, 78, 75,
- 79, 51, 85, 75, 75, 75, 75, 84, 79, 51,
- 79, 79, 79, 51, 75, 75, 75, 86, 79, 63,
- 86, 87, 87, 75, 0, 75, 75, 75, 75, 75,
- 75, 75, 75, 75, 75, 75, 75
+ 72, 1, 72, 72, 72, 72, 73, 74, 72, 72,
+ 75, 72, 72, 72, 14, 72, 72, 74, 72, 76,
+ 72, 73, 72, 77, 74, 72, 75, 72, 78, 72,
+ 72, 31, 14, 79, 80, 72, 72, 81, 15, 73,
+ 75, 76, 76, 72, 73, 75, 72, 82, 72, 72,
+ 72, 72, 81, 76, 54, 72, 72, 72, 76, 54,
+ 76, 76, 76, 54, 83, 76, 63, 83, 84, 84,
+ 72, 0, 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72
} ;
-static yyconst flex_int16_t yy_nxt[313] =
+static yyconst flex_int16_t yy_nxt[295] =
{ 0,
- 6, 7, 8, 7, 9, 6, 10, 6, 6, 11,
- 6, 6, 12, 6, 6, 6, 6, 6, 6, 10,
- 10, 10, 13, 10, 10, 6, 10, 6, 15, 16,
- 26, 15, 17, 18, 19, 20, 20, 21, 15, 22,
- 24, 30, 24, 38, 33, 36, 37, 74, 23, 34,
- 74, 27, 38, 38, 38, 38, 38, 31, 32, 39,
- 39, 39, 40, 41, 41, 42, 47, 47, 47, 26,
- 43, 38, 44, 45, 46, 30, 44, 75, 38, 38,
- 24, 38, 24, 26, 30, 40, 55, 55, 57, 26,
- 27, 31, 57, 43, 35, 30, 64, 64, 64, 57,
-
- 31, 65, 65, 75, 27, 36, 37, 35, 59, 37,
- 27, 31, 56, 56, 56, 59, 37, 51, 52, 52,
- 39, 39, 39, 59, 37, 37, 68, 53, 54, 54,
- 69, 50, 38, 54, 59, 37, 44, 45, 32, 37,
- 44, 35, 59, 37, 75, 14, 60, 60, 66, 66,
- 66, 37, 14, 72, 75, 61, 62, 63, 59, 61,
- 56, 56, 56, 69, 64, 64, 64, 69, 67, 67,
- 75, 75, 75, 67, 37, 35, 75, 75, 75, 61,
- 62, 75, 75, 61, 75, 70, 70, 70, 75, 75,
- 75, 70, 70, 70, 66, 66, 66, 75, 75, 75,
-
- 75, 75, 54, 54, 75, 75, 75, 54, 25, 25,
- 25, 25, 25, 25, 25, 25, 28, 75, 75, 28,
- 28, 28, 29, 29, 29, 29, 29, 29, 29, 29,
- 35, 35, 35, 35, 35, 35, 35, 35, 48, 75,
- 48, 48, 48, 48, 48, 48, 49, 75, 49, 49,
- 49, 49, 49, 49, 42, 42, 75, 42, 56, 75,
- 56, 58, 58, 58, 66, 75, 66, 71, 71, 71,
- 71, 71, 71, 71, 71, 73, 73, 73, 73, 73,
- 73, 73, 73, 5, 75, 75, 75, 75, 75, 75,
- 75, 75, 75, 75, 75, 75, 75, 75, 75, 75,
-
- 75, 75, 75, 75, 75, 75, 75, 75, 75, 75,
- 75, 75
+ 4, 5, 6, 5, 7, 4, 8, 9, 10, 11,
+ 9, 12, 13, 14, 15, 15, 16, 9, 17, 8,
+ 8, 8, 18, 8, 8, 4, 8, 19, 21, 23,
+ 21, 26, 28, 26, 26, 30, 31, 31, 31, 26,
+ 26, 26, 26, 71, 39, 39, 39, 23, 29, 26,
+ 24, 32, 33, 33, 34, 72, 26, 26, 21, 35,
+ 21, 36, 37, 38, 40, 36, 43, 44, 24, 41,
+ 28, 32, 50, 50, 52, 28, 23, 23, 52, 35,
+ 56, 56, 44, 28, 42, 71, 29, 31, 31, 31,
+ 42, 29, 59, 44, 48, 49, 49, 24, 24, 29,
+
+ 49, 43, 44, 51, 51, 51, 36, 37, 59, 44,
+ 36, 65, 44, 54, 55, 55, 51, 51, 51, 59,
+ 44, 64, 64, 64, 58, 58, 57, 57, 57, 58,
+ 59, 44, 42, 64, 64, 64, 52, 72, 59, 44,
+ 47, 66, 60, 60, 42, 44, 59, 69, 26, 72,
+ 20, 61, 62, 63, 72, 61, 57, 57, 57, 66,
+ 72, 72, 72, 66, 49, 49, 72, 61, 62, 49,
+ 44, 61, 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 67, 67, 67, 72, 72, 72, 67, 67, 67,
+ 22, 22, 22, 22, 22, 22, 22, 22, 25, 72,
+
+ 72, 25, 25, 25, 27, 27, 27, 27, 27, 27,
+ 27, 27, 42, 42, 42, 42, 42, 42, 42, 42,
+ 45, 72, 45, 45, 45, 45, 45, 45, 46, 72,
+ 46, 46, 46, 46, 46, 46, 34, 34, 72, 34,
+ 51, 72, 51, 53, 53, 53, 57, 72, 57, 68,
+ 68, 68, 68, 68, 68, 68, 68, 70, 70, 70,
+ 70, 70, 70, 70, 70, 3, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72
+
} ;
-static yyconst flex_int16_t yy_chk[313] =
+static yyconst flex_int16_t yy_chk[295] =
{ 0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 3, 3,
- 9, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 7, 11, 7, 16, 13, 14, 14, 73, 3, 13,
- 72, 9, 16, 17, 17, 21, 21, 11, 18, 18,
- 18, 18, 19, 19, 19, 19, 20, 20, 20, 25,
- 19, 23, 19, 19, 19, 29, 19, 20, 22, 22,
- 24, 23, 24, 33, 34, 42, 43, 43, 45, 48,
- 25, 29, 45, 42, 60, 49, 52, 52, 52, 44,
-
- 34, 53, 53, 41, 33, 36, 36, 52, 61, 61,
- 48, 49, 55, 55, 55, 69, 69, 36, 36, 36,
- 39, 39, 39, 59, 59, 35, 59, 39, 39, 39,
- 61, 32, 15, 39, 51, 51, 58, 58, 12, 68,
- 58, 68, 62, 62, 5, 4, 51, 51, 65, 65,
- 65, 71, 2, 71, 0, 51, 51, 51, 70, 51,
- 56, 56, 56, 62, 64, 64, 64, 62, 56, 56,
- 0, 0, 0, 56, 63, 64, 0, 0, 0, 70,
- 70, 0, 0, 70, 0, 63, 63, 63, 0, 0,
- 0, 63, 63, 63, 66, 66, 66, 0, 0, 0,
-
- 0, 0, 66, 66, 0, 0, 0, 66, 76, 76,
- 76, 76, 76, 76, 76, 76, 77, 0, 0, 77,
- 77, 77, 78, 78, 78, 78, 78, 78, 78, 78,
- 79, 79, 79, 79, 79, 79, 79, 79, 80, 0,
- 80, 80, 80, 80, 80, 80, 81, 0, 81, 81,
- 81, 81, 81, 81, 82, 82, 0, 82, 83, 0,
- 83, 84, 84, 84, 85, 0, 85, 86, 86, 86,
- 86, 86, 86, 86, 86, 87, 87, 87, 87, 87,
- 87, 87, 87, 75, 75, 75, 75, 75, 75, 75,
- 75, 75, 75, 75, 75, 75, 75, 75, 75, 75,
-
- 75, 75, 75, 75, 75, 75, 75, 75, 75, 75,
- 75, 75
+ 1, 1, 1, 1, 1, 1, 1, 1, 5, 7,
+ 5, 10, 11, 12, 12, 13, 13, 13, 13, 19,
+ 10, 16, 16, 70, 15, 15, 15, 22, 11, 19,
+ 7, 14, 14, 14, 14, 15, 17, 17, 21, 14,
+ 21, 14, 14, 14, 18, 14, 20, 20, 22, 18,
+ 27, 34, 35, 35, 37, 41, 40, 45, 37, 34,
+ 48, 48, 65, 46, 65, 69, 27, 31, 31, 31,
+ 60, 41, 66, 66, 31, 31, 31, 40, 45, 46,
+
+ 31, 43, 43, 50, 50, 50, 53, 53, 59, 59,
+ 53, 59, 42, 43, 43, 43, 51, 51, 51, 61,
+ 61, 55, 55, 55, 51, 51, 56, 56, 56, 51,
+ 54, 54, 55, 64, 64, 64, 36, 33, 62, 62,
+ 30, 61, 54, 54, 64, 68, 67, 68, 9, 3,
+ 2, 54, 54, 54, 0, 54, 57, 57, 57, 62,
+ 0, 0, 0, 62, 57, 57, 0, 67, 67, 57,
+ 63, 67, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 63, 63, 63, 0, 0, 0, 63, 63, 63,
+ 73, 73, 73, 73, 73, 73, 73, 73, 74, 0,
+
+ 0, 74, 74, 74, 75, 75, 75, 75, 75, 75,
+ 75, 75, 76, 76, 76, 76, 76, 76, 76, 76,
+ 77, 0, 77, 77, 77, 77, 77, 77, 78, 0,
+ 78, 78, 78, 78, 78, 78, 79, 79, 0, 79,
+ 80, 0, 80, 81, 81, 81, 82, 0, 82, 83,
+ 83, 83, 83, 83, 83, 83, 83, 84, 84, 84,
+ 84, 84, 84, 84, 84, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72
+
} ;
static yy_state_type yy_last_accepting_state;
@@ -619,8 +614,8 @@ int yy_flex_debug = 1;
static yyconst flex_int16_t yy_rule_linenum[13] =
{ 0,
- 71, 72, 73, 76, 79, 80, 81, 87, 88, 89,
- 91, 94
+ 67, 68, 69, 72, 75, 76, 77, 83, 84, 85,
+ 87, 90
} ;
/* The intent behind this definition is that it'll catch
@@ -667,15 +662,11 @@ char *yytext;
and then we categorize those basic tokens in the second stage. */
#define YY_DECL static int yylex1(void)
-/* Version 2 checksumming does proper tokenization; version 1 wasn't
- quite so pedantic. */
-
/* We don't do multiple input files. */
#define YY_NO_INPUT 1
-#line 676 "scripts/genksyms/lex.c"
+#line 668 "scripts/genksyms/lex.c"
#define INITIAL 0
-#define V2_TOKENS 1
#ifndef YY_NO_UNISTD_H
/* Special case for "unistd.h", since it is non-ANSI. We include it way
@@ -808,7 +799,7 @@ static int input (void );
if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
{ \
int c = '*'; \
- size_t n; \
+ int n; \
for ( n = 0; n < max_size && \
(c = getc( yyin )) != EOF && c != '\n'; ++n ) \
buf[n] = (char) c; \
@@ -918,12 +909,12 @@ YY_DECL
register int yy_act;
/* %% [7.0] user's declarations go here */
-#line 67 "scripts/genksyms/lex.l"
+#line 63 "scripts/genksyms/lex.l"
/* Keep track of our location in the original source files. */
-#line 927 "scripts/genksyms/lex.c"
+#line 918 "scripts/genksyms/lex.c"
if ( !(yy_init) )
{
@@ -987,13 +978,13 @@ yy_match:
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 76 )
+ if ( yy_current_state >= 73 )
yy_c = yy_meta[(unsigned int) yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
++yy_cp;
}
- while ( yy_base[yy_current_state] != 284 );
+ while ( yy_base[yy_current_state] != 266 );
yy_find_action:
/* %% [10.0] code to find the action number goes here */
@@ -1041,42 +1032,42 @@ do_action: /* This label is used only to access EOF actions. */
case 1:
/* rule 1 can match eol */
YY_RULE_SETUP
-#line 71 "scripts/genksyms/lex.l"
+#line 67 "scripts/genksyms/lex.l"
return FILENAME;
YY_BREAK
case 2:
/* rule 2 can match eol */
YY_RULE_SETUP
-#line 72 "scripts/genksyms/lex.l"
+#line 68 "scripts/genksyms/lex.l"
cur_line++;
YY_BREAK
case 3:
/* rule 3 can match eol */
YY_RULE_SETUP
-#line 73 "scripts/genksyms/lex.l"
+#line 69 "scripts/genksyms/lex.l"
cur_line++;
YY_BREAK
/* Ignore all other whitespace. */
case 4:
YY_RULE_SETUP
-#line 76 "scripts/genksyms/lex.l"
+#line 72 "scripts/genksyms/lex.l"
;
YY_BREAK
case 5:
/* rule 5 can match eol */
YY_RULE_SETUP
-#line 79 "scripts/genksyms/lex.l"
+#line 75 "scripts/genksyms/lex.l"
return STRING;
YY_BREAK
case 6:
/* rule 6 can match eol */
YY_RULE_SETUP
-#line 80 "scripts/genksyms/lex.l"
+#line 76 "scripts/genksyms/lex.l"
return CHAR;
YY_BREAK
case 7:
YY_RULE_SETUP
-#line 81 "scripts/genksyms/lex.l"
+#line 77 "scripts/genksyms/lex.l"
return IDENT;
YY_BREAK
/* The Pedant requires that the other C multi-character tokens be
@@ -1085,38 +1076,37 @@ return IDENT;
around them properly. */
case 8:
YY_RULE_SETUP
-#line 87 "scripts/genksyms/lex.l"
+#line 83 "scripts/genksyms/lex.l"
return OTHER;
YY_BREAK
case 9:
YY_RULE_SETUP
-#line 88 "scripts/genksyms/lex.l"
+#line 84 "scripts/genksyms/lex.l"
return INT;
YY_BREAK
case 10:
YY_RULE_SETUP
-#line 89 "scripts/genksyms/lex.l"
+#line 85 "scripts/genksyms/lex.l"
return REAL;
YY_BREAK
case 11:
YY_RULE_SETUP
-#line 91 "scripts/genksyms/lex.l"
+#line 87 "scripts/genksyms/lex.l"
return DOTS;
YY_BREAK
/* All other tokens are single characters. */
case 12:
YY_RULE_SETUP
-#line 94 "scripts/genksyms/lex.l"
+#line 90 "scripts/genksyms/lex.l"
return yytext[0];
YY_BREAK
case 13:
YY_RULE_SETUP
-#line 97 "scripts/genksyms/lex.l"
+#line 93 "scripts/genksyms/lex.l"
ECHO;
YY_BREAK
-#line 1118 "scripts/genksyms/lex.c"
+#line 1109 "scripts/genksyms/lex.c"
case YY_STATE_EOF(INITIAL):
-case YY_STATE_EOF(V2_TOKENS):
yyterminate();
case YY_END_OF_BUFFER:
@@ -1429,7 +1419,7 @@ static int yy_get_next_buffer (void)
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 76 )
+ if ( yy_current_state >= 73 )
yy_c = yy_meta[(unsigned int) yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@@ -1462,11 +1452,11 @@ static int yy_get_next_buffer (void)
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 76 )
+ if ( yy_current_state >= 73 )
yy_c = yy_meta[(unsigned int) yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
- yy_is_jam = (yy_current_state == 75);
+ yy_is_jam = (yy_current_state == 72);
return yy_is_jam ? 0 : yy_current_state;
}
@@ -2252,7 +2242,7 @@ void yyfree (void * ptr )
/* %ok-for-header */
-#line 97 "scripts/genksyms/lex.l"
+#line 93 "scripts/genksyms/lex.l"
@@ -2263,12 +2253,23 @@ void yyfree (void * ptr )
/* Macros to append to our phrase collection list. */
+/*
+ * We mark any token, that that equals to a known enumerator, as
+ * SYM_ENUM_CONST. The parser will change this for struct and union tags later,
+ * the only problem is struct and union members:
+ * enum e { a, b }; struct s { int a, b; }
+ * but in this case, the only effect will be, that the ABI checksums become
+ * more volatile, which is acceptable. Also, such collisions are quite rare,
+ * so far it was only observed in include/linux/telephony.h.
+ */
#define _APP(T,L) do { \
cur_node = next_node; \
next_node = xmalloc(sizeof(*next_node)); \
next_node->next = cur_node; \
cur_node->string = memcpy(xmalloc(L+1), T, L+1); \
- cur_node->tag = SYM_NORMAL; \
+ cur_node->tag = \
+ find_symbol(cur_node->string, SYM_ENUM_CONST, 1)?\
+ SYM_ENUM_CONST : SYM_NORMAL ; \
} while (0)
#define APP _APP(yytext, yyleng)
@@ -2294,7 +2295,6 @@ yylex(void)
if (lexstate == ST_NOTSTARTED)
{
- BEGIN(V2_TOKENS);
next_node = xmalloc(sizeof(*next_node));
next_node->next = NULL;
lexstate = ST_NORMAL;
@@ -2347,8 +2347,8 @@ repeat:
case STRUCT_KEYW:
case UNION_KEYW:
- dont_want_brace_phrase = 3;
case ENUM_KEYW:
+ dont_want_brace_phrase = 3;
suppress_type_lookup = 2;
goto fini;
@@ -2358,8 +2358,7 @@ repeat:
}
if (!suppress_type_lookup)
{
- struct symbol *sym = find_symbol(yytext, SYM_TYPEDEF);
- if (sym && sym->type == SYM_TYPEDEF)
+ if (find_symbol(yytext, SYM_TYPEDEF, 1))
token = TYPE;
}
}
@@ -2478,7 +2477,20 @@ repeat:
++count;
APP;
goto repeat;
- case ')': case ']': case '}':
+ case '}':
+ /* is this the last line of an enum declaration? */
+ if (count == 0)
+ {
+ /* Put back the token we just read so's we can find it again
+ after registering the expression. */
+ unput(token);
+
+ lexstate = ST_NORMAL;
+ token = EXPRESSION_PHRASE;
+ break;
+ }
+ /* FALLTHRU */
+ case ')': case ']':
--count;
APP;
goto repeat;
@@ -2567,143 +2579,4 @@ fini:
return token;
}
-/* A Bison parser, made by GNU Bison 2.3. */
-
-/* Skeleton interface for Bison's Yacc-like parsers in C
-
- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
- Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA. */
-
-/* As a special exception, you may create a larger work that contains
- part or all of the Bison parser skeleton and distribute that work
- under terms of your choice, so long as that work isn't itself a
- parser generator using the skeleton or a modified version thereof
- as a parser skeleton. Alternatively, if you modify or redistribute
- the parser skeleton itself, you may (at your option) remove this
- special exception, which will cause the skeleton and the resulting
- Bison output files to be licensed under the GNU General Public
- License without this special exception.
-
- This special exception was added by the Free Software Foundation in
- version 2.2 of Bison. */
-
-/* Tokens. */
-#ifndef YYTOKENTYPE
-# define YYTOKENTYPE
- /* Put the tokens into the symbol table, so that GDB and other debuggers
- know about them. */
- enum yytokentype {
- ASM_KEYW = 258,
- ATTRIBUTE_KEYW = 259,
- AUTO_KEYW = 260,
- BOOL_KEYW = 261,
- CHAR_KEYW = 262,
- CONST_KEYW = 263,
- DOUBLE_KEYW = 264,
- ENUM_KEYW = 265,
- EXTERN_KEYW = 266,
- EXTENSION_KEYW = 267,
- FLOAT_KEYW = 268,
- INLINE_KEYW = 269,
- INT_KEYW = 270,
- LONG_KEYW = 271,
- REGISTER_KEYW = 272,
- RESTRICT_KEYW = 273,
- SHORT_KEYW = 274,
- SIGNED_KEYW = 275,
- STATIC_KEYW = 276,
- STRUCT_KEYW = 277,
- TYPEDEF_KEYW = 278,
- UNION_KEYW = 279,
- UNSIGNED_KEYW = 280,
- VOID_KEYW = 281,
- VOLATILE_KEYW = 282,
- TYPEOF_KEYW = 283,
- EXPORT_SYMBOL_KEYW = 284,
- ASM_PHRASE = 285,
- ATTRIBUTE_PHRASE = 286,
- BRACE_PHRASE = 287,
- BRACKET_PHRASE = 288,
- EXPRESSION_PHRASE = 289,
- CHAR = 290,
- DOTS = 291,
- IDENT = 292,
- INT = 293,
- REAL = 294,
- STRING = 295,
- TYPE = 296,
- OTHER = 297,
- FILENAME = 298
- };
-#endif
-/* Tokens. */
-#define ASM_KEYW 258