/* Target-dependent code for Newlib ARC. Copyright (C) 2016-2021 Free Software Foundation, Inc. Contributed by Synopsys Inc. This file is part of GDB. This program 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 of the License, or (at your option) any later version. This program 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 a copy of the GNU General Public License along with this program. If not, see . */ #include "defs.h" #include "gdbarch.h" #include "arc-tdep.h" #include "osabi.h" /* Implement the 'init_osabi' method of struct gdb_osabi_handler. */ static void arc_newlib_init_osabi (struct gdbarch_info info, struct gdbarch *gdbarch) { if (arc_debug) debug_printf ("arc-newlib: Initialization.\n"); struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); /* Offset of original PC in longjmp jump buffer (in registers). Value of PC offset can be found in newlib/libc/machine/arc/setjmp.S. */ tdep->jb_pc = 18; } /* Recognize ARC Newlib object files. */ static enum gdb_osabi arc_newlib_osabi_sniffer (bfd *abfd) { if (arc_debug) debug_printf ("arc-newlib: OS/ABI sniffer.\n"); /* crt0.S in libgloss for ARC defines .ivt section for interrupt handlers. If this section is not present then this is likely not a newlib - could be a Linux application or some non-newlib baremetal application. */ if (bfd_get_section_by_name (abfd, ".ivt") != NULL) return GDB_OSABI_NEWLIB; else return GDB_OSABI_UNKNOWN; } void _initialize_arc_newlib_tdep (); void _initialize_arc_newlib_tdep () { gdbarch_register_osabi_sniffer (bfd_arch_arc, bfd_target_elf_flavour, arc_newlib_osabi_sniffer); gdbarch_register_osabi (bfd_arch_arc, 0, GDB_OSABI_NEWLIB, arc_newlib_init_osabi); }