[PATCH] D139572: [lld-macho] Fix bug in reading of cpusubtype field
Vy Nguyen via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Sat Dec 17 20:35:41 PST 2022
oontvoo updated this revision to Diff 483799.
oontvoo added a comment.
Reland #3: temporarily disabled checking cpu type after link due to suspected bug (described above).
(The current test that the link succeeded should be sufficient because
the link would have failed prior to this patch).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D139572/new/
https://reviews.llvm.org/D139572
Files:
lld/MachO/InputFiles.cpp
lld/test/MachO/fat-arch.s
Index: lld/test/MachO/fat-arch.s
===================================================================
--- lld/test/MachO/fat-arch.s
+++ lld/test/MachO/fat-arch.s
@@ -1,16 +1,40 @@
-# REQUIRES: x86
+# REQUIRES: x86,aarch64
+## FIXME: The tests doesn't run on windows right now because of llvm-mc (can't produce triple=arm64-apple-macos11.0)
+# UNSUPPORTED: system-windows
+
# RUN: llvm-mc -filetype=obj -triple=i386-apple-darwin %s -o %t.i386.o
# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t.x86_64.o
+# RUN: llvm-mc -filetype=obj -triple=arm64-apple-macos11.0 %s -o %t.arm64.o
+
# RUN: llvm-lipo %t.i386.o %t.x86_64.o -create -o %t.fat.o
# RUN: %lld -o /dev/null %t.fat.o
-
# RUN: llvm-lipo %t.i386.o -create -o %t.noarch.o
# RUN: not %lld -o /dev/null %t.noarch.o 2>&1 | \
# RUN: FileCheck %s -DFILE=%t.noarch.o
# CHECK: error: unable to find matching architecture in [[FILE]]
+## Validates that we read the cpu-subtype correctly from a fat exec.
+# RUN: %lld -o %t.x86_64.out %t.x86_64.o
+# RUN: %lld -arch arm64 -o %t.arm64.out %t.arm64.o
+# RUN: llvm-lipo %t.x86_64.out %t.arm64.out -create -o %t.fat.exec.out
+# RUN: %lld -arch x86_64 %t.x86_64.o -bundle_loader %t.fat.exec.out -bundle -o %t.fat.bundle
+
+## FIXME: Re-enable this test, which is failing on arm64, once we figured out why
+## %t.fat.bundle is produced as an arm64.
+# RUN llvm-otool -h %t.fat.bundle -f %t.fat.exec.out | FileCheck %s --check-prefix=CPU-SUB
+# CPU-SUB: Fat headers
+# CPU-SUB: nfat_arch 2
+# CPU-SUB: architecture 0
+# CPU-SUB-NEXT: cputype 16777223
+# CPU-SUB-NEXT: cpusubtype 3
+# CPU-SUB: architecture 1
+# CPU-SUB-NEXT: cputype 16777228
+# CPU-SUB-NEXT: cpusubtype 0
+
+# CPU-SUB: magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
+# CPU-SUB-NEXT: 0xfeedfacf 16777223 3 0x{{.+}} {{.+}} {{.+}} {{.+}} {{.+}}
+
.text
.global _main
_main:
- mov $0, %eax
ret
Index: lld/MachO/InputFiles.cpp
===================================================================
--- lld/MachO/InputFiles.cpp
+++ lld/MachO/InputFiles.cpp
@@ -231,8 +231,14 @@
return std::nullopt;
}
- if (read32be(&arch[i].cputype) != static_cast<uint32_t>(target->cpuType) ||
- read32be(&arch[i].cpusubtype) != target->cpuSubtype)
+ uint32_t cpuType = read32be(&arch[i].cputype);
+ uint32_t cpuSubtype =
+ read32be(&arch[i].cpusubtype) & ~MachO::CPU_SUBTYPE_MASK;
+
+ // FIXME: LD64 has a more complex fallback logic here.
+ // Consider implementing that as well?
+ if (cpuType != static_cast<uint32_t>(target->cpuType) ||
+ cpuSubtype != target->cpuSubtype)
continue;
uint32_t offset = read32be(&arch[i].offset);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D139572.483799.patch
Type: text/x-patch
Size: 2758 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20221218/35498efe/attachment.bin>
More information about the llvm-commits
mailing list