summaryrefslogtreecommitdiffstats
path: root/contrib/gcc/gengtype-yacc.y
diff options
context:
space:
mode:
authorkan <kan@FreeBSD.org>2007-05-19 01:19:51 +0000
committerkan <kan@FreeBSD.org>2007-05-19 01:19:51 +0000
commit1f9ea4d0a40cca64d60cf4dab152349da7b9dddf (patch)
tree0cb530c9c38af219e6dda2994c078b6b2b9ad853 /contrib/gcc/gengtype-yacc.y
parent4895159b2b4f648051c1f139faa7b6dc50c2bfcb (diff)
downloadFreeBSD-src-1f9ea4d0a40cca64d60cf4dab152349da7b9dddf.zip
FreeBSD-src-1f9ea4d0a40cca64d60cf4dab152349da7b9dddf.tar.gz
GCC 4.2.0 release.
Diffstat (limited to 'contrib/gcc/gengtype-yacc.y')
-rw-r--r--contrib/gcc/gengtype-yacc.y85
1 files changed, 50 insertions, 35 deletions
diff --git a/contrib/gcc/gengtype-yacc.y b/contrib/gcc/gengtype-yacc.y
index 928c962..8bdf983 100644
--- a/contrib/gcc/gengtype-yacc.y
+++ b/contrib/gcc/gengtype-yacc.y
@@ -1,6 +1,6 @@
/* -*- indented-text -*- */
/* Process source files and output type information.
- Copyright (C) 2002 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2004 Free Software Foundation, Inc.
This file is part of GCC.
@@ -16,8 +16,8 @@ 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, 59 Temple Place - Suite 330, Boston, MA
-02111-1307, USA. */
+Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301, USA. */
%{
#include "bconfig.h"
@@ -44,6 +44,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
%token STRUCT
%token ENUM
%token ALIAS
+%token NESTED_PTR
%token <s>PARAM_IS
%token NUM
%token PERCENTPERCENT "%%"
@@ -57,7 +58,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
%%
@@ -159,10 +160,10 @@ yacc_ids: /* empty */
{ $$ = NULL; }
| yacc_ids ID
{
- pair_p p = xcalloc (1, sizeof (*p));
+ pair_p p = XCNEW (struct pair);
p->next = $1;
p->line = lexer_line;
- p->opt = xmalloc (sizeof (*(p->opt)));
+ p->opt = XNEW (struct options);
p->opt->name = "tag";
p->opt->next = NULL;
p->opt->info = (char *)$2;
@@ -170,10 +171,10 @@ yacc_ids: /* empty */
}
| yacc_ids CHAR
{
- pair_p p = xcalloc (1, sizeof (*p));
+ pair_p p = XCNEW (struct pair);
p->next = $1;
p->line = lexer_line;
- p->opt = xmalloc (sizeof (*(p->opt)));
+ p->opt = XNEW (struct options);
p->opt->name = "tag";
p->opt->next = NULL;
p->opt->info = xasprintf ("'%s'", $2);
@@ -184,7 +185,7 @@ yacc_ids: /* empty */
struct_fields: { $$ = NULL; }
| type optionsopt ID bitfieldopt ';' struct_fields
{
- pair_p p = xmalloc (sizeof (*p));
+ pair_p p = XNEW (struct pair);
p->type = adjust_field_type ($1, $2);
p->opt = $2;
p->name = $3;
@@ -194,7 +195,7 @@ struct_fields: { $$ = NULL; }
}
| type optionsopt ID ARRAY ';' struct_fields
{
- pair_p p = xmalloc (sizeof (*p));
+ pair_p p = XNEW (struct pair);
p->type = adjust_field_type (create_array ($1, $4), $2);
p->opt = $2;
p->name = $3;
@@ -204,7 +205,7 @@ struct_fields: { $$ = NULL; }
}
| type optionsopt ID ARRAY ARRAY ';' struct_fields
{
- pair_p p = xmalloc (sizeof (*p));
+ pair_p p = XNEW (struct pair);
p->type = create_array (create_array ($1, $5), $4);
p->opt = $2;
p->name = $3;
@@ -212,11 +213,16 @@ struct_fields: { $$ = NULL; }
p->line = lexer_line;
$$ = p;
}
+ | type ':' bitfieldlen ';' struct_fields
+ { $$ = $5; }
;
bitfieldopt: /* empty */
- | ':' NUM
- | ':' ID
+ | ':' bitfieldlen
+ ;
+
+bitfieldlen: NUM | ID
+ { }
;
type: SCALAR
@@ -226,17 +232,11 @@ type: SCALAR
| type '*'
{ $$ = create_pointer ($1); }
| STRUCT ID '{' struct_fields '}'
- {
- new_structure ($2, 0, &lexer_line, $4, NULL);
- $$ = find_structure ($2, 0);
- }
+ { $$ = new_structure ($2, 0, &lexer_line, $4, NULL); }
| STRUCT ID
{ $$ = find_structure ($2, 0); }
| UNION ID '{' struct_fields '}'
- {
- new_structure ($2, 1, &lexer_line, $4, NULL);
- $$ = find_structure ($2, 1);
- }
+ { $$ = new_structure ($2, 1, &lexer_line, $4, NULL); }
| UNION ID
{ $$ = find_structure ($2, 1); }
| ENUM ID
@@ -268,20 +268,22 @@ type_option : ALIAS
{ $$ = $1; }
;
-option: type_option '(' type ')'
- {
- options_p o = xmalloc (sizeof (*o));
- o->name = $1;
- o->info = adjust_field_type ($3, NULL);
- $$ = o;
- }
- | ID '(' STRING ')'
- {
- options_p o = xmalloc (sizeof (*o));
- o->name = $1;
- o->info = (void *)$3;
- $$ = o;
- }
+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
@@ -299,4 +301,17 @@ optionseq: option
optionseqopt: { $$ = NULL; }
| optionseq { $$ = $1; }
;
+
+stringseq: STRING
+ { $$ = $1; }
+ | stringseq STRING
+ {
+ size_t l1 = strlen ($1);
+ size_t l2 = strlen ($2);
+ char *s = XRESIZEVEC (char, $1, l1 + l2 + 1);
+ memcpy (s + l1, $2, l2 + 1);
+ XDELETE ($2);
+ $$ = s;
+ }
+ ;
%%
OpenPOWER on IntegriCloud