driver-native.c [__sgi__]: Include <invent.h>, <sys/sbd.h>.
authorRainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
Fri, 29 Jul 2011 18:19:29 +0000 (18:19 +0000)
committerRainer Orth <ro@gcc.gnu.org>
Fri, 29 Jul 2011 18:19:29 +0000 (18:19 +0000)
* config/mips/driver-native.c [__sgi__]: Include <invent.h>,
<sys/sbd.h>.
(cpu_types): New array.
(cputype): New function.
(host_detect_local_cpu): Only define buf, f if !__sgi__.
Use scaninvent instead of /proc/cpuinfo if __sgi__.
* config.host: Also use driver-native.o, mips/x-native on
mips-sgi-irix*.
* config/mips/iris6.h [__mips__] (host_detect_local_cpu):
Declare.
(EXTRA_SPEC_FUNCTIONS, MARCH_MTUNE_NATIVE_SPECS): Define.
(DRIVER_SELF_SPECS): Add MARCH_MTUNE_NATIVE_SPECS.

From-SVN: r176947

gcc/ChangeLog
gcc/config.host
gcc/config/mips/driver-native.c
gcc/config/mips/iris6.h

index de9803404ed18a337c7c78aaac69304d08fec47f..6c707bb6fd9b4cdbb0be6b4848fb2af3f69dc90f 100644 (file)
@@ -1,3 +1,18 @@
+2011-07-29  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+
+       * config/mips/driver-native.c [__sgi__]: Include <invent.h>,
+       <sys/sbd.h>.
+       (cpu_types): New array.
+       (cputype): New function.
+       (host_detect_local_cpu): Only define buf, f if !__sgi__.
+       Use scaninvent instead of /proc/cpuinfo if __sgi__.
+       * config.host: Also use driver-native.o, mips/x-native on
+       mips-sgi-irix*.
+       * config/mips/iris6.h [__mips__] (host_detect_local_cpu):
+       Declare.
+       (EXTRA_SPEC_FUNCTIONS, MARCH_MTUNE_NATIVE_SPECS): Define.
+       (DRIVER_SELF_SPECS): Add MARCH_MTUNE_NATIVE_SPECS.
+
 2011-07-29  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/49897
index 771be8c283fbc0e43281773215286304892eac46..85009d1b45c606dd9714f0b8335d13c79e6bc028 100644 (file)
@@ -118,9 +118,9 @@ case ${host} in
        ;;
     esac
     ;;
-  mips*-*-linux*)
+  mips*-*-linux* | mips-sgi-irix*)
     case ${target} in
-      mips*-*-linux*)
+      mips*-*-linux* | mips-sgi-irix*)
        host_extra_gcc_objs="driver-native.o"
        host_xmake_file="${host_xmake_file} mips/x-native"
       ;;
