aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/genksyms/parse.y
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2011-03-21 15:55:26 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2011-03-21 15:55:26 -0700
commiteddecbb601c9ea3fab7e67d7892010fc9426d1e6 (patch)
tree4bfa4740ae554e5c5a8468e74b39531a6153ce9f /scripts/genksyms/parse.y
parent0bf8c869701039b12c3520cb1bb1689595ab108b (diff)
parentf2c23f65f63fe0dd83fc94efdfae0364c74458b8 (diff)
downloadlinux-eddecbb601c9ea3fab7e67d7892010fc9426d1e6.tar.gz
Merge branch 'kbuild' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild-2.6
* 'kbuild' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild-2.6: kbuild: Make DEBUG_SECTION_MISMATCH selectable, but not on by default genksyms: Regenerate lexer and parser genksyms: Track changes to enum constants genksyms: simplify usage of find_symbol() genksyms: Add helpers for building string lists genksyms: Simplify printing of symbol types genksyms: Simplify lexer genksyms: Do not paste the bison header file to lex.c modpost: fix trailing comma KBuild: silence "'scripts/unifdef' is up to date." kbuild: Add extra gcc checks kbuild: reenable section mismatch analysis unifdef: update to upstream version 2.5
Diffstat (limited to 'scripts/genksyms/parse.y')
-rw-r--r--scripts/genksyms/parse.y34
1 files changed, 30 insertions, 4 deletions
diff --git a/scripts/genksyms/parse.y b/scripts/genksyms/parse.y
index 09a265cd7193..ba5c242866c1 100644
--- a/scripts/genksyms/parse.y
+++ b/scripts/genksyms/parse.y
@@ -25,6 +25,7 @@
#include <assert.h>
#include <stdlib.h>
+#include <string.h>
#include "genksyms.h"
static int is_typedef;
@@ -227,16 +228,19 @@ type_specifier:
add_symbol(i->string, SYM_UNION, s, is_extern);
$$ = $3;
}
- | ENUM_KEYW IDENT BRACE_PHRASE
+ | ENUM_KEYW IDENT enum_body
{ struct string_list *s = *$3, *i = *$2, *r;
r = copy_node(i); r->tag = SYM_ENUM;
r->next = (*$1)->next; *$3 = r; (*$1)->next = NULL;
add_symbol(i->string, SYM_ENUM, s, is_extern);
$$ = $3;
}
-
- /* Anonymous s/u/e definitions. Nothing needs doing. */
- | ENUM_KEYW BRACE_PHRASE { $$ = $2; }
+ /*
+ * Anonymous enum definition. Tell add_symbol() to restart its counter.
+ */
+ | ENUM_KEYW enum_body
+ { add_symbol(NULL, SYM_ENUM, NULL, 0); $$ = $2; }
+ /* Anonymous s/u definitions. Nothing needs doing. */
| STRUCT_KEYW class_body { $$ = $2; }
| UNION_KEYW class_body { $$ = $2; }
;
@@ -449,6 +453,28 @@ attribute_opt:
| attribute_opt ATTRIBUTE_PHRASE
;
+enum_body:
+ '{' enumerator_list '}' { $$ = $3; }
+ | '{' enumerator_list ',' '}' { $$ = $4; }
+ ;
+
+enumerator_list:
+ enumerator
+ | enumerator_list ',' enumerator
+
+enumerator:
+ IDENT
+ {
+ const char *name = strdup((*$1)->string);
+ add_symbol(name, SYM_ENUM_CONST, NULL, 0);
+ }
+ | IDENT '=' EXPRESSION_PHRASE
+ {
+ const char *name = strdup((*$1)->string);
+ struct string_list *expr = copy_list_range(*$3, *$2);
+ add_symbol(name, SYM_ENUM_CONST, expr, 0);
+ }
+
asm_definition:
ASM_PHRASE ';' { $$ = $2; }
;