Branch data Line data Source code
1 : : /* Initialization of RISC-V specific backend library. 2 : : This file is part of elfutils. 3 : : 4 : : This file is free software; you can redistribute it and/or modify 5 : : it under the terms of either 6 : : 7 : : * the GNU Lesser General Public License as published by the Free 8 : : Software Foundation; either version 3 of the License, or (at 9 : : your option) any later version 10 : : 11 : : or 12 : : 13 : : * the GNU General Public License as published by the Free 14 : : Software Foundation; either version 2 of the License, or (at 15 : : your option) any later version 16 : : 17 : : or both in parallel, as here. 18 : : 19 : : elfutils is distributed in the hope that it will be useful, but 20 : : WITHOUT ANY WARRANTY; without even the implied warranty of 21 : : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 22 : : General Public License for more details. 23 : : 24 : : You should have received copies of the GNU General Public License and 25 : : the GNU Lesser General Public License along with this program. If 26 : : not, see <http://www.gnu.org/licenses/>. */ 27 : : 28 : : #ifdef HAVE_CONFIG_H 29 : : # include <config.h> 30 : : #endif 31 : : 32 : : #define BACKEND riscv_ 33 : : #define RELOC_PREFIX R_RISCV_ 34 : : #include "libebl_CPU.h" 35 : : 36 : : #include "libelfP.h" 37 : : 38 : : /* This defines the common reloc hooks based on riscv_reloc.def. */ 39 : : #include "common-reloc.c" 40 : : 41 : : extern __typeof (EBLHOOK (return_value_location)) 42 : : riscv_return_value_location_lp64d attribute_hidden; 43 : : 44 : : extern __typeof (EBLHOOK (return_value_location)) 45 : : riscv_return_value_location_lp64f attribute_hidden; 46 : : 47 : : extern __typeof (EBLHOOK (return_value_location)) 48 : : riscv_return_value_location_lp64 attribute_hidden; 49 : : 50 : : extern __typeof (EBLHOOK (core_note)) riscv64_core_note attribute_hidden; 51 : : 52 : : Ebl * 53 : 19 : riscv_init (Elf *elf, 54 : : GElf_Half machine __attribute__ ((unused)), 55 : : Ebl *eh) 56 : : { 57 : : /* We handle it. */ 58 [ + - ]: 19 : riscv_init_reloc (eh); 59 : 19 : HOOK (eh, reloc_simple_type); 60 : 19 : HOOK (eh, register_info); 61 : 19 : HOOK (eh, abi_cfi); 62 : 19 : HOOK (eh, disasm); 63 : : /* gcc/config/ #define DWARF_FRAME_REGISTERS. */ 64 : 19 : eh->frame_nregs = 66; 65 : 19 : HOOK (eh, check_special_symbol); 66 : 19 : HOOK (eh, machine_flag_check); 67 : 19 : HOOK (eh, set_initial_registers_tid); 68 : 19 : HOOK (eh, segment_type_name); 69 : 19 : HOOK (eh, section_type_name); 70 : 19 : HOOK (eh, dynamic_tag_name); 71 : 19 : HOOK (eh, dynamic_tag_check); 72 [ + - ]: 19 : if (eh->class == ELFCLASS64) 73 : 19 : eh->core_note = riscv64_core_note; 74 : : else 75 : 0 : HOOK (eh, core_note); 76 [ + - ]: 19 : if (eh->class == ELFCLASS64) 77 : : { 78 [ + + ]: 19 : if ((elf->state.elf64.ehdr->e_flags & EF_RISCV_FLOAT_ABI) 79 : : == EF_RISCV_FLOAT_ABI_DOUBLE) 80 : 5 : eh->return_value_location = riscv_return_value_location_lp64d; 81 [ - + ]: 14 : else if ((elf->state.elf64.ehdr->e_flags & EF_RISCV_FLOAT_ABI) 82 : : == EF_RISCV_FLOAT_ABI_SINGLE) 83 : 0 : eh->return_value_location = riscv_return_value_location_lp64f; 84 : : else 85 : 14 : eh->return_value_location = riscv_return_value_location_lp64; 86 : : } 87 : : 88 : 19 : return eh; 89 : : }