OSDN Git Service

PR optimization/13424 (hppa), bootstrap/14462, c/14828
[pf3gnuchains/gcc-fork.git] / gcc / gengtype-yacc.y
index 3ff92d3..f6a9bac 100644 (file)
@@ -20,8 +20,10 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 02111-1307, USA.  */
 
 %{
-#include "hconfig.h"
+#include "bconfig.h"
 #include "system.h"
+#include "coretypes.h"
+#include "tm.h"
 #include "gengtype.h"
 #define YYERROR_VERBOSE
 %}
@@ -37,12 +39,12 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 %token <t>ENT_STRUCT
 %token ENT_EXTERNSTATIC
 %token ENT_YACCUNION
-%token GTY_TOKEN "GTY"
-%token UNION "union"
-%token STRUCT "struct"
-%token ENUM "enum"
-%token ALIAS "ptr_alias"
-%token PARAM_IS "param_is"
+%token GTY_TOKEN
+%token UNION
+%token STRUCT
+%token ENUM
+%token ALIAS
+%token <s>PARAM_IS
 %token NUM
 %token PERCENTPERCENT "%%"
 %token <t>SCALAR
@@ -55,7 +57,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 %type <p> struct_fields yacc_ids yacc_typematch
 %type <t> type lasttype
 %type <o> optionsopt options option optionseq optionseqopt
-%type <s> type_option
+%type <s> type_option stringseq
 
 %%
 
@@ -174,8 +176,7 @@ yacc_ids: /* empty */
          p->opt = xmalloc (sizeof (*(p->opt)));
          p->opt->name = "tag";
          p->opt->next = NULL;
-         p->opt->info = xmalloc (3 + strlen ($2));
-         sprintf (p->opt->info, "'%s'", $2);
+         p->opt->info = xasprintf ("'%s'", $2);
          $$ = p;
        }
      ;
@@ -215,6 +216,7 @@ struct_fields: { $$ = NULL; }
 
 bitfieldopt: /* empty */
             | ':' NUM
+            | ':' ID
             ;
 
 type: SCALAR
@@ -263,23 +265,15 @@ options: GTY_TOKEN '(' '(' optionseqopt ')' ')'
 type_option : ALIAS
                { $$ = "ptr_alias"; }
              | PARAM_IS
-               { $$ = "param_is"; }
+               { $$ = $1; }
              ;
 
-option:        type_option '(' type ')'
-          {
-            options_p o = xmalloc (sizeof (*o));
-            o->name = $1;
-            o->info = $3;
-            $$ = o;
-          }
-       | ID '(' STRING ')'
-          {
-            options_p o = xmalloc (sizeof (*o));
-            o->name = $1;
-            o->info = (void *)$3;
-            $$ = o;
-          }
+option:   ID
+           { $$ = create_option ($1, (void *)""); }
+        | ID '(' stringseq ')'
+            { $$ = create_option ($1, (void *)$3); }
+       | type_option '(' type ')'
+           { $$ = create_option ($1, adjust_field_type ($3, NULL)); }
        ;
 
 optionseq: option
@@ -297,4 +291,17 @@ optionseq: option
 optionseqopt: { $$ = NULL; }
              | optionseq { $$ = $1; }
              ;
+
+stringseq: STRING
+            { $$ = $1; }
+          | stringseq STRING
+            {
+              size_t l1 = strlen ($1);
+              size_t l2 = strlen ($2);
+              char *s = xrealloc ((char *)$1, l1 + l2 + 1);
+              memcpy (s + l1, $2, l2 + 1);
+              free ((void *)$2);
+              $$ = s;
+            }
+          ;
 %%