blob: c1fcb2f9dd5fbcbf2f44c307dcb69cd47f1e40d0 [file]
// RUN: %clang_cc1 -triple arm64-apple-ios -fptrauth-calls -fptrauth-intrinsics \
// RUN: -emit-llvm -std=c++11 -O1 -disable-llvm-passes \
// RUN: -debug-info-kind=limited %s -o - | FileCheck %s
// RUN: %clang_cc1 -triple aarch64-linux-gnu -fptrauth-calls -fptrauth-intrinsics \
// RUN: -emit-llvm -std=c++11 -O1 -disable-llvm-passes \
// RUN: -debug-info-kind=limited %s -o - | FileCheck %s
// Check that compiler-generated *_vfpthunk_ function has a !dbg location
// attached to the call instruction.
// CHECK: define {{.*}}@_ZN1A2f0Ev_vfpthunk_({{.*}})
// CHECK-SAME: !dbg ![[SCOPE_INDEX:[0-9]+]]
// CHECK-NOT: define
// CHECK: %[[DISCR:[0-9]+]] = call i64 @llvm.ptrauth.blend(i64 %{{[0-9]+}}, i64 9385)
// CHECK-NOT: define
// CHECK: musttail call void %{{[0-9]+}}(ptr
// CHECK-SAME: [ "ptrauth"(i32 0, i64 %[[DISCR]]) ]
// CHECK-SAME: !dbg ![[LOCATION_INDEX:[0-9]+]]
// CHECK: ![[SCOPE_INDEX]] = distinct !DISubprogram(
// CHECK-SAME: linkageName: "_ZN1A2f0Ev_vfpthunk_"
// CHECK-SAME: flags: DIFlagArtificial | DIFlagThunk
// CHECK: ![[LOCATION_INDEX]] = !DILocation(line: 0, scope: ![[SCOPE_INDEX]])
volatile long T;
struct A {
virtual void f0() {
T = 0;
}
};
typedef void (A::*MFP)();
void caller() {
A a;
MFP x = &A::f0;
(a.*x)();
}