2 //===----------------------------------------------------------------------===//
4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5 // See https://llvm.org/LICENSE.txt for license information.
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
8 //===----------------------------------------------------------------------===//
10 // REQUIRES: linux && target={{aarch64-.+}}
12 // Basic test for float registers number are accepted.
19 _Unwind_Reason_Code
frame_handler(struct _Unwind_Context
*ctx
, void *arg
) {
21 Dl_info info
= {0, 0, 0, 0};
23 // Unwind util the main is reached, above frames depend on the platform and
25 if (dladdr(reinterpret_cast<void *>(_Unwind_GetIP(ctx
)), &info
) &&
26 info
.dli_sname
&& !strcmp("main", info
.dli_sname
))
29 return _URC_NO_REASON
;
32 __attribute__((noinline
)) void foo() {
33 // Provide some CFI directives that instructs the unwinder where given
35 #if defined(__aarch64__)
36 // DWARF register number for V0-V31 registers are 64-95.
37 // Previous value of V0 is saved at offset 0 from CFA.
38 asm volatile(".cfi_offset 64, 0");
39 // From now on the previous value of register can't be restored anymore.
40 asm volatile(".cfi_undefined 65");
41 asm volatile(".cfi_undefined 95");
42 // Previous value of V2 is in V30.
43 asm volatile(".cfi_register 66, 94");
45 _Unwind_Backtrace(frame_handler
, NULL
);