xref: /llvm-project/lld/test/MachO/objc-category-merging-erase-objc-name-test.s (revision 89a1f144f3890d9bd8ab30537b36f8c18038719b)
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