From 5bf6117a6eaf9007ce80adbb8b66a95ca98047a4 Mon Sep 17 00:00:00 2001 From: Hongxu Jia Date: Wed, 21 Aug 2019 17:00:30 +0800 Subject: [PATCH] mips_cfi Upstream-Status: Pending [from debian] Rebase to 0.177 Signed-off-by: Hongxu Jia --- backends/Makefile.am | 2 +- backends/mips_cfi.c | 80 ++++++++++++++++++++++++++++++++++++++++++++ backends/mips_init.c | 1 + 3 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 backends/mips_cfi.c diff --git a/backends/Makefile.am b/backends/Makefile.am index 07d45d7..dec3080 100644 --- a/backends/Makefile.am +++ b/backends/Makefile.am @@ -100,7 +100,7 @@ riscv_SRCS = riscv_init.c riscv_symbol.c riscv_cfi.c riscv_regs.c \ csky_SRCS = csky_attrs.c csky_init.c csky_symbol.c csky_cfi.c \ csky_regs.c csky_initreg.c csky_corenote.c -mips_SRCS = mips_init.c mips_symbol.c mips_regs.c mips_retval.c +mips_SRCS = mips_init.c mips_symbol.c mips_regs.c mips_retval.c mips_cfi.c libebl_backends_a_SOURCES = $(i386_SRCS) $(sh_SRCS) $(x86_64_SRCS) \ $(ia64_SRCS) $(alpha_SRCS) $(arm_SRCS) \ diff --git a/backends/mips_cfi.c b/backends/mips_cfi.c new file mode 100644 index 0000000..9ffdab5 --- /dev/null +++ b/backends/mips_cfi.c @@ -0,0 +1,80 @@ +/* MIPS ABI-specified defaults for DWARF CFI. + Copyright (C) 2018 Kurt Roeckx, Inc. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify + it under the terms of either + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at + your option) any later version + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at + your option) any later version + + or both in parallel, as here. + + elfutils 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. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#define BACKEND mips_ +#include "libebl_CPU.h" + +int +mips_abi_cfi (Ebl *ebl __attribute__ ((unused)), Dwarf_CIE *abi_info) +{ + static const uint8_t abi_cfi[] = + { + /* Call-saved regs. */ + DW_CFA_same_value, ULEB128_7 (16), /* $16 */ + DW_CFA_same_value, ULEB128_7 (17), /* $17 */ + DW_CFA_same_value, ULEB128_7 (18), /* $18 */ + DW_CFA_same_value, ULEB128_7 (19), /* $19 */ + DW_CFA_same_value, ULEB128_7 (20), /* $20 */ + DW_CFA_same_value, ULEB128_7 (21), /* $21 */ + DW_CFA_same_value, ULEB128_7 (22), /* $22 */ + DW_CFA_same_value, ULEB128_7 (23), /* $23 */ + DW_CFA_same_value, ULEB128_7 (28), /* $28 */ + DW_CFA_same_value, ULEB128_7 (29), /* $29 */ + DW_CFA_same_value, ULEB128_7 (30), /* $30 */ + + DW_CFA_same_value, ULEB128_7 (52), /* $f20 */ + DW_CFA_same_value, ULEB128_7 (53), /* $f21 */ + DW_CFA_same_value, ULEB128_7 (54), /* $f22 */ + DW_CFA_same_value, ULEB128_7 (55), /* $f23 */ + DW_CFA_same_value, ULEB128_7 (56), /* $f24 */ + DW_CFA_same_value, ULEB128_7 (57), /* $f25 */ + DW_CFA_same_value, ULEB128_7 (58), /* $f26 */ + DW_CFA_same_value, ULEB128_7 (59), /* $f27 */ + DW_CFA_same_value, ULEB128_7 (60), /* $f28 */ + DW_CFA_same_value, ULEB128_7 (61), /* $f29 */ + DW_CFA_same_value, ULEB128_7 (62), /* $f30 */ + DW_CFA_same_value, ULEB128_7 (63), /* $f31 */ + + /* The CFA is the SP. */ + DW_CFA_def_cfa, ULEB128_7 (29), ULEB128_7 (0), + }; + + abi_info->initial_instructions = abi_cfi; + abi_info->initial_instructions_end = &abi_cfi[sizeof abi_cfi]; + abi_info->data_alignment_factor = 4; + + abi_info->return_address_register = 31; /* $31 */ + + return 0; +} diff --git a/backends/mips_init.c b/backends/mips_init.c index 8482e7f..bce5abe 100644 --- a/backends/mips_init.c +++ b/backends/mips_init.c @@ -50,6 +50,7 @@ mips_init (Elf *elf __attribute__ ((unused)), HOOK (eh, reloc_simple_type); HOOK (eh, return_value_location); HOOK (eh, register_info); + HOOK (eh, abi_cfi); return MODVERSION; }