X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fi386-dicos-tdep.c;h=ba4803e2045219390211481c850dbfcf50abbafd;hb=3061113bf336048d538241282c39baf684de31bf;hp=5fdaaba0b28166d1acabe1e25a491a4670de41c1;hpb=42f0bc8eaf33eb991a9cbe9a42a0738d948fc65e;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/i386-dicos-tdep.c b/gdb/i386-dicos-tdep.c index 5fdaaba0b2..ba4803e204 100644 --- a/gdb/i386-dicos-tdep.c +++ b/gdb/i386-dicos-tdep.c @@ -1,6 +1,6 @@ /* Target-dependent code for DICOS running on i386's, for GDB. - Copyright (C) 2008 Free Software Foundation, Inc. + Copyright (C) 2008-2020 Free Software Foundation, Inc. This file is part of GDB. @@ -19,109 +19,28 @@ #include "defs.h" #include "osabi.h" -#include "gdb_string.h" -#include "solib.h" -#include "solib-target.h" -#include "inferior.h" - -static CORE_ADDR -i386_dicos_frame_align (struct gdbarch *gdbarch, CORE_ADDR sp) -{ - /* Having a call dummy on the stack requires a gdbarch_frame_align - method to align the breakpoint instruction in the stack. - Strictly speaking, we could just return SP pristine on x86. But, - as long as we're providing a frame align method, might as well - align for efficiency. */ - return sp & -(CORE_ADDR)16; -} +#include "dicos-tdep.h" +#include "gdbarch.h" static void i386_dicos_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); - - set_solib_ops (gdbarch, &solib_target_so_ops); - - /* There's no (standard definition of) entry point or a guaranteed - text location we could find with a symbol where to place the call - dummy, so we put it on the stack. */ - set_gdbarch_call_dummy_location (gdbarch, ON_STACK); - set_gdbarch_frame_align (gdbarch, i386_dicos_frame_align); -} - -/* Look in the elf symbol table of ABFD for a symbol named WANTED. - Return true if found. */ -static int -i386_dicos_bfd_has_symbol_p (bfd *abfd, const char *wanted) -{ - long storage_needed; - int ret = 0; - asymbol **symbol_table = NULL; - - storage_needed = bfd_get_symtab_upper_bound (abfd); - if (storage_needed < 0) - { - warning (_("Can't read elf symbols from %s: %s"), bfd_get_filename (abfd), - bfd_errmsg (bfd_get_error ())); - return 0; - } - - if (storage_needed > 0) - { - long i, symcount; - - symbol_table = xmalloc (storage_needed); - symcount = bfd_canonicalize_symtab (abfd, symbol_table); - - if (symcount < 0) - warning (_("Can't read elf symbols from %s: %s"), - bfd_get_filename (abfd), - bfd_errmsg (bfd_get_error ())); - else - { - for (i = 0; i < symcount; i++) - { - asymbol *sym = symbol_table[i]; - if (sym->name != NULL - && wanted[0] == sym->name[0] - && strcmp (wanted + 1, sym->name + 1) == 0) - { - ret = 1; - break; - } - } - } - } - - xfree (symbol_table); - return ret; + dicos_init_abi (gdbarch); } static enum gdb_osabi i386_dicos_osabi_sniffer (bfd *abfd) { - char *target_name = bfd_get_target (abfd); + const char *target_name = bfd_get_target (abfd); - /* DICOS debug info files don't have a .note.ABI-tag marker or - something similar. We do know there's always a "header" section - of 36 bytes, and there's always a "Dicos_loadModuleInfo" symbol - defined. Look for the section first, as that should be - cheaper. */ - if (strcmp (target_name, "elf32-i386") == 0) - { - asection *section = bfd_get_section_by_name (abfd, "header"); - if (section - && bfd_section_size (abfd, section) == 36 - && i386_dicos_bfd_has_symbol_p (abfd, "Dicos_loadModuleInfo")) - return GDB_OSABI_DICOS; - } + /* On x86-DICOS, the Load Module's "header" section is 36 bytes. */ + if (strcmp (target_name, "elf32-i386") == 0 + && dicos_load_module_p (abfd, 36)) + return GDB_OSABI_DICOS; return GDB_OSABI_UNKNOWN; } -/* Provide a prototype to silence -Wmissing-prototypes. */ -void _initialize_i386_dicos_tdep (void); - void _initialize_i386_dicos_tdep (void) {