[Lldb-commits] [lldb] [llvm] [lldb] Fix object format of some mach-o files by using vendor info in `getDefaultFormat()` (PR #143633)
via lldb-commits
lldb-commits at lists.llvm.org
Fri Jun 13 16:11:58 PDT 2025
https://github.com/royitaqi updated https://github.com/llvm/llvm-project/pull/143633
>From d01f75f4b8f75676ae15730f0035cca685dc5195 Mon Sep 17 00:00:00 2001
From: Roy Shi <royshi at meta.com>
Date: Tue, 3 Jun 2025 17:04:29 -0700
Subject: [PATCH 1/5] Set default object format. Add test.
---
.../ObjectFile/Mach-O/ObjectFileMachO.cpp | 1 +
.../ObjectFile/MachO/TestObjectFileMachO.cpp | 54 +++++++++++++++++++
2 files changed, 55 insertions(+)
diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
index 3950454b7c90e..0079672c5cbd0 100644
--- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
+++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
@@ -5148,6 +5148,7 @@ void ObjectFileMachO::GetAllArchSpecs(const llvm::MachO::mach_header &header,
llvm::Triple base_triple = base_arch.GetTriple();
base_triple.setOS(llvm::Triple::UnknownOS);
base_triple.setOSName(llvm::StringRef());
+ base_triple.setObjectFormat(llvm::Triple::MachO);
if (header.filetype == MH_PRELOAD) {
if (header.cputype == CPU_TYPE_ARM) {
diff --git a/lldb/unittests/ObjectFile/MachO/TestObjectFileMachO.cpp b/lldb/unittests/ObjectFile/MachO/TestObjectFileMachO.cpp
index 0ef2d0b85fd36..33aaba5d1055f 100644
--- a/lldb/unittests/ObjectFile/MachO/TestObjectFileMachO.cpp
+++ b/lldb/unittests/ObjectFile/MachO/TestObjectFileMachO.cpp
@@ -94,4 +94,58 @@ TEST_F(ObjectFileMachOTest, IndirectSymbolsInTheSharedCache) {
for (size_t i = 0; i < 10; i++)
OF->ParseSymtab(symtab);
}
+
+TEST_F(ObjectFileMachOTest, ObjectFileFormatWithoutLoadCommand) {
+ // 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<TestFile> file = TestFile::fromYaml(yamldata);
+ EXPECT_THAT_EXPECTED(file, llvm::Succeeded());
+ auto module_sp = std::make_shared<Module>(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
>From 119833ef21bb21e580280811fcf16afcf4be4bb2 Mon Sep 17 00:00:00 2001
From: Roy Shi <royshi at meta.com>
Date: Tue, 3 Jun 2025 17:05:09 -0700
Subject: [PATCH 2/5] Fix format
---
lldb/unittests/ObjectFile/MachO/TestObjectFileMachO.cpp | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/lldb/unittests/ObjectFile/MachO/TestObjectFileMachO.cpp b/lldb/unittests/ObjectFile/MachO/TestObjectFileMachO.cpp
index 33aaba5d1055f..aab3e996343b3 100644
--- a/lldb/unittests/ObjectFile/MachO/TestObjectFileMachO.cpp
+++ b/lldb/unittests/ObjectFile/MachO/TestObjectFileMachO.cpp
@@ -136,7 +136,7 @@ TEST_F(ObjectFileMachOTest, ObjectFileFormatWithoutLoadCommand) {
reserved3: 0x00000000
...
)";
-
+
// Perform setup.
llvm::Expected<TestFile> file = TestFile::fromYaml(yamldata);
EXPECT_THAT_EXPECTED(file, llvm::Succeeded());
@@ -146,6 +146,7 @@ TEST_F(ObjectFileMachOTest, ObjectFileFormatWithoutLoadCommand) {
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);
+ ASSERT_EQ(object_file->GetArchitecture().GetTriple().getObjectFormat(),
+ llvm::Triple::MachO);
}
#endif
>From 5bed1c47ee92c5a6e2cb85838ae3b0d4557d6e02 Mon Sep 17 00:00:00 2001
From: Roy Shi <royshi at meta.com>
Date: Wed, 4 Jun 2025 15:41:26 -0700
Subject: [PATCH 3/5] Update unit test name
---
lldb/unittests/ObjectFile/MachO/TestObjectFileMachO.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lldb/unittests/ObjectFile/MachO/TestObjectFileMachO.cpp b/lldb/unittests/ObjectFile/MachO/TestObjectFileMachO.cpp
index aab3e996343b3..71ff866abb352 100644
--- a/lldb/unittests/ObjectFile/MachO/TestObjectFileMachO.cpp
+++ b/lldb/unittests/ObjectFile/MachO/TestObjectFileMachO.cpp
@@ -95,7 +95,7 @@ TEST_F(ObjectFileMachOTest, IndirectSymbolsInTheSharedCache) {
OF->ParseSymtab(symtab);
}
-TEST_F(ObjectFileMachOTest, ObjectFileFormatWithoutLoadCommand) {
+TEST_F(ObjectFileMachOTest, ObjectFormatWithoutVersionLoadCommand) {
// A Mach-O file without the load command LC_BUILD_VERSION.
const char *yamldata = R"(
--- !mach-o
>From e303d3934fad076f433bd3bc18fc1816612a9ba8 Mon Sep 17 00:00:00 2001
From: Roy Shi <royshi at meta.com>
Date: Tue, 10 Jun 2025 16:28:47 -0700
Subject: [PATCH 4/5] Different approach: use vendor in getDefaultFormat()
---
lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp | 1 -
llvm/lib/TargetParser/Triple.cpp | 3 +++
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
index 0079672c5cbd0..3950454b7c90e 100644
--- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
+++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
@@ -5148,7 +5148,6 @@ void ObjectFileMachO::GetAllArchSpecs(const llvm::MachO::mach_header &header,
llvm::Triple base_triple = base_arch.GetTriple();
base_triple.setOS(llvm::Triple::UnknownOS);
base_triple.setOSName(llvm::StringRef());
- base_triple.setObjectFormat(llvm::Triple::MachO);
if (header.filetype == MH_PRELOAD) {
if (header.cputype == CPU_TYPE_ARM) {
diff --git a/llvm/lib/TargetParser/Triple.cpp b/llvm/lib/TargetParser/Triple.cpp
index 6a559ff023caa..19ccd44322314 100644
--- a/llvm/lib/TargetParser/Triple.cpp
+++ b/llvm/lib/TargetParser/Triple.cpp
@@ -933,6 +933,9 @@ 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;
+ // Intentional leak into the default case for additional logic.
default:
return T.isOSDarwin() ? Triple::MachO : Triple::ELF;
}
>From c9ed21479e5f4d6b019f99a51266c2ba1e449289 Mon Sep 17 00:00:00 2001
From: Roy Shi <royshi at meta.com>
Date: Fri, 13 Jun 2025 16:11:44 -0700
Subject: [PATCH 5/5] Add llvm unit test
---
llvm/lib/TargetParser/Triple.cpp | 1 -
llvm/unittests/TargetParser/TripleTest.cpp | 7 +++++++
2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/llvm/lib/TargetParser/Triple.cpp b/llvm/lib/TargetParser/Triple.cpp
index 19ccd44322314..81b023406a3e3 100644
--- a/llvm/lib/TargetParser/Triple.cpp
+++ b/llvm/lib/TargetParser/Triple.cpp
@@ -935,7 +935,6 @@ static Triple::ObjectFormatType getDefaultFormat(const Triple &T) {
return Triple::COFF;
case Triple::UnknownOS:
return T.getVendor() == Triple::Apple ? Triple::MachO : Triple::ELF;
- // Intentional leak into the default case for additional logic.
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) {
More information about the lldb-commits
mailing list