blob: 7b10575bfae2b115b1243e5db4b94e1687c6f954 [file] [log] [blame]
// REQUIRES: objc_interop
// RUN: otool -tvV %platform-module-dir/libswiftCore.dylib | %FileCheck %s --check-prefix=CHECK-%target-cpu
// Verify the autorelease return optimization sequence.
/// Test x86-64:
// CHECK-x86_64-LABEL: _swift_stdlib_NSStringHashValue:
// CHECK-x86_64-NOT: ret
// CHECK-x86_64: movq {{.*}}(%rip), %rsi ## Objc selector ref: decomposedStringWithCanonicalMapping
// CHECK-x86_64: movq {{.*}}(%rip), [[MSG:%.*]] ## Objc message: -[%rdi decomposedStringWithCanonicalMapping]
// CHECK-x86_64: callq *[[MSG]]
// CHECK-x86_64: movq %rax, %rdi
// CHECK-x86_64: callq {{.*}} ## symbol stub for: _objc_retainAutoreleasedReturnValue
// CHECK-x86_64: ret
// CHECK-x86_64-LABEL: _swift_stdlib_NSStringHashValuePointer:
// CHECK-x86_64-NOT: ret
// CHECK-x86_64: movq {{.*}}(%rip), %rsi ## Objc selector ref: decomposedStringWithCanonicalMapping
// CHECK-x86_64: movq {{.*}}(%rip), [[MSG:%.*]] ## Objc message: -[%rdi decomposedStringWithCanonicalMapping]
// CHECK-x86_64: callq *[[MSG]]
// CHECK-x86_64: movq %rax, %rdi
// CHECK-x86_64: callq {{.*}} ## symbol stub for: _objc_retainAutoreleasedReturnValue
// CHECK-x86_64: ret
/// Test i386:
// CHECK-i386-LABEL: _swift_stdlib_NSStringHashValue:
// CHECK-i386-NOT: ret
// CHECK-i386: calll {{.*}} ## symbol stub for: _objc_msgSend
// CHECK-i386: movl %ebp, %ebp
// CHECK-i386: calll {{.*}} ## symbol stub for: _objc_retainAutoreleasedReturnValue
// CHECK-i386: ret
// CHECK-i386-LABEL: _swift_stdlib_NSStringHashValuePointer:
// CHECK-i386-NOT: ret
// CHECK-i386: calll {{.*}} ## symbol stub for: _objc_msgSend
// CHECK-i386: movl %ebp, %ebp
// CHECK-i386: calll {{.*}} ## symbol stub for: _objc_retainAutoreleasedReturnValue
// CHECK-i386: ret
/// Test armv7:
// CHECK-armv7-LABEL: _swift_stdlib_NSStringHashValue:
// CHECK-armv7-NOT: pop {{.*}}pc{{.*}}
// CHECK-armv7: blx {{.*}} @ symbol stub for: _objc_msgSend
// CHECK-armv7: mov r7, r7
// CHECK-armv7: blx {{.*}} @ symbol stub for: _objc_retainAutoreleasedReturnValue
// CHECK-armv7: pop {{.*}}pc{{.*}}
// CHECK-armv7-LABEL: _swift_stdlib_NSStringHashValuePointer:
// CHECK-armv7-NOT: pop {{.*}}pc{{.*}}
// CHECK-armv7: blx {{.*}} @ symbol stub for: _objc_msgSend
// CHECK-armv7: mov r7, r7
// CHECK-armv7: blx {{.*}} @ symbol stub for: _objc_retainAutoreleasedReturnValue
// CHECK-armv7: pop {{.*}}pc{{.*}}
/// Test armv7s:
// CHECK-armv7s-LABEL: _swift_stdlib_NSStringHashValue:
// CHECK-armv7s-NOT: pop {{.*}}pc{{.*}}
// CHECK-armv7s: blx {{.*}} @ symbol stub for: _objc_msgSend
// CHECK-armv7s: mov r7, r7
// CHECK-armv7s: blx {{.*}} @ symbol stub for: _objc_retainAutoreleasedReturnValue
// CHECK-armv7s: pop {{.*}}pc{{.*}}
// CHECK-armv7s-LABEL: _swift_stdlib_NSStringHashValuePointer:
// CHECK-armv7s-NOT: pop {{.*}}pc{{.*}}
// CHECK-armv7s: blx {{.*}} @ symbol stub for: _objc_msgSend
// CHECK-armv7s: mov r7, r7
// CHECK-armv7s: blx {{.*}} @ symbol stub for: _objc_retainAutoreleasedReturnValue
// CHECK-armv7s: pop {{.*}}pc{{.*}}
/// Test armv7k:
// CHECK-armv7k-LABEL: _swift_stdlib_NSStringHashValue:
// CHECK-armv7k-NOT: pop {{.*}}pc{{.*}}
// CHECK-armv7k: blx {{.*}} @ symbol stub for: _objc_msgSend
// CHECK-armv7k: mov r7, r7
// CHECK-armv7k: blx {{.*}} @ symbol stub for: _objc_retainAutoreleasedReturnValue
// CHECK-armv7k: pop {{.*}}pc{{.*}}
// CHECK-armv7k-LABEL: _swift_stdlib_NSStringHashValuePointer:
// CHECK-armv7k-NOT: pop {{.*}}pc{{.*}}
// CHECK-armv7k: blx {{.*}} @ symbol stub for: _objc_msgSend
// CHECK-armv7k: mov r7, r7
// CHECK-armv7k: blx {{.*}} @ symbol stub for: _objc_retainAutoreleasedReturnValue
// CHECK-armv7k: pop {{.*}}pc{{.*}}
/// Test arm64:
// CHECK-arm64-LABEL: _swift_stdlib_NSStringHashValue:
// CHECK-arm64-NOT: ret
// CHECK-arm64: bl {{.*}} ; Objc message: -[x0 decomposedStringWithCanonicalMapping]
// CHECK-arm64: mov x29, x29
// CHECK-arm64: bl {{.*}} ; symbol stub for: _objc_retainAutoreleasedReturnValue
// CHECK-arm64: ret
// CHECK-arm64-LABEL: _swift_stdlib_NSStringHashValuePointer:
// CHECK-arm64-NOT: ret
// CHECK-arm64: bl {{.*}} ; Objc message: -[x0 decomposedStringWithCanonicalMapping]
// CHECK-arm64: mov x29, x29
// CHECK-arm64: bl {{.*}} ; symbol stub for: _objc_retainAutoreleasedReturnValue
// CHECK-arm64: ret