2010-12-30 00:11:49 +08:00
|
|
|
/* Target-dependent code for Analog Devices Blackfin processor, for GDB.
|
|
|
|
|
2021-01-01 16:03:39 +08:00
|
|
|
Copyright (C) 2005-2021 Free Software Foundation, Inc.
|
2010-12-30 00:11:49 +08:00
|
|
|
|
|
|
|
Contributed by Analog Devices, 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 3 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, see <http://www.gnu.org/licenses/>. */
|
|
|
|
|
|
|
|
#include "defs.h"
|
2019-04-07 03:38:10 +08:00
|
|
|
#include "inferior.h"
|
|
|
|
#include "gdbcore.h"
|
2010-12-30 00:11:49 +08:00
|
|
|
#include "arch-utils.h"
|
2019-04-07 03:38:10 +08:00
|
|
|
#include "regcache.h"
|
|
|
|
#include "frame.h"
|
|
|
|
#include "frame-unwind.h"
|
|
|
|
#include "frame-base.h"
|
|
|
|
#include "trad-frame.h"
|
2010-12-30 00:11:49 +08:00
|
|
|
#include "dis-asm.h"
|
2019-04-07 03:38:10 +08:00
|
|
|
#include "sim-regno.h"
|
|
|
|
#include "gdb/sim-bfin.h"
|
Move DWARF code to dwarf2/ subdirectory
This moves all the remaining DWARF code to the new dwarf2
subdirectory. This is just a simple renaming, with updates to
includes as needed.
gdb/ChangeLog
2020-02-08 Tom Tromey <tom@tromey.com>
* dwarf2/expr.c: Rename from dwarf2expr.c.
* dwarf2/expr.h: Rename from dwarf2expr.h.
* dwarf2/frame-tailcall.c: Rename from dwarf2-frame-tailcall.c.
* dwarf2/frame-tailcall.h: Rename from dwarf2-frame-tailcall.h.
* dwarf2/frame.c: Rename from dwarf2-frame.c.
* dwarf2/frame.h: Rename from dwarf2-frame.h.
* dwarf2/index-cache.c: Rename from dwarf-index-cache.c.
* dwarf2/index-cache.h: Rename from dwarf-index-cache.h.
* dwarf2/index-common.c: Rename from dwarf-index-common.c.
* dwarf2/index-common.h: Rename from dwarf-index-common.h.
* dwarf2/index-write.c: Rename from dwarf-index-write.c.
* dwarf2/index-write.h: Rename from dwarf-index-write.h.
* dwarf2/loc.c: Rename from dwarf2loc.c.
* dwarf2/loc.h: Rename from dwarf2loc.h.
* dwarf2/read.c: Rename from dwarf2read.c.
* dwarf2/read.h: Rename from dwarf2read.h.
* dwarf2/abbrev.c, aarch64-tdep.c, alpha-tdep.c,
amd64-darwin-tdep.c, arc-tdep.c, arm-tdep.c, bfin-tdep.c,
compile/compile-c-symbols.c, compile/compile-cplus-symbols.c,
compile/compile-loc2c.c, cris-tdep.c, csky-tdep.c, findvar.c,
gdbtypes.c, guile/scm-type.c, h8300-tdep.c, hppa-bsd-tdep.c,
hppa-linux-tdep.c, i386-darwin-tdep.c, i386-linux-tdep.c,
i386-tdep.c, iq2000-tdep.c, m32c-tdep.c, m68hc11-tdep.c,
m68k-tdep.c, microblaze-tdep.c, mips-tdep.c, mn10300-tdep.c,
msp430-tdep.c, nds32-tdep.c, nios2-tdep.c, or1k-tdep.c,
riscv-tdep.c, rl78-tdep.c, rs6000-tdep.c, rx-tdep.c, s12z-tdep.c,
s390-tdep.c, score-tdep.c, sh-tdep.c, sparc-linux-tdep.c,
sparc-tdep.c, sparc64-linux-tdep.c, sparc64-tdep.c, tic6x-tdep.c,
tilegx-tdep.c, v850-tdep.c, xstormy16-tdep.c, xtensa-tdep.c:
Update.
* Makefile.in (COMMON_SFILES): Update.
(HFILES_NO_SRCDIR): Update.
Change-Id: Ied9ce1436cd27ac4a4cffef10ec92e396f181928
2020-02-09 04:40:54 +08:00
|
|
|
#include "dwarf2/frame.h"
|
2019-04-07 03:38:10 +08:00
|
|
|
#include "symtab.h"
|
2010-12-30 00:11:49 +08:00
|
|
|
#include "elf-bfd.h"
|
|
|
|
#include "elf/bfin.h"
|
2019-04-03 10:04:24 +08:00
|
|
|
#include "osabi.h"
|
2019-04-07 03:38:10 +08:00
|
|
|
#include "infcall.h"
|
2010-12-30 00:11:49 +08:00
|
|
|
#include "xml-syscall.h"
|
2019-04-07 03:38:10 +08:00
|
|
|
#include "bfin-tdep.h"
|
2010-12-30 00:11:49 +08:00
|
|
|
|
|
|
|
/* Macros used by prologue functions. */
|
|
|
|
#define P_LINKAGE 0xE800
|
|
|
|
#define P_MINUS_SP1 0x0140
|
|
|
|
#define P_MINUS_SP2 0x05C0
|
|
|
|
#define P_MINUS_SP3 0x0540
|
|
|
|
#define P_MINUS_SP4 0x04C0
|
|
|
|
#define P_SP_PLUS 0x6C06
|
|
|
|
#define P_P2_LOW 0xE10A
|
|
|
|
#define P_P2_HIGH 0XE14A
|
|
|
|
#define P_SP_EQ_SP_PLUS_P2 0X5BB2
|
|
|
|
#define P_SP_EQ_P2_PLUS_SP 0x5B96
|
|
|
|
#define P_MINUS_MINUS_SP_EQ_RETS 0x0167
|
|
|
|
|
|
|
|
/* Macros used for program flow control. */
|
|
|
|
/* 16 bit instruction, max */
|
|
|
|
#define P_16_BIT_INSR_MAX 0xBFFF
|
|
|
|
/* 32 bit instruction, min */
|
|
|
|
#define P_32_BIT_INSR_MIN 0xC000
|
|
|
|
/* 32 bit instruction, max */
|
|
|
|
#define P_32_BIT_INSR_MAX 0xE801
|
|
|
|
/* jump (preg), 16-bit, min */
|
|
|
|
#define P_JUMP_PREG_MIN 0x0050
|
|
|
|
/* jump (preg), 16-bit, max */
|
|
|
|
#define P_JUMP_PREG_MAX 0x0057
|
|
|
|
/* jump (pc+preg), 16-bit, min */
|
|
|
|
#define P_JUMP_PC_PLUS_PREG_MIN 0x0080
|
|
|
|
/* jump (pc+preg), 16-bit, max */
|
|
|
|
#define P_JUMP_PC_PLUS_PREG_MAX 0x0087
|
|
|
|
/* jump.s pcrel13m2, 16-bit, min */
|
|
|
|
#define P_JUMP_S_MIN 0x2000
|
|
|
|
/* jump.s pcrel13m2, 16-bit, max */
|
|
|
|
#define P_JUMP_S_MAX 0x2FFF
|
|
|
|
/* jump.l pcrel25m2, 32-bit, min */
|
|
|
|
#define P_JUMP_L_MIN 0xE200
|
|
|
|
/* jump.l pcrel25m2, 32-bit, max */
|
|
|
|
#define P_JUMP_L_MAX 0xE2FF
|
|
|
|
/* conditional jump pcrel11m2, 16-bit, min */
|
|
|
|
#define P_IF_CC_JUMP_MIN 0x1800
|
|
|
|
/* conditional jump pcrel11m2, 16-bit, max */
|
|
|
|
#define P_IF_CC_JUMP_MAX 0x1BFF
|
|
|
|
/* conditional jump(bp) pcrel11m2, 16-bit, min */
|
|
|
|
#define P_IF_CC_JUMP_BP_MIN 0x1C00
|
|
|
|
/* conditional jump(bp) pcrel11m2, 16-bit, max */
|
|
|
|
#define P_IF_CC_JUMP_BP_MAX 0x1FFF
|
|
|
|
/* conditional !jump pcrel11m2, 16-bit, min */
|
|
|
|
#define P_IF_NOT_CC_JUMP_MIN 0x1000
|
|
|
|
/* conditional !jump pcrel11m2, 16-bit, max */
|
|
|
|
#define P_IF_NOT_CC_JUMP_MAX 0x13FF
|
|
|
|
/* conditional jump(bp) pcrel11m2, 16-bit, min */
|
|
|
|
#define P_IF_NOT_CC_JUMP_BP_MIN 0x1400
|
|
|
|
/* conditional jump(bp) pcrel11m2, 16-bit, max */
|
|
|
|
#define P_IF_NOT_CC_JUMP_BP_MAX 0x17FF
|
|
|
|
/* call (preg), 16-bit, min */
|
|
|
|
#define P_CALL_PREG_MIN 0x0060
|
|
|
|
/* call (preg), 16-bit, max */
|
|
|
|
#define P_CALL_PREG_MAX 0x0067
|
|
|
|
/* call (pc+preg), 16-bit, min */
|
|
|
|
#define P_CALL_PC_PLUS_PREG_MIN 0x0070
|
|
|
|
/* call (pc+preg), 16-bit, max */
|
|
|
|
#define P_CALL_PC_PLUS_PREG_MAX 0x0077
|
|
|
|
/* call pcrel25m2, 32-bit, min */
|
|
|
|
#define P_CALL_MIN 0xE300
|
|
|
|
/* call pcrel25m2, 32-bit, max */
|
|
|
|
#define P_CALL_MAX 0xE3FF
|
|
|
|
/* RTS */
|
|
|
|
#define P_RTS 0x0010
|
|
|
|
/* MNOP */
|
|
|
|
#define P_MNOP 0xC803
|
|
|
|
/* EXCPT, 16-bit, min */
|
|
|
|
#define P_EXCPT_MIN 0x00A0
|
|
|
|
/* EXCPT, 16-bit, max */
|
|
|
|
#define P_EXCPT_MAX 0x00AF
|
|
|
|
/* multi instruction mask 1, 16-bit */
|
|
|
|
#define P_BIT_MULTI_INS_1 0xC000
|
|
|
|
/* multi instruction mask 2, 16-bit */
|
|
|
|
#define P_BIT_MULTI_INS_2 0x0800
|
|
|
|
|
|
|
|
/* The maximum bytes we search to skip the prologue. */
|
|
|
|
#define UPPER_LIMIT 40
|
|
|
|
|
|
|
|
/* ASTAT bits */
|
|
|
|
#define ASTAT_CC_POS 5
|
|
|
|
#define ASTAT_CC (1 << ASTAT_CC_POS)
|
|
|
|
|
|
|
|
/* Initial value: Register names used in BFIN's ISA documentation. */
|
|
|
|
|
|
|
|
static const char * const bfin_register_name_strings[] =
|
|
|
|
{
|
|
|
|
"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
|
|
|
|
"p0", "p1", "p2", "p3", "p4", "p5", "sp", "fp",
|
|
|
|
"i0", "i1", "i2", "i3", "m0", "m1", "m2", "m3",
|
|
|
|
"b0", "b1", "b2", "b3", "l0", "l1", "l2", "l3",
|
|
|
|
"a0x", "a0w", "a1x", "a1w", "astat", "rets",
|
|
|
|
"lc0", "lt0", "lb0", "lc1", "lt1", "lb1", "cycles", "cycles2",
|
|
|
|
"usp", "seqstat", "syscfg", "reti", "retx", "retn", "rete",
|
|
|
|
"pc", "cc",
|
|
|
|
};
|
|
|
|
|
|
|
|
#define NUM_BFIN_REGNAMES ARRAY_SIZE (bfin_register_name_strings)
|
|
|
|
|
|
|
|
|
|
|
|
/* In this diagram successive memory locations increase downwards or the
|
|
|
|
stack grows upwards with negative indices. (PUSH analogy for stack.)
|
|
|
|
|
|
|
|
The top frame is the "frame" of the current function being executed.
|
|
|
|
|
|
|
|
+--------------+ SP -
|
|
|
|
| local vars | ^
|
|
|
|
+--------------+ |
|
|
|
|
| save regs | |
|
|
|
|
+--------------+ FP |
|
|
|
|
| old FP -|-- top
|
|
|
|
+--------------+ | frame
|
|
|
|
| RETS | | |
|
|
|
|
+--------------+ | |
|
|
|
|
| param 1 | | |
|
|
|
|
| param 2 | | |
|
|
|
|
| ... | | V
|
|
|
|
+--------------+ | -
|
|
|
|
| local vars | | ^
|
|
|
|
+--------------+ | |
|
|
|
|
| save regs | | |
|
|
|
|
+--------------+<- |
|
|
|
|
| old FP -|-- next
|
|
|
|
+--------------+ | frame
|
|
|
|
| RETS | | |
|
|
|
|
+--------------+ | |
|
|
|
|
| param 1 | | |
|
|
|
|
| param 2 | | |
|
|
|
|
| ... | | V
|
|
|
|
+--------------+ | -
|
|
|
|
| local vars | | ^
|
|
|
|
+--------------+ | |
|
|
|
|
| save regs | | |
|
|
|
|
+--------------+<- next frame
|
|
|
|
| old FP | |
|
|
|
|
+--------------+ |
|
|
|
|
| RETS | V
|
|
|
|
+--------------+ -
|
|
|
|
|
|
|
|
The frame chain is formed as following:
|
|
|
|
|
|
|
|
FP has the topmost frame.
|
|
|
|
FP + 4 has the previous FP and so on. */
|
|
|
|
|
|
|
|
|
|
|
|
/* Map from DWARF2 register number to GDB register number. */
|
|
|
|
|
|
|
|
static const int map_gcc_gdb[] =
|
|
|
|
{
|
|
|
|
BFIN_R0_REGNUM,
|
|
|
|
BFIN_R1_REGNUM,
|
|
|
|
BFIN_R2_REGNUM,
|
|
|
|
BFIN_R3_REGNUM,
|
|
|
|
BFIN_R4_REGNUM,
|
|
|
|
BFIN_R5_REGNUM,
|
|
|
|
BFIN_R6_REGNUM,
|
|
|
|
BFIN_R7_REGNUM,
|
|
|
|
BFIN_P0_REGNUM,
|
|
|
|
BFIN_P1_REGNUM,
|
|
|
|
BFIN_P2_REGNUM,
|
|
|
|
BFIN_P3_REGNUM,
|
|
|
|
BFIN_P4_REGNUM,
|
|
|
|
BFIN_P5_REGNUM,
|
|
|
|
BFIN_SP_REGNUM,
|
|
|
|
BFIN_FP_REGNUM,
|
|
|
|
BFIN_I0_REGNUM,
|
|
|
|
BFIN_I1_REGNUM,
|
|
|
|
BFIN_I2_REGNUM,
|
|
|
|
BFIN_I3_REGNUM,
|
|
|
|
BFIN_B0_REGNUM,
|
|
|
|
BFIN_B1_REGNUM,
|
|
|
|
BFIN_B2_REGNUM,
|
|
|
|
BFIN_B3_REGNUM,
|
|
|
|
BFIN_L0_REGNUM,
|
|
|
|
BFIN_L1_REGNUM,
|
|
|
|
BFIN_L2_REGNUM,
|
|
|
|
BFIN_L3_REGNUM,
|
|
|
|
BFIN_M0_REGNUM,
|
|
|
|
BFIN_M1_REGNUM,
|
|
|
|
BFIN_M2_REGNUM,
|
|
|
|
BFIN_M3_REGNUM,
|
|
|
|
BFIN_A0_DOT_X_REGNUM,
|
|
|
|
BFIN_A1_DOT_X_REGNUM,
|
|
|
|
BFIN_CC_REGNUM,
|
|
|
|
BFIN_RETS_REGNUM,
|
|
|
|
BFIN_RETI_REGNUM,
|
|
|
|
BFIN_RETX_REGNUM,
|
|
|
|
BFIN_RETN_REGNUM,
|
|
|
|
BFIN_RETE_REGNUM,
|
|
|
|
BFIN_ASTAT_REGNUM,
|
|
|
|
BFIN_SEQSTAT_REGNUM,
|
|
|
|
BFIN_USP_REGNUM,
|
|
|
|
BFIN_LT0_REGNUM,
|
|
|
|
BFIN_LT1_REGNUM,
|
|
|
|
BFIN_LC0_REGNUM,
|
|
|
|
BFIN_LC1_REGNUM,
|
|
|
|
BFIN_LB0_REGNUM,
|
|
|
|
BFIN_LB1_REGNUM
|
|
|
|
};
|
|
|
|
|
2017-04-07 16:31:37 +08:00
|
|
|
/* Big enough to hold the size of the largest register in bytes. */
|
|
|
|
#define BFIN_MAX_REGISTER_SIZE 4
|
2010-12-30 00:11:49 +08:00
|
|
|
|
|
|
|
struct bfin_frame_cache
|
|
|
|
{
|
|
|
|
/* Base address. */
|
|
|
|
CORE_ADDR base;
|
|
|
|
CORE_ADDR sp_offset;
|
|
|
|
CORE_ADDR pc;
|
|
|
|
int frameless_pc_value;
|
|
|
|
|
|
|
|
/* Saved registers. */
|
|
|
|
CORE_ADDR saved_regs[BFIN_NUM_REGS];
|
|
|
|
CORE_ADDR saved_sp;
|
|
|
|
|
|
|
|
/* Stack space reserved for local variables. */
|
|
|
|
long locals;
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Allocate and initialize a frame cache. */
|
|
|
|
|
|
|
|
static struct bfin_frame_cache *
|
|
|
|
bfin_alloc_frame_cache (void)
|
|
|
|
{
|
|
|
|
struct bfin_frame_cache *cache;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
cache = FRAME_OBSTACK_ZALLOC (struct bfin_frame_cache);
|
|
|
|
|
|
|
|
/* Base address. */
|
|
|
|
cache->base = 0;
|
|
|
|
cache->sp_offset = -4;
|
|
|
|
cache->pc = 0;
|
|
|
|
cache->frameless_pc_value = 0;
|
|
|
|
|
|
|
|
/* Saved registers. We initialize these to -1 since zero is a valid
|
|
|
|
offset (that's where fp is supposed to be stored). */
|
|
|
|
for (i = 0; i < BFIN_NUM_REGS; i++)
|
|
|
|
cache->saved_regs[i] = -1;
|
|
|
|
|
|
|
|
/* Frameless until proven otherwise. */
|
|
|
|
cache->locals = -1;
|
|
|
|
|
|
|
|
return cache;
|
|
|
|
}
|
|
|
|
|
|
|
|
static struct bfin_frame_cache *
|
|
|
|
bfin_frame_cache (struct frame_info *this_frame, void **this_cache)
|
|
|
|
{
|
|
|
|
struct bfin_frame_cache *cache;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
if (*this_cache)
|
Add some more casts (1/2)
Note: I needed to split this patch in two, otherwise it's too big for
the mailing list.
This patch adds explicit casts to situations where a void pointer is
assigned to a pointer to the "real" type. Building in C++ mode requires
those assignments to use an explicit cast. This includes, for example:
- callback arguments (cleanups, comparison functions, ...)
- data attached to some object (objfile, program space, etc) in the form
of a void pointer
- "user data" passed to some function
This patch comes from the commit "(mostly) auto-generated patch to insert
casts needed for C++", taken from Pedro's C++ branch.
Only files built on x86 with --enable-targets=all are modified, so the
native files for other arches will need to be dealt with separately.
I built-tested this with --enable-targets=all and reg-tested. To my
surprise, a test case (selftest.exp) had to be adjusted.
Here's the ChangeLog entry. Again, this was relatively quick to make
despite the length, thanks to David Malcom's script, although I don't
believe it's very useful information in that particular case...
gdb/ChangeLog:
* aarch64-tdep.c (aarch64_make_prologue_cache): Add cast(s).
(aarch64_make_stub_cache): Likewise.
(value_of_aarch64_user_reg): Likewise.
* ada-lang.c (ada_inferior_data_cleanup): Likewise.
(get_ada_inferior_data): Likewise.
(get_ada_pspace_data): Likewise.
(ada_pspace_data_cleanup): Likewise.
(ada_complete_symbol_matcher): Likewise.
(ada_exc_search_name_matches): Likewise.
* ada-tasks.c (get_ada_tasks_pspace_data): Likewise.
(get_ada_tasks_inferior_data): Likewise.
* addrmap.c (addrmap_mutable_foreach_worker): Likewise.
(splay_obstack_alloc): Likewise.
(splay_obstack_free): Likewise.
* alpha-linux-tdep.c (alpha_linux_supply_gregset): Likewise.
(alpha_linux_collect_gregset): Likewise.
(alpha_linux_supply_fpregset): Likewise.
(alpha_linux_collect_fpregset): Likewise.
* alpha-mdebug-tdep.c (alpha_mdebug_frame_unwind_cache): Likewise.
* alpha-tdep.c (alpha_lds): Likewise.
(alpha_sts): Likewise.
(alpha_sigtramp_frame_unwind_cache): Likewise.
(alpha_heuristic_frame_unwind_cache): Likewise.
(alpha_supply_int_regs): Likewise.
(alpha_fill_int_regs): Likewise.
(alpha_supply_fp_regs): Likewise.
(alpha_fill_fp_regs): Likewise.
* alphanbsd-tdep.c (alphanbsd_supply_fpregset): Likewise.
(alphanbsd_aout_supply_gregset): Likewise.
(alphanbsd_supply_gregset): Likewise.
* amd64-linux-tdep.c (amd64_linux_init_abi): Likewise.
(amd64_x32_linux_init_abi): Likewise.
* amd64-nat.c (amd64_supply_native_gregset): Likewise.
(amd64_collect_native_gregset): Likewise.
* amd64-tdep.c (amd64_frame_cache): Likewise.
(amd64_sigtramp_frame_cache): Likewise.
(amd64_epilogue_frame_cache): Likewise.
(amd64_supply_fxsave): Likewise.
(amd64_supply_xsave): Likewise.
(amd64_collect_fxsave): Likewise.
(amd64_collect_xsave): Likewise.
* amd64-windows-tdep.c (amd64_windows_frame_cache): Likewise.
* amd64obsd-tdep.c (amd64obsd_trapframe_cache): Likewise.
* arm-linux-tdep.c (arm_linux_supply_gregset): Likewise.
(arm_linux_collect_gregset): Likewise.
(arm_linux_supply_nwfpe): Likewise.
(arm_linux_collect_nwfpe): Likewise.
(arm_linux_supply_vfp): Likewise.
(arm_linux_collect_vfp): Likewise.
* arm-tdep.c (arm_find_mapping_symbol): Likewise.
(arm_prologue_unwind_stop_reason): Likewise.
(arm_prologue_this_id): Likewise.
(arm_prologue_prev_register): Likewise.
(arm_exidx_data_free): Likewise.
(arm_find_exidx_entry): Likewise.
(arm_stub_this_id): Likewise.
(arm_m_exception_this_id): Likewise.
(arm_m_exception_prev_register): Likewise.
(arm_normal_frame_base): Likewise.
(gdb_print_insn_arm): Likewise.
(arm_objfile_data_free): Likewise.
(arm_record_special_symbol): Likewise.
(value_of_arm_user_reg): Likewise.
* armbsd-tdep.c (armbsd_supply_fpregset): Likewise.
(armbsd_supply_gregset): Likewise.
* auto-load.c (auto_load_pspace_data_cleanup): Likewise.
(get_auto_load_pspace_data): Likewise.
(hash_loaded_script_entry): Likewise.
(eq_loaded_script_entry): Likewise.
(clear_section_scripts): Likewise.
(collect_matching_scripts): Likewise.
* auxv.c (auxv_inferior_data_cleanup): Likewise.
(get_auxv_inferior_data): Likewise.
* avr-tdep.c (avr_frame_unwind_cache): Likewise.
* ax-general.c (do_free_agent_expr_cleanup): Likewise.
* bfd-target.c (target_bfd_xfer_partial): Likewise.
(target_bfd_xclose): Likewise.
(target_bfd_get_section_table): Likewise.
* bfin-tdep.c (bfin_frame_cache): Likewise.
* block.c (find_block_in_blockvector): Likewise.
(call_site_for_pc): Likewise.
(block_find_non_opaque_type_preferred): Likewise.
* break-catch-sig.c (signal_catchpoint_insert_location): Likewise.
(signal_catchpoint_remove_location): Likewise.
(signal_catchpoint_breakpoint_hit): Likewise.
(signal_catchpoint_print_one): Likewise.
(signal_catchpoint_print_mention): Likewise.
(signal_catchpoint_print_recreate): Likewise.
* break-catch-syscall.c (get_catch_syscall_inferior_data): Likewise.
* breakpoint.c (do_cleanup_counted_command_line): Likewise.
(bp_location_compare_addrs): Likewise.
(get_first_locp_gte_addr): Likewise.
(check_tracepoint_command): Likewise.
(do_map_commands_command): Likewise.
(get_breakpoint_objfile_data): Likewise.
(free_breakpoint_probes): Likewise.
(do_captured_breakpoint_query): Likewise.
(compare_breakpoints): Likewise.
(bp_location_compare): Likewise.
(bpstat_remove_breakpoint_callback): Likewise.
(do_delete_breakpoint_cleanup): Likewise.
* bsd-uthread.c (bsd_uthread_set_supply_uthread): Likewise.
(bsd_uthread_set_collect_uthread): Likewise.
(bsd_uthread_activate): Likewise.
(bsd_uthread_fetch_registers): Likewise.
(bsd_uthread_store_registers): Likewise.
* btrace.c (check_xml_btrace_version): Likewise.
(parse_xml_btrace_block): Likewise.
(parse_xml_btrace_pt_config_cpu): Likewise.
(parse_xml_btrace_pt_raw): Likewise.
(parse_xml_btrace_pt): Likewise.
(parse_xml_btrace_conf_bts): Likewise.
(parse_xml_btrace_conf_pt): Likewise.
(do_btrace_data_cleanup): Likewise.
* c-typeprint.c (find_typedef_for_canonicalize): Likewise.
* charset.c (cleanup_iconv): Likewise.
(do_cleanup_iterator): Likewise.
* cli-out.c (cli_uiout_dtor): Likewise.
(cli_table_begin): Likewise.
(cli_table_body): Likewise.
(cli_table_end): Likewise.
(cli_table_header): Likewise.
(cli_begin): Likewise.
(cli_end): Likewise.
(cli_field_int): Likewise.
(cli_field_skip): Likewise.
(cli_field_string): Likewise.
(cli_field_fmt): Likewise.
(cli_spaces): Likewise.
(cli_text): Likewise.
(cli_message): Likewise.
(cli_wrap_hint): Likewise.
(cli_flush): Likewise.
(cli_redirect): Likewise.
(out_field_fmt): Likewise.
(field_separator): Likewise.
(cli_out_set_stream): Likewise.
* cli/cli-cmds.c (compare_symtabs): Likewise.
* cli/cli-dump.c (call_dump_func): Likewise.
(restore_section_callback): Likewise.
* cli/cli-script.c (clear_hook_in_cleanup): Likewise.
(do_restore_user_call_depth): Likewise.
(do_free_command_lines_cleanup): Likewise.
* coff-pe-read.c (get_section_vmas): Likewise.
(pe_as16): Likewise.
(pe_as32): Likewise.
* coffread.c (coff_symfile_read): Likewise.
* common/agent.c (agent_look_up_symbols): Likewise.
* common/filestuff.c (do_close_cleanup): Likewise.
* common/format.c (free_format_pieces_cleanup): Likewise.
* common/vec.c (vec_o_reserve): Likewise.
* compile/compile-c-support.c (print_one_macro): Likewise.
* compile/compile-c-symbols.c (hash_symbol_error): Likewise.
(eq_symbol_error): Likewise.
(del_symbol_error): Likewise.
(error_symbol_once): Likewise.
(gcc_convert_symbol): Likewise.
(gcc_symbol_address): Likewise.
(hash_symname): Likewise.
(eq_symname): Likewise.
* compile/compile-c-types.c (hash_type_map_instance): Likewise.
(eq_type_map_instance): Likewise.
(insert_type): Likewise.
(convert_type): Likewise.
* compile/compile-object-load.c (munmap_listp_free_cleanup): Likewise.
(setup_sections): Likewise.
(link_hash_table_free): Likewise.
(copy_sections): Likewise.
* compile/compile-object-run.c (do_module_cleanup): Likewise.
* compile/compile.c (compile_print_value): Likewise.
(do_rmdir): Likewise.
(cleanup_compile_instance): Likewise.
(cleanup_unlink_file): Likewise.
* completer.c (free_completion_tracker): Likewise.
* corelow.c (add_to_spuid_list): Likewise.
* cp-namespace.c (reset_directive_searched): Likewise.
* cp-support.c (reset_directive_searched): Likewise.
* cris-tdep.c (cris_sigtramp_frame_unwind_cache): Likewise.
(cris_frame_unwind_cache): Likewise.
* d-lang.c (builtin_d_type): Likewise.
* d-namespace.c (reset_directive_searched): Likewise.
* dbxread.c (dbx_free_symfile_info): Likewise.
(do_free_bincl_list_cleanup): Likewise.
* disasm.c (hash_dis_line_entry): Likewise.
(eq_dis_line_entry): Likewise.
(dis_asm_print_address): Likewise.
(fprintf_disasm): Likewise.
(do_ui_file_delete): Likewise.
* doublest.c (convert_floatformat_to_doublest): Likewise.
* dummy-frame.c (pop_dummy_frame_bpt): Likewise.
(dummy_frame_prev_register): Likewise.
(dummy_frame_this_id): Likewise.
* dwarf2-frame-tailcall.c (cache_hash): Likewise.
(cache_eq): Likewise.
(cache_find): Likewise.
(tailcall_frame_this_id): Likewise.
(dwarf2_tailcall_prev_register_first): Likewise.
(tailcall_frame_prev_register): Likewise.
(tailcall_frame_dealloc_cache): Likewise.
(tailcall_frame_prev_arch): Likewise.
* dwarf2-frame.c (dwarf2_frame_state_free): Likewise.
(dwarf2_frame_set_init_reg): Likewise.
(dwarf2_frame_init_reg): Likewise.
(dwarf2_frame_set_signal_frame_p): Likewise.
(dwarf2_frame_signal_frame_p): Likewise.
(dwarf2_frame_set_adjust_regnum): Likewise.
(dwarf2_frame_adjust_regnum): Likewise.
(clear_pointer_cleanup): Likewise.
(dwarf2_frame_cache): Likewise.
(find_cie): Likewise.
(dwarf2_frame_find_fde): Likewise.
* dwarf2expr.c (dwarf_expr_address_type): Likewise.
(free_dwarf_expr_context_cleanup): Likewise.
* dwarf2loc.c (locexpr_find_frame_base_location): Likewise.
(locexpr_get_frame_base): Likewise.
(loclist_find_frame_base_location): Likewise.
(loclist_get_frame_base): Likewise.
(dwarf_expr_dwarf_call): Likewise.
(dwarf_expr_get_base_type): Likewise.
(dwarf_expr_push_dwarf_reg_entry_value): Likewise.
(dwarf_expr_get_obj_addr): Likewise.
(entry_data_value_coerce_ref): Likewise.
(entry_data_value_copy_closure): Likewise.
(entry_data_value_free_closure): Likewise.
(get_frame_address_in_block_wrapper): Likewise.
(dwarf2_evaluate_property): Likewise.
(dwarf2_compile_property_to_c): Likewise.
(needs_frame_read_addr_from_reg): Likewise.
(needs_frame_get_reg_value): Likewise.
(needs_frame_frame_base): Likewise.
(needs_frame_frame_cfa): Likewise.
(needs_frame_tls_address): Likewise.
(needs_frame_dwarf_call): Likewise.
(needs_dwarf_reg_entry_value): Likewise.
(get_ax_pc): Likewise.
(locexpr_read_variable): Likewise.
(locexpr_read_variable_at_entry): Likewise.
(locexpr_read_needs_frame): Likewise.
(locexpr_describe_location): Likewise.
(locexpr_tracepoint_var_ref): Likewise.
(locexpr_generate_c_location): Likewise.
(loclist_read_variable): Likewise.
(loclist_read_variable_at_entry): Likewise.
(loclist_describe_location): Likewise.
(loclist_tracepoint_var_ref): Likewise.
(loclist_generate_c_location): Likewise.
* dwarf2read.c (line_header_hash_voidp): Likewise.
(line_header_eq_voidp): Likewise.
(dwarf2_has_info): Likewise.
(dwarf2_get_section_info): Likewise.
(locate_dwz_sections): Likewise.
(hash_file_name_entry): Likewise.
(eq_file_name_entry): Likewise.
(delete_file_name_entry): Likewise.
(dw2_setup): Likewise.
(dw2_get_file_names_reader): Likewise.
(dw2_find_pc_sect_compunit_symtab): Likewise.
(hash_signatured_type): Likewise.
(eq_signatured_type): Likewise.
(add_signatured_type_cu_to_table): Likewise.
(create_debug_types_hash_table): Likewise.
(lookup_dwo_signatured_type): Likewise.
(lookup_dwp_signatured_type): Likewise.
(lookup_signatured_type): Likewise.
(hash_type_unit_group): Likewise.
(eq_type_unit_group): Likewise.
(get_type_unit_group): Likewise.
(process_psymtab_comp_unit_reader): Likewise.
(sort_tu_by_abbrev_offset): Likewise.
(process_skeletonless_type_unit): Likewise.
(psymtabs_addrmap_cleanup): Likewise.
(dwarf2_read_symtab): Likewise.
(psymtab_to_symtab_1): Likewise.
(die_hash): Likewise.
(die_eq): Likewise.
(load_full_comp_unit_reader): Likewise.
(reset_die_in_process): Likewise.
(free_cu_line_header): Likewise.
(handle_DW_AT_stmt_list): Likewise.
(hash_dwo_file): Likewise.
(eq_dwo_file): Likewise.
(hash_dwo_unit): Likewise.
(eq_dwo_unit): Likewise.
(create_dwo_cu_reader): Likewise.
(create_dwo_unit_in_dwp_v1): Likewise.
(create_dwo_unit_in_dwp_v2): Likewise.
(lookup_dwo_unit_in_dwp): Likewise.
(dwarf2_locate_dwo_sections): Likewise.
(dwarf2_locate_common_dwp_sections): Likewise.
(dwarf2_locate_v2_dwp_sections): Likewise.
(hash_dwp_loaded_cutus): Likewise.
(eq_dwp_loaded_cutus): Likewise.
(lookup_dwo_cutu): Likewise.
(abbrev_table_free_cleanup): Likewise.
(dwarf2_free_abbrev_table): Likewise.
(find_partial_die_in_comp_unit): Likewise.
(free_line_header_voidp): Likewise.
(follow_die_offset): Likewise.
(follow_die_sig_1): Likewise.
(free_heap_comp_unit): Likewise.
(free_stack_comp_unit): Likewise.
(dwarf2_free_objfile): Likewise.
(per_cu_offset_and_type_hash): Likewise.
(per_cu_offset_and_type_eq): Likewise.
(get_die_type_at_offset): Likewise.
(partial_die_hash): Likewise.
(partial_die_eq): Likewise.
(dwarf2_per_objfile_free): Likewise.
(hash_strtab_entry): Likewise.
(eq_strtab_entry): Likewise.
(add_string): Likewise.
(hash_symtab_entry): Likewise.
(eq_symtab_entry): Likewise.
(delete_symtab_entry): Likewise.
(cleanup_mapped_symtab): Likewise.
(add_indices_to_cpool): Likewise.
(hash_psymtab_cu_index): Likewise.
(eq_psymtab_cu_index): Likewise.
(add_address_entry_worker): Likewise.
(unlink_if_set): Likewise.
(write_one_signatured_type): Likewise.
(save_gdb_index_command): Likewise.
* elfread.c (elf_symtab_read): Likewise.
(elf_gnu_ifunc_cache_hash): Likewise.
(elf_gnu_ifunc_cache_eq): Likewise.
(elf_gnu_ifunc_record_cache): Likewise.
(elf_gnu_ifunc_resolve_by_cache): Likewise.
(elf_get_probes): Likewise.
(probe_key_free): Likewise.
* f-lang.c (builtin_f_type): Likewise.
* frame-base.c (frame_base_append_sniffer): Likewise.
(frame_base_set_default): Likewise.
(frame_base_find_by_frame): Likewise.
* frame-unwind.c (frame_unwind_prepend_unwinder): Likewise.
(frame_unwind_append_unwinder): Likewise.
(frame_unwind_find_by_frame): Likewise.
* frame.c (frame_addr_hash): Likewise.
(frame_addr_hash_eq): Likewise.
(frame_stash_find): Likewise.
(do_frame_register_read): Likewise.
(unwind_to_current_frame): Likewise.
(frame_cleanup_after_sniffer): Likewise.
* frv-linux-tdep.c (frv_linux_sigtramp_frame_cache): Likewise.
* frv-tdep.c (frv_frame_unwind_cache): Likewise.
* ft32-tdep.c (ft32_frame_cache): Likewise.
* gcore.c (do_bfd_delete_cleanup): Likewise.
(gcore_create_callback): Likewise.
* gdb_bfd.c (hash_bfd): Likewise.
(eq_bfd): Likewise.
(gdb_bfd_open): Likewise.
(free_one_bfd_section): Likewise.
(gdb_bfd_ref): Likewise.
(gdb_bfd_unref): Likewise.
(get_section_descriptor): Likewise.
(gdb_bfd_map_section): Likewise.
(gdb_bfd_crc): Likewise.
(gdb_bfd_mark_parent): Likewise.
(gdb_bfd_record_inclusion): Likewise.
(gdb_bfd_requires_relocations): Likewise.
(print_one_bfd): Likewise.
* gdbtypes.c (type_pair_hash): Likewise.
(type_pair_eq): Likewise.
(builtin_type): Likewise.
(objfile_type): Likewise.
* gnu-v3-abi.c (vtable_ptrdiff_type): Likewise.
(vtable_address_point_offset): Likewise.
(gnuv3_get_vtable): Likewise.
(hash_value_and_voffset): Likewise.
(eq_value_and_voffset): Likewise.
(compare_value_and_voffset): Likewise.
(compute_vtable_size): Likewise.
(gnuv3_get_typeid_type): Likewise.
* go-lang.c (builtin_go_type): Likewise.
* guile/scm-block.c (bkscm_hash_block_smob): Likewise.
(bkscm_eq_block_smob): Likewise.
(bkscm_objfile_block_map): Likewise.
(bkscm_del_objfile_blocks): Likewise.
* guile/scm-breakpoint.c (bpscm_build_bp_list): Likewise.
* guile/scm-disasm.c (gdbscm_disasm_read_memory_worker): Likewise.
(gdbscm_disasm_print_address): Likewise.
* guile/scm-frame.c (frscm_hash_frame_smob): Likewise.
(frscm_eq_frame_smob): Likewise.
(frscm_inferior_frame_map): Likewise.
(frscm_del_inferior_frames): Likewise.
* guile/scm-gsmob.c (gdbscm_add_objfile_ref): Likewise.
* guile/scm-objfile.c (ofscm_handle_objfile_deleted): Likewise.
(ofscm_objfile_smob_from_objfile): Likewise.
* guile/scm-ports.c (ioscm_write): Likewise.
(ioscm_file_port_delete): Likewise.
(ioscm_file_port_rewind): Likewise.
(ioscm_file_port_put): Likewise.
(ioscm_file_port_write): Likewise.
* guile/scm-progspace.c (psscm_handle_pspace_deleted): Likewise.
(psscm_pspace_smob_from_pspace): Likewise.
* guile/scm-safe-call.c (scscm_recording_pre_unwind_handler): Likewise.
(scscm_recording_unwind_handler): Likewise.
(gdbscm_with_catch): Likewise.
(scscm_call_0_body): Likewise.
(scscm_call_1_body): Likewise.
(scscm_call_2_body): Likewise.
(scscm_call_3_body): Likewise.
(scscm_call_4_body): Likewise.
(scscm_apply_1_body): Likewise.
(scscm_eval_scheme_string): Likewise.
(gdbscm_safe_eval_string): Likewise.
(scscm_source_scheme_script): Likewise.
(gdbscm_safe_source_script): Likewise.
* guile/scm-string.c (gdbscm_call_scm_to_stringn): Likewise.
(gdbscm_call_scm_from_stringn): Likewise.
* guile/scm-symbol.c (syscm_hash_symbol_smob): Likewise.
(syscm_eq_symbol_smob): Likewise.
(syscm_get_symbol_map): Likewise.
(syscm_del_objfile_symbols): Likewise.
* guile/scm-symtab.c (stscm_hash_symtab_smob): Likewise.
(stscm_eq_symtab_smob): Likewise.
(stscm_objfile_symtab_map): Likewise.
(stscm_del_objfile_symtabs): Likewise.
* guile/scm-type.c (tyscm_hash_type_smob): Likewise.
(tyscm_eq_type_smob): Likewise.
(tyscm_type_map): Likewise.
(tyscm_copy_type_recursive): Likewise.
(save_objfile_types): Likewise.
* guile/scm-utils.c (extract_arg): Likewise.
* h8300-tdep.c (h8300_frame_cache): Likewise.
* hppa-linux-tdep.c (hppa_linux_sigtramp_frame_unwind_cache): Likewise.
* hppa-tdep.c (compare_unwind_entries): Likewise.
(find_unwind_entry): Likewise.
(hppa_frame_cache): Likewise.
(hppa_stub_frame_unwind_cache): Likewise.
* hppanbsd-tdep.c (hppanbsd_supply_gregset): Likewise.
* hppaobsd-tdep.c (hppaobsd_supply_gregset): Likewise.
(hppaobsd_supply_fpregset): Likewise.
* i386-cygwin-tdep.c (core_process_module_section): Likewise.
* i386-linux-tdep.c (i386_linux_init_abi): Likewise.
* i386-tdep.c (i386_frame_cache): Likewise.
(i386_epilogue_frame_cache): Likewise.
(i386_sigtramp_frame_cache): Likewise.
(i386_supply_gregset): Likewise.
(i386_collect_gregset): Likewise.
(i386_gdbarch_init): Likewise.
* i386obsd-tdep.c (i386obsd_aout_supply_regset): Likewise.
(i386obsd_trapframe_cache): Likewise.
* i387-tdep.c (i387_supply_fsave): Likewise.
(i387_collect_fsave): Likewise.
(i387_supply_fxsave): Likewise.
(i387_collect_fxsave): Likewise.
(i387_supply_xsave): Likewise.
(i387_collect_xsave): Likewise.
* ia64-tdep.c (ia64_frame_cache): Likewise.
(ia64_sigtramp_frame_cache): Likewise.
* infcmd.c (attach_command_continuation): Likewise.
(attach_command_continuation_free_args): Likewise.
* inferior.c (restore_inferior): Likewise.
(delete_thread_of_inferior): Likewise.
* inflow.c (inflow_inferior_data_cleanup): Likewise.
(get_inflow_inferior_data): Likewise.
(inflow_inferior_exit): Likewise.
* infrun.c (displaced_step_clear_cleanup): Likewise.
(restore_current_uiout_cleanup): Likewise.
(release_stop_context_cleanup): Likewise.
(do_restore_infcall_suspend_state_cleanup): Likewise.
(do_restore_infcall_control_state_cleanup): Likewise.
(restore_inferior_ptid): Likewise.
* inline-frame.c (block_starting_point_at): Likewise.
* iq2000-tdep.c (iq2000_frame_cache): Likewise.
* jit.c (get_jit_objfile_data): Likewise.
(get_jit_program_space_data): Likewise.
(jit_object_close_impl): Likewise.
(jit_find_objf_with_entry_addr): Likewise.
(jit_breakpoint_deleted): Likewise.
(jit_unwind_reg_set_impl): Likewise.
(jit_unwind_reg_get_impl): Likewise.
(jit_dealloc_cache): Likewise.
(jit_frame_sniffer): Likewise.
(jit_frame_prev_register): Likewise.
(jit_prepend_unwinder): Likewise.
(jit_inferior_exit_hook): Likewise.
(free_objfile_data): Likewise.
* jv-lang.c (jv_per_objfile_free): Likewise.
(get_dynamics_objfile): Likewise.
(get_java_class_symtab): Likewise.
(builtin_java_type): Likewise.
* language.c (language_string_char_type): Likewise.
(language_bool_type): Likewise.
(language_lookup_primitive_type): Likewise.
(language_lookup_primitive_type_as_symbol): Likewise.
* linespec.c (hash_address_entry): Likewise.
(eq_address_entry): Likewise.
(iterate_inline_only): Likewise.
(iterate_name_matcher): Likewise.
(decode_line_2_compare_items): Likewise.
(collect_one_symbol): Likewise.
(compare_symbols): Likewise.
(compare_msymbols): Likewise.
(add_symtabs_to_list): Likewise.
(collect_symbols): Likewise.
(compare_msyms): Likewise.
(add_minsym): Likewise.
(cleanup_linespec_result): Likewise.
* linux-fork.c (inferior_call_waitpid_cleanup): Likewise.
* linux-nat.c (delete_lwp_cleanup): Likewise.
(count_events_callback): Likewise.
(select_event_lwp_callback): Likewise.
(resume_stopped_resumed_lwps): Likewise.
* linux-tdep.c (get_linux_gdbarch_data): Likewise.
(invalidate_linux_cache_inf): Likewise.
(get_linux_inferior_data): Likewise.
(linux_find_memory_regions_thunk): Likewise.
(linux_make_mappings_callback): Likewise.
(linux_corefile_thread_callback): Likewise.
(find_mapping_size): Likewise.
* linux-thread-db.c (find_new_threads_callback): Likewise.
* lm32-tdep.c (lm32_frame_cache): Likewise.
* m2-lang.c (builtin_m2_type): Likewise.
* m32c-tdep.c (m32c_analyze_frame_prologue): Likewise.
* m32r-linux-tdep.c (m32r_linux_sigtramp_frame_cache): Likewise.
(m32r_linux_supply_gregset): Likewise.
(m32r_linux_collect_gregset): Likewise.
* m32r-tdep.c (m32r_frame_unwind_cache): Likewise.
* m68hc11-tdep.c (m68hc11_frame_unwind_cache): Likewise.
* m68k-tdep.c (m68k_frame_cache): Likewise.
* m68kbsd-tdep.c (m68kbsd_supply_fpregset): Likewise.
(m68kbsd_supply_gregset): Likewise.
* m68klinux-tdep.c (m68k_linux_sigtramp_frame_cache): Likewise.
* m88k-tdep.c (m88k_frame_cache): Likewise.
(m88k_supply_gregset): Likewise.
gdb/gdbserver/ChangeLog:
* dll.c (match_dll): Add cast(s).
(unloaded_dll): Likewise.
* linux-low.c (second_thread_of_pid_p): Likewise.
(delete_lwp_callback): Likewise.
(count_events_callback): Likewise.
(select_event_lwp_callback): Likewise.
(linux_set_resume_request): Likewise.
* server.c (accumulate_file_name_length): Likewise.
(emit_dll_description): Likewise.
(handle_qxfer_threads_worker): Likewise.
(visit_actioned_threads): Likewise.
* thread-db.c (any_thread_of): Likewise.
* tracepoint.c (same_process_p): Likewise.
(match_blocktype): Likewise.
(build_traceframe_info_xml): Likewise.
gdb/testsuite/ChangeLog:
* gdb.gdb/selftest.exp (do_steps_and_nexts): Adjust expected
source line.
2015-09-26 02:08:07 +08:00
|
|
|
return (struct bfin_frame_cache *) *this_cache;
|
2010-12-30 00:11:49 +08:00
|
|
|
|
|
|
|
cache = bfin_alloc_frame_cache ();
|
|
|
|
*this_cache = cache;
|
|
|
|
|
|
|
|
cache->base = get_frame_register_unsigned (this_frame, BFIN_FP_REGNUM);
|
|
|
|
if (cache->base == 0)
|
|
|
|
return cache;
|
|
|
|
|
|
|
|
/* For normal frames, PC is stored at [FP + 4]. */
|
|
|
|
cache->saved_regs[BFIN_PC_REGNUM] = 4;
|
|
|
|
cache->saved_regs[BFIN_FP_REGNUM] = 0;
|
|
|
|
|
|
|
|
/* Adjust all the saved registers such that they contain addresses
|
|
|
|
instead of offsets. */
|
|
|
|
for (i = 0; i < BFIN_NUM_REGS; i++)
|
|
|
|
if (cache->saved_regs[i] != -1)
|
|
|
|
cache->saved_regs[i] += cache->base;
|
|
|
|
|
|
|
|
cache->pc = get_frame_func (this_frame) ;
|
|
|
|
if (cache->pc == 0 || cache->pc == get_frame_pc (this_frame))
|
|
|
|
{
|
|
|
|
/* Either there is no prologue (frameless function) or we are at
|
|
|
|
the start of a function. In short we do not have a frame.
|
|
|
|
PC is stored in rets register. FP points to previous frame. */
|
|
|
|
|
|
|
|
cache->saved_regs[BFIN_PC_REGNUM] =
|
|
|
|
get_frame_register_unsigned (this_frame, BFIN_RETS_REGNUM);
|
|
|
|
cache->frameless_pc_value = 1;
|
|
|
|
cache->base = get_frame_register_unsigned (this_frame, BFIN_FP_REGNUM);
|
|
|
|
cache->saved_regs[BFIN_FP_REGNUM] = cache->base;
|
|
|
|
cache->saved_sp = cache->base;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
cache->frameless_pc_value = 0;
|
|
|
|
|
|
|
|
/* Now that we have the base address for the stack frame we can
|
|
|
|
calculate the value of SP in the calling frame. */
|
|
|
|
cache->saved_sp = cache->base + 8;
|
|
|
|
}
|
|
|
|
|
|
|
|
return cache;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
bfin_frame_this_id (struct frame_info *this_frame,
|
|
|
|
void **this_cache,
|
|
|
|
struct frame_id *this_id)
|
|
|
|
{
|
|
|
|
struct bfin_frame_cache *cache = bfin_frame_cache (this_frame, this_cache);
|
|
|
|
|
|
|
|
/* This marks the outermost frame. */
|
|
|
|
if (cache->base == 0)
|
|
|
|
return;
|
|
|
|
|
|
|
|
/* See the end of bfin_push_dummy_call. */
|
|
|
|
*this_id = frame_id_build (cache->base + 8, cache->pc);
|
|
|
|
}
|
|
|
|
|
|
|
|
static struct value *
|
|
|
|
bfin_frame_prev_register (struct frame_info *this_frame,
|
|
|
|
void **this_cache,
|
|
|
|
int regnum)
|
|
|
|
{
|
|
|
|
struct gdbarch *gdbarch = get_frame_arch (this_frame);
|
|
|
|
struct bfin_frame_cache *cache = bfin_frame_cache (this_frame, this_cache);
|
|
|
|
|
|
|
|
if (regnum == gdbarch_sp_regnum (gdbarch) && cache->saved_sp)
|
|
|
|
return frame_unwind_got_constant (this_frame, regnum, cache->saved_sp);
|
|
|
|
|
|
|
|
if (regnum < BFIN_NUM_REGS && cache->saved_regs[regnum] != -1)
|
|
|
|
return frame_unwind_got_memory (this_frame, regnum,
|
|
|
|
cache->saved_regs[regnum]);
|
|
|
|
|
|
|
|
return frame_unwind_got_register (this_frame, regnum, regnum);
|
|
|
|
}
|
|
|
|
|
|
|
|
static const struct frame_unwind bfin_frame_unwind =
|
|
|
|
{
|
2021-06-30 00:05:03 +08:00
|
|
|
"bfin prologue",
|
2010-12-30 00:11:49 +08:00
|
|
|
NORMAL_FRAME,
|
gdb/
* frame.c (frame_unwind_register): Throw an error if unwinding the
register failed.
* get_prev_frame_1 (get_prev_frame_1): Ask the unwinder if there's
an unwind stop reason.
(frame_stop_reason_string): Handle UNWIND_UNAVAILABLE.
* frame.h (enum unwind_stop_reason) <UNWIND_OUTERMOST,
UNWIND_UNAVAILABLE>: New.
* inline-frame.c (inline_frame_unwind): Install
default_frame_unwind_stop_reason.
* frame-unwind.c: Include "exceptions.h".
(frame_unwind_find_by_frame): Swallow NOT_AVAILABLE_ERROR errors.
(default_frame_unwind_stop_reason): New.
* frame-unwind.h (frame_unwind_stop_reason_ftype): New typedef.
(default_frame_unwind_stop_reason): Declare.
(struct frame_unwind) <stop_reason>: New function pointer.
* dummy-frame.c: Install default_frame_unwind_stop_reason.
* dwarf2-frame.c: Include exceptions.h.
(struct dwarf2_frame_cache) <unavailable_retaddr>: New field.
(dwarf2_frame_cache): Swallow NOT_AVAILABLE_ERROR errors when
computing the CFA. If such an error was thrown, set
unavailable_retaddr.
(dwarf2_frame_unwind_stop_reason): New.
(dwarf2_frame_this_id): Don't build a frame id if the CFA was
unavailable.
(dwarf2_frame_unwind): Install dwarf2_frame_unwind_stop_reason.
(dwarf2_signal_frame_unwind): Ditto.
* amd64-tdep.c: Include "exceptions.h".
(struct amd64_frame_cache): New field "base_p".
(amd64_init_frame_cache): Clear it.
(amd64_frame_cache_1): New, factored out from amd64_frame_cache.
Avoid reading registers with functions that throw if the register
is not necessary to compute the frame base.
(amd64_frame_cache): Reimplement wrapping amd64_frame_cache_1, and
swallowing NOT_AVAILABLE_ERROR.
(amd64_frame_unwind_stop_reason): New.
(amd64_frame_this_id): Don't build a frame id if the frame base
was unavailable.
(amd64_frame_unwind): Install amd64_frame_unwind_stop_reason.
(amd64_sigtramp_frame_cache): Swallow NOT_AVAILABLE_ERROR, and set
base_p if the frame base was computable.
(amd64_sigtramp_frame_unwind_stop_reason): New.
(amd64_sigtramp_frame_this_id): Don't build a frame id if the
frame base was unavailable.
(amd64_sigtramp_frame_unwind): Install
amd64_sigtramp_frame_unwind_stop_reason.
(amd64_epilogue_frame_cache): Swallow NOT_AVAILABLE_ERROR, and set
base_p if the frame base was computable.
(amd64_epilogue_frame_unwind_stop_reason): New.
(amd64_epilogue_frame_this_id): Don't build a frame id if the
frame base was unavailable.
(amd64_epilogue_frame_unwind): Install
amd64_epilogue_frame_unwind_stop_reason.
* i386-tdep.c: Include "exceptions.h".
(struct i386_frame_cache): New field "base_p".
(i386_init_frame_cache): Clear it.
(i386_frame_cache_1): New, factored out from amd64_frame_cache.
Avoid reading registers with functions that throw if the register
is not necessary to compute the frame base.
(i386_frame_cache): Reimplement wrapping amd64_frame_cache_1, and
swallowing NOT_AVAILABLE_ERROR.
(i386_frame_unwind_stop_reason): New.
(i386_frame_this_id): Don't build a frame id if the frame base was
unavailable.
(i386_frame_prev_register): Handle unavailable SP.
(i386_frame_unwind): Install i386_frame_unwind_stop_reason.
(i386_epilogue_frame_cache): Swallow NOT_AVAILABLE_ERROR, and set
base_p if the frame base was computable.
(i386_epilogue_frame_unwind_stop_reason): New.
(i386_epilogue_frame_this_id): Don't build a frame id if the frame
base was unavailable.
(i386_epilogue_frame_unwind): Install
i386_epilogue_frame_unwind_stop_reason.
(i386_sigtramp_frame_cache): Swallow NOT_AVAILABLE_ERROR, and set
base_p if the frame base was computable.
(i386_sigtramp_frame_unwind_stop_reason): New.
(i386_sigtramp_frame_this_id): Don't build a frame id if the frame
base was unavailable.
(i386_sigtramp_frame_unwind): Install
i386_sigtramp_frame_unwind_stop_reason.
* sentinel-frame.c (sentinel_frame_prev_register): Use the value
type's size, not the register's.
(sentinel_frame_unwind): Install default_frame_unwind_stop_reason.
* alpha-mdebug-tdep.c (alpha_mdebug_frame_unwind): Install
default_frame_unwind_stop_reason.
* alpha-tdep.c (alpha_sigtramp_frame_unwind)
(alpha_heuristic_frame_unwind): Ditto.
* amd64obsd-tdep.c (amd64obsd_trapframe_unwind): Ditto.
* arm-tdep.c (arm_prologue_unwind, arm_stub_unwind): Ditto.
* avr-tdep.c (avr_frame_unwind): Ditto.
* cris-tdep.c (cris_sigtramp_frame_unwind, cris_frame_unwind):
Ditto.
* frv-linux-tdep.c (frv_linux_sigtramp_frame_unwind): Ditto.
* frv-tdep.c (frv_frame_unwind): Ditto.
* h8300-tdep.c (h8300_frame_unwind): Ditto.
* hppa-hpux-tdep.c (hppa_hpux_sigtramp_frame_unwind): Ditto.
* hppa-linux-tdep.c (hppa_linux_sigtramp_frame_unwind): Ditto.
* hppa-tdep.c (hppa_frame_unwind, hppa_fallback_frame_unwind)
(hppa_stub_frame_unwind): Ditto.
* i386obsd-tdep.c (i386obsd_trapframe_unwind): Ditto.
* ia64-tdep.c (ia64_frame_unwind, ia64_sigtramp_frame_unwind)
(ia64_libunwind_frame_unwind)
(ia64_libunwind_sigtramp_frame_unwind): Ditto.
* iq2000-tdep.c (iq2000_frame_unwind): Ditto.
* lm32-tdep.c (lm32_frame_unwind): Ditto.
* m32c-tdep.c (m32c_unwind): Ditto.
* m32r-linux-tdep.c (m32r_linux_sigtramp_frame_unwind): Ditto.
* m32r-tdep.c (m32r_frame_unwind): Ditto.
* m68hc11-tdep.c (m68hc11_frame_unwind): Ditto.
* m68k-tdep.c (m68k_frame_unwind): Ditto.
* m68klinux-tdep.c (m68k_linux_sigtramp_frame_unwind): Ditto.
* m88k-tdep.c (m88k_frame_unwind): Ditto.
* mep-tdep.c (mep_frame_unwind): Ditto.
* microblaze-tdep.c (microblaze_frame_unwind): Ditto.
* mips-tdep.c (mips_insn16_frame_unwind, mips_insn32_frame_unwind)
(mips_stub_frame_unwind): Ditto.
* mn10300-tdep.c (mn10300_frame_unwind): Ditto.
* moxie-tdep.c (moxie_frame_unwind): Ditto.
* mt-tdep.c (mt_frame_unwind): Ditto.
* ppc-linux-tdep.c (ppu2spu_unwind): Ditto.
* ppcobsd-tdep.c (ppcobsd_sigtramp_frame_unwind): Ditto.
* rs6000-tdep.c (rs6000_frame_unwind): Ditto.
* s390-tdep.c (s390_frame_unwind, s390_stub_frame_unwind)
(s390_sigtramp_frame_unwind): Ditto.
* score-tdep.c (score_prologue_unwind): Ditto.
* sh-tdep.c (sh_frame_unwind): Ditto.
* sh64-tdep.c (sh64_frame_unwind): Ditto.
* sparc-sol2-tdep.c (sparc32_sol2_sigtramp_frame_unwind): Ditto.
* sparc-tdep.c (sparc32_frame_unwind): Ditto.
* sparc64-sol2-tdep.c (sparc64_sol2_sigtramp_frame_unwind): Ditto.
* sparc64-tdep.c (sparc64_frame_unwind): Ditto.
* sparc64fbsd-tdep.c (sparc64fbsd_sigtramp_frame_unwind): Ditto.
* sparc64nbsd-tdep.c (sparc64nbsd_sigcontext_frame_unwind): Ditto.
* sparc64obsd-tdep.c (sparc64obsd_frame_unwind)
(sparc64obsd_trapframe_unwind): Ditto.
* sparcnbsd-tdep.c (sparc32nbsd_sigcontext_frame_unwind): Ditto.
* sparcobsd-tdep.c (sparc32obsd_sigtramp_frame_unwind): Ditto.
* spu-tdep.c (spu_frame_unwind, spu2ppu_unwind): Ditto.
* v850-tdep.c (v850_frame_unwind): Ditto.
* vax-tdep.c (vax_frame_unwind): Ditto.
* vaxobsd-tdep.c (vaxobsd_sigtramp_frame_unwind): Ditto.
* xstormy16-tdep.c (frame_unwind xstormy16_frame_unwind): Ditto.
* xtensa-tdep.c (xtensa_unwind): Ditto.
2011-03-19 02:52:32 +08:00
|
|
|
default_frame_unwind_stop_reason,
|
2010-12-30 00:11:49 +08:00
|
|
|
bfin_frame_this_id,
|
|
|
|
bfin_frame_prev_register,
|
|
|
|
NULL,
|
|
|
|
default_frame_sniffer
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Check for "[--SP] = <reg>;" insns. These are appear in function
|
|
|
|
prologues to save misc registers onto the stack. */
|
|
|
|
|
|
|
|
static int
|
|
|
|
is_minus_minus_sp (int op)
|
|
|
|
{
|
|
|
|
op &= 0xFFC0;
|
|
|
|
|
|
|
|
if ((op == P_MINUS_SP1) || (op == P_MINUS_SP2)
|
|
|
|
|| (op == P_MINUS_SP3) || (op == P_MINUS_SP4))
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Skip all the insns that appear in generated function prologues. */
|
|
|
|
|
|
|
|
static CORE_ADDR
|
|
|
|
bfin_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
|
|
|
|
{
|
|
|
|
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
|
|
|
|
int op = read_memory_unsigned_integer (pc, 2, byte_order);
|
|
|
|
CORE_ADDR orig_pc = pc;
|
|
|
|
int done = 0;
|
|
|
|
|
|
|
|
/* The new gcc prologue generates the register saves BEFORE the link
|
|
|
|
or RETS saving instruction.
|
|
|
|
So, our job is to stop either at those instructions or some upper
|
|
|
|
limit saying there is no frame! */
|
|
|
|
|
|
|
|
while (!done)
|
|
|
|
{
|
|
|
|
if (is_minus_minus_sp (op))
|
|
|
|
{
|
|
|
|
while (is_minus_minus_sp (op))
|
|
|
|
{
|
|
|
|
pc += 2;
|
|
|
|
op = read_memory_unsigned_integer (pc, 2, byte_order);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (op == P_LINKAGE)
|
|
|
|
pc += 4;
|
|
|
|
|
|
|
|
done = 1;
|
|
|
|
}
|
|
|
|
else if (op == P_LINKAGE)
|
|
|
|
{
|
|
|
|
pc += 4;
|
|
|
|
done = 1;
|
|
|
|
}
|
|
|
|
else if (op == P_MINUS_MINUS_SP_EQ_RETS)
|
|
|
|
{
|
|
|
|
pc += 2;
|
|
|
|
done = 1;
|
|
|
|
}
|
|
|
|
else if (op == P_RTS)
|
|
|
|
{
|
|
|
|
done = 1;
|
|
|
|
}
|
|
|
|
else if ((op >= P_JUMP_PREG_MIN && op <= P_JUMP_PREG_MAX)
|
|
|
|
|| (op >= P_JUMP_PC_PLUS_PREG_MIN
|
|
|
|
&& op <= P_JUMP_PC_PLUS_PREG_MAX)
|
|
|
|
|| (op == P_JUMP_S_MIN && op <= P_JUMP_S_MAX))
|
|
|
|
{
|
|
|
|
done = 1;
|
|
|
|
}
|
|
|
|
else if (pc - orig_pc >= UPPER_LIMIT)
|
|
|
|
{
|
|
|
|
warning (_("Function Prologue not recognised; "
|
|
|
|
"pc will point to ENTRY_POINT of the function"));
|
|
|
|
pc = orig_pc + 2;
|
|
|
|
done = 1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
pc += 2; /* Not a terminating instruction go on. */
|
|
|
|
op = read_memory_unsigned_integer (pc, 2, byte_order);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* TODO:
|
|
|
|
Dwarf2 uses entry point value AFTER some register initializations.
|
|
|
|
We should perhaps skip such asssignments as well (R6 = R1, ...). */
|
|
|
|
|
|
|
|
return pc;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Return the GDB type object for the "standard" data type of data in
|
|
|
|
register N. This should be void pointer for P0-P5, SP, FP;
|
|
|
|
void pointer to function for PC; int otherwise. */
|
|
|
|
|
|
|
|
static struct type *
|
|
|
|
bfin_register_type (struct gdbarch *gdbarch, int regnum)
|
|
|
|
{
|
|
|
|
if ((regnum >= BFIN_P0_REGNUM && regnum <= BFIN_FP_REGNUM)
|
|
|
|
|| regnum == BFIN_USP_REGNUM)
|
|
|
|
return builtin_type (gdbarch)->builtin_data_ptr;
|
|
|
|
|
2010-12-31 01:36:26 +08:00
|
|
|
if (regnum == BFIN_PC_REGNUM || regnum == BFIN_RETS_REGNUM
|
|
|
|
|| regnum == BFIN_RETI_REGNUM || regnum == BFIN_RETX_REGNUM
|
|
|
|
|| regnum == BFIN_RETN_REGNUM || regnum == BFIN_RETE_REGNUM
|
|
|
|
|| regnum == BFIN_LT0_REGNUM || regnum == BFIN_LB0_REGNUM
|
|
|
|
|| regnum == BFIN_LT1_REGNUM || regnum == BFIN_LB1_REGNUM)
|
2010-12-30 00:11:49 +08:00
|
|
|
return builtin_type (gdbarch)->builtin_func_ptr;
|
|
|
|
|
|
|
|
return builtin_type (gdbarch)->builtin_int32;
|
|
|
|
}
|
|
|
|
|
|
|
|
static CORE_ADDR
|
|
|
|
bfin_push_dummy_call (struct gdbarch *gdbarch,
|
|
|
|
struct value *function,
|
|
|
|
struct regcache *regcache,
|
|
|
|
CORE_ADDR bp_addr,
|
|
|
|
int nargs,
|
|
|
|
struct value **args,
|
|
|
|
CORE_ADDR sp,
|
2018-11-16 19:21:04 +08:00
|
|
|
function_call_return_method return_method,
|
2010-12-30 00:11:49 +08:00
|
|
|
CORE_ADDR struct_addr)
|
|
|
|
{
|
|
|
|
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
|
|
|
|
int i;
|
|
|
|
long reg_r0, reg_r1, reg_r2;
|
|
|
|
int total_len = 0;
|
|
|
|
|
|
|
|
for (i = nargs - 1; i >= 0; i--)
|
|
|
|
{
|
|
|
|
struct type *value_type = value_enclosing_type (args[i]);
|
|
|
|
|
2015-06-19 16:24:13 +08:00
|
|
|
total_len += align_up (TYPE_LENGTH (value_type), 4);
|
2010-12-30 00:11:49 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/* At least twelve bytes of stack space must be allocated for the function's
|
|
|
|
arguments, even for functions that have less than 12 bytes of argument
|
|
|
|
data. */
|
|
|
|
|
|
|
|
if (total_len < 12)
|
|
|
|
sp -= 12 - total_len;
|
|
|
|
|
|
|
|
/* Push arguments in reverse order. */
|
|
|
|
|
|
|
|
for (i = nargs - 1; i >= 0; i--)
|
|
|
|
{
|
|
|
|
struct type *value_type = value_enclosing_type (args[i]);
|
|
|
|
struct type *arg_type = check_typedef (value_type);
|
2015-06-19 16:24:13 +08:00
|
|
|
int container_len = align_up (TYPE_LENGTH (arg_type), 4);
|
2010-12-30 00:11:49 +08:00
|
|
|
|
|
|
|
sp -= container_len;
|
2021-10-05 08:47:06 +08:00
|
|
|
write_memory (sp, value_contents (args[i]).data (), container_len);
|
2010-12-30 00:11:49 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Initialize R0, R1, and R2 to the first 3 words of parameters. */
|
|
|
|
|
|
|
|
reg_r0 = read_memory_integer (sp, 4, byte_order);
|
|
|
|
regcache_cooked_write_unsigned (regcache, BFIN_R0_REGNUM, reg_r0);
|
|
|
|
reg_r1 = read_memory_integer (sp + 4, 4, byte_order);
|
|
|
|
regcache_cooked_write_unsigned (regcache, BFIN_R1_REGNUM, reg_r1);
|
|
|
|
reg_r2 = read_memory_integer (sp + 8, 4, byte_order);
|
|
|
|
regcache_cooked_write_unsigned (regcache, BFIN_R2_REGNUM, reg_r2);
|
|
|
|
|
|
|
|
/* Store struct value address. */
|
|
|
|
|
2018-11-16 19:21:04 +08:00
|
|
|
if (return_method == return_method_struct)
|
2010-12-30 00:11:49 +08:00
|
|
|
regcache_cooked_write_unsigned (regcache, BFIN_P0_REGNUM, struct_addr);
|
|
|
|
|
|
|
|
/* Set the dummy return value to bp_addr.
|
|
|
|
A dummy breakpoint will be setup to execute the call. */
|
|
|
|
|
|
|
|
regcache_cooked_write_unsigned (regcache, BFIN_RETS_REGNUM, bp_addr);
|
|
|
|
|
|
|
|
/* Finally, update the stack pointer. */
|
|
|
|
|
|
|
|
regcache_cooked_write_unsigned (regcache, BFIN_SP_REGNUM, sp);
|
|
|
|
|
|
|
|
return sp;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Convert DWARF2 register number REG to the appropriate register number
|
|
|
|
used by GDB. */
|
|
|
|
|
|
|
|
static int
|
|
|
|
bfin_reg_to_regnum (struct gdbarch *gdbarch, int reg)
|
|
|
|
{
|
2015-10-27 07:05:21 +08:00
|
|
|
if (reg < 0 || reg >= ARRAY_SIZE (map_gcc_gdb))
|
|
|
|
return -1;
|
2010-12-30 00:11:49 +08:00
|
|
|
|
|
|
|
return map_gcc_gdb[reg];
|
|
|
|
}
|
|
|
|
|
New gdbarch methods breakpoint_kind_from_pc and sw_breakpoint_from_kind
This patch adds two gdbarch methods breakpoint_kind_from_pc and
sw_breakpoint_from_kind, and uses target_info.placed_size as "kind"
of the breakpoint. This patch updates the usages of
target_info.placed_size.
The "kind" of a breakpoint is determined by gdbarch rather than
target, so we have gdbarch method breakpoint_kind_from_pc, and we
should set target_info.placed_size out of each implementation of
target to_insert_breakpoint. In this way, each target doesn't have
to set target_info.placed_size any more.
This patch also sets target_info.placed_address before
target_insert_breakpoint too, so that target to_insert_breakpoint
can use it, see record_full_insert_breakpoint.
Before we call target_insert_breakpoint, we set
target_info.placed_address and target_info.placed_size like this,
CORE_ADDR addr = bl->target_info.reqstd_address;
bl->target_info.placed_size = gdbarch_breakpoint_kind_from_pc (bl->gdbarch, &addr);
bl->target_info.placed_address = addr;
return target_insert_breakpoint (bl->gdbarch, &bl->target_info);
target_insert_breakpoint may fail, but it doesn't matter to the "kind"
and "placed_address" of a breakpoint. They should be determined by
gdbarch.
gdb:
2016-11-03 Yao Qi <yao.qi@linaro.org>
* arch-utils.h (GDBARCH_BREAKPOINT_MANIPULATION): Define
breakpoint_kind_from_pc and sw_breakpoint_from_kind.
(GDBARCH_BREAKPOINT_MANIPULATION_ENDIAN): Likewise.
(SET_GDBARCH_BREAKPOINT_MANIPULATION): Call
set_gdbarch_breakpoint_kind_from_pc and
set_gdbarch_sw_breakpoint_from_kind.
* arm-tdep.c: Add comments.
* bfin-tdep.c: Likewise.
* breakpoint.c (breakpoint_kind): New function.
(insert_bp_location): Set target_info.placed_size and
target_info.placed_address.
(bkpt_insert_location): Likewise.
* cris-tdep.c: Add comments.
* gdbarch.sh (breakpoint_kind_from_pc): New.
(sw_breakpoint_from_kind): New.
* gdbarch.c, gdbarch.h: Regenerated.
* ia64-tdep.c (ia64_memory_insert_breakpoint): Don't set
bp_tgt->placed_size.
(ia64_memory_remove_breakpoint): Don't assert
bp_tgt->placed_size.
(ia64_breakpoint_kind_from_pc): New function.
(ia64_gdbarch_init): Install ia64_breakpoint_kind_from_pc.
* m32r-tdep.c (m32r_memory_insert_breakpoint): Don't set
bp_tgt->placed_size.
* mem-break.c (default_memory_insert_breakpoint): Don't set
bp_tgt->placed_size. Call gdbarch_sw_breakpoint_from_kind.
(default_memory_remove_breakpoint): Call
gdbarch_sw_breakpoint_from_kind.
(memory_validate_breakpoint): Don't check bp_tgt->placed_size.
* mips-tdep.c: Add comments.
* mt-tdep.c: Likewise.
* nios2-tdep.c: Likewise.
* record-full.c (record_full_insert_breakpoint): Don't call
gdbarch_breakpoint_from_pc. Don't set bp_tgt->placed_address
and bp_tgt->placed_size.
* remote.c (remote_insert_breakpoint): Don't call
gdbarch_remote_breakpoint_from_pc. Use bp_tgt->placed_size.
Don't set bp_tgt->placed_address and bp_tgt->placed_size.
(remote_insert_hw_breakpoint): Likewise.
* score-tdep.c: Likewise.
* sh-tdep.c: Likewise.
* tic6x-tdep.c: Likewise.
* v850-tdep.c: Likewise.
* xtensa-tdep.c: Likewise.
2016-11-03 22:35:13 +08:00
|
|
|
/* Implement the breakpoint_kind_from_pc gdbarch method. */
|
|
|
|
|
2016-11-03 22:35:13 +08:00
|
|
|
static int
|
|
|
|
bfin_breakpoint_kind_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr)
|
2010-12-30 00:11:49 +08:00
|
|
|
{
|
|
|
|
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
|
|
|
|
unsigned short iw;
|
|
|
|
|
|
|
|
iw = read_memory_unsigned_integer (*pcptr, 2, byte_order);
|
|
|
|
|
|
|
|
if ((iw & 0xf000) >= 0xc000)
|
|
|
|
/* 32-bit instruction. */
|
2016-11-03 22:35:13 +08:00
|
|
|
return 4;
|
2010-12-30 00:11:49 +08:00
|
|
|
else
|
2016-11-03 22:35:13 +08:00
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
|
New gdbarch methods breakpoint_kind_from_pc and sw_breakpoint_from_kind
This patch adds two gdbarch methods breakpoint_kind_from_pc and
sw_breakpoint_from_kind, and uses target_info.placed_size as "kind"
of the breakpoint. This patch updates the usages of
target_info.placed_size.
The "kind" of a breakpoint is determined by gdbarch rather than
target, so we have gdbarch method breakpoint_kind_from_pc, and we
should set target_info.placed_size out of each implementation of
target to_insert_breakpoint. In this way, each target doesn't have
to set target_info.placed_size any more.
This patch also sets target_info.placed_address before
target_insert_breakpoint too, so that target to_insert_breakpoint
can use it, see record_full_insert_breakpoint.
Before we call target_insert_breakpoint, we set
target_info.placed_address and target_info.placed_size like this,
CORE_ADDR addr = bl->target_info.reqstd_address;
bl->target_info.placed_size = gdbarch_breakpoint_kind_from_pc (bl->gdbarch, &addr);
bl->target_info.placed_address = addr;
return target_insert_breakpoint (bl->gdbarch, &bl->target_info);
target_insert_breakpoint may fail, but it doesn't matter to the "kind"
and "placed_address" of a breakpoint. They should be determined by
gdbarch.
gdb:
2016-11-03 Yao Qi <yao.qi@linaro.org>
* arch-utils.h (GDBARCH_BREAKPOINT_MANIPULATION): Define
breakpoint_kind_from_pc and sw_breakpoint_from_kind.
(GDBARCH_BREAKPOINT_MANIPULATION_ENDIAN): Likewise.
(SET_GDBARCH_BREAKPOINT_MANIPULATION): Call
set_gdbarch_breakpoint_kind_from_pc and
set_gdbarch_sw_breakpoint_from_kind.
* arm-tdep.c: Add comments.
* bfin-tdep.c: Likewise.
* breakpoint.c (breakpoint_kind): New function.
(insert_bp_location): Set target_info.placed_size and
target_info.placed_address.
(bkpt_insert_location): Likewise.
* cris-tdep.c: Add comments.
* gdbarch.sh (breakpoint_kind_from_pc): New.
(sw_breakpoint_from_kind): New.
* gdbarch.c, gdbarch.h: Regenerated.
* ia64-tdep.c (ia64_memory_insert_breakpoint): Don't set
bp_tgt->placed_size.
(ia64_memory_remove_breakpoint): Don't assert
bp_tgt->placed_size.
(ia64_breakpoint_kind_from_pc): New function.
(ia64_gdbarch_init): Install ia64_breakpoint_kind_from_pc.
* m32r-tdep.c (m32r_memory_insert_breakpoint): Don't set
bp_tgt->placed_size.
* mem-break.c (default_memory_insert_breakpoint): Don't set
bp_tgt->placed_size. Call gdbarch_sw_breakpoint_from_kind.
(default_memory_remove_breakpoint): Call
gdbarch_sw_breakpoint_from_kind.
(memory_validate_breakpoint): Don't check bp_tgt->placed_size.
* mips-tdep.c: Add comments.
* mt-tdep.c: Likewise.
* nios2-tdep.c: Likewise.
* record-full.c (record_full_insert_breakpoint): Don't call
gdbarch_breakpoint_from_pc. Don't set bp_tgt->placed_address
and bp_tgt->placed_size.
* remote.c (remote_insert_breakpoint): Don't call
gdbarch_remote_breakpoint_from_pc. Use bp_tgt->placed_size.
Don't set bp_tgt->placed_address and bp_tgt->placed_size.
(remote_insert_hw_breakpoint): Likewise.
* score-tdep.c: Likewise.
* sh-tdep.c: Likewise.
* tic6x-tdep.c: Likewise.
* v850-tdep.c: Likewise.
* xtensa-tdep.c: Likewise.
2016-11-03 22:35:13 +08:00
|
|
|
/* Implement the sw_breakpoint_from_kind gdbarch method. */
|
|
|
|
|
2016-11-03 22:35:13 +08:00
|
|
|
static const gdb_byte *
|
|
|
|
bfin_sw_breakpoint_from_kind (struct gdbarch *gdbarch, int kind, int *size)
|
|
|
|
{
|
|
|
|
static unsigned char bfin_breakpoint[] = {0xa1, 0x00, 0x00, 0x00};
|
|
|
|
static unsigned char bfin_sim_breakpoint[] = {0x25, 0x00, 0x00, 0x00};
|
|
|
|
|
|
|
|
*size = kind;
|
2010-12-30 00:11:49 +08:00
|
|
|
|
2021-03-25 06:07:30 +08:00
|
|
|
if (strcmp (target_shortname (), "sim") == 0)
|
2010-12-30 00:11:49 +08:00
|
|
|
return bfin_sim_breakpoint;
|
|
|
|
else
|
|
|
|
return bfin_breakpoint;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
bfin_extract_return_value (struct type *type,
|
|
|
|
struct regcache *regs,
|
|
|
|
gdb_byte *dst)
|
|
|
|
{
|
2017-10-25 23:37:03 +08:00
|
|
|
struct gdbarch *gdbarch = regs->arch ();
|
2010-12-30 00:11:49 +08:00
|
|
|
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
|
|
|
|
bfd_byte *valbuf = dst;
|
|
|
|
int len = TYPE_LENGTH (type);
|
|
|
|
ULONGEST tmp;
|
|
|
|
int regno = BFIN_R0_REGNUM;
|
|
|
|
|
2012-09-27 18:40:01 +08:00
|
|
|
gdb_assert (len <= 8);
|
2010-12-30 00:11:49 +08:00
|
|
|
|
|
|
|
while (len > 0)
|
|
|
|
{
|
|
|
|
regcache_cooked_read_unsigned (regs, regno++, &tmp);
|
2011-07-21 00:52:36 +08:00
|
|
|
store_unsigned_integer (valbuf, (len > 4 ? 4 : len), byte_order, tmp);
|
2010-12-30 00:11:49 +08:00
|
|
|
len -= 4;
|
|
|
|
valbuf += 4;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Write into appropriate registers a function return value of type
|
|
|
|
TYPE, given in virtual format. */
|
|
|
|
|
|
|
|
static void
|
|
|
|
bfin_store_return_value (struct type *type,
|
|
|
|
struct regcache *regs,
|
|
|
|
const gdb_byte *src)
|
|
|
|
{
|
|
|
|
const bfd_byte *valbuf = src;
|
|
|
|
|
|
|
|
/* Integral values greater than one word are stored in consecutive
|
|
|
|
registers starting with R0. This will always be a multiple of
|
|
|
|
the register size. */
|
|
|
|
|
|
|
|
int len = TYPE_LENGTH (type);
|
|
|
|
int regno = BFIN_R0_REGNUM;
|
|
|
|
|
2012-09-27 18:40:01 +08:00
|
|
|
gdb_assert (len <= 8);
|
2010-12-30 00:11:49 +08:00
|
|
|
|
|
|
|
while (len > 0)
|
|
|
|
{
|
2018-05-31 02:54:42 +08:00
|
|
|
regs->cooked_write (regno++, valbuf);
|
2010-12-30 00:11:49 +08:00
|
|
|
len -= 4;
|
|
|
|
valbuf += 4;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Determine, for architecture GDBARCH, how a return value of TYPE
|
|
|
|
should be returned. If it is supposed to be returned in registers,
|
|
|
|
and READBUF is nonzero, read the appropriate value from REGCACHE,
|
|
|
|
and copy it into READBUF. If WRITEBUF is nonzero, write the value
|
|
|
|
from WRITEBUF into REGCACHE. */
|
|
|
|
|
|
|
|
static enum return_value_convention
|
|
|
|
bfin_return_value (struct gdbarch *gdbarch,
|
2012-05-16 22:35:09 +08:00
|
|
|
struct value *function,
|
2010-12-30 00:11:49 +08:00
|
|
|
struct type *type,
|
|
|
|
struct regcache *regcache,
|
|
|
|
gdb_byte *readbuf,
|
|
|
|
const gdb_byte *writebuf)
|
|
|
|
{
|
|
|
|
if (TYPE_LENGTH (type) > 8)
|
|
|
|
return RETURN_VALUE_STRUCT_CONVENTION;
|
|
|
|
|
|
|
|
if (readbuf)
|
|
|
|
bfin_extract_return_value (type, regcache, readbuf);
|
|
|
|
|
|
|
|
if (writebuf)
|
|
|
|
bfin_store_return_value (type, regcache, writebuf);
|
|
|
|
|
|
|
|
return RETURN_VALUE_REGISTER_CONVENTION;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Return the BFIN register name corresponding to register I. */
|
|
|
|
|
|
|
|
static const char *
|
|
|
|
bfin_register_name (struct gdbarch *gdbarch, int i)
|
|
|
|
{
|
|
|
|
return bfin_register_name_strings[i];
|
|
|
|
}
|
|
|
|
|
gdb/
* regcache.h (regcache_raw_read, regcache_raw_read_signed)
(regcache_raw_read_unsigned, regcache_raw_read_signed)
(regcache_raw_read_unsigned, regcache_raw_read_part)
(regcache_cooked_read, regcache_cooked_read_signed)
(regcache_cooked_read_unsigned, regcache_cooked_read_part)
(regcache_cooked_read_ftype): Change return to enum
register_status.
* regcache.c: Include exceptions.h
(regcache_save): Adjust to handle REG_UNAVAILABLE registers.
(do_cooked_read): Change return to enum register_status. Always
forward to regcache_cooked_read.
(regcache_raw_read): Change return to enum register_status. If
the register is not REG_VALID, memset the buffer. Return the
register's status.
(regcache_raw_read_signed): Handle non-REG_VALID registers and
return the register's status.
(regcache_raw_read_unsigned): Ditto.
(regcache_cooked_read): Change return to enum register_status.
Assert that with read-only regcaches, the register's status must
be known. If the regcache is read-only, and the register is not
REG_VALID, memset the buffer. Return the register's status.
(regcache_cooked_read_signed): Change return to enum
register_status. Handle non-REG_VALID registers and return the
register's status.
(regcache_cooked_read_unsigned): Change return to enum
register_status. Handle non-REG_VALID registers and return the
register's status.
(regcache_xfer_part, regcache_raw_read_part)
(regcache_cooked_read_part): Change return to enum
register_status. Return the register's status.
(regcache_read_pc): Throw NOT_AVAILABLE_ERROR if the register is
unavailable.
(regcache_dump): Handle unavailable cooked registers.
* frame.c (do_frame_register_read): Adjust interface to match
regcache_cooked_read_ftype.
* gdbarch.sh (pseudo_register_read): Change return to enum
register_status.
* gdbarch.h, gdbarch.c: Regenerate.
* i386-tdep.h (i386_pseudo_register_read): Change return to enum
register_status.
* i386-tdep.c (i386_pseudo_register_read): Change return to enum
register_status. If reading a raw register indicates the raw
register is not valid, return the raw register's status,
otherwise, return REG_VALID.
* amd64-tdep.c (amd64_pseudo_register_read): Change return to enum
register_status. Handle non-REG_VALID raw registers and return
the register's status.
* arm-tdep.c (arm_neon_quad_read)
(arm_pseudo_read): Change return to enum register_status. Handle
non-REG_VALID raw registers and return the register's status.
* avr-tdep.c (avr_pseudo_register_read): Ditto.
* frv-tdep.c (frv_pseudo_register_read): Ditto.
* h8300-tdep.c (h8300_pseudo_register_read): Ditto.
* hppa-tdep.c (hppa_pseudo_register_read): Ditto.
* m32c-tdep.c (m32c_move_reg_t): Change return to enum
register_status.
(m32c_raw_read, m32c_raw_write, m32c_banked_read)
(m32c_banked_write, m32c_sb_read, m32c_sb_write, m32c_part_read)
(m32c_part_write, m32c_cat_read, m32c_cat_write)
(m32c_r3r2r1r0_read, m32c_r3r2r1r0_write)
(m32c_pseudo_register_read): Change return to enum
register_status. Adjust.
* m68hc11-tdep.c (m68hc11_pseudo_register_read): Change return to
enum register_status. Return the register's status.
* mep-tdep.c (mep_pseudo_cr32_read): Change return to enum
register_status. Return the register's status.
(mep_pseudo_cr64_read, mep_pseudo_register_read): Ditto.
* mips-tdep.c (mips_pseudo_register_read): Ditto.
* mt-tdep.c (mt_pseudo_register_read): Ditto.
* rs6000-tdep.c (move_ev_register_func): New typedef.
(e500_move_ev_register): Use it. Change return to enum
register_status. Return the register's status.
(do_regcache_raw_read): New function.
(do_regcache_raw_write): New function.
(e500_pseudo_register_read): Change return to enum
register_status. Return the register's status. Use
do_regcache_raw_read.
(e500_pseudo_register_write): Adjust. Use do_regcache_raw_write.
(dfp_pseudo_register_read): Change return to enum register_status.
Return the register's status.
(vsx_pseudo_register_read): Ditto.
(efpr_pseudo_register_read): Ditto.
(rs6000_pseudo_register_read): Ditto.
* s390-tdep.c (s390_pseudo_register_read): Change return to enum
register_status. Return the register's status.
* sh64-tdep.c (pseudo_register_read_portions): New function.
(sh64_pseudo_register_read): Change return to enum
register_status. Use pseudo_register_read_portions. Return the
register's status.
* ia64-tdep.c (ia64_pseudo_register_read): Change return to enum
register_status. Return the register's status.
* sh-tdep.c (pseudo_register_read_portions): New function.
(sh_pseudo_register_read): Change return to enum register_status.
Use pseudo_register_read_portions. Return the register's status.
* sparc-tdep.c (sparc32_pseudo_register_read): Change return to
enum register_status. Return the register's status.
* sparc64-tdep.c (sparc64_pseudo_register_read): Ditto.
* spu-tdep.c (spu_pseudo_register_read_spu)
(spu_pseudo_register_read): Ditto.
* xtensa-tdep.c (xtensa_register_read_masked)
(xtensa_pseudo_register_read): Ditto.
* bfin-tdep.c (bfin_pseudo_register_read): Ditto.
2011-03-19 02:38:44 +08:00
|
|
|
static enum register_status
|
2018-02-21 19:20:03 +08:00
|
|
|
bfin_pseudo_register_read (struct gdbarch *gdbarch, readable_regcache *regcache,
|
2010-12-30 00:11:49 +08:00
|
|
|
int regnum, gdb_byte *buffer)
|
|
|
|
{
|
2017-04-07 16:31:37 +08:00
|
|
|
gdb_byte buf[BFIN_MAX_REGISTER_SIZE];
|
gdb/
* regcache.h (regcache_raw_read, regcache_raw_read_signed)
(regcache_raw_read_unsigned, regcache_raw_read_signed)
(regcache_raw_read_unsigned, regcache_raw_read_part)
(regcache_cooked_read, regcache_cooked_read_signed)
(regcache_cooked_read_unsigned, regcache_cooked_read_part)
(regcache_cooked_read_ftype): Change return to enum
register_status.
* regcache.c: Include exceptions.h
(regcache_save): Adjust to handle REG_UNAVAILABLE registers.
(do_cooked_read): Change return to enum register_status. Always
forward to regcache_cooked_read.
(regcache_raw_read): Change return to enum register_status. If
the register is not REG_VALID, memset the buffer. Return the
register's status.
(regcache_raw_read_signed): Handle non-REG_VALID registers and
return the register's status.
(regcache_raw_read_unsigned): Ditto.
(regcache_cooked_read): Change return to enum register_status.
Assert that with read-only regcaches, the register's status must
be known. If the regcache is read-only, and the register is not
REG_VALID, memset the buffer. Return the register's status.
(regcache_cooked_read_signed): Change return to enum
register_status. Handle non-REG_VALID registers and return the
register's status.
(regcache_cooked_read_unsigned): Change return to enum
register_status. Handle non-REG_VALID registers and return the
register's status.
(regcache_xfer_part, regcache_raw_read_part)
(regcache_cooked_read_part): Change return to enum
register_status. Return the register's status.
(regcache_read_pc): Throw NOT_AVAILABLE_ERROR if the register is
unavailable.
(regcache_dump): Handle unavailable cooked registers.
* frame.c (do_frame_register_read): Adjust interface to match
regcache_cooked_read_ftype.
* gdbarch.sh (pseudo_register_read): Change return to enum
register_status.
* gdbarch.h, gdbarch.c: Regenerate.
* i386-tdep.h (i386_pseudo_register_read): Change return to enum
register_status.
* i386-tdep.c (i386_pseudo_register_read): Change return to enum
register_status. If reading a raw register indicates the raw
register is not valid, return the raw register's status,
otherwise, return REG_VALID.
* amd64-tdep.c (amd64_pseudo_register_read): Change return to enum
register_status. Handle non-REG_VALID raw registers and return
the register's status.
* arm-tdep.c (arm_neon_quad_read)
(arm_pseudo_read): Change return to enum register_status. Handle
non-REG_VALID raw registers and return the register's status.
* avr-tdep.c (avr_pseudo_register_read): Ditto.
* frv-tdep.c (frv_pseudo_register_read): Ditto.
* h8300-tdep.c (h8300_pseudo_register_read): Ditto.
* hppa-tdep.c (hppa_pseudo_register_read): Ditto.
* m32c-tdep.c (m32c_move_reg_t): Change return to enum
register_status.
(m32c_raw_read, m32c_raw_write, m32c_banked_read)
(m32c_banked_write, m32c_sb_read, m32c_sb_write, m32c_part_read)
(m32c_part_write, m32c_cat_read, m32c_cat_write)
(m32c_r3r2r1r0_read, m32c_r3r2r1r0_write)
(m32c_pseudo_register_read): Change return to enum
register_status. Adjust.
* m68hc11-tdep.c (m68hc11_pseudo_register_read): Change return to
enum register_status. Return the register's status.
* mep-tdep.c (mep_pseudo_cr32_read): Change return to enum
register_status. Return the register's status.
(mep_pseudo_cr64_read, mep_pseudo_register_read): Ditto.
* mips-tdep.c (mips_pseudo_register_read): Ditto.
* mt-tdep.c (mt_pseudo_register_read): Ditto.
* rs6000-tdep.c (move_ev_register_func): New typedef.
(e500_move_ev_register): Use it. Change return to enum
register_status. Return the register's status.
(do_regcache_raw_read): New function.
(do_regcache_raw_write): New function.
(e500_pseudo_register_read): Change return to enum
register_status. Return the register's status. Use
do_regcache_raw_read.
(e500_pseudo_register_write): Adjust. Use do_regcache_raw_write.
(dfp_pseudo_register_read): Change return to enum register_status.
Return the register's status.
(vsx_pseudo_register_read): Ditto.
(efpr_pseudo_register_read): Ditto.
(rs6000_pseudo_register_read): Ditto.
* s390-tdep.c (s390_pseudo_register_read): Change return to enum
register_status. Return the register's status.
* sh64-tdep.c (pseudo_register_read_portions): New function.
(sh64_pseudo_register_read): Change return to enum
register_status. Use pseudo_register_read_portions. Return the
register's status.
* ia64-tdep.c (ia64_pseudo_register_read): Change return to enum
register_status. Return the register's status.
* sh-tdep.c (pseudo_register_read_portions): New function.
(sh_pseudo_register_read): Change return to enum register_status.
Use pseudo_register_read_portions. Return the register's status.
* sparc-tdep.c (sparc32_pseudo_register_read): Change return to
enum register_status. Return the register's status.
* sparc64-tdep.c (sparc64_pseudo_register_read): Ditto.
* spu-tdep.c (spu_pseudo_register_read_spu)
(spu_pseudo_register_read): Ditto.
* xtensa-tdep.c (xtensa_register_read_masked)
(xtensa_pseudo_register_read): Ditto.
* bfin-tdep.c (bfin_pseudo_register_read): Ditto.
2011-03-19 02:38:44 +08:00
|
|
|
enum register_status status;
|
2010-12-30 00:11:49 +08:00
|
|
|
|
|
|
|
if (regnum != BFIN_CC_REGNUM)
|
|
|
|
internal_error (__FILE__, __LINE__,
|
|
|
|
_("invalid register number %d"), regnum);
|
|
|
|
|
|
|
|
/* Extract the CC bit from the ASTAT register. */
|
2018-01-22 19:02:49 +08:00
|
|
|
status = regcache->raw_read (BFIN_ASTAT_REGNUM, buf);
|
gdb/
* regcache.h (regcache_raw_read, regcache_raw_read_signed)
(regcache_raw_read_unsigned, regcache_raw_read_signed)
(regcache_raw_read_unsigned, regcache_raw_read_part)
(regcache_cooked_read, regcache_cooked_read_signed)
(regcache_cooked_read_unsigned, regcache_cooked_read_part)
(regcache_cooked_read_ftype): Change return to enum
register_status.
* regcache.c: Include exceptions.h
(regcache_save): Adjust to handle REG_UNAVAILABLE registers.
(do_cooked_read): Change return to enum register_status. Always
forward to regcache_cooked_read.
(regcache_raw_read): Change return to enum register_status. If
the register is not REG_VALID, memset the buffer. Return the
register's status.
(regcache_raw_read_signed): Handle non-REG_VALID registers and
return the register's status.
(regcache_raw_read_unsigned): Ditto.
(regcache_cooked_read): Change return to enum register_status.
Assert that with read-only regcaches, the register's status must
be known. If the regcache is read-only, and the register is not
REG_VALID, memset the buffer. Return the register's status.
(regcache_cooked_read_signed): Change return to enum
register_status. Handle non-REG_VALID registers and return the
register's status.
(regcache_cooked_read_unsigned): Change return to enum
register_status. Handle non-REG_VALID registers and return the
register's status.
(regcache_xfer_part, regcache_raw_read_part)
(regcache_cooked_read_part): Change return to enum
register_status. Return the register's status.
(regcache_read_pc): Throw NOT_AVAILABLE_ERROR if the register is
unavailable.
(regcache_dump): Handle unavailable cooked registers.
* frame.c (do_frame_register_read): Adjust interface to match
regcache_cooked_read_ftype.
* gdbarch.sh (pseudo_register_read): Change return to enum
register_status.
* gdbarch.h, gdbarch.c: Regenerate.
* i386-tdep.h (i386_pseudo_register_read): Change return to enum
register_status.
* i386-tdep.c (i386_pseudo_register_read): Change return to enum
register_status. If reading a raw register indicates the raw
register is not valid, return the raw register's status,
otherwise, return REG_VALID.
* amd64-tdep.c (amd64_pseudo_register_read): Change return to enum
register_status. Handle non-REG_VALID raw registers and return
the register's status.
* arm-tdep.c (arm_neon_quad_read)
(arm_pseudo_read): Change return to enum register_status. Handle
non-REG_VALID raw registers and return the register's status.
* avr-tdep.c (avr_pseudo_register_read): Ditto.
* frv-tdep.c (frv_pseudo_register_read): Ditto.
* h8300-tdep.c (h8300_pseudo_register_read): Ditto.
* hppa-tdep.c (hppa_pseudo_register_read): Ditto.
* m32c-tdep.c (m32c_move_reg_t): Change return to enum
register_status.
(m32c_raw_read, m32c_raw_write, m32c_banked_read)
(m32c_banked_write, m32c_sb_read, m32c_sb_write, m32c_part_read)
(m32c_part_write, m32c_cat_read, m32c_cat_write)
(m32c_r3r2r1r0_read, m32c_r3r2r1r0_write)
(m32c_pseudo_register_read): Change return to enum
register_status. Adjust.
* m68hc11-tdep.c (m68hc11_pseudo_register_read): Change return to
enum register_status. Return the register's status.
* mep-tdep.c (mep_pseudo_cr32_read): Change return to enum
register_status. Return the register's status.
(mep_pseudo_cr64_read, mep_pseudo_register_read): Ditto.
* mips-tdep.c (mips_pseudo_register_read): Ditto.
* mt-tdep.c (mt_pseudo_register_read): Ditto.
* rs6000-tdep.c (move_ev_register_func): New typedef.
(e500_move_ev_register): Use it. Change return to enum
register_status. Return the register's status.
(do_regcache_raw_read): New function.
(do_regcache_raw_write): New function.
(e500_pseudo_register_read): Change return to enum
register_status. Return the register's status. Use
do_regcache_raw_read.
(e500_pseudo_register_write): Adjust. Use do_regcache_raw_write.
(dfp_pseudo_register_read): Change return to enum register_status.
Return the register's status.
(vsx_pseudo_register_read): Ditto.
(efpr_pseudo_register_read): Ditto.
(rs6000_pseudo_register_read): Ditto.
* s390-tdep.c (s390_pseudo_register_read): Change return to enum
register_status. Return the register's status.
* sh64-tdep.c (pseudo_register_read_portions): New function.
(sh64_pseudo_register_read): Change return to enum
register_status. Use pseudo_register_read_portions. Return the
register's status.
* ia64-tdep.c (ia64_pseudo_register_read): Change return to enum
register_status. Return the register's status.
* sh-tdep.c (pseudo_register_read_portions): New function.
(sh_pseudo_register_read): Change return to enum register_status.
Use pseudo_register_read_portions. Return the register's status.
* sparc-tdep.c (sparc32_pseudo_register_read): Change return to
enum register_status. Return the register's status.
* sparc64-tdep.c (sparc64_pseudo_register_read): Ditto.
* spu-tdep.c (spu_pseudo_register_read_spu)
(spu_pseudo_register_read): Ditto.
* xtensa-tdep.c (xtensa_register_read_masked)
(xtensa_pseudo_register_read): Ditto.
* bfin-tdep.c (bfin_pseudo_register_read): Ditto.
2011-03-19 02:38:44 +08:00
|
|
|
if (status == REG_VALID)
|
|
|
|
{
|
|
|
|
buffer[1] = buffer[2] = buffer[3] = 0;
|
|
|
|
buffer[0] = !!(buf[0] & ASTAT_CC);
|
|
|
|
}
|
|
|
|
return status;
|
2010-12-30 00:11:49 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
bfin_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
|
|
|
|
int regnum, const gdb_byte *buffer)
|
|
|
|
{
|
2017-04-07 16:31:37 +08:00
|
|
|
gdb_byte buf[BFIN_MAX_REGISTER_SIZE];
|
2010-12-30 00:11:49 +08:00
|
|
|
|
|
|
|
if (regnum != BFIN_CC_REGNUM)
|
|
|
|
internal_error (__FILE__, __LINE__,
|
|
|
|
_("invalid register number %d"), regnum);
|
|
|
|
|
|
|
|
/* Overlay the CC bit in the ASTAT register. */
|
2018-05-31 02:54:36 +08:00
|
|
|
regcache->raw_read (BFIN_ASTAT_REGNUM, buf);
|
2010-12-30 00:11:49 +08:00
|
|
|
buf[0] = (buf[0] & ~ASTAT_CC) | ((buffer[0] & 1) << ASTAT_CC_POS);
|
2018-05-31 02:54:37 +08:00
|
|
|
regcache->raw_write (BFIN_ASTAT_REGNUM, buf);
|
2010-12-30 00:11:49 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
static CORE_ADDR
|
|
|
|
bfin_frame_base_address (struct frame_info *this_frame, void **this_cache)
|
|
|
|
{
|
|
|
|
struct bfin_frame_cache *cache = bfin_frame_cache (this_frame, this_cache);
|
|
|
|
|
|
|
|
return cache->base;
|
|
|
|
}
|
|
|
|
|
|
|
|
static CORE_ADDR
|
|
|
|
bfin_frame_local_address (struct frame_info *this_frame, void **this_cache)
|
|
|
|
{
|
|
|
|
struct bfin_frame_cache *cache = bfin_frame_cache (this_frame, this_cache);
|
|
|
|
|
|
|
|
return cache->base - 4;
|
|
|
|
}
|
|
|
|
|
|
|
|
static CORE_ADDR
|
|
|
|
bfin_frame_args_address (struct frame_info *this_frame, void **this_cache)
|
|
|
|
{
|
|
|
|
struct bfin_frame_cache *cache = bfin_frame_cache (this_frame, this_cache);
|
|
|
|
|
|
|
|
return cache->base + 8;
|
|
|
|
}
|
|
|
|
|
|
|
|
static const struct frame_base bfin_frame_base =
|
|
|
|
{
|
|
|
|
&bfin_frame_unwind,
|
|
|
|
bfin_frame_base_address,
|
|
|
|
bfin_frame_local_address,
|
|
|
|
bfin_frame_args_address
|
|
|
|
};
|
|
|
|
|
|
|
|
static CORE_ADDR
|
|
|
|
bfin_frame_align (struct gdbarch *gdbarch, CORE_ADDR address)
|
|
|
|
{
|
2015-06-19 16:24:13 +08:00
|
|
|
return align_down (address, 4);
|
2010-12-30 00:11:49 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
enum bfin_abi
|
|
|
|
bfin_abi (struct gdbarch *gdbarch)
|
|
|
|
{
|
gdb: fix gdbarch_tdep ODR violation
I would like to be able to use non-trivial types in gdbarch_tdep types.
This is not possible at the moment (in theory), because of the one
definition rule.
To allow it, rename all gdbarch_tdep types to <arch>_gdbarch_tdep, and
make them inherit from a gdbarch_tdep base class. The inheritance is
necessary to be able to pass pointers to all these <arch>_gdbarch_tdep
objects to gdbarch_alloc, which takes a pointer to gdbarch_tdep.
These objects are never deleted through a base class pointer, so I
didn't include a virtual destructor. In the future, if gdbarch objects
deletable, I could imagine that the gdbarch_tdep objects could become
owned by the gdbarch objects, and then it would become useful to have a
virtual destructor (so that the gdbarch object can delete the owned
gdbarch_tdep object). But that's not necessary right now.
It turns out that RISC-V already has a gdbarch_tdep that is
non-default-constructible, so that provides a good motivation for this
change.
Most changes are fairly straightforward, mostly needing to add some
casts all over the place. There is however the xtensa architecture,
doing its own little weird thing to define its gdbarch_tdep. I did my
best to adapt it, but I can't test those changes.
Change-Id: Ic001903f91ddd106bd6ca09a79dabe8df2d69f3b
2021-11-16 00:29:39 +08:00
|
|
|
bfin_gdbarch_tdep *tdep = (bfin_gdbarch_tdep *) gdbarch_tdep (gdbarch);
|
|
|
|
return tdep->bfin_abi;
|
2010-12-30 00:11:49 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Initialize the current architecture based on INFO. If possible,
|
|
|
|
re-use an architecture from ARCHES, which is a list of
|
|
|
|
architectures already created during this debugging session.
|
|
|
|
|
|
|
|
Called e.g. at program startup, when reading a core file, and when
|
|
|
|
reading a binary file. */
|
|
|
|
|
|
|
|
static struct gdbarch *
|
|
|
|
bfin_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
|
|
|
|
{
|
|
|
|
struct gdbarch *gdbarch;
|
|
|
|
enum bfin_abi abi;
|
|
|
|
|
|
|
|
abi = BFIN_ABI_FLAT;
|
|
|
|
|
|
|
|
/* If there is already a candidate, use it. */
|
|
|
|
|
|
|
|
for (arches = gdbarch_list_lookup_by_info (arches, &info);
|
|
|
|
arches != NULL;
|
|
|
|
arches = gdbarch_list_lookup_by_info (arches->next, &info))
|
|
|
|
{
|
gdb: fix gdbarch_tdep ODR violation
I would like to be able to use non-trivial types in gdbarch_tdep types.
This is not possible at the moment (in theory), because of the one
definition rule.
To allow it, rename all gdbarch_tdep types to <arch>_gdbarch_tdep, and
make them inherit from a gdbarch_tdep base class. The inheritance is
necessary to be able to pass pointers to all these <arch>_gdbarch_tdep
objects to gdbarch_alloc, which takes a pointer to gdbarch_tdep.
These objects are never deleted through a base class pointer, so I
didn't include a virtual destructor. In the future, if gdbarch objects
deletable, I could imagine that the gdbarch_tdep objects could become
owned by the gdbarch objects, and then it would become useful to have a
virtual destructor (so that the gdbarch object can delete the owned
gdbarch_tdep object). But that's not necessary right now.
It turns out that RISC-V already has a gdbarch_tdep that is
non-default-constructible, so that provides a good motivation for this
change.
Most changes are fairly straightforward, mostly needing to add some
casts all over the place. There is however the xtensa architecture,
doing its own little weird thing to define its gdbarch_tdep. I did my
best to adapt it, but I can't test those changes.
Change-Id: Ic001903f91ddd106bd6ca09a79dabe8df2d69f3b
2021-11-16 00:29:39 +08:00
|
|
|
bfin_gdbarch_tdep *tdep
|
|
|
|
= (bfin_gdbarch_tdep *) gdbarch_tdep (arches->gdbarch);
|
|
|
|
|
|
|
|
if (tdep->bfin_abi != abi)
|
2010-12-30 00:11:49 +08:00
|
|
|
continue;
|
gdb: fix gdbarch_tdep ODR violation
I would like to be able to use non-trivial types in gdbarch_tdep types.
This is not possible at the moment (in theory), because of the one
definition rule.
To allow it, rename all gdbarch_tdep types to <arch>_gdbarch_tdep, and
make them inherit from a gdbarch_tdep base class. The inheritance is
necessary to be able to pass pointers to all these <arch>_gdbarch_tdep
objects to gdbarch_alloc, which takes a pointer to gdbarch_tdep.
These objects are never deleted through a base class pointer, so I
didn't include a virtual destructor. In the future, if gdbarch objects
deletable, I could imagine that the gdbarch_tdep objects could become
owned by the gdbarch objects, and then it would become useful to have a
virtual destructor (so that the gdbarch object can delete the owned
gdbarch_tdep object). But that's not necessary right now.
It turns out that RISC-V already has a gdbarch_tdep that is
non-default-constructible, so that provides a good motivation for this
change.
Most changes are fairly straightforward, mostly needing to add some
casts all over the place. There is however the xtensa architecture,
doing its own little weird thing to define its gdbarch_tdep. I did my
best to adapt it, but I can't test those changes.
Change-Id: Ic001903f91ddd106bd6ca09a79dabe8df2d69f3b
2021-11-16 00:29:39 +08:00
|
|
|
|
2010-12-30 00:11:49 +08:00
|
|
|
return arches->gdbarch;
|
|
|
|
}
|
|
|
|
|
gdb: fix gdbarch_tdep ODR violation
I would like to be able to use non-trivial types in gdbarch_tdep types.
This is not possible at the moment (in theory), because of the one
definition rule.
To allow it, rename all gdbarch_tdep types to <arch>_gdbarch_tdep, and
make them inherit from a gdbarch_tdep base class. The inheritance is
necessary to be able to pass pointers to all these <arch>_gdbarch_tdep
objects to gdbarch_alloc, which takes a pointer to gdbarch_tdep.
These objects are never deleted through a base class pointer, so I
didn't include a virtual destructor. In the future, if gdbarch objects
deletable, I could imagine that the gdbarch_tdep objects could become
owned by the gdbarch objects, and then it would become useful to have a
virtual destructor (so that the gdbarch object can delete the owned
gdbarch_tdep object). But that's not necessary right now.
It turns out that RISC-V already has a gdbarch_tdep that is
non-default-constructible, so that provides a good motivation for this
change.
Most changes are fairly straightforward, mostly needing to add some
casts all over the place. There is however the xtensa architecture,
doing its own little weird thing to define its gdbarch_tdep. I did my
best to adapt it, but I can't test those changes.
Change-Id: Ic001903f91ddd106bd6ca09a79dabe8df2d69f3b
2021-11-16 00:29:39 +08:00
|
|
|
bfin_gdbarch_tdep *tdep = new bfin_gdbarch_tdep;
|
2010-12-30 00:11:49 +08:00
|
|
|
gdbarch = gdbarch_alloc (&info, tdep);
|
|
|
|
|
|
|
|
tdep->bfin_abi = abi;
|
|
|
|
|
|
|
|
set_gdbarch_num_regs (gdbarch, BFIN_NUM_REGS);
|
|
|
|
set_gdbarch_pseudo_register_read (gdbarch, bfin_pseudo_register_read);
|
|
|
|
set_gdbarch_pseudo_register_write (gdbarch, bfin_pseudo_register_write);
|
|
|
|
set_gdbarch_num_pseudo_regs (gdbarch, BFIN_NUM_PSEUDO_REGS);
|
|
|
|
set_gdbarch_sp_regnum (gdbarch, BFIN_SP_REGNUM);
|
|
|
|
set_gdbarch_pc_regnum (gdbarch, BFIN_PC_REGNUM);
|
|
|
|
set_gdbarch_ps_regnum (gdbarch, BFIN_ASTAT_REGNUM);
|
|
|
|
set_gdbarch_dwarf2_reg_to_regnum (gdbarch, bfin_reg_to_regnum);
|
|
|
|
set_gdbarch_register_name (gdbarch, bfin_register_name);
|
|
|
|
set_gdbarch_register_type (gdbarch, bfin_register_type);
|
|
|
|
set_gdbarch_push_dummy_call (gdbarch, bfin_push_dummy_call);
|
|
|
|
set_gdbarch_believe_pcc_promotion (gdbarch, 1);
|
|
|
|
set_gdbarch_return_value (gdbarch, bfin_return_value);
|
|
|
|
set_gdbarch_skip_prologue (gdbarch, bfin_skip_prologue);
|
|
|
|
set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
|
2016-11-03 22:35:14 +08:00
|
|
|
set_gdbarch_breakpoint_kind_from_pc (gdbarch, bfin_breakpoint_kind_from_pc);
|
|
|
|
set_gdbarch_sw_breakpoint_from_kind (gdbarch, bfin_sw_breakpoint_from_kind);
|
2010-12-30 00:11:49 +08:00
|
|
|
set_gdbarch_decr_pc_after_break (gdbarch, 2);
|
|
|
|
set_gdbarch_frame_args_skip (gdbarch, 8);
|
|
|
|
set_gdbarch_frame_align (gdbarch, bfin_frame_align);
|
|
|
|
|
|
|
|
/* Hook in ABI-specific overrides, if they have been registered. */
|
|
|
|
gdbarch_init_osabi (info, gdbarch);
|
|
|
|
|
|
|
|
dwarf2_append_unwinders (gdbarch);
|
|
|
|
|
|
|
|
frame_base_set_default (gdbarch, &bfin_frame_base);
|
|
|
|
|
|
|
|
frame_unwind_append_unwinder (gdbarch, &bfin_frame_unwind);
|
|
|
|
|
|
|
|
return gdbarch;
|
|
|
|
}
|
|
|
|
|
2020-01-14 03:01:38 +08:00
|
|
|
void _initialize_bfin_tdep ();
|
2010-12-30 00:11:49 +08:00
|
|
|
void
|
2020-01-14 03:01:38 +08:00
|
|
|
_initialize_bfin_tdep ()
|
2010-12-30 00:11:49 +08:00
|
|
|
{
|
|
|
|
register_gdbarch_init (bfd_arch_bfin, bfin_gdbarch_init);
|
|
|
|
}
|