1 /* Subroutines for the gcc driver.
2 Copyright (C) 2011-2018 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
11 GCC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
20 #define IN_TARGET_CODE 1
24 #include "coretypes.h"
26 #include "configargs.h"
31 const char *arch_name
;
37 const char *vendor_no
;
38 const struct vendor_cpu
*vendor_parts
;
41 #include "arm-native.h"
43 /* This will be called by the spec parser in gcc.c when it sees
44 a %:local_cpu_detect(args) construct. Currently it will be called
45 with either "arch", "cpu" or "tune" as argument depending on if
46 -march=native, -mcpu=native or -mtune=native is to be substituted.
48 It returns a string containing new command line parameters to be
49 put at the place of the above two options, depending on what CPU
50 this is executed. E.g. "-march=armv7-a" on a Cortex-A8 for
51 -march=native. If the routine can't detect a known processor,
52 the -march or -mtune option is discarded.
54 ARGC and ARGV are set depending on the actual arguments given
57 host_detect_local_cpu (int argc
, const char **argv
)
59 const char *val
= NULL
;
63 const struct vendor_cpu
*cpu_table
= NULL
;
68 arch
= strcmp (argv
[0], "arch") == 0;
69 if (!arch
&& strcmp (argv
[0], "cpu") != 0 && strcmp (argv
[0], "tune"))
72 f
= fopen ("/proc/cpuinfo", "r");
76 while (fgets (buf
, sizeof (buf
), f
) != NULL
)
78 /* Find the vendor table associated with this implementer. */
79 if (strncmp (buf
, "CPU implementer", sizeof ("CPU implementer") - 1) == 0)
82 for (i
= 0; vendors_table
[i
].vendor_no
!= NULL
; i
++)
83 if (strstr (buf
, vendors_table
[i
].vendor_no
) != NULL
)
85 cpu_table
= vendors_table
[i
].vendor_parts
;
90 /* Detect arch/cpu. */
91 if (strncmp (buf
, "CPU part", sizeof ("CPU part") - 1) == 0)
95 if (cpu_table
== NULL
)
98 for (i
= 0; cpu_table
[i
].part_no
!= NULL
; i
++)
99 if (strstr (buf
, cpu_table
[i
].part_no
) != NULL
)
101 val
= arch
? cpu_table
[i
].arch_name
: cpu_table
[i
].cpu_name
;
111 return concat ("-m", argv
[0], "=", val
, NULL
);
118 const char *search
[] = {NULL
, "arch"};
124 for (opt
= 0; opt
< ARRAY_SIZE (search
); opt
++)
125 for (i
= 0; i
< ARRAY_SIZE (configure_default_options
); i
++)
126 if (strcmp (configure_default_options
[i
].name
, search
[opt
]) == 0)
127 return concat ("-m", search
[opt
], "=",
128 configure_default_options
[i
].value
, NULL
);