388 lines · plain
1# REQUIRES: aarch642# UNSUPPORTED: system-windows3# due to awk usage4 5# RUN: rm -rf %t; split-file %s %t && cd %t6 7############ Test merging multiple categories into a single category ############8## Create a dylib with a fake base class to link against in when merging between categories9# RUN: llvm-mc -filetype=obj -triple=arm64-apple-macos -o a64_fakedylib.o a64_fakedylib.s10# RUN: %lld -arch arm64 a64_fakedylib.o -o a64_fakedylib.dylib -dylib11 12## Create our main testing dylib - linking against the fake dylib above13# RUN: llvm-mc -filetype=obj -triple=arm64-apple-macos -o merge_cat_minimal.o merge_cat_minimal.s14# RUN: %lld -arch arm64 -dylib -o merge_cat_minimal_no_merge.dylib a64_fakedylib.dylib merge_cat_minimal.o15# RUN: %lld -arch arm64 -dylib -o merge_cat_minimal_merge.dylib -objc_category_merging a64_fakedylib.dylib merge_cat_minimal.o16 17## Now verify that the flag caused category merging to happen appropriatelly18# RUN: llvm-objdump --objc-meta-data --macho merge_cat_minimal_no_merge.dylib | FileCheck %s --check-prefixes=NO_MERGE_CATS19# RUN: llvm-objdump --objc-meta-data --macho merge_cat_minimal_merge.dylib | FileCheck %s --check-prefixes=MERGE_CATS20 21############ Test merging multiple categories into the base class ############22# RUN: llvm-mc -filetype=obj -triple=arm64-apple-macos -o merge_base_class_minimal.o merge_base_class_minimal.s23# RUN: %lld -arch arm64 -dylib -o merge_base_class_minimal_yes_merge.dylib -objc_category_merging merge_base_class_minimal.o merge_cat_minimal.o24# RUN: %lld -arch arm64 -dylib -o merge_base_class_minimal_no_merge.dylib merge_base_class_minimal.o merge_cat_minimal.o25 26# RUN: llvm-objdump --objc-meta-data --macho merge_base_class_minimal_no_merge.dylib | FileCheck %s --check-prefixes=NO_MERGE_INTO_BASE27# RUN: llvm-objdump --objc-meta-data --macho merge_base_class_minimal_yes_merge.dylib | FileCheck %s --check-prefixes=YES_MERGE_INTO_BASE28 29############ Test merging swift category into the base class ############30# RUN: llvm-mc -filetype=obj -triple=arm64-apple-macos -o MyBaseClassSwiftExtension.o MyBaseClassSwiftExtension.s31# RUN: %lld -no_objc_relative_method_lists -arch arm64 -dylib -o merge_base_class_swift_minimal_yes_merge.dylib -objc_category_merging MyBaseClassSwiftExtension.o merge_base_class_minimal.o32# RUN: llvm-objdump --objc-meta-data --macho merge_base_class_swift_minimal_yes_merge.dylib | FileCheck %s --check-prefixes=YES_MERGE_INTO_BASE_SWIFT33 34############ Test merging skipped due to invalid category name ############35# Modify __OBJC_$_CATEGORY_MyBaseClass_$_Category01's name to point to L_OBJC_IMAGE_INFO+336# RUN: awk '/^__OBJC_\$_CATEGORY_MyBaseClass_\$_Category01:/ { print; getline; sub(/^[ \t]*\.quad[ \t]+l_OBJC_CLASS_NAME_$/, "\t.quad\tL_OBJC_IMAGE_INFO+3"); print; next } { print }' merge_cat_minimal.s > merge_cat_minimal_bad_name.s37 38# Assemble the modified source39# RUN: llvm-mc -filetype=obj -triple=arm64-apple-macos -o merge_cat_minimal_bad_name.o merge_cat_minimal_bad_name.s40 41# Run lld and check for the specific warning42# RUN: %no-fatal-warnings-lld -arch arm64 -dylib -objc_category_merging -o merge_cat_minimal_merge.dylib a64_fakedylib.dylib merge_cat_minimal_bad_name.o 2>&1 | FileCheck %s --check-prefix=MERGE_WARNING43 44# Check that lld emitted the warning about skipping category merging45MERGE_WARNING: warning: ObjC category merging skipped for class symbol' _OBJC_CLASS_$_MyBaseClass'46 47#### Check merge categories enabled ###48# Check that the original categories are not there49MERGE_CATS-NOT: __OBJC_$_CATEGORY_MyBaseClass_$_Category0150MERGE_CATS-NOT: __OBJC_$_CATEGORY_MyBaseClass_$_Category0251 52# Check that the merged cateogry is there, in the correct format53MERGE_CATS: __OBJC_$_CATEGORY_MyBaseClass(Category01|Category02)54MERGE_CATS-NEXT: name {{.*}} Category01|Category0255MERGE_CATS: instanceMethods56MERGE_CATS-NEXT: entsize 12 (relative)57MERGE_CATS-NEXT: count 258MERGE_CATS-NEXT: name {{.*}} cat01_InstanceMethod59MERGE_CATS-NEXT: types {{.*}} v16@0:860MERGE_CATS-NEXT: imp {{.*}} -[MyBaseClass(Category01) cat01_InstanceMethod]61MERGE_CATS-NEXT: name {{.*}} cat02_InstanceMethod62MERGE_CATS-NEXT: types {{.*}} v16@0:863MERGE_CATS-NEXT: imp {{.*}} -[MyBaseClass(Category02) cat02_InstanceMethod]64MERGE_CATS-NEXT: classMethods 0x065MERGE_CATS-NEXT: protocols 0x066MERGE_CATS-NEXT: instanceProperties 0x067 68#### Check merge categories disabled ###69# Check that the merged category is not there70NO_MERGE_CATS-NOT: __OBJC_$_CATEGORY_MyBaseClass(Category01|Category02)71 72# Check that the original categories are there73NO_MERGE_CATS: __OBJC_$_CATEGORY_MyBaseClass_$_Category0174NO_MERGE_CATS: __OBJC_$_CATEGORY_MyBaseClass_$_Category0275 76 77#### Check merge cateogires into base class is disabled ####78NO_MERGE_INTO_BASE: __OBJC_$_CATEGORY_MyBaseClass_$_Category0179NO_MERGE_INTO_BASE: __OBJC_$_CATEGORY_MyBaseClass_$_Category0280 81#### Check merge cateogires into base class is enabled and categories are merged into base class ####82YES_MERGE_INTO_BASE-NOT: __OBJC_$_CATEGORY_MyBaseClass_$_Category0183YES_MERGE_INTO_BASE-NOT: __OBJC_$_CATEGORY_MyBaseClass_$_Category0284 85YES_MERGE_INTO_BASE: _OBJC_CLASS_$_MyBaseClass86YES_MERGE_INTO_BASE-NEXT: _OBJC_METACLASS_$_MyBaseClass87YES_MERGE_INTO_BASE: baseMethods88YES_MERGE_INTO_BASE-NEXT: entsize 12 (relative)89YES_MERGE_INTO_BASE-NEXT: count 390YES_MERGE_INTO_BASE-NEXT: name {{.*}} cat01_InstanceMethod91YES_MERGE_INTO_BASE-NEXT: types {{.*}} v16@0:892YES_MERGE_INTO_BASE-NEXT: imp {{.*}} -[MyBaseClass(Category01) cat01_InstanceMethod]93YES_MERGE_INTO_BASE-NEXT: name {{.*}} cat02_InstanceMethod94YES_MERGE_INTO_BASE-NEXT: types {{.*}} v16@0:895YES_MERGE_INTO_BASE-NEXT: imp {{.*}} -[MyBaseClass(Category02) cat02_InstanceMethod]96YES_MERGE_INTO_BASE-NEXT: name {{.*}} baseInstanceMethod97YES_MERGE_INTO_BASE-NEXT: types {{.*}} v16@0:898YES_MERGE_INTO_BASE-NEXT: imp {{.*}} -[MyBaseClass baseInstanceMethod]99 100 101#### Check merge swift category into base class ###102YES_MERGE_INTO_BASE_SWIFT: _OBJC_CLASS_$_MyBaseClass103YES_MERGE_INTO_BASE_SWIFT-NEXT: _OBJC_METACLASS_$_MyBaseClass104YES_MERGE_INTO_BASE_SWIFT: baseMethods105YES_MERGE_INTO_BASE_SWIFT-NEXT: entsize 24106YES_MERGE_INTO_BASE_SWIFT-NEXT: count 2107YES_MERGE_INTO_BASE_SWIFT-NEXT: name {{.*}} swiftMethod108YES_MERGE_INTO_BASE_SWIFT-NEXT: types {{.*}} v16@0:8109YES_MERGE_INTO_BASE_SWIFT-NEXT: imp _$sSo11MyBaseClassC0abC14SwiftExtensionE11swiftMethodyyFTo110YES_MERGE_INTO_BASE_SWIFT-NEXT: name {{.*}} baseInstanceMethod111YES_MERGE_INTO_BASE_SWIFT-NEXT: types {{.*}} v16@0:8112YES_MERGE_INTO_BASE_SWIFT-NEXT: imp -[MyBaseClass baseInstanceMethod]113 114 115#--- a64_fakedylib.s116 117 .section __DATA,__objc_data118 .globl _OBJC_CLASS_$_MyBaseClass119_OBJC_CLASS_$_MyBaseClass:120 .quad 0121 122#--- merge_cat_minimal.s123 124; ================== Generated from ObjC: ==================125; __attribute__((objc_root_class))126; @interface MyBaseClass127; - (void)baseInstanceMethod;128; @end129;130; @interface MyBaseClass(Category01)131; - (void)cat01_InstanceMethod;132; @end133;134; @implementation MyBaseClass(Category01)135; - (void)cat01_InstanceMethod {}136; @end137;138; @interface MyBaseClass(Category02)139; - (void)cat02_InstanceMethod;140; @end141;142; @implementation MyBaseClass(Category02)143; - (void)cat02_InstanceMethod {}144; @end145; ================== Generated from ObjC: ==================146 147 .section __TEXT,__text,regular,pure_instructions148 .p2align 2 ; -- Begin function -[MyBaseClass(Category01) cat01_InstanceMethod]149"-[MyBaseClass(Category01) cat01_InstanceMethod]": ; @"\01-[MyBaseClass(Category01) cat01_InstanceMethod]"150 .cfi_startproc151 ret152 .cfi_endproc153 ; -- End function154 .p2align 2 ; -- Begin function -[MyBaseClass(Category02) cat02_InstanceMethod]155"-[MyBaseClass(Category02) cat02_InstanceMethod]": ; @"\01-[MyBaseClass(Category02) cat02_InstanceMethod]"156 .cfi_startproc157 ret158 .cfi_endproc159 ; -- End function160 .section __TEXT,__objc_classname,cstring_literals161l_OBJC_CLASS_NAME_: ; @OBJC_CLASS_NAME_162 .asciz "Category01"163 .section __TEXT,__objc_methname,cstring_literals164l_OBJC_METH_VAR_NAME_: ; @OBJC_METH_VAR_NAME_165 .asciz "cat01_InstanceMethod"166 .section __TEXT,__objc_methtype,cstring_literals167l_OBJC_METH_VAR_TYPE_: ; @OBJC_METH_VAR_TYPE_168 .asciz "v16@0:8"169 .section __DATA,__objc_const170 .p2align 3, 0x0 ; @"_OBJC_$_CATEGORY_INSTANCE_METHODS_MyBaseClass_$_Category01"171__OBJC_$_CATEGORY_INSTANCE_METHODS_MyBaseClass_$_Category01:172 .long 24 ; 0x18173 .long 1 ; 0x1174 .quad l_OBJC_METH_VAR_NAME_175 .quad l_OBJC_METH_VAR_TYPE_176 .quad "-[MyBaseClass(Category01) cat01_InstanceMethod]"177 .p2align 3, 0x0 ; @"_OBJC_$_CATEGORY_MyBaseClass_$_Category01"178__OBJC_$_CATEGORY_MyBaseClass_$_Category01:179 .quad l_OBJC_CLASS_NAME_180 .quad _OBJC_CLASS_$_MyBaseClass181 .quad __OBJC_$_CATEGORY_INSTANCE_METHODS_MyBaseClass_$_Category01182 .quad 0183 .quad 0184 .quad 0185 .quad 0186 .long 64 ; 0x40187 .space 4188 .section __DATA,__objc_const189l_OBJC_CLASS_NAME_.1: ; @OBJC_CLASS_NAME_.1190 .asciz "Category02"191 .section __TEXT,__objc_methname,cstring_literals192l_OBJC_METH_VAR_NAME_.2: ; @OBJC_METH_VAR_NAME_.2193 .asciz "cat02_InstanceMethod"194 .section __DATA,__objc_const195 .p2align 3, 0x0 ; @"_OBJC_$_CATEGORY_INSTANCE_METHODS_MyBaseClass_$_Category02"196__OBJC_$_CATEGORY_INSTANCE_METHODS_MyBaseClass_$_Category02:197 .long 24 ; 0x18198 .long 1 ; 0x1199 .quad l_OBJC_METH_VAR_NAME_.2200 .quad l_OBJC_METH_VAR_TYPE_201 .quad "-[MyBaseClass(Category02) cat02_InstanceMethod]"202 .p2align 3, 0x0 ; @"_OBJC_$_CATEGORY_MyBaseClass_$_Category02"203__OBJC_$_CATEGORY_MyBaseClass_$_Category02:204 .quad l_OBJC_CLASS_NAME_.1205 .quad _OBJC_CLASS_$_MyBaseClass206 .quad __OBJC_$_CATEGORY_INSTANCE_METHODS_MyBaseClass_$_Category02207 .quad 0208 .quad 0209 .quad 0210 .quad 0211 .long 64 ; 0x40212 .space 4213 .section __DATA,__objc_catlist,regular,no_dead_strip214 .p2align 3, 0x0 ; @"OBJC_LABEL_CATEGORY_$"215l_OBJC_LABEL_CATEGORY_$:216 .quad __OBJC_$_CATEGORY_MyBaseClass_$_Category01217 .quad __OBJC_$_CATEGORY_MyBaseClass_$_Category02218 .section __DATA,__objc_imageinfo,regular,no_dead_strip219L_OBJC_IMAGE_INFO:220 .long 0221 .long 96222.subsections_via_symbols223 224.addrsig225.addrsig_sym __OBJC_$_CATEGORY_MyBaseClass_$_Category01226 227#--- merge_base_class_minimal.s228; clang -c merge_base_class_minimal.mm -O3 -target arm64-apple-macos -arch arm64 -S -o merge_base_class_minimal.s229; ================== Generated from ObjC: ==================230; __attribute__((objc_root_class))231; @interface MyBaseClass232; - (void)baseInstanceMethod;233; @end234;235; @implementation MyBaseClass236; - (void)baseInstanceMethod {}237; @end238; ================== Generated from ObjC ==================239 .section __TEXT,__text,regular,pure_instructions240 .build_version macos, 11, 0241 .p2align 2242"-[MyBaseClass baseInstanceMethod]":243 .cfi_startproc244; %bb.0:245 ret246 .cfi_endproc247 .section __DATA,__objc_data248 .globl _OBJC_CLASS_$_MyBaseClass249 .p2align 3, 0x0250_OBJC_CLASS_$_MyBaseClass:251 .quad _OBJC_METACLASS_$_MyBaseClass252 .quad 0253 .quad 0254 .quad 0255 .quad __OBJC_CLASS_RO_$_MyBaseClass256 .globl _OBJC_METACLASS_$_MyBaseClass257 .p2align 3, 0x0258_OBJC_METACLASS_$_MyBaseClass:259 .quad _OBJC_METACLASS_$_MyBaseClass260 .quad _OBJC_CLASS_$_MyBaseClass261 .quad 0262 .quad 0263 .quad __OBJC_METACLASS_RO_$_MyBaseClass264 .section __TEXT,__objc_classname,cstring_literals265l_OBJC_CLASS_NAME_:266 .asciz "MyBaseClass"267 .section __DATA,__objc_const268 .p2align 3, 0x0269__OBJC_METACLASS_RO_$_MyBaseClass:270 .long 3271 .long 40272 .long 40273 .space 4274 .quad 0275 .quad l_OBJC_CLASS_NAME_276 .quad 0277 .quad 0278 .quad 0279 .quad 0280 .quad 0281 .section __TEXT,__objc_methname,cstring_literals282l_OBJC_METH_VAR_NAME_:283 .asciz "baseInstanceMethod"284 .section __TEXT,__objc_methtype,cstring_literals285l_OBJC_METH_VAR_TYPE_:286 .asciz "v16@0:8"287 .section __DATA,__objc_const288 .p2align 3, 0x0289__OBJC_$_INSTANCE_METHODS_MyBaseClass:290 .long 24291 .long 1292 .quad l_OBJC_METH_VAR_NAME_293 .quad l_OBJC_METH_VAR_TYPE_294 .quad "-[MyBaseClass baseInstanceMethod]"295 .p2align 3, 0x0296__OBJC_CLASS_RO_$_MyBaseClass:297 .long 2298 .long 0299 .long 0300 .space 4301 .quad 0302 .quad l_OBJC_CLASS_NAME_303 .quad __OBJC_$_INSTANCE_METHODS_MyBaseClass304 .quad 0305 .quad 0306 .quad 0307 .quad 0308 .section __DATA,__objc_classlist,regular,no_dead_strip309 .p2align 3, 0x0310l_OBJC_LABEL_CLASS_$:311 .quad _OBJC_CLASS_$_MyBaseClass312 .section __DATA,__objc_imageinfo,regular,no_dead_strip313L_OBJC_IMAGE_INFO:314 .long 0315 .long 64316.subsections_via_symbols317 318 319#--- MyBaseClassSwiftExtension.s320; xcrun -sdk macosx swiftc -emit-assembly MyBaseClassSwiftExtension.swift -import-objc-header YourProject-Bridging-Header.h -o MyBaseClassSwiftExtension.s321; ================== Generated from Swift: ==================322; import Foundation323; extension MyBaseClass {324; @objc func swiftMethod() {325; }326; }327; ================== Generated from Swift ===================328 .private_extern _$sSo11MyBaseClassC0abC14SwiftExtensionE11swiftMethodyyF329 .globl _$sSo11MyBaseClassC0abC14SwiftExtensionE11swiftMethodyyF330 .p2align 2331_$sSo11MyBaseClassC0abC14SwiftExtensionE11swiftMethodyyF:332 .cfi_startproc333 mov w0, #0334 ret335 .cfi_endproc336 337 .p2align 2338_$sSo11MyBaseClassC0abC14SwiftExtensionE11swiftMethodyyFTo:339 .cfi_startproc340 mov w0, #0341 ret342 .cfi_endproc343 344 .section __TEXT,__cstring,cstring_literals345 .p2align 4, 0x0346l_.str.25.MyBaseClassSwiftExtension:347 .asciz "MyBaseClassSwiftExtension"348 349 .section __TEXT,__objc_methname,cstring_literals350"L_selector_data(swiftMethod)":351 .asciz "swiftMethod"352 353 .section __TEXT,__cstring,cstring_literals354"l_.str.7.v16@0:8":355 .asciz "v16@0:8"356 357 .section __DATA,__objc_data358 .p2align 3, 0x0359__CATEGORY_INSTANCE_METHODS_MyBaseClass_$_MyBaseClassSwiftExtension:360 .long 24361 .long 1362 .quad "L_selector_data(swiftMethod)"363 .quad "l_.str.7.v16@0:8"364 .quad _$sSo11MyBaseClassC0abC14SwiftExtensionE11swiftMethodyyFTo365 366 .section __DATA,__objc_const367 .p2align 3, 0x0368__CATEGORY_MyBaseClass_$_MyBaseClassSwiftExtension:369 .quad l_.str.25.MyBaseClassSwiftExtension370 .quad _OBJC_CLASS_$_MyBaseClass371 .quad __CATEGORY_INSTANCE_METHODS_MyBaseClass_$_MyBaseClassSwiftExtension372 .quad 0373 .quad 0374 .quad 0375 .quad 0376 .long 60377 .space 4378 379 .section __DATA,__objc_catlist,regular,no_dead_strip380 .p2align 3, 0x0381_objc_categories:382 .quad __CATEGORY_MyBaseClass_$_MyBaseClassSwiftExtension383 384 .no_dead_strip _main385 .no_dead_strip l_entry_point386 387.subsections_via_symbols388