// 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