2004-06-26 18:06:35 +08:00
|
|
|
|
/* Target-dependent code for HP PA-RISC BSD's.
|
|
|
|
|
|
2009-01-03 13:58:08 +08:00
|
|
|
|
Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009
|
|
|
|
|
Free Software Foundation, Inc.
|
2004-06-26 18:06:35 +08:00
|
|
|
|
|
|
|
|
|
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
|
2007-08-24 02:08:50 +08:00
|
|
|
|
the Free Software Foundation; either version 3 of the License, or
|
2004-06-26 18:06:35 +08:00
|
|
|
|
(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
|
2007-08-24 02:08:50 +08:00
|
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
2004-06-26 18:06:35 +08:00
|
|
|
|
|
|
|
|
|
#include "defs.h"
|
2005-06-21 13:32:00 +08:00
|
|
|
|
#include "objfiles.h"
|
|
|
|
|
#include "target.h"
|
|
|
|
|
#include "value.h"
|
2004-06-26 18:06:35 +08:00
|
|
|
|
|
2005-06-21 13:32:00 +08:00
|
|
|
|
#include "elf/common.h"
|
|
|
|
|
|
2004-06-26 18:06:35 +08:00
|
|
|
|
#include "hppa-tdep.h"
|
2009-02-22 09:02:20 +08:00
|
|
|
|
#include "hppabsd-tdep.h"
|
2004-06-26 18:06:35 +08:00
|
|
|
|
#include "solib-svr4.h"
|
|
|
|
|
|
2009-02-22 09:02:20 +08:00
|
|
|
|
static CORE_ADDR
|
2008-02-19 00:11:21 +08:00
|
|
|
|
hppabsd_find_global_pointer (struct gdbarch *gdbarch, struct value *function)
|
2005-06-21 13:32:00 +08:00
|
|
|
|
{
|
|
|
|
|
CORE_ADDR faddr = value_as_address (function);
|
|
|
|
|
struct obj_section *faddr_sec;
|
|
|
|
|
gdb_byte buf[4];
|
|
|
|
|
|
|
|
|
|
/* Is this a plabel? If so, dereference it to get the Global Pointer
|
|
|
|
|
value. */
|
|
|
|
|
if (faddr & 2)
|
|
|
|
|
{
|
|
|
|
|
if (target_read_memory ((faddr & ~3) + 4, buf, sizeof buf) == 0)
|
|
|
|
|
return extract_unsigned_integer (buf, sizeof buf);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* If the address is in the .plt section, then the real function
|
|
|
|
|
hasn't yet been fixed up by the linker so we cannot determine the
|
|
|
|
|
Global Pointer for that function. */
|
|
|
|
|
if (in_plt_section (faddr, NULL))
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
faddr_sec = find_pc_section (faddr);
|
|
|
|
|
if (faddr_sec != NULL)
|
|
|
|
|
{
|
|
|
|
|
struct obj_section *sec;
|
|
|
|
|
|
|
|
|
|
ALL_OBJFILE_OSECTIONS (faddr_sec->objfile, sec)
|
|
|
|
|
{
|
|
|
|
|
if (strcmp (sec->the_bfd_section->name, ".dynamic") == 0)
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (sec < faddr_sec->objfile->sections_end)
|
|
|
|
|
{
|
2008-08-21 21:19:18 +08:00
|
|
|
|
CORE_ADDR addr = obj_section_addr (sec);
|
|
|
|
|
CORE_ADDR endaddr = obj_section_endaddr (sec);
|
2005-06-21 13:32:00 +08:00
|
|
|
|
|
2008-08-21 21:19:18 +08:00
|
|
|
|
while (addr < endaddr)
|
2005-06-21 13:32:00 +08:00
|
|
|
|
{
|
|
|
|
|
gdb_byte buf[4];
|
|
|
|
|
LONGEST tag;
|
|
|
|
|
|
|
|
|
|
if (target_read_memory (addr, buf, sizeof buf) != 0)
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
tag = extract_signed_integer (buf, sizeof buf);
|
|
|
|
|
if (tag == DT_PLTGOT)
|
|
|
|
|
{
|
|
|
|
|
CORE_ADDR pltgot;
|
|
|
|
|
|
|
|
|
|
if (target_read_memory (addr + 4, buf, sizeof buf) != 0)
|
|
|
|
|
break;
|
|
|
|
|
|
2008-01-19 23:03:50 +08:00
|
|
|
|
/* The NetBSD/OpenBSD ld.so doesn't relocate DT_PLTGOT, so
|
2005-06-21 13:32:00 +08:00
|
|
|
|
we have to do it ourselves. */
|
|
|
|
|
pltgot = extract_unsigned_integer (buf, sizeof buf);
|
|
|
|
|
pltgot += ANOFFSET (sec->objfile->section_offsets,
|
|
|
|
|
SECT_OFF_TEXT (sec->objfile));
|
2008-01-19 23:03:50 +08:00
|
|
|
|
|
2005-06-21 13:32:00 +08:00
|
|
|
|
return pltgot;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (tag == DT_NULL)
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
addr += 8;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2008-01-19 23:03:50 +08:00
|
|
|
|
void
|
2004-06-26 18:06:35 +08:00
|
|
|
|
hppabsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
|
|
|
|
{
|
|
|
|
|
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
|
|
|
|
|
2006-01-14 07:09:08 +08:00
|
|
|
|
/* OpenBSD and NetBSD have a 64-bit 'long double'. */
|
|
|
|
|
set_gdbarch_long_double_bit (gdbarch, 64);
|
* doublest.c (floatformat_from_length): Use the right element from
gdbarch floatformats.
(floatformat_from_type, extract_typed_floating)
(store_typed_floating): Likewise.
* doublest.h: Remove declarations for undefined floatformat arrays.
* gdbarch.sh (float_format, double_format, long_double_format): Change
to pairs.
(pformat): Update for pairs.
* gdbarch.c, gdbarch.h: Regenerated.
* gdbtypes.c (floatformats_ieee_single, floatformats_ieee_double)
(floatformats_ieee_double_littlebyte_bigword)
(floatformats_i387_ext, floatformats_m68881_ext, floatformats_arm_ext)
(floatformats_ia64_spill, floatformats_ia64_quad, floatformats_vax_f)
(floatformats_vax_d): New variables.
(builtin_type_ieee_single, builtin_type_ieee_double)
(builtin_type_arm_ext, builtin_type_ia64_spill)
(builtin_type_ia64_quad): Replace arrays with individual types.
(builtin_type_ieee_single_big, builtin_type_ieee_single_little)
(builtin_type_ieee_double_big, builtin_type_ieee_double_little)
(builtin_type_ieee_double_littlebyte_bigword, builtin_type_i960_ext)
(builtin_type_m88110_ext, builtin_type_m88110_harris_ext)
(builtin_type_arm_ext_big, builtin_type_arm_ext_littlebyte_bigword)
(builtin_type_ia64_spill_big, builtin_type_ia64_spill_little)
(builtin_type_ia64_quad_big, builtin_type_ia64_quad_little): Delete
unused and endian-specific types.
(recursive_dump_type): Update for floatformat pairs.
(build_flt): Move higher. Handle bit == -1. Take a floatformat pair.
(build_gdbtypes): Use build_flt.
(_initialize_gdbtypes): Update set of initialized types.
* gdbtypes.h: Update declarations to match gdbtypes.c.
(struct main_type): Store a pointer to two floatformats.
* arch-utils.c (default_float_format, default_double_format): Delete.
* arch-utils.h (default_float_format, default_double_format): Delete.
* arm-tdep.c, avr-tdep.c, hppa-tdep.c, hppabsd-tdep.c, i386-tdep.c,
ia64-tdep.c, iq2000-tdep.c, m68k-tdep.c, m88k-tdep.c,
mips-linux-tdep.c, mips-tdep.c, mt-tdep.c, ppcobsd-tdep.c,
sparc-linux-tdep.c, sparc-tdep.c, sparcnbsd-tdep.c, spu-tdep.c,
vax-tdep.c, alpha-tdep.c, ppc-sysv-tdep.c: Update.
2007-01-30 01:31:06 +08:00
|
|
|
|
set_gdbarch_long_double_format (gdbarch, floatformats_ieee_double);
|
2006-01-14 07:09:08 +08:00
|
|
|
|
|
2004-06-26 18:06:35 +08:00
|
|
|
|
/* OpenBSD and NetBSD use ELF. */
|
|
|
|
|
tdep->is_elf = 1;
|
2006-01-21 07:37:07 +08:00
|
|
|
|
tdep->find_global_pointer = hppabsd_find_global_pointer;
|
|
|
|
|
tdep->in_solib_call_trampoline = hppa_in_solib_call_trampoline;
|
|
|
|
|
set_gdbarch_skip_trampoline_code (gdbarch, hppa_skip_trampoline_code);
|
2004-06-26 18:06:35 +08:00
|
|
|
|
|
2006-01-14 07:09:08 +08:00
|
|
|
|
/* OpenBSD and NetBSD use SVR4-style shared libraries. */
|
2004-06-26 18:06:35 +08:00
|
|
|
|
set_solib_svr4_fetch_link_map_offsets
|
|
|
|
|
(gdbarch, svr4_ilp32_fetch_link_map_offsets);
|
|
|
|
|
}
|