diff --git a/lldb/unittests/ObjectFile/MachO/TestObjectFileMachO.cpp b/lldb/unittests/ObjectFile/MachO/TestObjectFileMachO.cpp index 0ef2d0b85fd36..71ff866abb352 100644 --- a/lldb/unittests/ObjectFile/MachO/TestObjectFileMachO.cpp +++ b/lldb/unittests/ObjectFile/MachO/TestObjectFileMachO.cpp @@ -94,4 +94,59 @@ TEST_F(ObjectFileMachOTest, IndirectSymbolsInTheSharedCache) { for (size_t i = 0; i < 10; i++) OF->ParseSymtab(symtab); } + +TEST_F(ObjectFileMachOTest, ObjectFormatWithoutVersionLoadCommand) { + // A Mach-O file without the load command LC_BUILD_VERSION. + const char *yamldata = R"( +--- !mach-o +FileHeader: + magic: 0xFEEDFACF + cputype: 0x0100000C + cpusubtype: 0x00000000 + filetype: 0x00000001 + ncmds: 1 + sizeofcmds: 152 + flags: 0x00002000 + reserved: 0x00000000 +LoadCommands: + - cmd: LC_SEGMENT_64 + cmdsize: 152 + segname: __TEXT + vmaddr: 0 + vmsize: 4 + fileoff: 184 + filesize: 4 + maxprot: 7 + initprot: 7 + nsects: 1 + flags: 0 + Sections: + - sectname: __text + segname: __TEXT + addr: 0x0000000000000000 + content: 'AABBCCDD' + size: 4 + offset: 184 + align: 0 + reloff: 0x00000000 + nreloc: 0 + flags: 0x80000400 + reserved1: 0x00000000 + reserved2: 0x00000000 + reserved3: 0x00000000 +... +)"; + + // Perform setup. + llvm::Expected file = TestFile::fromYaml(yamldata); + EXPECT_THAT_EXPECTED(file, llvm::Succeeded()); + auto module_sp = std::make_shared(file->moduleSpec()); + ASSERT_NE(module_sp, nullptr); + auto object_file = module_sp->GetObjectFile(); + ASSERT_NE(object_file, nullptr); + + // Verify that the object file is recognized as Mach-O. + ASSERT_EQ(object_file->GetArchitecture().GetTriple().getObjectFormat(), + llvm::Triple::MachO); +} #endif diff --git a/llvm/lib/TargetParser/Triple.cpp b/llvm/lib/TargetParser/Triple.cpp index 6a559ff023caa..81b023406a3e3 100644 --- a/llvm/lib/TargetParser/Triple.cpp +++ b/llvm/lib/TargetParser/Triple.cpp @@ -933,6 +933,8 @@ static Triple::ObjectFormatType getDefaultFormat(const Triple &T) { case Triple::Win32: case Triple::UEFI: return Triple::COFF; + case Triple::UnknownOS: + return T.getVendor() == Triple::Apple ? Triple::MachO : Triple::ELF; default: return T.isOSDarwin() ? Triple::MachO : Triple::ELF; } diff --git a/llvm/unittests/TargetParser/TripleTest.cpp b/llvm/unittests/TargetParser/TripleTest.cpp index bbd12e6d0e412..ce71a80b40f2a 100644 --- a/llvm/unittests/TargetParser/TripleTest.cpp +++ b/llvm/unittests/TargetParser/TripleTest.cpp @@ -2579,6 +2579,13 @@ TEST(TripleTest, FileFormat) { EXPECT_EQ(Triple::SPIRV, Triple("spirv32-apple-macosx").getObjectFormat()); EXPECT_EQ(Triple::SPIRV, Triple("spirv64-apple-macosx").getObjectFormat()); EXPECT_EQ(Triple::DXContainer, Triple("dxil-apple-macosx").getObjectFormat()); + + EXPECT_EQ(Triple::MachO, Triple("aarch64-apple-macosx").getObjectFormat()); + EXPECT_EQ(Triple::MachO, Triple("x86_64-apple-macosx").getObjectFormat()); + EXPECT_EQ(Triple::MachO, Triple("aarch64-apple").getObjectFormat()); + EXPECT_EQ(Triple::MachO, Triple("x86_64-apple").getObjectFormat()); + EXPECT_EQ(Triple::ELF, Triple("aarch64").getObjectFormat()); + EXPECT_EQ(Triple::ELF, Triple("x86_64").getObjectFormat()); } TEST(TripleTest, NormalizeWindows) {