[lld] b08acee - Reland 2nd attempt: [lld-macho] Fix bug in reading cpuSubType field.

Vy Nguyen via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 16 19:04:00 PST 2022


Author: Vy Nguyen
Date: 2022-12-16T22:03:46-05:00
New Revision: b08acee423935c16a1503335d78b84ccbbae4ef8

URL: https://github.com/llvm/llvm-project/commit/b08acee423935c16a1503335d78b84ccbbae4ef8
DIFF: https://github.com/llvm/llvm-project/commit/b08acee423935c16a1503335d78b84ccbbae4ef8.diff

LOG: Reland 2nd attempt:  [lld-macho] Fix bug in reading cpuSubType field.

This reverts commit 52a118d08fbb0a45cba8c34346d9ccb14f599c6a.

New changes:
Fix tests to dump both slices in the fat-archive because otool
isn't deterministic about which slice it prints across different archs.
(It printed x86 on x86 machines but arm64 on arm64, this was why
the test failed on arm64)

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

Added: 
    

Modified: 
    lld/MachO/InputFiles.cpp
    lld/test/MachO/fat-arch.s

Removed: 
    


################################################################################
diff  --git a/lld/MachO/InputFiles.cpp b/lld/MachO/InputFiles.cpp
index 54a02f264b85..174ad959c5bc 100644
--- a/lld/MachO/InputFiles.cpp
+++ b/lld/MachO/InputFiles.cpp
@@ -231,8 +231,14 @@ std::optional<MemoryBufferRef> macho::readFile(StringRef path) {
       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);

diff  --git a/lld/test/MachO/fat-arch.s b/lld/test/MachO/fat-arch.s
index 33928b1049be..313b115e1454 100644
--- a/lld/test/MachO/fat-arch.s
+++ b/lld/test/MachO/fat-arch.s
@@ -1,16 +1,38 @@
-# 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 %t.x86_64.o -bundle_loader %t.fat.exec.out -bundle -o %t.fat.bundle
+
+# 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


        


More information about the llvm-commits mailing list