[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