annotate clang/lib/Basic/Targets.cpp @ 176:de4ac79aef9d

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 17:13:11 +0900
parents 0572611fdcc8
children 2e18cbf3894f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===--- Targets.cpp - Implement target feature support -------------------===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8 //
anatofuz
parents:
diff changeset
9 // This file implements construction of a TargetInfo object from a
anatofuz
parents:
diff changeset
10 // target triple.
anatofuz
parents:
diff changeset
11 //
anatofuz
parents:
diff changeset
12 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
13
anatofuz
parents:
diff changeset
14 #include "Targets.h"
anatofuz
parents:
diff changeset
15
anatofuz
parents:
diff changeset
16 #include "Targets/AArch64.h"
anatofuz
parents:
diff changeset
17 #include "Targets/AMDGPU.h"
anatofuz
parents:
diff changeset
18 #include "Targets/ARC.h"
anatofuz
parents:
diff changeset
19 #include "Targets/ARM.h"
anatofuz
parents:
diff changeset
20 #include "Targets/AVR.h"
anatofuz
parents:
diff changeset
21 #include "Targets/BPF.h"
anatofuz
parents:
diff changeset
22 #include "Targets/Hexagon.h"
anatofuz
parents:
diff changeset
23 #include "Targets/Lanai.h"
anatofuz
parents:
diff changeset
24 #include "Targets/Le64.h"
anatofuz
parents:
diff changeset
25 #include "Targets/MSP430.h"
anatofuz
parents:
diff changeset
26 #include "Targets/Mips.h"
anatofuz
parents:
diff changeset
27 #include "Targets/NVPTX.h"
anatofuz
parents:
diff changeset
28 #include "Targets/OSTargets.h"
anatofuz
parents:
diff changeset
29 #include "Targets/PNaCl.h"
anatofuz
parents:
diff changeset
30 #include "Targets/PPC.h"
anatofuz
parents:
diff changeset
31 #include "Targets/RISCV.h"
anatofuz
parents:
diff changeset
32 #include "Targets/SPIR.h"
anatofuz
parents:
diff changeset
33 #include "Targets/Sparc.h"
anatofuz
parents:
diff changeset
34 #include "Targets/SystemZ.h"
anatofuz
parents:
diff changeset
35 #include "Targets/TCE.h"
anatofuz
parents:
diff changeset
36 #include "Targets/WebAssembly.h"
anatofuz
parents:
diff changeset
37 #include "Targets/X86.h"
anatofuz
parents:
diff changeset
38 #include "Targets/XCore.h"
anatofuz
parents:
diff changeset
39 #include "clang/Basic/Diagnostic.h"
anatofuz
parents:
diff changeset
40 #include "llvm/ADT/StringExtras.h"
anatofuz
parents:
diff changeset
41 #include "llvm/ADT/Triple.h"
anatofuz
parents:
diff changeset
42
anatofuz
parents:
diff changeset
43 using namespace clang;
anatofuz
parents:
diff changeset
44
anatofuz
parents:
diff changeset
45 namespace clang {
anatofuz
parents:
diff changeset
46 namespace targets {
anatofuz
parents:
diff changeset
47 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
48 // Common code shared among targets.
anatofuz
parents:
diff changeset
49 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
50
anatofuz
parents:
diff changeset
51 /// DefineStd - Define a macro name and standard variants. For example if
anatofuz
parents:
diff changeset
52 /// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
anatofuz
parents:
diff changeset
53 /// when in GNU mode.
anatofuz
parents:
diff changeset
54 void DefineStd(MacroBuilder &Builder, StringRef MacroName,
anatofuz
parents:
diff changeset
55 const LangOptions &Opts) {
anatofuz
parents:
diff changeset
56 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
anatofuz
parents:
diff changeset
57
anatofuz
parents:
diff changeset
58 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
anatofuz
parents:
diff changeset
59 // in the user's namespace.
anatofuz
parents:
diff changeset
60 if (Opts.GNUMode)
anatofuz
parents:
diff changeset
61 Builder.defineMacro(MacroName);
anatofuz
parents:
diff changeset
62
anatofuz
parents:
diff changeset
63 // Define __unix.
anatofuz
parents:
diff changeset
64 Builder.defineMacro("__" + MacroName);
anatofuz
parents:
diff changeset
65
anatofuz
parents:
diff changeset
66 // Define __unix__.
anatofuz
parents:
diff changeset
67 Builder.defineMacro("__" + MacroName + "__");
anatofuz
parents:
diff changeset
68 }
anatofuz
parents:
diff changeset
69
anatofuz
parents:
diff changeset
70 void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName, bool Tuning) {
anatofuz
parents:
diff changeset
71 Builder.defineMacro("__" + CPUName);
anatofuz
parents:
diff changeset
72 Builder.defineMacro("__" + CPUName + "__");
anatofuz
parents:
diff changeset
73 if (Tuning)
anatofuz
parents:
diff changeset
74 Builder.defineMacro("__tune_" + CPUName + "__");
anatofuz
parents:
diff changeset
75 }
anatofuz
parents:
diff changeset
76
anatofuz
parents:
diff changeset
77 void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
anatofuz
parents:
diff changeset
78 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
anatofuz
parents:
diff changeset
79 // supports __declspec natively under -fms-extensions, but we define a no-op
anatofuz
parents:
diff changeset
80 // __declspec macro anyway for pre-processor compatibility.
anatofuz
parents:
diff changeset
81 if (Opts.MicrosoftExt)
anatofuz
parents:
diff changeset
82 Builder.defineMacro("__declspec", "__declspec");
anatofuz
parents:
diff changeset
83 else
anatofuz
parents:
diff changeset
84 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
anatofuz
parents:
diff changeset
85
anatofuz
parents:
diff changeset
86 if (!Opts.MicrosoftExt) {
anatofuz
parents:
diff changeset
87 // Provide macros for all the calling convention keywords. Provide both
anatofuz
parents:
diff changeset
88 // single and double underscore prefixed variants. These are available on
anatofuz
parents:
diff changeset
89 // x64 as well as x86, even though they have no effect.
anatofuz
parents:
diff changeset
90 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
anatofuz
parents:
diff changeset
91 for (const char *CC : CCs) {
anatofuz
parents:
diff changeset
92 std::string GCCSpelling = "__attribute__((__";
anatofuz
parents:
diff changeset
93 GCCSpelling += CC;
anatofuz
parents:
diff changeset
94 GCCSpelling += "__))";
anatofuz
parents:
diff changeset
95 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
anatofuz
parents:
diff changeset
96 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
anatofuz
parents:
diff changeset
97 }
anatofuz
parents:
diff changeset
98 }
anatofuz
parents:
diff changeset
99 }
anatofuz
parents:
diff changeset
100
anatofuz
parents:
diff changeset
101 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
102 // Driver code
anatofuz
parents:
diff changeset
103 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
104
anatofuz
parents:
diff changeset
105 TargetInfo *AllocateTarget(const llvm::Triple &Triple,
anatofuz
parents:
diff changeset
106 const TargetOptions &Opts) {
anatofuz
parents:
diff changeset
107 llvm::Triple::OSType os = Triple.getOS();
anatofuz
parents:
diff changeset
108
anatofuz
parents:
diff changeset
109 switch (Triple.getArch()) {
anatofuz
parents:
diff changeset
110 default:
anatofuz
parents:
diff changeset
111 return nullptr;
anatofuz
parents:
diff changeset
112
anatofuz
parents:
diff changeset
113 case llvm::Triple::arc:
anatofuz
parents:
diff changeset
114 return new ARCTargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
115
anatofuz
parents:
diff changeset
116 case llvm::Triple::xcore:
anatofuz
parents:
diff changeset
117 return new XCoreTargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
118
anatofuz
parents:
diff changeset
119 case llvm::Triple::hexagon:
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
120 if (os == llvm::Triple::Linux &&
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
121 Triple.getEnvironment() == llvm::Triple::Musl)
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
122 return new LinuxTargetInfo<HexagonTargetInfo>(Triple, Opts);
150
anatofuz
parents:
diff changeset
123 return new HexagonTargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
124
anatofuz
parents:
diff changeset
125 case llvm::Triple::lanai:
anatofuz
parents:
diff changeset
126 return new LanaiTargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
127
anatofuz
parents:
diff changeset
128 case llvm::Triple::aarch64_32:
anatofuz
parents:
diff changeset
129 if (Triple.isOSDarwin())
anatofuz
parents:
diff changeset
130 return new DarwinAArch64TargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
131
anatofuz
parents:
diff changeset
132 return nullptr;
anatofuz
parents:
diff changeset
133 case llvm::Triple::aarch64:
anatofuz
parents:
diff changeset
134 if (Triple.isOSDarwin())
anatofuz
parents:
diff changeset
135 return new DarwinAArch64TargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
136
anatofuz
parents:
diff changeset
137 switch (os) {
anatofuz
parents:
diff changeset
138 case llvm::Triple::CloudABI:
anatofuz
parents:
diff changeset
139 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
140 case llvm::Triple::FreeBSD:
anatofuz
parents:
diff changeset
141 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
142 case llvm::Triple::Fuchsia:
anatofuz
parents:
diff changeset
143 return new FuchsiaTargetInfo<AArch64leTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
144 case llvm::Triple::Linux:
anatofuz
parents:
diff changeset
145 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
146 case llvm::Triple::NetBSD:
anatofuz
parents:
diff changeset
147 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
148 case llvm::Triple::OpenBSD:
anatofuz
parents:
diff changeset
149 return new OpenBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
150 case llvm::Triple::Win32:
anatofuz
parents:
diff changeset
151 switch (Triple.getEnvironment()) {
anatofuz
parents:
diff changeset
152 case llvm::Triple::GNU:
anatofuz
parents:
diff changeset
153 return new MinGWARM64TargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
154 case llvm::Triple::MSVC:
anatofuz
parents:
diff changeset
155 default: // Assume MSVC for unknown environments
anatofuz
parents:
diff changeset
156 return new MicrosoftARM64TargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
157 }
anatofuz
parents:
diff changeset
158 default:
anatofuz
parents:
diff changeset
159 return new AArch64leTargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
160 }
anatofuz
parents:
diff changeset
161
anatofuz
parents:
diff changeset
162 case llvm::Triple::aarch64_be:
anatofuz
parents:
diff changeset
163 switch (os) {
anatofuz
parents:
diff changeset
164 case llvm::Triple::FreeBSD:
anatofuz
parents:
diff changeset
165 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
166 case llvm::Triple::Fuchsia:
anatofuz
parents:
diff changeset
167 return new FuchsiaTargetInfo<AArch64beTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
168 case llvm::Triple::Linux:
anatofuz
parents:
diff changeset
169 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
170 case llvm::Triple::NetBSD:
anatofuz
parents:
diff changeset
171 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
172 default:
anatofuz
parents:
diff changeset
173 return new AArch64beTargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
174 }
anatofuz
parents:
diff changeset
175
anatofuz
parents:
diff changeset
176 case llvm::Triple::arm:
anatofuz
parents:
diff changeset
177 case llvm::Triple::thumb:
anatofuz
parents:
diff changeset
178 if (Triple.isOSBinFormatMachO())
anatofuz
parents:
diff changeset
179 return new DarwinARMTargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
180
anatofuz
parents:
diff changeset
181 switch (os) {
anatofuz
parents:
diff changeset
182 case llvm::Triple::CloudABI:
anatofuz
parents:
diff changeset
183 return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
184 case llvm::Triple::Linux:
anatofuz
parents:
diff changeset
185 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
186 case llvm::Triple::FreeBSD:
anatofuz
parents:
diff changeset
187 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
188 case llvm::Triple::NetBSD:
anatofuz
parents:
diff changeset
189 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
190 case llvm::Triple::OpenBSD:
anatofuz
parents:
diff changeset
191 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
192 case llvm::Triple::RTEMS:
anatofuz
parents:
diff changeset
193 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
194 case llvm::Triple::NaCl:
anatofuz
parents:
diff changeset
195 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
196 case llvm::Triple::Win32:
anatofuz
parents:
diff changeset
197 switch (Triple.getEnvironment()) {
anatofuz
parents:
diff changeset
198 case llvm::Triple::Cygnus:
anatofuz
parents:
diff changeset
199 return new CygwinARMTargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
200 case llvm::Triple::GNU:
anatofuz
parents:
diff changeset
201 return new MinGWARMTargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
202 case llvm::Triple::Itanium:
anatofuz
parents:
diff changeset
203 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
204 case llvm::Triple::MSVC:
anatofuz
parents:
diff changeset
205 default: // Assume MSVC for unknown environments
anatofuz
parents:
diff changeset
206 return new MicrosoftARMleTargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
207 }
anatofuz
parents:
diff changeset
208 default:
anatofuz
parents:
diff changeset
209 return new ARMleTargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
210 }
anatofuz
parents:
diff changeset
211
anatofuz
parents:
diff changeset
212 case llvm::Triple::armeb:
anatofuz
parents:
diff changeset
213 case llvm::Triple::thumbeb:
anatofuz
parents:
diff changeset
214 if (Triple.isOSDarwin())
anatofuz
parents:
diff changeset
215 return new DarwinARMTargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
216
anatofuz
parents:
diff changeset
217 switch (os) {
anatofuz
parents:
diff changeset
218 case llvm::Triple::Linux:
anatofuz
parents:
diff changeset
219 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
220 case llvm::Triple::FreeBSD:
anatofuz
parents:
diff changeset
221 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
222 case llvm::Triple::NetBSD:
anatofuz
parents:
diff changeset
223 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
224 case llvm::Triple::OpenBSD:
anatofuz
parents:
diff changeset
225 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
226 case llvm::Triple::RTEMS:
anatofuz
parents:
diff changeset
227 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
228 case llvm::Triple::NaCl:
anatofuz
parents:
diff changeset
229 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
230 default:
anatofuz
parents:
diff changeset
231 return new ARMbeTargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
232 }
anatofuz
parents:
diff changeset
233
anatofuz
parents:
diff changeset
234 case llvm::Triple::avr:
anatofuz
parents:
diff changeset
235 return new AVRTargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
236 case llvm::Triple::bpfeb:
anatofuz
parents:
diff changeset
237 case llvm::Triple::bpfel:
anatofuz
parents:
diff changeset
238 return new BPFTargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
239
anatofuz
parents:
diff changeset
240 case llvm::Triple::msp430:
anatofuz
parents:
diff changeset
241 return new MSP430TargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
242
anatofuz
parents:
diff changeset
243 case llvm::Triple::mips:
anatofuz
parents:
diff changeset
244 switch (os) {
anatofuz
parents:
diff changeset
245 case llvm::Triple::Linux:
anatofuz
parents:
diff changeset
246 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
247 case llvm::Triple::RTEMS:
anatofuz
parents:
diff changeset
248 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
249 case llvm::Triple::FreeBSD:
anatofuz
parents:
diff changeset
250 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
251 case llvm::Triple::NetBSD:
anatofuz
parents:
diff changeset
252 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
253 default:
anatofuz
parents:
diff changeset
254 return new MipsTargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
255 }
anatofuz
parents:
diff changeset
256
anatofuz
parents:
diff changeset
257 case llvm::Triple::mipsel:
anatofuz
parents:
diff changeset
258 switch (os) {
anatofuz
parents:
diff changeset
259 case llvm::Triple::Linux:
anatofuz
parents:
diff changeset
260 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
261 case llvm::Triple::RTEMS:
anatofuz
parents:
diff changeset
262 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
263 case llvm::Triple::FreeBSD:
anatofuz
parents:
diff changeset
264 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
265 case llvm::Triple::NetBSD:
anatofuz
parents:
diff changeset
266 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
267 case llvm::Triple::NaCl:
anatofuz
parents:
diff changeset
268 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
269 default:
anatofuz
parents:
diff changeset
270 return new MipsTargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
271 }
anatofuz
parents:
diff changeset
272
anatofuz
parents:
diff changeset
273 case llvm::Triple::mips64:
anatofuz
parents:
diff changeset
274 switch (os) {
anatofuz
parents:
diff changeset
275 case llvm::Triple::Linux:
anatofuz
parents:
diff changeset
276 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
277 case llvm::Triple::RTEMS:
anatofuz
parents:
diff changeset
278 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
279 case llvm::Triple::FreeBSD:
anatofuz
parents:
diff changeset
280 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
281 case llvm::Triple::NetBSD:
anatofuz
parents:
diff changeset
282 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
283 case llvm::Triple::OpenBSD:
anatofuz
parents:
diff changeset
284 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
285 default:
anatofuz
parents:
diff changeset
286 return new MipsTargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
287 }
anatofuz
parents:
diff changeset
288
anatofuz
parents:
diff changeset
289 case llvm::Triple::mips64el:
anatofuz
parents:
diff changeset
290 switch (os) {
anatofuz
parents:
diff changeset
291 case llvm::Triple::Linux:
anatofuz
parents:
diff changeset
292 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
293 case llvm::Triple::RTEMS:
anatofuz
parents:
diff changeset
294 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
295 case llvm::Triple::FreeBSD:
anatofuz
parents:
diff changeset
296 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
297 case llvm::Triple::NetBSD:
anatofuz
parents:
diff changeset
298 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
299 case llvm::Triple::OpenBSD:
anatofuz
parents:
diff changeset
300 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
301 default:
anatofuz
parents:
diff changeset
302 return new MipsTargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
303 }
anatofuz
parents:
diff changeset
304
anatofuz
parents:
diff changeset
305 case llvm::Triple::le32:
anatofuz
parents:
diff changeset
306 switch (os) {
anatofuz
parents:
diff changeset
307 case llvm::Triple::NaCl:
anatofuz
parents:
diff changeset
308 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
309 default:
anatofuz
parents:
diff changeset
310 return nullptr;
anatofuz
parents:
diff changeset
311 }
anatofuz
parents:
diff changeset
312
anatofuz
parents:
diff changeset
313 case llvm::Triple::le64:
anatofuz
parents:
diff changeset
314 return new Le64TargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
315
anatofuz
parents:
diff changeset
316 case llvm::Triple::ppc:
anatofuz
parents:
diff changeset
317 if (Triple.isOSDarwin())
anatofuz
parents:
diff changeset
318 return new DarwinPPC32TargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
319 switch (os) {
anatofuz
parents:
diff changeset
320 case llvm::Triple::Linux:
anatofuz
parents:
diff changeset
321 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
322 case llvm::Triple::FreeBSD:
anatofuz
parents:
diff changeset
323 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
324 case llvm::Triple::NetBSD:
anatofuz
parents:
diff changeset
325 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
326 case llvm::Triple::OpenBSD:
anatofuz
parents:
diff changeset
327 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
328 case llvm::Triple::RTEMS:
anatofuz
parents:
diff changeset
329 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
330 case llvm::Triple::AIX:
anatofuz
parents:
diff changeset
331 return new AIXPPC32TargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
332 default:
anatofuz
parents:
diff changeset
333 return new PPC32TargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
334 }
anatofuz
parents:
diff changeset
335
anatofuz
parents:
diff changeset
336 case llvm::Triple::ppc64:
anatofuz
parents:
diff changeset
337 if (Triple.isOSDarwin())
anatofuz
parents:
diff changeset
338 return new DarwinPPC64TargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
339 switch (os) {
anatofuz
parents:
diff changeset
340 case llvm::Triple::Linux:
anatofuz
parents:
diff changeset
341 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
342 case llvm::Triple::Lv2:
anatofuz
parents:
diff changeset
343 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
344 case llvm::Triple::FreeBSD:
anatofuz
parents:
diff changeset
345 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
346 case llvm::Triple::NetBSD:
anatofuz
parents:
diff changeset
347 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
348 case llvm::Triple::AIX:
anatofuz
parents:
diff changeset
349 return new AIXPPC64TargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
350 default:
anatofuz
parents:
diff changeset
351 return new PPC64TargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
352 }
anatofuz
parents:
diff changeset
353
anatofuz
parents:
diff changeset
354 case llvm::Triple::ppc64le:
anatofuz
parents:
diff changeset
355 switch (os) {
anatofuz
parents:
diff changeset
356 case llvm::Triple::Linux:
anatofuz
parents:
diff changeset
357 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
358 case llvm::Triple::NetBSD:
anatofuz
parents:
diff changeset
359 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
360 default:
anatofuz
parents:
diff changeset
361 return new PPC64TargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
362 }
anatofuz
parents:
diff changeset
363
anatofuz
parents:
diff changeset
364 case llvm::Triple::nvptx:
anatofuz
parents:
diff changeset
365 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/32);
anatofuz
parents:
diff changeset
366 case llvm::Triple::nvptx64:
anatofuz
parents:
diff changeset
367 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/64);
anatofuz
parents:
diff changeset
368
anatofuz
parents:
diff changeset
369 case llvm::Triple::amdgcn:
anatofuz
parents:
diff changeset
370 case llvm::Triple::r600:
anatofuz
parents:
diff changeset
371 return new AMDGPUTargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
372
anatofuz
parents:
diff changeset
373 case llvm::Triple::riscv32:
anatofuz
parents:
diff changeset
374 // TODO: add cases for NetBSD, RTEMS once tested.
anatofuz
parents:
diff changeset
375 switch (os) {
anatofuz
parents:
diff changeset
376 case llvm::Triple::FreeBSD:
anatofuz
parents:
diff changeset
377 return new FreeBSDTargetInfo<RISCV32TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
378 case llvm::Triple::Linux:
anatofuz
parents:
diff changeset
379 return new LinuxTargetInfo<RISCV32TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
380 default:
anatofuz
parents:
diff changeset
381 return new RISCV32TargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
382 }
anatofuz
parents:
diff changeset
383
anatofuz
parents:
diff changeset
384 case llvm::Triple::riscv64:
anatofuz
parents:
diff changeset
385 // TODO: add cases for NetBSD, RTEMS once tested.
anatofuz
parents:
diff changeset
386 switch (os) {
anatofuz
parents:
diff changeset
387 case llvm::Triple::FreeBSD:
anatofuz
parents:
diff changeset
388 return new FreeBSDTargetInfo<RISCV64TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
389 case llvm::Triple::Fuchsia:
anatofuz
parents:
diff changeset
390 return new FuchsiaTargetInfo<RISCV64TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
391 case llvm::Triple::Linux:
anatofuz
parents:
diff changeset
392 return new LinuxTargetInfo<RISCV64TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
393 default:
anatofuz
parents:
diff changeset
394 return new RISCV64TargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
395 }
anatofuz
parents:
diff changeset
396
anatofuz
parents:
diff changeset
397 case llvm::Triple::sparc:
anatofuz
parents:
diff changeset
398 switch (os) {
anatofuz
parents:
diff changeset
399 case llvm::Triple::Linux:
anatofuz
parents:
diff changeset
400 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
401 case llvm::Triple::Solaris:
anatofuz
parents:
diff changeset
402 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
403 case llvm::Triple::NetBSD:
anatofuz
parents:
diff changeset
404 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
405 case llvm::Triple::OpenBSD:
anatofuz
parents:
diff changeset
406 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
407 case llvm::Triple::RTEMS:
anatofuz
parents:
diff changeset
408 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
409 default:
anatofuz
parents:
diff changeset
410 return new SparcV8TargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
411 }
anatofuz
parents:
diff changeset
412
anatofuz
parents:
diff changeset
413 // The 'sparcel' architecture copies all the above cases except for Solaris.
anatofuz
parents:
diff changeset
414 case llvm::Triple::sparcel:
anatofuz
parents:
diff changeset
415 switch (os) {
anatofuz
parents:
diff changeset
416 case llvm::Triple::Linux:
anatofuz
parents:
diff changeset
417 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
418 case llvm::Triple::NetBSD:
anatofuz
parents:
diff changeset
419 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
420 case llvm::Triple::OpenBSD:
anatofuz
parents:
diff changeset
421 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
422 case llvm::Triple::RTEMS:
anatofuz
parents:
diff changeset
423 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
424 default:
anatofuz
parents:
diff changeset
425 return new SparcV8elTargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
426 }
anatofuz
parents:
diff changeset
427
anatofuz
parents:
diff changeset
428 case llvm::Triple::sparcv9:
anatofuz
parents:
diff changeset
429 switch (os) {
anatofuz
parents:
diff changeset
430 case llvm::Triple::Linux:
anatofuz
parents:
diff changeset
431 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
432 case llvm::Triple::Solaris:
anatofuz
parents:
diff changeset
433 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
434 case llvm::Triple::NetBSD:
anatofuz
parents:
diff changeset
435 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
436 case llvm::Triple::OpenBSD:
anatofuz
parents:
diff changeset
437 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
438 case llvm::Triple::FreeBSD:
anatofuz
parents:
diff changeset
439 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
440 default:
anatofuz
parents:
diff changeset
441 return new SparcV9TargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
442 }
anatofuz
parents:
diff changeset
443
anatofuz
parents:
diff changeset
444 case llvm::Triple::systemz:
anatofuz
parents:
diff changeset
445 switch (os) {
anatofuz
parents:
diff changeset
446 case llvm::Triple::Linux:
anatofuz
parents:
diff changeset
447 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
448 default:
anatofuz
parents:
diff changeset
449 return new SystemZTargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
450 }
anatofuz
parents:
diff changeset
451
anatofuz
parents:
diff changeset
452 case llvm::Triple::tce:
anatofuz
parents:
diff changeset
453 return new TCETargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
454
anatofuz
parents:
diff changeset
455 case llvm::Triple::tcele:
anatofuz
parents:
diff changeset
456 return new TCELETargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
457
anatofuz
parents:
diff changeset
458 case llvm::Triple::x86:
anatofuz
parents:
diff changeset
459 if (Triple.isOSDarwin())
anatofuz
parents:
diff changeset
460 return new DarwinI386TargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
461
anatofuz
parents:
diff changeset
462 switch (os) {
anatofuz
parents:
diff changeset
463 case llvm::Triple::Ananas:
anatofuz
parents:
diff changeset
464 return new AnanasTargetInfo<X86_32TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
465 case llvm::Triple::CloudABI:
anatofuz
parents:
diff changeset
466 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
467 case llvm::Triple::Linux: {
anatofuz
parents:
diff changeset
468 switch (Triple.getEnvironment()) {
anatofuz
parents:
diff changeset
469 default:
anatofuz
parents:
diff changeset
470 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
471 case llvm::Triple::Android:
anatofuz
parents:
diff changeset
472 return new AndroidX86_32TargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
473 }
anatofuz
parents:
diff changeset
474 }
anatofuz
parents:
diff changeset
475 case llvm::Triple::DragonFly:
anatofuz
parents:
diff changeset
476 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
477 case llvm::Triple::NetBSD:
anatofuz
parents:
diff changeset
478 return new NetBSDI386TargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
479 case llvm::Triple::OpenBSD:
anatofuz
parents:
diff changeset
480 return new OpenBSDI386TargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
481 case llvm::Triple::FreeBSD:
anatofuz
parents:
diff changeset
482 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
483 case llvm::Triple::Fuchsia:
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
484 return new FuchsiaTargetInfo<X86_32TargetInfo>(Triple, Opts);
150
anatofuz
parents:
diff changeset
485 case llvm::Triple::KFreeBSD:
anatofuz
parents:
diff changeset
486 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
487 case llvm::Triple::Minix:
anatofuz
parents:
diff changeset
488 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
489 case llvm::Triple::Solaris:
anatofuz
parents:
diff changeset
490 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
491 case llvm::Triple::Win32: {
anatofuz
parents:
diff changeset
492 switch (Triple.getEnvironment()) {
anatofuz
parents:
diff changeset
493 case llvm::Triple::Cygnus:
anatofuz
parents:
diff changeset
494 return new CygwinX86_32TargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
495 case llvm::Triple::GNU:
anatofuz
parents:
diff changeset
496 return new MinGWX86_32TargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
497 case llvm::Triple::Itanium:
anatofuz
parents:
diff changeset
498 case llvm::Triple::MSVC:
anatofuz
parents:
diff changeset
499 default: // Assume MSVC for unknown environments
anatofuz
parents:
diff changeset
500 return new MicrosoftX86_32TargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
501 }
anatofuz
parents:
diff changeset
502 }
anatofuz
parents:
diff changeset
503 case llvm::Triple::Haiku:
anatofuz
parents:
diff changeset
504 return new HaikuX86_32TargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
505 case llvm::Triple::RTEMS:
anatofuz
parents:
diff changeset
506 return new RTEMSX86_32TargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
507 case llvm::Triple::NaCl:
anatofuz
parents:
diff changeset
508 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
509 case llvm::Triple::ELFIAMCU:
anatofuz
parents:
diff changeset
510 return new MCUX86_32TargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
511 case llvm::Triple::Hurd:
anatofuz
parents:
diff changeset
512 return new HurdTargetInfo<X86_32TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
513 default:
anatofuz
parents:
diff changeset
514 return new X86_32TargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
515 }
anatofuz
parents:
diff changeset
516
anatofuz
parents:
diff changeset
517 case llvm::Triple::x86_64:
anatofuz
parents:
diff changeset
518 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
anatofuz
parents:
diff changeset
519 return new DarwinX86_64TargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
520
anatofuz
parents:
diff changeset
521 switch (os) {
anatofuz
parents:
diff changeset
522 case llvm::Triple::Ananas:
anatofuz
parents:
diff changeset
523 return new AnanasTargetInfo<X86_64TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
524 case llvm::Triple::CloudABI:
anatofuz
parents:
diff changeset
525 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
526 case llvm::Triple::Linux: {
anatofuz
parents:
diff changeset
527 switch (Triple.getEnvironment()) {
anatofuz
parents:
diff changeset
528 default:
anatofuz
parents:
diff changeset
529 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
530 case llvm::Triple::Android:
anatofuz
parents:
diff changeset
531 return new AndroidX86_64TargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
532 }
anatofuz
parents:
diff changeset
533 }
anatofuz
parents:
diff changeset
534 case llvm::Triple::DragonFly:
anatofuz
parents:
diff changeset
535 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
536 case llvm::Triple::NetBSD:
anatofuz
parents:
diff changeset
537 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
538 case llvm::Triple::OpenBSD:
anatofuz
parents:
diff changeset
539 return new OpenBSDX86_64TargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
540 case llvm::Triple::FreeBSD:
anatofuz
parents:
diff changeset
541 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
542 case llvm::Triple::Fuchsia:
anatofuz
parents:
diff changeset
543 return new FuchsiaTargetInfo<X86_64TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
544 case llvm::Triple::KFreeBSD:
anatofuz
parents:
diff changeset
545 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
546 case llvm::Triple::Solaris:
anatofuz
parents:
diff changeset
547 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
548 case llvm::Triple::Win32: {
anatofuz
parents:
diff changeset
549 switch (Triple.getEnvironment()) {
anatofuz
parents:
diff changeset
550 case llvm::Triple::Cygnus:
anatofuz
parents:
diff changeset
551 return new CygwinX86_64TargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
552 case llvm::Triple::GNU:
anatofuz
parents:
diff changeset
553 return new MinGWX86_64TargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
554 case llvm::Triple::MSVC:
anatofuz
parents:
diff changeset
555 default: // Assume MSVC for unknown environments
anatofuz
parents:
diff changeset
556 return new MicrosoftX86_64TargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
557 }
anatofuz
parents:
diff changeset
558 }
anatofuz
parents:
diff changeset
559 case llvm::Triple::Haiku:
anatofuz
parents:
diff changeset
560 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
561 case llvm::Triple::NaCl:
anatofuz
parents:
diff changeset
562 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
563 case llvm::Triple::PS4:
anatofuz
parents:
diff changeset
564 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
565 default:
anatofuz
parents:
diff changeset
566 return new X86_64TargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
567 }
anatofuz
parents:
diff changeset
568
anatofuz
parents:
diff changeset
569 case llvm::Triple::spir: {
anatofuz
parents:
diff changeset
570 if (Triple.getOS() != llvm::Triple::UnknownOS ||
anatofuz
parents:
diff changeset
571 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
anatofuz
parents:
diff changeset
572 return nullptr;
anatofuz
parents:
diff changeset
573 return new SPIR32TargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
574 }
anatofuz
parents:
diff changeset
575 case llvm::Triple::spir64: {
anatofuz
parents:
diff changeset
576 if (Triple.getOS() != llvm::Triple::UnknownOS ||
anatofuz
parents:
diff changeset
577 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
anatofuz
parents:
diff changeset
578 return nullptr;
anatofuz
parents:
diff changeset
579 return new SPIR64TargetInfo(Triple, Opts);
anatofuz
parents:
diff changeset
580 }
anatofuz
parents:
diff changeset
581 case llvm::Triple::wasm32:
anatofuz
parents:
diff changeset
582 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
anatofuz
parents:
diff changeset
583 Triple.getVendor() != llvm::Triple::UnknownVendor ||
anatofuz
parents:
diff changeset
584 !Triple.isOSBinFormatWasm())
anatofuz
parents:
diff changeset
585 return nullptr;
anatofuz
parents:
diff changeset
586 switch (Triple.getOS()) {
anatofuz
parents:
diff changeset
587 case llvm::Triple::WASI:
anatofuz
parents:
diff changeset
588 return new WASITargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
589 case llvm::Triple::Emscripten:
anatofuz
parents:
diff changeset
590 return new EmscriptenTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
591 case llvm::Triple::UnknownOS:
anatofuz
parents:
diff changeset
592 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
593 default:
anatofuz
parents:
diff changeset
594 return nullptr;
anatofuz
parents:
diff changeset
595 }
anatofuz
parents:
diff changeset
596 case llvm::Triple::wasm64:
anatofuz
parents:
diff changeset
597 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
anatofuz
parents:
diff changeset
598 Triple.getVendor() != llvm::Triple::UnknownVendor ||
anatofuz
parents:
diff changeset
599 !Triple.isOSBinFormatWasm())
anatofuz
parents:
diff changeset
600 return nullptr;
anatofuz
parents:
diff changeset
601 switch (Triple.getOS()) {
anatofuz
parents:
diff changeset
602 case llvm::Triple::WASI:
anatofuz
parents:
diff changeset
603 return new WASITargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
604 case llvm::Triple::Emscripten:
anatofuz
parents:
diff changeset
605 return new EmscriptenTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
606 case llvm::Triple::UnknownOS:
anatofuz
parents:
diff changeset
607 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
608 default:
anatofuz
parents:
diff changeset
609 return nullptr;
anatofuz
parents:
diff changeset
610 }
anatofuz
parents:
diff changeset
611
anatofuz
parents:
diff changeset
612 case llvm::Triple::renderscript32:
anatofuz
parents:
diff changeset
613 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
614 case llvm::Triple::renderscript64:
anatofuz
parents:
diff changeset
615 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
anatofuz
parents:
diff changeset
616 }
anatofuz
parents:
diff changeset
617 }
anatofuz
parents:
diff changeset
618 } // namespace targets
anatofuz
parents:
diff changeset
619 } // namespace clang
anatofuz
parents:
diff changeset
620
anatofuz
parents:
diff changeset
621 using namespace clang::targets;
anatofuz
parents:
diff changeset
622 /// CreateTargetInfo - Return the target info object for the specified target
anatofuz
parents:
diff changeset
623 /// options.
anatofuz
parents:
diff changeset
624 TargetInfo *
anatofuz
parents:
diff changeset
625 TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
anatofuz
parents:
diff changeset
626 const std::shared_ptr<TargetOptions> &Opts) {
anatofuz
parents:
diff changeset
627 llvm::Triple Triple(Opts->Triple);
anatofuz
parents:
diff changeset
628
anatofuz
parents:
diff changeset
629 // Construct the target
anatofuz
parents:
diff changeset
630 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
anatofuz
parents:
diff changeset
631 if (!Target) {
anatofuz
parents:
diff changeset
632 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
anatofuz
parents:
diff changeset
633 return nullptr;
anatofuz
parents:
diff changeset
634 }
anatofuz
parents:
diff changeset
635 Target->TargetOpts = Opts;
anatofuz
parents:
diff changeset
636
anatofuz
parents:
diff changeset
637 // Set the target CPU if specified.
anatofuz
parents:
diff changeset
638 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
anatofuz
parents:
diff changeset
639 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
anatofuz
parents:
diff changeset
640 SmallVector<StringRef, 32> ValidList;
anatofuz
parents:
diff changeset
641 Target->fillValidCPUList(ValidList);
anatofuz
parents:
diff changeset
642 if (!ValidList.empty())
anatofuz
parents:
diff changeset
643 Diags.Report(diag::note_valid_options) << llvm::join(ValidList, ", ");
anatofuz
parents:
diff changeset
644 return nullptr;
anatofuz
parents:
diff changeset
645 }
anatofuz
parents:
diff changeset
646
anatofuz
parents:
diff changeset
647 // Set the target ABI if specified.
anatofuz
parents:
diff changeset
648 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
anatofuz
parents:
diff changeset
649 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
anatofuz
parents:
diff changeset
650 return nullptr;
anatofuz
parents:
diff changeset
651 }
anatofuz
parents:
diff changeset
652
anatofuz
parents:
diff changeset
653 // Set the fp math unit.
anatofuz
parents:
diff changeset
654 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
anatofuz
parents:
diff changeset
655 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
anatofuz
parents:
diff changeset
656 return nullptr;
anatofuz
parents:
diff changeset
657 }
anatofuz
parents:
diff changeset
658
anatofuz
parents:
diff changeset
659 // Compute the default target features, we need the target to handle this
anatofuz
parents:
diff changeset
660 // because features may have dependencies on one another.
anatofuz
parents:
diff changeset
661 llvm::StringMap<bool> Features;
anatofuz
parents:
diff changeset
662 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
anatofuz
parents:
diff changeset
663 Opts->FeaturesAsWritten))
anatofuz
parents:
diff changeset
664 return nullptr;
anatofuz
parents:
diff changeset
665
anatofuz
parents:
diff changeset
666 // Add the features to the compile options.
anatofuz
parents:
diff changeset
667 Opts->Features.clear();
anatofuz
parents:
diff changeset
668 for (const auto &F : Features)
anatofuz
parents:
diff changeset
669 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
anatofuz
parents:
diff changeset
670 // Sort here, so we handle the features in a predictable order. (This matters
anatofuz
parents:
diff changeset
671 // when we're dealing with features that overlap.)
anatofuz
parents:
diff changeset
672 llvm::sort(Opts->Features);
anatofuz
parents:
diff changeset
673
anatofuz
parents:
diff changeset
674 if (!Target->handleTargetFeatures(Opts->Features, Diags))
anatofuz
parents:
diff changeset
675 return nullptr;
anatofuz
parents:
diff changeset
676
anatofuz
parents:
diff changeset
677 Target->setSupportedOpenCLOpts();
anatofuz
parents:
diff changeset
678 Target->setOpenCLExtensionOpts();
anatofuz
parents:
diff changeset
679 Target->setMaxAtomicWidth();
anatofuz
parents:
diff changeset
680
anatofuz
parents:
diff changeset
681 if (!Target->validateTarget(Diags))
anatofuz
parents:
diff changeset
682 return nullptr;
anatofuz
parents:
diff changeset
683
anatofuz
parents:
diff changeset
684 Target->CheckFixedPointBits();
anatofuz
parents:
diff changeset
685
anatofuz
parents:
diff changeset
686 return Target.release();
anatofuz
parents:
diff changeset
687 }