OSDN Git Service

* config/sh/sh.c (calc_live_regs): Use
[pf3gnuchains/gcc-fork.git] / gcc / gengtype-yacc.y
index 40c22ef..235ec54 100644 (file)
@@ -1,12 +1,12 @@
 /* -*- indented-text -*- */
 /* Process source files and output type information.
-   Copyright (C) 2002, 2004 Free Software Foundation, Inc.
+   Copyright (C) 2002, 2004, 2007 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
 GCC 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
+Software Foundation; either version 3, or (at your option) any later
 version.
 
 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
@@ -15,9 +15,8 @@ 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 GCC; see the file COPYING.  If not, write to the Free
-Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
-02110-1301, USA.  */
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
 
 %{
 #include "bconfig.h"
@@ -35,8 +34,10 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
   const char *s;
 }
 
-%token <t>ENT_TYPEDEF_STRUCT
-%token <t>ENT_STRUCT
+%token <s>ENT_TYPEDEF_STRUCT
+%token <s>ENT_STRUCT
+%token <s>ENT_TYPEDEF_UNION
+%token <s>ENT_UNION
 %token ENT_EXTERNSTATIC
 %token GTY_TOKEN
 %token VEC_TOKEN
@@ -55,7 +56,7 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
 
 %type <p> struct_fields
 %type <t> type lasttype
-%type <o> optionsopt options option optionseq optionseqopt
+%type <o> optionsopt options optionseq
 %type <s> type_option stringseq
 
 %%
@@ -68,21 +69,30 @@ start: /* empty */
 
 typedef_struct: ENT_TYPEDEF_STRUCT options '{' struct_fields '}' ID
                   {
-                    new_structure ($1->u.s.tag, UNION_P ($1), &lexer_line,
-                                   $4, $2);
-                    do_typedef ($6, $1, &lexer_line);
+                    type_p t = new_structure ($1, false, &lexer_line, $4, $2);
+                    do_typedef ($6, t, &lexer_line);
                     lexer_toplevel_done = 1;
                   }
-                ';'
-                  {}
+                 ';'
+               | ENT_TYPEDEF_UNION options '{' struct_fields '}' ID
+                  {
+                    type_p t = new_structure ($1, true, &lexer_line, $4, $2);
+                    do_typedef ($6, t, &lexer_line);
+                    lexer_toplevel_done = 1;
+                  }
+                 ';'
                | ENT_STRUCT options '{' struct_fields '}'
                   {
-                    new_structure ($1->u.s.tag, UNION_P ($1), &lexer_line,
-                                   $4, $2);
+                    new_structure ($1, false, &lexer_line, $4, $2);
+                    lexer_toplevel_done = 1;
+                  }
+                 ';'
+               | ENT_UNION options '{' struct_fields '}'
+                  {
+                    new_structure ($1, true, &lexer_line, $4, $2);
                     lexer_toplevel_done = 1;
                   }
-                ';'
-                  {}
+                 ';'
                ;
 
 externstatic: ENT_EXTERNSTATIC options lasttype ID semiequal
@@ -117,33 +127,17 @@ semiequal: ';'
 struct_fields: { $$ = NULL; }
               | type optionsopt ID bitfieldopt ';' struct_fields
                  {
-                   pair_p p = XNEW (struct pair);
-                   p->type = adjust_field_type ($1, $2);
-                   p->opt = $2;
-                   p->name = $3;
-                   p->next = $6;
-                   p->line = lexer_line;
-                   $$ = p;
+                   $$ = create_field_at ($6, $1, $3, $2, &lexer_line);
                  }
               | type optionsopt ID ARRAY ';' struct_fields
                  {
-                   pair_p p = XNEW (struct pair);
-                   p->type = adjust_field_type (create_array ($1, $4), $2);
-                   p->opt = $2;
-                   p->name = $3;
-                   p->next = $6;
-                   p->line = lexer_line;
-                   $$ = p;
+                   $$ = create_field_at ($6, create_array ($1, $4),
+                                         $3, $2, &lexer_line);
                  }
               | type optionsopt ID ARRAY ARRAY ';' struct_fields
                  {
-                   pair_p p = XNEW (struct pair);
-                   p->type = create_array (create_array ($1, $5), $4);
-                   p->opt = $2;
-                   p->name = $3;
-                   p->next = $7;
-                   p->line = lexer_line;
-                   $$ = p;
+                   type_p arr = create_array (create_array ($1, $5), $4);
+                   $$ = create_field_at ($7, arr, $3, $2, &lexer_line);
                  }
               | type ':' bitfieldlen ';' struct_fields
                  { $$ = $5; }
@@ -193,7 +187,7 @@ optionsopt: { $$ = NULL; }
            | options { $$ = $1; }
            ;
 
-options: GTY_TOKEN '(' '(' optionseqopt ')' ')'
+options: GTY_TOKEN '(' '(' optionseq ')' ')'
           { $$ = $4; }
         ;
 
@@ -203,39 +197,19 @@ type_option : ALIAS
                { $$ = $1; }
              ;
 
-option:   ID
-           { $$ = create_option (NULL, $1, (void *)""); }
-        | ID '(' stringseq ')'
-            { $$ = create_option (NULL, $1, (void *)$3); }
-       | type_option '(' type ')'
-           { $$ = create_option (NULL, $1, adjust_field_type ($3, NULL)); }
-       | NESTED_PTR '(' type ',' stringseq ',' stringseq ')'
-           {
-             struct nested_ptr_data d;
-
-             d.type = adjust_field_type ($3, NULL);
-             d.convert_to = $5;
-             d.convert_from = $7;
-             $$ = create_option (NULL, "nested_ptr",
-                                 xmemdup (&d, sizeof (d), sizeof (d)));
-           }
-       ;
-
-optionseq: option
-             {
-               $1->next = NULL;
-               $$ = $1;
-             }
-           | optionseq ',' option
-             {
-               $3->next = $1;
-               $$ = $3;
-             }
-           ;
-
-optionseqopt: { $$ = NULL; }
-             | optionseq { $$ = $1; }
-             ;
+optionseq: { $$ = NULL; }
+       | optionseq commaopt ID
+          { $$ = create_option ($1, $3, (void *)""); }
+       | optionseq commaopt ID '(' stringseq ')'
+          { $$ = create_option ($1, $3, (void *)$5); }
+       | optionseq commaopt type_option '(' type ')'
+          { $$ = create_option ($1, $3, adjust_field_type ($5, 0)); }
+       | optionseq commaopt NESTED_PTR '(' type ',' stringseq ',' stringseq ')'
+          { $$ = create_nested_ptr_option ($1, $5, $7, $9); }
+
+commaopt: /* nothing */
+         | ','
+         ;
 
 stringseq: STRING
             { $$ = $1; }