mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-15 04:31:49 +08:00
4de283e4b5
Andreas Schwab and John Baldwin pointed out some bugs in the header sorting patch; and I noticed that the output was not correct when limited to a subset of files (a bug in my script). So, I'm reverting the patch. I may try again after fixing the issues pointed out. gdb/ChangeLog 2019-04-05 Tom Tromey <tom@tromey.com> Revert the header-sorting patch. * ft32-tdep.c: Revert. * frv-tdep.c: Revert. * frv-linux-tdep.c: Revert. * frame.c: Revert. * frame-unwind.c: Revert. * frame-base.c: Revert. * fork-child.c: Revert. * findvar.c: Revert. * findcmd.c: Revert. * filesystem.c: Revert. * filename-seen-cache.h: Revert. * filename-seen-cache.c: Revert. * fbsd-tdep.c: Revert. * fbsd-nat.h: Revert. * fbsd-nat.c: Revert. * f-valprint.c: Revert. * f-typeprint.c: Revert. * f-lang.c: Revert. * extension.h: Revert. * extension.c: Revert. * extension-priv.h: Revert. * expprint.c: Revert. * exec.h: Revert. * exec.c: Revert. * exceptions.c: Revert. * event-top.c: Revert. * event-loop.c: Revert. * eval.c: Revert. * elfread.c: Revert. * dwarf2read.h: Revert. * dwarf2read.c: Revert. * dwarf2loc.c: Revert. * dwarf2expr.h: Revert. * dwarf2expr.c: Revert. * dwarf2-frame.c: Revert. * dwarf2-frame-tailcall.c: Revert. * dwarf-index-write.h: Revert. * dwarf-index-write.c: Revert. * dwarf-index-common.c: Revert. * dwarf-index-cache.h: Revert. * dwarf-index-cache.c: Revert. * dummy-frame.c: Revert. * dtrace-probe.c: Revert. * disasm.h: Revert. * disasm.c: Revert. * disasm-selftests.c: Revert. * dictionary.c: Revert. * dicos-tdep.c: Revert. * demangle.c: Revert. * dcache.h: Revert. * dcache.c: Revert. * darwin-nat.h: Revert. * darwin-nat.c: Revert. * darwin-nat-info.c: Revert. * d-valprint.c: Revert. * d-namespace.c: Revert. * d-lang.c: Revert. * ctf.c: Revert. * csky-tdep.c: Revert. * csky-linux-tdep.c: Revert. * cris-tdep.c: Revert. * cris-linux-tdep.c: Revert. * cp-valprint.c: Revert. * cp-support.c: Revert. * cp-namespace.c: Revert. * cp-abi.c: Revert. * corelow.c: Revert. * corefile.c: Revert. * continuations.c: Revert. * completer.h: Revert. * completer.c: Revert. * complaints.c: Revert. * coffread.c: Revert. * coff-pe-read.c: Revert. * cli-out.h: Revert. * cli-out.c: Revert. * charset.c: Revert. * c-varobj.c: Revert. * c-valprint.c: Revert. * c-typeprint.c: Revert. * c-lang.c: Revert. * buildsym.c: Revert. * buildsym-legacy.c: Revert. * build-id.h: Revert. * build-id.c: Revert. * btrace.c: Revert. * bsd-uthread.c: Revert. * breakpoint.h: Revert. * breakpoint.c: Revert. * break-catch-throw.c: Revert. * break-catch-syscall.c: Revert. * break-catch-sig.c: Revert. * blockframe.c: Revert. * block.c: Revert. * bfin-tdep.c: Revert. * bfin-linux-tdep.c: Revert. * bfd-target.c: Revert. * bcache.c: Revert. * ax-general.c: Revert. * ax-gdb.h: Revert. * ax-gdb.c: Revert. * avr-tdep.c: Revert. * auxv.c: Revert. * auto-load.c: Revert. * arm-wince-tdep.c: Revert. * arm-tdep.c: Revert. * arm-symbian-tdep.c: Revert. * arm-pikeos-tdep.c: Revert. * arm-obsd-tdep.c: Revert. * arm-nbsd-tdep.c: Revert. * arm-nbsd-nat.c: Revert. * arm-linux-tdep.c: Revert. * arm-linux-nat.c: Revert. * arm-fbsd-tdep.c: Revert. * arm-fbsd-nat.c: Revert. * arm-bsd-tdep.c: Revert. * arch-utils.c: Revert. * arc-tdep.c: Revert. * arc-newlib-tdep.c: Revert. * annotate.h: Revert. * annotate.c: Revert. * amd64-windows-tdep.c: Revert. * amd64-windows-nat.c: Revert. * amd64-tdep.c: Revert. * amd64-sol2-tdep.c: Revert. * amd64-obsd-tdep.c: Revert. * amd64-obsd-nat.c: Revert. * amd64-nbsd-tdep.c: Revert. * amd64-nbsd-nat.c: Revert. * amd64-nat.c: Revert. * amd64-linux-tdep.c: Revert. * amd64-linux-nat.c: Revert. * amd64-fbsd-tdep.c: Revert. * amd64-fbsd-nat.c: Revert. * amd64-dicos-tdep.c: Revert. * amd64-darwin-tdep.c: Revert. * amd64-bsd-nat.c: Revert. * alpha-tdep.c: Revert. * alpha-obsd-tdep.c: Revert. * alpha-nbsd-tdep.c: Revert. * alpha-mdebug-tdep.c: Revert. * alpha-linux-tdep.c: Revert. * alpha-linux-nat.c: Revert. * alpha-bsd-tdep.c: Revert. * alpha-bsd-nat.c: Revert. * aix-thread.c: Revert. * agent.c: Revert. * addrmap.c: Revert. * ada-varobj.c: Revert. * ada-valprint.c: Revert. * ada-typeprint.c: Revert. * ada-tasks.c: Revert. * ada-lang.c: Revert. * aarch64-tdep.c: Revert. * aarch64-ravenscar-thread.c: Revert. * aarch64-newlib-tdep.c: Revert. * aarch64-linux-tdep.c: Revert. * aarch64-linux-nat.c: Revert. * aarch64-fbsd-tdep.c: Revert. * aarch64-fbsd-nat.c: Revert. * aarch32-linux-nat.c: Revert.
166 lines
4.9 KiB
C
166 lines
4.9 KiB
C
/* Target-dependent code for Windows CE running on ARM processors,
|
|
for GDB.
|
|
|
|
Copyright (C) 2007-2019 Free Software Foundation, Inc.
|
|
|
|
This file is part of GDB.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 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"
|
|
#include "osabi.h"
|
|
#include "gdbcore.h"
|
|
#include "target.h"
|
|
#include "frame.h"
|
|
|
|
#include "arch/arm.h"
|
|
#include "arm-tdep.h"
|
|
#include "windows-tdep.h"
|
|
|
|
static const gdb_byte arm_wince_le_breakpoint[] = { 0x10, 0x00, 0x00, 0xe6 };
|
|
static const gdb_byte arm_wince_thumb_le_breakpoint[] = { 0xfe, 0xdf };
|
|
|
|
/* Description of the longjmp buffer. */
|
|
#define ARM_WINCE_JB_ELEMENT_SIZE INT_REGISTER_SIZE
|
|
#define ARM_WINCE_JB_PC 10
|
|
|
|
static CORE_ADDR
|
|
arm_pe_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
|
|
{
|
|
struct gdbarch *gdbarch = get_frame_arch (frame);
|
|
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
|
|
ULONGEST indirect;
|
|
struct bound_minimal_symbol indsym;
|
|
const char *symname;
|
|
CORE_ADDR next_pc;
|
|
|
|
/* The format of an ARM DLL trampoline is:
|
|
|
|
ldr ip, [pc]
|
|
ldr pc, [ip]
|
|
.dw __imp_<func>
|
|
|
|
*/
|
|
|
|
if (pc == 0
|
|
|| read_memory_unsigned_integer (pc + 0, 4, byte_order) != 0xe59fc000
|
|
|| read_memory_unsigned_integer (pc + 4, 4, byte_order) != 0xe59cf000)
|
|
return 0;
|
|
|
|
indirect = read_memory_unsigned_integer (pc + 8, 4, byte_order);
|
|
if (indirect == 0)
|
|
return 0;
|
|
|
|
indsym = lookup_minimal_symbol_by_pc (indirect);
|
|
if (indsym.minsym == NULL)
|
|
return 0;
|
|
|
|
symname = MSYMBOL_LINKAGE_NAME (indsym.minsym);
|
|
if (symname == NULL || !startswith (symname, "__imp_"))
|
|
return 0;
|
|
|
|
next_pc = read_memory_unsigned_integer (indirect, 4, byte_order);
|
|
if (next_pc != 0)
|
|
return next_pc;
|
|
|
|
/* Check with the default arm gdbarch_skip_trampoline. */
|
|
return arm_skip_stub (frame, pc);
|
|
}
|
|
|
|
/* GCC emits a call to __gccmain in the prologue of main.
|
|
|
|
The function below examines the code pointed at by PC and checks to
|
|
see if it corresponds to a call to __gccmain. If so, it returns
|
|
the address of the instruction following that call. Otherwise, it
|
|
simply returns PC. */
|
|
|
|
static CORE_ADDR
|
|
arm_wince_skip_main_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
|
|
{
|
|
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
|
|
ULONGEST this_instr;
|
|
|
|
this_instr = read_memory_unsigned_integer (pc, 4, byte_order);
|
|
|
|
/* bl offset <__gccmain> */
|
|
if ((this_instr & 0xfff00000) == 0xeb000000)
|
|
{
|
|
#define sign_extend(V, N) \
|
|
(((long) (V) ^ (1L << ((N) - 1))) - (1L << ((N) - 1)))
|
|
|
|
long offset = sign_extend (this_instr & 0x000fffff, 23) << 2;
|
|
CORE_ADDR call_dest = (pc + 8 + offset) & 0xffffffffU;
|
|
struct bound_minimal_symbol s = lookup_minimal_symbol_by_pc (call_dest);
|
|
|
|
if (s.minsym != NULL
|
|
&& MSYMBOL_LINKAGE_NAME (s.minsym) != NULL
|
|
&& strcmp (MSYMBOL_LINKAGE_NAME (s.minsym), "__gccmain") == 0)
|
|
pc += 4;
|
|
}
|
|
|
|
return pc;
|
|
}
|
|
|
|
static void
|
|
arm_wince_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
|
{
|
|
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
|
|
|
windows_init_abi (info, gdbarch);
|
|
|
|
tdep->arm_breakpoint = arm_wince_le_breakpoint;
|
|
tdep->arm_breakpoint_size = sizeof (arm_wince_le_breakpoint);
|
|
tdep->thumb_breakpoint = arm_wince_thumb_le_breakpoint;
|
|
tdep->thumb_breakpoint_size = sizeof (arm_wince_thumb_le_breakpoint);
|
|
tdep->struct_return = pcc_struct_return;
|
|
|
|
tdep->fp_model = ARM_FLOAT_SOFT_VFP;
|
|
|
|
tdep->jb_pc = ARM_WINCE_JB_PC;
|
|
tdep->jb_elt_size = ARM_WINCE_JB_ELEMENT_SIZE;
|
|
|
|
/* On ARM WinCE char defaults to signed. */
|
|
set_gdbarch_char_signed (gdbarch, 1);
|
|
|
|
/* Shared library handling. */
|
|
set_gdbarch_skip_trampoline_code (gdbarch, arm_pe_skip_trampoline_code);
|
|
|
|
/* Single stepping. */
|
|
set_gdbarch_software_single_step (gdbarch, arm_software_single_step);
|
|
|
|
/* Skip call to __gccmain that gcc places in main. */
|
|
set_gdbarch_skip_main_prologue (gdbarch, arm_wince_skip_main_prologue);
|
|
}
|
|
|
|
static enum gdb_osabi
|
|
arm_wince_osabi_sniffer (bfd *abfd)
|
|
{
|
|
const char *target_name = bfd_get_target (abfd);
|
|
|
|
if (strcmp (target_name, "pei-arm-wince-little") == 0)
|
|
return GDB_OSABI_WINCE;
|
|
|
|
return GDB_OSABI_UNKNOWN;
|
|
}
|
|
|
|
void
|
|
_initialize_arm_wince_tdep (void)
|
|
{
|
|
gdbarch_register_osabi_sniffer (bfd_arch_arm, bfd_target_coff_flavour,
|
|
arm_wince_osabi_sniffer);
|
|
|
|
gdbarch_register_osabi (bfd_arch_arm, 0, GDB_OSABI_WINCE,
|
|
arm_wince_init_abi);
|
|
}
|