GDB (xrefs)
/tmp/gdb-7.10/gdb/hppabsd-tdep.c
Go to the documentation of this file.
1 /* Target-dependent code for HP PA-RISC BSD's.
2 
3  Copyright (C) 2004-2015 Free Software Foundation, Inc.
4 
5  This file is part of GDB.
6 
7  This program is free software; you can redistribute it and/or modify
8  it under the terms of the GNU General Public License as published by
9  the Free Software Foundation; either version 3 of the License, or
10  (at your option) any later version.
11 
12  This program is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  GNU General Public License for more details.
16 
17  You should have received a copy of the GNU General Public License
18  along with this program. If not, see <http://www.gnu.org/licenses/>. */
19 
20 #include "defs.h"
21 #include "objfiles.h"
22 #include "target.h"
23 #include "value.h"
24 
25 #include "elf/common.h"
26 
27 #include "hppa-tdep.h"
28 #include "hppabsd-tdep.h"
29 #include "dwarf2-frame.h"
30 #include "solib-svr4.h"
31 
32 static CORE_ADDR
33 hppabsd_find_global_pointer (struct gdbarch *gdbarch, struct value *function)
34 {
35  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
36  CORE_ADDR faddr = value_as_address (function);
37  struct obj_section *faddr_sec;
38  gdb_byte buf[4];
39 
40  /* Is this a plabel? If so, dereference it to get the Global Pointer
41  value. */
42  if (faddr & 2)
43  {
44  if (target_read_memory ((faddr & ~3) + 4, buf, sizeof buf) == 0)
45  return extract_unsigned_integer (buf, sizeof buf, byte_order);
46  }
47 
48  /* If the address is in the .plt section, then the real function
49  hasn't yet been fixed up by the linker so we cannot determine the
50  Global Pointer for that function. */
51  if (in_plt_section (faddr))
52  return 0;
53 
54  faddr_sec = find_pc_section (faddr);
55  if (faddr_sec != NULL)
56  {
57  struct obj_section *sec;
58 
59  ALL_OBJFILE_OSECTIONS (faddr_sec->objfile, sec)
60  {
61  if (strcmp (sec->the_bfd_section->name, ".dynamic") == 0)
62  break;
63  }
64 
65  if (sec < faddr_sec->objfile->sections_end)
66  {
67  CORE_ADDR addr = obj_section_addr (sec);
68  CORE_ADDR endaddr = obj_section_endaddr (sec);
69 
70  while (addr < endaddr)
71  {
72  gdb_byte buf[4];
73  LONGEST tag;
74 
75  if (target_read_memory (addr, buf, sizeof buf) != 0)
76  break;
77 
78  tag = extract_signed_integer (buf, sizeof buf, byte_order);
79  if (tag == DT_PLTGOT)
80  {
81  CORE_ADDR pltgot;
82 
83  if (target_read_memory (addr + 4, buf, sizeof buf) != 0)
84  break;
85 
86  /* The NetBSD/OpenBSD ld.so doesn't relocate DT_PLTGOT, so
87  we have to do it ourselves. */
88  pltgot = extract_unsigned_integer (buf, sizeof buf,
89  byte_order);
90  pltgot += ANOFFSET (sec->objfile->section_offsets,
91  SECT_OFF_TEXT (sec->objfile));
92 
93  return pltgot;
94  }
95 
96  if (tag == DT_NULL)
97  break;
98 
99  addr += 8;
100  }
101  }
102  }
103 
104  return 0;
105 }
106 
107 
108 static void
110  struct dwarf2_frame_state_reg *reg,
111  struct frame_info *this_frame)
112 {
113  if (regnum == HPPA_PCOQ_HEAD_REGNUM)
114  reg->how = DWARF2_FRAME_REG_RA;
115  else if (regnum == HPPA_SP_REGNUM)
116  reg->how = DWARF2_FRAME_REG_CFA;
117 }
118 
119 void
121 {
122  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
123 
124  /* OpenBSD and NetBSD have a 64-bit 'long double'. */
125  set_gdbarch_long_double_bit (gdbarch, 64);
127 
128  /* OpenBSD and NetBSD use ELF. */
129  tdep->is_elf = 1;
133 
134  /* OpenBSD and NetBSD use SVR4-style shared libraries. */
137 
138  /* Hook in the DWARF CFI frame unwinder. */
140  dwarf2_append_unwinders (gdbarch);
141 }
CORE_ADDR(* find_global_pointer)(struct gdbarch *, struct value *)
Definition: hppa-tdep.h:97
ULONGEST extract_unsigned_integer(const gdb_byte *, int, enum bfd_endian)
Definition: findvar.c:84
#define SECT_OFF_TEXT(objfile)
Definition: objfiles.h:683
bfd_vma CORE_ADDR
Definition: common-types.h:41
const struct floatformat * floatformats_ieee_double[BFD_ENDIAN_UNKNOWN]
Definition: gdbtypes.c:74
struct bfd_section * the_bfd_section
Definition: objfiles.h:121
CORE_ADDR hppa_skip_trampoline_code(struct frame_info *frame, CORE_ADDR pc)
Definition: hppa-tdep.c:2973
void set_gdbarch_skip_trampoline_code(struct gdbarch *gdbarch, gdbarch_skip_trampoline_code_ftype skip_trampoline_code)
Definition: gdbarch.c:3084
int(* in_solib_call_trampoline)(struct gdbarch *gdbarch, CORE_ADDR pc)
Definition: hppa-tdep.h:102
void hppabsd_init_abi(struct gdbarch_info info, struct gdbarch *gdbarch)
Definition: hppabsd-tdep.c:120
#define obj_section_endaddr(s)
Definition: objfiles.h:141
struct link_map_offsets * svr4_ilp32_fetch_link_map_offsets(void)
Definition: solib-svr4.c:3149
#define ALL_OBJFILE_OSECTIONS(objfile, osect)
Definition: objfiles.h:627
struct gdbarch_tdep * gdbarch_tdep(struct gdbarch *gdbarch)
Definition: gdbarch.c:1402
int hppa_in_solib_call_trampoline(struct gdbarch *gdbarch, CORE_ADDR pc)
Definition: hppa-tdep.c:2945
#define obj_section_addr(s)
Definition: objfiles.h:135
void dwarf2_frame_set_init_reg(struct gdbarch *gdbarch, void(*init_reg)(struct gdbarch *, int, struct dwarf2_frame_state_reg *, struct frame_info *))
Definition: dwarf2-frame.c:780
enum bfd_endian gdbarch_byte_order(struct gdbarch *gdbarch)
Definition: gdbarch.c:1420
#define ANOFFSET(secoff, whichone)
Definition: symtab.h:910
void set_solib_svr4_fetch_link_map_offsets(struct gdbarch *gdbarch, struct link_map_offsets *(*flmo)(void))
Definition: solib-svr4.c:3108
int regnum
Definition: aarch64-tdep.c:69
struct obj_section * find_pc_section(CORE_ADDR pc)
Definition: objfiles.c:1337
Definition: regdef.h:22
Definition: value.c:172
static void hppabsd_dwarf2_frame_init_reg(struct gdbarch *gdbarch, int regnum, struct dwarf2_frame_state_reg *reg, struct frame_info *this_frame)
Definition: hppabsd-tdep.c:109
bfd_byte gdb_byte
Definition: common-types.h:38
int target_read_memory(CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
Definition: target.c:1393
struct obj_section * sections_end
Definition: objfiles.h:386
static int in_plt_section(CORE_ADDR pc)
Definition: objfiles.h:539
struct objfile * objfile
Definition: objfiles.h:124
void dwarf2_append_unwinders(struct gdbarch *gdbarch)
static CORE_ADDR hppabsd_find_global_pointer(struct gdbarch *gdbarch, struct value *function)
Definition: hppabsd-tdep.c:33
void set_gdbarch_long_double_bit(struct gdbarch *gdbarch, int long_double_bit)
Definition: gdbarch.c:1667
CORE_ADDR value_as_address(struct value *val)
Definition: value.c:2679
void set_gdbarch_long_double_format(struct gdbarch *gdbarch, const struct floatformat **long_double_format)
Definition: gdbarch.c:1683
struct section_offsets * section_offsets
Definition: objfiles.h:362
LONGEST extract_signed_integer(const gdb_byte *, int, enum bfd_endian)
Definition: findvar.c:49
enum dwarf2_frame_reg_rule how
Definition: dwarf2-frame.h:82
long long LONGEST
Definition: common-types.h:52