xiaobai created this revision.
xiaobai added reviewers: aprantl, labath, JDevlieghere.
Herald added subscribers: jdoerfert, srhines.

I saw that `llvm::Triple::normalize` will set vendor, os, and
environment to "unknown" if they aren't set. Because we use that function when
creating a triple with a string, we need to make sure that this is accomodated
in functions that check for unknown.


https://reviews.llvm.org/D58653

Files:
  include/lldb/Utility/ArchSpec.h
  source/Utility/ArchSpec.cpp
  unittests/Utility/ArchSpecTest.cpp

Index: unittests/Utility/ArchSpecTest.cpp
===================================================================
--- unittests/Utility/ArchSpecTest.cpp
+++ unittests/Utility/ArchSpecTest.cpp
@@ -232,3 +232,58 @@
   EXPECT_FALSE(ArchSpec());
   EXPECT_TRUE(ArchSpec("x86_64-pc-linux"));
 }
+
+TEST(ArchSpecTest, TripleComponentsWereSpecified) {
+  {
+    ArchSpec A("x86-unknown-unknown");
+    ASSERT_FALSE(A.TripleVendorWasSpecified());
+    ASSERT_FALSE(A.TripleOSWasSpecified());
+    ASSERT_FALSE(A.TripleEnvironmentWasSpecified());
+
+    ASSERT_TRUE(A.TripleVendorIsUnspecifiedUnknown());
+    ASSERT_TRUE(A.TripleOSIsUnspecifiedUnknown());
+    ASSERT_TRUE(A.TripleEnvironmentIsUnspecifiedUnknown());
+  }
+  {
+    ArchSpec A("arm-pc-linux-android");
+    ASSERT_TRUE(A.TripleVendorWasSpecified());
+    ASSERT_TRUE(A.TripleOSWasSpecified());
+    ASSERT_TRUE(A.TripleEnvironmentWasSpecified());
+
+    ASSERT_FALSE(A.TripleVendorIsUnspecifiedUnknown());
+    ASSERT_FALSE(A.TripleOSIsUnspecifiedUnknown());
+    ASSERT_FALSE(A.TripleEnvironmentIsUnspecifiedUnknown());
+  }
+  {
+    ArchSpec A("aarch64-unknown-linux-android");
+    ASSERT_TRUE(A.TripleVendorWasSpecified());
+    ASSERT_TRUE(A.TripleOSWasSpecified());
+    ASSERT_TRUE(A.TripleEnvironmentWasSpecified());
+
+    ASSERT_TRUE(A.TripleVendorIsUnspecifiedUnknown());
+    ASSERT_FALSE(A.TripleOSIsUnspecifiedUnknown());
+    ASSERT_FALSE(A.TripleEnvironmentIsUnspecifiedUnknown());
+  }
+  {
+    ArchSpec A("");
+    ASSERT_FALSE(A.TripleVendorWasSpecified());
+    ASSERT_FALSE(A.TripleOSWasSpecified());
+    ASSERT_FALSE(A.TripleEnvironmentWasSpecified());
+
+    ASSERT_TRUE(A.TripleVendorIsUnspecifiedUnknown());
+    ASSERT_TRUE(A.TripleOSIsUnspecifiedUnknown());
+    ASSERT_TRUE(A.TripleEnvironmentIsUnspecifiedUnknown());
+  }
+  {
+    ArchSpec A("arm---");
+    // Note: llvm::Triple::normalize interprets empty-string as "unknown"
+    // instead of unspecified.
+    ASSERT_TRUE(A.TripleVendorWasSpecified());
+    ASSERT_TRUE(A.TripleOSWasSpecified());
+    ASSERT_TRUE(A.TripleEnvironmentWasSpecified());
+
+    ASSERT_TRUE(A.TripleVendorIsUnspecifiedUnknown());
+    ASSERT_TRUE(A.TripleOSIsUnspecifiedUnknown());
+    ASSERT_TRUE(A.TripleEnvironmentIsUnspecifiedUnknown());
+  }
+}
Index: source/Utility/ArchSpec.cpp
===================================================================
--- source/Utility/ArchSpec.cpp
+++ source/Utility/ArchSpec.cpp
@@ -903,10 +903,10 @@
     if (other.GetCore() != eCore_uknownMach64)
       UpdateCore();
   }
-  if (GetTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
-      !TripleVendorWasSpecified()) {
-    if (other.TripleVendorWasSpecified())
-      GetTriple().setEnvironment(other.GetTriple().getEnvironment());
+  if (TripleEnvironmentIsUnspecifiedUnknown() &&
+      !other.TripleEnvironmentIsUnspecifiedUnknown() &&
+      !TripleVendorWasSpecified() && other.TripleVendorWasSpecified()) {
+    GetTriple().setEnvironment(other.GetTriple().getEnvironment());
   }
   // If this and other are both arm ArchSpecs and this ArchSpec is a generic
   // "some kind of arm" spec but the other ArchSpec is a specific arm core,
Index: include/lldb/Utility/ArchSpec.h
===================================================================
--- include/lldb/Utility/ArchSpec.h
+++ include/lldb/Utility/ArchSpec.h
@@ -378,18 +378,23 @@
 
   bool TripleVendorIsUnspecifiedUnknown() const {
     return m_triple.getVendor() == llvm::Triple::UnknownVendor &&
-           m_triple.getVendorName().empty();
+           (m_triple.getVendorName().empty() ||
+            m_triple.getVendorName() == "unknown");
   }
 
   bool TripleOSWasSpecified() const { return !m_triple.getOSName().empty(); }
 
-  bool TripleEnvironmentWasSpecified() const {
-    return !m_triple.getEnvironmentName().empty();
-  }
-
   bool TripleOSIsUnspecifiedUnknown() const {
     return m_triple.getOS() == llvm::Triple::UnknownOS &&
-           m_triple.getOSName().empty();
+           (m_triple.getOSName().empty() || m_triple.getOSName() == "unknown");
+  }
+
+  bool TripleEnvironmentWasSpecified() const { return m_triple.hasEnvironment(); }
+
+  bool TripleEnvironmentIsUnspecifiedUnknown() const {
+    return m_triple.getEnvironment() == llvm::Triple::UnknownEnvironment &&
+           (!m_triple.hasEnvironment() ||
+            m_triple.getEnvironmentName() == "unknown");
   }
 
   //------------------------------------------------------------------
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to