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