Skip to content

Commit

Permalink
Fix bug in ArchSpec::MergeFrom
Browse files Browse the repository at this point in the history
Previous ArchSpec tests didn't catch this bug since we never tested just the OS being out of date. Fixed the bug and covered this with a test that would catch this.

This was found when trying to load a core file where the core file was an ELF file with just the e_machine for architeture and where the ELF header had no OS set in the OSABI field of the e_ident. It wasn't merging the architecture with the target architecture correctly.

Differential Revision: https://reviews.llvm.org/D61659

llvm-svn: 360292
  • Loading branch information
clayborg authored and MrSidims committed May 17, 2019
1 parent 56d7828 commit 7d5802c
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 1 deletion.
2 changes: 1 addition & 1 deletion lldb/source/Utility/ArchSpec.cpp
Expand Up @@ -859,7 +859,7 @@ bool ArchSpec::ContainsOnlyArch(const llvm::Triple &normalized_triple) {
void ArchSpec::MergeFrom(const ArchSpec &other) {
if (!TripleVendorWasSpecified() && other.TripleVendorWasSpecified())
GetTriple().setVendor(other.GetTriple().getVendor());
if (!TripleOSWasSpecified() && other.TripleVendorWasSpecified())
if (!TripleOSWasSpecified() && other.TripleOSWasSpecified())
GetTriple().setOS(other.GetTriple().getOS());
if (GetTriple().getArch() == llvm::Triple::UnknownArch) {
GetTriple().setArch(other.GetTriple().getArch());
Expand Down
26 changes: 26 additions & 0 deletions lldb/unittests/Utility/ArchSpecTest.cpp
Expand Up @@ -10,6 +10,7 @@

#include "lldb/Utility/ArchSpec.h"
#include "llvm/BinaryFormat/MachO.h"
#include "llvm/BinaryFormat/ELF.h"

using namespace lldb;
using namespace lldb_private;
Expand Down Expand Up @@ -174,6 +175,31 @@ TEST(ArchSpecTest, MergeFrom) {
EXPECT_EQ(llvm::Triple::EnvironmentType::Android,
A.GetTriple().getEnvironment());
}
{
ArchSpec A, B;
A.SetArchitecture(eArchTypeELF, llvm::ELF::EM_ARM,
LLDB_INVALID_CPUTYPE, llvm::ELF::ELFOSABI_NONE);
B.SetArchitecture(eArchTypeELF, llvm::ELF::EM_ARM,
LLDB_INVALID_CPUTYPE, llvm::ELF::ELFOSABI_LINUX);

EXPECT_TRUE(A.IsValid());
EXPECT_TRUE(B.IsValid());

EXPECT_EQ(llvm::Triple::ArchType::arm, B.GetTriple().getArch());
EXPECT_EQ(llvm::Triple::VendorType::UnknownVendor,
B.GetTriple().getVendor());
EXPECT_EQ(llvm::Triple::OSType::Linux, B.GetTriple().getOS());
EXPECT_EQ(llvm::Triple::EnvironmentType::UnknownEnvironment,
B.GetTriple().getEnvironment());

A.MergeFrom(B);
EXPECT_EQ(llvm::Triple::ArchType::arm, A.GetTriple().getArch());
EXPECT_EQ(llvm::Triple::VendorType::UnknownVendor,
A.GetTriple().getVendor());
EXPECT_EQ(llvm::Triple::OSType::Linux, A.GetTriple().getOS());
EXPECT_EQ(llvm::Triple::EnvironmentType::UnknownEnvironment,
A.GetTriple().getEnvironment());
}
}

TEST(ArchSpecTest, MergeFromMachOUnknown) {
Expand Down

0 comments on commit 7d5802c

Please sign in to comment.