From 56e6b4a2778a0c416b0040a2081b5d58dcb65e3a Mon Sep 17 00:00:00 2001
From: Rainer Orth <ro@gcc.gnu.org>
Date: Mon, 8 Aug 2011 12:15:42 +0000
Subject: [PATCH] New files from last commit.

From-SVN: r177561
---
 gcc/config/sparc/driver-sparc.c | 158 ++++++++++++++++++++++++++++++++
 gcc/config/sparc/x-sparc        |   3 +
 2 files changed, 161 insertions(+)
 create mode 100644 gcc/config/sparc/driver-sparc.c
 create mode 100644 gcc/config/sparc/x-sparc

diff --git a/gcc/config/sparc/driver-sparc.c b/gcc/config/sparc/driver-sparc.c
new file mode 100644
index 000000000000..e5b91bc2ba8c
--- /dev/null
+++ b/gcc/config/sparc/driver-sparc.c
@@ -0,0 +1,158 @@
+/* Subroutines for the gcc driver.
+   Copyright (C) 2011 Free Software Foundation, Inc.
+
+   This file is part of GCC.
+
+   GCC is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   GCC is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
+
+#include "config.h"
+#include "system.h"
+#include "coretypes.h"
+#include "tm.h"
+
+static const struct cpu_names {
+  const char *const name;
+  const char *const cpu;
+} cpu_names[] = {
+#if defined __sun__ && defined __svr4__
+  { "TMS390S10",	"supersparc" },	/* Texas Instruments microSPARC I */
+  { "TMS390Z50",	"supersparc" },	/* Texas Instruments SuperSPARC I */
+  { "TMS390Z55",	"supersparc" },	/* Texas Instruments
+					   SuperSPARC I with SuperCache */
+  { "MB86904",		"supersparc" },	/* Fujitsu microSPARC II */
+  { "MB86907",		"supersparc" },	/* Fujitsu TurboSPARC */
+  { "RT623",		"hypersparc" },	/* Ross hyperSPARC */
+  { "RT625",		"hypersparc" },
+  { "RT626",		"hypersparc" },
+  { "UltraSPARC-I",	"ultrasparc" },
+  { "UltraSPARC-II",	"ultrasparc" },
+  { "UltraSPARC-IIe",	"ultrasparc" },
+  { "UltraSPARC-IIi",	"ultrasparc" },
+  { "SPARC64-III",	"ultrasparc" },
+  { "SPARC64-IV",	"ultrasparc" },
+  { "UltraSPARC-III",	"ultrasparc3" },
+  { "UltraSPARC-III+",	"ultrasparc3" },
+  { "UltraSPARC-IIIi",	"ultrasparc3" },
+  { "UltraSPARC-IIIi+",	"ultrasparc3" },
+  { "UltraSPARC-IV",	"ultrasparc3" },
+  { "UltraSPARC-IV+",	"ultrasparc3" },
+  { "SPARC64-V",	"ultrasparc3" },
+  { "SPARC64-VI",	"ultrasparc3" },
+  { "SPARC64-VII",	"ultrasparc3" },
+  { "UltraSPARC-T1",	"niagara" },
+  { "UltraSPARC-T2",	"niagara2" },
+  { "UltraSPARC-T2",	"niagara2" },
+  { "UltraSPARC-T2+",	"niagara2" },
+  { "SPARC-T3",		"niagara2" },
+  { "SPARC-T4",		"niagara2" },
+#else
+  /* FIXME: Provide Linux/SPARC values.  */
+#endif
+  { NULL,	NULL }
+  };
+
+#if defined __sun__ && defined __svr4__
+#include <kstat.h>
+#endif
+
+/* This will be called by the spec parser in gcc.c when it sees
+   a %:local_cpu_detect(args) construct.  Currently it will be called
+   with either "cpu" or "tune" as argument depending on if -mcpu=native
+   or -mtune=native is to be substituted.
+
+   It returns a string containing new command line parameters to be
+   put at the place of the above two options, depending on what CPU
+   this is executed.  E.g. "-mcpu=ultrasparc3" on an UltraSPARC III for
+   -mcpu=native.  If the routine can't detect a known processor,
+   the -mcpu or -mtune option is discarded.
+
+   ARGC and ARGV are set depending on the actual arguments given
+   in the spec.  */
+const char *
+host_detect_local_cpu (int argc, const char **argv)
+{
+  const char *cpu = NULL;
+#if defined __sun__ && defined __svr4__
+  char *buf = NULL;
+  kstat_ctl_t *kc;
+  kstat_t *ksp;
+  kstat_named_t *brand = NULL;
+#else
+  char buf[128];
+  FILE *f;
+#endif
+  int i;
+
+  if (argc < 1)
+    return NULL;
+
+  if (strcmp (argv[0], "cpu") && strcmp (argv[0], "tune"))
+    return NULL;
+
+#if defined __sun__ && defined __svr4__
+  kc = kstat_open ();
+  if (kc != NULL)
+    {
+      ksp = kstat_lookup (kc, CONST_CAST2 (char *, const char *, "cpu_info"),
+			  -1, NULL);
+      if (ksp != NULL
+	  && kstat_read (kc, ksp, NULL) != -1
+	  && ksp->ks_type == KSTAT_TYPE_NAMED)
+	brand = (kstat_named_t *)
+	  kstat_data_lookup (ksp, CONST_CAST2 (char *, const char *, "brand"));
+      /* "brand" was only introduced in Solaris 10.  */
+      if (brand == NULL)
+	  brand = (kstat_named_t *)
+	    kstat_data_lookup (ksp, CONST_CAST2 (char *, const char *,
+						 "implementation"));
+      /* KSTAT_DATA_STRING was introduced in Solaris 9.  */
+#ifdef KSTAT_DATA_STRING
+      if (brand != NULL && brand->data_type == KSTAT_DATA_STRING)
+	buf = KSTAT_NAMED_STR_PTR (brand);
+#else
+      if (brand != NULL && brand->data_type == KSTAT_DATA_CHAR)
+	buf = brand->value.c;
+#endif
+    }
+  kstat_close (kc);
+
+  for (i = 0; cpu_names[i].name != NULL; i++)
+    if (strcmp (buf, cpu_names[i].name) == 0)
+      cpu = cpu_names[i].cpu;
+#else
+  f = fopen ("/proc/cpuinfo", "r");
+  if (f == NULL)
+    return NULL;
+
+  while (fgets (buf, sizeof (buf), f) != NULL)
+    if (strncmp (buf, "cpu model", sizeof ("cpu model") - 1) == 0)
+      {
+        for (i = 0; cpu_names [i].name; i++)
+          if (strstr (buf, cpu_names [i].name) != NULL)
+	    {
+	      cpu = cpu_names [i].cpu;
+	      break;
+	    }
+	break;
+      }
+
+  fclose (f);
+#endif
+
+  if (cpu == NULL)
+    return NULL;
+
+  return concat ("-m", argv[0], "=", cpu, NULL);
+}
diff --git a/gcc/config/sparc/x-sparc b/gcc/config/sparc/x-sparc
new file mode 100644
index 000000000000..693ba61d3562
--- /dev/null
+++ b/gcc/config/sparc/x-sparc
@@ -0,0 +1,3 @@
+driver-sparc.o: $(srcdir)/config/sparc/driver-sparc.c \
+  $(CONFIG_H) $(SYSTEM_H)
+	$(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $<
-- 
GitLab