annotate gcc/config/arm/driver-arm.c @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children 84e7813d76e9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* Subroutines for the gcc driver.
kono
parents:
diff changeset
2 Copyright (C) 2011-2017 Free Software Foundation, Inc.
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 This file is part of GCC.
kono
parents:
diff changeset
5
kono
parents:
diff changeset
6 GCC is free software; you can redistribute it and/or modify
kono
parents:
diff changeset
7 it under the terms of the GNU General Public License as published by
kono
parents:
diff changeset
8 the Free Software Foundation; either version 3, or (at your option)
kono
parents:
diff changeset
9 any later version.
kono
parents:
diff changeset
10
kono
parents:
diff changeset
11 GCC is distributed in the hope that it will be useful,
kono
parents:
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
kono
parents:
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
kono
parents:
diff changeset
14 GNU General Public License for more details.
kono
parents:
diff changeset
15
kono
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
kono
parents:
diff changeset
17 along with GCC; see the file COPYING3. If not see
kono
parents:
diff changeset
18 <http://www.gnu.org/licenses/>. */
kono
parents:
diff changeset
19
kono
parents:
diff changeset
20 #include "config.h"
kono
parents:
diff changeset
21 #include "system.h"
kono
parents:
diff changeset
22 #include "coretypes.h"
kono
parents:
diff changeset
23 #include "tm.h"
kono
parents:
diff changeset
24 #include "configargs.h"
kono
parents:
diff changeset
25
kono
parents:
diff changeset
26 struct vendor_cpu {
kono
parents:
diff changeset
27 const char *part_no;
kono
parents:
diff changeset
28 const char *arch_name;
kono
parents:
diff changeset
29 const char *cpu_name;
kono
parents:
diff changeset
30 };
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 static struct vendor_cpu arm_cpu_table[] = {
kono
parents:
diff changeset
33 {"0x926", "armv5te", "arm926ej-s"},
kono
parents:
diff changeset
34 {"0xa26", "armv5te", "arm1026ej-s"},
kono
parents:
diff changeset
35 {"0xb02", "armv6k", "mpcore"},
kono
parents:
diff changeset
36 {"0xb36", "armv6j", "arm1136j-s"},
kono
parents:
diff changeset
37 {"0xb56", "armv6t2", "arm1156t2-s"},
kono
parents:
diff changeset
38 /* armv6kz is the correct spelling for ARMv6KZ but may not be supported in
kono
parents:
diff changeset
39 the version of binutils used. The incorrect spelling is supported in
kono
parents:
diff changeset
40 legacy and current binutils so that is used instead. */
kono
parents:
diff changeset
41 {"0xb76", "armv6zk", "arm1176jz-s"},
kono
parents:
diff changeset
42 {"0xc05", "armv7-a", "cortex-a5"},
kono
parents:
diff changeset
43 {"0xc07", "armv7ve", "cortex-a7"},
kono
parents:
diff changeset
44 {"0xc08", "armv7-a", "cortex-a8"},
kono
parents:
diff changeset
45 {"0xc09", "armv7-a", "cortex-a9"},
kono
parents:
diff changeset
46 {"0xc0d", "armv7ve", "cortex-a12"},
kono
parents:
diff changeset
47 {"0xc0e", "armv7ve", "cortex-a17"},
kono
parents:
diff changeset
48 {"0xc0f", "armv7ve", "cortex-a15"},
kono
parents:
diff changeset
49 {"0xd01", "armv8-a+crc", "cortex-a32"},
kono
parents:
diff changeset
50 {"0xd04", "armv8-a+crc", "cortex-a35"},
kono
parents:
diff changeset
51 {"0xd03", "armv8-a+crc", "cortex-a53"},
kono
parents:
diff changeset
52 {"0xd07", "armv8-a+crc", "cortex-a57"},
kono
parents:
diff changeset
53 {"0xd08", "armv8-a+crc", "cortex-a72"},
kono
parents:
diff changeset
54 {"0xd09", "armv8-a+crc", "cortex-a73"},
kono
parents:
diff changeset
55 {"0xd05", "armv8.2-a+fp16", "cortex-a55"},
kono
parents:
diff changeset
56 {"0xd0a", "armv8.2-a+fp16", "cortex-a75"},
kono
parents:
diff changeset
57 {"0xc14", "armv7-r", "cortex-r4"},
kono
parents:
diff changeset
58 {"0xc15", "armv7-r", "cortex-r5"},
kono
parents:
diff changeset
59 {"0xc17", "armv7-r", "cortex-r7"},
kono
parents:
diff changeset
60 {"0xc18", "armv7-r", "cortex-r8"},
kono
parents:
diff changeset
61 {"0xd13", "armv8-r+crc", "cortex-r52"},
kono
parents:
diff changeset
62 {"0xc20", "armv6-m", "cortex-m0"},
kono
parents:
diff changeset
63 {"0xc21", "armv6-m", "cortex-m1"},
kono
parents:
diff changeset
64 {"0xc23", "armv7-m", "cortex-m3"},
kono
parents:
diff changeset
65 {"0xc24", "armv7e-m", "cortex-m4"},
kono
parents:
diff changeset
66 {NULL, NULL, NULL}
kono
parents:
diff changeset
67 };
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 static struct {
kono
parents:
diff changeset
70 const char *vendor_no;
kono
parents:
diff changeset
71 const struct vendor_cpu *vendor_parts;
kono
parents:
diff changeset
72 } vendors[] = {
kono
parents:
diff changeset
73 {"0x41", arm_cpu_table},
kono
parents:
diff changeset
74 {NULL, NULL}
kono
parents:
diff changeset
75 };
kono
parents:
diff changeset
76
kono
parents:
diff changeset
77 /* This will be called by the spec parser in gcc.c when it sees
kono
parents:
diff changeset
78 a %:local_cpu_detect(args) construct. Currently it will be called
kono
parents:
diff changeset
79 with either "arch", "cpu" or "tune" as argument depending on if
kono
parents:
diff changeset
80 -march=native, -mcpu=native or -mtune=native is to be substituted.
kono
parents:
diff changeset
81
kono
parents:
diff changeset
82 It returns a string containing new command line parameters to be
kono
parents:
diff changeset
83 put at the place of the above two options, depending on what CPU
kono
parents:
diff changeset
84 this is executed. E.g. "-march=armv7-a" on a Cortex-A8 for
kono
parents:
diff changeset
85 -march=native. If the routine can't detect a known processor,
kono
parents:
diff changeset
86 the -march or -mtune option is discarded.
kono
parents:
diff changeset
87
kono
parents:
diff changeset
88 ARGC and ARGV are set depending on the actual arguments given
kono
parents:
diff changeset
89 in the spec. */
kono
parents:
diff changeset
90 const char *
kono
parents:
diff changeset
91 host_detect_local_cpu (int argc, const char **argv)
kono
parents:
diff changeset
92 {
kono
parents:
diff changeset
93 const char *val = NULL;
kono
parents:
diff changeset
94 char buf[128];
kono
parents:
diff changeset
95 FILE *f = NULL;
kono
parents:
diff changeset
96 bool arch;
kono
parents:
diff changeset
97 const struct vendor_cpu *cpu_table = NULL;
kono
parents:
diff changeset
98
kono
parents:
diff changeset
99 if (argc < 1)
kono
parents:
diff changeset
100 goto not_found;
kono
parents:
diff changeset
101
kono
parents:
diff changeset
102 arch = strcmp (argv[0], "arch") == 0;
kono
parents:
diff changeset
103 if (!arch && strcmp (argv[0], "cpu") != 0 && strcmp (argv[0], "tune"))
kono
parents:
diff changeset
104 goto not_found;
kono
parents:
diff changeset
105
kono
parents:
diff changeset
106 f = fopen ("/proc/cpuinfo", "r");
kono
parents:
diff changeset
107 if (f == NULL)
kono
parents:
diff changeset
108 goto not_found;
kono
parents:
diff changeset
109
kono
parents:
diff changeset
110 while (fgets (buf, sizeof (buf), f) != NULL)
kono
parents:
diff changeset
111 {
kono
parents:
diff changeset
112 /* Ensure that CPU implementer is ARM (0x41). */
kono
parents:
diff changeset
113 if (strncmp (buf, "CPU implementer", sizeof ("CPU implementer") - 1) == 0)
kono
parents:
diff changeset
114 {
kono
parents:
diff changeset
115 int i;
kono
parents:
diff changeset
116 for (i = 0; vendors[i].vendor_no != NULL; i++)
kono
parents:
diff changeset
117 if (strstr (buf, vendors[i].vendor_no) != NULL)
kono
parents:
diff changeset
118 {
kono
parents:
diff changeset
119 cpu_table = vendors[i].vendor_parts;
kono
parents:
diff changeset
120 break;
kono
parents:
diff changeset
121 }
kono
parents:
diff changeset
122 }
kono
parents:
diff changeset
123
kono
parents:
diff changeset
124 /* Detect arch/cpu. */
kono
parents:
diff changeset
125 if (strncmp (buf, "CPU part", sizeof ("CPU part") - 1) == 0)
kono
parents:
diff changeset
126 {
kono
parents:
diff changeset
127 int i;
kono
parents:
diff changeset
128
kono
parents:
diff changeset
129 if (cpu_table == NULL)
kono
parents:
diff changeset
130 goto not_found;
kono
parents:
diff changeset
131
kono
parents:
diff changeset
132 for (i = 0; cpu_table[i].part_no != NULL; i++)
kono
parents:
diff changeset
133 if (strstr (buf, cpu_table[i].part_no) != NULL)
kono
parents:
diff changeset
134 {
kono
parents:
diff changeset
135 val = arch ? cpu_table[i].arch_name : cpu_table[i].cpu_name;
kono
parents:
diff changeset
136 break;
kono
parents:
diff changeset
137 }
kono
parents:
diff changeset
138 break;
kono
parents:
diff changeset
139 }
kono
parents:
diff changeset
140 }
kono
parents:
diff changeset
141
kono
parents:
diff changeset
142 if (val)
kono
parents:
diff changeset
143 {
kono
parents:
diff changeset
144 fclose (f);
kono
parents:
diff changeset
145 return concat ("-m", argv[0], "=", val, NULL);
kono
parents:
diff changeset
146 }
kono
parents:
diff changeset
147
kono
parents:
diff changeset
148 not_found:
kono
parents:
diff changeset
149 {
kono
parents:
diff changeset
150 unsigned int i;
kono
parents:
diff changeset
151 unsigned int opt;
kono
parents:
diff changeset
152 const char *search[] = {NULL, "arch"};
kono
parents:
diff changeset
153
kono
parents:
diff changeset
154 if (f)
kono
parents:
diff changeset
155 fclose (f);
kono
parents:
diff changeset
156
kono
parents:
diff changeset
157 search[0] = argv[0];
kono
parents:
diff changeset
158 for (opt = 0; opt < ARRAY_SIZE (search); opt++)
kono
parents:
diff changeset
159 for (i = 0; i < ARRAY_SIZE (configure_default_options); i++)
kono
parents:
diff changeset
160 if (strcmp (configure_default_options[i].name, search[opt]) == 0)
kono
parents:
diff changeset
161 return concat ("-m", search[opt], "=",
kono
parents:
diff changeset
162 configure_default_options[i].value, NULL);
kono
parents:
diff changeset
163 return NULL;
kono
parents:
diff changeset
164 }
kono
parents:
diff changeset
165 }