1 //===--- Triple.cpp - Target triple helper class --------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "llvm/ADT/Triple.h"
12 #include "llvm/ADT/SmallString.h"
13 #include "llvm/ADT/STLExtras.h"
14 #include "llvm/ADT/Twine.h"
21 const char *Triple::getArchTypeName(ArchType Kind) {
23 case InvalidArch: return "<invalid>";
24 case UnknownArch: return "unknown";
26 case alpha: return "alpha";
27 case arm: return "arm";
28 case bfin: return "bfin";
29 case cellspu: return "cellspu";
30 case mips: return "mips";
31 case mipsel: return "mipsel";
32 case msp430: return "msp430";
33 case ppc64: return "powerpc64";
34 case ppc: return "powerpc";
35 case sparc: return "sparc";
36 case sparcv9: return "sparcv9";
37 case systemz: return "s390x";
38 case tce: return "tce";
39 case thumb: return "thumb";
40 case x86: return "i386";
41 case x86_64: return "x86_64";
42 case xcore: return "xcore";
43 case mblaze: return "mblaze";
44 case ptx: return "ptx";
50 const char *Triple::getArchTypePrefix(ArchType Kind) {
55 case alpha: return "alpha";
58 case thumb: return "arm";
60 case bfin: return "bfin";
62 case cellspu: return "spu";
65 case ppc: return "ppc";
67 case mblaze: return "mblaze";
70 case sparc: return "sparc";
73 case x86_64: return "x86";
75 case xcore: return "xcore";
77 case ptx: return "ptx";
81 const char *Triple::getVendorTypeName(VendorType Kind) {
83 case UnknownVendor: return "unknown";
85 case Apple: return "apple";
87 case SCEI: return "scei";
93 const char *Triple::getOSTypeName(OSType Kind) {
95 case UnknownOS: return "unknown";
97 case AuroraUX: return "auroraux";
98 case Cygwin: return "cygwin";
99 case Darwin: return "darwin";
100 case DragonFly: return "dragonfly";
101 case FreeBSD: return "freebsd";
102 case IOS: return "ios";
103 case Linux: return "linux";
104 case Lv2: return "lv2";
105 case MacOSX: return "macosx";
106 case MinGW32: return "mingw32";
107 case NetBSD: return "netbsd";
108 case OSX: return "osx";
109 case OpenBSD: return "openbsd";
110 case Psp: return "psp";
111 case Solaris: return "solaris";
112 case Win32: return "win32";
113 case Haiku: return "haiku";
114 case Minix: return "minix";
120 const char *Triple::getEnvironmentTypeName(EnvironmentType Kind) {
122 case UnknownEnvironment: return "unknown";
123 case GNU: return "gnu";
124 case GNUEABI: return "gnueabi";
125 case EABI: return "eabi";
126 case MachO: return "macho";
132 Triple::ArchType Triple::getArchTypeForLLVMName(StringRef Name) {
139 if (Name == "cellspu")
143 if (Name == "mipsel")
145 if (Name == "msp430")
151 if (Name == "mblaze")
155 if (Name == "sparcv9")
157 if (Name == "systemz")
165 if (Name == "x86-64")
175 Triple::ArchType Triple::getArchTypeForDarwinArchName(StringRef Str) {
176 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
177 // archs which Darwin doesn't use.
179 // The matching this routine does is fairly pointless, since it is neither the
180 // complete architecture list, nor a reasonable subset. The problem is that
181 // historically the driver driver accepts this and also ties its -march=
182 // handling to the architecture name, so we need to be careful before removing
185 // This code must be kept in sync with Clang's Darwin specific argument
188 if (Str == "ppc" || Str == "ppc601" || Str == "ppc603" || Str == "ppc604" ||
189 Str == "ppc604e" || Str == "ppc750" || Str == "ppc7400" ||
190 Str == "ppc7450" || Str == "ppc970")
194 return Triple::ppc64;
196 if (Str == "i386" || Str == "i486" || Str == "i486SX" || Str == "pentium" ||
197 Str == "i586" || Str == "pentpro" || Str == "i686" || Str == "pentIIm3" ||
198 Str == "pentIIm5" || Str == "pentium4")
202 return Triple::x86_64;
204 // This is derived from the driver driver.
205 if (Str == "arm" || Str == "armv4t" || Str == "armv5" || Str == "xscale" ||
206 Str == "armv6" || Str == "armv7")
212 return Triple::UnknownArch;
215 // Returns architecture name that is understood by the target assembler.
216 const char *Triple::getArchNameForAssembler() {
217 if (!isOSDarwin() && getVendor() != Triple::Apple)
220 StringRef Str = getArchName();
225 if (Str == "powerpc")
227 if (Str == "powerpc64")
229 if (Str == "mblaze" || Str == "microblaze")
233 if (Str == "armv4t" || Str == "thumbv4t")
235 if (Str == "armv5" || Str == "armv5e" || Str == "thumbv5"
236 || Str == "thumbv5e")
238 if (Str == "armv6" || Str == "thumbv6")
240 if (Str == "armv7" || Str == "thumbv7")
249 Triple::ArchType Triple::ParseArch(StringRef ArchName) {
250 if (ArchName.size() == 4 && ArchName[0] == 'i' &&
251 ArchName[2] == '8' && ArchName[3] == '6' &&
252 ArchName[1] - '3' < 6) // i[3-9]86
254 else if (ArchName == "amd64" || ArchName == "x86_64")
256 else if (ArchName == "bfin")
258 else if (ArchName == "powerpc")
260 else if ((ArchName == "powerpc64") || (ArchName == "ppu"))
262 else if (ArchName == "mblaze")
264 else if (ArchName == "arm" ||
265 ArchName.startswith("armv") ||
266 ArchName == "xscale")
268 else if (ArchName == "thumb" ||
269 ArchName.startswith("thumbv"))
271 else if (ArchName.startswith("alpha"))
273 else if (ArchName == "spu" || ArchName == "cellspu")
275 else if (ArchName == "msp430")
277 else if (ArchName == "mips" || ArchName == "mipsallegrex")
279 else if (ArchName == "mipsel" || ArchName == "mipsallegrexel" ||
282 else if (ArchName == "sparc")
284 else if (ArchName == "sparcv9")
286 else if (ArchName == "s390x")
288 else if (ArchName == "tce")
290 else if (ArchName == "xcore")
292 else if (ArchName == "ptx")
298 Triple::VendorType Triple::ParseVendor(StringRef VendorName) {
299 if (VendorName == "apple")
301 else if (VendorName == "pc")
303 else if (VendorName == "scei")
306 return UnknownVendor;
309 Triple::OSType Triple::ParseOS(StringRef OSName) {
310 if (OSName.startswith("auroraux"))
312 else if (OSName.startswith("cygwin"))
314 else if (OSName.startswith("darwin"))
316 else if (OSName.startswith("dragonfly"))
318 else if (OSName.startswith("freebsd"))
320 else if (OSName.startswith("ios"))
322 else if (OSName.startswith("linux"))
324 else if (OSName.startswith("lv2"))
326 else if (OSName.startswith("macosx"))
328 else if (OSName.startswith("mingw32"))
330 else if (OSName.startswith("netbsd"))
332 else if (OSName.startswith("osx"))
334 else if (OSName.startswith("openbsd"))
336 else if (OSName.startswith("psp"))
338 else if (OSName.startswith("solaris"))
340 else if (OSName.startswith("win32"))
342 else if (OSName.startswith("haiku"))
344 else if (OSName.startswith("minix"))
350 Triple::EnvironmentType Triple::ParseEnvironment(StringRef EnvironmentName) {
351 if (EnvironmentName.startswith("eabi"))
353 else if (EnvironmentName.startswith("gnueabi"))
355 else if (EnvironmentName.startswith("gnu"))
357 else if (EnvironmentName.startswith("macho"))
360 return UnknownEnvironment;
363 void Triple::Parse() const {
364 assert(!isInitialized() && "Invalid parse call.");
366 Arch = ParseArch(getArchName());
367 Vendor = ParseVendor(getVendorName());
368 OS = ParseOS(getOSName());
369 Environment = ParseEnvironment(getEnvironmentName());
371 assert(isInitialized() && "Failed to initialize!");
374 std::string Triple::normalize(StringRef Str) {
375 // Parse into components.
376 SmallVector<StringRef, 4> Components;
377 for (size_t First = 0, Last = 0; Last != StringRef::npos; First = Last + 1) {
378 Last = Str.find('-', First);
379 Components.push_back(Str.slice(First, Last));
382 // If the first component corresponds to a known architecture, preferentially
383 // use it for the architecture. If the second component corresponds to a
384 // known vendor, preferentially use it for the vendor, etc. This avoids silly
385 // component movement when a component parses as (eg) both a valid arch and a
387 ArchType Arch = UnknownArch;
388 if (Components.size() > 0)
389 Arch = ParseArch(Components[0]);
390 VendorType Vendor = UnknownVendor;
391 if (Components.size() > 1)
392 Vendor = ParseVendor(Components[1]);
393 OSType OS = UnknownOS;
394 if (Components.size() > 2)
395 OS = ParseOS(Components[2]);
396 EnvironmentType Environment = UnknownEnvironment;
397 if (Components.size() > 3)
398 Environment = ParseEnvironment(Components[3]);
400 // Note which components are already in their final position. These will not
403 Found[0] = Arch != UnknownArch;
404 Found[1] = Vendor != UnknownVendor;
405 Found[2] = OS != UnknownOS;
406 Found[3] = Environment != UnknownEnvironment;
408 // If they are not there already, permute the components into their canonical
409 // positions by seeing if they parse as a valid architecture, and if so moving
410 // the component to the architecture position etc.
411 for (unsigned Pos = 0; Pos != array_lengthof(Found); ++Pos) {
413 continue; // Already in the canonical position.
415 for (unsigned Idx = 0; Idx != Components.size(); ++Idx) {
416 // Do not reparse any components that already matched.
417 if (Idx < array_lengthof(Found) && Found[Idx])
420 // Does this component parse as valid for the target position?
422 StringRef Comp = Components[Idx];
425 assert(false && "unexpected component type!");
427 Arch = ParseArch(Comp);
428 Valid = Arch != UnknownArch;
431 Vendor = ParseVendor(Comp);
432 Valid = Vendor != UnknownVendor;
436 Valid = OS != UnknownOS;
439 Environment = ParseEnvironment(Comp);
440 Valid = Environment != UnknownEnvironment;
444 continue; // Nope, try the next component.
446 // Move the component to the target position, pushing any non-fixed
447 // components that are in the way to the right. This tends to give
448 // good results in the common cases of a forgotten vendor component
449 // or a wrongly positioned environment.
451 // Insert left, pushing the existing components to the right. For
452 // example, a-b-i386 -> i386-a-b when moving i386 to the front.
453 StringRef CurrentComponent(""); // The empty component.
454 // Replace the component we are moving with an empty component.
455 std::swap(CurrentComponent, Components[Idx]);
456 // Insert the component being moved at Pos, displacing any existing
457 // components to the right.
458 for (unsigned i = Pos; !CurrentComponent.empty(); ++i) {
459 // Skip over any fixed components.
460 while (i < array_lengthof(Found) && Found[i]) ++i;
461 // Place the component at the new position, getting the component
462 // that was at this position - it will be moved right.
463 std::swap(CurrentComponent, Components[i]);
465 } else if (Pos > Idx) {
466 // Push right by inserting empty components until the component at Idx
467 // reaches the target position Pos. For example, pc-a -> -pc-a when
468 // moving pc to the second position.
470 // Insert one empty component at Idx.
471 StringRef CurrentComponent(""); // The empty component.
472 for (unsigned i = Idx; i < Components.size();) {
473 // Place the component at the new position, getting the component
474 // that was at this position - it will be moved right.
475 std::swap(CurrentComponent, Components[i]);
476 // If it was placed on top of an empty component then we are done.
477 if (CurrentComponent.empty())
479 // Advance to the next component, skipping any fixed components.
480 while (++i < array_lengthof(Found) && Found[i])
483 // The last component was pushed off the end - append it.
484 if (!CurrentComponent.empty())
485 Components.push_back(CurrentComponent);
487 // Advance Idx to the component's new position.
488 while (++Idx < array_lengthof(Found) && Found[Idx]) {}
489 } while (Idx < Pos); // Add more until the final position is reached.
491 assert(Pos < Components.size() && Components[Pos] == Comp &&
492 "Component moved wrong!");
498 // Special case logic goes here. At this point Arch, Vendor and OS have the
499 // correct values for the computed components.
501 // Stick the corrected components back together to form the normalized string.
502 std::string Normalized;
503 for (unsigned i = 0, e = Components.size(); i != e; ++i) {
504 if (i) Normalized += '-';
505 Normalized += Components[i];
510 StringRef Triple::getArchName() const {
511 return StringRef(Data).split('-').first; // Isolate first component
514 StringRef Triple::getVendorName() const {
515 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
516 return Tmp.split('-').first; // Isolate second component
519 StringRef Triple::getOSName() const {
520 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
521 Tmp = Tmp.split('-').second; // Strip second component
522 return Tmp.split('-').first; // Isolate third component
525 StringRef Triple::getEnvironmentName() const {
526 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
527 Tmp = Tmp.split('-').second; // Strip second component
528 return Tmp.split('-').second; // Strip third component
531 StringRef Triple::getOSAndEnvironmentName() const {
532 StringRef Tmp = StringRef(Data).split('-').second; // Strip first component
533 return Tmp.split('-').second; // Strip second component
536 static unsigned EatNumber(StringRef &Str) {
537 assert(!Str.empty() && Str[0] >= '0' && Str[0] <= '9' && "Not a number");
541 // Consume the leading digit.
542 Result = Result*10 + (Str[0] - '0');
546 } while (!Str.empty() && Str[0] >= '0' && Str[0] <= '9');
551 void Triple::getOSVersion(unsigned &Major, unsigned &Minor,
552 unsigned &Micro) const {
553 StringRef OSName = getOSName();
555 // Assume that the OS portion of the triple starts with the canonical name.
556 StringRef OSTypeName = getOSTypeName(getOS());
557 if (OSName.startswith(OSTypeName))
558 OSName = OSName.substr(OSTypeName.size());
560 // Any unset version defaults to 0.
561 Major = Minor = Micro = 0;
563 // Parse up to three components.
564 unsigned *Components[3] = { &Major, &Minor, &Micro };
565 for (unsigned i = 0; i != 3; ++i) {
566 if (OSName.empty() || OSName[0] < '0' || OSName[0] > '9')
569 // Consume the leading number.
570 *Components[i] = EatNumber(OSName);
572 // Consume the separator, if present.
573 if (OSName.startswith("."))
574 OSName = OSName.substr(1);
578 void Triple::setTriple(const Twine &Str) {
583 void Triple::setArch(ArchType Kind) {
584 setArchName(getArchTypeName(Kind));
587 void Triple::setVendor(VendorType Kind) {
588 setVendorName(getVendorTypeName(Kind));
591 void Triple::setOS(OSType Kind) {
592 setOSName(getOSTypeName(Kind));
595 void Triple::setEnvironment(EnvironmentType Kind) {
596 setEnvironmentName(getEnvironmentTypeName(Kind));
599 void Triple::setArchName(StringRef Str) {
600 // Work around a miscompilation bug for Twines in gcc 4.0.3.
601 SmallString<64> Triple;
604 Triple += getVendorName();
606 Triple += getOSAndEnvironmentName();
607 setTriple(Triple.str());
610 void Triple::setVendorName(StringRef Str) {
611 setTriple(getArchName() + "-" + Str + "-" + getOSAndEnvironmentName());
614 void Triple::setOSName(StringRef Str) {
615 if (hasEnvironment())
616 setTriple(getArchName() + "-" + getVendorName() + "-" + Str +
617 "-" + getEnvironmentName());
619 setTriple(getArchName() + "-" + getVendorName() + "-" + Str);
622 void Triple::setEnvironmentName(StringRef Str) {
623 setTriple(getArchName() + "-" + getVendorName() + "-" + getOSName() +
627 void Triple::setOSAndEnvironmentName(StringRef Str) {
628 setTriple(getArchName() + "-" + getVendorName() + "-" + Str);