index 1947d7198622871c6f9f58775455a9b5a17758b6..ec5adf42867886c68d3594ed8512575701d099bc 100644 (file)
@@ -1,5 +1,5 @@
 /* Subroutines for the gcc driver.
-   Copyright (C) 2008 Free Software Foundation, Inc.
+   Copyright (C) 2008, 2011 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -22,6 +22,59 @@ along with GCC; see the file COPYING3.  If not see
 #include "coretypes.h"
 #include "tm.h"
 
+#ifdef __sgi__
+#include <invent.h>
+#include <sys/sbd.h>
+
+/* Cf. MIPS R10000 Microprocessor User Guide, Version 2.0, 14.13 Processor
+   Revision Identifier (PRId) Register (15).
+
+   http://techpubs.sgi.com/library/tpl/cgi-bin/getdoc.cgi/hdwr/bks/SGI_Developer/books/R10K_UM/sgi_html/t5.Ver.2.0.book_279.html  */
+
+static const struct cpu_types {
+  int impl;
+  const char *cpu;
+} cpu_types[] = {
+  { C0_IMP_R2000, "r2000" },
+  { C0_IMP_R3000, "r3000" },
+  { C0_IMP_R6000, "r6000" },
+  { C0_IMP_R4000, "r4000" },
+  { C0_IMP_R6000A, "r6000" },
+  { C0_IMP_R10000, "r10000" },
+  { C0_IMP_R12000, "r12000" },
+  { C0_IMP_R14000, "r14000" },
+  { C0_IMP_R8000,  "r8000" },
+  { C0_IMP_R4600,  "r4600" },
+  { C0_IMP_R4700,  "r4600" },
+  { C0_IMP_R4650,  "r4650" },
+  { C0_IMP_R5000,  "vr5000" },
+  { C0_IMP_RM7000, "rm7000" },
+  { C0_IMP_RM5271, "vr5000" },
+  { 0, 0 }
+};
+
+static int
+cputype (inventory_t *inv, void *arg)
+{
+  if (inv != NULL
+      && inv->inv_class == INV_PROCESSOR
+      && inv->inv_type == INV_CPUCHIP)
+    {
+      int i;
+      /* inv_state is the cpu revision number.  */
+      int impl = (inv->inv_state & C0_IMPMASK) >> C0_IMPSHIFT;
+
+      for (i = 0; cpu_types[i].cpu != NULL; i++)
+       if (cpu_types[i].impl == impl)
+         {
+           *((const char **) arg) = cpu_types[i].cpu;
+           break;
+         }
+    }
+  return 0;
+}
+#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 "arch" or "tune" as argument depending on if -march=native
@@ -39,8 +92,10 @@ const char *
 host_detect_local_cpu (int argc, const char **argv)
 {
   const char *cpu = NULL;
+#ifndef __sgi__
   char buf[128];
   FILE *f;
+#endif
   bool arch;
 
   if (argc < 1)
@@ -50,6 +105,9 @@ host_detect_local_cpu (int argc, const char **argv)
   if (!arch && strcmp (argv[0], "tune"))
     return NULL;
 
+#ifdef __sgi__
+  scaninvent (cputype, &cpu);
+#else
   f = fopen ("/proc/cpuinfo", "r");
   if (f == NULL)
     return NULL;
@@ -73,6 +131,7 @@ host_detect_local_cpu (int argc, const char **argv)
       }
 
   fclose (f);
+#endif
 
   if (cpu == NULL)
     return NULL;
index 6515dbfa78107dcb9bb5b0b9b65e151dd511fe14..7ab1f7864dd289c2375153bc22a225f7ad561d53 100644 (file)
@@ -27,13 +27,28 @@ along with GCC; see the file COPYING3.  If not see
 #undef MULTILIB_DEFAULTS
 #define MULTILIB_DEFAULTS { "mabi=n32" }
 
+/* -march=native handling only makes sense with compiler running on
+   a MIPS chip.  */
+#if defined(__mips__)
+extern const char *host_detect_local_cpu (int argc, const char **argv);
+# define EXTRA_SPEC_FUNCTIONS \
+  { "local_cpu_detect", host_detect_local_cpu },
+
+# define MARCH_MTUNE_NATIVE_SPECS                              \
+  " %{march=native:%<march=native %:local_cpu_detect(arch)}"   \
+  " %{mtune=native:%<mtune=native %:local_cpu_detect(tune)}"
+#else
+# define MARCH_MTUNE_NATIVE_SPECS ""
+#endif
+
 /* Force the default ABI onto the command line in order to make the specs
    easier to write.  */
 #undef DRIVER_SELF_SPECS
 #define DRIVER_SELF_SPECS                      \
   "%{!mabi=*: -mabi=n32}",                     \
   /* Configuration-independent MIPS rules.  */ \
-  BASE_DRIVER_SELF_SPECS
+  BASE_DRIVER_SELF_SPECS,                      \
+  MARCH_MTUNE_NATIVE_SPECS
 
 /* IRIX 6.5 has the float and long double forms of math functions.  */
 #define TARGET_C99_FUNCTIONS 1