137be437bSalx32; REQUIRES: aarch64 237be437bSalx32 337be437bSalx32; Here we test that if we defined a protocol MyTestProtocol and also a category MyTestProtocol 437be437bSalx32; then when merging the category into the base class (and deleting the category), we don't 537be437bSalx32; delete the 'MyTestProtocol' name 637be437bSalx32 774e14605SDavid Blaikie; RUN: llvm-mc -filetype=obj -triple=arm64-apple-macos -o %T/erase-objc-name.o %s 8*89a1f144SPeter Rong; RUN: %lld -no_objc_relative_method_lists -arch arm64 -dylib -o %T/erase-objc-name.dylib %T/erase-objc-name.o -objc_category_merging 974e14605SDavid Blaikie; RUN: llvm-objdump --objc-meta-data --macho %T/erase-objc-name.dylib | FileCheck %s --check-prefixes=MERGE_CATS 1037be437bSalx32 1137be437bSalx32; === Check merge categories enabled === 1237be437bSalx32; Check that the original categories are not there 1337be437bSalx32; MERGE_CATS-NOT: __OBJC_$_CATEGORY_MyBaseClass_$_Category01 1437be437bSalx32; MERGE_CATS-NOT: __OBJC_$_CATEGORY_MyBaseClass_$_Category02 1537be437bSalx32 1637be437bSalx32; Check that we get the expected output - most importantly that the protocol is named `MyTestProtocol` 1737be437bSalx32; MERGE_CATS: Contents of (__DATA_CONST,__objc_classlist) section 1837be437bSalx32; MERGE_CATS-NEXT: _OBJC_CLASS_$_MyBaseClass 1937be437bSalx32; MERGE_CATS-NEXT: isa {{.*}} _OBJC_METACLASS_$_MyBaseClass 2037be437bSalx32; MERGE_CATS-NEXT: superclass {{.*}} 2137be437bSalx32; MERGE_CATS-NEXT: cache {{.*}} 2237be437bSalx32; MERGE_CATS-NEXT: vtable {{.*}} 2337be437bSalx32; MERGE_CATS-NEXT: data {{.*}} (struct class_ro_t *) 2437be437bSalx32; MERGE_CATS-NEXT: flags {{.*}} RO_ROOT 2537be437bSalx32; MERGE_CATS-NEXT: instanceStart 0 2637be437bSalx32; MERGE_CATS-NEXT: instanceSize 0 2737be437bSalx32; MERGE_CATS-NEXT: reserved {{.*}} 2837be437bSalx32; MERGE_CATS-NEXT: ivarLayout {{.*}} 2937be437bSalx32; MERGE_CATS-NEXT: name {{.*}} MyBaseClass 3037be437bSalx32; MERGE_CATS-NEXT: baseMethods {{.*}} (struct method_list_t *) 3137be437bSalx32; MERGE_CATS-NEXT: entsize 24 3237be437bSalx32; MERGE_CATS-NEXT: count 2 3337be437bSalx32; MERGE_CATS-NEXT: name {{.*}} getValue 3437be437bSalx32; MERGE_CATS-NEXT: types {{.*}} i16@0:8 3537be437bSalx32; MERGE_CATS-NEXT: imp -[MyBaseClass(MyTestProtocol) getValue] 3637be437bSalx32; MERGE_CATS-NEXT: name {{.*}} baseInstanceMethod 3737be437bSalx32; MERGE_CATS-NEXT: types {{.*}} v16@0:8 3837be437bSalx32; MERGE_CATS-NEXT: imp -[MyBaseClass baseInstanceMethod] 3937be437bSalx32; MERGE_CATS-NEXT: baseProtocols {{.*}} 4037be437bSalx32; MERGE_CATS-NEXT: count 1 4137be437bSalx32; MERGE_CATS-NEXT: list[0] {{.*}} (struct protocol_t *) 4237be437bSalx32; MERGE_CATS-NEXT: isa {{.*}} 4337be437bSalx32; MERGE_CATS-NEXT: name {{.*}} MyTestProtocol 4437be437bSalx32; MERGE_CATS-NEXT: protocols {{.*}} 4537be437bSalx32; MERGE_CATS-NEXT: instanceMethods {{.*}} (struct method_list_t *) 4637be437bSalx32; MERGE_CATS-NEXT: entsize 24 4737be437bSalx32; MERGE_CATS-NEXT: count 1 4837be437bSalx32; MERGE_CATS-NEXT: name {{.*}} getValue 4937be437bSalx32; MERGE_CATS-NEXT: types {{.*}} i16@0:8 5037be437bSalx32; MERGE_CATS-NEXT: imp {{.*}} 5137be437bSalx32; MERGE_CATS-NEXT: classMethods {{.*}} (struct method_list_t *) 5237be437bSalx32; MERGE_CATS-NEXT: optionalInstanceMethods {{.*}} 5337be437bSalx32; MERGE_CATS-NEXT: optionalClassMethods {{.*}} 5437be437bSalx32; MERGE_CATS-NEXT: instanceProperties {{.*}} 5537be437bSalx32; MERGE_CATS-NEXT: ivars {{.*}} 5637be437bSalx32; MERGE_CATS-NEXT: weakIvarLayout {{.*}} 5737be437bSalx32; MERGE_CATS-NEXT: baseProperties {{.*}} 5837be437bSalx32; MERGE_CATS-NEXT: Meta Class 5937be437bSalx32; MERGE_CATS-NEXT: isa {{.*}} _OBJC_METACLASS_$_MyBaseClass 6037be437bSalx32; MERGE_CATS-NEXT: superclass {{.*}} _OBJC_CLASS_$_MyBaseClass 6137be437bSalx32; MERGE_CATS-NEXT: cache {{.*}} 6237be437bSalx32; MERGE_CATS-NEXT: vtable {{.*}} 6337be437bSalx32; MERGE_CATS-NEXT: data {{.*}} (struct class_ro_t *) 6437be437bSalx32; MERGE_CATS-NEXT: flags {{.*}} RO_META RO_ROOT 6537be437bSalx32; MERGE_CATS-NEXT: instanceStart 40 6637be437bSalx32; MERGE_CATS-NEXT: instanceSize 40 6737be437bSalx32; MERGE_CATS-NEXT: reserved {{.*}} 6837be437bSalx32; MERGE_CATS-NEXT: ivarLayout {{.*}} 6937be437bSalx32; MERGE_CATS-NEXT: name {{.*}} MyBaseClass 7037be437bSalx32; MERGE_CATS-NEXT: baseMethods {{.*}} (struct method_list_t *) 7137be437bSalx32; MERGE_CATS-NEXT: baseProtocols {{.*}} 7237be437bSalx32; MERGE_CATS-NEXT: count 1 7337be437bSalx32; MERGE_CATS-NEXT: list[0] {{.*}} (struct protocol_t *) 7437be437bSalx32; MERGE_CATS-NEXT: isa {{.*}} 7537be437bSalx32; MERGE_CATS-NEXT: name {{.*}} MyTestProtocol 7637be437bSalx32; MERGE_CATS-NEXT: protocols {{.*}} 7737be437bSalx32; MERGE_CATS-NEXT: instanceMethods {{.*}} (struct method_list_t *) 7837be437bSalx32; MERGE_CATS-NEXT: entsize 24 7937be437bSalx32; MERGE_CATS-NEXT: count 1 8037be437bSalx32; MERGE_CATS-NEXT: name {{.*}} getValue 8137be437bSalx32; MERGE_CATS-NEXT: types {{.*}} i16@0:8 8237be437bSalx32; MERGE_CATS-NEXT: imp {{.*}} 8337be437bSalx32; MERGE_CATS-NEXT: classMethods {{.*}} (struct method_list_t *) 8437be437bSalx32; MERGE_CATS-NEXT: optionalInstanceMethods {{.*}} 8537be437bSalx32; MERGE_CATS-NEXT: optionalClassMethods {{.*}} 8637be437bSalx32; MERGE_CATS-NEXT: instanceProperties {{.*}} 8737be437bSalx32; MERGE_CATS-NEXT: ivars {{.*}} 8837be437bSalx32; MERGE_CATS-NEXT: weakIvarLayout {{.*}} 8937be437bSalx32; MERGE_CATS-NEXT: baseProperties {{.*}} 9037be437bSalx32; MERGE_CATS-NEXT: Contents of (__DATA_CONST,__objc_protolist) section 9137be437bSalx32; MERGE_CATS-NEXT: {{.*}} {{.*}} __OBJC_PROTOCOL_$_MyTestProtocol 9237be437bSalx32; MERGE_CATS-NEXT: Contents of (__DATA_CONST,__objc_imageinfo) section 9337be437bSalx32; MERGE_CATS-NEXT: version 0 9437be437bSalx32; MERGE_CATS-NEXT: flags {{.*}} OBJC_IMAGE_HAS_CATEGORY_CLASS_PROPERTIES 9537be437bSalx32 9637be437bSalx32 9737be437bSalx32; ================== repro.sh ==================== 9837be437bSalx32; # Write the Objective-C code to a file 9937be437bSalx32; cat << EOF > MyClass.m 10037be437bSalx32; @protocol MyTestProtocol 10137be437bSalx32; - (int)getValue; 10237be437bSalx32; @end 10337be437bSalx32; 10437be437bSalx32; __attribute__((objc_root_class)) 10537be437bSalx32; @interface MyBaseClass 10637be437bSalx32; - (void)baseInstanceMethod; 10737be437bSalx32; @end 10837be437bSalx32; 10937be437bSalx32; @implementation MyBaseClass 11037be437bSalx32; - (void)baseInstanceMethod {} 11137be437bSalx32; @end 11237be437bSalx32; 11337be437bSalx32; @interface MyBaseClass (MyTestProtocol) <MyTestProtocol> 11437be437bSalx32; @end 11537be437bSalx32; 11637be437bSalx32; @implementation MyBaseClass (MyTestProtocol) 11737be437bSalx32; 11837be437bSalx32; - (int)getValue { 11937be437bSalx32; return 0x30; 12037be437bSalx32; } 12137be437bSalx32; 12237be437bSalx32; @end 12337be437bSalx32; EOF 12437be437bSalx32; 12537be437bSalx32; # Compile the Objective-C file to assembly 12637be437bSalx32; xcrun clang -S -arch arm64 MyClass.m -o MyClass.s 12737be437bSalx32; ============================================== 12837be437bSalx32 12937be437bSalx32 13037be437bSalx32 .section __TEXT,__text,regular,pure_instructions 13137be437bSalx32 .p2align 2 ; -- Begin function -[MyBaseClass baseInstanceMethod] 13237be437bSalx32"-[MyBaseClass baseInstanceMethod]": ; @"\01-[MyBaseClass baseInstanceMethod]" 13337be437bSalx32 .cfi_startproc 13437be437bSalx32; %bb.0: 13537be437bSalx32 sub sp, sp, #16 13637be437bSalx32 .cfi_def_cfa_offset 16 13737be437bSalx32 str x0, [sp, #8] 13837be437bSalx32 str x1, [sp] 13937be437bSalx32 add sp, sp, #16 14037be437bSalx32 ret 14137be437bSalx32 .cfi_endproc 14237be437bSalx32 ; -- End function 14337be437bSalx32 .p2align 2 ; -- Begin function -[MyBaseClass(MyTestProtocol) getValue] 14437be437bSalx32"-[MyBaseClass(MyTestProtocol) getValue]": ; @"\01-[MyBaseClass(MyTestProtocol) getValue]" 14537be437bSalx32 .cfi_startproc 14637be437bSalx32; %bb.0: 14737be437bSalx32 sub sp, sp, #16 14837be437bSalx32 .cfi_def_cfa_offset 16 14937be437bSalx32 str x0, [sp, #8] 15037be437bSalx32 str x1, [sp] 15137be437bSalx32 mov w0, #48 ; =0x30 15237be437bSalx32 add sp, sp, #16 15337be437bSalx32 ret 15437be437bSalx32 .cfi_endproc 15537be437bSalx32 ; -- End function 15637be437bSalx32 .section __DATA,__objc_data 15737be437bSalx32 .globl _OBJC_CLASS_$_MyBaseClass ; @"OBJC_CLASS_$_MyBaseClass" 15837be437bSalx32 .p2align 3, 0x0 15937be437bSalx32_OBJC_CLASS_$_MyBaseClass: 16037be437bSalx32 .quad _OBJC_METACLASS_$_MyBaseClass 16137be437bSalx32 .quad 0 16237be437bSalx32 .quad __objc_empty_cache 16337be437bSalx32 .quad 0 16437be437bSalx32 .quad __OBJC_CLASS_RO_$_MyBaseClass 16537be437bSalx32 .globl _OBJC_METACLASS_$_MyBaseClass ; @"OBJC_METACLASS_$_MyBaseClass" 16637be437bSalx32 .p2align 3, 0x0 16737be437bSalx32_OBJC_METACLASS_$_MyBaseClass: 16837be437bSalx32 .quad _OBJC_METACLASS_$_MyBaseClass 16937be437bSalx32 .quad _OBJC_CLASS_$_MyBaseClass 17037be437bSalx32 .quad __objc_empty_cache 17137be437bSalx32 .quad 0 17237be437bSalx32 .quad __OBJC_METACLASS_RO_$_MyBaseClass 17337be437bSalx32 .section __TEXT,__objc_classname,cstring_literals 17437be437bSalx32l_OBJC_CLASS_NAME_: ; @OBJC_CLASS_NAME_ 17537be437bSalx32 .asciz "MyBaseClass" 17637be437bSalx32 .section __DATA,__objc_const 17737be437bSalx32 .p2align 3, 0x0 ; @"_OBJC_METACLASS_RO_$_MyBaseClass" 17837be437bSalx32__OBJC_METACLASS_RO_$_MyBaseClass: 17937be437bSalx32 .long 131 ; 0x83 18037be437bSalx32 .long 40 ; 0x28 18137be437bSalx32 .long 40 ; 0x28 18237be437bSalx32 .space 4 18337be437bSalx32 .quad 0 18437be437bSalx32 .quad l_OBJC_CLASS_NAME_ 18537be437bSalx32 .quad 0 18637be437bSalx32 .quad 0 18737be437bSalx32 .quad 0 18837be437bSalx32 .quad 0 18937be437bSalx32 .quad 0 19037be437bSalx32 .section __TEXT,__objc_methname,cstring_literals 19137be437bSalx32l_OBJC_METH_VAR_NAME_: ; @OBJC_METH_VAR_NAME_ 19237be437bSalx32 .asciz "baseInstanceMethod" 19337be437bSalx32 .section __TEXT,__objc_methtype,cstring_literals 19437be437bSalx32l_OBJC_METH_VAR_TYPE_: ; @OBJC_METH_VAR_TYPE_ 19537be437bSalx32 .asciz "v16@0:8" 19637be437bSalx32 .section __DATA,__objc_const 19737be437bSalx32 .p2align 3, 0x0 ; @"_OBJC_$_INSTANCE_METHODS_MyBaseClass" 19837be437bSalx32__OBJC_$_INSTANCE_METHODS_MyBaseClass: 19937be437bSalx32 .long 24 ; 0x18 20037be437bSalx32 .long 1 ; 0x1 20137be437bSalx32 .quad l_OBJC_METH_VAR_NAME_ 20237be437bSalx32 .quad l_OBJC_METH_VAR_TYPE_ 20337be437bSalx32 .quad "-[MyBaseClass baseInstanceMethod]" 20437be437bSalx32 .p2align 3, 0x0 ; @"_OBJC_CLASS_RO_$_MyBaseClass" 20537be437bSalx32__OBJC_CLASS_RO_$_MyBaseClass: 20637be437bSalx32 .long 130 ; 0x82 20737be437bSalx32 .long 0 ; 0x0 20837be437bSalx32 .long 0 ; 0x0 20937be437bSalx32 .space 4 21037be437bSalx32 .quad 0 21137be437bSalx32 .quad l_OBJC_CLASS_NAME_ 21237be437bSalx32 .quad __OBJC_$_INSTANCE_METHODS_MyBaseClass 21337be437bSalx32 .quad 0 21437be437bSalx32 .quad 0 21537be437bSalx32 .quad 0 21637be437bSalx32 .quad 0 21737be437bSalx32 .section __TEXT,__objc_classname,cstring_literals 21837be437bSalx32l_OBJC_CLASS_NAME_.1: ; @OBJC_CLASS_NAME_.1 21937be437bSalx32 .asciz "MyTestProtocol" 22037be437bSalx32 .section __TEXT,__objc_methname,cstring_literals 22137be437bSalx32l_OBJC_METH_VAR_NAME_.2: ; @OBJC_METH_VAR_NAME_.2 22237be437bSalx32 .asciz "getValue" 22337be437bSalx32 .section __TEXT,__objc_methtype,cstring_literals 22437be437bSalx32l_OBJC_METH_VAR_TYPE_.3: ; @OBJC_METH_VAR_TYPE_.3 22537be437bSalx32 .asciz "i16@0:8" 22637be437bSalx32 .section __DATA,__objc_const 22737be437bSalx32 .p2align 3, 0x0 ; @"_OBJC_$_CATEGORY_INSTANCE_METHODS_MyBaseClass_$_MyTestProtocol" 22837be437bSalx32__OBJC_$_CATEGORY_INSTANCE_METHODS_MyBaseClass_$_MyTestProtocol: 22937be437bSalx32 .long 24 ; 0x18 23037be437bSalx32 .long 1 ; 0x1 23137be437bSalx32 .quad l_OBJC_METH_VAR_NAME_.2 23237be437bSalx32 .quad l_OBJC_METH_VAR_TYPE_.3 23337be437bSalx32 .quad "-[MyBaseClass(MyTestProtocol) getValue]" 23437be437bSalx32 .p2align 3, 0x0 ; @"_OBJC_$_PROTOCOL_INSTANCE_METHODS_MyTestProtocol" 23537be437bSalx32__OBJC_$_PROTOCOL_INSTANCE_METHODS_MyTestProtocol: 23637be437bSalx32 .long 24 ; 0x18 23737be437bSalx32 .long 1 ; 0x1 23837be437bSalx32 .quad l_OBJC_METH_VAR_NAME_.2 23937be437bSalx32 .quad l_OBJC_METH_VAR_TYPE_.3 24037be437bSalx32 .quad 0 24137be437bSalx32 .p2align 3, 0x0 ; @"_OBJC_$_PROTOCOL_METHOD_TYPES_MyTestProtocol" 24237be437bSalx32__OBJC_$_PROTOCOL_METHOD_TYPES_MyTestProtocol: 24337be437bSalx32 .quad l_OBJC_METH_VAR_TYPE_.3 24437be437bSalx32 .private_extern __OBJC_PROTOCOL_$_MyTestProtocol ; @"_OBJC_PROTOCOL_$_MyTestProtocol" 24537be437bSalx32 .section __DATA,__data 24637be437bSalx32 .globl __OBJC_PROTOCOL_$_MyTestProtocol 24737be437bSalx32 .weak_definition __OBJC_PROTOCOL_$_MyTestProtocol 24837be437bSalx32 .p2align 3, 0x0 24937be437bSalx32__OBJC_PROTOCOL_$_MyTestProtocol: 25037be437bSalx32 .quad 0 25137be437bSalx32 .quad l_OBJC_CLASS_NAME_.1 25237be437bSalx32 .quad 0 25337be437bSalx32 .quad __OBJC_$_PROTOCOL_INSTANCE_METHODS_MyTestProtocol 25437be437bSalx32 .quad 0 25537be437bSalx32 .quad 0 25637be437bSalx32 .quad 0 25737be437bSalx32 .quad 0 25837be437bSalx32 .long 96 ; 0x60 25937be437bSalx32 .long 0 ; 0x0 26037be437bSalx32 .quad __OBJC_$_PROTOCOL_METHOD_TYPES_MyTestProtocol 26137be437bSalx32 .quad 0 26237be437bSalx32 .quad 0 26337be437bSalx32 .private_extern __OBJC_LABEL_PROTOCOL_$_MyTestProtocol ; @"_OBJC_LABEL_PROTOCOL_$_MyTestProtocol" 26437be437bSalx32 .section __DATA,__objc_protolist,coalesced,no_dead_strip 26537be437bSalx32 .globl __OBJC_LABEL_PROTOCOL_$_MyTestProtocol 26637be437bSalx32 .weak_definition __OBJC_LABEL_PROTOCOL_$_MyTestProtocol 26737be437bSalx32 .p2align 3, 0x0 26837be437bSalx32__OBJC_LABEL_PROTOCOL_$_MyTestProtocol: 26937be437bSalx32 .quad __OBJC_PROTOCOL_$_MyTestProtocol 27037be437bSalx32 .section __DATA,__objc_const 27137be437bSalx32 .p2align 3, 0x0 ; @"_OBJC_CATEGORY_PROTOCOLS_$_MyBaseClass_$_MyTestProtocol" 27237be437bSalx32__OBJC_CATEGORY_PROTOCOLS_$_MyBaseClass_$_MyTestProtocol: 27337be437bSalx32 .quad 1 ; 0x1 27437be437bSalx32 .quad __OBJC_PROTOCOL_$_MyTestProtocol 27537be437bSalx32 .quad 0 27637be437bSalx32 .p2align 3, 0x0 ; @"_OBJC_$_CATEGORY_MyBaseClass_$_MyTestProtocol" 27737be437bSalx32__OBJC_$_CATEGORY_MyBaseClass_$_MyTestProtocol: 27837be437bSalx32 .quad l_OBJC_CLASS_NAME_.1 27937be437bSalx32 .quad _OBJC_CLASS_$_MyBaseClass 28037be437bSalx32 .quad __OBJC_$_CATEGORY_INSTANCE_METHODS_MyBaseClass_$_MyTestProtocol 28137be437bSalx32 .quad 0 28237be437bSalx32 .quad __OBJC_CATEGORY_PROTOCOLS_$_MyBaseClass_$_MyTestProtocol 28337be437bSalx32 .quad 0 28437be437bSalx32 .quad 0 28537be437bSalx32 .long 64 ; 0x40 28637be437bSalx32 .space 4 28737be437bSalx32 .section __DATA,__objc_classlist,regular,no_dead_strip 28837be437bSalx32 .p2align 3, 0x0 ; @"OBJC_LABEL_CLASS_$" 28937be437bSalx32l_OBJC_LABEL_CLASS_$: 29037be437bSalx32 .quad _OBJC_CLASS_$_MyBaseClass 29137be437bSalx32 .section __DATA,__objc_catlist,regular,no_dead_strip 29237be437bSalx32 .p2align 3, 0x0 ; @"OBJC_LABEL_CATEGORY_$" 29337be437bSalx32l_OBJC_LABEL_CATEGORY_$: 29437be437bSalx32 .quad __OBJC_$_CATEGORY_MyBaseClass_$_MyTestProtocol 29537be437bSalx32 .no_dead_strip __OBJC_PROTOCOL_$_MyTestProtocol 29637be437bSalx32 .no_dead_strip __OBJC_LABEL_PROTOCOL_$_MyTestProtocol 29737be437bSalx32 .section __DATA,__objc_imageinfo,regular,no_dead_strip 29837be437bSalx32L_OBJC_IMAGE_INFO: 29937be437bSalx32 .long 0 30037be437bSalx32 .long 64 30137be437bSalx32 30237be437bSalx32__objc_empty_cache: 30337be437bSalx32_$sBOWV: 30437be437bSalx32 .quad 0 30537be437bSalx32 30637be437bSalx32.subsections_via_symbols 307