From: nobody <> Date: Fri, 25 Oct 2002 15:43:04 +0000 (+0000) Subject: This commit was manufactured by cvs2svn to create branch 'drow-cplus- X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5f6ea76b78320c21d11477709a8c733f47e46d8a;p=thirdparty%2Fbinutils-gdb.git This commit was manufactured by cvs2svn to create branch 'drow-cplus- branch'. Cherrypick from master 2002-10-25 15:43:03 UTC Hans-Peter Nilsson ' * simple.c: Correct placement of ATTRIBUTE_UNUSED.': bfd/elf32-qnx.c bfd/simple.c gdb/config/i386/obsd.mt gdb/i386obsd-tdep.c gdb/testsuite/gdb.asm/mips.inc --- diff --git a/bfd/elf32-qnx.c b/bfd/elf32-qnx.c new file mode 100644 index 00000000000..b397c38f502 --- /dev/null +++ b/bfd/elf32-qnx.c @@ -0,0 +1,92 @@ +/* QNX specific support for 32-bit ELF + Copyright 2002 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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 2 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, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#include "bfd.h" +#include "sysdep.h" +#include "elf-bfd.h" +#include "elf32-qnx.h" + +/* Returns the end address of the segment + 1. */ +#define SEGMENT_END(segment, start) \ + (start + (segment->p_memsz > segment->p_filesz \ + ? segment->p_memsz : segment->p_filesz)) + +boolean +elf_qnx_copy_private_bfd_data_p (ibfd, isec, obfd, osec) + bfd *ibfd ATTRIBUTE_UNUSED; + asection *isec; + bfd *obfd ATTRIBUTE_UNUSED; + asection *osec ATTRIBUTE_UNUSED; +{ + return isec->next == NULL; +} + +boolean +elf_qnx_is_contained_by_filepos (section, segment) + asection *section; + Elf_Internal_Phdr *segment; +{ + return ((bfd_vma) section->filepos >= segment->p_offset + && ((bfd_vma) section->filepos + section->_raw_size + <= SEGMENT_END (segment, segment->p_offset))); +} + +void +elf_qnx_set_nonloadable_filepos (abfd, phdrs) + bfd *abfd; + Elf_Internal_Phdr *phdrs; +{ + struct elf_segment_map *m; + Elf_Internal_Phdr *p; + file_ptr off = 0; + + for (m = elf_tdata (abfd)->segment_map, p = phdrs; + m != NULL; + m = m->next, p++) + { + unsigned int i; + asection **secpp; + + for (i = 0, secpp = m->sections; i < m->count; i++, secpp++) + { + asection *sec; + + sec = *secpp; + + if (p->p_type == PT_LOAD) + off = sec->filepos; + else + { + if (i == 0) + { + if (sec->filepos) + p->p_offset = sec->filepos; + else + p->p_offset = off; + } + if (!sec->filepos) + { + off += sec->_raw_size; + p->p_filesz += sec->_raw_size; + } + } + } + } + return; +} diff --git a/bfd/simple.c b/bfd/simple.c new file mode 100644 index 00000000000..10178a40ad4 --- /dev/null +++ b/bfd/simple.c @@ -0,0 +1,197 @@ +/* simple.c -- BFD simple client routines + Copyright 2002 + Free Software Foundation, Inc. + Contributed by MontaVista Software, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#include "bfd.h" +#include "sysdep.h" +#include "libbfd.h" +#include "bfdlink.h" + +static boolean simple_dummy_warning + PARAMS ((struct bfd_link_info *, const char *, const char *, bfd *, + asection *, bfd_vma)); + +static boolean simple_dummy_undefined_symbol + PARAMS ((struct bfd_link_info *, const char *, bfd *, asection *, + bfd_vma, boolean)); + +static boolean simple_dummy_reloc_overflow + PARAMS ((struct bfd_link_info *, const char *, const char *, bfd_vma, + bfd *, asection *, bfd_vma)); + +static boolean simple_dummy_reloc_dangerous + PARAMS ((struct bfd_link_info *, const char *, bfd *, asection *, bfd_vma)); + +static boolean simple_dummy_unattached_reloc + PARAMS ((struct bfd_link_info *, const char *, bfd *, asection *, bfd_vma)); + +bfd_byte * bfd_simple_get_relocated_section_contents + PARAMS ((bfd *, asection *, bfd_byte *)); + +static boolean +simple_dummy_warning (link_info, warning, symbol, abfd, section, address) + struct bfd_link_info *link_info ATTRIBUTE_UNUSED; + const char *warning ATTRIBUTE_UNUSED; + const char *symbol ATTRIBUTE_UNUSED; + bfd *abfd ATTRIBUTE_UNUSED; + asection *section ATTRIBUTE_UNUSED; + bfd_vma address ATTRIBUTE_UNUSED; +{ + return true; +} + +static boolean +simple_dummy_undefined_symbol (link_info, name, abfd, section, address, fatal) + struct bfd_link_info *link_info ATTRIBUTE_UNUSED; + const char *name ATTRIBUTE_UNUSED; + bfd *abfd ATTRIBUTE_UNUSED; + asection *section ATTRIBUTE_UNUSED; + bfd_vma address ATTRIBUTE_UNUSED; + boolean fatal ATTRIBUTE_UNUSED; +{ + return true; +} + +static boolean +simple_dummy_reloc_overflow (link_info, name, reloc_name, addend, abfd, + section, address) + struct bfd_link_info *link_info ATTRIBUTE_UNUSED; + const char *name ATTRIBUTE_UNUSED; + const char *reloc_name ATTRIBUTE_UNUSED; + bfd_vma addend ATTRIBUTE_UNUSED; + bfd *abfd ATTRIBUTE_UNUSED; + asection *section ATTRIBUTE_UNUSED; + bfd_vma address ATTRIBUTE_UNUSED; +{ + return true; +} + +static boolean +simple_dummy_reloc_dangerous (link_info, message, abfd, section, address) + struct bfd_link_info *link_info ATTRIBUTE_UNUSED; + const char *message ATTRIBUTE_UNUSED; + bfd *abfd ATTRIBUTE_UNUSED; + asection *section ATTRIBUTE_UNUSED; + bfd_vma address ATTRIBUTE_UNUSED; +{ + return true; +} + +static boolean +simple_dummy_unattached_reloc (link_info, name, abfd, section, address) + struct bfd_link_info *link_info ATTRIBUTE_UNUSED; + const char *name ATTRIBUTE_UNUSED; + bfd *abfd ATTRIBUTE_UNUSED; + asection *section ATTRIBUTE_UNUSED; + bfd_vma address ATTRIBUTE_UNUSED; +{ + return true; +} + +/* +FUNCTION + bfd_simple_relocate_secton + +SYNOPSIS + bfd_byte *bfd_simple_get_relocated_section_contents (bfd *abfd, asection *sec, bfd_byte *outbuf); + +DESCRIPTION + Returns the relocated contents of section @var{sec}. Only symbols + from @var{abfd} and the output offsets assigned to sections in + @var{abfd} are used. The result will be stored at @var{outbuf} + or allocated with @code{bfd_malloc} if @var{outbuf} is @code{NULL}. + + Generally all sections in @var{abfd} should have their + @code{output_section} pointing back to the original section. + + Returns @code{NULL} on a fatal error; ignores errors applying + particular relocations. +*/ + +bfd_byte * +bfd_simple_get_relocated_section_contents (abfd, sec, outbuf) + bfd *abfd; + asection *sec; + bfd_byte *outbuf; +{ + struct bfd_link_info link_info; + struct bfd_link_order link_order; + struct bfd_link_callbacks callbacks; + bfd_byte *contents, *data; + int storage_needed, number_of_symbols; + asymbol **symbol_table; + + /* In order to use bfd_get_relocated_section_contents, we need + to forge some data structures that it expects. */ + + /* Fill in the bare minimum number of fields for our purposes. */ + memset (&link_info, 0, sizeof (link_info)); + link_info.input_bfds = abfd; + + link_info.hash = bfd_link_hash_table_create (abfd); + link_info.callbacks = &callbacks; + callbacks.warning = simple_dummy_warning; + callbacks.undefined_symbol = simple_dummy_undefined_symbol; + callbacks.reloc_overflow = simple_dummy_reloc_overflow; + callbacks.reloc_dangerous = simple_dummy_reloc_dangerous; + callbacks.unattached_reloc = simple_dummy_unattached_reloc; + + memset (&link_order, 0, sizeof (link_order)); + link_order.next = NULL; + link_order.type = bfd_indirect_link_order; + link_order.offset = 0; + link_order.size = bfd_section_size (abfd, sec); + link_order.u.indirect.section = sec; + + data = NULL; + if (outbuf == NULL) + { + data = bfd_malloc (bfd_section_size (abfd, sec)); + if (data == NULL) + return NULL; + outbuf = data; + } + bfd_link_add_symbols (abfd, &link_info); + + storage_needed = bfd_get_symtab_upper_bound (abfd); + symbol_table = (asymbol **) bfd_malloc (storage_needed); + number_of_symbols = bfd_canonicalize_symtab (abfd, symbol_table); + + contents = bfd_get_relocated_section_contents (abfd, + &link_info, + &link_order, + outbuf, + 0, + symbol_table); + if (contents == NULL && data != NULL) + free (data); + + /* Foul hack to prevent bfd_section_size aborts. This flag only controls + that macro (and the related size macros), selecting between _raw_size + and _cooked_size. Debug sections won't change size while we're only + relocating. There may be trouble here someday if it tries to run + relaxation unexpectedly, so make sure. */ + BFD_ASSERT (sec->_raw_size == sec->_cooked_size); + sec->reloc_done = 0; + + bfd_link_hash_table_free (abfd, link_info.hash); + + return contents; +} diff --git a/gdb/config/i386/obsd.mt b/gdb/config/i386/obsd.mt new file mode 100644 index 00000000000..72ec51311cc --- /dev/null +++ b/gdb/config/i386/obsd.mt @@ -0,0 +1,3 @@ +# Target: Intel 386 running OpenBSD +TDEPFILES= i386-tdep.o i387-tdep.o i386bsd-tdep.o i386obsd-tdep.o corelow.o +TM_FILE= tm-i386.h diff --git a/gdb/i386obsd-tdep.c b/gdb/i386obsd-tdep.c new file mode 100644 index 00000000000..7f162379a54 --- /dev/null +++ b/gdb/i386obsd-tdep.c @@ -0,0 +1,122 @@ +/* Target-dependent code for OpenBSD/i386. + Copyright 1988, 1989, 1991, 1992, 1994, 1996, 2000, 2001, 2002 + Free Software Foundation, 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include "defs.h" +#include "arch-utils.h" +#include "gdbcore.h" +#include "regcache.h" + +#include "i386-tdep.h" +#include "i387-tdep.h" + +/* Provide a prototype to silence -Wmissing-prototypes. */ +void _initialize_i386obsd_tdep (void); + +#define SIZEOF_STRUCT_REG (16 * 4) + +static void +i386obsd_supply_reg (char *regs, int regno) +{ + int i; + + for (i = 0; i <= 15; i++) + if (regno == i || regno == -1) + supply_register (i, regs + i * 4); +} + +static void +fetch_core_registers (char *core_reg_sect, unsigned core_reg_size, int which, + CORE_ADDR ignore) +{ + char *regs, *fsave; + + /* We get everything from one section. */ + if (which != 0) + return; + + if (core_reg_size < (SIZEOF_STRUCT_REG + 108)) + { + warning ("Wrong size register set in core file."); + return; + } + + regs = core_reg_sect; + fsave = core_reg_sect + SIZEOF_STRUCT_REG; + + /* Integer registers. */ + i386obsd_supply_reg (regs, -1); + + /* Floating point registers. */ + i387_supply_fsave (fsave); +} + +static struct core_fns i386obsd_core_fns = +{ + bfd_target_unknown_flavour, /* core_flavour */ + default_check_format, /* check_format */ + default_core_sniffer, /* core_sniffer */ + fetch_core_registers, /* core_read_registers */ + NULL /* next */ +}; + + +CORE_ADDR i386obsd_sigtramp_start = 0xbfbfdf20; +CORE_ADDR i386obsd_sigtramp_end = 0xbfbfdff0; + +/* From . */ +int i386obsd_sc_pc_offset = 44; +int i386obsd_sc_sp_offset = 56; + +static void +i386obsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) +{ + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + + /* Obviously OpenBSD is BSD-based. */ + i386bsd_init_abi (info, gdbarch); + + /* OpenBSD uses -freg-struct-return by default. */ + tdep->struct_return = reg_struct_return; + + /* OpenBSD uses a different memory layout. */ + tdep->sigtramp_start = i386obsd_sigtramp_start; + tdep->sigtramp_end = i386obsd_sigtramp_end; + + /* OpenBSD has a `struct sigcontext' that's different from the + origional 4.3 BSD. */ + tdep->sc_pc_offset = i386obsd_sc_pc_offset; + tdep->sc_sp_offset = i386obsd_sc_sp_offset; +} + +void +_initialize_i386obsd_tdep (void) +{ + add_core_fns (&i386obsd_core_fns); + + /* FIXME: kettenis/20021020: Since OpenBSD/i386 binaries are + indistingushable from NetBSD/i386 a.out binaries, building a GDB + that should support both these targets will probably not work as + expected. */ +#define GDB_OSABI_OPENBSD_AOUT GDB_OSABI_NETBSD_AOUT + + gdbarch_register_osabi (bfd_arch_i386, GDB_OSABI_OPENBSD_AOUT, + i386obsd_init_abi); +} diff --git a/gdb/testsuite/gdb.asm/mips.inc b/gdb/testsuite/gdb.asm/mips.inc new file mode 100644 index 00000000000..751f73f859b --- /dev/null +++ b/gdb/testsuite/gdb.asm/mips.inc @@ -0,0 +1,64 @@ + comment "subroutine declare" + .macro gdbasm_declare name + .align 2 + .ent \name + .type \name,@function +\name: + .endm + + comment "subroutine prologue" + .macro gdbasm_enter + .frame $fp, 32, $31 + .mask 0xd0000000,-4 + .set noreorder + .cpload $25 + .set reorder + subu $sp, $sp, 32 + .cprestore 16 + sw $31, 28($sp) + sw $fp, 24($sp) + sw $28, 20($sp) + move $fp, $sp + .endm + + comment "subroutine epilogue" + .macro gdbasm_leave + lw $31, 28($sp) + lw $fp, 24($sp) + .set noreorder + .set nomacro + j $31 + addu $sp, $sp, 32 + .set macro + .set reorder + .endm + + comment "subroutine end" + .macro gdbasm_end name + .end \name + .endm + + .macro gdbasm_call subr + la $25, \subr + jal $31, $25 + .endm + + .macro gdbasm_several_nops + nop + nop + nop + nop + .endm + + comment "exit (0)" + .macro gdbasm_exit0 + comment "Don't know how to exit, but this will certainly halt..." + lw $2, 0($0) + .endm + + comment "crt0 startup" + .macro gdbasm_startup + .global __start +__start: + move $fp, $sp + .endm