brintos

brintos / llvm-project-archived public Read only

0
0
Text · 14.3 KiB · d4d5933 Raw
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