I had long meant to support -mcpu=native on my targets.  Now I finally
got around to implementing it.

The following patch does so for -mcpu=native/-mtune=native on Tru64
UNIX, using getsysinfo(2).  A non-bootstrap C-only build is currently
running, the options above work as expected.

Ok for mainline if it passes?

Thanks.
        Rainer


2011-07-26  Rainer Orth  <r...@cebitec.uni-bielefeld.de>

        * config/alpha/driver-alpha.c [__osf__]: Include <sys/sysinfo.h>,
        <machine/hal_sysinfo.h>.
        (host_detect_local_cpu) [__osf__]: Define cpu_types[], ret, cpu_type.
        Use getsysinfo to detect processor type.
        * config.host: Also use driver-alpha.o, alpha/x-alpha on
        alpha*-dec-osf*.
        * config/alpha/osf5.h [__alpha__ || __alpha]
        (host_detect_local_cpu): Declare.
        (EXTRA_SPEC_FUNCTIONS, MCPU_MTUNE_NATIVE_SPECS)
        (DRIVER_SELF_SPECS): Define.

diff --git a/gcc/config.host b/gcc/config.host
--- a/gcc/config.host
+++ b/gcc/config.host
@@ -100,9 +100,9 @@ case ${host} in
 esac
 
 case ${host} in
-  alpha*-*-linux*)
+  alpha*-*-linux* | alpha*-dec-osf*)
     case ${target} in
-      alpha*-*-linux*)
+      alpha*-*-linux* | alpha*-dec-osf*)
        host_extra_gcc_objs="driver-alpha.o"
        host_xmake_file="${host_xmake_file} alpha/x-alpha"
        ;;
diff --git a/gcc/config/alpha/driver-alpha.c b/gcc/config/alpha/driver-alpha.c
--- a/gcc/config/alpha/driver-alpha.c
+++ b/gcc/config/alpha/driver-alpha.c
@@ -1,5 +1,5 @@
 /* Subroutines for the gcc driver.
-   Copyright (C) 2009 Free Software Foundation, Inc.
+   Copyright (C) 2009, 2011 Free Software Foundation, Inc.
    Contributed by Arthur Loiret <aloi...@debian.org>
 
 This file is part of GCC.
@@ -23,6 +23,11 @@ along with GCC; see the file COPYING3.  
 #include "coretypes.h"
 #include "tm.h"
 
+#ifdef __osf__
+#include <sys/sysinfo.h>
+#include <machine/hal_sysinfo.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
@@ -40,9 +45,31 @@ const char *
 host_detect_local_cpu (int argc, const char **argv)
 {
   const char *cpu = NULL;
-  char buf[128];
-  FILE *f;
 
+#ifdef __osf__
+  static const char *const cpu_types[] = {
+    0,
+    "ev3",     /* EV3_CPU */
+    "ev4",     /* EV4_CPU */
+    0,
+    "ev4",     /* LCA4_CPU */
+    "ev5",     /* EV5_CPU */
+    "ev45",    /* EV45_CPU */
+    "ev56",    /* EV56_CPU */
+    "ev6",     /* EV6_CPU */
+    "pca56",   /* PCA56_CPU */
+    "pca56",   /* PCA57_CPU */
+    "ev67",    /* EV67_CPU */
+    "ev67",    /* EV68CB_CPU */
+    "ev67",    /* EV68AL_CPU */
+    "ev67",    /* EV68CX_CPU */
+    "ev67",    /* EV7_CPU */
+    "ev67"     /* EV79_CPU */
+    "ev67",    /* EV69A_CPU */
+  };
+  int ret;
+  long cpu_type;
+#else
   static const struct cpu_names {
    const char *const name;
    const char *const cpu;
@@ -66,6 +93,9 @@ host_detect_local_cpu (int argc, const c
 /*  { "EV3",   "ev3" },  */
     { 0, 0 }
   };
+  char buf[128];
+  FILE *f;
+#endif
 
   int i;
 
@@ -75,6 +105,17 @@ host_detect_local_cpu (int argc, const c
   if (strcmp (argv[0], "cpu") && strcmp (argv[0], "tune"))
     return NULL;
 
+#ifdef __osf__
+  ret = getsysinfo (GSI_PROC_TYPE, (caddr_t) &cpu_type, sizeof (cpu_type),
+                   NULL, NULL, NULL);
+
+  if (ret == 1)
+    /* Processor type is only returned in the lower 32 bits of cpu_type.  */
+    cpu_type &= 0xffff;
+
+  if (cpu_type > 0 && cpu_type <= sizeof (cpu_types) / sizeof (cpu_types[0]))
+    cpu = cpu_types[cpu_type];
+#else
   f = fopen ("/proc/cpuinfo", "r");
   if (f == NULL)
     return NULL;
@@ -92,6 +133,7 @@ host_detect_local_cpu (int argc, const c
       }
 
   fclose (f);
+#endif
 
   if (cpu == NULL)
     return NULL;
diff --git a/gcc/config/alpha/osf5.h b/gcc/config/alpha/osf5.h
--- a/gcc/config/alpha/osf5.h
+++ b/gcc/config/alpha/osf5.h
@@ -80,6 +80,22 @@ along with GCC; see the file COPYING3.  
 #define CPP_SPEC \
 "%{pthread|threads:-D_REENTRANT} %{threads:-D_PTHREAD_USE_D4}"
 
+/* -mcpu=native handling only makes sense with compiler running on
+   an Alpha chip.  */
+#if defined(__alpha__) || defined(__alpha)
+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
+
 /* Under DEC OSF/1 V4, -p and -pg require -lprof1, and -lprof1 requires 
    -lpdf.  */
 
-- 
-----------------------------------------------------------------------------
Rainer Orth, Center for Biotechnology, Bielefeld University

Reply via email to