gentype-state.c: Add new file.

2010-11-25  Basile Starynkevitch  <basile@starynkevitch.net>
	    Jeremie Salvucci  <jeremie.salvucci@free.fr>

	* gentype-state.c: Add new file.

	* gengtype.c (type count): New variable.
	(new_structure, find_param_structure, create_pointer)
	(create_array): Use it to set state_number in types.
	(dump_everything): Improve comment.
	(main): Call read_state and write_state. Print type_count.

	* gengtype.h (type_lineloc): New function.
	(read_state, write_state): New declarations.

	* Makefile.in (GENGTYPE_FLAGS): New variable.
	(s-gtype): Run gengtype twice and generate gtype.state.
	(build/gengtype-state.o): New rule.
	(build/gengtype$(build_exeext)): Link gengtype-state.o.
	(mostlyclean): Update comment.  Remove gtype.state.


Co-Authored-By: Jeremie Salvucci <jeremie.salvucci@free.fr>

From-SVN: r167150
This commit is contained in:
Basile Starynkevitch 2010-11-25 19:03:27 +00:00 committed by Basile Starynkevitch
parent f759884521
commit 92724e1d70
5 changed files with 2533 additions and 11 deletions

View file

@ -1,3 +1,23 @@
2010-11-25 Basile Starynkevitch <basile@starynkevitch.net>
Jeremie Salvucci <jeremie.salvucci@free.fr>
* gentype-state.c: Add new file.
* gengtype.c (type count): New variable.
(new_structure, find_param_structure, create_pointer)
(create_array): Use it to set state_number in types.
(dump_everything): Improve comment.
(main): Call read_state and write_state. Print type_count.
* gengtype.h (type_lineloc): New function.
(read_state, write_state): New declarations.
* Makefile.in (GENGTYPE_FLAGS): New variable.
(s-gtype): Run gengtype twice and generate gtype.state.
(build/gengtype-state.o): New rule.
(build/gengtype$(build_exeext)): Link gengtype-state.o.
(mostlyclean): Update comment. Remove gtype.state.
2010-11-25 Jakub Jelinek <jakub@redhat.com>
PR middle-end/46637

View file

@ -3819,6 +3819,9 @@ ALL_GTFILES_H := $(sort $(GTFILES_H) $(GTFILES_LANG_H))
$(ALL_GTFILES_H) gtype-desc.c gtype-desc.h : s-gtype ; @true
### Common flags to gengtype [e.g. -v or -B backupdir]
GENGTYPE_FLAGS=
gtyp-input.list: s-gtyp-input ; @true
s-gtyp-input: Makefile
@: $(call write_entries_to_file,$(GTFILES),tmp-gi.list)
@ -3827,7 +3830,13 @@ s-gtyp-input: Makefile
s-gtype: build/gengtype$(build_exeext) $(filter-out [%], $(GTFILES)) \
gtyp-input.list
$(RUN_GEN) build/gengtype$(build_exeext) -S $(srcdir) -I gtyp-input.list
# First, parse all files and save a state file.
$(RUN_GEN) build/gengtype$(build_exeext) $(GENGTYPE_FLAGS) \
-S $(srcdir) -I gtyp-input.list -w gtype.state
# Second, read the state file and generate all files. This ensure that
# gtype.state is correctly read:
$(RUN_GEN) build/gengtype$(build_exeext) $(GENGTYPE_FLAGS) \
-r gtype.state
$(STAMP) s-gtype
generated_files = config.h tm.h $(TM_P_H) $(TM_H) multilib.h \
@ -3923,6 +3932,8 @@ build/gengenrtl.o : gengenrtl.c $(BCONFIG_H) $(SYSTEM_H) rtl.def
build/gengtype-lex.o : gengtype-lex.c gengtype.h $(BCONFIG_H) $(SYSTEM_H)
build/gengtype-parse.o : gengtype-parse.c gengtype.h $(BCONFIG_H) \
$(SYSTEM_H)
build/gengtype-state.o: gengtype-state.c gengtype.h $(BCONFIG_H) \
$(SYSTEM_H) errors.h
build/gengtype.o : gengtype.c $(BCONFIG_H) $(SYSTEM_H) gengtype.h \
rtl.def insn-notes.def errors.h double-int.h $(HASHTAB_H) \
$(OBSTACK_H) $(XREGEX_H)
@ -3968,7 +3979,7 @@ build/genautomata$(build_exeext) : BUILD_LIBS += -lm
# These programs are not linked with the MD reader.
build/gengtype$(build_exeext) : build/gengtype-lex.o build/gengtype-parse.o \
build/version.o
build/gengtype-state.o build/version.o
# Rule for the generator programs:
$(genprog:%=build/gen%$(build_exeext)): build/gen%$(build_exeext): build/gen%.o $(BUILD_LIBDEPS)
@ -4441,9 +4452,10 @@ mostlyclean: lang.mostlyclean
-rm -f core */core
# Delete file generated for gengtype
-rm -f gtyp-input.list
# Delete files generated by gengtype.c
# Delete files generated by gengtype
-rm -f gtype-*
-rm -f gt-*
-rm -f gtype.state
# Delete genchecksum outputs
-rm -f *-checksum.c

2439
gcc/gengtype-state.c Normal file

File diff suppressed because it is too large Load diff

View file

