// -*- C++ -*-
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

// REQUIRES: target={{aarch64-.+}}
// UNSUPPORTED: target={{.*-windows.*}}

// TODO: investigate this failure.
// XFAIL: target={{.*-apple-.*}} && stdlib=system

// Basic test for float registers number are accepted.

#include "support/func_bounds.h"
#include <stdlib.h>
#include <string.h>
#include <unwind.h>

FUNC_BOUNDS_DECL(main_func);

_Unwind_Reason_Code frame_handler(struct _Unwind_Context *ctx, void *arg) {
  (void)arg;

  // Unwind until the main is reached, above frames depend on the platform and
  // architecture.
  uintptr_t ip = _Unwind_GetIP(ctx);
  if (ip >= (uintptr_t)FUNC_START(main_func) &&
      ip < (uintptr_t)FUNC_END(main_func)) {
    _Exit(0);
  }

  return _URC_NO_REASON;
}

__attribute__((noinline)) void foo() {
  // Provide some CFI directives that instructs the unwinder where given
  // float register is.
#if defined(__aarch64__)
  // DWARF register number for V0-V31 registers are 64-95.
  // Previous value of V0 is saved at offset 0 from CFA.
  asm volatile(".cfi_offset 64, 0");
  // From now on the previous value of register can't be restored anymore.
  asm volatile(".cfi_undefined 65");
  asm volatile(".cfi_undefined 95");
  // Previous value of V2 is in V30.
  asm volatile(".cfi_register  66, 94");
#endif
  _Unwind_Backtrace(frame_handler, NULL);
}

FUNC_ATTR(main_func) int main(int, char **) {
  foo();
  return -2;
}
