1 //===-- Host.cpp - Implement OS Host Concept --------------------*- C++ -*-===//
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 header file implements the operating system Host concept.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "llvm/Support/Host.h"
15 #include "llvm/ADT/SmallVector.h"
16 #include "llvm/ADT/StringRef.h"
17 #include "llvm/ADT/StringSwitch.h"
18 #include "llvm/ADT/Triple.h"
19 #include "llvm/Config/config.h"
20 #include "llvm/Support/DataStream.h"
21 #include "llvm/Support/Debug.h"
22 #include "llvm/Support/raw_ostream.h"
23 #include <string.h>
24 
25 // Include the platform-specific parts of this class.
26 #ifdef LLVM_ON_UNIX
27 #include "Unix/Host.inc"
28 #endif
29 #ifdef LLVM_ON_WIN32
30 #include "Windows/Host.inc"
31 #endif
32 #ifdef _MSC_VER
33 #include <intrin.h>
34 #endif
35 #if defined(__APPLE__) && (defined(__ppc__) || defined(__powerpc__))
36 #include <mach/mach.h>
37 #include <mach/mach_host.h>
38 #include <mach/host_info.h>
39 #include <mach/machine.h>
40 #endif
41 
42 //===----------------------------------------------------------------------===//
43 //
44 //  Implementations of the CPU detection routines
45 //
46 //===----------------------------------------------------------------------===//
47 
48 using namespace llvm;
49 
50 #if defined(i386) || defined(__i386__) || defined(__x86__) || defined(_M_IX86)\
51  || defined(__x86_64__) || defined(_M_AMD64) || defined (_M_X64)
52 
53 /// GetX86CpuIDAndInfo - Execute the specified cpuid and return the 4 values in the
54 /// specified arguments.  If we can't run cpuid on the host, return true.
55 static bool GetX86CpuIDAndInfo(unsigned value, unsigned *rEAX, unsigned *rEBX,
56                                unsigned *rECX, unsigned *rEDX) {
57 #if defined(__GNUC__) || defined(__clang__)
58   #if defined(__x86_64__) || defined(_M_AMD64) || defined (_M_X64)
59     // gcc doesn't know cpuid would clobber ebx/rbx. Preseve it manually.
60     asm ("movq\t%%rbx, %%rsi\n\t"
61          "cpuid\n\t"
62          "xchgq\t%%rbx, %%rsi\n\t"
63          : "=a" (*rEAX),
64            "=S" (*rEBX),
65            "=c" (*rECX),
66            "=d" (*rEDX)
67          :  "a" (value));
68     return false;
69   #elif defined(i386) || defined(__i386__) || defined(__x86__) || defined(_M_IX86)
70     asm ("movl\t%%ebx, %%esi\n\t"
71          "cpuid\n\t"
72          "xchgl\t%%ebx, %%esi\n\t"
73          : "=a" (*rEAX),
74            "=S" (*rEBX),
75            "=c" (*rECX),
76            "=d" (*rEDX)
77          :  "a" (value));
78     return false;
79 // pedantic #else returns to appease -Wunreachable-code (so we don't generate
80 // postprocessed code that looks like "return true; return false;")
81   #else
82     return true;
83   #endif
84 #elif defined(_MSC_VER)
85   // The MSVC intrinsic is portable across x86 and x64.
86   int registers[4];
87   __cpuid(registers, value);
88   *rEAX = registers[0];
89   *rEBX = registers[1];
90   *rECX = registers[2];
91   *rEDX = registers[3];
92   return false;
93 #else
94   return true;
95 #endif
96 }
97 
98 static bool OSHasAVXSupport() {
99 #if defined(__GNUC__)
100   // Check xgetbv; this uses a .byte sequence instead of the instruction
101   // directly because older assemblers do not include support for xgetbv and
102   // there is no easy way to conditionally compile based on the assembler used.
103   int rEAX, rEDX;
104   __asm__ (".byte 0x0f, 0x01, 0xd0" : "=a" (rEAX), "=d" (rEDX) : "c" (0));
105 #elif defined(_MSC_FULL_VER) && defined(_XCR_XFEATURE_ENABLED_MASK)
106   unsigned long long rEAX = _xgetbv(_XCR_XFEATURE_ENABLED_MASK);
107 #else
108   int rEAX = 0; // Ensures we return false
109 #endif
110   return (rEAX & 6) == 6;
111 }
112 
113 static void DetectX86FamilyModel(unsigned EAX, unsigned &Family,
114                                  unsigned &Model) {
115   Family = (EAX >> 8) & 0xf; // Bits 8 - 11
116   Model  = (EAX >> 4) & 0xf; // Bits 4 - 7
117   if (Family == 6 || Family == 0xf) {
118     if (Family == 0xf)
119       // Examine extended family ID if family ID is F.
120       Family += (EAX >> 20) & 0xff;    // Bits 20 - 27
121     // Examine extended model ID if family ID is 6 or F.
122     Model += ((EAX >> 16) & 0xf) << 4; // Bits 16 - 19
123   }
124 }
125 
126 std::string sys::getHostCPUName() {
127   unsigned EAX = 0, EBX = 0, ECX = 0, EDX = 0;
128   if (GetX86CpuIDAndInfo(0x1, &EAX, &EBX, &ECX, &EDX))
129     return "generic";
130   unsigned Family = 0;
131   unsigned Model  = 0;
132   DetectX86FamilyModel(EAX, Family, Model);
133 
134   bool HasSSE3 = (ECX & 0x1);
135   bool HasSSE41 = (ECX & 0x80000);
136   // If CPUID indicates support for XSAVE, XRESTORE and AVX, and XGETBV
137   // indicates that the AVX registers will be saved and restored on context
138   // switch, then we have full AVX support.
139   const unsigned AVXBits = (1 << 27) | (1 << 28);
140   bool HasAVX = ((ECX & AVXBits) == AVXBits) && OSHasAVXSupport();
141   GetX86CpuIDAndInfo(0x80000001, &EAX, &EBX, &ECX, &EDX);
142   bool Em64T = (EDX >> 29) & 0x1;
143 
144   union {
145     unsigned u[3];
146     char     c[12];
147   } text;
148 
149   GetX86CpuIDAndInfo(0, &EAX, text.u+0, text.u+2, text.u+1);
150   if (memcmp(text.c, "GenuineIntel", 12) == 0) {
151     switch (Family) {
152     case 3:
153       return "i386";
154     case 4:
155       switch (Model) {
156       case 0: // Intel486 DX processors
157       case 1: // Intel486 DX processors
158       case 2: // Intel486 SX processors
159       case 3: // Intel487 processors, IntelDX2 OverDrive processors,
160               // IntelDX2 processors
161       case 4: // Intel486 SL processor
162       case 5: // IntelSX2 processors
163       case 7: // Write-Back Enhanced IntelDX2 processors
164       case 8: // IntelDX4 OverDrive processors, IntelDX4 processors
165       default: return "i486";
166       }
167     case 5:
168       switch (Model) {
169       case  1: // Pentium OverDrive processor for Pentium processor (60, 66),
170                // Pentium processors (60, 66)
171       case  2: // Pentium OverDrive processor for Pentium processor (75, 90,
172                // 100, 120, 133), Pentium processors (75, 90, 100, 120, 133,
173                // 150, 166, 200)
174       case  3: // Pentium OverDrive processors for Intel486 processor-based
175                // systems
176         return "pentium";
177 
178       case  4: // Pentium OverDrive processor with MMX technology for Pentium
179                // processor (75, 90, 100, 120, 133), Pentium processor with
180                // MMX technology (166, 200)
181         return "pentium-mmx";
182 
183       default: return "pentium";
184       }
185     case 6:
186       switch (Model) {
187       case  1: // Pentium Pro processor
188         return "pentiumpro";
189 
190       case  3: // Intel Pentium II OverDrive processor, Pentium II processor,
191                // model 03
192       case  5: // Pentium II processor, model 05, Pentium II Xeon processor,
193                // model 05, and Intel Celeron processor, model 05
194       case  6: // Celeron processor, model 06
195         return "pentium2";
196 
197       case  7: // Pentium III processor, model 07, and Pentium III Xeon
198                // processor, model 07
199       case  8: // Pentium III processor, model 08, Pentium III Xeon processor,
200                // model 08, and Celeron processor, model 08
201       case 10: // Pentium III Xeon processor, model 0Ah
202       case 11: // Pentium III processor, model 0Bh
203         return "pentium3";
204 
205       case  9: // Intel Pentium M processor, Intel Celeron M processor model 09.
206       case 13: // Intel Pentium M processor, Intel Celeron M processor, model
207                // 0Dh. All processors are manufactured using the 90 nm process.
208         return "pentium-m";
209 
210       case 14: // Intel Core Duo processor, Intel Core Solo processor, model
211                // 0Eh. All processors are manufactured using the 65 nm process.
212         return "yonah";
213 
214       case 15: // Intel Core 2 Duo processor, Intel Core 2 Duo mobile
215                // processor, Intel Core 2 Quad processor, Intel Core 2 Quad
216                // mobile processor, Intel Core 2 Extreme processor, Intel
217                // Pentium Dual-Core processor, Intel Xeon processor, model
218                // 0Fh. All processors are manufactured using the 65 nm process.
219       case 22: // Intel Celeron processor model 16h. All processors are
220                // manufactured using the 65 nm process
221         return "core2";
222 
223       case 21: // Intel EP80579 Integrated Processor and Intel EP80579
224                // Integrated Processor with Intel QuickAssist Technology
225         return "i686"; // FIXME: ???
226 
227       case 23: // Intel Core 2 Extreme processor, Intel Xeon processor, model
228                // 17h. All processors are manufactured using the 45 nm process.
229                //
230                // 45nm: Penryn , Wolfdale, Yorkfield (XE)
231         // Not all Penryn processors support SSE 4.1 (such as the Pentium brand)
232         return HasSSE41 ? "penryn" : "core2";
233 
234       case 26: // Intel Core i7 processor and Intel Xeon processor. All
235                // processors are manufactured using the 45 nm process.
236       case 29: // Intel Xeon processor MP. All processors are manufactured using
237                // the 45 nm process.
238       case 30: // Intel(R) Core(TM) i7 CPU         870  @ 2.93GHz.
239                // As found in a Summer 2010 model iMac.
240       case 37: // Intel Core i7, laptop version.
241       case 44: // Intel Core i7 processor and Intel Xeon processor. All
242                // processors are manufactured using the 32 nm process.
243       case 46: // Nehalem EX
244       case 47: // Westmere EX
245         return "corei7";
246 
247       // SandyBridge:
248       case 42: // Intel Core i7 processor. All processors are manufactured
249                // using the 32 nm process.
250       case 45:
251         // Not all Sandy Bridge processors support AVX (such as the Pentium
252         // versions instead of the i7 versions).
253         return HasAVX ? "corei7-avx" : "corei7";
254 
255       // Ivy Bridge:
256       case 58:
257         // Not all Ivy Bridge processors support AVX (such as the Pentium
258         // versions instead of the i7 versions).
259         return HasAVX ? "core-avx-i" : "corei7";
260 
261       case 28: // Most 45 nm Intel Atom processors
262       case 38: // 45 nm Atom Lincroft
263       case 39: // 32 nm Atom Medfield
264       case 53: // 32 nm Atom Midview
265       case 54: // 32 nm Atom Midview
266         return "atom";
267 
268       case 55: // Intel Atom Silvermont processors
269       case 74:
270       case 77:
271         return "slm";
272 
273       default: return (Em64T) ? "x86-64" : "i686";
274       }
275     case 15: {
276       switch (Model) {
277       case  0: // Pentium 4 processor, Intel Xeon processor. All processors are
278                // model 00h and manufactured using the 0.18 micron process.
279       case  1: // Pentium 4 processor, Intel Xeon processor, Intel Xeon
280                // processor MP, and Intel Celeron processor. All processors are
281                // model 01h and manufactured using the 0.18 micron process.
282       case  2: // Pentium 4 processor, Mobile Intel Pentium 4 processor - M,
283                // Intel Xeon processor, Intel Xeon processor MP, Intel Celeron
284                // processor, and Mobile Intel Celeron processor. All processors
285                // are model 02h and manufactured using the 0.13 micron process.
286         return (Em64T) ? "x86-64" : "pentium4";
287 
288       case  3: // Pentium 4 processor, Intel Xeon processor, Intel Celeron D
289                // processor. All processors are model 03h and manufactured using
290                // the 90 nm process.
291       case  4: // Pentium 4 processor, Pentium 4 processor Extreme Edition,
292                // Pentium D processor, Intel Xeon processor, Intel Xeon
293                // processor MP, Intel Celeron D processor. All processors are
294                // model 04h and manufactured using the 90 nm process.
295       case  6: // Pentium 4 processor, Pentium D processor, Pentium processor
296                // Extreme Edition, Intel Xeon processor, Intel Xeon processor
297                // MP, Intel Celeron D processor. All processors are model 06h
298                // and manufactured using the 65 nm process.
299         return (Em64T) ? "nocona" : "prescott";
300 
301       default:
302         return (Em64T) ? "x86-64" : "pentium4";
303       }
304     }
305 
306     default:
307       return "generic";
308     }
309   } else if (memcmp(text.c, "AuthenticAMD", 12) == 0) {
310     // FIXME: this poorly matches the generated SubtargetFeatureKV table.  There
311     // appears to be no way to generate the wide variety of AMD-specific targets
312     // from the information returned from CPUID.
313     switch (Family) {
314       case 4:
315         return "i486";
316       case 5:
317         switch (Model) {
318         case 6:
319         case 7:  return "k6";
320         case 8:  return "k6-2";
321         case 9:
322         case 13: return "k6-3";
323         case 10: return "geode";
324         default: return "pentium";
325         }
326       case 6:
327         switch (Model) {
328         case 4:  return "athlon-tbird";
329         case 6:
330         case 7:
331         case 8:  return "athlon-mp";
332         case 10: return "athlon-xp";
333         default: return "athlon";
334         }
335       case 15:
336         if (HasSSE3)
337           return "k8-sse3";
338         switch (Model) {
339         case 1:  return "opteron";
340         case 5:  return "athlon-fx"; // also opteron
341         default: return "athlon64";
342         }
343       case 16:
344         return "amdfam10";
345       case 20:
346         return "btver1";
347       case 21:
348         if (!HasAVX) // If the OS doesn't support AVX provide a sane fallback.
349           return "btver1";
350         if (Model > 15 && Model <= 31)
351           return "bdver2";
352         return "bdver1";
353       case 22:
354         if (!HasAVX) // If the OS doesn't support AVX provide a sane fallback.
355           return "btver1";
356         return "btver2";
357     default:
358       return "generic";
359     }
360   }
361   return "generic";
362 }
363 #elif defined(__APPLE__) && (defined(__ppc__) || defined(__powerpc__))
364 std::string sys::getHostCPUName() {
365   host_basic_info_data_t hostInfo;
366   mach_msg_type_number_t infoCount;
367 
368   infoCount = HOST_BASIC_INFO_COUNT;
369   host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&hostInfo,
370             &infoCount);
371 
372   if (hostInfo.cpu_type != CPU_TYPE_POWERPC) return "generic";
373 
374   switch(hostInfo.cpu_subtype) {
375   case CPU_SUBTYPE_POWERPC_601:   return "601";
376   case CPU_SUBTYPE_POWERPC_602:   return "602";
377   case CPU_SUBTYPE_POWERPC_603:   return "603";
378   case CPU_SUBTYPE_POWERPC_603e:  return "603e";
379   case CPU_SUBTYPE_POWERPC_603ev: return "603ev";
380   case CPU_SUBTYPE_POWERPC_604:   return "604";
381   case CPU_SUBTYPE_POWERPC_604e:  return "604e";
382   case CPU_SUBTYPE_POWERPC_620:   return "620";
383   case CPU_SUBTYPE_POWERPC_750:   return "750";
384   case CPU_SUBTYPE_POWERPC_7400:  return "7400";
385   case CPU_SUBTYPE_POWERPC_7450:  return "7450";
386   case CPU_SUBTYPE_POWERPC_970:   return "970";
387   default: ;
388   }
389 
390   return "generic";
391 }
392 #elif defined(__linux__) && (defined(__ppc__) || defined(__powerpc__))
393 std::string sys::getHostCPUName() {
394   // Access to the Processor Version Register (PVR) on PowerPC is privileged,
395   // and so we must use an operating-system interface to determine the current
396   // processor type. On Linux, this is exposed through the /proc/cpuinfo file.
397   const char *generic = "generic";
398 
399   // Note: We cannot mmap /proc/cpuinfo here and then process the resulting
400   // memory buffer because the 'file' has 0 size (it can be read from only
401   // as a stream).
402 
403   std::string Err;
404   DataStreamer *DS = getDataFileStreamer("/proc/cpuinfo", &Err);
405   if (!DS) {
406     DEBUG(dbgs() << "Unable to open /proc/cpuinfo: " << Err << "\n");
407     return generic;
408   }
409 
410   // The cpu line is second (after the 'processor: 0' line), so if this
411   // buffer is too small then something has changed (or is wrong).
412   char buffer[1024];
413   size_t CPUInfoSize = DS->GetBytes((unsigned char*) buffer, sizeof(buffer));
414   delete DS;
415 
416   const char *CPUInfoStart = buffer;
417   const char *CPUInfoEnd = buffer + CPUInfoSize;
418 
419   const char *CIP = CPUInfoStart;
420 
421   const char *CPUStart = 0;
422   size_t CPULen = 0;
423 
424   // We need to find the first line which starts with cpu, spaces, and a colon.
425   // After the colon, there may be some additional spaces and then the cpu type.
426   while (CIP < CPUInfoEnd && CPUStart == 0) {
427     if (CIP < CPUInfoEnd && *CIP == '\n')
428       ++CIP;
429 
430     if (CIP < CPUInfoEnd && *CIP == 'c') {
431       ++CIP;
432       if (CIP < CPUInfoEnd && *CIP == 'p') {
433         ++CIP;
434         if (CIP < CPUInfoEnd && *CIP == 'u') {
435           ++CIP;
436           while (CIP < CPUInfoEnd && (*CIP == ' ' || *CIP == '\t'))
437             ++CIP;
438 
439           if (CIP < CPUInfoEnd && *CIP == ':') {
440             ++CIP;
441             while (CIP < CPUInfoEnd && (*CIP == ' ' || *CIP == '\t'))
442               ++CIP;
443 
444             if (CIP < CPUInfoEnd) {
445               CPUStart = CIP;
446               while (CIP < CPUInfoEnd && (*CIP != ' ' && *CIP != '\t' &&
447                                           *CIP != ',' && *CIP != '\n'))
448                 ++CIP;
449               CPULen = CIP - CPUStart;
450             }
451           }
452         }
453       }
454     }
455 
456     if (CPUStart == 0)
457       while (CIP < CPUInfoEnd && *CIP != '\n')
458         ++CIP;
459   }
460 
461   if (CPUStart == 0)
462     return generic;
463 
464   return StringSwitch<const char *>(StringRef(CPUStart, CPULen))
465     .Case("604e", "604e")
466     .Case("604", "604")
467     .Case("7400", "7400")
468     .Case("7410", "7400")
469     .Case("7447", "7400")
470     .Case("7455", "7450")
471     .Case("G4", "g4")
472     .Case("POWER4", "970")
473     .Case("PPC970FX", "970")
474     .Case("PPC970MP", "970")
475     .Case("G5", "g5")
476     .Case("POWER5", "g5")
477     .Case("A2", "a2")
478     .Case("POWER6", "pwr6")
479     .Case("POWER7", "pwr7")
480     .Default(generic);
481 }
482 #elif defined(__linux__) && defined(__arm__)
483 std::string sys::getHostCPUName() {
484   // The cpuid register on arm is not accessible from user space. On Linux,
485   // it is exposed through the /proc/cpuinfo file.
486   // Note: We cannot mmap /proc/cpuinfo here and then process the resulting
487   // memory buffer because the 'file' has 0 size (it can be read from only
488   // as a stream).
489 
490   std::string Err;
491   DataStreamer *DS = getDataFileStreamer("/proc/cpuinfo", &Err);
492   if (!DS) {
493     DEBUG(dbgs() << "Unable to open /proc/cpuinfo: " << Err << "\n");
494     return "generic";
495   }
496 
497   // Read 1024 bytes from /proc/cpuinfo, which should contain the CPU part line
498   // in all cases.
499   char buffer[1024];
500   size_t CPUInfoSize = DS->GetBytes((unsigned char*) buffer, sizeof(buffer));
501   delete DS;
502 
503   StringRef Str(buffer, CPUInfoSize);
504 
505   SmallVector<StringRef, 32> Lines;
506   Str.split(Lines, "\n");
507 
508   // Look for the CPU implementer line.
509   StringRef Implementer;
510   for (unsigned I = 0, E = Lines.size(); I != E; ++I)
511     if (Lines[I].startswith("CPU implementer"))
512       Implementer = Lines[I].substr(15).ltrim("\t :");
513 
514   if (Implementer == "0x41") // ARM Ltd.
515     // Look for the CPU part line.
516     for (unsigned I = 0, E = Lines.size(); I != E; ++I)
517       if (Lines[I].startswith("CPU part"))
518         // The CPU part is a 3 digit hexadecimal number with a 0x prefix. The
519         // values correspond to the "Part number" in the CP15/c0 register. The
520         // contents are specified in the various processor manuals.
521         return StringSwitch<const char *>(Lines[I].substr(8).ltrim("\t :"))
522           .Case("0x926", "arm926ej-s")
523           .Case("0xb02", "mpcore")
524           .Case("0xb36", "arm1136j-s")
525           .Case("0xb56", "arm1156t2-s")
526           .Case("0xb76", "arm1176jz-s")
527           .Case("0xc08", "cortex-a8")
528           .Case("0xc09", "cortex-a9")
529           .Case("0xc0f", "cortex-a15")
530           .Case("0xc20", "cortex-m0")
531           .Case("0xc23", "cortex-m3")
532           .Case("0xc24", "cortex-m4")
533           .Default("generic");
534 
535   return "generic";
536 }
537 #else
538 std::string sys::getHostCPUName() {
539   return "generic";
540 }
541 #endif
542 
543 #if defined(__linux__) && defined(__arm__)
544 bool sys::getHostCPUFeatures(StringMap<bool> &Features) {
545   std::string Err;
546   DataStreamer *DS = getDataFileStreamer("/proc/cpuinfo", &Err);
547   if (!DS) {
548     DEBUG(dbgs() << "Unable to open /proc/cpuinfo: " << Err << "\n");
549     return false;
550   }
551 
552   // Read 1024 bytes from /proc/cpuinfo, which should contain the Features line
553   // in all cases.
554   char buffer[1024];
555   size_t CPUInfoSize = DS->GetBytes((unsigned char*) buffer, sizeof(buffer));
556   delete DS;
557 
558   StringRef Str(buffer, CPUInfoSize);
559 
560   SmallVector<StringRef, 32> Lines;
561   Str.split(Lines, "\n");
562 
563   SmallVector<StringRef, 32> CPUFeatures;
564 
565   // Look for the CPU features.
566   for (unsigned I = 0, E = Lines.size(); I != E; ++I)
567     if (Lines[I].startswith("Features")) {
568       Lines[I].split(CPUFeatures, " ");
569       break;
570     }
571 
572   for (unsigned I = 0, E = CPUFeatures.size(); I != E; ++I) {
573     StringRef LLVMFeatureStr = StringSwitch<StringRef>(CPUFeatures[I])
574       .Case("half", "fp16")
575       .Case("neon", "neon")
576       .Case("vfpv3", "vfp3")
577       .Case("vfpv3d16", "d16")
578       .Case("vfpv4", "vfp4")
579       .Case("idiva", "hwdiv-arm")
580       .Case("idivt", "hwdiv")
581       .Default("");
582 
583     if (LLVMFeatureStr != "")
584       Features.GetOrCreateValue(LLVMFeatureStr).setValue(true);
585   }
586 
587   return true;
588 }
589 #else
590 bool sys::getHostCPUFeatures(StringMap<bool> &Features){
591   return false;
592 }
593 #endif
594 
595 std::string sys::getProcessTriple() {
596   Triple PT(Triple::normalize(LLVM_HOST_TRIPLE));
597 
598   if (sizeof(void *) == 8 && PT.isArch32Bit())
599     PT = PT.get64BitArchVariant();
600   if (sizeof(void *) == 4 && PT.isArch64Bit())
601     PT = PT.get32BitArchVariant();
602 
603   return PT.str();
604 }
605