1 //===-- Host.cpp - Implement OS Host Concept --------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 //  This file implements the operating system Host concept.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #include "llvm/Support/Host.h"
14 #include "llvm/Support/TargetParser.h"
15 #include "llvm/ADT/SmallSet.h"
16 #include "llvm/ADT/SmallVector.h"
17 #include "llvm/ADT/StringRef.h"
18 #include "llvm/ADT/StringSwitch.h"
19 #include "llvm/ADT/Triple.h"
20 #include "llvm/Config/llvm-config.h"
21 #include "llvm/Support/Debug.h"
22 #include "llvm/Support/FileSystem.h"
23 #include "llvm/Support/MemoryBuffer.h"
24 #include "llvm/Support/raw_ostream.h"
25 #include <assert.h>
26 #include <string.h>
27 
28 // Include the platform-specific parts of this class.
29 #ifdef LLVM_ON_UNIX
30 #include "Unix/Host.inc"
31 #endif
32 #ifdef _WIN32
33 #include "Windows/Host.inc"
34 #endif
35 #ifdef _MSC_VER
36 #include <intrin.h>
37 #endif
38 #if defined(__APPLE__) && (defined(__ppc__) || defined(__powerpc__))
39 #include <mach/host_info.h>
40 #include <mach/mach.h>
41 #include <mach/mach_host.h>
42 #include <mach/machine.h>
43 #endif
44 
45 #define DEBUG_TYPE "host-detection"
46 
47 //===----------------------------------------------------------------------===//
48 //
49 //  Implementations of the CPU detection routines
50 //
51 //===----------------------------------------------------------------------===//
52 
53 using namespace llvm;
54 
55 static std::unique_ptr<llvm::MemoryBuffer>
56     LLVM_ATTRIBUTE_UNUSED getProcCpuinfoContent() {
57   llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Text =
58       llvm::MemoryBuffer::getFileAsStream("/proc/cpuinfo");
59   if (std::error_code EC = Text.getError()) {
60     llvm::errs() << "Can't read "
61                  << "/proc/cpuinfo: " << EC.message() << "\n";
62     return nullptr;
63   }
64   return std::move(*Text);
65 }
66 
67 StringRef sys::detail::getHostCPUNameForPowerPC(StringRef ProcCpuinfoContent) {
68   // Access to the Processor Version Register (PVR) on PowerPC is privileged,
69   // and so we must use an operating-system interface to determine the current
70   // processor type. On Linux, this is exposed through the /proc/cpuinfo file.
71   const char *generic = "generic";
72 
73   // The cpu line is second (after the 'processor: 0' line), so if this
74   // buffer is too small then something has changed (or is wrong).
75   StringRef::const_iterator CPUInfoStart = ProcCpuinfoContent.begin();
76   StringRef::const_iterator CPUInfoEnd = ProcCpuinfoContent.end();
77 
78   StringRef::const_iterator CIP = CPUInfoStart;
79 
80   StringRef::const_iterator CPUStart = 0;
81   size_t CPULen = 0;
82 
83   // We need to find the first line which starts with cpu, spaces, and a colon.
84   // After the colon, there may be some additional spaces and then the cpu type.
85   while (CIP < CPUInfoEnd && CPUStart == 0) {
86     if (CIP < CPUInfoEnd && *CIP == '\n')
87       ++CIP;
88 
89     if (CIP < CPUInfoEnd && *CIP == 'c') {
90       ++CIP;
91       if (CIP < CPUInfoEnd && *CIP == 'p') {
92         ++CIP;
93         if (CIP < CPUInfoEnd && *CIP == 'u') {
94           ++CIP;
95           while (CIP < CPUInfoEnd && (*CIP == ' ' || *CIP == '\t'))
96             ++CIP;
97 
98           if (CIP < CPUInfoEnd && *CIP == ':') {
99             ++CIP;
100             while (CIP < CPUInfoEnd && (*CIP == ' ' || *CIP == '\t'))
101               ++CIP;
102 
103             if (CIP < CPUInfoEnd) {
104               CPUStart = CIP;
105               while (CIP < CPUInfoEnd && (*CIP != ' ' && *CIP != '\t' &&
106                                           *CIP != ',' && *CIP != '\n'))
107                 ++CIP;
108               CPULen = CIP - CPUStart;
109             }
110           }
111         }
112       }
113     }
114 
115     if (CPUStart == 0)
116       while (CIP < CPUInfoEnd && *CIP != '\n')
117         ++CIP;
118   }
119 
120   if (CPUStart == 0)
121     return generic;
122 
123   return StringSwitch<const char *>(StringRef(CPUStart, CPULen))
124       .Case("604e", "604e")
125       .Case("604", "604")
126       .Case("7400", "7400")
127       .Case("7410", "7400")
128       .Case("7447", "7400")
129       .Case("7455", "7450")
130       .Case("G4", "g4")
131       .Case("POWER4", "970")
132       .Case("PPC970FX", "970")
133       .Case("PPC970MP", "970")
134       .Case("G5", "g5")
135       .Case("POWER5", "g5")
136       .Case("A2", "a2")
137       .Case("POWER6", "pwr6")
138       .Case("POWER7", "pwr7")
139       .Case("POWER8", "pwr8")
140       .Case("POWER8E", "pwr8")
141       .Case("POWER8NVL", "pwr8")
142       .Case("POWER9", "pwr9")
143       .Default(generic);
144 }
145 
146 StringRef sys::detail::getHostCPUNameForARM(StringRef ProcCpuinfoContent) {
147   // The cpuid register on arm is not accessible from user space. On Linux,
148   // it is exposed through the /proc/cpuinfo file.
149 
150   // Read 32 lines from /proc/cpuinfo, which should contain the CPU part line
151   // in all cases.
152   SmallVector<StringRef, 32> Lines;
153   ProcCpuinfoContent.split(Lines, "\n");
154 
155   // Look for the CPU implementer line.
156   StringRef Implementer;
157   StringRef Hardware;
158   for (unsigned I = 0, E = Lines.size(); I != E; ++I) {
159     if (Lines[I].startswith("CPU implementer"))
160       Implementer = Lines[I].substr(15).ltrim("\t :");
161     if (Lines[I].startswith("Hardware"))
162       Hardware = Lines[I].substr(8).ltrim("\t :");
163   }
164 
165   if (Implementer == "0x41") { // ARM Ltd.
166     // MSM8992/8994 may give cpu part for the core that the kernel is running on,
167     // which is undeterministic and wrong. Always return cortex-a53 for these SoC.
168     if (Hardware.endswith("MSM8994") || Hardware.endswith("MSM8996"))
169       return "cortex-a53";
170 
171 
172     // Look for the CPU part line.
173     for (unsigned I = 0, E = Lines.size(); I != E; ++I)
174       if (Lines[I].startswith("CPU part"))
175         // The CPU part is a 3 digit hexadecimal number with a 0x prefix. The
176         // values correspond to the "Part number" in the CP15/c0 register. The
177         // contents are specified in the various processor manuals.
178         return StringSwitch<const char *>(Lines[I].substr(8).ltrim("\t :"))
179             .Case("0x926", "arm926ej-s")
180             .Case("0xb02", "mpcore")
181             .Case("0xb36", "arm1136j-s")
182             .Case("0xb56", "arm1156t2-s")
183             .Case("0xb76", "arm1176jz-s")
184             .Case("0xc08", "cortex-a8")
185             .Case("0xc09", "cortex-a9")
186             .Case("0xc0f", "cortex-a15")
187             .Case("0xc20", "cortex-m0")
188             .Case("0xc23", "cortex-m3")
189             .Case("0xc24", "cortex-m4")
190             .Case("0xd04", "cortex-a35")
191             .Case("0xd03", "cortex-a53")
192             .Case("0xd07", "cortex-a57")
193             .Case("0xd08", "cortex-a72")
194             .Case("0xd09", "cortex-a73")
195             .Case("0xd0a", "cortex-a75")
196             .Case("0xd0b", "cortex-a76")
197             .Default("generic");
198   }
199 
200   if (Implementer == "0x42" || Implementer == "0x43") { // Broadcom | Cavium.
201     for (unsigned I = 0, E = Lines.size(); I != E; ++I) {
202       if (Lines[I].startswith("CPU part")) {
203         return StringSwitch<const char *>(Lines[I].substr(8).ltrim("\t :"))
204           .Case("0x516", "thunderx2t99")
205           .Case("0x0516", "thunderx2t99")
206           .Case("0xaf", "thunderx2t99")
207           .Case("0x0af", "thunderx2t99")
208           .Case("0xa1", "thunderxt88")
209           .Case("0x0a1", "thunderxt88")
210           .Default("generic");
211       }
212     }
213   }
214 
215   if (Implementer == "0x48") // HiSilicon Technologies, Inc.
216     // Look for the CPU part line.
217     for (unsigned I = 0, E = Lines.size(); I != E; ++I)
218       if (Lines[I].startswith("CPU part"))
219         // The CPU part is a 3 digit hexadecimal number with a 0x prefix. The
220         // values correspond to the "Part number" in the CP15/c0 register. The
221         // contents are specified in the various processor manuals.
222         return StringSwitch<const char *>(Lines[I].substr(8).ltrim("\t :"))
223           .Case("0xd01", "tsv110")
224           .Default("generic");
225 
226   if (Implementer == "0x51") // Qualcomm Technologies, Inc.
227     // Look for the CPU part line.
228     for (unsigned I = 0, E = Lines.size(); I != E; ++I)
229       if (Lines[I].startswith("CPU part"))
230         // The CPU part is a 3 digit hexadecimal number with a 0x prefix. The
231         // values correspond to the "Part number" in the CP15/c0 register. The
232         // contents are specified in the various processor manuals.
233         return StringSwitch<const char *>(Lines[I].substr(8).ltrim("\t :"))
234             .Case("0x06f", "krait") // APQ8064
235             .Case("0x201", "kryo")
236             .Case("0x205", "kryo")
237             .Case("0x211", "kryo")
238             .Case("0x800", "cortex-a73")
239             .Case("0x801", "cortex-a73")
240             .Case("0x802", "cortex-a73")
241             .Case("0x803", "cortex-a73")
242             .Case("0x804", "cortex-a73")
243             .Case("0x805", "cortex-a73")
244             .Case("0xc00", "falkor")
245             .Case("0xc01", "saphira")
246             .Default("generic");
247 
248   if (Implementer == "0x53") { // Samsung Electronics Co., Ltd.
249     // The Exynos chips have a convoluted ID scheme that doesn't seem to follow
250     // any predictive pattern across variants and parts.
251     unsigned Variant = 0, Part = 0;
252 
253     // Look for the CPU variant line, whose value is a 1 digit hexadecimal
254     // number, corresponding to the Variant bits in the CP15/C0 register.
255     for (auto I : Lines)
256       if (I.consume_front("CPU variant"))
257         I.ltrim("\t :").getAsInteger(0, Variant);
258 
259     // Look for the CPU part line, whose value is a 3 digit hexadecimal
260     // number, corresponding to the PartNum bits in the CP15/C0 register.
261     for (auto I : Lines)
262       if (I.consume_front("CPU part"))
263         I.ltrim("\t :").getAsInteger(0, Part);
264 
265     unsigned Exynos = (Variant << 12) | Part;
266     switch (Exynos) {
267     default:
268       // Default by falling through to Exynos M1.
269       LLVM_FALLTHROUGH;
270 
271     case 0x1001:
272       return "exynos-m1";
273 
274     case 0x4001:
275       return "exynos-m2";
276     }
277   }
278 
279   return "generic";
280 }
281 
282 StringRef sys::detail::getHostCPUNameForS390x(StringRef ProcCpuinfoContent) {
283   // STIDP is a privileged operation, so use /proc/cpuinfo instead.
284 
285   // The "processor 0:" line comes after a fair amount of other information,
286   // including a cache breakdown, but this should be plenty.
287   SmallVector<StringRef, 32> Lines;
288   ProcCpuinfoContent.split(Lines, "\n");
289 
290   // Look for the CPU features.
291   SmallVector<StringRef, 32> CPUFeatures;
292   for (unsigned I = 0, E = Lines.size(); I != E; ++I)
293     if (Lines[I].startswith("features")) {
294       size_t Pos = Lines[I].find(":");
295       if (Pos != StringRef::npos) {
296         Lines[I].drop_front(Pos + 1).split(CPUFeatures, ' ');
297         break;
298       }
299     }
300 
301   // We need to check for the presence of vector support independently of
302   // the machine type, since we may only use the vector register set when
303   // supported by the kernel (and hypervisor).
304   bool HaveVectorSupport = false;
305   for (unsigned I = 0, E = CPUFeatures.size(); I != E; ++I) {
306     if (CPUFeatures[I] == "vx")
307       HaveVectorSupport = true;
308   }
309 
310   // Now check the processor machine type.
311   for (unsigned I = 0, E = Lines.size(); I != E; ++I) {
312     if (Lines[I].startswith("processor ")) {
313       size_t Pos = Lines[I].find("machine = ");
314       if (Pos != StringRef::npos) {
315         Pos += sizeof("machine = ") - 1;
316         unsigned int Id;
317         if (!Lines[I].drop_front(Pos).getAsInteger(10, Id)) {
318           if (Id >= 8561 && HaveVectorSupport)
319             return "arch13";
320           if (Id >= 3906 && HaveVectorSupport)
321             return "z14";
322           if (Id >= 2964 && HaveVectorSupport)
323             return "z13";
324           if (Id >= 2827)
325             return "zEC12";
326           if (Id >= 2817)
327             return "z196";
328         }
329       }
330       break;
331     }
332   }
333 
334   return "generic";
335 }
336 
337 StringRef sys::detail::getHostCPUNameForBPF() {
338 #if !defined(__linux__) || !defined(__x86_64__)
339   return "generic";
340 #else
341   uint8_t v3_insns[40] __attribute__ ((aligned (8))) =
342       /* BPF_MOV64_IMM(BPF_REG_0, 0) */
343     { 0xb7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
344       /* BPF_MOV64_IMM(BPF_REG_2, 1) */
345       0xb7, 0x2, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0,
346       /* BPF_JMP32_REG(BPF_JLT, BPF_REG_0, BPF_REG_2, 1) */
347       0xae, 0x20, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0,
348       /* BPF_MOV64_IMM(BPF_REG_0, 1) */
349       0xb7, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0,
350       /* BPF_EXIT_INSN() */
351       0x95, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
352 
353   uint8_t v2_insns[40] __attribute__ ((aligned (8))) =
354       /* BPF_MOV64_IMM(BPF_REG_0, 0) */
355     { 0xb7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
356       /* BPF_MOV64_IMM(BPF_REG_2, 1) */
357       0xb7, 0x2, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0,
358       /* BPF_JMP_REG(BPF_JLT, BPF_REG_0, BPF_REG_2, 1) */
359       0xad, 0x20, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0,
360       /* BPF_MOV64_IMM(BPF_REG_0, 1) */
361       0xb7, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0,
362       /* BPF_EXIT_INSN() */
363       0x95, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
364 
365   struct bpf_prog_load_attr {
366     uint32_t prog_type;
367     uint32_t insn_cnt;
368     uint64_t insns;
369     uint64_t license;
370     uint32_t log_level;
371     uint32_t log_size;
372     uint64_t log_buf;
373     uint32_t kern_version;
374     uint32_t prog_flags;
375   } attr = {};
376   attr.prog_type = 1; /* BPF_PROG_TYPE_SOCKET_FILTER */
377   attr.insn_cnt = 5;
378   attr.insns = (uint64_t)v3_insns;
379   attr.license = (uint64_t)"DUMMY";
380 
381   int fd = syscall(321 /* __NR_bpf */, 5 /* BPF_PROG_LOAD */, &attr,
382                    sizeof(attr));
383   if (fd >= 0) {
384     close(fd);
385     return "v3";
386   }
387 
388   /* Clear the whole attr in case its content changed by syscall. */
389   memset(&attr, 0, sizeof(attr));
390   attr.prog_type = 1; /* BPF_PROG_TYPE_SOCKET_FILTER */
391   attr.insn_cnt = 5;
392   attr.insns = (uint64_t)v2_insns;
393   attr.license = (uint64_t)"DUMMY";
394   fd = syscall(321 /* __NR_bpf */, 5 /* BPF_PROG_LOAD */, &attr, sizeof(attr));
395   if (fd >= 0) {
396     close(fd);
397     return "v2";
398   }
399   return "v1";
400 #endif
401 }
402 
403 #if defined(__i386__) || defined(_M_IX86) || \
404     defined(__x86_64__) || defined(_M_X64)
405 
406 enum VendorSignatures {
407   SIG_INTEL = 0x756e6547 /* Genu */,
408   SIG_AMD = 0x68747541 /* Auth */
409 };
410 
411 // The check below for i386 was copied from clang's cpuid.h (__get_cpuid_max).
412 // Check motivated by bug reports for OpenSSL crashing on CPUs without CPUID
413 // support. Consequently, for i386, the presence of CPUID is checked first
414 // via the corresponding eflags bit.
415 // Removal of cpuid.h header motivated by PR30384
416 // Header cpuid.h and method __get_cpuid_max are not used in llvm, clang, openmp
417 // or test-suite, but are used in external projects e.g. libstdcxx
418 static bool isCpuIdSupported() {
419 #if defined(__GNUC__) || defined(__clang__)
420 #if defined(__i386__)
421   int __cpuid_supported;
422   __asm__("  pushfl\n"
423           "  popl   %%eax\n"
424           "  movl   %%eax,%%ecx\n"
425           "  xorl   $0x00200000,%%eax\n"
426           "  pushl  %%eax\n"
427           "  popfl\n"
428           "  pushfl\n"
429           "  popl   %%eax\n"
430           "  movl   $0,%0\n"
431           "  cmpl   %%eax,%%ecx\n"
432           "  je     1f\n"
433           "  movl   $1,%0\n"
434           "1:"
435           : "=r"(__cpuid_supported)
436           :
437           : "eax", "ecx");
438   if (!__cpuid_supported)
439     return false;
440 #endif
441   return true;
442 #endif
443   return true;
444 }
445 
446 /// getX86CpuIDAndInfo - Execute the specified cpuid and return the 4 values in
447 /// the specified arguments.  If we can't run cpuid on the host, return true.
448 static bool getX86CpuIDAndInfo(unsigned value, unsigned *rEAX, unsigned *rEBX,
449                                unsigned *rECX, unsigned *rEDX) {
450 #if defined(__GNUC__) || defined(__clang__)
451 #if defined(__x86_64__)
452   // gcc doesn't know cpuid would clobber ebx/rbx. Preserve it manually.
453   // FIXME: should we save this for Clang?
454   __asm__("movq\t%%rbx, %%rsi\n\t"
455           "cpuid\n\t"
456           "xchgq\t%%rbx, %%rsi\n\t"
457           : "=a"(*rEAX), "=S"(*rEBX), "=c"(*rECX), "=d"(*rEDX)
458           : "a"(value));
459   return false;
460 #elif defined(__i386__)
461   __asm__("movl\t%%ebx, %%esi\n\t"
462           "cpuid\n\t"
463           "xchgl\t%%ebx, %%esi\n\t"
464           : "=a"(*rEAX), "=S"(*rEBX), "=c"(*rECX), "=d"(*rEDX)
465           : "a"(value));
466   return false;
467 #else
468   return true;
469 #endif
470 #elif defined(_MSC_VER)
471   // The MSVC intrinsic is portable across x86 and x64.
472   int registers[4];
473   __cpuid(registers, value);
474   *rEAX = registers[0];
475   *rEBX = registers[1];
476   *rECX = registers[2];
477   *rEDX = registers[3];
478   return false;
479 #else
480   return true;
481 #endif
482 }
483 
484 /// getX86CpuIDAndInfoEx - Execute the specified cpuid with subleaf and return
485 /// the 4 values in the specified arguments.  If we can't run cpuid on the host,
486 /// return true.
487 static bool getX86CpuIDAndInfoEx(unsigned value, unsigned subleaf,
488                                  unsigned *rEAX, unsigned *rEBX, unsigned *rECX,
489                                  unsigned *rEDX) {
490 #if defined(__GNUC__) || defined(__clang__)
491 #if defined(__x86_64__)
492   // gcc doesn't know cpuid would clobber ebx/rbx. Preserve it manually.
493   // FIXME: should we save this for Clang?
494   __asm__("movq\t%%rbx, %%rsi\n\t"
495           "cpuid\n\t"
496           "xchgq\t%%rbx, %%rsi\n\t"
497           : "=a"(*rEAX), "=S"(*rEBX), "=c"(*rECX), "=d"(*rEDX)
498           : "a"(value), "c"(subleaf));
499   return false;
500 #elif defined(__i386__)
501   __asm__("movl\t%%ebx, %%esi\n\t"
502           "cpuid\n\t"
503           "xchgl\t%%ebx, %%esi\n\t"
504           : "=a"(*rEAX), "=S"(*rEBX), "=c"(*rECX), "=d"(*rEDX)
505           : "a"(value), "c"(subleaf));
506   return false;
507 #else
508   return true;
509 #endif
510 #elif defined(_MSC_VER)
511   int registers[4];
512   __cpuidex(registers, value, subleaf);
513   *rEAX = registers[0];
514   *rEBX = registers[1];
515   *rECX = registers[2];
516   *rEDX = registers[3];
517   return false;
518 #else
519   return true;
520 #endif
521 }
522 
523 // Read control register 0 (XCR0). Used to detect features such as AVX.
524 static bool getX86XCR0(unsigned *rEAX, unsigned *rEDX) {
525 #if defined(__GNUC__) || defined(__clang__)
526   // Check xgetbv; this uses a .byte sequence instead of the instruction
527   // directly because older assemblers do not include support for xgetbv and
528   // there is no easy way to conditionally compile based on the assembler used.
529   __asm__(".byte 0x0f, 0x01, 0xd0" : "=a"(*rEAX), "=d"(*rEDX) : "c"(0));
530   return false;
531 #elif defined(_MSC_FULL_VER) && defined(_XCR_XFEATURE_ENABLED_MASK)
532   unsigned long long Result = _xgetbv(_XCR_XFEATURE_ENABLED_MASK);
533   *rEAX = Result;
534   *rEDX = Result >> 32;
535   return false;
536 #else
537   return true;
538 #endif
539 }
540 
541 static void detectX86FamilyModel(unsigned EAX, unsigned *Family,
542                                  unsigned *Model) {
543   *Family = (EAX >> 8) & 0xf; // Bits 8 - 11
544   *Model = (EAX >> 4) & 0xf;  // Bits 4 - 7
545   if (*Family == 6 || *Family == 0xf) {
546     if (*Family == 0xf)
547       // Examine extended family ID if family ID is F.
548       *Family += (EAX >> 20) & 0xff; // Bits 20 - 27
549     // Examine extended model ID if family ID is 6 or F.
550     *Model += ((EAX >> 16) & 0xf) << 4; // Bits 16 - 19
551   }
552 }
553 
554 static void
555 getIntelProcessorTypeAndSubtype(unsigned Family, unsigned Model,
556                                 unsigned Brand_id, unsigned Features,
557                                 unsigned Features2, unsigned Features3,
558                                 unsigned *Type, unsigned *Subtype) {
559   if (Brand_id != 0)
560     return;
561   switch (Family) {
562   case 3:
563     *Type = X86::INTEL_i386;
564     break;
565   case 4:
566     *Type = X86::INTEL_i486;
567     break;
568   case 5:
569     if (Features & (1 << X86::FEATURE_MMX)) {
570       *Type = X86::INTEL_PENTIUM_MMX;
571       break;
572     }
573     *Type = X86::INTEL_PENTIUM;
574     break;
575   case 6:
576     switch (Model) {
577     case 0x01: // Pentium Pro processor
578       *Type = X86::INTEL_PENTIUM_PRO;
579       break;
580     case 0x03: // Intel Pentium II OverDrive processor, Pentium II processor,
581                // model 03
582     case 0x05: // Pentium II processor, model 05, Pentium II Xeon processor,
583                // model 05, and Intel Celeron processor, model 05
584     case 0x06: // Celeron processor, model 06
585       *Type = X86::INTEL_PENTIUM_II;
586       break;
587     case 0x07: // Pentium III processor, model 07, and Pentium III Xeon
588                // processor, model 07
589     case 0x08: // Pentium III processor, model 08, Pentium III Xeon processor,
590                // model 08, and Celeron processor, model 08
591     case 0x0a: // Pentium III Xeon processor, model 0Ah
592     case 0x0b: // Pentium III processor, model 0Bh
593       *Type = X86::INTEL_PENTIUM_III;
594       break;
595     case 0x09: // Intel Pentium M processor, Intel Celeron M processor model 09.
596     case 0x0d: // Intel Pentium M processor, Intel Celeron M processor, model
597                // 0Dh. All processors are manufactured using the 90 nm process.
598     case 0x15: // Intel EP80579 Integrated Processor and Intel EP80579
599                // Integrated Processor with Intel QuickAssist Technology
600       *Type = X86::INTEL_PENTIUM_M;
601       break;
602     case 0x0e: // Intel Core Duo processor, Intel Core Solo processor, model
603                // 0Eh. All processors are manufactured using the 65 nm process.
604       *Type = X86::INTEL_CORE_DUO;
605       break;   // yonah
606     case 0x0f: // Intel Core 2 Duo processor, Intel Core 2 Duo mobile
607                // processor, Intel Core 2 Quad processor, Intel Core 2 Quad
608                // mobile processor, Intel Core 2 Extreme processor, Intel
609                // Pentium Dual-Core processor, Intel Xeon processor, model
610                // 0Fh. All processors are manufactured using the 65 nm process.
611     case 0x16: // Intel Celeron processor model 16h. All processors are
612                // manufactured using the 65 nm process
613       *Type = X86::INTEL_CORE2; // "core2"
614       *Subtype = X86::INTEL_CORE2_65;
615       break;
616     case 0x17: // Intel Core 2 Extreme processor, Intel Xeon processor, model
617                // 17h. All processors are manufactured using the 45 nm process.
618                //
619                // 45nm: Penryn , Wolfdale, Yorkfield (XE)
620     case 0x1d: // Intel Xeon processor MP. All processors are manufactured using
621                // the 45 nm process.
622       *Type = X86::INTEL_CORE2; // "penryn"
623       *Subtype = X86::INTEL_CORE2_45;
624       break;
625     case 0x1a: // Intel Core i7 processor and Intel Xeon processor. All
626                // processors are manufactured using the 45 nm process.
627     case 0x1e: // Intel(R) Core(TM) i7 CPU         870  @ 2.93GHz.
628                // As found in a Summer 2010 model iMac.
629     case 0x1f:
630     case 0x2e:             // Nehalem EX
631       *Type = X86::INTEL_COREI7; // "nehalem"
632       *Subtype = X86::INTEL_COREI7_NEHALEM;
633       break;
634     case 0x25: // Intel Core i7, laptop version.
635     case 0x2c: // Intel Core i7 processor and Intel Xeon processor. All
636                // processors are manufactured using the 32 nm process.
637     case 0x2f: // Westmere EX
638       *Type = X86::INTEL_COREI7; // "westmere"
639       *Subtype = X86::INTEL_COREI7_WESTMERE;
640       break;
641     case 0x2a: // Intel Core i7 processor. All processors are manufactured
642                // using the 32 nm process.
643     case 0x2d:
644       *Type = X86::INTEL_COREI7; //"sandybridge"
645       *Subtype = X86::INTEL_COREI7_SANDYBRIDGE;
646       break;
647     case 0x3a:
648     case 0x3e:             // Ivy Bridge EP
649       *Type = X86::INTEL_COREI7; // "ivybridge"
650       *Subtype = X86::INTEL_COREI7_IVYBRIDGE;
651       break;
652 
653     // Haswell:
654     case 0x3c:
655     case 0x3f:
656     case 0x45:
657     case 0x46:
658       *Type = X86::INTEL_COREI7; // "haswell"
659       *Subtype = X86::INTEL_COREI7_HASWELL;
660       break;
661 
662     // Broadwell:
663     case 0x3d:
664     case 0x47:
665     case 0x4f:
666     case 0x56:
667       *Type = X86::INTEL_COREI7; // "broadwell"
668       *Subtype = X86::INTEL_COREI7_BROADWELL;
669       break;
670 
671     // Skylake:
672     case 0x4e:              // Skylake mobile
673     case 0x5e:              // Skylake desktop
674     case 0x8e:              // Kaby Lake mobile
675     case 0x9e:              // Kaby Lake desktop
676       *Type = X86::INTEL_COREI7; // "skylake"
677       *Subtype = X86::INTEL_COREI7_SKYLAKE;
678       break;
679 
680     // Skylake Xeon:
681     case 0x55:
682       *Type = X86::INTEL_COREI7;
683       if (Features3 & (1 << (X86::FEATURE_AVX512BF16 - 64)))
684         *Subtype = X86::INTEL_COREI7_COOPERLAKE; // "cooperlake"
685       else if (Features2 & (1 << (X86::FEATURE_AVX512VNNI - 32)))
686         *Subtype = X86::INTEL_COREI7_CASCADELAKE; // "cascadelake"
687       else
688         *Subtype = X86::INTEL_COREI7_SKYLAKE_AVX512; // "skylake-avx512"
689       break;
690 
691     // Cannonlake:
692     case 0x66:
693       *Type = X86::INTEL_COREI7;
694       *Subtype = X86::INTEL_COREI7_CANNONLAKE; // "cannonlake"
695       break;
696 
697     // Icelake:
698     case 0x7d:
699     case 0x7e:
700       *Type = X86::INTEL_COREI7;
701       *Subtype = X86::INTEL_COREI7_ICELAKE_CLIENT; // "icelake-client"
702       break;
703 
704     // Icelake Xeon:
705     case 0x6a:
706     case 0x6c:
707       *Type = X86::INTEL_COREI7;
708       *Subtype = X86::INTEL_COREI7_ICELAKE_SERVER; // "icelake-server"
709       break;
710 
711     case 0x1c: // Most 45 nm Intel Atom processors
712     case 0x26: // 45 nm Atom Lincroft
713     case 0x27: // 32 nm Atom Medfield
714     case 0x35: // 32 nm Atom Midview
715     case 0x36: // 32 nm Atom Midview
716       *Type = X86::INTEL_BONNELL;
717       break; // "bonnell"
718 
719     // Atom Silvermont codes from the Intel software optimization guide.
720     case 0x37:
721     case 0x4a:
722     case 0x4d:
723     case 0x5a:
724     case 0x5d:
725     case 0x4c: // really airmont
726       *Type = X86::INTEL_SILVERMONT;
727       break; // "silvermont"
728     // Goldmont:
729     case 0x5c: // Apollo Lake
730     case 0x5f: // Denverton
731       *Type = X86::INTEL_GOLDMONT;
732       break; // "goldmont"
733     case 0x7a:
734       *Type = X86::INTEL_GOLDMONT_PLUS;
735       break;
736     case 0x86:
737       *Type = X86::INTEL_TREMONT;
738       break;
739 
740     case 0x57:
741       *Type = X86::INTEL_KNL; // knl
742       break;
743 
744     case 0x85:
745       *Type = X86::INTEL_KNM; // knm
746       break;
747 
748     default: // Unknown family 6 CPU, try to guess.
749       // TODO detect tigerlake host
750       if (Features3 & (1 << (X86::FEATURE_AVX512VP2INTERSECT - 64))) {
751         *Type = X86::INTEL_COREI7;
752         *Subtype = X86::INTEL_COREI7_TIGERLAKE;
753         break;
754       }
755 
756       if (Features & (1 << X86::FEATURE_AVX512VBMI2)) {
757         *Type = X86::INTEL_COREI7;
758         *Subtype = X86::INTEL_COREI7_ICELAKE_CLIENT;
759         break;
760       }
761 
762       if (Features & (1 << X86::FEATURE_AVX512VBMI)) {
763         *Type = X86::INTEL_COREI7;
764         *Subtype = X86::INTEL_COREI7_CANNONLAKE;
765         break;
766       }
767 
768       if (Features3 & (1 << (X86::FEATURE_AVX512BF16 - 64))) {
769         *Type = X86::INTEL_COREI7;
770         *Subtype = X86::INTEL_COREI7_COOPERLAKE;
771         break;
772       }
773 
774       if (Features2 & (1 << (X86::FEATURE_AVX512VNNI - 32))) {
775         *Type = X86::INTEL_COREI7;
776         *Subtype = X86::INTEL_COREI7_CASCADELAKE;
777         break;
778       }
779 
780       if (Features & (1 << X86::FEATURE_AVX512VL)) {
781         *Type = X86::INTEL_COREI7;
782         *Subtype = X86::INTEL_COREI7_SKYLAKE_AVX512;
783         break;
784       }
785 
786       if (Features & (1 << X86::FEATURE_AVX512ER)) {
787         *Type = X86::INTEL_KNL; // knl
788         break;
789       }
790 
791       if (Features3 & (1 << (X86::FEATURE_CLFLUSHOPT - 64))) {
792         if (Features3 & (1 << (X86::FEATURE_SHA - 64))) {
793           *Type = X86::INTEL_GOLDMONT;
794         } else {
795           *Type = X86::INTEL_COREI7;
796           *Subtype = X86::INTEL_COREI7_SKYLAKE;
797         }
798         break;
799       }
800       if (Features3 & (1 << (X86::FEATURE_ADX - 64))) {
801         *Type = X86::INTEL_COREI7;
802         *Subtype = X86::INTEL_COREI7_BROADWELL;
803         break;
804       }
805       if (Features & (1 << X86::FEATURE_AVX2)) {
806         *Type = X86::INTEL_COREI7;
807         *Subtype = X86::INTEL_COREI7_HASWELL;
808         break;
809       }
810       if (Features & (1 << X86::FEATURE_AVX)) {
811         *Type = X86::INTEL_COREI7;
812         *Subtype = X86::INTEL_COREI7_SANDYBRIDGE;
813         break;
814       }
815       if (Features & (1 << X86::FEATURE_SSE4_2)) {
816         if (Features3 & (1 << (X86::FEATURE_MOVBE - 64))) {
817           *Type = X86::INTEL_SILVERMONT;
818         } else {
819           *Type = X86::INTEL_COREI7;
820           *Subtype = X86::INTEL_COREI7_NEHALEM;
821         }
822         break;
823       }
824       if (Features & (1 << X86::FEATURE_SSE4_1)) {
825         *Type = X86::INTEL_CORE2; // "penryn"
826         *Subtype = X86::INTEL_CORE2_45;
827         break;
828       }
829       if (Features & (1 << X86::FEATURE_SSSE3)) {
830         if (Features3 & (1 << (X86::FEATURE_MOVBE - 64))) {
831           *Type = X86::INTEL_BONNELL; // "bonnell"
832         } else {
833           *Type = X86::INTEL_CORE2; // "core2"
834           *Subtype = X86::INTEL_CORE2_65;
835         }
836         break;
837       }
838       if (Features3 & (1 << (X86::FEATURE_EM64T - 64))) {
839         *Type = X86::INTEL_CORE2; // "core2"
840         *Subtype = X86::INTEL_CORE2_65;
841         break;
842       }
843       if (Features & (1 << X86::FEATURE_SSE3)) {
844         *Type = X86::INTEL_CORE_DUO;
845         break;
846       }
847       if (Features & (1 << X86::FEATURE_SSE2)) {
848         *Type = X86::INTEL_PENTIUM_M;
849         break;
850       }
851       if (Features & (1 << X86::FEATURE_SSE)) {
852         *Type = X86::INTEL_PENTIUM_III;
853         break;
854       }
855       if (Features & (1 << X86::FEATURE_MMX)) {
856         *Type = X86::INTEL_PENTIUM_II;
857         break;
858       }
859       *Type = X86::INTEL_PENTIUM_PRO;
860       break;
861     }
862     break;
863   case 15: {
864     if (Features3 & (1 << (X86::FEATURE_EM64T - 64))) {
865       *Type = X86::INTEL_NOCONA;
866       break;
867     }
868     if (Features & (1 << X86::FEATURE_SSE3)) {
869       *Type = X86::INTEL_PRESCOTT;
870       break;
871     }
872     *Type = X86::INTEL_PENTIUM_IV;
873     break;
874   }
875   default:
876     break; /*"generic"*/
877   }
878 }
879 
880 static void getAMDProcessorTypeAndSubtype(unsigned Family, unsigned Model,
881                                           unsigned Features, unsigned *Type,
882                                           unsigned *Subtype) {
883   // FIXME: this poorly matches the generated SubtargetFeatureKV table.  There
884   // appears to be no way to generate the wide variety of AMD-specific targets
885   // from the information returned from CPUID.
886   switch (Family) {
887   case 4:
888     *Type = X86::AMD_i486;
889     break;
890   case 5:
891     *Type = X86::AMDPENTIUM;
892     switch (Model) {
893     case 6:
894     case 7:
895       *Subtype = X86::AMDPENTIUM_K6;
896       break; // "k6"
897     case 8:
898       *Subtype = X86::AMDPENTIUM_K62;
899       break; // "k6-2"
900     case 9:
901     case 13:
902       *Subtype = X86::AMDPENTIUM_K63;
903       break; // "k6-3"
904     case 10:
905       *Subtype = X86::AMDPENTIUM_GEODE;
906       break; // "geode"
907     }
908     break;
909   case 6:
910     if (Features & (1 << X86::FEATURE_SSE)) {
911       *Type = X86::AMD_ATHLON_XP;
912       break; // "athlon-xp"
913     }
914     *Type = X86::AMD_ATHLON;
915     break; // "athlon"
916   case 15:
917     if (Features & (1 << X86::FEATURE_SSE3)) {
918       *Type = X86::AMD_K8SSE3;
919       break; // "k8-sse3"
920     }
921     *Type = X86::AMD_K8;
922     break; // "k8"
923   case 16:
924     *Type = X86::AMDFAM10H; // "amdfam10"
925     switch (Model) {
926     case 2:
927       *Subtype = X86::AMDFAM10H_BARCELONA;
928       break;
929     case 4:
930       *Subtype = X86::AMDFAM10H_SHANGHAI;
931       break;
932     case 8:
933       *Subtype = X86::AMDFAM10H_ISTANBUL;
934       break;
935     }
936     break;
937   case 20:
938     *Type = X86::AMD_BTVER1;
939     break; // "btver1";
940   case 21:
941     *Type = X86::AMDFAM15H;
942     if (Model >= 0x60 && Model <= 0x7f) {
943       *Subtype = X86::AMDFAM15H_BDVER4;
944       break; // "bdver4"; 60h-7Fh: Excavator
945     }
946     if (Model >= 0x30 && Model <= 0x3f) {
947       *Subtype = X86::AMDFAM15H_BDVER3;
948       break; // "bdver3"; 30h-3Fh: Steamroller
949     }
950     if ((Model >= 0x10 && Model <= 0x1f) || Model == 0x02) {
951       *Subtype = X86::AMDFAM15H_BDVER2;
952       break; // "bdver2"; 02h, 10h-1Fh: Piledriver
953     }
954     if (Model <= 0x0f) {
955       *Subtype = X86::AMDFAM15H_BDVER1;
956       break; // "bdver1"; 00h-0Fh: Bulldozer
957     }
958     break;
959   case 22:
960     *Type = X86::AMD_BTVER2;
961     break; // "btver2"
962   case 23:
963     *Type = X86::AMDFAM17H;
964     if (Model >= 0x30 && Model <= 0x3f) {
965       *Subtype = X86::AMDFAM17H_ZNVER2;
966       break; // "znver2"; 30h-3fh: Zen2
967     }
968     if (Model <= 0x0f) {
969       *Subtype = X86::AMDFAM17H_ZNVER1;
970       break; // "znver1"; 00h-0Fh: Zen1
971     }
972     break;
973   default:
974     break; // "generic"
975   }
976 }
977 
978 static void getAvailableFeatures(unsigned ECX, unsigned EDX, unsigned MaxLeaf,
979                                  unsigned *FeaturesOut, unsigned *Features2Out,
980                                  unsigned *Features3Out) {
981   unsigned Features = 0;
982   unsigned Features2 = 0;
983   unsigned Features3 = 0;
984   unsigned EAX, EBX;
985 
986   auto setFeature = [&](unsigned F) {
987     if (F < 32)
988       Features |= 1U << (F & 0x1f);
989     else if (F < 64)
990       Features2 |= 1U << ((F - 32) & 0x1f);
991     else if (F < 96)
992       Features3 |= 1U << ((F - 64) & 0x1f);
993     else
994       llvm_unreachable("Unexpected FeatureBit");
995   };
996 
997   if ((EDX >> 15) & 1)
998     setFeature(X86::FEATURE_CMOV);
999   if ((EDX >> 23) & 1)
1000     setFeature(X86::FEATURE_MMX);
1001   if ((EDX >> 25) & 1)
1002     setFeature(X86::FEATURE_SSE);
1003   if ((EDX >> 26) & 1)
1004     setFeature(X86::FEATURE_SSE2);
1005 
1006   if ((ECX >> 0) & 1)
1007     setFeature(X86::FEATURE_SSE3);
1008   if ((ECX >> 1) & 1)
1009     setFeature(X86::FEATURE_PCLMUL);
1010   if ((ECX >> 9) & 1)
1011     setFeature(X86::FEATURE_SSSE3);
1012   if ((ECX >> 12) & 1)
1013     setFeature(X86::FEATURE_FMA);
1014   if ((ECX >> 19) & 1)
1015     setFeature(X86::FEATURE_SSE4_1);
1016   if ((ECX >> 20) & 1)
1017     setFeature(X86::FEATURE_SSE4_2);
1018   if ((ECX >> 23) & 1)
1019     setFeature(X86::FEATURE_POPCNT);
1020   if ((ECX >> 25) & 1)
1021     setFeature(X86::FEATURE_AES);
1022 
1023   if ((ECX >> 22) & 1)
1024     setFeature(X86::FEATURE_MOVBE);
1025 
1026   // If CPUID indicates support for XSAVE, XRESTORE and AVX, and XGETBV
1027   // indicates that the AVX registers will be saved and restored on context
1028   // switch, then we have full AVX support.
1029   const unsigned AVXBits = (1 << 27) | (1 << 28);
1030   bool HasAVX = ((ECX & AVXBits) == AVXBits) && !getX86XCR0(&EAX, &EDX) &&
1031                 ((EAX & 0x6) == 0x6);
1032   bool HasAVX512Save = HasAVX && ((EAX & 0xe0) == 0xe0);
1033 
1034   if (HasAVX)
1035     setFeature(X86::FEATURE_AVX);
1036 
1037   bool HasLeaf7 =
1038       MaxLeaf >= 0x7 && !getX86CpuIDAndInfoEx(0x7, 0x0, &EAX, &EBX, &ECX, &EDX);
1039 
1040   if (HasLeaf7 && ((EBX >> 3) & 1))
1041     setFeature(X86::FEATURE_BMI);
1042   if (HasLeaf7 && ((EBX >> 5) & 1) && HasAVX)
1043     setFeature(X86::FEATURE_AVX2);
1044   if (HasLeaf7 && ((EBX >> 8) & 1))
1045     setFeature(X86::FEATURE_BMI2);
1046   if (HasLeaf7 && ((EBX >> 16) & 1) && HasAVX512Save)
1047     setFeature(X86::FEATURE_AVX512F);
1048   if (HasLeaf7 && ((EBX >> 17) & 1) && HasAVX512Save)
1049     setFeature(X86::FEATURE_AVX512DQ);
1050   if (HasLeaf7 && ((EBX >> 19) & 1))
1051     setFeature(X86::FEATURE_ADX);
1052   if (HasLeaf7 && ((EBX >> 21) & 1) && HasAVX512Save)
1053     setFeature(X86::FEATURE_AVX512IFMA);
1054   if (HasLeaf7 && ((EBX >> 23) & 1))
1055     setFeature(X86::FEATURE_CLFLUSHOPT);
1056   if (HasLeaf7 && ((EBX >> 26) & 1) && HasAVX512Save)
1057     setFeature(X86::FEATURE_AVX512PF);
1058   if (HasLeaf7 && ((EBX >> 27) & 1) && HasAVX512Save)
1059     setFeature(X86::FEATURE_AVX512ER);
1060   if (HasLeaf7 && ((EBX >> 28) & 1) && HasAVX512Save)
1061     setFeature(X86::FEATURE_AVX512CD);
1062   if (HasLeaf7 && ((EBX >> 29) & 1))
1063     setFeature(X86::FEATURE_SHA);
1064   if (HasLeaf7 && ((EBX >> 30) & 1) && HasAVX512Save)
1065     setFeature(X86::FEATURE_AVX512BW);
1066   if (HasLeaf7 && ((EBX >> 31) & 1) && HasAVX512Save)
1067     setFeature(X86::FEATURE_AVX512VL);
1068 
1069   if (HasLeaf7 && ((ECX >> 1) & 1) && HasAVX512Save)
1070     setFeature(X86::FEATURE_AVX512VBMI);
1071   if (HasLeaf7 && ((ECX >> 6) & 1) && HasAVX512Save)
1072     setFeature(X86::FEATURE_AVX512VBMI2);
1073   if (HasLeaf7 && ((ECX >> 8) & 1))
1074     setFeature(X86::FEATURE_GFNI);
1075   if (HasLeaf7 && ((ECX >> 10) & 1) && HasAVX)
1076     setFeature(X86::FEATURE_VPCLMULQDQ);
1077   if (HasLeaf7 && ((ECX >> 11) & 1) && HasAVX512Save)
1078     setFeature(X86::FEATURE_AVX512VNNI);
1079   if (HasLeaf7 && ((ECX >> 12) & 1) && HasAVX512Save)
1080     setFeature(X86::FEATURE_AVX512BITALG);
1081   if (HasLeaf7 && ((ECX >> 14) & 1) && HasAVX512Save)
1082     setFeature(X86::FEATURE_AVX512VPOPCNTDQ);
1083 
1084   if (HasLeaf7 && ((EDX >> 2) & 1) && HasAVX512Save)
1085     setFeature(X86::FEATURE_AVX5124VNNIW);
1086   if (HasLeaf7 && ((EDX >> 3) & 1) && HasAVX512Save)
1087     setFeature(X86::FEATURE_AVX5124FMAPS);
1088   if (HasLeaf7 && ((EDX >> 8) & 1) && HasAVX512Save)
1089     setFeature(X86::FEATURE_AVX512VP2INTERSECT);
1090 
1091   unsigned MaxExtLevel;
1092   getX86CpuIDAndInfo(0x80000000, &MaxExtLevel, &EBX, &ECX, &EDX);
1093 
1094   bool HasExtLeaf1 = MaxExtLevel >= 0x80000001 &&
1095                      !getX86CpuIDAndInfo(0x80000001, &EAX, &EBX, &ECX, &EDX);
1096   if (HasExtLeaf1 && ((ECX >> 6) & 1))
1097     setFeature(X86::FEATURE_SSE4_A);
1098   if (HasExtLeaf1 && ((ECX >> 11) & 1))
1099     setFeature(X86::FEATURE_XOP);
1100   if (HasExtLeaf1 && ((ECX >> 16) & 1))
1101     setFeature(X86::FEATURE_FMA4);
1102 
1103   if (HasExtLeaf1 && ((EDX >> 29) & 1))
1104     setFeature(X86::FEATURE_EM64T);
1105 
1106   *FeaturesOut  = Features;
1107   *Features2Out = Features2;
1108   *Features3Out = Features3;
1109 }
1110 
1111 StringRef sys::getHostCPUName() {
1112   unsigned EAX = 0, EBX = 0, ECX = 0, EDX = 0;
1113   unsigned MaxLeaf, Vendor;
1114 
1115 #if defined(__GNUC__) || defined(__clang__)
1116   //FIXME: include cpuid.h from clang or copy __get_cpuid_max here
1117   // and simplify it to not invoke __cpuid (like cpu_model.c in
1118   // compiler-rt/lib/builtins/cpu_model.c?
1119   // Opting for the second option.
1120   if(!isCpuIdSupported())
1121     return "generic";
1122 #endif
1123   if (getX86CpuIDAndInfo(0, &MaxLeaf, &Vendor, &ECX, &EDX) || MaxLeaf < 1)
1124     return "generic";
1125   getX86CpuIDAndInfo(0x1, &EAX, &EBX, &ECX, &EDX);
1126 
1127   unsigned Brand_id = EBX & 0xff;
1128   unsigned Family = 0, Model = 0;
1129   unsigned Features = 0, Features2 = 0, Features3 = 0;
1130   detectX86FamilyModel(EAX, &Family, &Model);
1131   getAvailableFeatures(ECX, EDX, MaxLeaf, &Features, &Features2, &Features3);
1132 
1133   unsigned Type = 0;
1134   unsigned Subtype = 0;
1135 
1136   if (Vendor == SIG_INTEL) {
1137     getIntelProcessorTypeAndSubtype(Family, Model, Brand_id, Features,
1138                                     Features2, Features3, &Type, &Subtype);
1139   } else if (Vendor == SIG_AMD) {
1140     getAMDProcessorTypeAndSubtype(Family, Model, Features, &Type, &Subtype);
1141   }
1142 
1143   // Check subtypes first since those are more specific.
1144 #define X86_CPU_SUBTYPE(ARCHNAME, ENUM) \
1145   if (Subtype == X86::ENUM) \
1146     return ARCHNAME;
1147 #include "llvm/Support/X86TargetParser.def"
1148 
1149   // Now check types.
1150 #define X86_CPU_TYPE(ARCHNAME, ENUM) \
1151   if (Type == X86::ENUM) \
1152     return ARCHNAME;
1153 #include "llvm/Support/X86TargetParser.def"
1154 
1155   return "generic";
1156 }
1157 
1158 #elif defined(__APPLE__) && (defined(__ppc__) || defined(__powerpc__))
1159 StringRef sys::getHostCPUName() {
1160   host_basic_info_data_t hostInfo;
1161   mach_msg_type_number_t infoCount;
1162 
1163   infoCount = HOST_BASIC_INFO_COUNT;
1164   mach_port_t hostPort = mach_host_self();
1165   host_info(hostPort, HOST_BASIC_INFO, (host_info_t)&hostInfo,
1166             &infoCount);
1167   mach_port_deallocate(mach_task_self(), hostPort);
1168 
1169   if (hostInfo.cpu_type != CPU_TYPE_POWERPC)
1170     return "generic";
1171 
1172   switch (hostInfo.cpu_subtype) {
1173   case CPU_SUBTYPE_POWERPC_601:
1174     return "601";
1175   case CPU_SUBTYPE_POWERPC_602:
1176     return "602";
1177   case CPU_SUBTYPE_POWERPC_603:
1178     return "603";
1179   case CPU_SUBTYPE_POWERPC_603e:
1180     return "603e";
1181   case CPU_SUBTYPE_POWERPC_603ev:
1182     return "603ev";
1183   case CPU_SUBTYPE_POWERPC_604:
1184     return "604";
1185   case CPU_SUBTYPE_POWERPC_604e:
1186     return "604e";
1187   case CPU_SUBTYPE_POWERPC_620:
1188     return "620";
1189   case CPU_SUBTYPE_POWERPC_750:
1190     return "750";
1191   case CPU_SUBTYPE_POWERPC_7400:
1192     return "7400";
1193   case CPU_SUBTYPE_POWERPC_7450:
1194     return "7450";
1195   case CPU_SUBTYPE_POWERPC_970:
1196     return "970";
1197   default:;
1198   }
1199 
1200   return "generic";
1201 }
1202 #elif defined(__linux__) && (defined(__ppc__) || defined(__powerpc__))
1203 StringRef sys::getHostCPUName() {
1204   std::unique_ptr<llvm::MemoryBuffer> P = getProcCpuinfoContent();
1205   StringRef Content = P ? P->getBuffer() : "";
1206   return detail::getHostCPUNameForPowerPC(Content);
1207 }
1208 #elif defined(__linux__) && (defined(__arm__) || defined(__aarch64__))
1209 StringRef sys::getHostCPUName() {
1210   std::unique_ptr<llvm::MemoryBuffer> P = getProcCpuinfoContent();
1211   StringRef Content = P ? P->getBuffer() : "";
1212   return detail::getHostCPUNameForARM(Content);
1213 }
1214 #elif defined(__linux__) && defined(__s390x__)
1215 StringRef sys::getHostCPUName() {
1216   std::unique_ptr<llvm::MemoryBuffer> P = getProcCpuinfoContent();
1217   StringRef Content = P ? P->getBuffer() : "";
1218   return detail::getHostCPUNameForS390x(Content);
1219 }
1220 #else
1221 StringRef sys::getHostCPUName() { return "generic"; }
1222 #endif
1223 
1224 #if defined(__linux__) && defined(__x86_64__)
1225 // On Linux, the number of physical cores can be computed from /proc/cpuinfo,
1226 // using the number of unique physical/core id pairs. The following
1227 // implementation reads the /proc/cpuinfo format on an x86_64 system.
1228 static int computeHostNumPhysicalCores() {
1229   // Read /proc/cpuinfo as a stream (until EOF reached). It cannot be
1230   // mmapped because it appears to have 0 size.
1231   llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Text =
1232       llvm::MemoryBuffer::getFileAsStream("/proc/cpuinfo");
1233   if (std::error_code EC = Text.getError()) {
1234     llvm::errs() << "Can't read "
1235                  << "/proc/cpuinfo: " << EC.message() << "\n";
1236     return -1;
1237   }
1238   SmallVector<StringRef, 8> strs;
1239   (*Text)->getBuffer().split(strs, "\n", /*MaxSplit=*/-1,
1240                              /*KeepEmpty=*/false);
1241   int CurPhysicalId = -1;
1242   int CurCoreId = -1;
1243   SmallSet<std::pair<int, int>, 32> UniqueItems;
1244   for (auto &Line : strs) {
1245     Line = Line.trim();
1246     if (!Line.startswith("physical id") && !Line.startswith("core id"))
1247       continue;
1248     std::pair<StringRef, StringRef> Data = Line.split(':');
1249     auto Name = Data.first.trim();
1250     auto Val = Data.second.trim();
1251     if (Name == "physical id") {
1252       assert(CurPhysicalId == -1 &&
1253              "Expected a core id before seeing another physical id");
1254       Val.getAsInteger(10, CurPhysicalId);
1255     }
1256     if (Name == "core id") {
1257       assert(CurCoreId == -1 &&
1258              "Expected a physical id before seeing another core id");
1259       Val.getAsInteger(10, CurCoreId);
1260     }
1261     if (CurPhysicalId != -1 && CurCoreId != -1) {
1262       UniqueItems.insert(std::make_pair(CurPhysicalId, CurCoreId));
1263       CurPhysicalId = -1;
1264       CurCoreId = -1;
1265     }
1266   }
1267   return UniqueItems.size();
1268 }
1269 #elif defined(__APPLE__) && defined(__x86_64__)
1270 #include <sys/param.h>
1271 #include <sys/sysctl.h>
1272 
1273 // Gets the number of *physical cores* on the machine.
1274 static int computeHostNumPhysicalCores() {
1275   uint32_t count;
1276   size_t len = sizeof(count);
1277   sysctlbyname("hw.physicalcpu", &count, &len, NULL, 0);
1278   if (count < 1) {
1279     int nm[2];
1280     nm[0] = CTL_HW;
1281     nm[1] = HW_AVAILCPU;
1282     sysctl(nm, 2, &count, &len, NULL, 0);
1283     if (count < 1)
1284       return -1;
1285   }
1286   return count;
1287 }
1288 #else
1289 // On other systems, return -1 to indicate unknown.
1290 static int computeHostNumPhysicalCores() { return -1; }
1291 #endif
1292 
1293 int sys::getHostNumPhysicalCores() {
1294   static int NumCores = computeHostNumPhysicalCores();
1295   return NumCores;
1296 }
1297 
1298 #if defined(__i386__) || defined(_M_IX86) || \
1299     defined(__x86_64__) || defined(_M_X64)
1300 bool sys::getHostCPUFeatures(StringMap<bool> &Features) {
1301   unsigned EAX = 0, EBX = 0, ECX = 0, EDX = 0;
1302   unsigned MaxLevel;
1303   union {
1304     unsigned u[3];
1305     char c[12];
1306   } text;
1307 
1308   if (getX86CpuIDAndInfo(0, &MaxLevel, text.u + 0, text.u + 2, text.u + 1) ||
1309       MaxLevel < 1)
1310     return false;
1311 
1312   getX86CpuIDAndInfo(1, &EAX, &EBX, &ECX, &EDX);
1313 
1314   Features["cx8"]    = (EDX >>  8) & 1;
1315   Features["cmov"]   = (EDX >> 15) & 1;
1316   Features["mmx"]    = (EDX >> 23) & 1;
1317   Features["fxsr"]   = (EDX >> 24) & 1;
1318   Features["sse"]    = (EDX >> 25) & 1;
1319   Features["sse2"]   = (EDX >> 26) & 1;
1320 
1321   Features["sse3"]   = (ECX >>  0) & 1;
1322   Features["pclmul"] = (ECX >>  1) & 1;
1323   Features["ssse3"]  = (ECX >>  9) & 1;
1324   Features["cx16"]   = (ECX >> 13) & 1;
1325   Features["sse4.1"] = (ECX >> 19) & 1;
1326   Features["sse4.2"] = (ECX >> 20) & 1;
1327   Features["movbe"]  = (ECX >> 22) & 1;
1328   Features["popcnt"] = (ECX >> 23) & 1;
1329   Features["aes"]    = (ECX >> 25) & 1;
1330   Features["rdrnd"]  = (ECX >> 30) & 1;
1331 
1332   // If CPUID indicates support for XSAVE, XRESTORE and AVX, and XGETBV
1333   // indicates that the AVX registers will be saved and restored on context
1334   // switch, then we have full AVX support.
1335   bool HasAVXSave = ((ECX >> 27) & 1) && ((ECX >> 28) & 1) &&
1336                     !getX86XCR0(&EAX, &EDX) && ((EAX & 0x6) == 0x6);
1337   // AVX512 requires additional context to be saved by the OS.
1338   bool HasAVX512Save = HasAVXSave && ((EAX & 0xe0) == 0xe0);
1339 
1340   Features["avx"]   = HasAVXSave;
1341   Features["fma"]   = ((ECX >> 12) & 1) && HasAVXSave;
1342   // Only enable XSAVE if OS has enabled support for saving YMM state.
1343   Features["xsave"] = ((ECX >> 26) & 1) && HasAVXSave;
1344   Features["f16c"]  = ((ECX >> 29) & 1) && HasAVXSave;
1345 
1346   unsigned MaxExtLevel;
1347   getX86CpuIDAndInfo(0x80000000, &MaxExtLevel, &EBX, &ECX, &EDX);
1348 
1349   bool HasExtLeaf1 = MaxExtLevel >= 0x80000001 &&
1350                      !getX86CpuIDAndInfo(0x80000001, &EAX, &EBX, &ECX, &EDX);
1351   Features["sahf"]   = HasExtLeaf1 && ((ECX >>  0) & 1);
1352   Features["lzcnt"]  = HasExtLeaf1 && ((ECX >>  5) & 1);
1353   Features["sse4a"]  = HasExtLeaf1 && ((ECX >>  6) & 1);
1354   Features["prfchw"] = HasExtLeaf1 && ((ECX >>  8) & 1);
1355   Features["xop"]    = HasExtLeaf1 && ((ECX >> 11) & 1) && HasAVXSave;
1356   Features["lwp"]    = HasExtLeaf1 && ((ECX >> 15) & 1);
1357   Features["fma4"]   = HasExtLeaf1 && ((ECX >> 16) & 1) && HasAVXSave;
1358   Features["tbm"]    = HasExtLeaf1 && ((ECX >> 21) & 1);
1359   Features["mwaitx"] = HasExtLeaf1 && ((ECX >> 29) & 1);
1360 
1361   Features["64bit"]  = HasExtLeaf1 && ((EDX >> 29) & 1);
1362 
1363   // Miscellaneous memory related features, detected by
1364   // using the 0x80000008 leaf of the CPUID instruction
1365   bool HasExtLeaf8 = MaxExtLevel >= 0x80000008 &&
1366                      !getX86CpuIDAndInfo(0x80000008, &EAX, &EBX, &ECX, &EDX);
1367   Features["clzero"]   = HasExtLeaf8 && ((EBX >> 0) & 1);
1368   Features["wbnoinvd"] = HasExtLeaf8 && ((EBX >> 9) & 1);
1369 
1370   bool HasLeaf7 =
1371       MaxLevel >= 7 && !getX86CpuIDAndInfoEx(0x7, 0x0, &EAX, &EBX, &ECX, &EDX);
1372 
1373   Features["fsgsbase"]   = HasLeaf7 && ((EBX >>  0) & 1);
1374   Features["sgx"]        = HasLeaf7 && ((EBX >>  2) & 1);
1375   Features["bmi"]        = HasLeaf7 && ((EBX >>  3) & 1);
1376   // AVX2 is only supported if we have the OS save support from AVX.
1377   Features["avx2"]       = HasLeaf7 && ((EBX >>  5) & 1) && HasAVXSave;
1378   Features["bmi2"]       = HasLeaf7 && ((EBX >>  8) & 1);
1379   Features["invpcid"]    = HasLeaf7 && ((EBX >> 10) & 1);
1380   Features["rtm"]        = HasLeaf7 && ((EBX >> 11) & 1);
1381   Features["mpx"]        = HasLeaf7 && ((EBX >> 14) & 1);
1382   // AVX512 is only supported if the OS supports the context save for it.
1383   Features["avx512f"]    = HasLeaf7 && ((EBX >> 16) & 1) && HasAVX512Save;
1384   Features["avx512dq"]   = HasLeaf7 && ((EBX >> 17) & 1) && HasAVX512Save;
1385   Features["rdseed"]     = HasLeaf7 && ((EBX >> 18) & 1);
1386   Features["adx"]        = HasLeaf7 && ((EBX >> 19) & 1);
1387   Features["avx512ifma"] = HasLeaf7 && ((EBX >> 21) & 1) && HasAVX512Save;
1388   Features["clflushopt"] = HasLeaf7 && ((EBX >> 23) & 1);
1389   Features["clwb"]       = HasLeaf7 && ((EBX >> 24) & 1);
1390   Features["avx512pf"]   = HasLeaf7 && ((EBX >> 26) & 1) && HasAVX512Save;
1391   Features["avx512er"]   = HasLeaf7 && ((EBX >> 27) & 1) && HasAVX512Save;
1392   Features["avx512cd"]   = HasLeaf7 && ((EBX >> 28) & 1) && HasAVX512Save;
1393   Features["sha"]        = HasLeaf7 && ((EBX >> 29) & 1);
1394   Features["avx512bw"]   = HasLeaf7 && ((EBX >> 30) & 1) && HasAVX512Save;
1395   Features["avx512vl"]   = HasLeaf7 && ((EBX >> 31) & 1) && HasAVX512Save;
1396 
1397   Features["prefetchwt1"]     = HasLeaf7 && ((ECX >>  0) & 1);
1398   Features["avx512vbmi"]      = HasLeaf7 && ((ECX >>  1) & 1) && HasAVX512Save;
1399   Features["pku"]             = HasLeaf7 && ((ECX >>  4) & 1);
1400   Features["waitpkg"]         = HasLeaf7 && ((ECX >>  5) & 1);
1401   Features["avx512vbmi2"]     = HasLeaf7 && ((ECX >>  6) & 1) && HasAVX512Save;
1402   Features["shstk"]           = HasLeaf7 && ((ECX >>  7) & 1);
1403   Features["gfni"]            = HasLeaf7 && ((ECX >>  8) & 1);
1404   Features["vaes"]            = HasLeaf7 && ((ECX >>  9) & 1) && HasAVXSave;
1405   Features["vpclmulqdq"]      = HasLeaf7 && ((ECX >> 10) & 1) && HasAVXSave;
1406   Features["avx512vnni"]      = HasLeaf7 && ((ECX >> 11) & 1) && HasAVX512Save;
1407   Features["avx512bitalg"]    = HasLeaf7 && ((ECX >> 12) & 1) && HasAVX512Save;
1408   Features["avx512vpopcntdq"] = HasLeaf7 && ((ECX >> 14) & 1) && HasAVX512Save;
1409   Features["rdpid"]           = HasLeaf7 && ((ECX >> 22) & 1);
1410   Features["cldemote"]        = HasLeaf7 && ((ECX >> 25) & 1);
1411   Features["movdiri"]         = HasLeaf7 && ((ECX >> 27) & 1);
1412   Features["movdir64b"]       = HasLeaf7 && ((ECX >> 28) & 1);
1413   Features["enqcmd"]          = HasLeaf7 && ((ECX >> 29) & 1);
1414 
1415   // There are two CPUID leafs which information associated with the pconfig
1416   // instruction:
1417   // EAX=0x7, ECX=0x0 indicates the availability of the instruction (via the 18th
1418   // bit of EDX), while the EAX=0x1b leaf returns information on the
1419   // availability of specific pconfig leafs.
1420   // The target feature here only refers to the the first of these two.
1421   // Users might need to check for the availability of specific pconfig
1422   // leaves using cpuid, since that information is ignored while
1423   // detecting features using the "-march=native" flag.
1424   // For more info, see X86 ISA docs.
1425   Features["pconfig"] = HasLeaf7 && ((EDX >> 18) & 1);
1426   bool HasLeaf7Subleaf1 =
1427       MaxLevel >= 7 && !getX86CpuIDAndInfoEx(0x7, 0x1, &EAX, &EBX, &ECX, &EDX);
1428   Features["avx512bf16"] = HasLeaf7Subleaf1 && ((EAX >> 5) & 1) && HasAVX512Save;
1429 
1430   bool HasLeafD = MaxLevel >= 0xd &&
1431                   !getX86CpuIDAndInfoEx(0xd, 0x1, &EAX, &EBX, &ECX, &EDX);
1432 
1433   // Only enable XSAVE if OS has enabled support for saving YMM state.
1434   Features["xsaveopt"] = HasLeafD && ((EAX >> 0) & 1) && HasAVXSave;
1435   Features["xsavec"]   = HasLeafD && ((EAX >> 1) & 1) && HasAVXSave;
1436   Features["xsaves"]   = HasLeafD && ((EAX >> 3) & 1) && HasAVXSave;
1437 
1438   bool HasLeaf14 = MaxLevel >= 0x14 &&
1439                   !getX86CpuIDAndInfoEx(0x14, 0x0, &EAX, &EBX, &ECX, &EDX);
1440 
1441   Features["ptwrite"] = HasLeaf14 && ((EBX >> 4) & 1);
1442 
1443   return true;
1444 }
1445 #elif defined(__linux__) && (defined(__arm__) || defined(__aarch64__))
1446 bool sys::getHostCPUFeatures(StringMap<bool> &Features) {
1447   std::unique_ptr<llvm::MemoryBuffer> P = getProcCpuinfoContent();
1448   if (!P)
1449     return false;
1450 
1451   SmallVector<StringRef, 32> Lines;
1452   P->getBuffer().split(Lines, "\n");
1453 
1454   SmallVector<StringRef, 32> CPUFeatures;
1455 
1456   // Look for the CPU features.
1457   for (unsigned I = 0, E = Lines.size(); I != E; ++I)
1458     if (Lines[I].startswith("Features")) {
1459       Lines[I].split(CPUFeatures, ' ');
1460       break;
1461     }
1462 
1463 #if defined(__aarch64__)
1464   // Keep track of which crypto features we have seen
1465   enum { CAP_AES = 0x1, CAP_PMULL = 0x2, CAP_SHA1 = 0x4, CAP_SHA2 = 0x8 };
1466   uint32_t crypto = 0;
1467 #endif
1468 
1469   for (unsigned I = 0, E = CPUFeatures.size(); I != E; ++I) {
1470     StringRef LLVMFeatureStr = StringSwitch<StringRef>(CPUFeatures[I])
1471 #if defined(__aarch64__)
1472                                    .Case("asimd", "neon")
1473                                    .Case("fp", "fp-armv8")
1474                                    .Case("crc32", "crc")
1475 #else
1476                                    .Case("half", "fp16")
1477                                    .Case("neon", "neon")
1478                                    .Case("vfpv3", "vfp3")
1479                                    .Case("vfpv3d16", "d16")
1480                                    .Case("vfpv4", "vfp4")
1481                                    .Case("idiva", "hwdiv-arm")
1482                                    .Case("idivt", "hwdiv")
1483 #endif
1484                                    .Default("");
1485 
1486 #if defined(__aarch64__)
1487     // We need to check crypto separately since we need all of the crypto
1488     // extensions to enable the subtarget feature
1489     if (CPUFeatures[I] == "aes")
1490       crypto |= CAP_AES;
1491     else if (CPUFeatures[I] == "pmull")
1492       crypto |= CAP_PMULL;
1493     else if (CPUFeatures[I] == "sha1")
1494       crypto |= CAP_SHA1;
1495     else if (CPUFeatures[I] == "sha2")
1496       crypto |= CAP_SHA2;
1497 #endif
1498 
1499     if (LLVMFeatureStr != "")
1500       Features[LLVMFeatureStr] = true;
1501   }
1502 
1503 #if defined(__aarch64__)
1504   // If we have all crypto bits we can add the feature
1505   if (crypto == (CAP_AES | CAP_PMULL | CAP_SHA1 | CAP_SHA2))
1506     Features["crypto"] = true;
1507 #endif
1508 
1509   return true;
1510 }
1511 #else
1512 bool sys::getHostCPUFeatures(StringMap<bool> &Features) { return false; }
1513 #endif
1514 
1515 std::string sys::getProcessTriple() {
1516   std::string TargetTripleString = updateTripleOSVersion(LLVM_HOST_TRIPLE);
1517   Triple PT(Triple::normalize(TargetTripleString));
1518 
1519   if (sizeof(void *) == 8 && PT.isArch32Bit())
1520     PT = PT.get64BitArchVariant();
1521   if (sizeof(void *) == 4 && PT.isArch64Bit())
1522     PT = PT.get32BitArchVariant();
1523 
1524   return PT.str();
1525 }
1526