summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/include/lldb/Utility/ArchSpec.h12
-rw-r--r--lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp2
-rw-r--r--lldb/source/Utility/ArchSpec.cpp9
-rw-r--r--lldb/unittests/Utility/ArchSpecTest.cpp73
4 files changed, 79 insertions, 17 deletions
diff --git a/lldb/include/lldb/Utility/ArchSpec.h b/lldb/include/lldb/Utility/ArchSpec.h
index 89eb3ef3d60..d8b06aeb1dd 100644
--- a/lldb/include/lldb/Utility/ArchSpec.h
+++ b/lldb/include/lldb/Utility/ArchSpec.h
@@ -376,20 +376,10 @@ public:
return !m_triple.getVendorName().empty();
}
- bool TripleVendorIsUnspecifiedUnknown() const {
- return m_triple.getVendor() == llvm::Triple::UnknownVendor &&
- m_triple.getVendorName().empty();
- }
-
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();
+ return m_triple.hasEnvironment();
}
//------------------------------------------------------------------
diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
index b6f27fccde9..03726554205 100644
--- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
+++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
@@ -3309,7 +3309,7 @@ ArchSpec ObjectFileELF::GetArchitecture() {
}
if (CalculateType() == eTypeCoreFile &&
- m_arch_spec.TripleOSIsUnspecifiedUnknown()) {
+ !m_arch_spec.TripleOSWasSpecified()) {
// Core files don't have section headers yet they have PT_NOTE program
// headers that might shed more light on the architecture
for (const elf::ELFProgramHeader &H : ProgramHeaders()) {
diff --git a/lldb/source/Utility/ArchSpec.cpp b/lldb/source/Utility/ArchSpec.cpp
index 37432465745..b28119b3b9d 100644
--- a/lldb/source/Utility/ArchSpec.cpp
+++ b/lldb/source/Utility/ArchSpec.cpp
@@ -889,10 +889,9 @@ bool ArchSpec::ContainsOnlyArch(const llvm::Triple &normalized_triple) {
}
void ArchSpec::MergeFrom(const ArchSpec &other) {
- if (TripleVendorIsUnspecifiedUnknown() &&
- !other.TripleVendorIsUnspecifiedUnknown())
+ if (!TripleVendorWasSpecified() && other.TripleVendorWasSpecified())
GetTriple().setVendor(other.GetTriple().getVendor());
- if (TripleOSIsUnspecifiedUnknown() && !other.TripleOSIsUnspecifiedUnknown())
+ if (!TripleOSWasSpecified() && other.TripleVendorWasSpecified())
GetTriple().setOS(other.GetTriple().getOS());
if (GetTriple().getArch() == llvm::Triple::UnknownArch) {
GetTriple().setArch(other.GetTriple().getArch());
@@ -903,8 +902,8 @@ void ArchSpec::MergeFrom(const ArchSpec &other) {
if (other.GetCore() != eCore_uknownMach64)
UpdateCore();
}
- if (GetTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
- !TripleVendorWasSpecified()) {
+ if (!TripleEnvironmentWasSpecified() &&
+ other.TripleEnvironmentWasSpecified() && !TripleVendorWasSpecified()) {
if (other.TripleVendorWasSpecified())
GetTriple().setEnvironment(other.GetTriple().getEnvironment());
}
diff --git a/lldb/unittests/Utility/ArchSpecTest.cpp b/lldb/unittests/Utility/ArchSpecTest.cpp
index 4216eb31205..99d07bc71a0 100644
--- a/lldb/unittests/Utility/ArchSpecTest.cpp
+++ b/lldb/unittests/Utility/ArchSpecTest.cpp
@@ -232,3 +232,76 @@ TEST(ArchSpecTest, OperatorBool) {
EXPECT_FALSE(ArchSpec());
EXPECT_TRUE(ArchSpec("x86_64-pc-linux"));
}
+
+TEST(ArchSpecTest, TripleComponentsWereSpecified) {
+ {
+ ArchSpec A("");
+ ArchSpec B("-");
+ ArchSpec C("--");
+ ArchSpec D("---");
+
+ ASSERT_FALSE(A.TripleVendorWasSpecified());
+ ASSERT_FALSE(A.TripleOSWasSpecified());
+ ASSERT_FALSE(A.TripleEnvironmentWasSpecified());
+
+ ASSERT_FALSE(B.TripleVendorWasSpecified());
+ ASSERT_FALSE(B.TripleOSWasSpecified());
+ ASSERT_FALSE(B.TripleEnvironmentWasSpecified());
+
+ ASSERT_FALSE(C.TripleVendorWasSpecified());
+ ASSERT_FALSE(C.TripleOSWasSpecified());
+ ASSERT_FALSE(C.TripleEnvironmentWasSpecified());
+
+ ASSERT_FALSE(D.TripleVendorWasSpecified());
+ ASSERT_FALSE(D.TripleOSWasSpecified());
+ ASSERT_FALSE(D.TripleEnvironmentWasSpecified());
+ }
+ {
+ // TODO: llvm::Triple::normalize treats the missing components from these
+ // triples as specified unknown components instead of unspecified
+ // components. We need to either change the behavior in llvm or work around
+ // this in lldb.
+ ArchSpec A("armv7");
+ ArchSpec B("armv7-");
+ ArchSpec C("armv7--");
+ ArchSpec D("armv7---");
+
+ ASSERT_FALSE(A.TripleVendorWasSpecified());
+ ASSERT_FALSE(A.TripleOSWasSpecified());
+ ASSERT_FALSE(A.TripleEnvironmentWasSpecified());
+
+ ASSERT_TRUE(B.TripleVendorWasSpecified());
+ ASSERT_FALSE(B.TripleOSWasSpecified());
+ ASSERT_FALSE(B.TripleEnvironmentWasSpecified());
+
+ ASSERT_TRUE(C.TripleVendorWasSpecified());
+ ASSERT_TRUE(C.TripleOSWasSpecified());
+ ASSERT_FALSE(C.TripleEnvironmentWasSpecified());
+
+ ASSERT_TRUE(D.TripleVendorWasSpecified());
+ ASSERT_TRUE(D.TripleOSWasSpecified());
+ ASSERT_TRUE(D.TripleEnvironmentWasSpecified());
+ }
+ {
+ ArchSpec A("x86_64-unknown");
+ ArchSpec B("powerpc-unknown-linux");
+ ArchSpec C("i386-pc-windows-msvc");
+ ArchSpec D("aarch64-unknown-linux-android");
+
+ ASSERT_TRUE(A.TripleVendorWasSpecified());
+ ASSERT_FALSE(A.TripleOSWasSpecified());
+ ASSERT_FALSE(A.TripleEnvironmentWasSpecified());
+
+ ASSERT_TRUE(B.TripleVendorWasSpecified());
+ ASSERT_TRUE(B.TripleOSWasSpecified());
+ ASSERT_FALSE(B.TripleEnvironmentWasSpecified());
+
+ ASSERT_TRUE(C.TripleVendorWasSpecified());
+ ASSERT_TRUE(C.TripleOSWasSpecified());
+ ASSERT_TRUE(C.TripleEnvironmentWasSpecified());
+
+ ASSERT_TRUE(D.TripleVendorWasSpecified());
+ ASSERT_TRUE(D.TripleOSWasSpecified());
+ ASSERT_TRUE(D.TripleEnvironmentWasSpecified());
+ }
+}
OpenPOWER on IntegriCloud