/* -*- 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.
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 "hconfig.h"
+#include "bconfig.h"
#include "system.h"
+#include "coretypes.h"
+#include "tm.h"
#include "gengtype.h"
#define YYERROR_VERBOSE
%}
%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 NESTED_PTR
+%token <s>PARAM_IS
%token NUM
%token PERCENTPERCENT "%%"
%token <t>SCALAR
%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
%%
| typedef_struct start
| externstatic start
| yacc_union start
+ ;
typedef_struct: ENT_TYPEDEF_STRUCT options '{' struct_fields '}' ID
{
lexer_toplevel_done = 1;
}
';'
+ {}
| ENT_STRUCT options '{' struct_fields '}'
{
new_structure ($1->u.s.tag, UNION_P ($1), &lexer_line,
lexer_toplevel_done = 1;
}
';'
+ {}
+ ;
externstatic: ENT_EXTERNSTATIC options lasttype ID semiequal
{
- note_variable ($4, adjust_field_type ($3, $2), $2,
+ note_variable ($4, adjust_field_type ($3, $2), $2,
&lexer_line);
}
| ENT_EXTERNSTATIC options lasttype ID ARRAY semiequal
$5),
$2, &lexer_line);
}
+ ;
lasttype: type
- {
+ {
lexer_toplevel_done = 1;
$$ = $1;
}
+ ;
semiequal: ';'
| '='
;
-yacc_union: ENT_YACCUNION options struct_fields '}' yacc_typematch PERCENTPERCENT
+yacc_union: ENT_YACCUNION options struct_fields '}' yacc_typematch
+ PERCENTPERCENT
{
note_yacc_type ($2, $3, $5, &lexer_line);
}
+ ;
yacc_typematch: /* empty */
{ $$ = NULL; }
| yacc_typematch PERCENT_ID yacc_ids
- {
+ {
pair_p p;
for (p = $3; p->next != NULL; p = p->next)
{
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;
}
| 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 = xmalloc (3 + strlen ($2));
- sprintf (p->opt->info, "'%s'", $2);
+ p->opt->info = xasprintf ("'%s'", $2);
$$ = p;
}
+ ;
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;
}
| 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;
}
| 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;
p->line = lexer_line;
$$ = p;
}
+ | type ':' bitfieldlen ';' struct_fields
+ { $$ = $5; }
+ ;
bitfieldopt: /* empty */
- | ':' NUM
+ | ':' bitfieldlen
+ ;
+
+bitfieldlen: NUM | ID
+ { }
+ ;
type: SCALAR
{ $$ = $1; }
{ $$ = create_scalar_type ($2, strlen ($2)); }
| ENUM ID '{' enum_items '}'
{ $$ = create_scalar_type ($2, strlen ($2)); }
+ ;
enum_items: /* empty */
| ID '=' NUM ',' enum_items
optionsopt: { $$ = NULL; }
| options { $$ = $1; }
+ ;
-options: GTY_TOKEN '(' '(' optionseqopt ')' ')' { $$ = $4; }
+options: GTY_TOKEN '(' '(' optionseqopt ')' ')'
+ { $$ = $4; }
+ ;
type_option : ALIAS
{ $$ = "ptr_alias"; }
| PARAM_IS
- { $$ = "param_is"; }
+ { $$ = $1; }
+ ;
+
+option: ID
+ { $$ = create_option ($1, (void *)""); }
+ | ID '(' stringseq ')'
+ { $$ = create_option ($1, (void *)$3); }
+ | type_option '(' type ')'
+ { $$ = create_option ($1, adjust_field_type ($3, NULL)); }
+ | NESTED_PTR '(' type ',' stringseq ',' stringseq ')'
+ {
+ struct nested_ptr_data d;
-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;
- }
+ d.type = adjust_field_type ($3, NULL);
+ d.convert_to = $5;
+ d.convert_from = $7;
+ $$ = create_option ("nested_ptr",
+ xmemdup (&d, sizeof (d), sizeof (d)));
+ }
+ ;
optionseq: option
{
$3->next = $1;
$$ = $3;
}
+ ;
-optionseqopt: { $$ = NULL }
+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;
+ }
+ ;
%%