309 lines · plain
1; REQUIRES: aarch642 3; Here we test that if we defined a protocol MyTestProtocol and also a category MyTestProtocol4; then when merging the category into the base class (and deleting the category), we don't5; delete the 'MyTestProtocol' name6 7; RUN: mkdir -p %t.dir8 9; RUN: llvm-mc -filetype=obj -triple=arm64-apple-macos -o %t.dir/erase-objc-name.o %s10; RUN: %lld -no_objc_relative_method_lists -arch arm64 -dylib -o %t.dir/erase-objc-name.dylib %t.dir/erase-objc-name.o -objc_category_merging11; RUN: llvm-objdump --objc-meta-data --macho %t.dir/erase-objc-name.dylib | FileCheck %s --check-prefixes=MERGE_CATS12 13; === Check merge categories enabled ===14; Check that the original categories are not there15; MERGE_CATS-NOT: __OBJC_$_CATEGORY_MyBaseClass_$_Category0116; MERGE_CATS-NOT: __OBJC_$_CATEGORY_MyBaseClass_$_Category0217 18; Check that we get the expected output - most importantly that the protocol is named `MyTestProtocol`19; MERGE_CATS: Contents of (__DATA_CONST,__objc_classlist) section20; MERGE_CATS-NEXT: _OBJC_CLASS_$_MyBaseClass21; MERGE_CATS-NEXT: isa {{.*}} _OBJC_METACLASS_$_MyBaseClass22; MERGE_CATS-NEXT: superclass {{.*}}23; MERGE_CATS-NEXT: cache {{.*}}24; MERGE_CATS-NEXT: vtable {{.*}}25; MERGE_CATS-NEXT: data {{.*}} (struct class_ro_t *)26; MERGE_CATS-NEXT: flags {{.*}} RO_ROOT27; MERGE_CATS-NEXT: instanceStart 028; MERGE_CATS-NEXT: instanceSize 029; MERGE_CATS-NEXT: reserved {{.*}}30; MERGE_CATS-NEXT: ivarLayout {{.*}}31; MERGE_CATS-NEXT: name {{.*}} MyBaseClass32; MERGE_CATS-NEXT: baseMethods {{.*}} (struct method_list_t *)33; MERGE_CATS-NEXT: entsize 2434; MERGE_CATS-NEXT: count 235; MERGE_CATS-NEXT: name {{.*}} getValue36; MERGE_CATS-NEXT: types {{.*}} i16@0:837; MERGE_CATS-NEXT: imp -[MyBaseClass(MyTestProtocol) getValue]38; MERGE_CATS-NEXT: name {{.*}} baseInstanceMethod39; MERGE_CATS-NEXT: types {{.*}} v16@0:840; MERGE_CATS-NEXT: imp -[MyBaseClass baseInstanceMethod]41; MERGE_CATS-NEXT: baseProtocols {{.*}}42; MERGE_CATS-NEXT: count 143; MERGE_CATS-NEXT: list[0] {{.*}} (struct protocol_t *)44; MERGE_CATS-NEXT: isa {{.*}}45; MERGE_CATS-NEXT: name {{.*}} MyTestProtocol46; MERGE_CATS-NEXT: protocols {{.*}}47; MERGE_CATS-NEXT: instanceMethods {{.*}} (struct method_list_t *)48; MERGE_CATS-NEXT: entsize 2449; MERGE_CATS-NEXT: count 150; MERGE_CATS-NEXT: name {{.*}} getValue51; MERGE_CATS-NEXT: types {{.*}} i16@0:852; MERGE_CATS-NEXT: imp {{.*}}53; MERGE_CATS-NEXT: classMethods {{.*}} (struct method_list_t *)54; MERGE_CATS-NEXT: optionalInstanceMethods {{.*}}55; MERGE_CATS-NEXT: optionalClassMethods {{.*}}56; MERGE_CATS-NEXT: instanceProperties {{.*}}57; MERGE_CATS-NEXT: ivars {{.*}}58; MERGE_CATS-NEXT: weakIvarLayout {{.*}}59; MERGE_CATS-NEXT: baseProperties {{.*}}60; MERGE_CATS-NEXT: Meta Class61; MERGE_CATS-NEXT: isa {{.*}} _OBJC_METACLASS_$_MyBaseClass62; MERGE_CATS-NEXT: superclass {{.*}} _OBJC_CLASS_$_MyBaseClass63; MERGE_CATS-NEXT: cache {{.*}}64; MERGE_CATS-NEXT: vtable {{.*}}65; MERGE_CATS-NEXT: data {{.*}} (struct class_ro_t *)66; MERGE_CATS-NEXT: flags {{.*}} RO_META RO_ROOT67; MERGE_CATS-NEXT: instanceStart 4068; MERGE_CATS-NEXT: instanceSize 4069; MERGE_CATS-NEXT: reserved {{.*}}70; MERGE_CATS-NEXT: ivarLayout {{.*}}71; MERGE_CATS-NEXT: name {{.*}} MyBaseClass72; MERGE_CATS-NEXT: baseMethods {{.*}} (struct method_list_t *)73; MERGE_CATS-NEXT: baseProtocols {{.*}}74; MERGE_CATS-NEXT: count 175; MERGE_CATS-NEXT: list[0] {{.*}} (struct protocol_t *)76; MERGE_CATS-NEXT: isa {{.*}}77; MERGE_CATS-NEXT: name {{.*}} MyTestProtocol78; MERGE_CATS-NEXT: protocols {{.*}}79; MERGE_CATS-NEXT: instanceMethods {{.*}} (struct method_list_t *)80; MERGE_CATS-NEXT: entsize 2481; MERGE_CATS-NEXT: count 182; MERGE_CATS-NEXT: name {{.*}} getValue83; MERGE_CATS-NEXT: types {{.*}} i16@0:884; MERGE_CATS-NEXT: imp {{.*}}85; MERGE_CATS-NEXT: classMethods {{.*}} (struct method_list_t *)86; MERGE_CATS-NEXT: optionalInstanceMethods {{.*}}87; MERGE_CATS-NEXT: optionalClassMethods {{.*}}88; MERGE_CATS-NEXT: instanceProperties {{.*}}89; MERGE_CATS-NEXT: ivars {{.*}}90; MERGE_CATS-NEXT: weakIvarLayout {{.*}}91; MERGE_CATS-NEXT: baseProperties {{.*}}92; MERGE_CATS-NEXT: Contents of (__DATA_CONST,__objc_protolist) section93; MERGE_CATS-NEXT: {{.*}} {{.*}} __OBJC_PROTOCOL_$_MyTestProtocol94; MERGE_CATS-NEXT: Contents of (__DATA_CONST,__objc_imageinfo) section95; MERGE_CATS-NEXT: version 096; MERGE_CATS-NEXT: flags {{.*}} OBJC_IMAGE_HAS_CATEGORY_CLASS_PROPERTIES97 98 99; ================== repro.sh ====================100; # Write the Objective-C code to a file101; cat << EOF > MyClass.m102; @protocol MyTestProtocol103; - (int)getValue;104; @end105;106; __attribute__((objc_root_class))107; @interface MyBaseClass108; - (void)baseInstanceMethod;109; @end110;111; @implementation MyBaseClass112; - (void)baseInstanceMethod {}113; @end114;115; @interface MyBaseClass (MyTestProtocol) <MyTestProtocol>116; @end117;118; @implementation MyBaseClass (MyTestProtocol)119;120; - (int)getValue {121; return 0x30;122; }123;124; @end125; EOF126;127; # Compile the Objective-C file to assembly128; xcrun clang -S -arch arm64 MyClass.m -o MyClass.s129; ==============================================130 131 132 .section __TEXT,__text,regular,pure_instructions133 .p2align 2 ; -- Begin function -[MyBaseClass baseInstanceMethod]134"-[MyBaseClass baseInstanceMethod]": ; @"\01-[MyBaseClass baseInstanceMethod]"135 .cfi_startproc136; %bb.0:137 sub sp, sp, #16138 .cfi_def_cfa_offset 16139 str x0, [sp, #8]140 str x1, [sp]141 add sp, sp, #16142 ret143 .cfi_endproc144 ; -- End function145 .p2align 2 ; -- Begin function -[MyBaseClass(MyTestProtocol) getValue]146"-[MyBaseClass(MyTestProtocol) getValue]": ; @"\01-[MyBaseClass(MyTestProtocol) getValue]"147 .cfi_startproc148; %bb.0:149 sub sp, sp, #16150 .cfi_def_cfa_offset 16151 str x0, [sp, #8]152 str x1, [sp]153 mov w0, #48 ; =0x30154 add sp, sp, #16155 ret156 .cfi_endproc157 ; -- End function158 .section __DATA,__objc_data159 .globl _OBJC_CLASS_$_MyBaseClass ; @"OBJC_CLASS_$_MyBaseClass"160 .p2align 3, 0x0161_OBJC_CLASS_$_MyBaseClass:162 .quad _OBJC_METACLASS_$_MyBaseClass163 .quad 0164 .quad __objc_empty_cache165 .quad 0166 .quad __OBJC_CLASS_RO_$_MyBaseClass167 .globl _OBJC_METACLASS_$_MyBaseClass ; @"OBJC_METACLASS_$_MyBaseClass"168 .p2align 3, 0x0169_OBJC_METACLASS_$_MyBaseClass:170 .quad _OBJC_METACLASS_$_MyBaseClass171 .quad _OBJC_CLASS_$_MyBaseClass172 .quad __objc_empty_cache173 .quad 0174 .quad __OBJC_METACLASS_RO_$_MyBaseClass175 .section __TEXT,__objc_classname,cstring_literals176l_OBJC_CLASS_NAME_: ; @OBJC_CLASS_NAME_177 .asciz "MyBaseClass"178 .section __DATA,__objc_const179 .p2align 3, 0x0 ; @"_OBJC_METACLASS_RO_$_MyBaseClass"180__OBJC_METACLASS_RO_$_MyBaseClass:181 .long 131 ; 0x83182 .long 40 ; 0x28183 .long 40 ; 0x28184 .space 4185 .quad 0186 .quad l_OBJC_CLASS_NAME_187 .quad 0188 .quad 0189 .quad 0190 .quad 0191 .quad 0192 .section __TEXT,__objc_methname,cstring_literals193l_OBJC_METH_VAR_NAME_: ; @OBJC_METH_VAR_NAME_194 .asciz "baseInstanceMethod"195 .section __TEXT,__objc_methtype,cstring_literals196l_OBJC_METH_VAR_TYPE_: ; @OBJC_METH_VAR_TYPE_197 .asciz "v16@0:8"198 .section __DATA,__objc_const199 .p2align 3, 0x0 ; @"_OBJC_$_INSTANCE_METHODS_MyBaseClass"200__OBJC_$_INSTANCE_METHODS_MyBaseClass:201 .long 24 ; 0x18202 .long 1 ; 0x1203 .quad l_OBJC_METH_VAR_NAME_204 .quad l_OBJC_METH_VAR_TYPE_205 .quad "-[MyBaseClass baseInstanceMethod]"206 .p2align 3, 0x0 ; @"_OBJC_CLASS_RO_$_MyBaseClass"207__OBJC_CLASS_RO_$_MyBaseClass:208 .long 130 ; 0x82209 .long 0 ; 0x0210 .long 0 ; 0x0211 .space 4212 .quad 0213 .quad l_OBJC_CLASS_NAME_214 .quad __OBJC_$_INSTANCE_METHODS_MyBaseClass215 .quad 0216 .quad 0217 .quad 0218 .quad 0219 .section __TEXT,__objc_classname,cstring_literals220l_OBJC_CLASS_NAME_.1: ; @OBJC_CLASS_NAME_.1221 .asciz "MyTestProtocol"222 .section __TEXT,__objc_methname,cstring_literals223l_OBJC_METH_VAR_NAME_.2: ; @OBJC_METH_VAR_NAME_.2224 .asciz "getValue"225 .section __TEXT,__objc_methtype,cstring_literals226l_OBJC_METH_VAR_TYPE_.3: ; @OBJC_METH_VAR_TYPE_.3227 .asciz "i16@0:8"228 .section __DATA,__objc_const229 .p2align 3, 0x0 ; @"_OBJC_$_CATEGORY_INSTANCE_METHODS_MyBaseClass_$_MyTestProtocol"230__OBJC_$_CATEGORY_INSTANCE_METHODS_MyBaseClass_$_MyTestProtocol:231 .long 24 ; 0x18232 .long 1 ; 0x1233 .quad l_OBJC_METH_VAR_NAME_.2234 .quad l_OBJC_METH_VAR_TYPE_.3235 .quad "-[MyBaseClass(MyTestProtocol) getValue]"236 .p2align 3, 0x0 ; @"_OBJC_$_PROTOCOL_INSTANCE_METHODS_MyTestProtocol"237__OBJC_$_PROTOCOL_INSTANCE_METHODS_MyTestProtocol:238 .long 24 ; 0x18239 .long 1 ; 0x1240 .quad l_OBJC_METH_VAR_NAME_.2241 .quad l_OBJC_METH_VAR_TYPE_.3242 .quad 0243 .p2align 3, 0x0 ; @"_OBJC_$_PROTOCOL_METHOD_TYPES_MyTestProtocol"244__OBJC_$_PROTOCOL_METHOD_TYPES_MyTestProtocol:245 .quad l_OBJC_METH_VAR_TYPE_.3246 .private_extern __OBJC_PROTOCOL_$_MyTestProtocol ; @"_OBJC_PROTOCOL_$_MyTestProtocol"247 .section __DATA,__data248 .globl __OBJC_PROTOCOL_$_MyTestProtocol249 .weak_definition __OBJC_PROTOCOL_$_MyTestProtocol250 .p2align 3, 0x0251__OBJC_PROTOCOL_$_MyTestProtocol:252 .quad 0253 .quad l_OBJC_CLASS_NAME_.1254 .quad 0255 .quad __OBJC_$_PROTOCOL_INSTANCE_METHODS_MyTestProtocol256 .quad 0257 .quad 0258 .quad 0259 .quad 0260 .long 96 ; 0x60261 .long 0 ; 0x0262 .quad __OBJC_$_PROTOCOL_METHOD_TYPES_MyTestProtocol263 .quad 0264 .quad 0265 .private_extern __OBJC_LABEL_PROTOCOL_$_MyTestProtocol ; @"_OBJC_LABEL_PROTOCOL_$_MyTestProtocol"266 .section __DATA,__objc_protolist,coalesced,no_dead_strip267 .globl __OBJC_LABEL_PROTOCOL_$_MyTestProtocol268 .weak_definition __OBJC_LABEL_PROTOCOL_$_MyTestProtocol269 .p2align 3, 0x0270__OBJC_LABEL_PROTOCOL_$_MyTestProtocol:271 .quad __OBJC_PROTOCOL_$_MyTestProtocol272 .section __DATA,__objc_const273 .p2align 3, 0x0 ; @"_OBJC_CATEGORY_PROTOCOLS_$_MyBaseClass_$_MyTestProtocol"274__OBJC_CATEGORY_PROTOCOLS_$_MyBaseClass_$_MyTestProtocol:275 .quad 1 ; 0x1276 .quad __OBJC_PROTOCOL_$_MyTestProtocol277 .quad 0278 .p2align 3, 0x0 ; @"_OBJC_$_CATEGORY_MyBaseClass_$_MyTestProtocol"279__OBJC_$_CATEGORY_MyBaseClass_$_MyTestProtocol:280 .quad l_OBJC_CLASS_NAME_.1281 .quad _OBJC_CLASS_$_MyBaseClass282 .quad __OBJC_$_CATEGORY_INSTANCE_METHODS_MyBaseClass_$_MyTestProtocol283 .quad 0284 .quad __OBJC_CATEGORY_PROTOCOLS_$_MyBaseClass_$_MyTestProtocol285 .quad 0286 .quad 0287 .long 64 ; 0x40288 .space 4289 .section __DATA,__objc_classlist,regular,no_dead_strip290 .p2align 3, 0x0 ; @"OBJC_LABEL_CLASS_$"291l_OBJC_LABEL_CLASS_$:292 .quad _OBJC_CLASS_$_MyBaseClass293 .section __DATA,__objc_catlist,regular,no_dead_strip294 .p2align 3, 0x0 ; @"OBJC_LABEL_CATEGORY_$"295l_OBJC_LABEL_CATEGORY_$:296 .quad __OBJC_$_CATEGORY_MyBaseClass_$_MyTestProtocol297 .no_dead_strip __OBJC_PROTOCOL_$_MyTestProtocol298 .no_dead_strip __OBJC_LABEL_PROTOCOL_$_MyTestProtocol299 .section __DATA,__objc_imageinfo,regular,no_dead_strip300L_OBJC_IMAGE_INFO:301 .long 0302 .long 64303 304__objc_empty_cache:305_$sBOWV:306 .quad 0307 308.subsections_via_symbols309