RISC-V: Handle vlenb correctly in unwinding
gcc/ChangeLog: * config/riscv/riscv.h (RISCV_DWARF_VLENB): New. (DWARF_FRAME_REGISTERS): New. (DWARF_REG_TO_UNWIND_COLUMN): New. libgcc/ChangeLog: * config.host (riscv*-*-*): Add config/riscv/value-unwind.h. * config/riscv/value-unwind.h: New.
This commit is contained in:
parent
22ba8570e6
commit
89367e7946
3 changed files with 49 additions and 0 deletions
|
@ -1088,4 +1088,11 @@ extern void riscv_remove_unneeded_save_restore_calls (void);
|
|||
|
||||
#define REGMODE_NATURAL_SIZE(MODE) riscv_regmode_natural_size (MODE)
|
||||
|
||||
#define RISCV_DWARF_VLENB (4096 + 0xc22)
|
||||
|
||||
#define DWARF_FRAME_REGISTERS (FIRST_PSEUDO_REGISTER + 1 /* VLENB */)
|
||||
|
||||
#define DWARF_REG_TO_UNWIND_COLUMN(REGNO) \
|
||||
((REGNO == RISCV_DWARF_VLENB) ? (FIRST_PSEUDO_REGISTER + 1) : REGNO)
|
||||
|
||||
#endif /* ! GCC_RISCV_H */
|
||||
|
|
|
@ -1559,6 +1559,9 @@ aarch64*-*-*)
|
|||
# ILP32 needs an extra header for unwinding
|
||||
tm_file="${tm_file} aarch64/value-unwind.h"
|
||||
;;
|
||||
riscv*-*-*)
|
||||
tm_file="${tm_file} riscv/value-unwind.h"
|
||||
;;
|
||||
esac
|
||||
|
||||
# Setup to build a shared libgcc for VxWorks when that was requested,
|
||||
|
|
39
libgcc/config/riscv/value-unwind.h
Normal file
39
libgcc/config/riscv/value-unwind.h
Normal file
|
@ -0,0 +1,39 @@
|
|||
/* Store register values as _Unwind_Word type in DWARF2 EH unwind context.
|
||||
Copyright (C) 2023 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC.
|
||||
|
||||
GCC is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published
|
||||
by the Free Software Foundation; either version 3, or (at your
|
||||
option) any later version.
|
||||
|
||||
GCC is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
License for more details.
|
||||
|
||||
Under Section 7 of GPL version 3, you are granted additional
|
||||
permissions described in the GCC Runtime Library Exception, version
|
||||
3.1, as published by the Free Software Foundation.
|
||||
|
||||
You should have received a copy of the GNU General Public License and
|
||||
a copy of the GCC Runtime Library Exception along with this program;
|
||||
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Return the value of the VLENB register. This should only be
|
||||
called if we know this is an vector extension enabled RISC-V host. */
|
||||
static inline long
|
||||
riscv_vlenb (void)
|
||||
{
|
||||
register long vlenb asm ("a0");
|
||||
/* 0xc2202573 == csrr a0, 0xc22 */
|
||||
asm (".insn 0xc2202573" : "=r"(vlenb));
|
||||
return vlenb;
|
||||
}
|
||||
|
||||
/* Lazily provide a value for VLENB, so that we don't try to execute RVV
|
||||
instructions unless we know they're needed. */
|
||||
#define DWARF_LAZY_REGISTER_VALUE(REGNO, VALUE) \
|
||||
((REGNO) == RISCV_DWARF_VLENB && ((*VALUE) = riscv_vlenb (), 1))
|
Loading…
Add table
Reference in a new issue