diff options
-rw-r--r-- | lldb/include/lldb/Utility/ArchSpec.h | 12 | ||||
-rw-r--r-- | lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp | 2 | ||||
-rw-r--r-- | lldb/source/Utility/ArchSpec.cpp | 9 | ||||
-rw-r--r-- | lldb/unittests/Utility/ArchSpecTest.cpp | 73 |
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()); + } +} |