Commit e1b793e7 by Basile Starynkevitch Committed by Basile Starynkevitch

gengtype.c: Reindented.


2010-09-24  Basile Starynkevitch  <basile@starynkevitch.net>

	* gcc/gengtype.c: Reindented.

	* gcc/gengtype.h: Reindented.

	* gcc/gengtype-parse.c: Reindented.

From-SVN: r164604
parent 1d0804d4
2010-09-24 Basile Starynkevitch <basile@starynkevitch.net>
* gengtype.c: Reindented.
* gengtype.h: Reindented.
* gengtype-parse.c: Reindented.
2010-09-24 Jan Hubicka <jh@suse.cz> 2010-09-24 Jan Hubicka <jh@suse.cz>
PR tree-optimization/45738 PR tree-optimization/45738
/* Process source files and output type information. /* Process source files and output type information.
Copyright (C) 2006, 2007 Free Software Foundation, Inc. Copyright (C) 2006, 2007 Free Software Foundation, Inc.
This file is part of GCC. This file is part of GCC.
GCC is free software; you can redistribute it and/or modify it under 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 the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later Software Foundation; either version 3, or (at your option) any later
version. version.
GCC is distributed in the hope that it will be useful, but WITHOUT ANY GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details. for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3. If not see along with GCC; see the file COPYING3. If not see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#include "bconfig.h" #include "bconfig.h"
#include "system.h" #include "system.h"
...@@ -113,7 +113,7 @@ print_token (int code, const char *value) ...@@ -113,7 +113,7 @@ print_token (int code, const char *value)
else if (code < FIRST_TOKEN_WITH_VALUE) else if (code < FIRST_TOKEN_WITH_VALUE)
return xasprintf ("'%s'", token_names[code - CHAR_TOKEN_OFFSET]); return xasprintf ("'%s'", token_names[code - CHAR_TOKEN_OFFSET]);
else if (!value) else if (!value)
return token_names[code - CHAR_TOKEN_OFFSET]; /* don't quote these */ return token_names[code - CHAR_TOKEN_OFFSET]; /* don't quote these */
else else
return xasprintf (token_value_format[code - FIRST_TOKEN_WITH_VALUE], return xasprintf (token_value_format[code - FIRST_TOKEN_WITH_VALUE],
value); value);
...@@ -199,7 +199,7 @@ string_seq (void) ...@@ -199,7 +199,7 @@ string_seq (void)
l1 = strlen (s1); l1 = strlen (s1);
l2 = strlen (s2); l2 = strlen (s2);
buf = XRESIZEVEC (char, CONST_CAST(char *, s1), l1 + l2 + 1); buf = XRESIZEVEC (char, CONST_CAST (char *, s1), l1 + l2 + 1);
memcpy (buf + l1, s2, l2 + 1); memcpy (buf + l1, s2, l2 + 1);
XDELETE (CONST_CAST (char *, s2)); XDELETE (CONST_CAST (char *, s2));
s1 = buf; s1 = buf;
...@@ -222,7 +222,7 @@ typedef_name (void) ...@@ -222,7 +222,7 @@ typedef_name (void)
require (','); require (',');
c2 = require (ID); c2 = require (ID);
require (')'); require (')');
r = concat ("VEC_", c1, "_", c2, (char *)0); r = concat ("VEC_", c1, "_", c2, (char *) 0);
free (CONST_CAST (char *, c1)); free (CONST_CAST (char *, c1));
free (CONST_CAST (char *, c2)); free (CONST_CAST (char *, c2));
return r; return r;
...@@ -239,10 +239,18 @@ consume_balanced (int opener, int closer) ...@@ -239,10 +239,18 @@ consume_balanced (int opener, int closer)
for (;;) for (;;)
switch (token ()) switch (token ())
{ {
default: advance (); break; default:
case '(': consume_balanced ('(',')'); break; advance ();
case '[': consume_balanced ('[',']'); break; break;
case '{': consume_balanced ('{','}'); break; case '(':
consume_balanced ('(', ')');
break;
case '[':
consume_balanced ('[', ']');
break;
case '{':
consume_balanced ('{', '}');
break;
case '}': case '}':
case ']': case ']':
...@@ -250,8 +258,8 @@ consume_balanced (int opener, int closer) ...@@ -250,8 +258,8 @@ consume_balanced (int opener, int closer)
if (token () != closer) if (token () != closer)
parse_error ("unbalanced delimiters - expected '%c', have '%c'", parse_error ("unbalanced delimiters - expected '%c', have '%c'",
closer, token ()); closer, token ());
advance (); advance ();
return; return;
case EOF_TOKEN: case EOF_TOKEN:
parse_error ("unexpected end of file within %c%c-delimited construct", parse_error ("unexpected end of file within %c%c-delimited construct",
...@@ -272,18 +280,28 @@ consume_until_semi (bool immediate) ...@@ -272,18 +280,28 @@ consume_until_semi (bool immediate)
for (;;) for (;;)
switch (token ()) switch (token ())
{ {
case ';': advance (); return; case ';':
default: advance (); break; advance ();
return;
default:
advance ();
break;
case '(': consume_balanced ('(',')'); break; case '(':
case '[': consume_balanced ('[',']'); break; consume_balanced ('(', ')');
case '{': consume_balanced ('{','}'); break; break;
case '[':
consume_balanced ('[', ']');
break;
case '{':
consume_balanced ('{', '}');
break;
case '}': case '}':
case ']': case ']':
case ')': case ')':
parse_error ("unmatched '%c' while scanning for ';'", token ()); parse_error ("unmatched '%c' while scanning for ';'", token ());
return; return;
case EOF_TOKEN: case EOF_TOKEN:
parse_error ("unexpected end of file while scanning for ';'"); parse_error ("unexpected end of file while scanning for ';'");
...@@ -304,28 +322,40 @@ consume_until_comma_or_semi (bool immediate) ...@@ -304,28 +322,40 @@ consume_until_comma_or_semi (bool immediate)
for (;;) for (;;)
switch (token ()) switch (token ())
{ {
case ',': advance (); return true; case ',':
case ';': advance (); return false; advance ();
default: advance (); break; return true;
case ';':
advance ();
return false;
default:
advance ();
break;
case '(': consume_balanced ('(',')'); break; case '(':
case '[': consume_balanced ('[',']'); break; consume_balanced ('(', ')');
case '{': consume_balanced ('{','}'); break; break;
case '[':
consume_balanced ('[', ']');
break;
case '{':
consume_balanced ('{', '}');
break;
case '}': case '}':
case ']': case ']':
case ')': case ')':
parse_error ("unmatched '%s' while scanning for ',' or ';'", parse_error ("unmatched '%s' while scanning for ',' or ';'",
print_cur_token ()); print_cur_token ());
return false; return false;
case EOF_TOKEN: case EOF_TOKEN:
parse_error ("unexpected end of file while scanning for ',' or ';'"); parse_error ("unexpected end of file while scanning for ',' or ';'");
return false; return false;
} }
} }
/* GTY(()) option handling. */ /* GTY(()) option handling. */
static type_p type (options_p *optsp, bool nested); static type_p type (options_p *optsp, bool nested);
...@@ -401,11 +431,11 @@ nestedptr_optvalue (options_p prev) ...@@ -401,11 +431,11 @@ nestedptr_optvalue (options_p prev)
} }
/* One GTY(()) option: /* One GTY(()) option:
ID str_optvalue_opt ID str_optvalue_opt
| PTR_ALIAS type_optvalue | PTR_ALIAS type_optvalue
| PARAM_IS type_optvalue | PARAM_IS type_optvalue
| NESTED_PTR nestedptr_optvalue | NESTED_PTR nestedptr_optvalue
*/ */
static options_p static options_p
option (options_p prev) option (options_p prev)
{ {
...@@ -426,8 +456,7 @@ option (options_p prev) ...@@ -426,8 +456,7 @@ option (options_p prev)
return nestedptr_optvalue (prev); return nestedptr_optvalue (prev);
default: default:
parse_error ("expected an option keyword, have %s", parse_error ("expected an option keyword, have %s", print_cur_token ());
print_cur_token ());
advance (); advance ();
return create_option (prev, "", ""); return create_option (prev, "", "");
} }
...@@ -479,9 +508,9 @@ gtymarker_opt (void) ...@@ -479,9 +508,9 @@ gtymarker_opt (void)
we don't have to do it. */ we don't have to do it. */
/* array_and_function_declarators_opt: /* array_and_function_declarators_opt:
\epsilon \epsilon
array_and_function_declarators_opt ARRAY array_and_function_declarators_opt ARRAY
array_and_function_declarators_opt '(' ... ')' array_and_function_declarators_opt '(' ... ')'
where '...' indicates stuff we ignore except insofar as grouping where '...' indicates stuff we ignore except insofar as grouping
symbols ()[]{} must balance. symbols ()[]{} must balance.
...@@ -510,8 +539,8 @@ array_and_function_declarators_opt (type_p ty) ...@@ -510,8 +539,8 @@ array_and_function_declarators_opt (type_p ty)
static type_p inner_declarator (type_p, const char **, options_p *); static type_p inner_declarator (type_p, const char **, options_p *);
/* direct_declarator: /* direct_declarator:
'(' inner_declarator ')' '(' inner_declarator ')'
gtymarker_opt ID array_and_function_declarators_opt gtymarker_opt ID array_and_function_declarators_opt
Subroutine of declarator, mutually recursive with inner_declarator; Subroutine of declarator, mutually recursive with inner_declarator;
do not use elsewhere. */ do not use elsewhere. */
...@@ -550,7 +579,7 @@ direct_declarator (type_p ty, const char **namep, options_p *optsp) ...@@ -550,7 +579,7 @@ direct_declarator (type_p ty, const char **namep, options_p *optsp)
/* The difference between inner_declarator and declarator is in the /* The difference between inner_declarator and declarator is in the
handling of stars. Consider this declaration: handling of stars. Consider this declaration:
char * (*pfc) (void) char * (*pfc) (void)
It declares a pointer to a function that takes no arguments and It declares a pointer to a function that takes no arguments and
returns a char*. To construct the correct type for this returns a char*. To construct the correct type for this
...@@ -562,8 +591,8 @@ direct_declarator (type_p ty, const char **namep, options_p *optsp) ...@@ -562,8 +591,8 @@ direct_declarator (type_p ty, const char **namep, options_p *optsp)
creating pointers. */ creating pointers. */
/* inner_declarator: /* inner_declarator:
'*' inner_declarator '*' inner_declarator
direct_declarator direct_declarator
Mutually recursive subroutine of direct_declarator; do not use Mutually recursive subroutine of direct_declarator; do not use
elsewhere. */ elsewhere. */
...@@ -609,13 +638,13 @@ declarator (type_p ty, const char **namep, options_p *optsp) ...@@ -609,13 +638,13 @@ declarator (type_p ty, const char **namep, options_p *optsp)
/* Structure field(s) declaration: /* Structure field(s) declaration:
( (
type bitfield ';' type bitfield ';'
| type declarator bitfield? ( ',' declarator bitfield? )+ ';' | type declarator bitfield? ( ',' declarator bitfield? )+ ';'
)+ )+
Knows that such declarations must end with a close brace (or, Knows that such declarations must end with a close brace (or,
erroneously, at EOF). erroneously, at EOF).
*/ */
static pair_p static pair_p
struct_field_seq (void) struct_field_seq (void)
{ {
...@@ -666,7 +695,7 @@ struct_field_seq (void) ...@@ -666,7 +695,7 @@ struct_field_seq (void)
/* This is called type(), but what it parses (sort of) is what C calls /* This is called type(), but what it parses (sort of) is what C calls
declaration-specifiers and specifier-qualifier-list: declaration-specifiers and specifier-qualifier-list:
SCALAR SCALAR
| ID // typedef | ID // typedef
| (STRUCT|UNION) ID? gtymarker? ( '{' gtymarker? struct_field_seq '}' )? | (STRUCT|UNION) ID? gtymarker? ( '{' gtymarker? struct_field_seq '}' )?
| ENUM ID ( '{' ... '}' )? | ENUM ID ( '{' ... '}' )?
...@@ -674,7 +703,7 @@ struct_field_seq (void) ...@@ -674,7 +703,7 @@ struct_field_seq (void)
Returns a partial type; under some conditions (notably Returns a partial type; under some conditions (notably
"struct foo GTY((...)) thing;") it may write an options "struct foo GTY((...)) thing;") it may write an options
structure to *OPTSP. structure to *OPTSP.
*/ */
static type_p static type_p
type (options_p *optsp, bool nested) type (options_p *optsp, bool nested)
{ {
...@@ -695,15 +724,16 @@ type (options_p *optsp, bool nested) ...@@ -695,15 +724,16 @@ type (options_p *optsp, bool nested)
case UNION: case UNION:
{ {
options_p opts = 0; options_p opts = 0;
/* GTY annotations follow attribute syntax /* GTY annotations follow attribute syntax
GTY_BEFORE_ID is for union/struct declarations GTY_BEFORE_ID is for union/struct declarations
GTY_AFTER_ID is for variable declarations. */ GTY_AFTER_ID is for variable declarations. */
enum { enum
NO_GTY, {
GTY_BEFORE_ID, NO_GTY,
GTY_AFTER_ID GTY_BEFORE_ID,
} is_gty = NO_GTY; GTY_AFTER_ID
bool is_union = (token () == UNION); } is_gty = NO_GTY;
bool is_union = (token () == UNION);
advance (); advance ();
/* Top-level structures that are not explicitly tagged GTY(()) /* Top-level structures that are not explicitly tagged GTY(())
...@@ -713,8 +743,8 @@ type (options_p *optsp, bool nested) ...@@ -713,8 +743,8 @@ type (options_p *optsp, bool nested)
that we can't handle. */ that we can't handle. */
if (nested || token () == GTY_TOKEN) if (nested || token () == GTY_TOKEN)
{ {
is_gty = GTY_BEFORE_ID; is_gty = GTY_BEFORE_ID;
opts = gtymarker_opt (); opts = gtymarker_opt ();
} }
if (token () == ID) if (token () == ID)
...@@ -722,31 +752,31 @@ type (options_p *optsp, bool nested) ...@@ -722,31 +752,31 @@ type (options_p *optsp, bool nested)
else else
s = xasprintf ("anonymous:%s:%d", lexer_line.file, lexer_line.line); s = xasprintf ("anonymous:%s:%d", lexer_line.file, lexer_line.line);
/* Unfortunately above GTY_TOKEN check does not capture the /* Unfortunately above GTY_TOKEN check does not capture the
typedef struct_type GTY case. */ typedef struct_type GTY case. */
if (token () == GTY_TOKEN) if (token () == GTY_TOKEN)
{ {
is_gty = GTY_AFTER_ID; is_gty = GTY_AFTER_ID;
opts = gtymarker_opt (); opts = gtymarker_opt ();
} }
if (is_gty) if (is_gty)
{ {
if (token () == '{') if (token () == '{')
{ {
pair_p fields; pair_p fields;
if (is_gty == GTY_AFTER_ID) if (is_gty == GTY_AFTER_ID)
parse_error ("GTY must be specified before identifier"); parse_error ("GTY must be specified before identifier");
advance (); advance ();
fields = struct_field_seq (); fields = struct_field_seq ();
require ('}'); require ('}');
return new_structure (s, is_union, &lexer_line, fields, opts); return new_structure (s, is_union, &lexer_line, fields, opts);
} }
} }
else if (token () == '{') else if (token () == '{')
consume_balanced ('{', '}'); consume_balanced ('{', '}');
if (opts) if (opts)
*optsp = opts; *optsp = opts;
return find_structure (s, is_union); return find_structure (s, is_union);
...@@ -754,13 +784,13 @@ type (options_p *optsp, bool nested) ...@@ -754,13 +784,13 @@ type (options_p *optsp, bool nested)
case ENUM: case ENUM:
advance (); advance ();
if (token () == ID) if (token () == ID)
s = advance (); s = advance ();
else else
s = xasprintf ("anonymous:%s:%d", lexer_line.file, lexer_line.line); s = xasprintf ("anonymous:%s:%d", lexer_line.file, lexer_line.line);
if (token () == '{') if (token () == '{')
consume_balanced ('{','}'); consume_balanced ('{', '}');
return create_scalar_type (s); return create_scalar_type (s);
default: default:
...@@ -821,7 +851,7 @@ struct_or_union (void) ...@@ -821,7 +851,7 @@ struct_or_union (void)
} }
/* GC root declaration: /* GC root declaration:
(extern|static) gtymarker? type ID array_declarators_opt (';'|'=') (extern|static) gtymarker? type ID array_declarators_opt (';'|'=')
If the gtymarker is not present, we ignore the rest of the declaration. */ If the gtymarker is not present, we ignore the rest of the declaration. */
static void static void
extern_or_static (void) extern_or_static (void)
...@@ -838,8 +868,8 @@ extern_or_static (void) ...@@ -838,8 +868,8 @@ extern_or_static (void)
} }
opts = gtymarker (); opts = gtymarker ();
ty = type (&opts2, true); /* if we get here, it's got a GTY(()) */ ty = type (&opts2, true); /* if we get here, it's got a GTY(()) */
dty = declarator (ty, &name, &dopts); dty = declarator (ty, &name, &dopts);
if ((opts && dopts) || (opts && opts2) || (opts2 && dopts)) if ((opts && dopts) || (opts && opts2) || (opts2 && dopts))
parse_error ("GTY((...)) specified more than once for %s", name); parse_error ("GTY((...)) specified more than once for %s", name);
...@@ -864,7 +894,7 @@ extern_or_static (void) ...@@ -864,7 +894,7 @@ extern_or_static (void)
static void static void
def_vec (void) def_vec (void)
{ {
bool is_scalar = (token() == DEFVEC_I); bool is_scalar = (token () == DEFVEC_I);
const char *type; const char *type;
require2 (DEFVEC_OP, DEFVEC_I); require2 (DEFVEC_OP, DEFVEC_I);
......
...@@ -21,14 +21,15 @@ ...@@ -21,14 +21,15 @@
#include "bconfig.h" #include "bconfig.h"
#include "system.h" #include "system.h"
#include "gengtype.h" #include "gengtype.h"
#include "errors.h" /* for fatal */ #include "errors.h" /* for fatal */
#include "double-int.h" #include "double-int.h"
#include "hashtab.h" #include "hashtab.h"
/* Data types, macros, etc. used only in this file. */ /* Data types, macros, etc. used only in this file. */
/* Kinds of types we can understand. */ /* Kinds of types we can understand. */
enum typekind { enum typekind
{
TYPE_SCALAR, TYPE_SCALAR,
TYPE_STRING, TYPE_STRING,
TYPE_STRUCT, TYPE_STRUCT,
...@@ -71,16 +72,16 @@ struct pair ...@@ -71,16 +72,16 @@ struct pair
/* A description of a type. */ /* A description of a type. */
enum gc_used_enum enum gc_used_enum
{ {
GC_UNUSED = 0, GC_UNUSED = 0,
GC_USED, GC_USED,
/* Used for structures whose definitions we haven't seen so far when /* Used for structures whose definitions we haven't seen so far when
we encounter a pointer to it that is annotated with ``maybe_undef''. we encounter a pointer to it that is annotated with ``maybe_undef''.
If after reading in everything we don't have source file If after reading in everything we don't have source file
information for it, we assume that it never has been defined. */ information for it, we assume that it never has been defined. */
GC_MAYBE_POINTED_TO, GC_MAYBE_POINTED_TO,
GC_POINTED_TO GC_POINTED_TO
}; };
struct type struct type
{ {
...@@ -88,9 +89,11 @@ struct type ...@@ -88,9 +89,11 @@ struct type
type_p next; type_p next;
type_p pointer_to; type_p pointer_to;
enum gc_used_enum gc_used; enum gc_used_enum gc_used;
union { union
{
type_p p; type_p p;
struct { struct
{
const char *tag; const char *tag;
struct fileloc line; struct fileloc line;
pair_p fields; pair_p fields;
...@@ -99,11 +102,13 @@ struct type ...@@ -99,11 +102,13 @@ struct type
type_p lang_struct; type_p lang_struct;
} s; } s;
bool scalar_is_char; bool scalar_is_char;
struct { struct
{
type_p p; type_p p;
const char *len; const char *len;
} a; } a;
struct { struct
{
type_p stru; type_p stru;
type_p param[NUM_PARAM]; type_p param[NUM_PARAM];
struct fileloc line; struct fileloc line;
...@@ -112,13 +117,13 @@ struct type ...@@ -112,13 +117,13 @@ struct type
}; };
#define UNION_P(x) \ #define UNION_P(x) \
((x)->kind == TYPE_UNION || \ ((x)->kind == TYPE_UNION || \
((x)->kind == TYPE_LANG_STRUCT \ ((x)->kind == TYPE_LANG_STRUCT \
&& (x)->u.s.lang_struct->kind == TYPE_UNION)) && (x)->u.s.lang_struct->kind == TYPE_UNION))
#define UNION_OR_STRUCT_P(x) \ #define UNION_OR_STRUCT_P(x) \
((x)->kind == TYPE_UNION \ ((x)->kind == TYPE_UNION \
|| (x)->kind == TYPE_STRUCT \ || (x)->kind == TYPE_STRUCT \
|| (x)->kind == TYPE_LANG_STRUCT) || (x)->kind == TYPE_LANG_STRUCT)
/* Structure representing an output file. */ /* Structure representing an output file. */
struct outf struct outf
...@@ -129,25 +134,25 @@ struct outf ...@@ -129,25 +134,25 @@ struct outf
size_t bufused; size_t bufused;
char *buf; char *buf;
}; };
typedef struct outf * outf_p; typedef struct outf *outf_p;
/* An output file, suitable for definitions, that can see declarations /* An output file, suitable for definitions, that can see declarations
made in INPUT_FILE and is linked into every language that uses made in INPUT_FILE and is linked into every language that uses
INPUT_FILE. May return NULL in plugin mode. */ INPUT_FILE. May return NULL in plugin mode. */
extern outf_p get_output_file_with_visibility extern outf_p get_output_file_with_visibility (const char *input_file);
(const char *input_file);
const char *get_output_file_name (const char *); const char *get_output_file_name (const char *);
/* Print, like fprintf, to O. No-op if O is NULL. */ /* Print, like fprintf, to O. No-op if O is NULL. */
static void oprintf (outf_p o, const char *S, ...) static void
ATTRIBUTE_PRINTF_2; oprintf (outf_p o, const char *S, ...)
ATTRIBUTE_PRINTF_2;
/* The list of output files. */ /* The list of output files. */
static outf_p output_files; static outf_p output_files;
/* The plugin input files and their number; in that case only /* The plugin input files and their number; in that case only
a single file is produced. */ a single file is produced. */
static char** plugin_files; static char **plugin_files;
static size_t nb_plugin_files; static size_t nb_plugin_files;
/* the generated plugin output name & file */ /* the generated plugin output name & file */
static outf_p plugin_output; static outf_p plugin_output;
...@@ -164,14 +169,14 @@ static size_t srcdir_len = 0; ...@@ -164,14 +169,14 @@ static size_t srcdir_len = 0;
static outf_p create_file (const char *, const char *); static outf_p create_file (const char *, const char *);
static const char * get_file_basename (const char *); static const char *get_file_basename (const char *);
static const char * get_file_realbasename (const char *); static const char *get_file_realbasename (const char *);
static const char * get_file_srcdir_relative_path (const char *); static const char *get_file_srcdir_relative_path (const char *);
static int get_prefix_langdir_index (const char *); static int get_prefix_langdir_index (const char *);
static const char * get_file_langdir (const char *); static const char *get_file_langdir (const char *);
/* Nonzero iff an error has occurred. */ /* Nonzero iff an error has occurred. */
bool hit_error = false; bool hit_error = false;
...@@ -251,13 +256,13 @@ get_lang_bitmap (const char *gtfile) ...@@ -251,13 +256,13 @@ get_lang_bitmap (const char *gtfile)
if (gtfile == this_file) if (gtfile == this_file)
/* Things defined in this file are universal. */ /* Things defined in this file are universal. */
return (((lang_bitmap)1) << num_lang_dirs) - 1; return (((lang_bitmap) 1) << num_lang_dirs) - 1;
else else
{ {
lang_bitmap n = 0; lang_bitmap n = 0;
int i; int i;
for (i = -(int) sizeof (lang_bitmap); i < 0; i++) for (i = -(int) sizeof (lang_bitmap); i < 0; i++)
n = (n << CHAR_BIT) + (unsigned char)gtfile[i]; n = (n << CHAR_BIT) + (unsigned char) gtfile[i];
return n; return n;
} }
} }
...@@ -270,7 +275,7 @@ set_lang_bitmap (char *gtfile, lang_bitmap n) ...@@ -270,7 +275,7 @@ set_lang_bitmap (char *gtfile, lang_bitmap n)
int i; int i;
for (i = -1; i >= -(int) sizeof (lang_bitmap); i--) for (i = -1; i >= -(int) sizeof (lang_bitmap); i--)
{ {
gtfile[i] = n & ((1U << CHAR_BIT)-1); gtfile[i] = n & ((1U << CHAR_BIT) - 1);
n >>= CHAR_BIT; n >>= CHAR_BIT;
} }
} }
...@@ -319,8 +324,7 @@ measure_input_list (FILE *list) ...@@ -319,8 +324,7 @@ measure_input_list (FILE *list)
touch *HEREP, and sets *LINEP to NULL. POS is used for touch *HEREP, and sets *LINEP to NULL. POS is used for
diagnostics. */ diagnostics. */
static bool static bool
read_input_line (FILE *list, char **herep, char **linep, read_input_line (FILE *list, char **herep, char **linep, struct fileloc *pos)
struct fileloc *pos)
{ {
char *here = *herep; char *here = *herep;
char *line; char *line;
...@@ -349,12 +353,13 @@ read_input_line (FILE *list, char **herep, char **linep, ...@@ -349,12 +353,13 @@ read_input_line (FILE *list, char **herep, char **linep,
if (c == ']') if (c == ']')
{ {
c = getc (list); /* eat what should be a newline */ c = getc (list); /* eat what should be a newline */
if (c != '\n' && c != EOF) if (c != '\n' && c != EOF)
error_at_line (pos, "junk on line after language tag [%s]", line); error_at_line (pos, "junk on line after language tag [%s]", line);
} }
else else
error_at_line (pos, "missing close bracket for language tag [%s", line); error_at_line (pos, "missing close bracket for language tag [%s",
line);
*herep = here; *herep = here;
*linep = line; *linep = line;
...@@ -429,7 +434,8 @@ read_input_list (const char *listname) ...@@ -429,7 +434,8 @@ read_input_list (const char *listname)
for (i = 0; i < langno; i++) for (i = 0; i < langno; i++)
if (strcmp (lang_dir_names[i], line) == 0) if (strcmp (lang_dir_names[i], line) == 0)
{ {
error_at_line (&epos, "duplicate language tag [%s]", line); error_at_line (&epos, "duplicate language tag [%s]",
line);
curlangs = 1 << i; curlangs = 1 << i;
here = committed; here = committed;
goto next_line; goto next_line;
...@@ -449,13 +455,15 @@ read_input_list (const char *listname) ...@@ -449,13 +455,15 @@ read_input_list (const char *listname)
current language to the existing string's bitmap. */ current language to the existing string's bitmap. */
lang_bitmap bmap = get_lang_bitmap (gt_files[i]); lang_bitmap bmap = get_lang_bitmap (gt_files[i]);
if (bmap & curlangs) if (bmap & curlangs)
error_at_line (&epos, "file %s specified more than once " error_at_line (&epos,
"for language %s", line, langno == 0 "file %s specified more than once "
? "(all)" "for language %s", line,
: lang_dir_names[langno - 1]); langno ==
0 ? "(all)" : lang_dir_names[langno -
1]);
bmap |= curlangs; bmap |= curlangs;
set_lang_bitmap (CONST_CAST(char *, gt_files[i]), bmap); set_lang_bitmap (CONST_CAST (char *, gt_files[i]), bmap);
here = committed; here = committed;
goto next_line; goto next_line;
} }
...@@ -465,7 +473,7 @@ read_input_list (const char *listname) ...@@ -465,7 +473,7 @@ read_input_list (const char *listname)
} }
} }
/* Update the global counts now that we know accurately how many /* Update the global counts now that we know accurately how many
things there are. (We do not bother resizing the arrays down.) */ things there are. (We do not bother resizing the arrays down.) */
num_lang_dirs = langno; num_lang_dirs = langno;
/* Add the plugin files if provided. */ /* Add the plugin files if provided. */
if (plugin_files) if (plugin_files)
...@@ -493,7 +501,7 @@ read_input_list (const char *listname) ...@@ -493,7 +501,7 @@ read_input_list (const char *listname)
{ {
size_t l; size_t l;
for (l = 0; l < num_lang_dirs; l++) for (l = 0; l < num_lang_dirs; l++)
if ((size_t)(slashpos - basename) == strlen (lang_dir_names [l]) if ((size_t) (slashpos - basename) == strlen (lang_dir_names[l])
&& memcmp (basename, lang_dir_names[l], && memcmp (basename, lang_dir_names[l],
strlen (lang_dir_names[l])) == 0) strlen (lang_dir_names[l])) == 0)
{ {
...@@ -503,7 +511,7 @@ read_input_list (const char *listname) ...@@ -503,7 +511,7 @@ read_input_list (const char *listname)
basename, lang_dir_names[l]); basename, lang_dir_names[l]);
break; break;
} }
} }
} }
} }
...@@ -512,9 +520,9 @@ read_input_list (const char *listname) ...@@ -512,9 +520,9 @@ read_input_list (const char *listname)
fclose (list); fclose (list);
} }
/* The one and only TYPE_STRING. */ /* The one and only TYPE_STRING. */
static struct type string_type = { static struct type string_type = {
...@@ -527,6 +535,7 @@ static struct type string_type = { ...@@ -527,6 +535,7 @@ static struct type string_type = {
static struct type scalar_nonchar = { static struct type scalar_nonchar = {
TYPE_SCALAR, 0, 0, GC_USED, {0} TYPE_SCALAR, 0, 0, GC_USED, {0}
}; };
static struct type scalar_char = { static struct type scalar_char = {
TYPE_SCALAR, 0, 0, GC_USED, {0} TYPE_SCALAR, 0, 0, GC_USED, {0}
}; };
...@@ -538,8 +547,7 @@ static type_p structures; ...@@ -538,8 +547,7 @@ static type_p structures;
static type_p param_structs; static type_p param_structs;
static pair_p variables; static pair_p variables;
static type_p find_param_structure static type_p find_param_structure (type_p t, type_p param[NUM_PARAM]);
(type_p t, type_p param[NUM_PARAM]);
static type_p adjust_field_tree_exp (type_p t, options_p opt); static type_p adjust_field_tree_exp (type_p t, options_p opt);
static type_p adjust_field_rtx_def (type_p t, options_p opt); static type_p adjust_field_rtx_def (type_p t, options_p opt);
...@@ -597,7 +605,7 @@ resolve_typedef (const char *s, struct fileloc *pos) ...@@ -597,7 +605,7 @@ resolve_typedef (const char *s, struct fileloc *pos)
if (strcmp (p->name, s) == 0) if (strcmp (p->name, s) == 0)
return p->type; return p->type;
error_at_line (pos, "unidentified type `%s'", s); error_at_line (pos, "unidentified type `%s'", s);
return &scalar_nonchar; /* treat as "int" */ return &scalar_nonchar; /* treat as "int" */
} }
/* Create and return a new structure with tag NAME (or a union iff /* Create and return a new structure with tag NAME (or a union iff
...@@ -614,13 +622,11 @@ new_structure (const char *name, int isunion, struct fileloc *pos, ...@@ -614,13 +622,11 @@ new_structure (const char *name, int isunion, struct fileloc *pos,
/* temporary kludge - gengtype doesn't handle conditionals or /* temporary kludge - gengtype doesn't handle conditionals or
macros. Ignore any attempt to define struct location_s, unless macros. Ignore any attempt to define struct location_s, unless
it is coming from this file (main() sets it up safely). */ it is coming from this file (main() sets it up safely). */
if (!strcmp (name, "location_s") && !isunion if (!strcmp (name, "location_s") && !isunion && pos->file != this_file)
&& pos->file != this_file)
return find_structure (name, 0); return find_structure (name, 0);
for (si = structures; si != NULL; si = si->next) for (si = structures; si != NULL; si = si->next)
if (strcmp (name, si->u.s.tag) == 0 if (strcmp (name, si->u.s.tag) == 0 && UNION_P (si) == isunion)
&& UNION_P (si) == isunion)
{ {
type_p ls = NULL; type_p ls = NULL;
if (si->kind == TYPE_LANG_STRUCT) if (si->kind == TYPE_LANG_STRUCT)
...@@ -682,8 +688,7 @@ new_structure (const char *name, int isunion, struct fileloc *pos, ...@@ -682,8 +688,7 @@ new_structure (const char *name, int isunion, struct fileloc *pos,
/* Reset location_s's location to input.h so that we know where to /* Reset location_s's location to input.h so that we know where to
write out its mark routine. */ write out its mark routine. */
if (!strcmp (name, "location_s") && !isunion if (!strcmp (name, "location_s") && !isunion && pos->file == this_file)
&& pos->file == this_file)
{ {
size_t n; size_t n;
for (n = 0; n < num_gt_files; n++) for (n = 0; n < num_gt_files; n++)
...@@ -695,7 +700,7 @@ new_structure (const char *name, int isunion, struct fileloc *pos, ...@@ -695,7 +700,7 @@ new_structure (const char *name, int isunion, struct fileloc *pos,
} }
} }
return s; return s;
} }
/* Return the previously-defined structure with tag NAME (or a union /* Return the previously-defined structure with tag NAME (or a union
...@@ -708,8 +713,7 @@ find_structure (const char *name, int isunion) ...@@ -708,8 +713,7 @@ find_structure (const char *name, int isunion)
type_p s; type_p s;
for (s = structures; s != NULL; s = s->next) for (s = structures; s != NULL; s = s->next)
if (strcmp (name, s->u.s.tag) == 0 if (strcmp (name, s->u.s.tag) == 0 && UNION_P (s) == isunion)
&& UNION_P (s) == isunion)
return s; return s;
s = XCNEW (struct type); s = XCNEW (struct type);
...@@ -763,7 +767,7 @@ create_scalar_type (const char *name) ...@@ -763,7 +767,7 @@ create_scalar_type (const char *name)
type_p type_p
create_pointer (type_p t) create_pointer (type_p t)
{ {
if (! t->pointer_to) if (!t->pointer_to)
{ {
type_p r = XCNEW (struct type); type_p r = XCNEW (struct type);
r->kind = TYPE_POINTER; r->kind = TYPE_POINTER;
...@@ -796,7 +800,7 @@ create_option (options_p next, const char *name, const void *info) ...@@ -796,7 +800,7 @@ create_option (options_p next, const char *name, const void *info)
options_p o = XNEW (struct options); options_p o = XNEW (struct options);
o->next = next; o->next = next;
o->name = name; o->name = name;
o->info = (const char*) info; o->info = (const char *) info;
return o; return o;
} }
...@@ -860,7 +864,7 @@ create_field_at (pair_p next, type_p type, const char *name, options_p opt, ...@@ -860,7 +864,7 @@ create_field_at (pair_p next, type_p type, const char *name, options_p opt,
/* Create a fake field with the given type and name. NEXT is the next /* Create a fake field with the given type and name. NEXT is the next
field in the chain. */ field in the chain. */
#define create_field(next,type,name) \ #define create_field(next,type,name) \
create_field_all(next,type,name, 0, this_file, __LINE__) create_field_all(next,type,name, 0, this_file, __LINE__)
/* Like create_field, but the field is only valid when condition COND /* Like create_field, but the field is only valid when condition COND
is true. */ is true. */
...@@ -885,11 +889,11 @@ create_optional_field_ (pair_p next, type_p type, const char *name, ...@@ -885,11 +889,11 @@ create_optional_field_ (pair_p next, type_p type, const char *name,
/* Create the field and give it the new fake union type. Add a "desc" /* Create the field and give it the new fake union type. Add a "desc"
tag that specifies the condition under which the field is valid. */ tag that specifies the condition under which the field is valid. */
return create_field_all (next, union_type, name, return create_field_all (next, union_type, name,
create_option (0, "desc", cond), create_option (0, "desc", cond), this_file, line);
this_file, line);
} }
#define create_optional_field(next,type,name,cond) \ #define create_optional_field(next,type,name,cond) \
create_optional_field_(next,type,name,cond,__LINE__) create_optional_field_(next,type,name,cond,__LINE__)
/* Reverse a linked list of 'struct pair's in place. */ /* Reverse a linked list of 'struct pair's in place. */
pair_p pair_p
...@@ -904,27 +908,28 @@ nreverse_pairs (pair_p list) ...@@ -904,27 +908,28 @@ nreverse_pairs (pair_p list)
} }
return prev; return prev;
} }
/* We don't care how long a CONST_DOUBLE is. */ /* We don't care how long a CONST_DOUBLE is. */
#define CONST_DOUBLE_FORMAT "ww" #define CONST_DOUBLE_FORMAT "ww"
/* We don't want to see codes that are only for generator files. */ /* We don't want to see codes that are only for generator files. */
#undef GENERATOR_FILE #undef GENERATOR_FILE
enum rtx_code { enum rtx_code
{
#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) ENUM , #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) ENUM ,
#include "rtl.def" #include "rtl.def"
#undef DEF_RTL_EXPR #undef DEF_RTL_EXPR
NUM_RTX_CODE NUM_RTX_CODE
}; };
static const char * const rtx_name[NUM_RTX_CODE] = { static const char *const rtx_name[NUM_RTX_CODE] = {
#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) NAME , #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) NAME ,
#include "rtl.def" #include "rtl.def"
#undef DEF_RTL_EXPR #undef DEF_RTL_EXPR
}; };
static const char * const rtx_format[NUM_RTX_CODE] = { static const char *const rtx_format[NUM_RTX_CODE] = {
#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) FORMAT , #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) FORMAT ,
#include "rtl.def" #include "rtl.def"
#undef DEF_RTL_EXPR #undef DEF_RTL_EXPR
...@@ -934,7 +939,8 @@ static int rtx_next_new[NUM_RTX_CODE]; ...@@ -934,7 +939,8 @@ static int rtx_next_new[NUM_RTX_CODE];
/* We also need codes and names for insn notes (not register notes). /* We also need codes and names for insn notes (not register notes).
Note that we do *not* bias the note values here. */ Note that we do *not* bias the note values here. */
enum insn_note { enum insn_note
{
#define DEF_INSN_NOTE(NAME) NAME, #define DEF_INSN_NOTE(NAME) NAME,
#include "insn-notes.def" #include "insn-notes.def"
#undef DEF_INSN_NOTE #undef DEF_INSN_NOTE
...@@ -944,7 +950,7 @@ enum insn_note { ...@@ -944,7 +950,7 @@ enum insn_note {
/* We must allocate one more entry here, as we use NOTE_INSN_MAX as the /* We must allocate one more entry here, as we use NOTE_INSN_MAX as the
default field for line number notes. */ default field for line number notes. */
static const char *const note_insn_name[NOTE_INSN_MAX+1] = { static const char *const note_insn_name[NOTE_INSN_MAX + 1] = {
#define DEF_INSN_NOTE(NAME) #NAME, #define DEF_INSN_NOTE(NAME) #NAME,
#include "insn-notes.def" #include "insn-notes.def"
#undef DEF_INSN_NOTE #undef DEF_INSN_NOTE
...@@ -992,8 +998,7 @@ write_rtx_next (void) ...@@ -992,8 +998,7 @@ write_rtx_next (void)
oprintf (f, " 0,\n"); oprintf (f, " 0,\n");
else else
oprintf (f, oprintf (f,
" RTX_HDR_SIZE + %d * sizeof (rtunion),\n", " RTX_HDR_SIZE + %d * sizeof (rtunion),\n", rtx_next_new[i]);
rtx_next_new[i]);
oprintf (f, "};\n"); oprintf (f, "};\n");
} }
...@@ -1025,8 +1030,9 @@ adjust_field_rtx_def (type_p t, options_p ARG_UNUSED (opt)) ...@@ -1025,8 +1030,9 @@ adjust_field_rtx_def (type_p t, options_p ARG_UNUSED (opt))
mem_attrs_tp = create_pointer (find_structure ("mem_attrs", 0)); mem_attrs_tp = create_pointer (find_structure ("mem_attrs", 0));
reg_attrs_tp = create_pointer (find_structure ("reg_attrs", 0)); reg_attrs_tp = create_pointer (find_structure ("reg_attrs", 0));
basic_block_tp = create_pointer (find_structure ("basic_block_def", 0)); basic_block_tp = create_pointer (find_structure ("basic_block_def", 0));
constant_tp = create_pointer (find_structure ("constant_descriptor_rtx", 0)); constant_tp =
scalar_tp = &scalar_nonchar; /* rtunion int */ create_pointer (find_structure ("constant_descriptor_rtx", 0));
scalar_tp = &scalar_nonchar; /* rtunion int */
{ {
pair_p note_flds = NULL; pair_p note_flds = NULL;
...@@ -1109,8 +1115,7 @@ adjust_field_rtx_def (type_p t, options_p ARG_UNUSED (opt)) ...@@ -1109,8 +1115,7 @@ adjust_field_rtx_def (type_p t, options_p ARG_UNUSED (opt))
t = scalar_tp, subname = "rt_int"; t = scalar_tp, subname = "rt_int";
else if (i == CODE_LABEL && aindex == 4) else if (i == CODE_LABEL && aindex == 4)
t = rtx_tp, subname = "rt_rtx"; t = rtx_tp, subname = "rt_rtx";
else if (i == LABEL_REF else if (i == LABEL_REF && (aindex == 1 || aindex == 2))
&& (aindex == 1 || aindex == 2))
t = rtx_tp, subname = "rt_rtx"; t = rtx_tp, subname = "rt_rtx";
else if (i == NOTE && aindex == 4) else if (i == NOTE && aindex == 4)
t = note_union_tp, subname = ""; t = note_union_tp, subname = "";
...@@ -1139,7 +1144,7 @@ adjust_field_rtx_def (type_p t, options_p ARG_UNUSED (opt)) ...@@ -1139,7 +1144,7 @@ adjust_field_rtx_def (type_p t, options_p ARG_UNUSED (opt))
else else
{ {
error_at_line (&lexer_line, error_at_line (&lexer_line,
"rtx type `%s' has `0' in position %lu, can't handle", "rtx type `%s' has `0' in position %lu, can't handle",
rtx_name[i], (unsigned long) aindex); rtx_name[i], (unsigned long) aindex);
t = &string_type; t = &string_type;
subname = "rt_int"; subname = "rt_int";
...@@ -1177,9 +1182,9 @@ adjust_field_rtx_def (type_p t, options_p ARG_UNUSED (opt)) ...@@ -1177,9 +1182,9 @@ adjust_field_rtx_def (type_p t, options_p ARG_UNUSED (opt))
default: default:
error_at_line (&lexer_line, error_at_line (&lexer_line,
"rtx type `%s' has `%c' in position %lu, can't handle", "rtx type `%s' has `%c' in position %lu, can't handle",
rtx_name[i], rtx_format[i][aindex], rtx_name[i], rtx_format[i][aindex],
(unsigned long)aindex); (unsigned long) aindex);
t = &string_type; t = &string_type;
subname = "rt_int"; subname = "rt_int";
break; break;
...@@ -1282,11 +1287,11 @@ adjust_field_type (type_p t, options_p opt) ...@@ -1282,11 +1287,11 @@ adjust_field_type (type_p t, options_p opt)
{ {
int num = ISDIGIT (opt->name[5]) ? opt->name[5] - '0' : 0; int num = ISDIGIT (opt->name[5]) ? opt->name[5] - '0' : 0;
if (! UNION_OR_STRUCT_P (t) if (!UNION_OR_STRUCT_P (t)
&& (t->kind != TYPE_POINTER || ! UNION_OR_STRUCT_P (t->u.p))) && (t->kind != TYPE_POINTER || !UNION_OR_STRUCT_P (t->u.p)))
{ {
error_at_line (&lexer_line, error_at_line (&lexer_line,
"option `%s' may only be applied to structures or structure pointers", "option `%s' may only be applied to structures or structure pointers",
opt->name); opt->name);
return t; return t;
} }
...@@ -1294,8 +1299,9 @@ adjust_field_type (type_p t, options_p opt) ...@@ -1294,8 +1299,9 @@ adjust_field_type (type_p t, options_p opt)
params_p = 1; params_p = 1;
if (params[num] != NULL) if (params[num] != NULL)
error_at_line (&lexer_line, "duplicate `%s' option", opt->name); error_at_line (&lexer_line, "duplicate `%s' option", opt->name);
if (! ISDIGIT (opt->name[5])) if (!ISDIGIT (opt->name[5]))
params[num] = create_pointer (CONST_CAST2(type_p, const char *, opt->info)); params[num] =
create_pointer (CONST_CAST2 (type_p, const char *, opt->info));
else else
params[num] = CONST_CAST2 (type_p, const char *, opt->info); params[num] = CONST_CAST2 (type_p, const char *, opt->info);
} }
...@@ -1320,10 +1326,8 @@ adjust_field_type (type_p t, options_p opt) ...@@ -1320,10 +1326,8 @@ adjust_field_type (type_p t, options_p opt)
t = pointer_p ? create_pointer (realt) : realt; t = pointer_p ? create_pointer (realt) : realt;
} }
if (! length_p if (!length_p
&& pointer_p && pointer_p && t->u.p->kind == TYPE_SCALAR && t->u.p->u.scalar_is_char)
&& t->u.p->kind == TYPE_SCALAR
&& t->u.p->u.scalar_is_char)
return &string_type; return &string_type;
if (t->kind == TYPE_ARRAY && t->u.a.p->kind == TYPE_POINTER if (t->kind == TYPE_ARRAY && t->u.a.p->kind == TYPE_POINTER
&& t->u.a.p->u.p->kind == TYPE_SCALAR && t->u.a.p->u.p->kind == TYPE_SCALAR
...@@ -1332,8 +1336,8 @@ adjust_field_type (type_p t, options_p opt) ...@@ -1332,8 +1336,8 @@ adjust_field_type (type_p t, options_p opt)
return t; return t;
} }
static void set_gc_used_type (type_p, enum gc_used_enum, type_p *); static void set_gc_used_type (type_p, enum gc_used_enum, type_p *);
static void set_gc_used (pair_p); static void set_gc_used (pair_p);
...@@ -1341,7 +1345,8 @@ static void set_gc_used (pair_p); ...@@ -1341,7 +1345,8 @@ static void set_gc_used (pair_p);
static void static void
process_gc_options (options_p opt, enum gc_used_enum level, int *maybe_undef, process_gc_options (options_p opt, enum gc_used_enum level, int *maybe_undef,
int *pass_param, int *length, int *skip, type_p *nested_ptr) int *pass_param, int *length, int *skip,
type_p *nested_ptr)
{ {
options_p o; options_p o;
for (o = opt; o; o = o->next) for (o = opt; o; o = o->next)
...@@ -1403,7 +1408,7 @@ set_gc_used_type (type_p t, enum gc_used_enum level, type_p param[NUM_PARAM]) ...@@ -1403,7 +1408,7 @@ set_gc_used_type (type_p t, enum gc_used_enum level, type_p param[NUM_PARAM])
set_gc_used_type (find_param_structure (f->type->u.p, param), set_gc_used_type (find_param_structure (f->type->u.p, param),
GC_POINTED_TO, NULL); GC_POINTED_TO, NULL);
else if (skip) else if (skip)
; /* target type is not used through this field */ ; /* target type is not used through this field */
else else
set_gc_used_type (f->type, GC_USED, pass_param ? param : NULL); set_gc_used_type (f->type, GC_USED, pass_param ? param : NULL);
} }
...@@ -1522,7 +1527,7 @@ oprintf (outf_p o, const char *format, ...) ...@@ -1522,7 +1527,7 @@ oprintf (outf_p o, const char *format, ...)
va_start (ap, format); va_start (ap, format);
slength = vasprintf (&s, format, ap); slength = vasprintf (&s, format, ap);
if (s == NULL || (int)slength < 0) if (s == NULL || (int) slength < 0)
fatal ("out of memory"); fatal ("out of memory");
va_end (ap); va_end (ap);
...@@ -1531,9 +1536,11 @@ oprintf (outf_p o, const char *format, ...) ...@@ -1531,9 +1536,11 @@ oprintf (outf_p o, const char *format, ...)
size_t new_len = o->buflength; size_t new_len = o->buflength;
if (new_len == 0) if (new_len == 0)
new_len = 1024; new_len = 1024;
do { do
new_len *= 2; {
} while (o->bufused + slength >= new_len); new_len *= 2;
}
while (o->bufused + slength >= new_len);
o->buf = XRESIZEVEC (char, o->buf, new_len); o->buf = XRESIZEVEC (char, o->buf, new_len);
o->buflength = new_len; o->buflength = new_len;
} }
...@@ -1563,9 +1570,9 @@ open_base_files (void) ...@@ -1563,9 +1570,9 @@ open_base_files (void)
/* gtype-desc.c is a little special, so we create it here. */ /* gtype-desc.c is a little special, so we create it here. */
{ {
/* The order of files here matters very much. */ /* The order of files here matters very much. */
static const char *const ifiles [] = { static const char *const ifiles[] = {
"config.h", "system.h", "coretypes.h", "tm.h", "config.h", "system.h", "coretypes.h", "tm.h",
"hashtab.h", "splay-tree.h", "obstack.h", "bitmap.h", "input.h", "hashtab.h", "splay-tree.h", "obstack.h", "bitmap.h", "input.h",
"tree.h", "rtl.h", "function.h", "insn-config.h", "expr.h", "tree.h", "rtl.h", "function.h", "insn-config.h", "expr.h",
"hard-reg-set.h", "basic-block.h", "cselib.h", "insn-addr.h", "hard-reg-set.h", "basic-block.h", "cselib.h", "insn-addr.h",
"optabs.h", "libfuncs.h", "debug.h", "ggc.h", "cgraph.h", "optabs.h", "libfuncs.h", "debug.h", "ggc.h", "cgraph.h",
...@@ -1592,7 +1599,7 @@ open_base_files (void) ...@@ -1592,7 +1599,7 @@ open_base_files (void)
static const char * static const char *
get_file_realbasename (const char *f) get_file_realbasename (const char *f)
{ {
const char * lastslash = strrchr (f, '/'); const char *lastslash = strrchr (f, '/');
return (lastslash != NULL) ? lastslash + 1 : f; return (lastslash != NULL) ? lastslash + 1 : f;
} }
...@@ -1617,7 +1624,7 @@ get_file_srcdir_relative_path (const char *f) ...@@ -1617,7 +1624,7 @@ get_file_srcdir_relative_path (const char *f)
static const char * static const char *
get_file_basename (const char *f) get_file_basename (const char *f)
{ {
const char * srcdir_path = get_file_srcdir_relative_path (f); const char *srcdir_path = get_file_srcdir_relative_path (f);
return (srcdir_path != NULL) ? srcdir_path : get_file_realbasename (f); return (srcdir_path != NULL) ? srcdir_path : get_file_realbasename (f);
} }
...@@ -1633,7 +1640,7 @@ get_prefix_langdir_index (const char *f) ...@@ -1633,7 +1640,7 @@ get_prefix_langdir_index (const char *f)
for (lang_index = 0; lang_index < num_lang_dirs; lang_index++) for (lang_index = 0; lang_index < num_lang_dirs; lang_index++)
{ {
const char * langdir = lang_dir_names [lang_index]; const char *langdir = lang_dir_names[lang_index];
size_t langdir_len = strlen (langdir); size_t langdir_len = strlen (langdir);
if (f_len > langdir_len if (f_len > langdir_len
...@@ -1656,18 +1663,17 @@ get_file_langdir (const char *f) ...@@ -1656,18 +1663,17 @@ get_file_langdir (const char *f)
srcdir relative, no point in looking further. */ srcdir relative, no point in looking further. */
int lang_index; int lang_index;
const char * srcdir_relative_path = get_file_srcdir_relative_path (f); const char *srcdir_relative_path = get_file_srcdir_relative_path (f);
const char * r; const char *r;
if (!srcdir_relative_path) if (!srcdir_relative_path)
return NULL; return NULL;
lang_index = get_prefix_langdir_index (srcdir_relative_path); lang_index = get_prefix_langdir_index (srcdir_relative_path);
if (lang_index < 0 if (lang_index < 0 && strncmp (srcdir_relative_path, "c-family", 8) == 0)
&& strncmp (srcdir_relative_path, "c-family", 8) == 0)
r = "c-family"; r = "c-family";
else if (lang_index >= 0) else if (lang_index >= 0)
r = lang_dir_names [lang_index]; r = lang_dir_names[lang_index];
else else
r = NULL; r = NULL;
...@@ -1685,7 +1691,7 @@ get_file_gtfilename (const char *f) ...@@ -1685,7 +1691,7 @@ get_file_gtfilename (const char *f)
const char *basename = get_file_realbasename (f); const char *basename = get_file_realbasename (f);
const char *langdir = get_file_langdir (f); const char *langdir = get_file_langdir (f);
char * result = char *result =
(langdir ? xasprintf ("gt-%s-%s", langdir, basename) (langdir ? xasprintf ("gt-%s-%s", langdir, basename)
: xasprintf ("gt-%s", basename)); : xasprintf ("gt-%s", basename));
...@@ -1696,7 +1702,7 @@ get_file_gtfilename (const char *f) ...@@ -1696,7 +1702,7 @@ get_file_gtfilename (const char *f)
char *s = result; char *s = result;
for (; *s != '.'; s++) for (; *s != '.'; s++)
if (! ISALNUM (*s) && *s != '-') if (!ISALNUM (*s) && *s != '-')
*s = '-'; *s = '-';
memcpy (s, ".h", sizeof (".h")); memcpy (s, ".h", sizeof (".h"));
...@@ -1739,9 +1745,9 @@ get_output_file_with_visibility (const char *input_file) ...@@ -1739,9 +1745,9 @@ get_output_file_with_visibility (const char *input_file)
basename = get_file_basename (input_file); basename = get_file_basename (input_file);
len = strlen (basename); len = strlen (basename);
if ((len > 2 && memcmp (basename+len-2, ".c", 2) == 0) if ((len > 2 && memcmp (basename + len - 2, ".c", 2) == 0)
|| (len > 2 && memcmp (basename+len-2, ".y", 2) == 0) || (len > 2 && memcmp (basename + len - 2, ".y", 2) == 0)
|| (len > 3 && memcmp (basename+len-3, ".in", 3) == 0)) || (len > 3 && memcmp (basename + len - 3, ".in", 3) == 0))
{ {
output_name = get_file_gtfilename (input_file); output_name = get_file_gtfilename (input_file);
for_name = basename; for_name = basename;
...@@ -1768,7 +1774,8 @@ get_output_file_with_visibility (const char *input_file) ...@@ -1768,7 +1774,8 @@ get_output_file_with_visibility (const char *input_file)
else if (strncmp (basename, "cp", 2) == 0 && IS_DIR_SEPARATOR (basename[2]) else if (strncmp (basename, "cp", 2) == 0 && IS_DIR_SEPARATOR (basename[2])
&& strcmp (basename + 3, "name-lookup.h") == 0) && strcmp (basename + 3, "name-lookup.h") == 0)
output_name = "gt-cp-name-lookup.h", for_name = "cp/name-lookup.c"; output_name = "gt-cp-name-lookup.h", for_name = "cp/name-lookup.c";
else if (strncmp (basename, "objc", 4) == 0 && IS_DIR_SEPARATOR (basename[4]) else if (strncmp (basename, "objc", 4) == 0
&& IS_DIR_SEPARATOR (basename[4])
&& strcmp (basename + 5, "objc-act.h") == 0) && strcmp (basename + 5, "objc-act.h") == 0)
output_name = "gt-objc-objc-act.h", for_name = "objc/objc-act.c"; output_name = "gt-objc-objc-act.h", for_name = "objc/objc-act.c";
else else
...@@ -1801,7 +1808,7 @@ get_output_file_with_visibility (const char *input_file) ...@@ -1801,7 +1808,7 @@ get_output_file_with_visibility (const char *input_file)
const char * const char *
get_output_file_name (const char *input_file) get_output_file_name (const char *input_file)
{ {
outf_p o = get_output_file_with_visibility (input_file); outf_p o = get_output_file_with_visibility (input_file);
if (o) if (o)
return o->name; return o->name;
return NULL; return NULL;
...@@ -1844,23 +1851,24 @@ close_output_files (void) ...@@ -1844,23 +1851,24 @@ close_output_files (void)
for (of = output_files; of; of = of->next) for (of = output_files; of; of = of->next)
{ {
if (!is_file_equal(of)) if (!is_file_equal (of))
{ {
FILE *newfile = fopen (of->name, "w"); FILE *newfile = fopen (of->name, "w");
if (newfile == NULL) if (newfile == NULL)
fatal ("opening output file %s: %s", of->name, xstrerror (errno)); fatal ("opening output file %s: %s", of->name, xstrerror (errno));
if (fwrite (of->buf, 1, of->bufused, newfile) != of->bufused) if (fwrite (of->buf, 1, of->bufused, newfile) != of->bufused)
fatal ("writing output file %s: %s", of->name, xstrerror (errno)); fatal ("writing output file %s: %s", of->name, xstrerror (errno));
if (fclose (newfile) != 0) if (fclose (newfile) != 0)
fatal ("closing output file %s: %s", of->name, xstrerror (errno)); fatal ("closing output file %s: %s", of->name, xstrerror (errno));
} }
free(of->buf); free (of->buf);
of->buf = NULL; of->buf = NULL;
of->bufused = of->buflength = 0; of->bufused = of->buflength = 0;
} }
} }
struct flist { struct flist
{
struct flist *next; struct flist *next;
int started_p; int started_p;
const char *name; const char *name;
...@@ -1873,10 +1881,8 @@ struct walk_type_data; ...@@ -1873,10 +1881,8 @@ struct walk_type_data;
For structures, given a pointer to the item in 'val'. For structures, given a pointer to the item in 'val'.
For misc. pointers, given the item in 'val'. For misc. pointers, given the item in 'val'.
*/ */
typedef void (*process_field_fn) typedef void (*process_field_fn) (type_p f, const struct walk_type_data * p);
(type_p f, const struct walk_type_data *p); typedef void (*func_name_fn) (type_p s, const struct walk_type_data * p);
typedef void (*func_name_fn)
(type_p s, const struct walk_type_data *p);
/* Parameters for write_types. */ /* Parameters for write_types. */
...@@ -1895,28 +1901,27 @@ static void output_escaped_param (struct walk_type_data *d, ...@@ -1895,28 +1901,27 @@ static void output_escaped_param (struct walk_type_data *d,
const char *, const char *); const char *, const char *);
static void output_mangled_typename (outf_p, const_type_p); static void output_mangled_typename (outf_p, const_type_p);
static void walk_type (type_p t, struct walk_type_data *d); static void walk_type (type_p t, struct walk_type_data *d);
static void write_func_for_structure (type_p orig_s, type_p s, type_p * param, static void write_func_for_structure (type_p orig_s, type_p s, type_p *param,
const struct write_types_data *wtd); const struct write_types_data *wtd);
static void write_types_process_field static void write_types_process_field
(type_p f, const struct walk_type_data *d); (type_p f, const struct walk_type_data *d);
static void write_types (outf_p output_header, static void write_types (outf_p output_header,
type_p structures, type_p structures,
type_p param_structs, type_p param_structs,
const struct write_types_data *wtd); const struct write_types_data *wtd);
static void write_types_local_process_field static void write_types_local_process_field
(type_p f, const struct walk_type_data *d); (type_p f, const struct walk_type_data *d);
static void write_local_func_for_structure static void write_local_func_for_structure
(const_type_p orig_s, type_p s, type_p * param); (const_type_p orig_s, type_p s, type_p *param);
static void write_local (outf_p output_header, static void write_local (outf_p output_header,
type_p structures, type_p structures, type_p param_structs);
type_p param_structs);
static void write_enum_defn (type_p structures, type_p param_structs); static void write_enum_defn (type_p structures, type_p param_structs);
static int contains_scalar_p (type_p t); static int contains_scalar_p (type_p t);
static void put_mangled_filename (outf_p , const char *); static void put_mangled_filename (outf_p, const char *);
static void finish_root_table (struct flist *flp, const char *pfx, static void finish_root_table (struct flist *flp, const char *pfx,
const char *tname, const char *lastname, const char *tname, const char *lastname,
const char *name); const char *name);
static void write_root (outf_p , pair_p, type_p, const char *, int, static void write_root (outf_p, pair_p, type_p, const char *, int,
struct fileloc *, const char *, bool); struct fileloc *, const char *, bool);
static void write_array (outf_p f, pair_p v, static void write_array (outf_p f, pair_p v,
const struct write_types_data *wtd); const struct write_types_data *wtd);
...@@ -1951,35 +1956,37 @@ output_mangled_typename (outf_p of, const_type_p t) ...@@ -1951,35 +1956,37 @@ output_mangled_typename (outf_p of, const_type_p t)
{ {
if (t == NULL) if (t == NULL)
oprintf (of, "Z"); oprintf (of, "Z");
else switch (t->kind) else
{ switch (t->kind)
case TYPE_POINTER:
oprintf (of, "P");
output_mangled_typename (of, t->u.p);
break;
case TYPE_SCALAR:
oprintf (of, "I");
break;
case TYPE_STRING:
oprintf (of, "S");
break;
case TYPE_STRUCT:
case TYPE_UNION:
case TYPE_LANG_STRUCT:
oprintf (of, "%lu%s", (unsigned long) strlen (t->u.s.tag), t->u.s.tag);
break;
case TYPE_PARAM_STRUCT:
{ {
int i; case TYPE_POINTER:
for (i = 0; i < NUM_PARAM; i++) oprintf (of, "P");
if (t->u.param_struct.param[i] != NULL) output_mangled_typename (of, t->u.p);
output_mangled_typename (of, t->u.param_struct.param[i]); break;
output_mangled_typename (of, t->u.param_struct.stru); case TYPE_SCALAR:
oprintf (of, "I");
break;
case TYPE_STRING:
oprintf (of, "S");
break;
case TYPE_STRUCT:
case TYPE_UNION:
case TYPE_LANG_STRUCT:
oprintf (of, "%lu%s", (unsigned long) strlen (t->u.s.tag),
t->u.s.tag);
break;
case TYPE_PARAM_STRUCT:
{
int i;
for (i = 0; i < NUM_PARAM; i++)
if (t->u.param_struct.param[i] != NULL)
output_mangled_typename (of, t->u.param_struct.param[i]);
output_mangled_typename (of, t->u.param_struct.stru);
}
break;
case TYPE_ARRAY:
gcc_unreachable ();
} }
break;
case TYPE_ARRAY:
gcc_unreachable ();
}
} }
/* Print PARAM to D->OF processing escapes. D->VAL references the /* Print PARAM to D->OF processing escapes. D->VAL references the
...@@ -1996,30 +2003,31 @@ output_escaped_param (struct walk_type_data *d, const char *param, ...@@ -1996,30 +2003,31 @@ output_escaped_param (struct walk_type_data *d, const char *param,
for (p = param; *p; p++) for (p = param; *p; p++)
if (*p != '%') if (*p != '%')
oprintf (d->of, "%c", *p); oprintf (d->of, "%c", *p);
else switch (*++p) else
{ switch (*++p)
case 'h':
oprintf (d->of, "(%s)", d->prev_val[2]);
break;
case '0':
oprintf (d->of, "(%s)", d->prev_val[0]);
break;
case '1':
oprintf (d->of, "(%s)", d->prev_val[1]);
break;
case 'a':
{ {
const char *pp = d->val + strlen (d->val); case 'h':
while (pp[-1] == ']') oprintf (d->of, "(%s)", d->prev_val[2]);
while (*pp != '[') break;
pp--; case '0':
oprintf (d->of, "%s", pp); oprintf (d->of, "(%s)", d->prev_val[0]);
break;
case '1':
oprintf (d->of, "(%s)", d->prev_val[1]);
break;
case 'a':
{
const char *pp = d->val + strlen (d->val);
while (pp[-1] == ']')
while (*pp != '[')
pp--;
oprintf (d->of, "%s", pp);
}
break;
default:
error_at_line (d->line, "`%s' option contains bad escape %c%c",
oname, '%', *p);
} }
break;
default:
error_at_line (d->line, "`%s' option contains bad escape %c%c",
oname, '%', *p);
}
} }
/* Call D->PROCESS_FIELD for every field (or subfield) of D->VAL, /* Call D->PROCESS_FIELD for every field (or subfield) of D->VAL,
...@@ -2076,8 +2084,7 @@ walk_type (type_p t, struct walk_type_data *d) ...@@ -2076,8 +2084,7 @@ walk_type (type_p t, struct walk_type_data *d)
else if (strcmp (oo->name, "param_is") == 0) else if (strcmp (oo->name, "param_is") == 0)
; ;
else if (strncmp (oo->name, "param", 5) == 0 else if (strncmp (oo->name, "param", 5) == 0
&& ISDIGIT (oo->name[5]) && ISDIGIT (oo->name[5]) && strcmp (oo->name + 6, "_is") == 0)
&& strcmp (oo->name + 6, "_is") == 0)
; ;
else if (strcmp (oo->name, "chain_next") == 0) else if (strcmp (oo->name, "chain_next") == 0)
; ;
...@@ -2101,7 +2108,7 @@ walk_type (type_p t, struct walk_type_data *d) ...@@ -2101,7 +2108,7 @@ walk_type (type_p t, struct walk_type_data *d)
if (pointer_p) if (pointer_p)
t = t->u.p; t = t->u.p;
if (! UNION_OR_STRUCT_P (t)) if (!UNION_OR_STRUCT_P (t))
error_at_line (d->line, "`use_params' option on unimplemented type"); error_at_line (d->line, "`use_params' option on unimplemented type");
else else
t = find_param_structure (t, d->param); t = find_param_structure (t, d->param);
...@@ -2125,12 +2132,11 @@ walk_type (type_p t, struct walk_type_data *d) ...@@ -2125,12 +2132,11 @@ walk_type (type_p t, struct walk_type_data *d)
t = nt; t = nt;
} }
else else
error_at_line (d->line, "no parameter defined for `%s'", error_at_line (d->line, "no parameter defined for `%s'", d->val);
d->val);
} }
if (maybe_undef_p if (maybe_undef_p
&& (t->kind != TYPE_POINTER || ! UNION_OR_STRUCT_P (t->u.p))) && (t->kind != TYPE_POINTER || !UNION_OR_STRUCT_P (t->u.p)))
{ {
error_at_line (d->line, error_at_line (d->line,
"field `%s' has invalid option `maybe_undef_p'\n", "field `%s' has invalid option `maybe_undef_p'\n",
...@@ -2147,16 +2153,15 @@ walk_type (type_p t, struct walk_type_data *d) ...@@ -2147,16 +2153,15 @@ walk_type (type_p t, struct walk_type_data *d)
case TYPE_POINTER: case TYPE_POINTER:
{ {
if (maybe_undef_p if (maybe_undef_p && t->u.p->u.s.line.file == NULL)
&& t->u.p->u.s.line.file == NULL)
{ {
oprintf (d->of, "%*sgcc_assert (!%s);\n", d->indent, "", d->val); oprintf (d->of, "%*sgcc_assert (!%s);\n", d->indent, "", d->val);
break; break;
} }
if (! length) if (!length)
{ {
if (! UNION_OR_STRUCT_P (t->u.p) if (!UNION_OR_STRUCT_P (t->u.p)
&& t->u.p->kind != TYPE_PARAM_STRUCT) && t->u.p->kind != TYPE_PARAM_STRUCT)
{ {
error_at_line (d->line, error_at_line (d->line,
...@@ -2169,12 +2174,11 @@ walk_type (type_p t, struct walk_type_data *d) ...@@ -2169,12 +2174,11 @@ walk_type (type_p t, struct walk_type_data *d)
{ {
const char *oldprevval2 = d->prev_val[2]; const char *oldprevval2 = d->prev_val[2];
if (! UNION_OR_STRUCT_P (nested_ptr_d->type)) if (!UNION_OR_STRUCT_P (nested_ptr_d->type))
{ {
error_at_line (d->line, error_at_line (d->line,
"field `%s' has invalid " "field `%s' has invalid "
"option `nested_ptr'\n", "option `nested_ptr'\n", d->val);
d->val);
return; return;
} }
...@@ -2186,8 +2190,7 @@ walk_type (type_p t, struct walk_type_data *d) ...@@ -2186,8 +2190,7 @@ walk_type (type_p t, struct walk_type_data *d)
(nested_ptr_d->type->kind == TYPE_UNION (nested_ptr_d->type->kind == TYPE_UNION
? "union" : "struct"), ? "union" : "struct"),
nested_ptr_d->type->u.s.tag, nested_ptr_d->type->u.s.tag,
d->fn_wants_lvalue ? "" : "const ", d->fn_wants_lvalue ? "" : "const ", d->val);
d->val);
oprintf (d->of, "%*s", d->indent + 2, ""); oprintf (d->of, "%*s", d->indent + 2, "");
output_escaped_param (d, nested_ptr_d->convert_from, output_escaped_param (d, nested_ptr_d->convert_from,
"nested_ptr"); "nested_ptr");
...@@ -2223,8 +2226,8 @@ walk_type (type_p t, struct walk_type_data *d) ...@@ -2223,8 +2226,8 @@ walk_type (type_p t, struct walk_type_data *d)
oprintf (d->of, "%*sif (%s != NULL) {\n", d->indent, "", d->val); oprintf (d->of, "%*sif (%s != NULL) {\n", d->indent, "", d->val);
d->indent += 2; d->indent += 2;
oprintf (d->of, "%*ssize_t i%d;\n", d->indent, "", loopcounter); oprintf (d->of, "%*ssize_t i%d;\n", d->indent, "", loopcounter);
oprintf (d->of, "%*sfor (i%d = 0; i%d != (size_t)(", d->indent, "", oprintf (d->of, "%*sfor (i%d = 0; i%d != (size_t)(", d->indent,
loopcounter, loopcounter); "", loopcounter, loopcounter);
output_escaped_param (d, length, "length"); output_escaped_param (d, length, "length");
oprintf (d->of, "); i%d++) {\n", loopcounter); oprintf (d->of, "); i%d++) {\n", loopcounter);
d->indent += 2; d->indent += 2;
...@@ -2238,7 +2241,7 @@ walk_type (type_p t, struct walk_type_data *d) ...@@ -2238,7 +2241,7 @@ walk_type (type_p t, struct walk_type_data *d)
d->used_length = 0; d->used_length = 0;
d->indent -= 2; d->indent -= 2;
oprintf (d->of, "%*s}\n", d->indent, ""); oprintf (d->of, "%*s}\n", d->indent, "");
d->process_field(t, d); d->process_field (t, d);
d->indent -= 2; d->indent -= 2;
oprintf (d->of, "%*s}\n", d->indent, ""); oprintf (d->of, "%*s}\n", d->indent, "");
} }
...@@ -2302,7 +2305,7 @@ walk_type (type_p t, struct walk_type_data *d) ...@@ -2302,7 +2305,7 @@ walk_type (type_p t, struct walk_type_data *d)
int seen_default_p = 0; int seen_default_p = 0;
options_p o; options_p o;
if (! t->u.s.line.file) if (!t->u.s.line.file)
error_at_line (d->line, "incomplete structure `%s'", t->u.s.tag); error_at_line (d->line, "incomplete structure `%s'", t->u.s.tag);
if ((d->bitmap & t->u.s.bitmap) != d->bitmap) if ((d->bitmap & t->u.s.bitmap) != d->bitmap)
...@@ -2315,7 +2318,7 @@ walk_type (type_p t, struct walk_type_data *d) ...@@ -2315,7 +2318,7 @@ walk_type (type_p t, struct walk_type_data *d)
/* Some things may also be defined in the structure's options. */ /* Some things may also be defined in the structure's options. */
for (o = t->u.s.opt; o; o = o->next) for (o = t->u.s.opt; o; o = o->next)
if (! desc && strcmp (o->name, "desc") == 0) if (!desc && strcmp (o->name, "desc") == 0)
desc = o->info; desc = o->info;
d->prev_val[2] = oldval; d->prev_val[2] = oldval;
...@@ -2324,7 +2327,8 @@ walk_type (type_p t, struct walk_type_data *d) ...@@ -2324,7 +2327,8 @@ walk_type (type_p t, struct walk_type_data *d)
{ {
if (desc == NULL) if (desc == NULL)
{ {
error_at_line (d->line, "missing `desc' option for union `%s'", error_at_line (d->line,
"missing `desc' option for union `%s'",
t->u.s.tag); t->u.s.tag);
desc = "1"; desc = "1";
} }
...@@ -2374,19 +2378,19 @@ walk_type (type_p t, struct walk_type_data *d) ...@@ -2374,19 +2378,19 @@ walk_type (type_p t, struct walk_type_data *d)
d->indent += 2; d->indent += 2;
seen_default_p = 1; seen_default_p = 1;
} }
else if (! union_p && (default_p || tagid)) else if (!union_p && (default_p || tagid))
error_at_line (d->line, error_at_line (d->line,
"can't use `%s' outside a union on field `%s'", "can't use `%s' outside a union on field `%s'",
default_p ? "default" : "tag", f->name); default_p ? "default" : "tag", f->name);
else if (union_p && ! (default_p || tagid) else if (union_p && !(default_p || tagid)
&& f->type->kind == TYPE_SCALAR) && f->type->kind == TYPE_SCALAR)
{ {
fprintf (stderr, fprintf (stderr,
"%s:%d: warning: field `%s' is missing `tag' or `default' option\n", "%s:%d: warning: field `%s' is missing `tag' or `default' option\n",
d->line->file, d->line->line, f->name); d->line->file, d->line->line, f->name);
continue; continue;
} }
else if (union_p && ! (default_p || tagid)) else if (union_p && !(default_p || tagid))
error_at_line (d->line, error_at_line (d->line,
"field `%s' is missing `tag' or `default' option", "field `%s' is missing `tag' or `default' option",
f->name); f->name);
...@@ -2415,7 +2419,7 @@ walk_type (type_p t, struct walk_type_data *d) ...@@ -2415,7 +2419,7 @@ walk_type (type_p t, struct walk_type_data *d)
d->prev_val[1] = oldprevval1; d->prev_val[1] = oldprevval1;
d->prev_val[2] = oldprevval2; d->prev_val[2] = oldprevval2;
if (union_p && ! seen_default_p) if (union_p && !seen_default_p)
{ {
oprintf (d->of, "%*sdefault:\n", d->indent, ""); oprintf (d->of, "%*sdefault:\n", d->indent, "");
oprintf (d->of, "%*s break;\n", d->indent, ""); oprintf (d->of, "%*s break;\n", d->indent, "");
...@@ -2488,8 +2492,7 @@ write_types_process_field (type_p f, const struct walk_type_data *d) ...@@ -2488,8 +2492,7 @@ write_types_process_field (type_p f, const struct walk_type_data *d)
oprintf (d->of, ", gt_e_"); oprintf (d->of, ", gt_e_");
output_mangled_typename (d->of, f); output_mangled_typename (d->of, f);
} }
else if (UNION_OR_STRUCT_P (f) else if (UNION_OR_STRUCT_P (f) && f->u.p->u.s.line.file != NULL)
&& f->u.p->u.s.line.file != NULL)
{ {
oprintf (d->of, ", gt_ggc_e_"); oprintf (d->of, ", gt_ggc_e_");
output_mangled_typename (d->of, f); output_mangled_typename (d->of, f);
...@@ -2551,7 +2554,7 @@ output_type_enum (outf_p of, type_p s) ...@@ -2551,7 +2554,7 @@ output_type_enum (outf_p of, type_p s)
static outf_p static outf_p
get_output_file_for_structure (const_type_p s, type_p *param) get_output_file_for_structure (const_type_p s, type_p *param)
{ {
const char * fn = s->u.s.line.file; const char *fn = s->u.s.line.file;
int i; int i;
/* This is a hack, and not the good kind either. */ /* This is a hack, and not the good kind either. */
...@@ -2567,8 +2570,8 @@ get_output_file_for_structure (const_type_p s, type_p *param) ...@@ -2567,8 +2570,8 @@ get_output_file_for_structure (const_type_p s, type_p *param)
PARAM, write out a routine that: PARAM, write out a routine that:
- Takes a parameter, a void * but actually of type *S - Takes a parameter, a void * but actually of type *S
- If SEEN_ROUTINE returns nonzero, calls write_types_process_field on each - If SEEN_ROUTINE returns nonzero, calls write_types_process_field on each
field of S or its substructures and (in some cases) things field of S or its substructures and (in some cases) things
that are pointed to by S. that are pointed to by S.
*/ */
static void static void
...@@ -2610,7 +2613,7 @@ write_func_for_structure (type_p orig_s, type_p s, type_p *param, ...@@ -2610,7 +2613,7 @@ write_func_for_structure (type_p orig_s, type_p s, type_p *param,
d.bitmap = s->u.s.bitmap; d.bitmap = s->u.s.bitmap;
d.param = param; d.param = param;
d.prev_val[0] = "*x"; d.prev_val[0] = "*x";
d.prev_val[1] = "not valid postage"; /* Guarantee an error. */ d.prev_val[1] = "not valid postage"; /* Guarantee an error. */
d.prev_val[3] = "x"; d.prev_val[3] = "x";
d.val = "(*x)"; d.val = "(*x)";
...@@ -2682,8 +2685,7 @@ write_func_for_structure (type_p orig_s, type_p s, type_p *param, ...@@ -2682,8 +2685,7 @@ write_func_for_structure (type_p orig_s, type_p s, type_p *param,
oprintf (d.of, ");\n"); oprintf (d.of, ");\n");
oprintf (d.of, " if (xprev == NULL) break;\n"); oprintf (d.of, " if (xprev == NULL) break;\n");
oprintf (d.of, " x = xprev;\n"); oprintf (d.of, " x = xprev;\n");
oprintf (d.of, " (void) %s (xprev", oprintf (d.of, " (void) %s (xprev", wtd->marker_routine);
wtd->marker_routine);
if (wtd->param_prefix) if (wtd->param_prefix)
{ {
oprintf (d.of, ", xprev, gt_%s_", wtd->param_prefix); oprintf (d.of, ", xprev, gt_%s_", wtd->param_prefix);
...@@ -2745,13 +2747,11 @@ write_types (outf_p output_header, type_p structures, type_p param_structs, ...@@ -2745,13 +2747,11 @@ write_types (outf_p output_header, type_p structures, type_p param_structs,
emitted afterwards. This is needed in plugin mode. */ emitted afterwards. This is needed in plugin mode. */
oprintf (output_header, "/* macros and declarations */\n"); oprintf (output_header, "/* macros and declarations */\n");
for (s = structures; s; s = s->next) for (s = structures; s; s = s->next)
if (s->gc_used == GC_POINTED_TO if (s->gc_used == GC_POINTED_TO || s->gc_used == GC_MAYBE_POINTED_TO)
|| s->gc_used == GC_MAYBE_POINTED_TO)
{ {
options_p opt; options_p opt;
if (s->gc_used == GC_MAYBE_POINTED_TO if (s->gc_used == GC_MAYBE_POINTED_TO && s->u.s.line.file == NULL)
&& s->u.s.line.file == NULL)
continue; continue;
oprintf (output_header, "#define gt_%s_", wtd->prefix); oprintf (output_header, "#define gt_%s_", wtd->prefix);
...@@ -2760,16 +2760,14 @@ write_types (outf_p output_header, type_p structures, type_p param_structs, ...@@ -2760,16 +2760,14 @@ write_types (outf_p output_header, type_p structures, type_p param_structs,
oprintf (output_header, oprintf (output_header,
" if (X != NULL) gt_%sx_%s (X);\\\n", wtd->prefix, " if (X != NULL) gt_%sx_%s (X);\\\n", wtd->prefix,
s->u.s.tag); s->u.s.tag);
oprintf (output_header, oprintf (output_header, " } while (0)\n");
" } while (0)\n");
for (opt = s->u.s.opt; opt; opt = opt->next) for (opt = s->u.s.opt; opt; opt = opt->next)
if (strcmp (opt->name, "ptr_alias") == 0) if (strcmp (opt->name, "ptr_alias") == 0)
{ {
const_type_p const t = (const_type_p) opt->info; const_type_p const t = (const_type_p) opt->info;
if (t->kind == TYPE_STRUCT if (t->kind == TYPE_STRUCT
|| t->kind == TYPE_UNION || t->kind == TYPE_UNION || t->kind == TYPE_LANG_STRUCT)
|| t->kind == TYPE_LANG_STRUCT)
oprintf (output_header, oprintf (output_header,
"#define gt_%sx_%s gt_%sx_%s\n", "#define gt_%sx_%s gt_%sx_%s\n",
wtd->prefix, s->u.s.tag, wtd->prefix, t->u.s.tag); wtd->prefix, s->u.s.tag, wtd->prefix, t->u.s.tag);
...@@ -2815,13 +2813,11 @@ write_types (outf_p output_header, type_p structures, type_p param_structs, ...@@ -2815,13 +2813,11 @@ write_types (outf_p output_header, type_p structures, type_p param_structs,
/* At last we emit the functions code. */ /* At last we emit the functions code. */
oprintf (output_header, "\n/* functions code */\n"); oprintf (output_header, "\n/* functions code */\n");
for (s = structures; s; s = s->next) for (s = structures; s; s = s->next)
if (s->gc_used == GC_POINTED_TO if (s->gc_used == GC_POINTED_TO || s->gc_used == GC_MAYBE_POINTED_TO)
|| s->gc_used == GC_MAYBE_POINTED_TO)
{ {
options_p opt; options_p opt;
if (s->gc_used == GC_MAYBE_POINTED_TO if (s->gc_used == GC_MAYBE_POINTED_TO && s->u.s.line.file == NULL)
&& s->u.s.line.file == NULL)
continue; continue;
for (opt = s->u.s.opt; opt; opt = opt->next) for (opt = s->u.s.opt; opt; opt = opt->next)
if (strcmp (opt->name, "ptr_alias") == 0) if (strcmp (opt->name, "ptr_alias") == 0)
...@@ -2856,15 +2852,13 @@ write_types (outf_p output_header, type_p structures, type_p param_structs, ...@@ -2856,15 +2852,13 @@ write_types (outf_p output_header, type_p structures, type_p param_structs,
} }
} }
static const struct write_types_data ggc_wtd = static const struct write_types_data ggc_wtd = {
{
"ggc_m", NULL, "ggc_mark", "ggc_test_and_set_mark", NULL, "ggc_m", NULL, "ggc_mark", "ggc_test_and_set_mark", NULL,
"GC marker procedures. ", "GC marker procedures. ",
FALSE FALSE
}; };
static const struct write_types_data pch_wtd = static const struct write_types_data pch_wtd = {
{
"pch_n", "pch_p", "gt_pch_note_object", "gt_pch_note_object", "pch_n", "pch_p", "gt_pch_note_object", "gt_pch_note_object",
"gt_pch_note_reorder", "gt_pch_note_reorder",
"PCH type-walking procedures. ", "PCH type-walking procedures. ",
...@@ -2918,7 +2912,7 @@ write_local_func_for_structure (const_type_p orig_s, type_p s, type_p *param) ...@@ -2918,7 +2912,7 @@ write_local_func_for_structure (const_type_p orig_s, type_p s, type_p *param)
d.bitmap = s->u.s.bitmap; d.bitmap = s->u.s.bitmap;
d.param = param; d.param = param;
d.prev_val[0] = d.prev_val[2] = "*x"; d.prev_val[0] = d.prev_val[2] = "*x";
d.prev_val[1] = "not valid postage"; /* Guarantee an error. */ d.prev_val[1] = "not valid postage"; /* Guarantee an error. */
d.prev_val[3] = "x"; d.prev_val[3] = "x";
d.val = "(*x)"; d.val = "(*x)";
d.fn_wants_lvalue = true; d.fn_wants_lvalue = true;
...@@ -2951,8 +2945,7 @@ write_local (outf_p output_header, type_p structures, type_p param_structs) ...@@ -2951,8 +2945,7 @@ write_local (outf_p output_header, type_p structures, type_p param_structs)
return; return;
oprintf (output_header, "\n/* Local pointer-walking routines. */\n"); oprintf (output_header, "\n/* Local pointer-walking routines. */\n");
for (s = structures; s; s = s->next) for (s = structures; s; s = s->next)
if (s->gc_used == GC_POINTED_TO if (s->gc_used == GC_POINTED_TO || s->gc_used == GC_MAYBE_POINTED_TO)
|| s->gc_used == GC_MAYBE_POINTED_TO)
{ {
options_p opt; options_p opt;
...@@ -2964,8 +2957,7 @@ write_local (outf_p output_header, type_p structures, type_p param_structs) ...@@ -2964,8 +2957,7 @@ write_local (outf_p output_header, type_p structures, type_p param_structs)
{ {
const_type_p const t = (const_type_p) opt->info; const_type_p const t = (const_type_p) opt->info;
if (t->kind == TYPE_STRUCT if (t->kind == TYPE_STRUCT
|| t->kind == TYPE_UNION || t->kind == TYPE_UNION || t->kind == TYPE_LANG_STRUCT)
|| t->kind == TYPE_LANG_STRUCT)
{ {
oprintf (output_header, "#define gt_pch_p_"); oprintf (output_header, "#define gt_pch_p_");
output_mangled_typename (output_header, s); output_mangled_typename (output_header, s);
...@@ -2985,7 +2977,7 @@ write_local (outf_p output_header, type_p structures, type_p param_structs) ...@@ -2985,7 +2977,7 @@ write_local (outf_p output_header, type_p structures, type_p param_structs)
oprintf (output_header, "extern void gt_pch_p_"); oprintf (output_header, "extern void gt_pch_p_");
output_mangled_typename (output_header, s); output_mangled_typename (output_header, s);
oprintf (output_header, oprintf (output_header,
"\n (void *, void *, gt_pointer_operator, void *);\n"); "\n (void *, void *, gt_pointer_operator, void *);\n");
if (s->kind == TYPE_LANG_STRUCT) if (s->kind == TYPE_LANG_STRUCT)
{ {
...@@ -3000,14 +2992,14 @@ write_local (outf_p output_header, type_p structures, type_p param_structs) ...@@ -3000,14 +2992,14 @@ write_local (outf_p output_header, type_p structures, type_p param_structs)
for (s = param_structs; s; s = s->next) for (s = param_structs; s; s = s->next)
if (s->gc_used == GC_POINTED_TO) if (s->gc_used == GC_POINTED_TO)
{ {
type_p * param = s->u.param_struct.param; type_p *param = s->u.param_struct.param;
type_p stru = s->u.param_struct.stru; type_p stru = s->u.param_struct.stru;
/* Declare the marker procedure. */ /* Declare the marker procedure. */
oprintf (output_header, "extern void gt_pch_p_"); oprintf (output_header, "extern void gt_pch_p_");
output_mangled_typename (output_header, s); output_mangled_typename (output_header, s);
oprintf (output_header, oprintf (output_header,
"\n (void *, void *, gt_pointer_operator, void *);\n"); "\n (void *, void *, gt_pointer_operator, void *);\n");
if (stru->u.s.line.file == NULL) if (stru->u.s.line.file == NULL)
{ {
...@@ -3084,7 +3076,7 @@ contains_scalar_p (type_p t) ...@@ -3084,7 +3076,7 @@ contains_scalar_p (type_p t)
return contains_scalar_p (t->u.a.p); return contains_scalar_p (t->u.a.p);
default: default:
/* Could also check for structures that have no non-pointer /* Could also check for structures that have no non-pointer
fields, but there aren't enough of those to worry about. */ fields, but there aren't enough of those to worry about. */
return 1; return 1;
} }
} }
...@@ -3131,8 +3123,7 @@ finish_root_table (struct flist *flp, const char *pfx, const char *lastname, ...@@ -3131,8 +3123,7 @@ finish_root_table (struct flist *flp, const char *pfx, const char *lastname,
if (bitmap & 1) if (bitmap & 1)
{ {
oprintf (base_files[fnum], oprintf (base_files[fnum],
"extern const struct %s gt_%s_", "extern const struct %s gt_%s_", tname, pfx);
tname, pfx);
put_mangled_filename (base_files[fnum], fli2->name); put_mangled_filename (base_files[fnum], fli2->name);
oprintf (base_files[fnum], "[];\n"); oprintf (base_files[fnum], "[];\n");
} }
...@@ -3141,9 +3132,8 @@ finish_root_table (struct flist *flp, const char *pfx, const char *lastname, ...@@ -3141,9 +3132,8 @@ finish_root_table (struct flist *flp, const char *pfx, const char *lastname,
{ {
size_t fnum; size_t fnum;
for (fnum = 0; base_files && fnum < num_lang_dirs; fnum++) for (fnum = 0; base_files && fnum < num_lang_dirs; fnum++)
oprintf (base_files [fnum], oprintf (base_files[fnum],
"EXPORTED_CONST struct %s * const %s[] = {\n", "EXPORTED_CONST struct %s * const %s[] = {\n", tname, name);
tname, name);
} }
...@@ -3240,13 +3230,13 @@ write_field_root (outf_p f, pair_p v, type_p type, const char *name, ...@@ -3240,13 +3230,13 @@ write_field_root (outf_p f, pair_p v, type_p type, const char *name,
/* Write out to F the table entry and any marker routines needed to /* Write out to F the table entry and any marker routines needed to
mark NAME as TYPE. V can be one of three values: mark NAME as TYPE. V can be one of three values:
- null, if NAME is too complex to represent using a single - null, if NAME is too complex to represent using a single
count and stride. In this case, it is an error for NAME to count and stride. In this case, it is an error for NAME to
contain any gc-ed data. contain any gc-ed data.
- the outermost array that contains NAME, if NAME is part of an array. - the outermost array that contains NAME, if NAME is part of an array.
- the C variable that contains NAME, if NAME is not part of an array. - the C variable that contains NAME, if NAME is not part of an array.
LINE is the line of the C source that declares the root variable. LINE is the line of the C source that declares the root variable.
HAS_LENGTH is nonzero iff V was a variable-length array. IF_MARKED HAS_LENGTH is nonzero iff V was a variable-length array. IF_MARKED
...@@ -3276,7 +3266,7 @@ write_root (outf_p f, pair_p v, type_p type, const char *name, int has_length, ...@@ -3276,7 +3266,7 @@ write_root (outf_p f, pair_p v, type_p type, const char *name, int has_length,
; ;
else else
error_at_line (line, error_at_line (line,
"field `%s' of global `%s' has unknown option `%s'", "field `%s' of global `%s' has unknown option `%s'",
fld->name, name, o->name); fld->name, name, o->name);
if (skip_p) if (skip_p)
...@@ -3298,10 +3288,9 @@ write_root (outf_p f, pair_p v, type_p type, const char *name, int has_length, ...@@ -3298,10 +3288,9 @@ write_root (outf_p f, pair_p v, type_p type, const char *name, int has_length,
continue; continue;
if (validf != NULL) if (validf != NULL)
error_at_line (line, error_at_line (line,
"both `%s.%s.%s' and `%s.%s.%s' have tag `%s'", "both `%s.%s.%s' and `%s.%s.%s' have tag `%s'",
name, fld->name, validf->name, name, fld->name, validf->name,
name, fld->name, ufld->name, name, fld->name, ufld->name, tag);
tag);
validf = ufld; validf = ufld;
} }
if (validf != NULL) if (validf != NULL)
...@@ -3312,7 +3301,7 @@ write_root (outf_p f, pair_p v, type_p type, const char *name, int has_length, ...@@ -3312,7 +3301,7 @@ write_root (outf_p f, pair_p v, type_p type, const char *name, int has_length,
} }
else if (desc) else if (desc)
error_at_line (line, error_at_line (line,
"global `%s.%s' has `desc' option but is not union", "global `%s.%s' has `desc' option but is not union",
name, fld->name); name, fld->name);
else else
write_field_root (f, v, type, name, 0, line, if_marked, write_field_root (f, v, type, name, 0, line, if_marked,
...@@ -3340,7 +3329,7 @@ write_root (outf_p f, pair_p v, type_p type, const char *name, int has_length, ...@@ -3340,7 +3329,7 @@ write_root (outf_p f, pair_p v, type_p type, const char *name, int has_length,
tp = type->u.p; tp = type->u.p;
if (! has_length && UNION_OR_STRUCT_P (tp)) if (!has_length && UNION_OR_STRUCT_P (tp))
{ {
oprintf (f, " &gt_ggc_mx_%s,\n", tp->u.s.tag); oprintf (f, " &gt_ggc_mx_%s,\n", tp->u.s.tag);
if (emit_pch) if (emit_pch)
...@@ -3348,7 +3337,7 @@ write_root (outf_p f, pair_p v, type_p type, const char *name, int has_length, ...@@ -3348,7 +3337,7 @@ write_root (outf_p f, pair_p v, type_p type, const char *name, int has_length,
else else
oprintf (f, " NULL"); oprintf (f, " NULL");
} }
else if (! has_length && tp->kind == TYPE_PARAM_STRUCT) else if (!has_length && tp->kind == TYPE_PARAM_STRUCT)
{ {
oprintf (f, " &gt_ggc_m_"); oprintf (f, " &gt_ggc_m_");
output_mangled_typename (f, tp); output_mangled_typename (f, tp);
...@@ -3396,9 +3385,7 @@ write_root (outf_p f, pair_p v, type_p type, const char *name, int has_length, ...@@ -3396,9 +3385,7 @@ write_root (outf_p f, pair_p v, type_p type, const char *name, int has_length,
break; break;
default: default:
error_at_line (line, error_at_line (line, "global `%s' is unimplemented type", name);
"global `%s' is unimplemented type",
name);
} }
} }
...@@ -3424,8 +3411,7 @@ write_array (outf_p f, pair_p v, const struct write_types_data *wtd) ...@@ -3424,8 +3411,7 @@ write_array (outf_p f, pair_p v, const struct write_types_data *wtd)
if (wtd->param_prefix) if (wtd->param_prefix)
{ {
oprintf (f, "static void gt_%sa_%s\n", wtd->param_prefix, v->name); oprintf (f, "static void gt_%sa_%s\n", wtd->param_prefix, v->name);
oprintf (f, oprintf (f, " (void *, void *, gt_pointer_operator, void *);\n");
" (void *, void *, gt_pointer_operator, void *);\n");
oprintf (f, "static void gt_%sa_%s (ATTRIBUTE_UNUSED void *this_obj,\n", oprintf (f, "static void gt_%sa_%s (ATTRIBUTE_UNUSED void *this_obj,\n",
wtd->param_prefix, v->name); wtd->param_prefix, v->name);
oprintf (d.of, oprintf (d.of,
...@@ -3440,8 +3426,7 @@ write_array (outf_p f, pair_p v, const struct write_types_data *wtd) ...@@ -3440,8 +3426,7 @@ write_array (outf_p f, pair_p v, const struct write_types_data *wtd)
} }
d.opt = v->opt; d.opt = v->opt;
oprintf (f, "static void gt_%sa_%s (void *);\n", oprintf (f, "static void gt_%sa_%s (void *);\n", wtd->prefix, v->name);
wtd->prefix, v->name);
oprintf (f, "static void\ngt_%sa_%s (ATTRIBUTE_UNUSED void *x_p)\n", oprintf (f, "static void\ngt_%sa_%s (ATTRIBUTE_UNUSED void *x_p)\n",
wtd->prefix, v->name); wtd->prefix, v->name);
oprintf (f, "{\n"); oprintf (f, "{\n");
...@@ -3476,8 +3461,7 @@ write_roots (pair_p variables, bool emit_pch) ...@@ -3476,8 +3461,7 @@ write_roots (pair_p variables, bool emit_pch)
else if (strcmp (o->name, "param_is") == 0) else if (strcmp (o->name, "param_is") == 0)
; ;
else if (strncmp (o->name, "param", 5) == 0 else if (strncmp (o->name, "param", 5) == 0
&& ISDIGIT (o->name[5]) && ISDIGIT (o->name[5]) && strcmp (o->name + 6, "_is") == 0)
&& strcmp (o->name + 6, "_is") == 0)
; ;
else if (strcmp (o->name, "if_marked") == 0) else if (strcmp (o->name, "if_marked") == 0)
; ;
...@@ -3496,13 +3480,13 @@ write_roots (pair_p variables, bool emit_pch) ...@@ -3496,13 +3480,13 @@ write_roots (pair_p variables, bool emit_pch)
fli->next = flp; fli->next = flp;
fli->started_p = 0; fli->started_p = 0;
fli->name = v->line.file; fli->name = v->line.file;
gcc_assert(fli->name); gcc_assert (fli->name);
flp = fli; flp = fli;
oprintf (f, "\n/* GC roots. */\n\n"); oprintf (f, "\n/* GC roots. */\n\n");
} }
if (! deletable_p if (!deletable_p
&& length && length
&& v->type->kind == TYPE_POINTER && v->type->kind == TYPE_POINTER
&& (v->type->u.p->kind == TYPE_POINTER && (v->type->u.p->kind == TYPE_POINTER
...@@ -3534,7 +3518,7 @@ write_roots (pair_p variables, bool emit_pch) ...@@ -3534,7 +3518,7 @@ write_roots (pair_p variables, bool emit_pch)
for (fli = flp; fli; fli = fli->next) for (fli = flp; fli; fli = fli->next)
if (fli->f == f) if (fli->f == f)
break; break;
if (! fli->started_p) if (!fli->started_p)
{ {
fli->started_p = 1; fli->started_p = 1;
...@@ -3568,7 +3552,7 @@ write_roots (pair_p variables, bool emit_pch) ...@@ -3568,7 +3552,7 @@ write_roots (pair_p variables, bool emit_pch)
for (fli = flp; fli; fli = fli->next) for (fli = flp; fli; fli = fli->next)
if (fli->f == f) if (fli->f == f)
break; break;
if (! fli->started_p) if (!fli->started_p)
{ {
fli->started_p = 1; fli->started_p = 1;
...@@ -3605,14 +3589,15 @@ write_roots (pair_p variables, bool emit_pch) ...@@ -3605,14 +3589,15 @@ write_roots (pair_p variables, bool emit_pch)
|| v->type->u.p->kind != TYPE_PARAM_STRUCT || v->type->u.p->kind != TYPE_PARAM_STRUCT
|| v->type->u.p->u.param_struct.stru != find_structure ("htab", 0)) || v->type->u.p->u.param_struct.stru != find_structure ("htab", 0))
{ {
error_at_line (&v->line, "if_marked option used but not hash table"); error_at_line (&v->line,
"if_marked option used but not hash table");
continue; continue;
} }
for (fli = flp; fli; fli = fli->next) for (fli = flp; fli; fli = fli->next)
if (fli->f == f) if (fli->f == f)
break; break;
if (! fli->started_p) if (!fli->started_p)
{ {
fli->started_p = 1; fli->started_p = 1;
...@@ -3645,13 +3630,13 @@ write_roots (pair_p variables, bool emit_pch) ...@@ -3645,13 +3630,13 @@ write_roots (pair_p variables, bool emit_pch)
else if (strcmp (o->name, "if_marked") == 0) else if (strcmp (o->name, "if_marked") == 0)
if_marked_p = 1; if_marked_p = 1;
if (! if_marked_p) if (!if_marked_p)
continue; continue;
for (fli = flp; fli; fli = fli->next) for (fli = flp; fli; fli = fli->next)
if (fli->f == f) if (fli->f == f)
break; break;
if (! fli->started_p) if (!fli->started_p)
{ {
fli->started_p = 1; fli->started_p = 1;
...@@ -3681,13 +3666,13 @@ write_roots (pair_p variables, bool emit_pch) ...@@ -3681,13 +3666,13 @@ write_roots (pair_p variables, bool emit_pch)
if (skip_p) if (skip_p)
continue; continue;
if (! contains_scalar_p (v->type)) if (!contains_scalar_p (v->type))
continue; continue;
for (fli = flp; fli; fli = fli->next) for (fli = flp; fli; fli = fli->next)
if (fli->f == f) if (fli->f == f)
break; break;
if (! fli->started_p) if (!fli->started_p)
{ {
fli->started_p = 1; fli->started_p = 1;
...@@ -3722,7 +3707,7 @@ note_def_vec (const char *type_name, bool is_scalar, struct fileloc *pos) ...@@ -3722,7 +3707,7 @@ note_def_vec (const char *type_name, bool is_scalar, struct fileloc *pos)
type_p t; type_p t;
options_p o; options_p o;
type_p len_ty = create_scalar_type ("unsigned"); type_p len_ty = create_scalar_type ("unsigned");
const char *name = concat ("VEC_", type_name, "_base", (char *)0); const char *name = concat ("VEC_", type_name, "_base", (char *) 0);
if (is_scalar) if (is_scalar)
{ {
...@@ -3747,14 +3732,14 @@ note_def_vec (const char *type_name, bool is_scalar, struct fileloc *pos) ...@@ -3747,14 +3732,14 @@ note_def_vec (const char *type_name, bool is_scalar, struct fileloc *pos)
we had expanded the macros in vec.h: we had expanded the macros in vec.h:
typedef struct VEC_<type>_<astrat> { typedef struct VEC_<type>_<astrat> {
VEC_<type>_base base; VEC_<type>_base base;
} VEC_<type>_<astrat>; } VEC_<type>_<astrat>;
*/ */
void void
note_def_vec_alloc (const char *type, const char *astrat, struct fileloc *pos) note_def_vec_alloc (const char *type, const char *astrat, struct fileloc *pos)
{ {
const char *astratname = concat ("VEC_", type, "_", astrat, (char *)0); const char *astratname = concat ("VEC_", type, "_", astrat, (char *) 0);
const char *basename = concat ("VEC_", type, "_base", (char *)0); const char *basename = concat ("VEC_", type, "_base", (char *) 0);
pair_p field = create_field_at (0, resolve_typedef (basename, pos), pair_p field = create_field_at (0, resolve_typedef (basename, pos),
"base", 0, pos); "base", 0, pos);
...@@ -3787,8 +3772,10 @@ variable_size_p (const type_p s) ...@@ -3787,8 +3772,10 @@ variable_size_p (const type_p s)
return false; return false;
} }
enum alloc_quantity { single, vector }; enum alloc_quantity
enum alloc_zone { any_zone, specific_zone }; { single, vector };
enum alloc_zone
{ any_zone, specific_zone };
/* Writes one typed allocator definition for type identifier TYPE_NAME with /* Writes one typed allocator definition for type identifier TYPE_NAME with
optional type specifier TYPE_SPECIFIER. The allocator name will contain optional type specifier TYPE_SPECIFIER. The allocator name will contain
...@@ -3798,15 +3785,15 @@ enum alloc_zone { any_zone, specific_zone }; ...@@ -3798,15 +3785,15 @@ enum alloc_zone { any_zone, specific_zone };
the allocator will be zone-specific. */ the allocator will be zone-specific. */
static void static void
write_typed_alloc_def (bool variable_size, const char * type_specifier, write_typed_alloc_def (bool variable_size, const char *type_specifier,
const char * type_name, const char * allocator_type, const char *type_name, const char *allocator_type,
enum alloc_quantity quantity, enum alloc_zone zone) enum alloc_quantity quantity, enum alloc_zone zone)
{ {
bool two_args = variable_size && (quantity == vector); bool two_args = variable_size && (quantity == vector);
bool third_arg = ((zone == specific_zone) bool third_arg = ((zone == specific_zone)
&& (variable_size || (quantity == vector))); && (variable_size || (quantity == vector)));
oprintf (header_file, "#define ggc_alloc_%s%s",allocator_type, type_name); oprintf (header_file, "#define ggc_alloc_%s%s", allocator_type, type_name);
oprintf (header_file, "(%s%s%s%s%s) ", oprintf (header_file, "(%s%s%s%s%s) ",
(variable_size ? "SIZE" : ""), (variable_size ? "SIZE" : ""),
(two_args ? ", " : ""), (two_args ? ", " : ""),
...@@ -3828,7 +3815,7 @@ write_typed_alloc_def (bool variable_size, const char * type_specifier, ...@@ -3828,7 +3815,7 @@ write_typed_alloc_def (bool variable_size, const char * type_specifier,
/* Writes a typed allocator definition for a struct or union S. */ /* Writes a typed allocator definition for a struct or union S. */
static void static void
write_typed_struct_alloc_def (const type_p s, const char * allocator_type, write_typed_struct_alloc_def (const type_p s, const char *allocator_type,
enum alloc_quantity quantity, enum alloc_quantity quantity,
enum alloc_zone zone) enum alloc_zone zone)
{ {
...@@ -3839,7 +3826,7 @@ write_typed_struct_alloc_def (const type_p s, const char * allocator_type, ...@@ -3839,7 +3826,7 @@ write_typed_struct_alloc_def (const type_p s, const char * allocator_type,
/* Writes a typed allocator definition for a typedef P. */ /* Writes a typed allocator definition for a typedef P. */
static void static void
write_typed_typedef_alloc_def (const pair_p p, const char * allocator_type, write_typed_typedef_alloc_def (const pair_p p, const char *allocator_type,
enum alloc_quantity quantity, enum alloc_quantity quantity,
enum alloc_zone zone) enum alloc_zone zone)
{ {
...@@ -3920,15 +3907,16 @@ output_typename (outf_p of, const_type_p t) ...@@ -3920,15 +3907,16 @@ output_typename (outf_p of, const_type_p t)
{ {
int i; int i;
for (i = 0; i < NUM_PARAM; i++) for (i = 0; i < NUM_PARAM; i++)
if (t->u.param_struct.param[i] != NULL) { if (t->u.param_struct.param[i] != NULL)
output_typename (of, t->u.param_struct.param[i]); {
oprintf (of, "_"); output_typename (of, t->u.param_struct.param[i]);
} oprintf (of, "_");
}
output_typename (of, t->u.param_struct.stru); output_typename (of, t->u.param_struct.stru);
break; break;
} }
default: default:
gcc_unreachable(); gcc_unreachable ();
} }
} }
...@@ -3938,7 +3926,7 @@ output_typename (outf_p of, const_type_p t) ...@@ -3938,7 +3926,7 @@ output_typename (outf_p of, const_type_p t)
static void static void
write_splay_tree_allocator_def (const_type_p s) write_splay_tree_allocator_def (const_type_p s)
{ {
outf_p of = get_output_file_for_structure(s, NULL); outf_p of = get_output_file_for_structure (s, NULL);
oprintf (of, "void * ggc_alloc_splay_tree_"); oprintf (of, "void * ggc_alloc_splay_tree_");
output_typename (of, s); output_typename (of, s);
oprintf (of, " (int sz, void * nl)\n"); oprintf (of, " (int sz, void * nl)\n");
...@@ -3983,15 +3971,32 @@ dump_typekind (int indent, enum typekind kind) ...@@ -3983,15 +3971,32 @@ dump_typekind (int indent, enum typekind kind)
printf ("%*ckind = ", indent, ' '); printf ("%*ckind = ", indent, ' ');
switch (kind) switch (kind)
{ {
case TYPE_SCALAR: printf ("TYPE_SCALAR"); break; case TYPE_SCALAR:
case TYPE_STRING: printf ("TYPE_STRING"); break; printf ("TYPE_SCALAR");
case TYPE_STRUCT: printf ("TYPE_STRUCT"); break; break;
case TYPE_UNION: printf ("TYPE_UNION"); break; case TYPE_STRING:
case TYPE_POINTER: printf ("TYPE_POINTER"); break; printf ("TYPE_STRING");
case TYPE_ARRAY: printf ("TYPE_ARRAY"); break; break;
case TYPE_LANG_STRUCT: printf ("TYPE_LANG_STRUCT"); break; case TYPE_STRUCT:
case TYPE_PARAM_STRUCT: printf ("TYPE_PARAM_STRUCT"); break; printf ("TYPE_STRUCT");
default: gcc_unreachable (); break;
case TYPE_UNION:
printf ("TYPE_UNION");
break;
case TYPE_POINTER:
printf ("TYPE_POINTER");
break;
case TYPE_ARRAY:
printf ("TYPE_ARRAY");
break;
case TYPE_LANG_STRUCT:
printf ("TYPE_LANG_STRUCT");
break;
case TYPE_PARAM_STRUCT:
printf ("TYPE_PARAM_STRUCT");
break;
default:
gcc_unreachable ();
} }
printf ("\n"); printf ("\n");
} }
...@@ -4004,11 +4009,20 @@ dump_gc_used (int indent, enum gc_used_enum gc_used) ...@@ -4004,11 +4009,20 @@ dump_gc_used (int indent, enum gc_used_enum gc_used)
printf ("%*cgc_used = ", indent, ' '); printf ("%*cgc_used = ", indent, ' ');
switch (gc_used) switch (gc_used)
{ {
case GC_UNUSED: printf ("GC_UNUSED"); break; case GC_UNUSED:
case GC_USED: printf ("GC_USED"); break; printf ("GC_UNUSED");
case GC_MAYBE_POINTED_TO: printf ("GC_MAYBE_POINTED_TO"); break; break;
case GC_POINTED_TO: printf ("GC_POINTED_TO"); break; case GC_USED:
default: gcc_unreachable (); printf ("GC_USED");
break;
case GC_MAYBE_POINTED_TO:
printf ("GC_MAYBE_POINTED_TO");
break;
case GC_POINTED_TO:
printf ("GC_POINTED_TO");
break;
default:
gcc_unreachable ();
} }
printf ("\n"); printf ("\n");
} }
...@@ -4023,8 +4037,8 @@ dump_options (int indent, options_p opt) ...@@ -4023,8 +4037,8 @@ dump_options (int indent, options_p opt)
o = opt; o = opt;
while (o) while (o)
{ {
printf ("%s:%s ", o->name, o->info); printf ("%s:%s ", o->name, o->info);
o = o->next; o = o->next;
} }
printf ("\n"); printf ("\n");
} }
...@@ -4054,8 +4068,8 @@ dump_type_u_s (int indent, type_p t) ...@@ -4054,8 +4068,8 @@ dump_type_u_s (int indent, type_p t)
fields = t->u.s.fields; fields = t->u.s.fields;
while (fields) while (fields)
{ {
dump_pair (indent + INDENT, fields); dump_pair (indent + INDENT, fields);
fields = fields->next; fields = fields->next;
} }
printf ("%*cend of fields of type %p\n", indent, ' ', (void *) t); printf ("%*cend of fields of type %p\n", indent, ' ', (void *) t);
dump_options (indent, t->u.s.opt); dump_options (indent, t->u.s.opt);
...@@ -4118,7 +4132,7 @@ dump_type (int indent, type_p t) ...@@ -4118,7 +4132,7 @@ dump_type (int indent, type_p t)
{ {
PTR *slot; PTR *slot;
printf ("%*cType at %p: ", indent, ' ', (void *)t); printf ("%*cType at %p: ", indent, ' ', (void *) t);
slot = htab_find_slot (seen_types, t, INSERT); slot = htab_find_slot (seen_types, t, INSERT);
if (*slot != NULL) if (*slot != NULL)
{ {
...@@ -4130,7 +4144,7 @@ dump_type (int indent, type_p t) ...@@ -4130,7 +4144,7 @@ dump_type (int indent, type_p t)
dump_typekind (indent, t->kind); dump_typekind (indent, t->kind);
printf ("%*cpointer_to = %p\n", indent + INDENT, ' ', printf ("%*cpointer_to = %p\n", indent + INDENT, ' ',
(void *)t->pointer_to); (void *) t->pointer_to);
dump_gc_used (indent + INDENT, t->gc_used); dump_gc_used (indent + INDENT, t->gc_used);
switch (t->kind) switch (t->kind)
{ {
...@@ -4158,7 +4172,7 @@ dump_type (int indent, type_p t) ...@@ -4158,7 +4172,7 @@ dump_type (int indent, type_p t)
default: default:
gcc_unreachable (); gcc_unreachable ();
} }
printf ("%*cEnd of type at %p\n", indent, ' ', (void *)t); printf ("%*cEnd of type at %p\n", indent, ' ', (void *) t);
} }
/* Dumps the pair P. */ /* Dumps the pair P. */
...@@ -4176,7 +4190,7 @@ dump_pair (int indent, pair_p p) ...@@ -4176,7 +4190,7 @@ dump_pair (int indent, pair_p p)
/* Dumps the list of pairs PP. */ /* Dumps the list of pairs PP. */
static void static void
dump_pair_list (const char * name, pair_p pp) dump_pair_list (const char *name, pair_p pp)
{ {
pair_p p; pair_p p;
printf ("%s:\n", name); printf ("%s:\n", name);
...@@ -4188,7 +4202,7 @@ dump_pair_list (const char * name, pair_p pp) ...@@ -4188,7 +4202,7 @@ dump_pair_list (const char * name, pair_p pp)
/* Dumps the STRUCTURES. */ /* Dumps the STRUCTURES. */
static void static void
dump_structures (const char * name, type_p structures) dump_structures (const char *name, type_p structures)
{ {
printf ("%s:\n", name); printf ("%s:\n", name);
dump_type_list (0, structures); dump_type_list (0, structures);
...@@ -4207,17 +4221,17 @@ dump_everything (void) ...@@ -4207,17 +4221,17 @@ dump_everything (void)
dump_pair_list ("variables", variables); dump_pair_list ("variables", variables);
htab_delete (seen_types); htab_delete (seen_types);
} }
int int
main (int argc, char **argv) main (int argc, char **argv)
{ {
size_t i; size_t i;
static struct fileloc pos = { this_file, 0 }; static struct fileloc pos = { this_file, 0 };
char* inputlist = 0; char *inputlist = 0;
int do_dump = 0; int do_dump = 0;
outf_p output_header; outf_p output_header;
char* plugin_output_filename = NULL; char *plugin_output_filename = NULL;
/* fatal uses this */ /* fatal uses this */
progname = "gengtype"; progname = "gengtype";
...@@ -4237,14 +4251,14 @@ main (int argc, char **argv) ...@@ -4237,14 +4251,14 @@ main (int argc, char **argv)
nb_plugin_files = argc - 5; nb_plugin_files = argc - 5;
plugin_files = XCNEWVEC (char *, nb_plugin_files); plugin_files = XCNEWVEC (char *, nb_plugin_files);
for (i = 0; i < nb_plugin_files; i++) for (i = 0; i < nb_plugin_files; i++)
{ {
/* Place an all zero lang_bitmap before the plugin file /* Place an all zero lang_bitmap before the plugin file
name. */ name. */
char *name = argv[i + 5]; char *name = argv[i + 5];
int len = strlen(name) + 1 + sizeof (lang_bitmap); int len = strlen (name) + 1 + sizeof (lang_bitmap);
plugin_files[i] = XCNEWVEC (char, len) + sizeof (lang_bitmap); plugin_files[i] = XCNEWVEC (char, len) + sizeof (lang_bitmap);
strcpy (plugin_files[i], name); strcpy (plugin_files[i], name);
} }
} }
else if (argc == 3) else if (argc == 3)
{ {
...@@ -4253,7 +4267,7 @@ main (int argc, char **argv) ...@@ -4253,7 +4267,7 @@ main (int argc, char **argv)
} }
else else
fatal ("usage: gengtype [-d] [-P pluginout.h] srcdir input-list " fatal ("usage: gengtype [-d] [-P pluginout.h] srcdir input-list "
"[file1 file2 ... fileN]"); "[file1 file2 ... fileN]");
srcdir_len = strlen (srcdir); srcdir_len = strlen (srcdir);
...@@ -4268,15 +4282,24 @@ main (int argc, char **argv) ...@@ -4268,15 +4282,24 @@ main (int argc, char **argv)
/* These types are set up with #define or else outside of where /* These types are set up with #define or else outside of where
we can see them. */ we can see them. */
pos.line = __LINE__ + 1; pos.line = __LINE__ + 1;
do_scalar_typedef ("CUMULATIVE_ARGS", &pos); pos.line++; do_scalar_typedef ("CUMULATIVE_ARGS", &pos);
do_scalar_typedef ("REAL_VALUE_TYPE", &pos); pos.line++; pos.line++;
do_scalar_typedef ("FIXED_VALUE_TYPE", &pos); pos.line++; do_scalar_typedef ("REAL_VALUE_TYPE", &pos);
do_scalar_typedef ("double_int", &pos); pos.line++; pos.line++;
do_scalar_typedef ("uint64_t", &pos); pos.line++; do_scalar_typedef ("FIXED_VALUE_TYPE", &pos);
do_scalar_typedef ("uint8", &pos); pos.line++; pos.line++;
do_scalar_typedef ("jword", &pos); pos.line++; do_scalar_typedef ("double_int", &pos);
do_scalar_typedef ("JCF_u2", &pos); pos.line++; pos.line++;
do_scalar_typedef ("void", &pos); pos.line++; do_scalar_typedef ("uint64_t", &pos);
pos.line++;
do_scalar_typedef ("uint8", &pos);
pos.line++;
do_scalar_typedef ("jword", &pos);
pos.line++;
do_scalar_typedef ("JCF_u2", &pos);
pos.line++;
do_scalar_typedef ("void", &pos);
pos.line++;
do_typedef ("PTR", create_pointer (resolve_typedef ("void", &pos)), &pos); do_typedef ("PTR", create_pointer (resolve_typedef ("void", &pos)), &pos);
for (i = 0; i < num_gt_files; i++) for (i = 0; i < num_gt_files; i++)
...@@ -4306,11 +4329,11 @@ main (int argc, char **argv) ...@@ -4306,11 +4329,11 @@ main (int argc, char **argv)
dump_everything (); dump_everything ();
if (plugin_files) if (plugin_files)
{ {
for (i = 0; i < nb_plugin_files; i++) for (i = 0; i < nb_plugin_files; i++)
free (plugin_files[i] - sizeof (lang_bitmap)); free (plugin_files[i] - sizeof (lang_bitmap));
free (plugin_files); free (plugin_files);
} }
if (hit_error) if (hit_error)
return 1; return 1;
......
/* Process source files and output type information. /* Process source files and output type information.
Copyright (C) 2002, 2003, 2004, 2007, 2008 Free Software Foundation, Inc. Copyright (C) 2002, 2003, 2004, 2007, 2008 Free Software Foundation, Inc.
This file is part of GCC. This file is part of GCC.
GCC is free software; you can redistribute it and/or modify it under 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 the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later Software Foundation; either version 3, or (at your option) any later
version. version.
GCC is distributed in the hope that it will be useful, but WITHOUT ANY GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details. for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3. If not see along with GCC; see the file COPYING3. If not see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#ifndef GCC_GENGTYPE_H #ifndef GCC_GENGTYPE_H
#define GCC_GENGTYPE_H #define GCC_GENGTYPE_H
/* A file position, mostly for error messages. /* A file position, mostly for error messages.
The FILE element may be compared using pointer equality. */ The FILE element may be compared using pointer equality. */
struct fileloc { struct fileloc
{
const char *file; const char *file;
int line; int line;
}; };
...@@ -39,10 +40,12 @@ extern struct fileloc lexer_line; ...@@ -39,10 +40,12 @@ extern struct fileloc lexer_line;
/* Print an error message. */ /* Print an error message. */
extern void error_at_line extern void error_at_line
(const struct fileloc *pos, const char *msg, ...) ATTRIBUTE_PRINTF_2; (const struct fileloc *pos, const char *msg, ...) ATTRIBUTE_PRINTF_2;
/* Like asprintf, but calls fatal() on out of memory. */ /* Like asprintf, but calls fatal() on out of memory. */
extern char *xasprintf(const char *, ...) ATTRIBUTE_PRINTF_1; extern char *
xasprintf (const char *, ...)
ATTRIBUTE_PRINTF_1;
/* Constructor routines for types. */ /* Constructor routines for types. */
extern void do_typedef (const char *s, type_p t, struct fileloc *pos); extern void do_typedef (const char *s, type_p t, struct fileloc *pos);
...@@ -55,11 +58,14 @@ extern type_p find_structure (const char *s, int isunion); ...@@ -55,11 +58,14 @@ extern type_p find_structure (const char *s, int isunion);
extern type_p create_scalar_type (const char *name); extern type_p create_scalar_type (const char *name);
extern type_p create_pointer (type_p t); extern type_p create_pointer (type_p t);
extern type_p create_array (type_p t, const char *len); extern type_p create_array (type_p t, const char *len);
extern options_p create_option (options_p, const char *name, const void *info); extern options_p create_option (options_p, const char *name,
const void *info);
extern options_p create_nested_ptr_option (options_p, type_p t, extern options_p create_nested_ptr_option (options_p, type_p t,
const char *from, const char *to); const char *from,
extern pair_p create_field_at (pair_p next, type_p type, const char *name, const char *to);
options_p opt, struct fileloc *pos); extern pair_p create_field_at (pair_p next, type_p type,
const char *name, options_p opt,
struct fileloc *pos);
extern pair_p nreverse_pairs (pair_p list); extern pair_p nreverse_pairs (pair_p list);
extern type_p adjust_field_type (type_p, options_p); extern type_p adjust_field_type (type_p, options_p);
extern void note_variable (const char *s, type_p t, options_p o, extern void note_variable (const char *s, type_p t, options_p o,
...@@ -77,37 +83,38 @@ extern void parse_file (const char *name); ...@@ -77,37 +83,38 @@ extern void parse_file (const char *name);
extern bool hit_error; extern bool hit_error;
/* Token codes. */ /* Token codes. */
enum { enum
EOF_TOKEN = 0, {
EOF_TOKEN = 0,
/* Per standard convention, codes in the range (0, UCHAR_MAX]
represent single characters with those character codes. */ /* Per standard convention, codes in the range (0, UCHAR_MAX]
represent single characters with those character codes. */
CHAR_TOKEN_OFFSET = UCHAR_MAX + 1,
GTY_TOKEN = CHAR_TOKEN_OFFSET, CHAR_TOKEN_OFFSET = UCHAR_MAX + 1,
TYPEDEF, GTY_TOKEN = CHAR_TOKEN_OFFSET,
EXTERN, TYPEDEF,
STATIC, EXTERN,
UNION, STATIC,
STRUCT, UNION,
ENUM, STRUCT,
VEC_TOKEN, ENUM,
DEFVEC_OP, VEC_TOKEN,
DEFVEC_I, DEFVEC_OP,
DEFVEC_ALLOC, DEFVEC_I,
ELLIPSIS, DEFVEC_ALLOC,
PTR_ALIAS, ELLIPSIS,
NESTED_PTR, PTR_ALIAS,
PARAM_IS, NESTED_PTR,
NUM, PARAM_IS,
SCALAR, NUM,
ID, SCALAR,
STRING, ID,
CHAR, STRING,
ARRAY, CHAR,
ARRAY,
/* print_token assumes that any token >= FIRST_TOKEN_WITH_VALUE may have
a meaningful value to be printed. */ /* print_token assumes that any token >= FIRST_TOKEN_WITH_VALUE may have
FIRST_TOKEN_WITH_VALUE = PARAM_IS a meaningful value to be printed. */
}; FIRST_TOKEN_WITH_VALUE = PARAM_IS
};
#endif #endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment