diff --git a/ChangeLog b/ChangeLog
index 6000a4328e458dec63bc12515cf95657803b5d1f..5101b2a3a240b8fec9535de4d1bedc94bbd1fccc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2004-04-23  Paolo Bonzini  <bonzini@gnu.org>
+
+	* Makefile.tpl (all-stage1-gcc, all-stage2-gcc, all-stage3-gcc):
+	Always relocate gcc and prev-gcc to the original names, even
+	if the build fails.
+	(new-cleanstrap, new-restage1, new-restage2, new-restage3):
+	New targets.
+
 2004-04-23  Laurent GUERBY <laurent@guerby.net>
 
 	* MAINTAINERS: Update my email address.
diff --git a/Makefile.in b/Makefile.in
index 354b7d9f7275b4043d93d3ca57ffba9982428fe1..55ec68c5c587c3d17be776090c760b1b0bf15c1c 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -24112,11 +24112,11 @@ all-stage1-gcc: configure-stage1-gcc prebootstrap
 	mv stage1-gcc gcc ; \
 	cd gcc && \
 	$(MAKE) $(GCC_FLAGS_TO_PASS) \
-		CFLAGS="$(STAGE1_CFLAGS)" \
-		|| exit 1 ; \
+		CFLAGS="$(STAGE1_CFLAGS)" && $(STAMP) ../all-stage1-gcc ; \
+	result=$$? ; \
 	cd .. ; \
 	mv gcc stage1-gcc ; \
-	$(STAMP) all-stage1-gcc
+	exit $$result
 
 # TODO: Deal with STAGE_PREFIX (which is only for ada, incidentally)
 # Possibly pass --enable-werror-always (depending on --enable-werror);
@@ -24188,11 +24188,12 @@ all-stage2-gcc: all-stage1-gcc configure-stage2-gcc
 		CC="$(STAGE_CC_WRAPPER) $$r/prev-gcc/xgcc$(exeext) -B$$r/prev-gcc/ -B$(build_tooldir)/bin/" \
 		CC_FOR_BUILD="$(STAGE_CC_WRAPPER) $$r/prev-gcc/xgcc$(exeext) -B$$r/prev-gcc/ -B$(build_tooldir)/bin/" \
 		STAGE_PREFIX=$$r/prev-gcc/ \
-		$(POSTSTAGE1_FLAGS_TO_PASS) || exit 1 ; \
+		$(POSTSTAGE1_FLAGS_TO_PASS) && $(STAMP) ../all-stage2-gcc ; \
+	result=$$? ; \
 	cd .. ; \
 	mv prev-gcc stage1-gcc ; \
 	mv gcc stage2-gcc ; \
-	$(STAMP) all-stage2-gcc
+	exit $$result
 
 configure-stage3-gcc: all-stage2-gcc
 	echo configure-stage3-gcc > stage_last ; \
@@ -24255,11 +24256,12 @@ all-stage3-gcc: all-stage2-gcc configure-stage3-gcc
 		CC="$(STAGE_CC_WRAPPER) $$r/prev-gcc/xgcc$(exeext) -B$$r/prev-gcc/ -B$(build_tooldir)/bin/" \
 		CC_FOR_BUILD="$(STAGE_CC_WRAPPER) $$r/prev-gcc/xgcc$(exeext) -B$$r/prev-gcc/ -B$(build_tooldir)/bin/" \
 		STAGE_PREFIX=$$r/prev-gcc/ \
-		$(POSTSTAGE1_FLAGS_TO_PASS) || exit 1 ; \
+		$(POSTSTAGE1_FLAGS_TO_PASS) && $(STAMP) ../all-stage3-gcc \
+	result=$$? ; \
 	cd .. ; \
 	mv prev-gcc stage2-gcc ; \
 	mv gcc stage3-gcc ; \
-	$(STAMP) all-stage3-gcc
+	exit $$result
 
 # We only want to compare .o files, so set this!
 objext = .o
@@ -24294,6 +24296,31 @@ new-bootstrap: compare
 	$(MAKE) all ; \
 	mv gcc stage3-gcc
 
+new-cleanstrap:
+	rm -rf configure-stage1-gcc all-stage1-gcc stage1-gcc \
+	  configure-stage2-gcc all-stage2-gcc stage2-gcc \
+	  configure-stage3-gcc all-stage3-gcc stage3-gcc \
+	  compare
+	$(MAKE) new-bootstrap
+
+new-restage1:
+	rm -rf configure-stage1-gcc all-stage1-gcc stage1-gcc/Makefile \
+	  configure-stage2-gcc all-stage2-gcc stage2-gcc \
+	  configure-stage3-gcc all-stage3-gcc stage3-gcc \
+	  compare
+	$(MAKE) all-stage1-gcc
+
+new-restage2: all-stage1-gcc
+	rm -rf configure-stage2-gcc all-stage2-gcc stage2-gcc/Makefile \
+	  configure-stage3-gcc all-stage3-gcc stage3-gcc \
+	  compare
+	$(MAKE) all-stage2-gcc
+
+new-restage3: all-stage2-gcc
+	rm -rf configure-stage3-gcc all-stage3-gcc stage3-gcc/Makefile \
+	  compare
+	$(MAKE) compare
+
 # --------------------------------------
 # Dependencies between different modules
 # --------------------------------------
diff --git a/Makefile.tpl b/Makefile.tpl
index 7ae10deab3b4142b9a7fbe958a47ba28357c4200..d380616168830fa5c20b759475b9a792a703ca27 100644
--- a/Makefile.tpl
+++ b/Makefile.tpl
@@ -1377,11 +1377,11 @@ all-stage1-gcc: configure-stage1-gcc prebootstrap
 	mv stage1-gcc gcc ; \
 	cd gcc && \
 	$(MAKE) $(GCC_FLAGS_TO_PASS) \
-		CFLAGS="$(STAGE1_CFLAGS)" \
-		|| exit 1 ; \
+		CFLAGS="$(STAGE1_CFLAGS)" && $(STAMP) ../all-stage1-gcc ; \
+	result=$$? ; \
 	cd .. ; \
 	mv gcc stage1-gcc ; \
-	$(STAMP) all-stage1-gcc
+	exit $$result
 
 # TODO: Deal with STAGE_PREFIX (which is only for ada, incidentally)
 # Possibly pass --enable-werror-always (depending on --enable-werror);
@@ -1453,11 +1453,12 @@ all-stage2-gcc: all-stage1-gcc configure-stage2-gcc
 		CC="$(STAGE_CC_WRAPPER) $$r/prev-gcc/xgcc$(exeext) -B$$r/prev-gcc/ -B$(build_tooldir)/bin/" \
 		CC_FOR_BUILD="$(STAGE_CC_WRAPPER) $$r/prev-gcc/xgcc$(exeext) -B$$r/prev-gcc/ -B$(build_tooldir)/bin/" \
 		STAGE_PREFIX=$$r/prev-gcc/ \
-		$(POSTSTAGE1_FLAGS_TO_PASS) || exit 1 ; \
+		$(POSTSTAGE1_FLAGS_TO_PASS) && $(STAMP) ../all-stage2-gcc ; \
+	result=$$? ; \
 	cd .. ; \
 	mv prev-gcc stage1-gcc ; \
 	mv gcc stage2-gcc ; \
-	$(STAMP) all-stage2-gcc
+	exit $$result
 
 configure-stage3-gcc: all-stage2-gcc
 	echo configure-stage3-gcc > stage_last ; \
@@ -1520,11 +1521,12 @@ all-stage3-gcc: all-stage2-gcc configure-stage3-gcc
 		CC="$(STAGE_CC_WRAPPER) $$r/prev-gcc/xgcc$(exeext) -B$$r/prev-gcc/ -B$(build_tooldir)/bin/" \
 		CC_FOR_BUILD="$(STAGE_CC_WRAPPER) $$r/prev-gcc/xgcc$(exeext) -B$$r/prev-gcc/ -B$(build_tooldir)/bin/" \
 		STAGE_PREFIX=$$r/prev-gcc/ \
-		$(POSTSTAGE1_FLAGS_TO_PASS) || exit 1 ; \
+		$(POSTSTAGE1_FLAGS_TO_PASS) && $(STAMP) ../all-stage3-gcc \
+	result=$$? ; \
 	cd .. ; \
 	mv prev-gcc stage2-gcc ; \
 	mv gcc stage3-gcc ; \
-	$(STAMP) all-stage3-gcc
+	exit $$result
 
 # We only want to compare .o files, so set this!
 objext = .o
@@ -1559,6 +1561,30 @@ new-bootstrap: compare
 	$(MAKE) all ; \
 	mv gcc stage3-gcc
 
+new-cleanstrap:
+	rm -rf configure-stage1-gcc all-stage1-gcc stage1-gcc \
+	  configure-stage2-gcc all-stage2-gcc stage2-gcc \
+	  configure-stage3-gcc all-stage3-gcc stage3-gcc \
+	  compare
+	$(MAKE) new-bootstrap
+
+new-restage1:
+	rm -rf all-stage1-gcc \
+	  configure-stage2-gcc all-stage2-gcc stage2-gcc \
+	  configure-stage3-gcc all-stage3-gcc stage3-gcc \
+	  compare
+	$(MAKE) all-stage1-gcc
+
+new-restage2: all-stage1-gcc
+	rm -rf all-stage2-gcc \
+	  configure-stage3-gcc all-stage3-gcc stage3-gcc \
+	  compare
+	$(MAKE) all-stage2-gcc
+
+new-restage3: all-stage2-gcc
+	rm -rf all-stage3-gcc compare
+	$(MAKE) compare
+
 # --------------------------------------
 # Dependencies between different modules
 # --------------------------------------