@ -67,6 +67,10 @@ int do_debug;
/* Level for verbose messages. */
int verbosity_level;
/* We have a type count and use it to set the state_number of newly
allocated types to some unique negative number. */
static int type_count;
/* The backup directory should be in the same file system as the
generated files, otherwise the rename(2) system call would fail.
If NULL, no backup is made when overwriting a generated file. */
@ -563,12 +567,14 @@ new_structure (const char *name, int isunion, struct fileloc *pos,
else if (si->u.s.line.file != NULL && si->u.s.bitmap != bitmap)
{
ls = si;
type_count++;
si = XCNEW (struct type);
memcpy (si, ls, sizeof (struct type));
ls->kind = TYPE_LANG_STRUCT;
ls->u.s.lang_struct = si;
ls->u.s.fields = NULL;
si->next = NULL;
si->state_number = -type_count;
si->pointer_to = NULL;
si->u.s.lang_struct = ls;
}
@ -577,7 +583,9 @@ new_structure (const char *name, int isunion, struct fileloc *pos,
if (ls != NULL && s == NULL)
{
type_count++;
s = XCNEW (struct type);
s->state_number = -type_count;
s->next = ls->u.s.lang_struct;
ls->u.s.lang_struct = s;
s->u.s.lang_struct = ls;
@ -587,7 +595,9 @@ new_structure (const char *name, int isunion, struct fileloc *pos,
if (s == NULL)
{
type_count++;
s = XCNEW (struct type);
s->state_number = -type_count;
s->next = structures;
structures = s;
}
@ -625,8 +635,10 @@ find_structure (const char *name, int isunion)
if (strcmp (name, s->u.s.tag) == 0 && UNION_P (s) == isunion)
return s;
type_count++;
s = XCNEW (struct type);
s->next = structures;
s->state_number = -type_count;
structures = s;
s->kind = isunion ? TYPE_UNION : TYPE_STRUCT;
s->u.s.tag = name;
@ -650,9 +662,11 @@ find_param_structure (type_p t, type_p param[NUM_PARAM])
break;
if (res == NULL)
{
type_count++;
res = XCNEW (struct type);
res->kind = TYPE_PARAM_STRUCT;
res->next = param_structs;
res->state_number = -type_count;
param_structs = res;
res->u.param_struct.stru = t;
memcpy (res->u.param_struct.param, param, sizeof (type_p) * NUM_PARAM);
@ -679,6 +693,8 @@ create_pointer (type_p t)
if (!t->pointer_to)
{
type_p r = XCNEW (struct type);
type_count++;
r->state_number = -type_count;
r->kind = TYPE_POINTER;
r->u.p = t;
t->pointer_to = r;
@ -693,8 +709,10 @@ create_array (type_p t, const char *len)
{
type_p v;
type_count++;
v = XCNEW (struct type);
v->kind = TYPE_ARRAY;
v->state_number = -type_count;
v->u.a.p = t;
v->u.a.len = len;
return v;
@ -4600,7 +4618,9 @@ dump_structures (const char *name, type_p structures)
printf ("End of %s\n\n", name);
}
/* Dumps the internal structures of gengtype. */
/* Dumps the internal structures of gengtype. This is useful to debug
gengtype itself, or to understand what it does, e.g. for plugin
developers. */
static void
dump_everything (void)
@ -4836,8 +4856,12 @@ main (int argc, char **argv)
DBGPRINTF ("inputlist %s", inputlist);
if (read_state_filename)
{
fatal ("read state %s not implemented yet", read_state_filename);
/* TODO: implement read state. */
if (inputlist)
fatal ("input list %s cannot be given with a read state file %s",
inputlist, read_state_filename);
read_state (read_state_filename);
DBGPRINT_COUNT_TYPE ("structures after read_state", structures);
DBGPRINT_COUNT_TYPE ("param_structs after read_state", param_structs);
}
else if (inputlist)
{
@ -4867,7 +4891,8 @@ main (int argc, char **argv)
(int) i, get_input_file_name (gt_files[i]));
}
if (verbosity_level >= 1)
printf ("%s parsed %d files\n", progname, (int) num_gt_files);
printf ("%s parsed %d files with %d GTY types\n",
progname, (int) num_gt_files, type_count);
DBGPRINT_COUNT_TYPE ("structures after parsing", structures);
DBGPRINT_COUNT_TYPE ("param_structs after parsing", param_structs);
@ -4892,7 +4917,7 @@ main (int argc, char **argv)
fatal ("No plugin files given in plugin mode for %s",
plugin_output_filename);
/* Parse our plugin files. */
/* Parse our plugin files and augment the state. */
for (ix = 0; ix < nb_plugin_files; ix++)
parse_file (get_input_file_name (plugin_files[ix]));
@ -4917,11 +4942,30 @@ main (int argc, char **argv)
hence enlarge the param_structs list of types. */
set_gc_used (variables);
/* We should write the state here, but it is not yet implemented. */
/* The state at this point is read from the state input file or by
parsing source files and optionally augmented by parsing plugin
source files. Write it now. */
if (write_state_filename)
{
fatal ("write state %s in not yet implemented", write_state_filename);
/* TODO: implement write state. */
DBGPRINT_COUNT_TYPE ("structures before write_state", structures);
DBGPRINT_COUNT_TYPE ("param_structs before write_state", param_structs);
if (hit_error)
fatal ("didn't write state file %s after errors",
write_state_filename);
DBGPRINTF ("before write_state %s", write_state_filename);
write_state (write_state_filename);
if (do_dump)
dump_everything ();
/* After having written the state file we return immediately to
avoid generating any output file. */
if (hit_error)
return 1;
else
return 0;
}

View file

@ -374,6 +374,13 @@ extern size_t srcdir_len;
extern const char *read_state_filename; /* (-r) program argument. */
extern const char *write_state_filename; /* (-w) program argument. */
/* Functions reading and writing the entire gengtype state, called from
main, and implemented in file gengtype-state.c. */
void read_state (const char* path);
/* Write the state, and update the state_number field in types. */
void write_state (const char* path);
/* Print an error message. */
extern void error_at_line
(const struct fileloc *pos, const char *msg, ...) ATTRIBUTE_PRINTF_2;