[llvm-commits] [llvm] r123990 - in /llvm/trunk: include/llvm/ADT/Triple.h lib/Support/Triple.cpp unittests/ADT/TripleTest.cpp

Renato Golin renato.golin at arm.com
Fri Jan 21 10:25:47 PST 2011


Author: rengolin
Date: Fri Jan 21 12:25:47 2011
New Revision: 123990

URL: http://llvm.org/viewvc/llvm-project?rev=123990&view=rev
Log:
Clang was not parsing target triples involving EABI and was generating wrong IR (wrong PCS) and passing the wrong information down llc via the target-triple printed in IR. I've fixed this by adding the parsing of EABI into LLVM's Triple class and using it to choose the correct PCS in Clang's Tools. A Clang patch is on its way to use this infrastructure.

Modified:
    llvm/trunk/include/llvm/ADT/Triple.h
    llvm/trunk/lib/Support/Triple.cpp
    llvm/trunk/unittests/ADT/TripleTest.cpp

Modified: llvm/trunk/include/llvm/ADT/Triple.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/Triple.h?rev=123990&r1=123989&r2=123990&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ADT/Triple.h (original)
+++ llvm/trunk/include/llvm/ADT/Triple.h Fri Jan 21 12:25:47 2011
@@ -72,7 +72,8 @@
     UnknownVendor,
 
     Apple,
-    PC
+    PC,
+    NoVendor
   };
   enum OSType {
     UnknownOS,
@@ -92,10 +93,15 @@
     Solaris,
     Win32,
     Haiku,
-    Minix
+    Minix,
+    NoOS
   };
   enum EnvironmentType {
-    UnknownEnvironment
+    UnknownEnvironment,
+
+    GNU,
+    GNUEABI,
+    EABI
   };
 
 private:

Modified: llvm/trunk/lib/Support/Triple.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Triple.cpp?rev=123990&r1=123989&r2=123990&view=diff
==============================================================================
--- llvm/trunk/lib/Support/Triple.cpp (original)
+++ llvm/trunk/lib/Support/Triple.cpp Fri Jan 21 12:25:47 2011
@@ -84,6 +84,7 @@
 
   case Apple: return "apple";
   case PC: return "pc";
+  case NoVendor: return "none";
   }
 
   return "<invalid>";
@@ -109,6 +110,7 @@
   case Win32: return "win32";
   case Haiku: return "haiku";
   case Minix: return "minix";
+  case NoOS: return "none";
   }
 
   return "<invalid>";
@@ -117,6 +119,9 @@
 const char *Triple::getEnvironmentTypeName(EnvironmentType Kind) {
   switch (Kind) {
   case UnknownEnvironment: return "unknown";
+  case GNU: return "gnu";
+  case GNUEABI: return "gnueabi";
+  case EABI: return "eabi";
   }
 
   return "<invalid>";
@@ -293,6 +298,8 @@
     return Apple;
   else if (VendorName == "pc")
     return PC;
+  else if (VendorName == "none")
+    return NoVendor;
   else
     return UnknownVendor;
 }
@@ -330,12 +337,21 @@
     return Haiku;
   else if (OSName.startswith("minix"))
     return Minix;
+  else if (OSName.startswith("eabi"))
+    return NoOS;
   else
     return UnknownOS;
 }
 
 Triple::EnvironmentType Triple::ParseEnvironment(StringRef EnvironmentName) {
-  return UnknownEnvironment;
+  if (EnvironmentName.startswith("eabi"))
+    return EABI;
+  else if (EnvironmentName.startswith("gnueabi"))
+    return GNUEABI;
+  else if (EnvironmentName.startswith("gnu"))
+    return GNU;
+  else
+    return UnknownEnvironment;
 }
 
 void Triple::Parse() const {
@@ -344,7 +360,12 @@
   Arch = ParseArch(getArchName());
   Vendor = ParseVendor(getVendorName());
   OS = ParseOS(getOSName());
-  Environment = ParseEnvironment(getEnvironmentName());
+  if (OS == NoOS) {
+    // Some targets don't have an OS (embedded systems)
+    Environment = ParseEnvironment(getOSName());
+  } else {
+    Environment = ParseEnvironment(getEnvironmentName());
+  }
 
   assert(isInitialized() && "Failed to initialize!");
 }
@@ -411,7 +432,13 @@
         break;
       case 2:
         OS = ParseOS(Comp);
-        Valid = OS != UnknownOS;
+        // Some targets don't have an OS (embedded systems)
+        if (OS == NoOS) {
+          Environment = ParseEnvironment(Comp);
+          Valid = Environment != UnknownEnvironment;
+        } else {
+          Valid = OS != UnknownOS;
+        }
         break;
       case 3:
         Environment = ParseEnvironment(Comp);
@@ -450,6 +477,9 @@
           for (unsigned i = Idx; i < Components.size(); ++i) {
             // Skip over any fixed components.
             while (i < array_lengthof(Found) && Found[i]) ++i;
+            // Fix problem when Components vector is not big enough
+            if (i >= Components.size())
+              Components.push_back(StringRef(""));
             // Place the component at the new position, getting the component
             // that was at this position - it will be moved right.
             std::swap(CurrentComponent, Components[i]);

Modified: llvm/trunk/unittests/ADT/TripleTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/TripleTest.cpp?rev=123990&r1=123989&r2=123990&view=diff
==============================================================================
--- llvm/trunk/unittests/ADT/TripleTest.cpp (original)
+++ llvm/trunk/unittests/ADT/TripleTest.cpp Fri Jan 21 12:25:47 2011
@@ -85,9 +85,7 @@
   EXPECT_EQ(Triple::x86_64, T.getArch());
   EXPECT_EQ(Triple::PC, T.getVendor());
   EXPECT_EQ(Triple::Linux, T.getOS());
-  // When environments are defined, change this test to verify the "gnu"
-  // environment.
-  EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
+  EXPECT_EQ(Triple::GNU, T.getEnvironment());
 
   T = Triple("powerpc-dunno-notsure");
   EXPECT_EQ(Triple::ppc, T.getArch());
@@ -95,6 +93,12 @@
   EXPECT_EQ(Triple::UnknownOS, T.getOS());
   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
 
+  T = Triple("arm-none-eabi");
+  EXPECT_EQ(Triple::arm, T.getArch());
+  EXPECT_EQ(Triple::NoVendor, T.getVendor());
+  EXPECT_EQ(Triple::NoOS, T.getOS());
+  EXPECT_EQ(Triple::EABI, T.getEnvironment());
+
   T = Triple("huh");
   EXPECT_EQ(Triple::UnknownArch, T.getArch());
 }
@@ -110,6 +114,7 @@
 }
 
 TEST(TripleTest, Normalization) {
+
   EXPECT_EQ("", Triple::normalize(""));
   EXPECT_EQ("-", Triple::normalize("-"));
   EXPECT_EQ("--", Triple::normalize("--"));
@@ -144,6 +149,8 @@
   EXPECT_EQ("-pc", Triple::normalize("pc"));
   EXPECT_EQ("--linux", Triple::normalize("linux"));
 
+  EXPECT_EQ("x86_64--linux-gnu", Triple::normalize("x86_64-gnu-linux"));
+
   // Check that normalizing a permutated set of valid components returns a
   // triple with the unpermuted components.
   StringRef C[4];
@@ -251,6 +258,7 @@
   EXPECT_EQ(Triple::PC, T.getVendor());
   EXPECT_EQ(Triple::Darwin, T.getOS());
   EXPECT_EQ("i386-pc-darwin", T.getTriple());
+
 }
 
 }





More information about the llvm-commits mailing list