brintos

brintos / llvm-project-archived public Read only

0
0
Text · 13.3 KiB · bc0b27d Raw
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