1# REQUIRES: aarch64 2# RUN: rm -rf %t; mkdir %t && cd %t 3 4############ Test merging multiple categories into a single category ############ 5## Apply category merging to swiftc code just make sure we can handle addends 6## and don't erase category names for swift -- in order to not crash 7# RUN: llvm-mc -filetype=obj -triple=arm64-apple-macos -o cat_swift.o %s 8# RUN: %lld -arch arm64 -dylib -o cat_swift.dylib cat_swift.o -objc_category_merging -no_objc_relative_method_lists 9# RUN: llvm-objdump --objc-meta-data --macho cat_swift.dylib | FileCheck %s --check-prefixes=CHECK-MERGE 10 11; CHECK-MERGE: Contents of (__DATA_CONST,__objc_classlist) section 12; CHECK-MERGE-NEXT: _$s11SimpleClassAACN 13; CHECK-MERGE-NEXT: isa {{.+}} _OBJC_METACLASS_$__TtC11SimpleClass11SimpleClass 14; CHECK-MERGE-NEXT: superclass 0x0 15; CHECK-MERGE-NEXT: cache 0x0 16; CHECK-MERGE-NEXT: vtable 0x0 17; CHECK-MERGE-NEXT: data {{.+}} (struct class_ro_t *) Swift class 18; CHECK-MERGE-NEXT: flags 0x80 19; CHECK-MERGE-NEXT: instanceStart 8 20; CHECK-MERGE-NEXT: instanceSize 8 21; CHECK-MERGE-NEXT: reserved 0x0 22; CHECK-MERGE-NEXT: ivarLayout 0x0 23; CHECK-MERGE-NEXT: name {{.+}} _TtC11SimpleClass11SimpleClass 24; CHECK-MERGE-NEXT: baseMethods {{.+}} (struct method_list_t *) 25; CHECK-MERGE-NEXT: entsize 24 26; CHECK-MERGE-NEXT: count 3 27; CHECK-MERGE-NEXT: name {{.+}} categoryInstanceMethod 28; CHECK-MERGE-NEXT: types {{.+}} q16@0:8 29; CHECK-MERGE-NEXT: imp _$s11SimpleClassAAC22categoryInstanceMethodSiyFTo 30; CHECK-MERGE-NEXT: name {{.+}} baseClassInstanceMethod 31; CHECK-MERGE-NEXT: types {{.+}} i16@0:8 32; CHECK-MERGE-NEXT: imp _$s11SimpleClassAAC04baseB14InstanceMethods5Int32VyFTo 33; CHECK-MERGE-NEXT: name {{.+}} init 34; CHECK-MERGE-NEXT: types {{.+}} @16@0:8 35; CHECK-MERGE-NEXT: imp _$s11SimpleClassAACABycfcTo 36; CHECK-MERGE-NEXT: baseProtocols 0x0 37; CHECK-MERGE-NEXT: ivars 0x0 38; CHECK-MERGE-NEXT: weakIvarLayout 0x0 39; CHECK-MERGE-NEXT: baseProperties 0x0 40; CHECK-MERGE-NEXT: Meta Class 41; CHECK-MERGE-NEXT: isa 0x0 42; CHECK-MERGE-NEXT: superclass 0x0 43; CHECK-MERGE-NEXT: cache 0x0 44; CHECK-MERGE-NEXT: vtable 0x0 45; CHECK-MERGE-NEXT: data {{.+}} (struct class_ro_t *) 46; CHECK-MERGE-NEXT: flags 0x81 RO_META 47; CHECK-MERGE-NEXT: instanceStart 40 48; CHECK-MERGE-NEXT: instanceSize 40 49; CHECK-MERGE-NEXT: reserved 0x0 50; CHECK-MERGE-NEXT: ivarLayout 0x0 51; CHECK-MERGE-NEXT: name {{.+}} _TtC11SimpleClass11SimpleClass 52; CHECK-MERGE-NEXT: baseMethods 0x0 (struct method_list_t *) 53; CHECK-MERGE-NEXT: baseProtocols 0x0 54; CHECK-MERGE-NEXT: ivars 0x0 55; CHECK-MERGE-NEXT: weakIvarLayout 0x0 56; CHECK-MERGE-NEXT: baseProperties 0x0 57; CHECK-MERGE-NEXT: Contents of (__DATA_CONST,__objc_imageinfo) section 58; CHECK-MERGE-NEXT: version 0 59; CHECK-MERGE-NEXT: flags 0x740 OBJC_IMAGE_HAS_CATEGORY_CLASS_PROPERTIES Swift 5 or later 60 61; ================== Generated from Swift: ================== 62;; > xcrun swiftc --version 63;; swift-driver version: 1.109.2 Apple Swift version 6.0 (swiftlang-6.0.0.3.300 clang-1600.0.20.10) 64;; > xcrun swiftc -S SimpleClass.swift -o SimpleClass.s 65; import Foundation 66; @objc class SimpleClass: NSObject { 67; @objc func baseClassInstanceMethod() -> Int32 { 68; return 2 69; } 70; } 71; extension SimpleClass { 72; @objc func categoryInstanceMethod() -> Int { 73; return 3 74; } 75; } 76 77; ================== Generated from Swift: ================== 78 .section __TEXT,__text,regular,pure_instructions 79 .build_version macos, 11, 0 sdk_version 12, 0 80 .globl _main 81 .p2align 2 82_main: 83 .cfi_startproc 84 mov w0, #0 85 ret 86 .cfi_endproc 87 88 .private_extern _$s11SimpleClassAAC04baseB14InstanceMethods5Int32VyF 89 .globl _$s11SimpleClassAAC04baseB14InstanceMethods5Int32VyF 90 .p2align 2 91_$s11SimpleClassAAC04baseB14InstanceMethods5Int32VyF: 92 .cfi_startproc 93 ret 94 .cfi_endproc 95 96 .p2align 2 97_$s11SimpleClassAAC04baseB14InstanceMethods5Int32VyFTo: 98 .cfi_startproc 99 ret 100 .cfi_endproc 101 102 .private_extern _$s11SimpleClassAACABycfC 103 .globl _$s11SimpleClassAACABycfC 104 .p2align 2 105_$s11SimpleClassAACABycfC: 106 .cfi_startproc 107 ret 108 .cfi_endproc 109 110 .private_extern _$s11SimpleClassAACABycfc 111 .globl _$s11SimpleClassAACABycfc 112 .p2align 2 113_$s11SimpleClassAACABycfc: 114 .cfi_startproc 115 ret 116 .cfi_endproc 117 118 .private_extern _$s11SimpleClassAACMa 119 .globl _$s11SimpleClassAACMa 120 .p2align 2 121_$s11SimpleClassAACMa: 122 ret 123 124 .p2align 2 125_$s11SimpleClassAACABycfcTo: 126 .cfi_startproc 127 ret 128 .cfi_endproc 129 130 .private_extern _$s11SimpleClassAACfD 131 .globl _$s11SimpleClassAACfD 132 .p2align 2 133_$s11SimpleClassAACfD: 134 .cfi_startproc 135 ret 136 .cfi_endproc 137 138 .private_extern _$s11SimpleClassAAC22categoryInstanceMethodSiyF 139 .globl _$s11SimpleClassAAC22categoryInstanceMethodSiyF 140 .p2align 2 141_$s11SimpleClassAAC22categoryInstanceMethodSiyF: 142 .cfi_startproc 143 ret 144 .cfi_endproc 145 146 .p2align 2 147_$s11SimpleClassAAC22categoryInstanceMethodSiyFTo: 148 .cfi_startproc 149 ret 150 .cfi_endproc 151 152 .section __TEXT,__objc_methname,cstring_literals 153"L_selector_data(init)": 154 .asciz "init" 155 156 .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip 157 .p2align 3, 0x0 158"L_selector(init)": 159 .quad "L_selector_data(init)" 160 161 .section __TEXT,__objc_methname,cstring_literals 162"L_selector_data(dealloc)": 163 .asciz "dealloc" 164 165 .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip 166 .p2align 3, 0x0 167"L_selector(dealloc)": 168 .quad "L_selector_data(dealloc)" 169 170 .section __TEXT,__swift5_entry,regular,no_dead_strip 171 .p2align 2, 0x0 172l_entry_point: 173 .long _main-l_entry_point 174 .long 0 175 176 .private_extern _OBJC_METACLASS_$__TtC11SimpleClass11SimpleClass 177 .section __DATA,__data 178 .globl _OBJC_METACLASS_$__TtC11SimpleClass11SimpleClass 179 .p2align 3, 0x0 180_OBJC_METACLASS_$__TtC11SimpleClass11SimpleClass: 181 .quad _OBJC_METACLASS_$_NSObject 182 .quad _OBJC_METACLASS_$_NSObject 183 .quad __objc_empty_cache 184 .quad 0 185 .quad __METACLASS_DATA__TtC11SimpleClass11SimpleClass 186 187 .section __TEXT,__cstring,cstring_literals 188 .p2align 4, 0x0 189l_.str.30._TtC11SimpleClass11SimpleClass: 190 .asciz "_TtC11SimpleClass11SimpleClass" 191 192 .section __DATA,__objc_const 193 .p2align 3, 0x0 194__METACLASS_DATA__TtC11SimpleClass11SimpleClass: 195 .long 129 196 .long 40 197 .long 40 198 .long 0 199 .quad 0 200 .quad l_.str.30._TtC11SimpleClass11SimpleClass 201 .quad 0 202 .quad 0 203 .quad 0 204 .quad 0 205 .quad 0 206 207 .section __TEXT,__objc_methname,cstring_literals 208"L_selector_data(baseClassInstanceMethod)": 209 .asciz "baseClassInstanceMethod" 210 211 .section __TEXT,__cstring,cstring_literals 212"l_.str.7.i16@0:8": 213 .asciz "i16@0:8" 214 215"l_.str.7.@16@0:8": 216 .asciz "@16@0:8" 217 218 .section __DATA,__objc_data 219 .p2align 3, 0x0 220__INSTANCE_METHODS__TtC11SimpleClass11SimpleClass: 221 .long 24 222 .long 2 223 .quad "L_selector_data(baseClassInstanceMethod)" 224 .quad "l_.str.7.i16@0:8" 225 .quad _$s11SimpleClassAAC04baseB14InstanceMethods5Int32VyFTo 226 .quad "L_selector_data(init)" 227 .quad "l_.str.7.@16@0:8" 228 .quad _$s11SimpleClassAACABycfcTo 229 230 .p2align 3, 0x0 231__DATA__TtC11SimpleClass11SimpleClass: 232 .long 128 233 .long 8 234 .long 8 235 .long 0 236 .quad 0 237 .quad l_.str.30._TtC11SimpleClass11SimpleClass 238 .quad __INSTANCE_METHODS__TtC11SimpleClass11SimpleClass 239 .quad 0 240 .quad 0 241 .quad 0 242 .quad 0 243 244 .section __TEXT,__const 245l_.str.11.SimpleClass: 246 .asciz "SimpleClass" 247 248 .private_extern _$s11SimpleClassMXM 249 .section __TEXT,__constg_swiftt 250 .globl _$s11SimpleClassMXM 251 .weak_definition _$s11SimpleClassMXM 252 .p2align 2, 0x0 253_$s11SimpleClassMXM: 254 .long 0 255 .long 0 256 .long (l_.str.11.SimpleClass-_$s11SimpleClassMXM)-8 257 258 .private_extern "_symbolic So8NSObjectC" 259 .section __TEXT,__swift5_typeref 260 .globl "_symbolic So8NSObjectC" 261 .weak_definition "_symbolic So8NSObjectC" 262 .p2align 1, 0x0 263"_symbolic So8NSObjectC": 264 .ascii "So8NSObjectC" 265 .byte 0 266 267 .private_extern _$s11SimpleClassAACMn 268 .section __TEXT,__constg_swiftt 269 .globl _$s11SimpleClassAACMn 270 .p2align 2, 0x0 271_$s11SimpleClassAACMn: 272 .long 2147483728 273 .long (_$s11SimpleClassMXM-_$s11SimpleClassAACMn)-4 274 .long (l_.str.11.SimpleClass-_$s11SimpleClassAACMn)-8 275 .long (_$s11SimpleClassAACMa-_$s11SimpleClassAACMn)-12 276 .long (_$s11SimpleClassAACMF-_$s11SimpleClassAACMn)-16 277 .long ("_symbolic So8NSObjectC"-_$s11SimpleClassAACMn)-20 278 .long 3 279 .long 11 280 .long 1 281 .long 0 282 .long 10 283 .long 10 284 .long 1 285 .long 16 286 .long (_$s11SimpleClassAAC04baseB14InstanceMethods5Int32VyF-_$s11SimpleClassAACMn)-56 287 288 .section __DATA,__objc_data 289 .p2align 3, 0x0 290_$s11SimpleClassAACMf: 291 .quad 0 292 .quad _$s11SimpleClassAACfD 293 .quad _$sBOWV 294 .quad _OBJC_METACLASS_$__TtC11SimpleClass11SimpleClass 295 .quad _OBJC_CLASS_$_NSObject 296 .quad __objc_empty_cache 297 .quad 0 298 .quad __DATA__TtC11SimpleClass11SimpleClass+2 299 .long 0 300 .long 0 301 .long 8 302 .short 7 303 .short 0 304 .long 112 305 .long 24 306 .quad _$s11SimpleClassAACMn 307 .quad 0 308 .quad _$s11SimpleClassAAC04baseB14InstanceMethods5Int32VyF 309 310 .private_extern "_symbolic _____ 11SimpleClassAAC" 311 .section __TEXT,__swift5_typeref 312 .globl "_symbolic _____ 11SimpleClassAAC" 313 .weak_definition "_symbolic _____ 11SimpleClassAAC" 314 .p2align 1, 0x0 315"_symbolic _____ 11SimpleClassAAC": 316 .byte 1 317 .long (_$s11SimpleClassAACMn-"_symbolic _____ 11SimpleClassAAC")-1 318 .byte 0 319 320 .section __TEXT,__swift5_fieldmd 321 .p2align 2, 0x0 322_$s11SimpleClassAACMF: 323 .long "_symbolic _____ 11SimpleClassAAC"-_$s11SimpleClassAACMF 324 .long ("_symbolic So8NSObjectC"-_$s11SimpleClassAACMF)-4 325 .short 7 326 .short 12 327 .long 0 328 329 .section __TEXT,__objc_methname,cstring_literals 330"L_selector_data(categoryInstanceMethod)": 331 .asciz "categoryInstanceMethod" 332 333 .section __TEXT,__cstring,cstring_literals 334"l_.str.7.q16@0:8": 335 .asciz "q16@0:8" 336 337 .section __DATA,__objc_data 338 .p2align 3, 0x0 339__CATEGORY_INSTANCE_METHODS__TtC11SimpleClass11SimpleClass_$_SimpleClass: 340 .long 24 341 .long 1 342 .quad "L_selector_data(categoryInstanceMethod)" 343 .quad "l_.str.7.q16@0:8" 344 .quad _$s11SimpleClassAAC22categoryInstanceMethodSiyFTo 345 346 .section __DATA,__objc_const 347 .p2align 3, 0x0 348__CATEGORY__TtC11SimpleClass11SimpleClass_$_SimpleClass: 349 .quad l_.str.11.SimpleClass 350 .quad _$s11SimpleClassAACMf+24 351 .quad __CATEGORY_INSTANCE_METHODS__TtC11SimpleClass11SimpleClass_$_SimpleClass 352 .quad 0 353 .quad 0 354 .quad 0 355 .quad 0 356 .long 60 357 .space 4 358 359 .section __TEXT,__swift5_types 360 .p2align 2, 0x0 361l_$s11SimpleClassAACHn: 362 .long _$s11SimpleClassAACMn-l_$s11SimpleClassAACHn 363 364 .private_extern ___swift_reflection_version 365 .section __TEXT,__const 366 .globl ___swift_reflection_version 367 .weak_definition ___swift_reflection_version 368 .p2align 1, 0x0 369___swift_reflection_version: 370 .short 3 371 372 .section __DATA,__objc_classlist,regular,no_dead_strip 373 .p2align 3, 0x0 374_objc_classes_$s11SimpleClassAACN: 375 .quad _$s11SimpleClassAACN 376 377 .section __DATA,__objc_catlist,regular,no_dead_strip 378 .p2align 3, 0x0 379_objc_categories: 380 .quad __CATEGORY__TtC11SimpleClass11SimpleClass_$_SimpleClass 381 382 .no_dead_strip _main 383 .no_dead_strip l_entry_point 384 .no_dead_strip _$s11SimpleClassAACMF 385 .no_dead_strip l_$s11SimpleClassAACHn 386 .no_dead_strip ___swift_reflection_version 387 .no_dead_strip _objc_classes_$s11SimpleClassAACN 388 .no_dead_strip _objc_categories 389 .section __DATA,__objc_imageinfo,regular,no_dead_strip 390L_OBJC_IMAGE_INFO: 391 .long 0 392 .long 100665152 393 394 .globl _$s11SimpleClassAAC04baseB14InstanceMethods5Int32VyFTq 395 .private_extern _$s11SimpleClassAAC04baseB14InstanceMethods5Int32VyFTq 396 .alt_entry _$s11SimpleClassAAC04baseB14InstanceMethods5Int32VyFTq 397.set _$s11SimpleClassAAC04baseB14InstanceMethods5Int32VyFTq, _$s11SimpleClassAACMn+52 398 .globl _$s11SimpleClassAACN 399 .private_extern _$s11SimpleClassAACN 400 .alt_entry _$s11SimpleClassAACN 401.set _$s11SimpleClassAACN, _$s11SimpleClassAACMf+24 402 .globl _OBJC_CLASS_$__TtC11SimpleClass11SimpleClass 403 .private_extern _OBJC_CLASS_$__TtC11SimpleClass11SimpleClass 404.subsections_via_symbols 405 406_OBJC_CLASS_$_NSObject: 407_OBJC_METACLASS_$_NSObject: 408__objc_empty_cache: 409_$sBOWV: 410 .quad 0 411