GDB (xrefs)
/tmp/gdb-8.1/gdb/hppa-bsd-tdep.c
Go to the documentation of this file.
1 /* Target-dependent code for HP PA-RISC BSD's.
2 
3  Copyright (C) 2004-2018 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 "hppa-bsd-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 {
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'. */
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. */
141 }
CORE_ADDR(* find_global_pointer)(struct gdbarch *, struct value *)
Definition: hppa-tdep.h:97
#define SECT_OFF_TEXT(objfile)
Definition: objfiles.h:686
bfd_vma CORE_ADDR
Definition: common-types.h:41
const struct floatformat * floatformats_ieee_double[BFD_ENDIAN_UNKNOWN]
Definition: gdbtypes.c:76
struct bfd_section * the_bfd_section
Definition: objfiles.h:126
CORE_ADDR hppa_skip_trampoline_code(struct frame_info *frame, CORE_ADDR pc)
Definition: hppa-tdep.c:2952
void set_gdbarch_skip_trampoline_code(struct gdbarch *gdbarch, gdbarch_skip_trampoline_code_ftype skip_trampoline_code)
Definition: gdbarch.c:3316
int(* in_solib_call_trampoline)(struct gdbarch *gdbarch, CORE_ADDR pc)
Definition: hppa-tdep.h:102
#define obj_section_endaddr(s)
Definition: objfiles.h:146
struct link_map_offsets * svr4_ilp32_fetch_link_map_offsets(void)
Definition: solib-svr4.c:3183
#define ALL_OBJFILE_OSECTIONS(objfile, osect)
Definition: objfiles.h:630
static void hppabsd_dwarf2_frame_init_reg(struct gdbarch *gdbarch, int regnum, struct dwarf2_frame_state_reg *reg, struct frame_info *this_frame)
void hppabsd_init_abi(struct gdbarch_info info, struct gdbarch *gdbarch)
struct gdbarch_tdep * gdbarch_tdep(struct gdbarch *gdbarch)
Definition: gdbarch.c:1491
int hppa_in_solib_call_trampoline(struct gdbarch *gdbarch, CORE_ADDR pc)
Definition: hppa-tdep.c:2924
static ULONGEST extract_unsigned_integer(const gdb_byte *addr, int len, enum bfd_endian byte_order)
Definition: defs.h:577
enum bfd_endian gdbarch_byte_order(struct gdbarch *gdbarch)
Definition: gdbarch.c:1509
#define ANOFFSET(secoff, whichone)
Definition: symtab.h:1276
void set_solib_svr4_fetch_link_map_offsets(struct gdbarch *gdbarch, struct link_map_offsets *(*flmo)(void))
Definition: solib-svr4.c:3137
int regnum
Definition: aarch64-tdep.c:77
struct obj_section * find_pc_section(CORE_ADDR pc)
Definition: objfiles.c:1395
Definition: regdef.h:22
Definition: value.c:169
bfd_byte gdb_byte
Definition: common-types.h:38
static CORE_ADDR hppabsd_find_global_pointer(struct gdbarch *gdbarch, struct value *function)
Definition: hppa-bsd-tdep.c:33
int target_read_memory(CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
Definition: target.c:1370
static int in_plt_section(CORE_ADDR pc)
Definition: objfiles.h:542
#define obj_section_addr(s)
Definition: objfiles.h:140
struct objfile * objfile
Definition: objfiles.h:129
void dwarf2_append_unwinders(struct gdbarch *gdbarch)
static LONGEST extract_signed_integer(const gdb_byte *addr, int len, enum bfd_endian byte_order)
Definition: defs.h:570
void set_gdbarch_long_double_bit(struct gdbarch *gdbarch, int long_double_bit)
Definition: gdbarch.c:1756
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:743
CORE_ADDR value_as_address(struct value *val)
Definition: value.c:2762
void set_gdbarch_long_double_format(struct gdbarch *gdbarch, const struct floatformat **long_double_format)
Definition: gdbarch.c:1772
struct section_offsets * section_offsets
Definition: objfiles.h:396
long long LONGEST
Definition: common-types.h:52
struct obj_section * sections_end
Definition: objfiles.h:424