diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 79e0741e5d3e95644c6b0fb1d1581f920ca34e13..7b0adc10b0c642d84f49f2d91992b1af91d78830 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2003-03-04  Tom Tromey  <tromey@redhat.com>
+
+	* doc/sourcebuild.texi (Front End Directory): Document tags.
+	* configure: Rebuilt.
+	* configure.in (target_list): Added tags.
+	* Makefile.in (TAGS): Depend on lang.clean.  Include subdirectory
+	TAGS files by reference.
+	* objc/Make-lang.in (objc.tags): New target.
+
 2003-03-04  Zdenek Dvorak  <rakdver@atrey.karlin.mff.cuni.cz>
 
 	* gcov-io.h (gcov_save_position, gcov_reserve_length, gcov_resync,
diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index c48d619077cd2ffd86dc2cdbd1ae34c0a634251b..e09d9ceeb473e34e9b8f4bd9480145ad6b911a7a 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -3378,12 +3378,18 @@ paranoia: paranoia.o real.o $(LIBIBERTY)
 # These exist for maintenance purposes.
 
 # Update the tags table.
-TAGS: force
-	(cd $(srcdir);							\
-	mkdir tmp-tags;							\
-	mv -f c-parse.[ch] =*.[chy] tmp-tags;				\
-	etags *.y *.h *.c;						\
-	mv tmp-tags/* .;						\
+TAGS: lang.tags
+	(cd $(srcdir);						     \
+	incs= ;							     \
+	list='$(SUBDIRS)'; for dir in $$list; do		     \
+	  if test -f $$dir/TAGS; then				     \
+	    incs="$$incs --include $$dir/TAGS";			     \
+	  fi;							     \
+	done;							     \
+	mkdir tmp-tags;						     \
+	mv -f c-parse.[ch] =*.[chy] tmp-tags;			     \
+	etags *.y *.h *.c $$incs;				     \
+	mv tmp-tags/* .;					     \
 	rmdir tmp-tags)
 
 # A list of files to be destroyed during "lean" builds.
diff --git a/gcc/configure b/gcc/configure
index fe71c2a63c6ac90450e5a9b9eb8331622277f3b3..6c9ffe2598c1dacc9fab368cd040a6c0402214f3 100755
--- a/gcc/configure
+++ b/gcc/configure
@@ -8913,7 +8913,7 @@ done
 
 rm -f Make-hooks
 touch Make-hooks
-target_list="all.build all.cross start.encap rest.encap \
+target_list="all.build all.cross start.encap rest.encap tags \
 	info dvi generated-manpages \
 	install-normal install-common install-info install-man \
 	uninstall \
diff --git a/gcc/configure.in b/gcc/configure.in
index fa9cab394b094fb3f1e685e5d62d9b7b019d581c..a13f03585c72c25b262f0cdf49ce8f80b6520fb2 100644
--- a/gcc/configure.in
+++ b/gcc/configure.in
@@ -2814,7 +2814,7 @@ done
 
 rm -f Make-hooks
 touch Make-hooks
-target_list="all.build all.cross start.encap rest.encap \
+target_list="all.build all.cross start.encap rest.encap tags \
 	info dvi generated-manpages \
 	install-normal install-common install-info install-man \
 	uninstall \
diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi
index f10a800862bc901006f268cc37b6889ef58993e0..3141a23d7e7a80e4c925ac2410e28386b0a568c5 100644
--- a/gcc/doc/sourcebuild.texi
+++ b/gcc/doc/sourcebuild.texi
@@ -1,4 +1,4 @@
-@c Copyright (C) 2002 Free Software Foundation, Inc.
+@c Copyright (C) 2002, 2003 Free Software Foundation, Inc.
 @c This is part of the GCC manual.
 @c For copying conditions, see the file gcc.texi.
 
@@ -539,6 +539,9 @@ deprecated).
 @itemx start.encap
 @itemx rest.encap
 FIXME: exactly what goes in each of these targets?
+@item tags
+Build an @command{etags} @file{TAGS} file in the language subdirectory
+in the source tree.
 @item info
 Build info documentation for the front end, in the source directory.
 This target is only called by @command{make bootstrap} if a suitable
diff --git a/gcc/objc/Make-lang.in b/gcc/objc/Make-lang.in
index 1b06b38f460ddc1c61f288eea1195a3cd7482f55..6c5acd6cd595ab731574d44718b4ec6aab27055e 100644
--- a/gcc/objc/Make-lang.in
+++ b/gcc/objc/Make-lang.in
@@ -101,6 +101,9 @@ objc.all.cross:
 objc.start.encap:
 objc.rest.encap:
 
+objc.tags: force
+	cd $(srcdir)/objc; etags *.y *.c *.h
+
 objc.info:
 objc.dvi:
 objc.generated-manpages: