1 1.1 mrg /* Subroutines for the gcc driver. 2 1.1 mrg Copyright (C) 2007-2022 Free Software Foundation, Inc. 3 1.1 mrg 4 1.1 mrg This file is part of GCC. 5 1.1 mrg 6 1.1 mrg GCC is free software; you can redistribute it and/or modify 7 1.1 mrg it under the terms of the GNU General Public License as published by 8 1.1 mrg the Free Software Foundation; either version 3, or (at your option) 9 1.1 mrg any later version. 10 1.1 mrg 11 1.1 mrg GCC is distributed in the hope that it will be useful, 12 1.1 mrg but WITHOUT ANY WARRANTY; without even the implied warranty of 13 1.1 mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 1.1 mrg GNU General Public License for more details. 15 1.1 mrg 16 1.1 mrg You should have received a copy of the GNU General Public License 17 1.1 mrg along with GCC; see the file COPYING3. If not see 18 1.1 mrg <http://www.gnu.org/licenses/>. */ 19 1.1 mrg 20 1.1 mrg #define IN_TARGET_CODE 1 21 1.1 mrg 22 1.1 mrg #include "config.h" 23 1.1 mrg #include "system.h" 24 1.1 mrg #include "coretypes.h" 25 1.1 mrg #include "tm.h" 26 1.1 mrg #include "diagnostic.h" 27 1.1 mrg #include "opts.h" 28 1.1 mrg #include <stdlib.h> 29 1.1 mrg 30 1.1 mrg #ifdef _AIX 31 1.1 mrg # include <sys/systemcfg.h> 32 1.1 mrg #endif 33 1.1 mrg 34 1.1 mrg #ifdef __linux__ 35 1.1 mrg # include <link.h> 36 1.1 mrg #endif 37 1.1 mrg 38 1.1 mrg #if defined (__APPLE__) || (__FreeBSD__) 39 1.1 mrg # include <sys/types.h> 40 1.1 mrg # include <sys/sysctl.h> 41 1.1 mrg #endif 42 1.1 mrg 43 1.1 mrg #ifdef __linux__ 44 1.1 mrg /* Canonical GCC cpu name table. */ 45 1.1 mrg static const char *rs6000_supported_cpu_names[] = 46 1.1 mrg { 47 1.1 mrg #define RS6000_CPU(NAME, CPU, FLAGS) NAME, 48 1.1 mrg #include "rs6000-cpus.def" 49 1.1 mrg #undef RS6000_CPU 50 1.1 mrg }; 51 1.1 mrg 52 1.1 mrg /* This table holds a list of cpus where their Linux AT_PLATFORM name differs 53 1.1 mrg from their GCC canonical name. The first column in a row contains the GCC 54 1.1 mrg canonical cpu name and the other columns in that row contain AT_PLATFORM 55 1.1 mrg names that should be mapped to the canonical name. */ 56 1.1 mrg 57 1.1 mrg static const char *linux_cpu_translation_table[][4] = { 58 1.1 mrg { "403", "ppc403", NULL }, 59 1.1 mrg { "405", "ppc405", NULL }, 60 1.1 mrg { "440", "ppc440", "ppc440gp", NULL }, 61 1.1 mrg { "476", "ppc470", NULL }, 62 1.1 mrg { "601", "ppc601", NULL }, 63 1.1 mrg { "603", "ppc603", NULL }, 64 1.1 mrg { "604", "ppc604", NULL }, 65 1.1 mrg { "7400", "ppc7400", NULL }, 66 1.1 mrg { "7450", "ppc7450", NULL }, 67 1.1 mrg { "750", "ppc750", NULL }, 68 1.1 mrg { "823", "ppc823", NULL }, 69 1.1 mrg { "8540", "ppc8540", NULL }, 70 1.1 mrg { "8548", "ppc8548", NULL }, 71 1.1 mrg { "970", "ppc970", NULL }, 72 1.1 mrg { "cell", "ppc-cell-be", NULL }, 73 1.1 mrg { "e500mc", "ppce500mc", NULL }, 74 1.1 mrg { "e5500", "ppce5500", NULL }, 75 1.1 mrg { "e6500", "ppce6500", NULL }, 76 1.1 mrg { "power7", "power7+", NULL }, 77 1.1 mrg { NULL } /* End of table sentinel. */ 78 1.1 mrg }; 79 1.1 mrg #endif 80 1.1 mrg 81 1.1 mrg const char *host_detect_local_cpu (int argc, const char **argv); 82 1.1 mrg 83 1.1 mrg #if GCC_VERSION >= 0 84 1.1 mrg 85 1.1 mrg /* Returns parameters that describe L1_ASSOC associative cache of size 86 1.1 mrg L1_SIZEKB with lines of size L1_LINE, and L2_SIZEKB. */ 87 1.1 mrg 88 1.1 mrg static char * 89 1.1 mrg describe_cache (unsigned l1_sizekb, unsigned l1_line, 90 1.1 mrg unsigned l1_assoc ATTRIBUTE_UNUSED, unsigned l2_sizekb) 91 1.1 mrg { 92 1.1 mrg char l1size[1000], line[1000], l2size[1000]; 93 1.1 mrg 94 1.1 mrg /* At the moment, gcc middle-end does not use the information about the 95 1.1 mrg associativity of the cache. */ 96 1.1 mrg 97 1.1 mrg sprintf (l1size, "--param l1-cache-size=%u", l1_sizekb); 98 1.1 mrg sprintf (line, "--param l1-cache-line-size=%u", l1_line); 99 1.1 mrg sprintf (l2size, "--param l2-cache-size=%u", l2_sizekb); 100 1.1 mrg 101 1.1 mrg return concat (l1size, " ", line, " ", l2size, " ", NULL); 102 1.1 mrg } 103 1.1 mrg 104 1.1 mrg #ifdef __APPLE__ 105 1.1 mrg 106 1.1 mrg /* Returns the description of caches on Darwin. */ 107 1.1 mrg 108 1.1 mrg static char * 109 1.1 mrg detect_caches_darwin (void) 110 1.1 mrg { 111 1.1 mrg unsigned l1_sizekb, l1_line, l1_assoc, l2_sizekb; 112 1.1 mrg size_t len = 4; 113 1.1 mrg static int l1_size_name[2] = { CTL_HW, HW_L1DCACHESIZE }; 114 1.1 mrg static int l1_line_name[2] = { CTL_HW, HW_CACHELINE }; 115 1.1 mrg static int l2_size_name[2] = { CTL_HW, HW_L2CACHESIZE }; 116 1.1 mrg 117 1.1 mrg sysctl (l1_size_name, 2, &l1_sizekb, &len, NULL, 0); 118 1.1 mrg sysctl (l1_line_name, 2, &l1_line, &len, NULL, 0); 119 1.1 mrg sysctl (l2_size_name, 2, &l2_sizekb, &len, NULL, 0); 120 1.1 mrg l1_assoc = 0; 121 1.1 mrg 122 1.1 mrg return describe_cache (l1_sizekb / 1024, l1_line, l1_assoc, 123 1.1 mrg l2_sizekb / 1024); 124 1.1 mrg } 125 1.1 mrg 126 1.1 mrg static const char * 127 1.1 mrg detect_processor_darwin (void) 128 1.1 mrg { 129 1.1 mrg unsigned int proc; 130 1.1 mrg size_t len = 4; 131 1.1 mrg 132 1.1 mrg sysctlbyname ("hw.cpusubtype", &proc, &len, NULL, 0); 133 1.1 mrg 134 1.1 mrg if (len > 0) 135 1.1 mrg switch (proc) 136 1.1 mrg { 137 1.1 mrg case 1: 138 1.1 mrg return "601"; 139 1.1 mrg case 2: 140 1.1 mrg return "602"; 141 1.1 mrg case 3: 142 1.1 mrg return "603"; 143 1.1 mrg case 4: 144 1.1 mrg case 5: 145 1.1 mrg return "603e"; 146 1.1 mrg case 6: 147 1.1 mrg return "604"; 148 1.1 mrg case 7: 149 1.1 mrg return "604e"; 150 1.1 mrg case 8: 151 1.1 mrg return "620"; 152 1.1 mrg case 9: 153 1.1 mrg return "750"; 154 1.1 mrg case 10: 155 1.1 mrg return "7400"; 156 1.1 mrg case 11: 157 1.1 mrg return "7450"; 158 1.1 mrg case 100: 159 1.1 mrg return "970"; 160 1.1 mrg default: 161 1.1 mrg return "powerpc"; 162 1.1 mrg } 163 1.1 mrg 164 1.1 mrg return "powerpc"; 165 1.1 mrg } 166 1.1 mrg 167 1.1 mrg #endif /* __APPLE__ */ 168 1.1 mrg 169 1.1 mrg #ifdef __FreeBSD__ 170 1.1 mrg 171 1.1 mrg /* Returns the description of caches on FreeBSD PPC. */ 172 1.1 mrg 173 1.1 mrg static char * 174 1.1 mrg detect_caches_freebsd (void) 175 1.1 mrg { 176 1.1 mrg unsigned l1_sizekb, l1_line, l1_assoc, l2_sizekb; 177 1.1 mrg size_t len = 4; 178 1.1 mrg 179 1.1 mrg /* Currently, as of FreeBSD-7.0, there is only the cacheline_size 180 1.1 mrg available via sysctl. */ 181 1.1 mrg sysctlbyname ("machdep.cacheline_size", &l1_line, &len, NULL, 0); 182 1.1 mrg 183 1.1 mrg l1_sizekb = 32; 184 1.1 mrg l1_assoc = 0; 185 1.1 mrg l2_sizekb = 512; 186 1.1 mrg 187 1.1 mrg return describe_cache (l1_sizekb, l1_line, l1_assoc, l2_sizekb); 188 1.1 mrg } 189 1.1 mrg 190 1.1 mrg /* Currently returns default powerpc. */ 191 1.1 mrg static const char * 192 1.1 mrg detect_processor_freebsd (void) 193 1.1 mrg { 194 1.1 mrg return "powerpc"; 195 1.1 mrg } 196 1.1 mrg 197 1.1 mrg #endif /* __FreeBSD__ */ 198 1.1 mrg 199 1.1 mrg #ifdef __linux__ 200 1.1 mrg 201 1.1 mrg /* Returns the canonical AT_PLATFORM if present, otherwise NULL. */ 202 1.1 mrg 203 1.1 mrg static const char * 204 1.1 mrg elf_platform (void) 205 1.1 mrg { 206 1.1 mrg /* Used to cache the result we determine below. */ 207 1.1 mrg static const char *cpu = NULL; 208 1.1 mrg 209 1.1 mrg /* Use the cached AT_PLATFORM cpu name if we've already determined it. */ 210 1.1 mrg if (cpu != NULL) 211 1.1 mrg return cpu; 212 1.1 mrg 213 1.1 mrg int fd = open ("/proc/self/auxv", O_RDONLY); 214 1.1 mrg 215 1.1 mrg if (fd != -1) 216 1.1 mrg { 217 1.1 mrg char buf[1024]; 218 1.1 mrg ElfW(auxv_t) *av; 219 1.1 mrg ssize_t n; 220 1.1 mrg 221 1.1 mrg n = read (fd, buf, sizeof (buf)); 222 1.1 mrg close (fd); 223 1.1 mrg 224 1.1 mrg if (n > 0) 225 1.1 mrg { 226 1.1 mrg for (av = (ElfW(auxv_t) *) buf; av->a_type != AT_NULL; ++av) 227 1.1 mrg if (av->a_type == AT_PLATFORM) 228 1.1 mrg { 229 1.1 mrg /* Cache the result. */ 230 1.1 mrg cpu = (const char *) av->a_un.a_val; 231 1.1 mrg break; 232 1.1 mrg } 233 1.1 mrg } 234 1.1 mrg 235 1.1 mrg /* Verify that CPU is either a valid -mcpu=<cpu> option name, or is a 236 1.1 mrg valid alternative name. If it is a valid alternative name, then use 237 1.1 mrg the canonical name. */ 238 1.1 mrg if (cpu != NULL) 239 1.1 mrg { 240 1.1 mrg size_t i, j; 241 1.1 mrg char *s; 242 1.1 mrg 243 1.1 mrg /* Check if AT_PLATFORM is a GCC canonical cpu name. */ 244 1.1 mrg for (i = 0; i < ARRAY_SIZE (rs6000_supported_cpu_names); i++) 245 1.1 mrg if (!strcmp (cpu, rs6000_supported_cpu_names[i])) 246 1.1 mrg return cpu; 247 1.1 mrg 248 1.1 mrg /* Check if AT_PLATFORM can be translated to a canonical cpu name. */ 249 1.1 mrg for (i = 0; linux_cpu_translation_table[i][0] != NULL; i++) 250 1.1 mrg { 251 1.1 mrg const char *canonical = linux_cpu_translation_table[i][0]; 252 1.1 mrg for (j = 1; linux_cpu_translation_table[i][j] != NULL; j++) 253 1.1 mrg if (!strcmp (cpu, linux_cpu_translation_table[i][j])) 254 1.1 mrg { 255 1.1 mrg /* Cache the result. */ 256 1.1 mrg cpu = canonical; 257 1.1 mrg return cpu; 258 1.1 mrg } 259 1.1 mrg } 260 1.1 mrg 261 1.1 mrg /* The kernel returned an AT_PLATFORM name we do not support. */ 262 1.1 mrg auto_vec <const char *> candidates; 263 1.1 mrg for (i = 0; i < ARRAY_SIZE (rs6000_supported_cpu_names); i++) 264 1.1 mrg candidates.safe_push (rs6000_supported_cpu_names[i]); 265 1.1 mrg candidates_list_and_hint (cpu, s, candidates); 266 1.1 mrg error ("unsupported cpu name returned from kernel " 267 1.1 mrg "for %<-mcpu=native%>: %s", cpu); 268 1.1 mrg fatal_error (input_location, "please use an explicit cpu name; " 269 1.1 mrg "valid cpu names are: %s", s); 270 1.1 mrg } 271 1.1 mrg } 272 1.1 mrg return NULL; 273 1.1 mrg } 274 1.1 mrg 275 1.1 mrg /* Returns AT_DCACHEBSIZE if present, otherwise generic 32. */ 276 1.1 mrg 277 1.1 mrg static int 278 1.1 mrg elf_dcachebsize (void) 279 1.1 mrg { 280 1.1 mrg int fd; 281 1.1 mrg 282 1.1 mrg fd = open ("/proc/self/auxv", O_RDONLY); 283 1.1 mrg 284 1.1 mrg if (fd != -1) 285 1.1 mrg { 286 1.1 mrg char buf[1024]; 287 1.1 mrg ElfW(auxv_t) *av; 288 1.1 mrg ssize_t n; 289 1.1 mrg 290 1.1 mrg n = read (fd, buf, sizeof (buf)); 291 1.1 mrg close (fd); 292 1.1 mrg 293 1.1 mrg if (n > 0) 294 1.1 mrg { 295 1.1 mrg for (av = (ElfW(auxv_t) *) buf; av->a_type != AT_NULL; ++av) 296 1.1 mrg switch (av->a_type) 297 1.1 mrg { 298 1.1 mrg case AT_DCACHEBSIZE: 299 1.1 mrg return av->a_un.a_val; 300 1.1 mrg 301 1.1 mrg default: 302 1.1 mrg break; 303 1.1 mrg } 304 1.1 mrg } 305 1.1 mrg } 306 1.1 mrg return 32; 307 1.1 mrg } 308 1.1 mrg 309 1.1 mrg /* Returns the description of caches on Linux. */ 310 1.1 mrg 311 1.1 mrg static char * 312 1.1 mrg detect_caches_linux (void) 313 1.1 mrg { 314 1.1 mrg unsigned l1_sizekb, l1_line, l1_assoc, l2_sizekb; 315 1.1 mrg const char *platform; 316 1.1 mrg 317 1.1 mrg platform = elf_platform (); 318 1.1 mrg 319 1.1 mrg if (platform != NULL) 320 1.1 mrg { 321 1.1 mrg l1_line = 128; 322 1.1 mrg 323 1.1 mrg if (platform[5] == '6') 324 1.1 mrg /* POWER6 and POWER6x */ 325 1.1 mrg l1_sizekb = 64; 326 1.1 mrg else 327 1.1 mrg l1_sizekb = 32; 328 1.1 mrg } 329 1.1 mrg else 330 1.1 mrg { 331 1.1 mrg l1_line = elf_dcachebsize (); 332 1.1 mrg l1_sizekb = 32; 333 1.1 mrg } 334 1.1 mrg 335 1.1 mrg l1_assoc = 0; 336 1.1 mrg l2_sizekb = 512; 337 1.1 mrg 338 1.1 mrg return describe_cache (l1_sizekb, l1_line, l1_assoc, l2_sizekb); 339 1.1 mrg } 340 1.1 mrg 341 1.1 mrg static const char * 342 1.1 mrg detect_processor_linux (void) 343 1.1 mrg { 344 1.1 mrg const char *platform; 345 1.1 mrg 346 1.1 mrg platform = elf_platform (); 347 1.1 mrg 348 1.1 mrg if (platform != NULL) 349 1.1 mrg return platform; 350 1.1 mrg else 351 1.1 mrg return "powerpc"; 352 1.1 mrg } 353 1.1 mrg 354 1.1 mrg #endif /* __linux__ */ 355 1.1 mrg 356 1.1 mrg #ifdef _AIX 357 1.1 mrg /* Returns the description of caches on AIX. */ 358 1.1 mrg 359 1.1 mrg static char * 360 1.1 mrg detect_caches_aix (void) 361 1.1 mrg { 362 1.1 mrg unsigned l1_sizekb, l1_line, l1_assoc, l2_sizekb; 363 1.1 mrg 364 1.1 mrg l1_sizekb = _system_configuration.dcache_size / 1024; 365 1.1 mrg l1_line = _system_configuration.dcache_line; 366 1.1 mrg l1_assoc = _system_configuration.dcache_asc; 367 1.1 mrg l2_sizekb = _system_configuration.L2_cache_size / 1024; 368 1.1 mrg 369 1.1 mrg return describe_cache (l1_sizekb, l1_line, l1_assoc, l2_sizekb); 370 1.1 mrg } 371 1.1 mrg 372 1.1 mrg 373 1.1 mrg /* Returns the processor implementation on AIX. */ 374 1.1 mrg 375 1.1 mrg static const char * 376 1.1 mrg detect_processor_aix (void) 377 1.1 mrg { 378 1.1 mrg switch (_system_configuration.implementation) 379 1.1 mrg { 380 1.1 mrg case 0x0008: 381 1.1 mrg return "601"; 382 1.1 mrg 383 1.1 mrg case 0x0020: 384 1.1 mrg return "603"; 385 1.1 mrg 386 1.1 mrg case 0x0010: 387 1.1 mrg return "604"; 388 1.1 mrg 389 1.1 mrg case 0x0040: 390 1.1 mrg return "620"; 391 1.1 mrg 392 1.1 mrg case 0x0080: 393 1.1 mrg return "630"; 394 1.1 mrg 395 1.1 mrg case 0x0100: 396 1.1 mrg case 0x0200: 397 1.1 mrg case 0x0400: 398 1.1 mrg return "rs64"; 399 1.1 mrg 400 1.1 mrg case 0x0800: 401 1.1 mrg return "power4"; 402 1.1 mrg 403 1.1 mrg case 0x2000: 404 1.1 mrg if (_system_configuration.version == 0x0F0000) 405 1.1 mrg return "power5"; 406 1.1 mrg else 407 1.1 mrg return "power5+"; 408 1.1 mrg 409 1.1 mrg case 0x4000: 410 1.1 mrg return "power6"; 411 1.1 mrg 412 1.1 mrg case 0x8000: 413 1.1 mrg return "power7"; 414 1.1 mrg 415 1.1 mrg case 0x10000: 416 1.1 mrg return "power8"; 417 1.1 mrg 418 1.1 mrg case 0x20000: 419 1.1 mrg return "power9"; 420 1.1 mrg 421 1.1 mrg case 0x40000: 422 1.1 mrg return "power10"; 423 1.1 mrg 424 1.1 mrg default: 425 1.1 mrg return "powerpc"; 426 1.1 mrg } 427 1.1 mrg } 428 1.1 mrg #endif /* _AIX */ 429 1.1 mrg 430 1.1 mrg 431 1.1 mrg /* 432 1.1 mrg * Array to map -mcpu=native names to the switches passed to the assembler. 433 1.1 mrg * This list mirrors the specs in ASM_CPU_SPEC, and any changes made here 434 1.1 mrg * should be made there as well. 435 1.1 mrg */ 436 1.1 mrg 437 1.1 mrg struct asm_name { 438 1.1 mrg const char *cpu; 439 1.1 mrg const char *asm_sw; 440 1.1 mrg }; 441 1.1 mrg 442 1.1 mrg static const struct asm_name asm_names[] = { 443 1.1 mrg #if defined (_AIX) 444 1.1 mrg { "power3", "-m620" }, 445 1.1 mrg { "power4", "-mpwr4" }, 446 1.1 mrg { "power5", "-mpwr5" }, 447 1.1 mrg { "power5+", "-mpwr5x" }, 448 1.1 mrg { "power6", "-mpwr6" }, 449 1.1 mrg { "power6x", "-mpwr6" }, 450 1.1 mrg { "power7", "-mpwr7" }, 451 1.1 mrg { "power8", "-mpwr8" }, 452 1.1 mrg { "power9", "-mpwr9" }, 453 1.1 mrg { "power10", "-mpwr10" }, 454 1.1 mrg { "powerpc", "-mppc" }, 455 1.1 mrg { "rs64", "-mppc" }, 456 1.1 mrg { "603", "-m603" }, 457 1.1 mrg { "603e", "-m603" }, 458 1.1 mrg { "604", "-m604" }, 459 1.1 mrg { "604e", "-m604" }, 460 1.1 mrg { "620", "-m620" }, 461 1.1 mrg { "630", "-m620" }, 462 1.1 mrg { "970", "-m970" }, 463 1.1 mrg { "G5", "-m970" }, 464 1.1 mrg { NULL, "\ 465 1.1 mrg %{mvsx: -mpwr6; \ 466 1.1 mrg maltivec: -m970; \ 467 1.1 mrg maix64|mpowerpc64: -mppc64; \ 468 1.1 mrg : %(asm_default)}" }, 469 1.1 mrg 470 1.1 mrg #else 471 1.1 mrg { "cell", "-mcell" }, 472 1.1 mrg { "power3", "-mppc64" }, 473 1.1 mrg { "power4", "-mpower4" }, 474 1.1 mrg { "power5", "-mpower5" }, 475 1.1 mrg { "power5+", "-mpower5" }, 476 1.1 mrg { "power6", "-mpower6 %{!mvsx:%{!maltivec:-maltivec}}" }, 477 1.1 mrg { "power6x", "-mpower6 %{!mvsx:%{!maltivec:-maltivec}}" }, 478 1.1 mrg { "power7", "-mpower7" }, 479 1.1 mrg { "power8", "%{mpower9-vector:-mpower9;:-mpower8}" }, 480 1.1 mrg { "power9", "-mpower9" }, 481 1.1 mrg { "power10", "-mpower10" }, 482 1.1 mrg { "a2", "-ma2" }, 483 1.1 mrg { "powerpc", "-mppc" }, 484 1.1 mrg { "powerpc64", "-mppc64" }, 485 1.1 mrg { "powerpc64le", "%{mpower9-vector:-mpower9;:-mpower8}" }, 486 1.1 mrg { "rs64", "-mppc64" }, 487 1.1 mrg { "401", "-mppc" }, 488 1.1 mrg { "403", "-m403" }, 489 1.1 mrg { "405", "-m405" }, 490 1.1 mrg { "405fp", "-m405" }, 491 1.1 mrg { "440", "-m440" }, 492 1.1 mrg { "440fp", "-m440" }, 493 1.1 mrg { "464", "-m440" }, 494 1.1 mrg { "464fp", "-m440" }, 495 1.1 mrg { "476", "-m476" }, 496 1.1 mrg { "476fp", "-m476" }, 497 1.1 mrg { "505", "-mppc" }, 498 1.1 mrg { "601", "-m601" }, 499 1.1 mrg { "602", "-mppc" }, 500 1.1 mrg { "603", "-mppc" }, 501 1.1 mrg { "603e", "-mppc" }, 502 1.1 mrg { "ec603e", "-mppc" }, 503 1.1 mrg { "604", "-mppc" }, 504 1.1 mrg { "604e", "-mppc" }, 505 1.1 mrg { "620", "-mppc64" }, 506 1.1 mrg { "630", "-mppc64" }, 507 1.1 mrg { "740", "-mppc" }, 508 1.1 mrg { "750", "-mppc" }, 509 1.1 mrg { "G3", "-mppc" }, 510 1.1 mrg { "7400", "-mppc %{!mvsx:%{!maltivec:-maltivec}}" }, 511 1.1 mrg { "7450", "-mppc %{!mvsx:%{!maltivec:-maltivec}}" }, 512 1.1 mrg { "G4", "-mppc %{!mvsx:%{!maltivec:-maltivec}}" }, 513 1.1 mrg { "801", "-mppc" }, 514 1.1 mrg { "821", "-mppc" }, 515 1.1 mrg { "823", "-mppc" }, 516 1.1 mrg { "860", "-mppc" }, 517 1.1 mrg { "970", "-mpower4 %{!mvsx:%{!maltivec:-maltivec}}" }, 518 1.1 mrg { "G5", "-mpower4 %{!mvsx:%{!maltivec:-maltivec}}" }, 519 1.1 mrg { "8540", "-me500" }, 520 1.1 mrg { "8548", "-me500" }, 521 1.1 mrg { "e300c2", "-me300" }, 522 1.1 mrg { "e300c3", "-me300" }, 523 1.1 mrg { "e500mc", "-me500mc" }, 524 1.1 mrg { "e500mc64", "-me500mc64" }, 525 1.1 mrg { "e5500", "-me5500" }, 526 1.1 mrg { "e6500", "-me6500" }, 527 1.1 mrg { "titan", "-mtitan" }, 528 1.1 mrg { NULL, "\ 529 1.1 mrg %{mpower9-vector: -mpower9; \ 530 1.1 mrg mpower8-vector|mcrypto|mdirect-move|mhtm: -mpower8; \ 531 1.1 mrg mvsx: -mpower7; \ 532 1.1 mrg mpowerpc64: -mppc64; \ 533 1.1 mrg : %(asm_default)}" }, 534 1.1 mrg #endif 535 1.1 mrg }; 536 1.1 mrg 537 1.1 mrg /* This will be called by the spec parser in gcc.cc when it sees 538 1.1 mrg a %:local_cpu_detect(args) construct. Currently it will be called 539 1.1 mrg with either "arch" or "tune" as argument depending on if -march=native 540 1.1 mrg or -mtune=native is to be substituted. 541 1.1 mrg 542 1.1 mrg Additionally it will be called with "asm" to select the appropriate flags 543 1.1 mrg for the assembler. 544 1.1 mrg 545 1.1 mrg It returns a string containing new command line parameters to be 546 1.1 mrg put at the place of the above two options, depending on what CPU 547 1.1 mrg this is executed. 548 1.1 mrg 549 1.1 mrg ARGC and ARGV are set depending on the actual arguments given 550 1.1 mrg in the spec. */ 551 1.1 mrg const char * 552 1.1 mrg host_detect_local_cpu (int argc, const char **argv) 553 1.1 mrg { 554 1.1 mrg const char *cpu = NULL; 555 1.1 mrg const char *cache = ""; 556 1.1 mrg const char *options = ""; 557 1.1 mrg bool arch; 558 1.1 mrg bool assembler; 559 1.1 mrg size_t i; 560 1.1 mrg 561 1.1 mrg if (argc < 1) 562 1.1 mrg return NULL; 563 1.1 mrg 564 1.1 mrg arch = strcmp (argv[0], "cpu") == 0; 565 1.1 mrg assembler = (!arch && strcmp (argv[0], "asm") == 0); 566 1.1 mrg if (!arch && !assembler && strcmp (argv[0], "tune")) 567 1.1 mrg return NULL; 568 1.1 mrg 569 1.1 mrg if (! assembler) 570 1.1 mrg { 571 1.1 mrg #if defined (_AIX) 572 1.1 mrg cache = detect_caches_aix (); 573 1.1 mrg #elif defined (__APPLE__) 574 1.1 mrg cache = detect_caches_darwin (); 575 1.1 mrg #elif defined (__FreeBSD__) 576 1.1 mrg cache = detect_caches_freebsd (); 577 1.1 mrg /* FreeBSD PPC does not provide any cache information yet. */ 578 1.1 mrg cache = ""; 579 1.1 mrg #elif defined (__linux__) 580 1.1 mrg cache = detect_caches_linux (); 581 1.1 mrg /* PPC Linux does not provide any cache information yet. */ 582 1.1 mrg cache = ""; 583 1.1 mrg #else 584 1.1 mrg cache = ""; 585 1.1 mrg #endif 586 1.1 mrg } 587 1.1 mrg 588 1.1 mrg #if defined (_AIX) 589 1.1 mrg cpu = detect_processor_aix (); 590 1.1 mrg #elif defined (__APPLE__) 591 1.1 mrg cpu = detect_processor_darwin (); 592 1.1 mrg #elif defined (__FreeBSD__) 593 1.1 mrg cpu = detect_processor_freebsd (); 594 1.1 mrg #elif defined (__linux__) 595 1.1 mrg cpu = detect_processor_linux (); 596 1.1 mrg #else 597 1.1 mrg cpu = "powerpc"; 598 1.1 mrg #endif 599 1.1 mrg 600 1.1 mrg if (assembler) 601 1.1 mrg { 602 1.1 mrg for (i = 0; i < sizeof (asm_names) / sizeof (asm_names[0]); i++) 603 1.1 mrg { 604 1.1 mrg if (!asm_names[i].cpu || !strcmp (asm_names[i].cpu, cpu)) 605 1.1 mrg return asm_names[i].asm_sw; 606 1.1 mrg } 607 1.1 mrg 608 1.1 mrg return NULL; 609 1.1 mrg } 610 1.1 mrg 611 1.1 mrg return concat (cache, "-m", argv[0], "=", cpu, " ", options, NULL); 612 1.1 mrg } 613 1.1 mrg 614 1.1 mrg #else /* GCC_VERSION */ 615 1.1 mrg 616 1.1 mrg /* If we aren't compiling with GCC we just provide a minimal 617 1.1 mrg default value. */ 618 1.1 mrg const char * 619 1.1 mrg host_detect_local_cpu (int argc, const char **argv) 620 1.1 mrg { 621 1.1 mrg const char *cpu; 622 1.1 mrg bool arch; 623 1.1 mrg 624 1.1 mrg if (argc < 1) 625 1.1 mrg return NULL; 626 1.1 mrg 627 1.1 mrg arch = strcmp (argv[0], "cpu") == 0; 628 1.1 mrg if (!arch && strcmp (argv[0], "tune")) 629 1.1 mrg return NULL; 630 1.1 mrg 631 1.1 mrg if (arch) 632 1.1 mrg cpu = "powerpc"; 633 1.1 mrg 634 1.1 mrg return concat ("-m", argv[0], "=", cpu, NULL); 635 1.1 mrg } 636 1.1 mrg 637 1.1 mrg #endif /* GCC_VERSION */ 638 1.1 mrg 639