[cfe-dev] The patch for TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) by using Triple in Triple.cpp of llvm Support lib

Eli Friedman eli.friedman at gmail.com
Sat Aug 15 12:20:32 PDT 2009


On Fri, Aug 14, 2009 at 7:30 PM, 罗勇刚(Yonggang Luo)<luoyonggang at gmail.com> wrote:
> By using Triple, and modify Triple, the function TargetInfo*
> TargetInfo::CreateTargetInfo(const std::string &T)
> changed to be more simple and clear.

Attached version fixes the formatting and a missing default case.
However, it doesn't build because it depends on a patch you submitted
to llvmdev.

-Eli
-------------- next part --------------
Index: lib/Basic/Targets.cpp
===================================================================
--- lib/Basic/Targets.cpp	(revision 79082)
+++ lib/Basic/Targets.cpp	(working copy)
@@ -1408,97 +1408,97 @@
 // Driver code
 //===----------------------------------------------------------------------===//
 
-static inline bool IsX86(const std::string& TT) {
-  return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
-          TT[4] == '-' && TT[1] - '3' < 6);
-}
-
 /// CreateTargetInfo - Return the target info object for the specified target
 /// triple.
 TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
   // OS detection; this isn't really anywhere near complete.
   // Additions and corrections are welcome.
-  bool isDarwin = T.find("-darwin") != std::string::npos;
-  bool isDragonFly = T.find("-dragonfly") != std::string::npos;
-  bool isNetBSD = T.find("-netbsd") != std::string::npos;
-  bool isOpenBSD = T.find("-openbsd") != std::string::npos;
-  bool isFreeBSD = T.find("-freebsd") != std::string::npos;
-  bool isSolaris = T.find("-solaris") != std::string::npos;
-  bool isLinux = T.find("-linux") != std::string::npos;
-  bool isWindows = T.find("-windows") != std::string::npos ||
-                   T.find("-win32") != std::string::npos ||
-                   T.find("-mingw") != std::string::npos;
+  llvm::Triple tmpTriple(T);
+  llvm::Triple::ArchType arch = tmpTriple.getArch();
+  llvm::Triple::OSType os = tmpTriple.getOS();
 
-  if (T.find("ppc-") == 0 || T.find("powerpc-") == 0) {
-    if (isDarwin)
+  switch (arch) {
+  case llvm::Triple::alpha:
+    return NULL;
+  case llvm::Triple::arm:
+    switch (os) {
+    case llvm::Triple::Darwin:
+      return new DarwinARMTargetInfo(T);
+    case llvm::Triple::FreeBSD:
+      return new FreeBSDTargetInfo<ARMTargetInfo>(T);
+    default:
+      return new ARMTargetInfo(T);
+    }
+  case llvm::Triple::bfin:
+  case llvm::Triple::cellspu:
+  case llvm::Triple::mips:
+  case llvm::Triple::mipsel:
+    return NULL;
+  case llvm::Triple::msp430:
+    return new MSP430TargetInfo(T);
+  case llvm::Triple::pic16:
+    return new PIC16TargetInfo(T);
+  case llvm::Triple::ppc:
+    if (os == llvm::Triple::Darwin)
       return new DarwinTargetInfo<PPCTargetInfo>(T);
     return new PPC32TargetInfo(T);
-  }
-
-  if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0) {
-    if (isDarwin)
+  case llvm::Triple::ppc64:
+    if (os == llvm::Triple::Darwin)
       return new DarwinTargetInfo<PPC64TargetInfo>(T);
     return new PPC64TargetInfo(T);
-  }
-
-  if (T.find("armv") == 0 || T.find("arm-") == 0 || T.find("xscale") == 0) {
-    if (isDarwin)
-      return new DarwinARMTargetInfo(T);
-    if (isFreeBSD)
-      return new FreeBSDTargetInfo<ARMTargetInfo>(T);
-    return new ARMTargetInfo(T);
-  }
-
-  if (T.find("sparc-") == 0) {
-    if (isSolaris)
+  case llvm::Triple::sparc:
+    if (os == llvm::Triple::Solaris)
       return new SolarisSparcV8TargetInfo(T);
     return new SparcV8TargetInfo(T);
-  }
-
-  if (T.find("x86_64-") == 0 || T.find("amd64-") == 0) {
-    if (isDarwin)
-      return new DarwinX86_64TargetInfo(T);
-    if (isLinux)
-      return new LinuxTargetInfo<X86_64TargetInfo>(T);
-    if (isNetBSD)
-      return new NetBSDTargetInfo<X86_64TargetInfo>(T);
-    if (isOpenBSD)
-      return new OpenBSDX86_64TargetInfo(T);
-    if (isFreeBSD)
-      return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
-    if (isSolaris)
-      return new SolarisTargetInfo<X86_64TargetInfo>(T);
-    return new X86_64TargetInfo(T);
-  }
-
-  if (T.find("pic16-") == 0)
-    return new PIC16TargetInfo(T);
-
-  if (T.find("msp430-") == 0)
-    return new MSP430TargetInfo(T);
-
-  if (T.find("s390x-") == 0)
+  case llvm::Triple::systemz:
     return new SystemZTargetInfo(T);
-
-  if (IsX86(T)) {
-    if (isDarwin)
+  case llvm::Triple::thumb:
+    return NULL;
+  case llvm::Triple::x86:
+    switch (os) {
+    case llvm::Triple::Darwin:
       return new DarwinI386TargetInfo(T);
-    if (isLinux)
+    case llvm::Triple::Linux:
       return new LinuxTargetInfo<X86_32TargetInfo>(T);
-    if (isDragonFly)
+    case llvm::Triple::DragonFly:
       return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
-    if (isNetBSD)
+    case llvm::Triple::NetBSD:
       return new NetBSDTargetInfo<X86_32TargetInfo>(T);
-    if (isOpenBSD)
+    case llvm::Triple::OpenBSD:
       return new OpenBSDI386TargetInfo(T);
-    if (isFreeBSD)
+    case llvm::Triple::FreeBSD:
       return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
-    if (isSolaris)
+    case llvm::Triple::Solaris:
       return new SolarisTargetInfo<X86_32TargetInfo>(T);
-    if (isWindows)
+    case llvm::Triple::Cygwin:
+    case llvm::Triple::MinGW:
+    case llvm::Triple::Win32:
       return new WindowsX86_32TargetInfo(T);
-    return new X86_32TargetInfo(T);
+    default:
+      return new X86_32TargetInfo(T);
+    }
+  case llvm::Triple::x86_64:
+    switch (os) {
+    case llvm::Triple::Darwin:
+      return new DarwinX86_64TargetInfo(T);
+    case llvm::Triple::Linux:
+      return new LinuxTargetInfo<X86_64TargetInfo>(T);
+    case llvm::Triple::NetBSD:
+      return new NetBSDTargetInfo<X86_64TargetInfo>(T);
+    case llvm::Triple::OpenBSD:
+      return new OpenBSDX86_64TargetInfo(T);
+    case llvm::Triple::FreeBSD:
+      return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
+    case llvm::Triple::Solaris:
+      return new SolarisTargetInfo<X86_64TargetInfo>(T);
+    default:
+      return new X86_64TargetInfo(T);
+    }
+  case llvm::Triple::xcore:
+    return NULL;
+  case llvm::Triple::UnknownArch:
+  case llvm::Triple::InvalidArch:
+    return NULL;
   }
-
   return NULL;
 }


More information about the cfe-dev mailing list