diff options
author | Zack Weinberg <zackw@panix.com> | 2007-03-26 21:07:27 +0000 |
---|---|---|
committer | Zack Weinberg <zack@gcc.gnu.org> | 2007-03-26 21:07:27 +0000 |
commit | 11a675992afb01354e8d8331087177c25e97a7a6 (patch) | |
tree | 194b565efb539d208f63cc21e757c0f303b1a775 /gcc | |
parent | 065ae6117579cc9a089c238207b42f5a1470423a (diff) | |
download | gcc-11a675992afb01354e8d8331087177c25e97a7a6.zip gcc-11a675992afb01354e8d8331087177c25e97a7a6.tar.gz gcc-11a675992afb01354e8d8331087177c25e97a7a6.tar.bz2 |
gengtype.c: Don't include gtyp-gen.h.
* gengtype.c: Don't include gtyp-gen.h.
(srcdir): Declare here.
(base_files, lang_dir_names): Allocate dynamically.
(gt_files, num_gt_files, num_lang_dirs): New globals.
(measure_input_list, read_input_line, read_input_list)
(set_lang_bitmap): New functions.
(get_base_file_bitmap): Rename get_lang_bitmap and drastically
simplify, relying on read_input_list to set up the bitmaps.
(main): Arguments are no longer unused. Check for correct number
of command line arguments, set srcdir and srcdir_len, then call
read_input_list, before doing anything else. No need to worry
about duplicates in main loop.
* configure.ac: Simplify the calculation of all_gtfiles.
Put language tags in there. Don't set or substitute
all_gtfiles_files_langs or all_gtfiles_files_frags.
* Makefile.in: Revamp the way gengtype is invoked, now that it
takes a file on its command line with a much simpler format.
Remove or replace with gtyp-input.list all references to gtyp-gen.h.
(GTFILES): Remove duplicates and C source files.
* c-config-lang.in, cp/config-lang.in, objc/config-lang.in
* objcp/config-lang.in: Add c-pragma.h to gtfiles.
* configure: Regenerate.
From-SVN: r123234
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 23 | ||||
-rw-r--r-- | gcc/Makefile.in | 98 | ||||
-rw-r--r-- | gcc/c-config-lang.in | 2 | ||||
-rw-r--r-- | gcc/configure.ac | 22 | ||||
-rw-r--r-- | gcc/cp/config-lang.in | 2 | ||||
-rw-r--r-- | gcc/gengtype.c | 410 | ||||
-rw-r--r-- | gcc/objc/config-lang.in | 2 | ||||
-rw-r--r-- | gcc/objcp/config-lang.in | 2 |
8 files changed, 369 insertions, 192 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b0dd7b8..05c1736 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,28 @@ 2007-03-26 Zack Weinberg <zackw@panix.com> + * gengtype.c: Don't include gtyp-gen.h. + (srcdir): Declare here. + (base_files, lang_dir_names): Allocate dynamically. + (gt_files, num_gt_files, num_lang_dirs): New globals. + (measure_input_list, read_input_line, read_input_list) + (set_lang_bitmap): New functions. + (get_base_file_bitmap): Rename get_lang_bitmap and drastically + simplify, relying on read_input_list to set up the bitmaps. + (main): Arguments are no longer unused. Check for correct number + of command line arguments, set srcdir and srcdir_len, then call + read_input_list, before doing anything else. No need to worry + about duplicates in main loop. + * configure.ac: Simplify the calculation of all_gtfiles. + Put language tags in there. Don't set or substitute + all_gtfiles_files_langs or all_gtfiles_files_frags. + * Makefile.in: Revamp the way gengtype is invoked, now that it + takes a file on its command line with a much simpler format. + Remove or replace with gtyp-input.list all references to gtyp-gen.h. + (GTFILES): Remove duplicates and C source files. + * c-config-lang.in, cp/config-lang.in, objc/config-lang.in + * objcp/config-lang.in: Add c-pragma.h to gtfiles. + * configure: Regenerate. + * gengtype.h: Remove all type definitions to gengtype.c; leave only definitions of options_p, type_p, and pair_p as opaque pointers. Update prototypes. diff --git a/gcc/Makefile.in b/gcc/Makefile.in index c51376c..2236f3b 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -1189,7 +1189,7 @@ MOSTLYCLEANFILES = insn-flags.h insn-config.h insn-codes.h \ insn-attr.h insn-attrtab.c insn-opinit.c insn-preds.c insn-constants.h \ tm-preds.h tm-constrs.h \ tree-check.h min-insn-modes.c insn-modes.c insn-modes.h \ - genrtl.c genrtl.h gt-*.h gtype-*.h gtype-desc.c gtyp-gen.h \ + genrtl.c genrtl.h gt-*.h gtype-*.h gtype-desc.c gtyp-input.list \ xgcc$(exeext) cpp$(exeext) cc1$(exeext) cc1*-dummy$(exeext) $(EXTRA_PASSES) \ $(EXTRA_PARTS) $(EXTRA_PROGRAMS) gcc-cross$(exeext) \ protoize$(exeext) unprotoize$(exeext) \ @@ -2988,11 +2988,11 @@ GTFILES = $(srcdir)/input.h $(srcdir)/coretypes.h \ $(srcdir)/real.h $(srcdir)/varray.h $(srcdir)/insn-addr.h $(srcdir)/hwint.h \ $(srcdir)/ipa-reference.h $(srcdir)/output.h \ $(srcdir)/cselib.h $(srcdir)/basic-block.h $(srcdir)/cgraph.h \ - $(srcdir)/c-common.h $(srcdir)/c-tree.h $(srcdir)/reload.h \ + $(srcdir)/reload.h \ $(srcdir)/alias.c $(srcdir)/bitmap.c $(srcdir)/cselib.c $(srcdir)/cgraph.c \ $(srcdir)/ipa-prop.c $(srcdir)/ipa-cp.c $(srcdir)/ipa-inline.c \ $(srcdir)/dbxout.c $(srcdir)/dwarf2out.c $(srcdir)/dwarf2asm.c \ - $(srcdir)/dojump.c $(srcdir)/tree-profile.c \ + $(srcdir)/dojump.c \ $(srcdir)/emit-rtl.c $(srcdir)/except.c $(srcdir)/explow.c $(srcdir)/expr.c \ $(srcdir)/function.c $(srcdir)/except.h \ $(srcdir)/gcse.c $(srcdir)/integrate.c $(srcdir)/lists.c $(srcdir)/optabs.c \ @@ -3001,7 +3001,6 @@ GTFILES = $(srcdir)/input.h $(srcdir)/coretypes.h \ $(srcdir)/sdbout.c $(srcdir)/stor-layout.c \ $(srcdir)/stringpool.c $(srcdir)/tree.c $(srcdir)/varasm.c \ $(srcdir)/tree-mudflap.c $(srcdir)/tree-flow.h \ - $(srcdir)/c-objc-common.c $(srcdir)/c-common.c $(srcdir)/c-parser.c \ $(srcdir)/tree-ssanames.c $(srcdir)/tree-eh.c $(srcdir)/tree-ssa-address.c \ $(srcdir)/tree-phinodes.c $(srcdir)/tree-cfg.c \ $(srcdir)/tree-dfa.c $(srcdir)/tree-ssa-propagate.c \ @@ -3011,69 +3010,38 @@ GTFILES = $(srcdir)/input.h $(srcdir)/coretypes.h \ $(srcdir)/tree-profile.c $(srcdir)/tree-nested.c \ $(srcdir)/ipa-reference.c $(srcdir)/tree-ssa-structalias.h \ $(srcdir)/tree-ssa-structalias.c \ - $(srcdir)/c-pragma.h $(srcdir)/omp-low.c $(srcdir)/varpool.c \ - $(srcdir)/targhooks.c $(out_file) $(srcdir)/passes.c\ + $(srcdir)/omp-low.c $(srcdir)/varpool.c \ + $(srcdir)/targhooks.c $(out_file) $(srcdir)/passes.c \ @all_gtfiles@ -GTFILES_FILES_LANGS = @all_gtfiles_files_langs@ -GTFILES_FILES_FILES = @all_gtfiles_files_files@ -GTFILES_LANG_DIR_NAMES = @subdirs@ -GTFILES_SRCDIR = @srcdir@ - -GTFILES_FILES_FILES_C = $(subst $(srcdir)/,, \ - $(filter %.c, $(GTFILES_FILES_FILES))) -GTFILES_FILES_FILES_H = $(addprefix gt-, \ - $(subst /,-,$(GTFILES_FILES_FILES_C:.c=.h))) -GTFILES_LANG_DIR_NAMES_H = $(foreach d,$(GTFILES_LANG_DIR_NAMES), gtype-$(d).h) -ALL_GTFILES_H := $(sort $(GTFILES_FILES_FILES_H) $(GTFILES_LANG_DIR_NAMES_H)) - -$(ALL_GTFILES_H) : s-gtype ; @true - - -gt-cgraph.h gt-coverage.h gtype-desc.h gtype-desc.c gt-except.h \ -gt-function.h gt-integrate.h gt-tree.h gt-varasm.h \ -gt-emit-rtl.h gt-explow.h gt-stor-layout.h gt-regclass.h \ -gt-lists.h gt-alias.h gt-cselib.h gt-gcse.h \ -gt-expr.h gt-sdbout.h gt-optabs.h gt-bitmap.h gt-dojump.h \ -gt-dwarf2out.h gt-dwarf2asm.h \ -gt-dbxout.h \ -gtype-c.h gt-cfglayout.h \ -gt-tree-mudflap.h gt-tree-vect-generic.h \ -gt-tree-profile.h gt-tree-ssa-address.h \ -gt-tree-iterator.h gt-gimplify.h \ -gt-tree-phinodes.h gt-tree-nested.h \ -gt-tree-ssa-propagate.h gt-varpool.h \ -gt-tree-ssa-structalias.h gt-ipa-inline.h gt-passes.h \ -gt-stringpool.h gt-targhooks.h gt-omp-low.h : s-gtype ; @true - -define echo_quoted_to_gtyp - echo "\"$(gtyp)\", " >> tmp-gtyp.h +GTFILES_H = $(subst /,-, $(subst $(srcdir)/,gt-, $(subst .c,.h, \ + $(filter %.c, $(GTFILES))))) + +GTFILES_LANG_H = $(patsubst [%], gtype-%.h, $(filter [%], $(GTFILES))) +ALL_GTFILES_H := $(sort $(GTFILES_H) $(GTFILES_LANG_H)) + +# $(GTFILES) may be too long to put on a command line, so we have to +# write it out to a file (taking care not to do that in a way that +# overflows a command line!) and then have gengtype read the file in. +# The extra blank line in this definition is crucial: it makes the +# $(foreach ...) below expand to many lines instead of one. + +define echo_to_gi.list +echo '$(gtyp)' >> tmp-gi.list endef -gtyp-gen.h: s-gtyp-gen ; @true -s-gtyp-gen: Makefile - echo "/* This file is machine generated. Do not edit. */" > tmp-gtyp.h - echo "static const char *const srcdir = " >> tmp-gtyp.h - echo "\"$(GTFILES_SRCDIR)\"" >> tmp-gtyp.h - echo ";" >> tmp-gtyp.h - echo "static const char *const lang_files[] = {" >> tmp-gtyp.h - $(foreach gtyp,$(GTFILES_FILES_FILES),$(echo_quoted_to_gtyp)) - echo "NULL};" >> tmp-gtyp.h - echo "static const char *const langs_for_lang_files[] = {" >> tmp-gtyp.h - $(foreach gtyp,$(GTFILES_FILES_LANGS),$(echo_quoted_to_gtyp)) - echo "NULL};" >> tmp-gtyp.h - echo "static const char *const all_files[] = {" >> tmp-gtyp.h - $(foreach gtyp,$(GTFILES),$(echo_quoted_to_gtyp)) - echo " NULL};" >> tmp-gtyp.h - echo "static const char *const lang_dir_names[] = { \"c\", " >> tmp-gtyp.h - $(foreach gtyp,$(GTFILES_LANG_DIR_NAMES),$(echo_quoted_to_gtyp)) - echo "NULL};" >> tmp-gtyp.h - $(SHELL) $(srcdir)/../move-if-change tmp-gtyp.h gtyp-gen.h - $(STAMP) s-gtyp-gen - -s-gtype: build/gengtype$(build_exeext) $(GTFILES) - $(RUN_GEN) build/gengtype$(build_exeext) +$(ALL_GTFILES_H) gtype-desc.c gtype-desc.h : s-gtype ; @true + +gtyp-input.list: s-gtyp-input ; @true +s-gtyp-input: Makefile + $(foreach gtyp, $(GTFILES), $(echo_to_gi.list)) + $(SHELL) $(srcdir)/../move-if-change tmp-gi.list gtyp-input.list + $(STAMP) s-gtyp-input + +s-gtype: build/gengtype$(build_exeext) $(filter-out [%], $(GTFILES)) \ + gtyp-input.list + $(RUN_GEN) build/gengtype$(build_exeext) $(srcdir) gtyp-input.list $(STAMP) s-gtype # @@ -3142,7 +3110,7 @@ build/gengtype-lex.o : gengtype-lex.c gengtype.h gengtype-yacc.h \ build/gengtype-yacc.o : gengtype-yacc.c gengtype.h $(BCONFIG_H) \ $(SYSTEM_H) build/gengtype.o : gengtype.c $(BCONFIG_H) $(SYSTEM_H) gengtype.h \ - gtyp-gen.h rtl.def insn-notes.def errors.h + rtl.def insn-notes.def errors.h build/genmddeps.o: genmddeps.c $(BCONFIG_H) $(SYSTEM_H) coretypes.h \ $(GTM_H) $(RTL_BASE_H) errors.h gensupport.h build/genmodes.o : genmodes.c $(BCONFIG_H) $(SYSTEM_H) errors.h \ @@ -3761,8 +3729,8 @@ mostlyclean: lang.mostlyclean -rm -f gcc.vrs gcc.kys gcc.tps gcc.pgs gcc.fns # Delete core dumps. -rm -f core */core -# Delete file generated for gengtype.c - -rm -f gtyp-gen.h +# Delete file generated for gengtype + -rm -f gtyp-input.list # Delete files generated by gengtype.c -rm -f gtype-* -rm -f gt-* diff --git a/gcc/c-config-lang.in b/gcc/c-config-lang.in index 01fe1d0..33f82b6 100644 --- a/gcc/c-config-lang.in +++ b/gcc/c-config-lang.in @@ -23,4 +23,4 @@ # files used by C that have garbage collection GTY macros in them # which therefore need to be scanned by gengtype.c. -gtfiles="\$(srcdir)/c-lang.c \$(srcdir)/c-tree.h \$(srcdir)/c-decl.c \$(srcdir)/c-common.c \$(srcdir)/c-common.h \$(srcdir)/c-pragma.c \$(srcdir)/c-objc-common.c \$(srcdir)/c-parser.c" +gtfiles="\$(srcdir)/c-lang.c \$(srcdir)/c-tree.h \$(srcdir)/c-decl.c \$(srcdir)/c-common.c \$(srcdir)/c-common.h \$(srcdir)/c-pragma.h \$(srcdir)/c-pragma.c \$(srcdir)/c-objc-common.c \$(srcdir)/c-parser.c" diff --git a/gcc/configure.ac b/gcc/configure.ac index 226b62a..45cbf97 100644 --- a/gcc/configure.ac +++ b/gcc/configure.ac @@ -3532,11 +3532,8 @@ all_outputs='Makefile gccbug libada-mk' all_lang_makefrags= # List of language subdirectory makefiles. Deprecated. all_lang_makefiles= -# Files for gengtype +# Additional files for gengtype all_gtfiles="$target_gtfiles" -# Files for gengtype with language -all_gtfiles_files_langs= -all_gtfiles_files_files= # These are the languages that are set in --enable-languages, # and are available in the GCC tree. @@ -3613,24 +3610,13 @@ changequote([,])dnl all_languages="$all_languages $language" all_compilers="$all_compilers $compilers" all_outputs="$all_outputs $outputs" - all_gtfiles="$all_gtfiles $gtfiles" - for f in $gtfiles - do - all_gtfiles_files_langs="$all_gtfiles_files_langs ${subdir} " - all_gtfiles_files_files="$all_gtfiles_files_files ${f} " - done + all_gtfiles="$all_gtfiles [[$subdir]] $gtfiles" done # Pick up gtfiles for c gtfiles= -subdir="c" . ${srcdir}/c-config-lang.in -all_gtfiles="$all_gtfiles $gtfiles" -for f in $gtfiles -do - all_gtfiles_files_langs="$all_gtfiles_files_langs ${subdir} " - all_gtfiles_files_files="$all_gtfiles_files_files ${f} " -done +all_gtfiles="$all_gtfiles [[c]] $gtfiles" check_languages= for language in $all_selected_languages @@ -3762,8 +3748,6 @@ AC_SUBST(subdirs) AC_SUBST(srcdir) AC_SUBST(all_compilers) AC_SUBST(all_gtfiles) -AC_SUBST(all_gtfiles_files_langs) -AC_SUBST(all_gtfiles_files_files) AC_SUBST(all_lang_makefrags) AC_SUBST(all_lang_makefiles) AC_SUBST(all_languages) diff --git a/gcc/cp/config-lang.in b/gcc/cp/config-lang.in index 365a41d..5c223c1 100644 --- a/gcc/cp/config-lang.in +++ b/gcc/cp/config-lang.in @@ -31,4 +31,4 @@ compilers="cc1plus\$(exeext)" target_libs="target-libstdc++-v3" -gtfiles="\$(srcdir)/cp/rtti.c \$(srcdir)/cp/mangle.c \$(srcdir)/cp/name-lookup.h \$(srcdir)/cp/name-lookup.c \$(srcdir)/cp/cp-tree.h \$(srcdir)/cp/decl.h \$(srcdir)/cp/call.c \$(srcdir)/cp/decl.c \$(srcdir)/cp/decl2.c \$(srcdir)/cp/pt.c \$(srcdir)/cp/repo.c \$(srcdir)/cp/semantics.c \$(srcdir)/cp/tree.c \$(srcdir)/cp/parser.c \$(srcdir)/cp/method.c \$(srcdir)/cp/typeck2.c \$(srcdir)/c-common.c \$(srcdir)/c-common.h \$(srcdir)/c-lex.c \$(srcdir)/c-pragma.c \$(srcdir)/cp/class.c \$(srcdir)/cp/cp-objcp-common.c" +gtfiles="\$(srcdir)/cp/rtti.c \$(srcdir)/cp/mangle.c \$(srcdir)/cp/name-lookup.h \$(srcdir)/cp/name-lookup.c \$(srcdir)/cp/cp-tree.h \$(srcdir)/cp/decl.h \$(srcdir)/cp/call.c \$(srcdir)/cp/decl.c \$(srcdir)/cp/decl2.c \$(srcdir)/cp/pt.c \$(srcdir)/cp/repo.c \$(srcdir)/cp/semantics.c \$(srcdir)/cp/tree.c \$(srcdir)/cp/parser.c \$(srcdir)/cp/method.c \$(srcdir)/cp/typeck2.c \$(srcdir)/c-common.c \$(srcdir)/c-common.h \$(srcdir)/c-lex.c \$(srcdir)/c-pragma.h \$(srcdir)/c-pragma.c \$(srcdir)/cp/class.c \$(srcdir)/cp/cp-objcp-common.c" diff --git a/gcc/gengtype.c b/gcc/gengtype.c index 604d94c..ce34d00 100644 --- a/gcc/gengtype.c +++ b/gcc/gengtype.c @@ -133,13 +133,6 @@ extern outf_p get_output_file_with_visibility (const char *input_file); const char *get_output_file_name (const char *); -#include "gtyp-gen.h" - -/* A bitmap that specifies which of BASE_FILES should be used to - output a definition that is different for each language and must be - defined once in each language that uses INPUT_FILE. */ -static lang_bitmap get_base_file_bitmap (const char *input_file); - /* Print, like fprintf, to O. */ static void oprintf (outf_p o, const char *S, ...) ATTRIBUTE_PRINTF_2; @@ -151,20 +144,12 @@ static outf_p output_files; source file. */ static outf_p header_file; -/* Number of files specified in gtfiles. */ -#define NUM_GT_FILES (ARRAY_SIZE (all_files) - 1) - -/* Number of files in the language files array. */ -#define NUM_LANG_FILES (ARRAY_SIZE (lang_files) - 1) +/* Source directory. */ +static const char *srcdir; /* Length of srcdir name. */ static int srcdir_len = 0; -/* A list of output files suitable for definitions. There is one - BASE_FILES entry for each language. */ -#define NUM_BASE_FILES (ARRAY_SIZE (lang_dir_names) - 1) -static outf_p base_files[NUM_BASE_FILES]; - static outf_p create_file (const char *, const char *); static const char * get_file_basename (const char *); @@ -210,7 +195,285 @@ xasprintf (const char *format, ...) return result; } + +/* Input file handling. */ + +/* Table of all input files. */ +static const char **gt_files; +static size_t num_gt_files; + +/* Vector of per-language directories. */ +static const char **lang_dir_names; +static size_t num_lang_dirs; + +/* An array of output files suitable for definitions. There is one + BASE_FILES entry for each language. */ +static outf_p *base_files; + +/* Return a bitmap which has bit `1 << BASE_FILE_<lang>' set iff + INPUT_FILE is used by <lang>. + + This function should be written to assume that a file _is_ used + if the situation is unclear. If it wrongly assumes a file _is_ used, + a linker error will result. If it wrongly assumes a file _is not_ used, + some GC roots may be missed, which is a much harder-to-debug problem. + + The relevant bitmap is stored immediately before the file's name in the + buffer set up by read_input_list. It may be unaligned, so we have to + read it byte-by-byte. */ +static lang_bitmap +get_lang_bitmap (const char *gtfile) +{ + lang_bitmap n = 0; + int i; + for (i = -(int) sizeof (lang_bitmap); i < 0; i++) + n = (n << CHAR_BIT) + (unsigned char)gtfile[i]; + return n; +} + +/* Set the bitmap returned by get_lang_bitmap. The only legitimate + caller of this function is read_input_list. */ +static void +set_lang_bitmap (char *gtfile, lang_bitmap n) +{ + int i; + for (i = -1; i >= -(int) sizeof (lang_bitmap); i--) + { + gtfile[i] = n & ((1U << CHAR_BIT)-1); + n >>= CHAR_BIT; + } +} + +/* Scan the input file, LIST, and determine how much space we need to + store strings in. Also, count the number of language directories + and files. The numbers returned are overestimates as they does not + consider repeated files. */ +static size_t +measure_input_list (FILE *list) +{ + size_t n = 0; + int c; + bool atbol = true; + num_lang_dirs = 0; + num_gt_files = 0; + while ((c = getc (list)) != EOF) + { + n++; + if (atbol) + { + if (c == '[') + num_lang_dirs++; + else + { + /* Add space for a lang_bitmap before the input file name. */ + n += sizeof (lang_bitmap); + num_gt_files++; + } + atbol = false; + } + + if (c == '\n') + atbol = true; + } + + rewind (list); + return n; +} + +/* Read one input line from LIST to HEREP (which is updated). A + pointer to the string is returned via LINEP. If it was a language + subdirectory in square brackets, strip off the square brackets and + return true. Otherwise, leave space before the string for a + lang_bitmap, and return false. At EOF, returns false, does not + touch *HEREP, and sets *LINEP to NULL. POS is used for + diagnostics. */ +static bool +read_input_line (FILE *list, char **herep, char **linep, + struct fileloc *pos) +{ + char *here = *herep; + char *line; + int c = getc (list); + + if (c == EOF) + { + *linep = 0; + return false; + } + else if (c == '[') + { + /* No space for a lang_bitmap is necessary. Discard the '['. */ + c = getc (list); + line = here; + while (c != ']' && c != '\n' && c != EOF) + { + *here++ = c; + c = getc (list); + } + *here++ = '\0'; + + if (c == ']') + { + c = getc (list); /* eat what should be a newline */ + if (c != '\n' && c != EOF) + error_at_line (pos, "junk on line after language tag [%s]", line); + } + else + error_at_line (pos, "missing close bracket for language tag [%s", line); + + *herep = here; + *linep = line; + return true; + } + else + { + /* Leave space for a lang_bitmap. */ + memset (here, 0, sizeof (lang_bitmap)); + here += sizeof (lang_bitmap); + line = here; + do + { + *here++ = c; + c = getc (list); + } + while (c != EOF && c != '\n'); + *here++ = '\0'; + *herep = here; + *linep = line; + return false; + } +} + +/* Read the list of input files from LIST and compute all of the + relevant tables. There is one file per line of the list. At + first, all the files on the list are language-generic, but + eventually a line will appear which is the name of a language + subdirectory in square brackets, like this: [cp]. All subsequent + files are specific to that language, until another language + subdirectory tag appears. Files can appear more than once, if + they apply to more than one language. */ +static void +read_input_list (const char *listname) +{ + FILE *list = fopen (listname, "r"); + if (!list) + fatal ("cannot open %s: %s", listname, strerror (errno)); + else + { + struct fileloc epos; + size_t bufsz = measure_input_list (list); + char *buf = XNEWVEC (char, bufsz); + char *here = buf; + char *committed = buf; + char *limit = buf + bufsz; + char *line; + bool is_language; + size_t langno = 0; + size_t nfiles = 0; + lang_bitmap curlangs = (1 << num_lang_dirs) - 1; + + epos.file = listname; + epos.line = 0; + + lang_dir_names = XNEWVEC (const char *, num_lang_dirs); + gt_files = XNEWVEC (const char *, num_gt_files); + + for (;;) + { + next_line: + epos.line++; + committed = here; + is_language = read_input_line (list, &here, &line, &epos); + gcc_assert (here <= limit); + if (line == 0) + break; + else if (is_language) + { + size_t i; + gcc_assert (langno <= num_lang_dirs); + for (i = 0; i < langno; i++) + if (strcmp (lang_dir_names[i], line) == 0) + { + error_at_line (&epos, "duplicate language tag [%s]", line); + curlangs = 1 << i; + here = committed; + goto next_line; + } + + curlangs = 1 << langno; + lang_dir_names[langno++] = line; + } + else + { + size_t i; + gcc_assert (nfiles <= num_gt_files); + for (i = 0; i < nfiles; i++) + if (strcmp (gt_files[i], line) == 0) + { + /* Throw away the string we just read, and add the + current language to the existing string's bitmap. */ + lang_bitmap bmap = get_lang_bitmap (gt_files[i]); + if (bmap & curlangs) + error_at_line (&epos, "file %s specified more than once " + "for language %s", line, langno == 0 + ? "(all)" + : lang_dir_names[langno - 1]); + + bmap |= curlangs; + set_lang_bitmap ((char *)gt_files[i], bmap); + here = committed; + goto next_line; + } + + set_lang_bitmap (line, curlangs); + gt_files[nfiles++] = line; + } + } + /* Update the global counts now that we know accurately how many + things there are. (We do not bother resizing the arrays down.) */ + num_lang_dirs = langno; + num_gt_files = nfiles; + } + + /* Sanity check: any file that resides in a language subdirectory + (e.g. 'cp') ought to belong to the corresponding language. + ??? Still true if for instance ObjC++ is enabled and C++ isn't? + (Can you even do that? Should you be allowed to?) */ + { + size_t f; + for (f = 0; f < num_gt_files; f++) + { + lang_bitmap bitmap = get_lang_bitmap (gt_files[f]); + const char *basename = get_file_basename (gt_files[f]); + const char *slashpos = strchr (basename, '/'); + + if (slashpos) + { + size_t l; + for (l = 0; l < num_lang_dirs; l++) + if ((size_t)(slashpos - basename) == strlen (lang_dir_names [l]) + && memcmp (basename, lang_dir_names[l], + strlen (lang_dir_names[l])) == 0) + { + if (!(bitmap & (1 << l))) + error ("%s is in language directory '%s' but is not " + "tagged for that language", + basename, lang_dir_names[l]); + break; + } + } + } + } + + if (ferror (list)) + fatal ("error reading %s: %s", listname, strerror (errno)); + + fclose (list); +} + + + /* The one and only TYPE_STRING. */ static struct type string_type = { @@ -297,7 +560,7 @@ new_structure (const char *name, int isunion, struct fileloc *pos, { type_p si; type_p s = NULL; - lang_bitmap bitmap = get_base_file_bitmap (pos->file); + lang_bitmap bitmap = get_lang_bitmap (pos->file); for (si = structures; si != NULL; si = si->next) if (strcmp (name, si->u.s.tag) == 0 @@ -1202,7 +1465,9 @@ open_base_files (void) header_file = create_file ("GCC", "gtype-desc.h"); - for (i = 0; i < NUM_BASE_FILES; i++) + base_files = XNEWVEC (outf_p, num_lang_dirs); + + for (i = 0; i < num_lang_dirs; i++) base_files[i] = create_file (lang_dir_names[i], xasprintf ("gtype-%s.h", lang_dir_names[i])); @@ -1242,7 +1507,7 @@ get_file_basename (const char *f) basename++; - for (i = 1; i < NUM_BASE_FILES; i++) + for (i = 0; i < num_lang_dirs; i++) { const char * s1; const char * s2; @@ -1264,63 +1529,6 @@ get_file_basename (const char *f) return basename; } -/* Return a bitmap which has bit `1 << BASE_FILE_<lang>' set iff - INPUT_FILE is used by <lang>. - - This function should be written to assume that a file _is_ used - if the situation is unclear. If it wrongly assumes a file _is_ used, - a linker error will result. If it wrongly assumes a file _is not_ used, - some GC roots may be missed, which is a much harder-to-debug problem. */ - -unsigned -get_base_file_bitmap (const char *input_file) -{ - const char *basename = get_file_basename (input_file); - const char *slashpos = strchr (basename, '/'); - unsigned j; - unsigned k; - unsigned bitmap; - - /* If the file resides in a language subdirectory (e.g., 'cp'), assume that - it belongs to the corresponding language. The file may belong to other - languages as well (which is checked for below). */ - - if (slashpos) - { - size_t i; - for (i = 1; i < NUM_BASE_FILES; i++) - if ((size_t)(slashpos - basename) == strlen (lang_dir_names [i]) - && memcmp (basename, lang_dir_names[i], strlen (lang_dir_names[i])) == 0) - { - /* It's in a language directory, set that language. */ - bitmap = 1 << i; - } - } - - /* If it's in any config-lang.in, then set for the languages - specified. */ - - bitmap = 0; - - for (j = 0; j < NUM_LANG_FILES; j++) - { - if (!strcmp(input_file, lang_files[j])) - { - for (k = 0; k < NUM_BASE_FILES; k++) - { - if (!strcmp(lang_dir_names[k], langs_for_lang_files[j])) - bitmap |= (1 << k); - } - } - } - - /* Otherwise, set all languages. */ - if (!bitmap) - bitmap = (1 << NUM_BASE_FILES) - 1; - - return bitmap; -} - /* An output file, suitable for definitions, that can see declarations made in INPUT_FILE and is linked into every language that uses INPUT_FILE. */ @@ -1382,7 +1590,7 @@ get_output_file_with_visibility (const char *input_file) { size_t i; - for (i = 0; i < NUM_BASE_FILES; i++) + for (i = 0; i < num_lang_dirs; i++) if (memcmp (basename, lang_dir_names[i], strlen (lang_dir_names[i])) == 0 && basename[strlen(lang_dir_names[i])] == '/') return base_files[i]; @@ -2644,7 +2852,7 @@ finish_root_table (struct flist *flp, const char *pfx, const char *lastname, for (fli2 = flp; fli2; fli2 = fli2->next) if (fli2->started_p) { - lang_bitmap bitmap = get_base_file_bitmap (fli2->name); + lang_bitmap bitmap = get_lang_bitmap (fli2->name); int fnum; for (fnum = 0; bitmap != 0; fnum++, bitmap >>= 1) @@ -2660,7 +2868,7 @@ finish_root_table (struct flist *flp, const char *pfx, const char *lastname, { size_t fnum; - for (fnum = 0; fnum < NUM_BASE_FILES; fnum++) + for (fnum = 0; fnum < num_lang_dirs; fnum++) oprintf (base_files [fnum], "const struct %s * const %s[] = {\n", tname, name); @@ -2670,7 +2878,7 @@ finish_root_table (struct flist *flp, const char *pfx, const char *lastname, for (fli2 = flp; fli2; fli2 = fli2->next) if (fli2->started_p) { - lang_bitmap bitmap = get_base_file_bitmap (fli2->name); + lang_bitmap bitmap = get_lang_bitmap (fli2->name); int fnum; fli2->started_p = 0; @@ -2686,7 +2894,7 @@ finish_root_table (struct flist *flp, const char *pfx, const char *lastname, { size_t fnum; - for (fnum = 0; fnum < NUM_BASE_FILES; fnum++) + for (fnum = 0; fnum < num_lang_dirs; fnum++) { oprintf (base_files[fnum], " NULL\n"); oprintf (base_files[fnum], "};\n"); @@ -2870,7 +3078,7 @@ write_array (outf_p f, pair_p v, const struct write_types_data *wtd) d.indent = 2; d.line = &v->line; d.opt = v->opt; - d.bitmap = get_base_file_bitmap (v->line.file); + d.bitmap = get_lang_bitmap (v->line.file); d.param = NULL; d.prev_val[3] = prevval3 = xasprintf ("&%s", v->name); @@ -3213,22 +3421,27 @@ note_def_vec_alloc (const char *type, const char *astrat, struct fileloc *pos) } -extern int main (int argc, char **argv); int -main (int ARG_UNUSED (argc), char ** ARG_UNUSED (argv)) +main (int argc, char **argv) { - unsigned i; + size_t i; static struct fileloc pos = { __FILE__, __LINE__ }; - unsigned j; + /* fatal uses this */ + progname = "gengtype"; + + if (argc != 3) + fatal ("usage: gengtype srcdir input-list"); + + srcdir = argv[1]; srcdir_len = strlen (srcdir); + read_input_list (argv[2]); + if (hit_error) + return 1; + scalar_char.u.scalar_is_char = true; scalar_nonchar.u.scalar_is_char = false; - - /* fatal uses this */ - progname = "gengtype"; - gen_rtx_next (); do_scalar_typedef ("CUMULATIVE_ARGS", &pos); @@ -3247,20 +3460,9 @@ main (int ARG_UNUSED (argc), char ** ARG_UNUSED (argv)) do_typedef ("HARD_REG_SET", create_array (&scalar_nonchar, "2"), &pos); - for (i = 0; i < NUM_GT_FILES; i++) + for (i = 0; i < num_gt_files; i++) { - int dupflag = 0; - /* Omit if already seen. */ - for (j = 0; j < i; j++) - { - if (!strcmp (all_files[i], all_files[j])) - { - dupflag = 1; - break; - } - } - if (!dupflag) - parse_file (all_files[i]); + parse_file (gt_files[i]); #ifndef USE_MAPPED_LOCATION /* temporary kludge - gengtype doesn't handle conditionals. Manually add source_locus *after* we've processed input.h. */ diff --git a/gcc/objc/config-lang.in b/gcc/objc/config-lang.in index 9a394ab..2a3d1361 100644 --- a/gcc/objc/config-lang.in +++ b/gcc/objc/config-lang.in @@ -34,4 +34,4 @@ target_libs=target-libobjc # Most of the object files for cc1obj actually come from C. lang_requires="c" -gtfiles="\$(srcdir)/objc/objc-act.h \$(srcdir)/c-parser.c \$(srcdir)/c-tree.h \$(srcdir)/c-decl.c \$(srcdir)/c-objc-common.c \$(srcdir)/c-common.c \$(srcdir)/c-common.h \$(srcdir)/c-pragma.c \$(srcdir)/objc/objc-act.c" +gtfiles="\$(srcdir)/objc/objc-act.h \$(srcdir)/c-parser.c \$(srcdir)/c-tree.h \$(srcdir)/c-decl.c \$(srcdir)/c-objc-common.c \$(srcdir)/c-common.c \$(srcdir)/c-common.h \$(srcdir)/c-pragma.h \$(srcdir)/c-pragma.c \$(srcdir)/objc/objc-act.c" diff --git a/gcc/objcp/config-lang.in b/gcc/objcp/config-lang.in index 66c3796..62b743f 100644 --- a/gcc/objcp/config-lang.in +++ b/gcc/objcp/config-lang.in @@ -38,4 +38,4 @@ build_by_default="no" lang_requires="objc c++" subdir_requires="objc cp" -gtfiles="\$(srcdir)/objcp/objcp-decl.c \$(srcdir)/objc/objc-act.c \$(srcdir)/objc/objc-act.h \$(srcdir)/cp/rtti.c \$(srcdir)/cp/mangle.c \$(srcdir)/cp/name-lookup.h \$(srcdir)/cp/name-lookup.c \$(srcdir)/cp/cp-tree.h \$(srcdir)/cp/decl.h \$(srcdir)/cp/call.c \$(srcdir)/cp/decl.c \$(srcdir)/cp/decl2.c \$(srcdir)/cp/pt.c \$(srcdir)/cp/repo.c \$(srcdir)/cp/semantics.c \$(srcdir)/cp/tree.c \$(srcdir)/cp/parser.c \$(srcdir)/cp/method.c \$(srcdir)/cp/typeck2.c \$(srcdir)/c-common.c \$(srcdir)/c-common.h \$(srcdir)/c-lex.c \$(srcdir)/c-pragma.c \$(srcdir)/cp/cp-objcp-common.c" +gtfiles="\$(srcdir)/objcp/objcp-decl.c \$(srcdir)/objc/objc-act.c \$(srcdir)/objc/objc-act.h \$(srcdir)/cp/rtti.c \$(srcdir)/cp/mangle.c \$(srcdir)/cp/name-lookup.h \$(srcdir)/cp/name-lookup.c \$(srcdir)/cp/cp-tree.h \$(srcdir)/cp/decl.h \$(srcdir)/cp/call.c \$(srcdir)/cp/decl.c \$(srcdir)/cp/decl2.c \$(srcdir)/cp/pt.c \$(srcdir)/cp/repo.c \$(srcdir)/cp/semantics.c \$(srcdir)/cp/tree.c \$(srcdir)/cp/parser.c \$(srcdir)/cp/method.c \$(srcdir)/cp/typeck2.c \$(srcdir)/c-common.c \$(srcdir)/c-common.h \$(srcdir)/c-lex.c \$(srcdir)/c-pragma.h \$(srcdir)/c-pragma.c \$(srcdir)/cp/cp-objcp-common.c" |