diff --git a/gcc/config.host b/gcc/config.host
index 61a00b5..df8ba8f 100644
--- a/gcc/config.host
+++ b/gcc/config.host
@@ -165,6 +165,14 @@ case ${host} in
 	;;
     esac
     ;;
+  sparc*-*-linux*)
+    case ${target} in
+      sparc*-*-linux*)
+	host_extra_gcc_objs="driver-sparc.o"
+	host_xmake_file="${host_xmake_file} sparc/x-sparc"
+	;;
+    esac
+    ;;
 esac
 
 # Machine-specific settings.
diff --git a/gcc/config/sparc/driver-sparc.c b/gcc/config/sparc/driver-sparc.c
index e5b91bc..f6a4e7c 100644
--- a/gcc/config/sparc/driver-sparc.c
+++ b/gcc/config/sparc/driver-sparc.c
@@ -58,7 +58,21 @@ static const struct cpu_names {
   { "SPARC-T3",		"niagara2" },
   { "SPARC-T4",		"niagara2" },
 #else
-  /* FIXME: Provide Linux/SPARC values.  */
+  { "SuperSPARC",	"supersparc" },
+  { "HyperSparc",	"hypersparc" },
+  { "SpitFire",		"ultrasparc" },
+  { "BlackBird",	"ultrasparc" },
+  { "Sabre",		"ultrasparc" },
+  { "Hummingbird",	"ultrasparc" },
+  { "Cheetah",		"ultrasparc3" },
+  { "Jalapeno",		"ultrasparc3" },
+  { "Jaguar",		"ultrasparc3" },
+  { "Panther",		"ultrasparc3" },
+  { "Serrano",		"ultrasparc3" },
+  { "UltraSparc T1",	"niagara" },
+  { "UltraSparc T2",	"niagara2" },
+  { "UltraSparc T3",	"niagara2" },
+  { "UltraSparc T4",	"niagara2" },
 #endif
   { NULL,	NULL }
   };
@@ -137,7 +151,7 @@ host_detect_local_cpu (int argc, const char **argv)
     return NULL;
 
   while (fgets (buf, sizeof (buf), f) != NULL)
-    if (strncmp (buf, "cpu model", sizeof ("cpu model") - 1) == 0)
+    if (strncmp (buf, "cpu\t\t:", sizeof ("cpu\t\t:") - 1) == 0)
       {
         for (i = 0; cpu_names [i].name; i++)
           if (strstr (buf, cpu_names [i].name) != NULL)
diff --git a/gcc/config/sparc/linux.h b/gcc/config/sparc/linux.h
index a9b630e..0ad4b34 100644
--- a/gcc/config/sparc/linux.h
+++ b/gcc/config/sparc/linux.h
@@ -39,6 +39,22 @@ along with GCC; see the file COPYING3.  If not see
   "%{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s\
    %{Ofast|ffast-math|funsafe-math-optimizations:crtfastmath.o%s}"
 
+/* -mcpu=native handling only makes sense with compiler running on
+   a SPARC chip.  */
+#if defined(__sparc__)
+extern const char *host_detect_local_cpu (int argc, const char **argv);
+# define EXTRA_SPEC_FUNCTIONS						\
+  { "local_cpu_detect", host_detect_local_cpu },
+
+# define MCPU_MTUNE_NATIVE_SPECS					\
+   " %{mcpu=native:%<mcpu=native %:local_cpu_detect(cpu)}"		\
+   " %{mtune=native:%<mtune=native %:local_cpu_detect(tune)}"
+#else
+# define MCPU_MTUNE_NATIVE_SPECS ""
+#endif
+
+#define DRIVER_SELF_SPECS MCPU_MTUNE_NATIVE_SPECS
+
 /* This is for -profile to use -lc_p instead of -lc.  */
 #undef	CC1_SPEC
 #define	CC1_SPEC "%{profile:-p} \
diff --git a/gcc/config/sparc/linux64.h b/gcc/config/sparc/linux64.h
index 7f8b378..0ad1a52 100644
--- a/gcc/config/sparc/linux64.h
+++ b/gcc/config/sparc/linux64.h
@@ -142,6 +142,22 @@ along with GCC; see the file COPYING3.  If not see
 %{!mno-relax:%{!r:-relax}} \
 "
 
+/* -mcpu=native handling only makes sense with compiler running on
+   a SPARC chip.  */
+#if defined(__sparc__)
+extern const char *host_detect_local_cpu (int argc, const char **argv);
+# define EXTRA_SPEC_FUNCTIONS						\
+  { "local_cpu_detect", host_detect_local_cpu },
+
+# define MCPU_MTUNE_NATIVE_SPECS					\
+   " %{mcpu=native:%<mcpu=native %:local_cpu_detect(cpu)}"		\
+   " %{mtune=native:%<mtune=native %:local_cpu_detect(tune)}"
+#else
+# define MCPU_MTUNE_NATIVE_SPECS ""
+#endif
+
+#define DRIVER_SELF_SPECS MCPU_MTUNE_NATIVE_SPECS
+
 #undef	CC1_SPEC
 #if DEFAULT_ARCH32_P
 #define CC1_SPEC "%{profile:-p} \
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index d5474fe..66d9fc5 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -17285,7 +17285,7 @@ for machine type @var{cpu_type}.  Supported values for @var{cpu_type} are
 @samp{sparclet}, @samp{tsc701}, @samp{v9}, @samp{ultrasparc},
 @samp{ultrasparc3}, @samp{niagara} and @samp{niagara2}.
 
-Native Solaris toolchains also support the value @samp{native},
+Native Solaris and Linux toolchains also support the value @samp{native},
 which selects the best architecture option for the host processor.
 @option{-mcpu=native} has no effect if GCC does not recognize
 the processor.
@@ -17354,8 +17354,8 @@ The same values for @option{-mcpu=@var{cpu_type}} can be used for
 that select a particular CPU implementation.  Those are @samp{cypress},
 @samp{supersparc}, @samp{hypersparc}, @samp{leon}, @samp{f930}, @samp{f934},
 @samp{sparclite86x}, @samp{tsc701}, @samp{ultrasparc}, @samp{ultrasparc3},
-@samp{niagara}, and @samp{niagara2}.  With native Solaris toolchains,
-@samp{native} can also be used.
+@samp{niagara}, and @samp{niagara2}.  With native Solaris and Linux
+toolchains, @samp{native} can also be used.
 
 @item -mv8plus
 @itemx -mno-v8plus
