aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorZack Weinberg <zackw@panix.com>2007-03-26 21:07:27 +0000
committerZack Weinberg <zack@gcc.gnu.org>2007-03-26 21:07:27 +0000
commit11a675992afb01354e8d8331087177c25e97a7a6 (patch)
tree194b565efb539d208f63cc21e757c0f303b1a775 /gcc
parent065ae6117579cc9a089c238207b42f5a1470423a (diff)
downloadgcc-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/ChangeLog23
-rw-r--r--gcc/Makefile.in98
-rw-r--r--gcc/c-config-lang.in2
-rw-r--r--gcc/configure.ac22
-rw-r--r--gcc/cp/config-lang.in2
-rw-r--r--gcc/gengtype.c410
-rw-r--r--gcc/objc/config-lang.in2
-rw-r--r--gcc/objcp/config-lang.in2
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"