|
Lines 23-28
along with GCC; see the file COPYING3. If not see
Link Here
|
| 23 |
#include "system.h" |
23 |
#include "system.h" |
| 24 |
#include "coretypes.h" |
24 |
#include "coretypes.h" |
| 25 |
#include "tm.h" |
25 |
#include "tm.h" |
|
|
26 |
#include "diagnostic.h" |
| 27 |
#include "opts.h" |
| 26 |
#include <stdlib.h> |
28 |
#include <stdlib.h> |
| 27 |
|
29 |
|
| 28 |
#ifdef _AIX |
30 |
#ifdef _AIX |
|
Lines 38-43
along with GCC; see the file COPYING3. If not see
Link Here
|
| 38 |
# include <sys/sysctl.h> |
40 |
# include <sys/sysctl.h> |
| 39 |
#endif |
41 |
#endif |
| 40 |
|
42 |
|
|
|
43 |
#ifdef __linux__ |
| 44 |
/* Canonical GCC cpu name table. */ |
| 45 |
static const char *rs6000_supported_cpu_names[] = |
| 46 |
{ |
| 47 |
#define RS6000_CPU(NAME, CPU, FLAGS) NAME, |
| 48 |
#include "powerpcspe-cpus.def" |
| 49 |
#undef RS6000_CPU |
| 50 |
}; |
| 51 |
|
| 52 |
/* This table holds a list of cpus where their Linux AT_PLATFORM name differs |
| 53 |
from their GCC canonical name. The first column in a row contains the GCC |
| 54 |
canonical cpu name and the other columns in that row contain AT_PLATFORM |
| 55 |
names that should be mapped to the canonical name. */ |
| 56 |
|
| 57 |
static const char *linux_cpu_translation_table[][4] = { |
| 58 |
{ "403", "ppc403", NULL }, |
| 59 |
{ "405", "ppc405", NULL }, |
| 60 |
{ "440", "ppc440", "ppc440gp", NULL }, |
| 61 |
{ "476", "ppc470", NULL }, |
| 62 |
{ "601", "ppc601", NULL }, |
| 63 |
{ "603", "ppc603", NULL }, |
| 64 |
{ "604", "ppc604", NULL }, |
| 65 |
{ "7400", "ppc7400", NULL }, |
| 66 |
{ "7450", "ppc7450", NULL }, |
| 67 |
{ "750", "ppc750", NULL }, |
| 68 |
{ "823", "ppc823", NULL }, |
| 69 |
{ "8540", "ppc8540", NULL }, |
| 70 |
{ "8548", "ppc8548", NULL }, |
| 71 |
{ "970", "ppc970", NULL }, |
| 72 |
{ "cell", "ppc-cell-be", NULL }, |
| 73 |
{ "e500mc", "ppce500mc", NULL }, |
| 74 |
{ "e5500", "ppce5500", NULL }, |
| 75 |
{ "e6500", "ppce6500", NULL }, |
| 76 |
{ "power7", "power7+", NULL }, |
| 77 |
{ NULL } /* End of table sentinel. */ |
| 78 |
}; |
| 79 |
#endif |
| 80 |
|
| 41 |
const char *host_detect_local_cpu (int argc, const char **argv); |
81 |
const char *host_detect_local_cpu (int argc, const char **argv); |
| 42 |
|
82 |
|
| 43 |
#if GCC_VERSION >= 0 |
83 |
#if GCC_VERSION >= 0 |
|
Lines 158-171
detect_processor_freebsd (void)
Link Here
|
| 158 |
|
198 |
|
| 159 |
#ifdef __linux__ |
199 |
#ifdef __linux__ |
| 160 |
|
200 |
|
| 161 |
/* Returns AT_PLATFORM if present, otherwise generic PowerPC. */ |
201 |
/* Returns the canonical AT_PLATFORM if present, otherwise NULL. */ |
| 162 |
|
202 |
|
| 163 |
static const char * |
203 |
static const char * |
| 164 |
elf_platform (void) |
204 |
elf_platform (void) |
| 165 |
{ |
205 |
{ |
| 166 |
int fd; |
206 |
/* Used to cache the result we determine below. */ |
|
|
207 |
static const char *cpu = NULL; |
| 167 |
|
208 |
|
| 168 |
fd = open ("/proc/self/auxv", O_RDONLY); |
209 |
/* Use the cached AT_PLATFORM cpu name if we've already determined it. */ |
|
|
210 |
if (cpu != NULL) |
| 211 |
return cpu; |
| 212 |
|
| 213 |
int fd = open ("/proc/self/auxv", O_RDONLY); |
| 169 |
|
214 |
|
| 170 |
if (fd != -1) |
215 |
if (fd != -1) |
| 171 |
{ |
216 |
{ |
|
Lines 179-193
elf_platform (void)
Link Here
|
| 179 |
if (n > 0) |
224 |
if (n > 0) |
| 180 |
{ |
225 |
{ |
| 181 |
for (av = (ElfW(auxv_t) *) buf; av->a_type != AT_NULL; ++av) |
226 |
for (av = (ElfW(auxv_t) *) buf; av->a_type != AT_NULL; ++av) |
| 182 |
switch (av->a_type) |
227 |
if (av->a_type == AT_PLATFORM) |
| 183 |
{ |
228 |
{ |
| 184 |
case AT_PLATFORM: |
229 |
/* Cache the result. */ |
| 185 |
return (const char *) av->a_un.a_val; |
230 |
cpu = (const char *) av->a_un.a_val; |
| 186 |
|
|
|
| 187 |
default: |
| 188 |
break; |
231 |
break; |
| 189 |
} |
232 |
} |
| 190 |
} |
233 |
} |
|
|
234 |
|
| 235 |
/* Verify that CPU is either a valid -mcpu=<cpu> option name, or is a |
| 236 |
valid alternative name. If it is a valid alternative name, then use |
| 237 |
the canonical name. */ |
| 238 |
if (cpu != NULL) |
| 239 |
{ |
| 240 |
size_t i, j; |
| 241 |
char *s; |
| 242 |
|
| 243 |
/* Check if AT_PLATFORM is a GCC canonical cpu name. */ |
| 244 |
for (i = 0; i < ARRAY_SIZE (rs6000_supported_cpu_names); i++) |
| 245 |
if (!strcmp (cpu, rs6000_supported_cpu_names[i])) |
| 246 |
return cpu; |
| 247 |
|
| 248 |
/* Check if AT_PLATFORM can be translated to a canonical cpu name. */ |
| 249 |
for (i = 0; linux_cpu_translation_table[i][0] != NULL; i++) |
| 250 |
{ |
| 251 |
const char *canonical = linux_cpu_translation_table[i][0]; |
| 252 |
for (j = 1; linux_cpu_translation_table[i][j] != NULL; j++) |
| 253 |
if (!strcmp (cpu, linux_cpu_translation_table[i][j])) |
| 254 |
{ |
| 255 |
/* Cache the result. */ |
| 256 |
cpu = canonical; |
| 257 |
return cpu; |
| 258 |
} |
| 259 |
} |
| 260 |
|
| 261 |
/* The kernel returned an AT_PLATFORM name we do not support. */ |
| 262 |
auto_vec <const char *> candidates; |
| 263 |
for (i = 0; i < ARRAY_SIZE (rs6000_supported_cpu_names); i++) |
| 264 |
candidates.safe_push (rs6000_supported_cpu_names[i]); |
| 265 |
candidates_list_and_hint (cpu, s, candidates); |
| 266 |
fatal_error ( |
| 267 |
input_location, |
| 268 |
"Unsupported cpu name returned from kernel for -mcpu=native: %s\n" |
| 269 |
"Please use an explicit cpu name. Valid cpu names are: %s", |
| 270 |
cpu, s); |
| 271 |
} |
| 191 |
} |
272 |
} |
| 192 |
return NULL; |
273 |
return NULL; |
| 193 |
} |
274 |
} |
| 194 |
- |
|
|