From 93318a8b7369dde8762dcba0e8789b95b180e5ed Mon Sep 17 00:00:00 2001 From: alx32 <103613512+alx32@users.noreply.github.com> Date: Thu, 13 Jun 2024 08:06:25 -0700 Subject: [lld-macho] Add swift support to ObjC category merger (#95124) Currently ObjC category merger only supports categories defined in ObjC. But swift supports generating ObjC categories also. This change adds supports for the later categories. --- lld/test/MachO/objc-category-merging-minimal.s | 90 ++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) (limited to 'lld/test') diff --git a/lld/test/MachO/objc-category-merging-minimal.s b/lld/test/MachO/objc-category-merging-minimal.s index fcd90f1..5274933 100644 --- a/lld/test/MachO/objc-category-merging-minimal.s +++ b/lld/test/MachO/objc-category-merging-minimal.s @@ -23,6 +23,10 @@ # RUN: llvm-objdump --objc-meta-data --macho merge_base_class_minimal_no_merge.dylib | FileCheck %s --check-prefixes=NO_MERGE_INTO_BASE # RUN: llvm-objdump --objc-meta-data --macho merge_base_class_minimal_yes_merge.dylib | FileCheck %s --check-prefixes=YES_MERGE_INTO_BASE +############ Test merging swift category into the base class ############ +# RUN: llvm-mc -filetype=obj -triple=arm64-apple-macos -o MyBaseClassSwiftExtension.o MyBaseClassSwiftExtension.s +# RUN: %lld -arch arm64 -dylib -o merge_base_class_swift_minimal_yes_merge.dylib -objc_category_merging MyBaseClassSwiftExtension.o merge_base_class_minimal.o +# RUN: llvm-objdump --objc-meta-data --macho merge_base_class_swift_minimal_yes_merge.dylib | FileCheck %s --check-prefixes=YES_MERGE_INTO_BASE_SWIFT #### Check merge categories enabled ### # Check that the original categories are not there @@ -77,6 +81,21 @@ YES_MERGE_INTO_BASE-NEXT: name {{.*}} baseInstanceMethod YES_MERGE_INTO_BASE-NEXT: types {{.*}} v16@0:8 YES_MERGE_INTO_BASE-NEXT: imp -[MyBaseClass baseInstanceMethod] + +#### Check merge swift category into base class ### +YES_MERGE_INTO_BASE_SWIFT: _OBJC_CLASS_$_MyBaseClass +YES_MERGE_INTO_BASE_SWIFT-NEXT: _OBJC_METACLASS_$_MyBaseClass +YES_MERGE_INTO_BASE_SWIFT: baseMethods +YES_MERGE_INTO_BASE_SWIFT-NEXT: entsize 24 +YES_MERGE_INTO_BASE_SWIFT-NEXT: count 2 +YES_MERGE_INTO_BASE_SWIFT-NEXT: name {{.*}} swiftMethod +YES_MERGE_INTO_BASE_SWIFT-NEXT: types {{.*}} v16@0:8 +YES_MERGE_INTO_BASE_SWIFT-NEXT: imp _$sSo11MyBaseClassC0abC14SwiftExtensionE11swiftMethodyyFTo +YES_MERGE_INTO_BASE_SWIFT-NEXT: name {{.*}} baseInstanceMethod +YES_MERGE_INTO_BASE_SWIFT-NEXT: types {{.*}} v16@0:8 +YES_MERGE_INTO_BASE_SWIFT-NEXT: imp -[MyBaseClass baseInstanceMethod] + + #--- a64_fakedylib.s .section __DATA,__objc_data @@ -279,3 +298,74 @@ L_OBJC_IMAGE_INFO: .long 0 .long 64 .subsections_via_symbols + + +#--- MyBaseClassSwiftExtension.s +; xcrun -sdk macosx swiftc -emit-assembly MyBaseClassSwiftExtension.swift -import-objc-header YourProject-Bridging-Header.h -o MyBaseClassSwiftExtension.s +; ================== Generated from Swift: ================== +; import Foundation +; extension MyBaseClass { +; @objc func swiftMethod() { +; } +; } +; ================== Generated from Swift =================== + .private_extern _$sSo11MyBaseClassC0abC14SwiftExtensionE11swiftMethodyyF + .globl _$sSo11MyBaseClassC0abC14SwiftExtensionE11swiftMethodyyF + .p2align 2 +_$sSo11MyBaseClassC0abC14SwiftExtensionE11swiftMethodyyF: + .cfi_startproc + mov w0, #0 + ret + .cfi_endproc + + .p2align 2 +_$sSo11MyBaseClassC0abC14SwiftExtensionE11swiftMethodyyFTo: + .cfi_startproc + mov w0, #0 + ret + .cfi_endproc + + .section __TEXT,__cstring,cstring_literals + .p2align 4, 0x0 +l_.str.25.MyBaseClassSwiftExtension: + .asciz "MyBaseClassSwiftExtension" + + .section __TEXT,__objc_methname,cstring_literals +"L_selector_data(swiftMethod)": + .asciz "swiftMethod" + + .section __TEXT,__cstring,cstring_literals +"l_.str.7.v16@0:8": + .asciz "v16@0:8" + + .section __DATA,__objc_data + .p2align 3, 0x0 +__CATEGORY_INSTANCE_METHODS_MyBaseClass_$_MyBaseClassSwiftExtension: + .long 24 + .long 1 + .quad "L_selector_data(swiftMethod)" + .quad "l_.str.7.v16@0:8" + .quad _$sSo11MyBaseClassC0abC14SwiftExtensionE11swiftMethodyyFTo + + .section __DATA,__objc_const + .p2align 3, 0x0 +__CATEGORY_MyBaseClass_$_MyBaseClassSwiftExtension: + .quad l_.str.25.MyBaseClassSwiftExtension + .quad _OBJC_CLASS_$_MyBaseClass + .quad __CATEGORY_INSTANCE_METHODS_MyBaseClass_$_MyBaseClassSwiftExtension + .quad 0 + .quad 0 + .quad 0 + .quad 0 + .long 60 + .space 4 + + .section __DATA,__objc_catlist,regular,no_dead_strip + .p2align 3, 0x0 +_objc_categories: + .quad __CATEGORY_MyBaseClass_$_MyBaseClassSwiftExtension + + .no_dead_strip _main + .no_dead_strip l_entry_point + +.subsections_via_symbols -- cgit v1.1