diff options
author | Geoffrey Keating <geoffk@apple.com> | 2004-06-09 20:10:13 +0000 |
---|---|---|
committer | Geoffrey Keating <geoffk@gcc.gnu.org> | 2004-06-09 20:10:13 +0000 |
commit | d8044160b7047642e312fb5f713fe0db46171dd8 (patch) | |
tree | 1238be7fc80d74d8323d5f6c4344a6bb2be0f854 /gcc/gengtype.c | |
parent | 293155b099b94b81fa0147f2719f3da23c859f7e (diff) | |
download | gcc-d8044160b7047642e312fb5f713fe0db46171dd8.zip gcc-d8044160b7047642e312fb5f713fe0db46171dd8.tar.gz gcc-d8044160b7047642e312fb5f713fe0db46171dd8.tar.bz2 |
Index: gcc/ChangeLog
2004-06-09 Geoffrey Keating <geoffk@apple.com>
* Makefile.in (CPPLIB_H): Put files in order of inclusion.
(CPP_ID_DATA_H): New.
(gtype-desc.o): Update dependencies.
(GTFILES): Use CPP_ID_DATA_H.
Index: gcc/testsuite/ChangeLog
2004-06-09 Geoffrey Keating <geoffk@apple.com>
* gcc.dg/pch/macro-4.c: New.
* gcc.dg/pch/macro-4.hs: New.
Index: libcpp/ChangeLog
2004-06-09 Geoffrey Keating <geoffk@apple.com>
* traditional.c (push_replacement_text): Set macro->traditional.
(save_replacement_text): Likewise.
* pch.c (cpp_write_pch_state): Don't write list of defined macros.
(struct save_macro_item): Delete.
(struct save_macro_data): Use a character array not the previous
structured format.
(save_macros): Save macro as text not as internal structures.
(cpp_prepare_state): Update for changes to save_macro_data.
(cpp_read_state): Don't read macros defined in PCH. Restore
-D macros as text.
* macro.c (create_iso_definition): Honour alloc_subobject.
Clear traditional flag.
(_cpp_create_definition): Honour alloc_subobject.
* lex.c (cpp_token_val_index): New.
* internal.h: Include cpp-id-data.h.
(uchar): Move definition to cpp-id-data.h.
(U): Likewise.
(cpp_macro): Likewise.
* directives.c (struct answer): Move to cpp-id-data.h.
(do_assert): Honour alloc_subobject.
Index: libcpp/include/ChangeLog
2004-06-09 Geoffrey Keating <geoffk@apple.com>
* symtab.h (struct ht): Add field 'alloc_subobject'.
* cpplib.h (struct cpp_string): Add GTY marker.
(enum cpp_token_fld_kind): New.
(struct cpp_token): Add GTY markers.
(cpp_token_val_index): Prototype.
(CPP_HASHNODE_VALUE_IDX): New.
(struct cpp_hashnode): Don't skip fields of 'value' when marking.
* cpp-id-data.h: New file.
From-SVN: r82851
Diffstat (limited to 'gcc/gengtype.c')
-rw-r--r-- | gcc/gengtype.c | 53 |
1 files changed, 35 insertions, 18 deletions
diff --git a/gcc/gengtype.c b/gcc/gengtype.c index 804ef70..5d70824 100644 --- a/gcc/gengtype.c +++ b/gcc/gengtype.c @@ -875,7 +875,7 @@ note_yacc_type (options_p o, pair_p fields, pair_p typeinfo, } static void process_gc_options (options_p, enum gc_used_enum, - int *, int *, int *); + int *, int *, int *, type_p *); static void set_gc_used_type (type_p, enum gc_used_enum, type_p *); static void set_gc_used (pair_p); @@ -883,7 +883,7 @@ static void set_gc_used (pair_p); static void process_gc_options (options_p opt, enum gc_used_enum level, int *maybe_undef, - int *pass_param, int *length) + int *pass_param, int *length, type_p *nested_ptr) { options_p o; for (o = opt; o; o = o->next) @@ -895,6 +895,8 @@ process_gc_options (options_p opt, enum gc_used_enum level, int *maybe_undef, *pass_param = 1; else if (strcmp (o->name, "length") == 0) *length = 1; + else if (strcmp (o->name, "nested_ptr") == 0) + *nested_ptr = ((const struct nested_ptr_data *) o->info)->type; } /* Set the gc_used field of T to LEVEL, and handle the types it references. */ @@ -914,18 +916,24 @@ set_gc_used_type (type_p t, enum gc_used_enum level, type_p param[NUM_PARAM]) { pair_p f; int dummy; + type_p dummy2; - process_gc_options (t->u.s.opt, level, &dummy, &dummy, &dummy); + process_gc_options (t->u.s.opt, level, &dummy, &dummy, &dummy, + &dummy2); for (f = t->u.s.fields; f; f = f->next) { int maybe_undef = 0; int pass_param = 0; int length = 0; + type_p nested_ptr = NULL; process_gc_options (f->opt, level, &maybe_undef, &pass_param, - &length); + &length, &nested_ptr); - if (length && f->type->kind == TYPE_POINTER) + if (nested_ptr && f->type->kind == TYPE_POINTER) + set_gc_used_type (nested_ptr, GC_POINTED_TO, + pass_param ? param : NULL); + else if (length && f->type->kind == TYPE_POINTER) set_gc_used_type (f->type->u.p, GC_USED, NULL); else if (maybe_undef && f->type->kind == TYPE_POINTER) set_gc_used_type (f->type->u.p, GC_MAYBE_POINTED_TO, NULL); @@ -1015,7 +1023,7 @@ static outf_p create_file (const char *name, const char *oname) { static const char *const hdr[] = { - " Copyright (C) 2003 Free Software Foundation, Inc.\n", + " Copyright (C) 2004 Free Software Foundation, Inc.\n", "\n", "This file is part of GCC.\n", "\n", @@ -1101,6 +1109,7 @@ open_base_files (void) "basic-block.h", "cselib.h", "insn-addr.h", "optabs.h", "libfuncs.h", "debug.h", "ggc.h", "cgraph.h", "tree-alias-type.h", "tree-flow.h", "reload.h", + "cpp-id-data.h", NULL }; const char *const *ifp; @@ -1408,7 +1417,8 @@ struct walk_type_data int used_length; type_p orig_s; const char *reorder_fn; - int needs_cast_p; + bool needs_cast_p; + bool fn_wants_lvalue; }; /* Print a mangled name representing T to OF. */ @@ -1511,7 +1521,7 @@ walk_type (type_p t, struct walk_type_data *d) options_p oo; const struct nested_ptr_data *nested_ptr_d = NULL; - d->needs_cast_p = 0; + d->needs_cast_p = false; for (oo = d->opt; oo; oo = oo->next) if (strcmp (oo->name, "length") == 0) length = (const char *)oo->info; @@ -1525,7 +1535,7 @@ walk_type (type_p t, struct walk_type_data *d) else if (strcmp (oo->name, "desc") == 0) desc = (const char *)oo->info; else if (strcmp (oo->name, "nested_ptr") == 0) - nested_ptr_d = (const struct nested_ptr_data *)oo->info ; + nested_ptr_d = (const struct nested_ptr_data *) oo->info; else if (strcmp (oo->name, "dot") == 0) ; else if (strcmp (oo->name, "tag") == 0) @@ -1643,10 +1653,12 @@ walk_type (type_p t, struct walk_type_data *d) oprintf (d->of, "%*s{\n", d->indent, ""); d->indent += 2; d->val = xasprintf ("x%d", d->counter++); - oprintf (d->of, "%*s%s %s * %s =\n", d->indent, "", + oprintf (d->of, "%*s%s %s * %s%s =\n", d->indent, "", (nested_ptr_d->type->kind == TYPE_UNION ? "union" : "struct"), - nested_ptr_d->type->u.s.tag, d->val); + nested_ptr_d->type->u.s.tag, + d->fn_wants_lvalue ? "" : "const ", + d->val); oprintf (d->of, "%*s", d->indent + 2, ""); output_escaped_param (d, nested_ptr_d->convert_from, "nested_ptr"); @@ -1654,12 +1666,15 @@ walk_type (type_p t, struct walk_type_data *d) d->process_field (nested_ptr_d->type, d); - oprintf (d->of, "%*s%s = ", d->indent, "", - d->prev_val[2]); - d->prev_val[2] = d->val; - output_escaped_param (d, nested_ptr_d->convert_to, - "nested_ptr"); - oprintf (d->of, ";\n"); + if (d->fn_wants_lvalue) + { + oprintf (d->of, "%*s%s = ", d->indent, "", + d->prev_val[2]); + d->prev_val[2] = d->val; + output_escaped_param (d, nested_ptr_d->convert_to, + "nested_ptr"); + oprintf (d->of, ";\n"); + } d->indent -= 2; oprintf (d->of, "%*s}\n", d->indent, ""); @@ -1839,6 +1854,7 @@ walk_type (type_p t, struct walk_type_data *d) d->line = &f->line; d->val = newval = xasprintf ("%s%s%s", oldval, dot, f->name); d->opt = f->opt; + d->used_length = false; if (union_p && use_param_p && d->param == NULL) oprintf (d->of, "%*sabort();\n", d->indent, ""); @@ -2231,7 +2247,7 @@ write_types_local_process_field (type_p f, const struct walk_type_data *d) /* For S, a structure that's part of ORIG_S, and using parameters PARAM, write out a routine that: - Is of type gt_note_pointers - - If calls PROCESS_FIELD on each field of S or its substructures. + - Calls PROCESS_FIELD on each field of S or its substructures. */ static void @@ -2259,6 +2275,7 @@ write_local_func_for_structure (type_p orig_s, type_p s, type_p *param) d.prev_val[1] = "not valid postage"; /* Guarantee an error. */ d.prev_val[3] = "x"; d.val = "(*x)"; + d.fn_wants_lvalue = true; oprintf (d.of, "\n"); oprintf (d.of, "void\n"); |