Index: gcc/Makefile.in
===================================================================
--- gcc/Makefile.in	2010-07-07 22:07:59.000000000 +0100
+++ gcc/Makefile.in	2010-07-07 22:10:30.000000000 +0100
@@ -3479,7 +3479,7 @@ lower-subreg.o : lower-subreg.c $(CONFIG
 target-globals.o : target-globals.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
    $(TM_H) insn-config.h $(MACHMODE_H) $(GGC_H) $(TOPLEV_H) target-globals.h \
    $(FLAGS_H) $(REGS_H) $(RTL_H) reload.h expmed.h $(EXPR_H) $(OPTABS_H) \
-   $(LIBFUNCS_H)
+   $(LIBFUNCS_H) $(CFGLOOP_H)
 
 $(out_object_file): $(out_file) $(CONFIG_H) coretypes.h $(TM_H) $(TREE_H) \
    $(RTL_H) $(REGS_H) hard-reg-set.h insn-config.h conditions.h \
Index: gcc/cfgloop.h
===================================================================
--- gcc/cfgloop.h	2010-07-04 22:48:29.000000000 +0100
+++ gcc/cfgloop.h	2010-07-07 22:10:30.000000000 +0100
@@ -625,11 +625,36 @@ #define FOR_EACH_LOOP_BREAK(LI) \
   }
 
 /* The properties of the target.  */
+struct target_cfgloop {
+  /* Number of available registers.  */
+  unsigned x_target_avail_regs;
 
-extern unsigned target_avail_regs;
-extern unsigned target_res_regs;
-extern unsigned target_reg_cost [2];
-extern unsigned target_spill_cost [2];
+  /* Number of registers reserved for temporary expressions.  */
+  unsigned x_target_res_regs;
+
+  /* The cost for register when there still is some reserve, but we are
+     approaching the number of available registers.  */
+  unsigned x_target_reg_cost[2];
+
+  /* The cost for register when we need to spill.  */
+  unsigned x_target_spill_cost[2];
+};
+
+extern struct target_cfgloop default_target_cfgloop;
+#if SWITCHABLE_TARGET
+extern struct target_cfgloop *this_target_cfgloop;
+#else
+#define this_target_cfgloop (&default_target_cfgloop)
+#endif
+
+#define target_avail_regs \
+  (this_target_cfgloop->x_target_avail_regs)
+#define target_res_regs \
+  (this_target_cfgloop->x_target_res_regs)
+#define target_reg_cost \
+  (this_target_cfgloop->x_target_reg_cost)
+#define target_spill_cost \
+  (this_target_cfgloop->x_target_spill_cost)
 
 /* Register pressure estimation for induction variable optimizations & loop
    invariant motion.  */
Index: gcc/cfgloopanal.c
===================================================================
--- gcc/cfgloopanal.c	2010-07-04 22:48:29.000000000 +0100
+++ gcc/cfgloopanal.c	2010-07-07 22:10:30.000000000 +0100
@@ -32,6 +32,11 @@ Software Foundation; either version 3, o
 #include "graphds.h"
 #include "params.h"
 
+struct target_cfgloop default_target_cfgloop;
+#if SWITCHABLE_TARGET
+struct target_cfgloop *this_target_cfgloop = &default_target_cfgloop;
+#endif
+
 /* Checks whether BB is executed exactly once in each LOOP iteration.  */
 
 bool
@@ -317,17 +322,6 @@ seq_cost (const_rtx seq, bool speed)
   return cost;
 }
 
-/* The properties of the target.  */
-
-unsigned target_avail_regs;	/* Number of available registers.  */
-unsigned target_res_regs;	/* Number of registers reserved for temporary
-				   expressions.  */
-unsigned target_reg_cost[2];	/* The cost for register when there still
-				   is some reserve, but we are approaching
-				   the number of available registers.  */
-unsigned target_spill_cost[2];	/* The cost for register when we need
-				   to spill.  */
-
 /* Initialize the constants for computing set costs.  */
 
 void
Index: gcc/target-globals.h
===================================================================
--- gcc/target-globals.h	2010-07-07 22:07:59.000000000 +0100
+++ gcc/target-globals.h	2010-07-07 22:10:30.000000000 +0100
@@ -29,6 +29,7 @@ #define TARGET_GLOBALS_H 1
 extern struct target_expmed *this_target_expmed;
 extern struct target_optabs *this_target_optabs;
 extern struct target_libfuncs *this_target_libfuncs;
+extern struct target_cfgloop *this_target_cfgloop;
 
 struct GTY(()) target_globals {
   struct target_flag_state *GTY((skip)) flag_state;
@@ -39,6 +40,7 @@ struct GTY(()) target_globals {
   struct target_expmed *GTY((skip)) expmed;
   struct target_optabs *GTY((skip)) optabs;
   struct target_libfuncs *libfuncs;
+  struct target_cfgloop *GTY((skip)) cfgloop;
 };
 
 extern struct target_globals default_target_globals;
@@ -56,6 +58,7 @@ restore_target_globals (struct target_gl
   this_target_expmed = g->expmed;
   this_target_optabs = g->optabs;
   this_target_libfuncs = g->libfuncs;
+  this_target_cfgloop = g->cfgloop;
 }
 #endif
 
Index: gcc/target-globals.c
===================================================================
--- gcc/target-globals.c	2010-07-07 22:07:59.000000000 +0100
+++ gcc/target-globals.c	2010-07-07 22:10:30.000000000 +0100
@@ -35,6 +35,7 @@ Software Foundation; either version 3, o
 #include "expr.h"
 #include "optabs.h"
 #include "libfuncs.h"
+#include "cfgloop.h"
 
 #if SWITCHABLE_TARGET
 struct target_globals default_target_globals = {
@@ -45,7 +46,8 @@ struct target_globals default_target_glo
   &default_target_reload,
   &default_target_expmed,
   &default_target_optabs,
-  &default_target_libfuncs
+  &default_target_libfuncs,
+  &default_target_cfgloop
 };
 
 struct target_globals *
@@ -62,6 +64,7 @@ save_target_globals (void)
   g->expmed = XCNEW (struct target_expmed);
   g->optabs = XCNEW (struct target_optabs);
   g->libfuncs = ggc_alloc_cleared_target_libfuncs ();
+  g->cfgloop = XCNEW (struct target_cfgloop);
   restore_target_globals (g);
   target_reinit ();
   return g;
