*** empty log message ***
[deliverable/binutils-gdb.git] / gdb / ia64-linux-tdep.c
index 10de3ddf39f95ab59fd0ae0bc9058e624007bdfe..838bc0bf0d2792d0a35c316c46f3ec7c54109c96 100644 (file)
@@ -1,12 +1,13 @@
 /* Target-dependent code for the IA-64 for GDB, the GNU debugger.
 
-   Copyright (C) 2000, 2004, 2005 Free Software Foundation, Inc.
+   Copyright (C) 2000, 2004, 2005, 2007, 2008, 2009
+   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 2 of the License, or
+   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,
@@ -15,9 +16,7 @@
    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, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
 #include "ia64-tdep.h"
@@ -26,6 +25,7 @@
 #include "regcache.h"
 #include "osabi.h"
 #include "solib-svr4.h"
+#include "symtab.h"
 
 /* The sigtramp code is in a non-readable (executable-only) region
    of memory called the ``gate page''.  The addresses in question
@@ -38,8 +38,8 @@
 /* Offset to sigcontext structure from frame of handler */
 #define IA64_LINUX_SIGCONTEXT_OFFSET 192
 
-int
-ia64_linux_in_sigtramp (CORE_ADDR pc, char *func_name)
+static int
+ia64_linux_pc_in_sigtramp (CORE_ADDR pc)
 {
   return (pc >= (CORE_ADDR) GATE_AREA_START && pc < (CORE_ADDR) GATE_AREA_END);
 }
@@ -50,14 +50,16 @@ ia64_linux_in_sigtramp (CORE_ADDR pc, char *func_name)
    sigcontext structure. */
 
 static CORE_ADDR
-ia64_linux_sigcontext_register_address (CORE_ADDR sp, int regno)
+ia64_linux_sigcontext_register_address (struct gdbarch *gdbarch,
+                                       CORE_ADDR sp, int regno)
 {
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   char buf[8];
   CORE_ADDR sigcontext_addr = 0;
 
   /* The address of the sigcontext area is found at offset 16 in the sigframe.  */
   read_memory (sp + 16, buf, 8);
-  sigcontext_addr = extract_unsigned_integer (buf, 8);
+  sigcontext_addr = extract_unsigned_integer (buf, 8, byte_order);
 
   if (IA64_GR0_REGNUM <= regno && regno <= IA64_GR31_REGNUM)
     return sigcontext_addr + 200 + 8 * (regno - IA64_GR0_REGNUM);
@@ -99,9 +101,9 @@ ia64_linux_sigcontext_register_address (CORE_ADDR sp, int regno)
 }
 
 static void
-ia64_linux_write_pc (CORE_ADDR pc, ptid_t ptid)
+ia64_linux_write_pc (struct regcache *regcache, CORE_ADDR pc)
 {
-  ia64_write_pc (pc, ptid);
+  ia64_write_pc (regcache, pc);
 
   /* We must be careful with modifying the instruction-pointer: if we
      just interrupt a system call, the kernel would ordinarily try to
@@ -112,7 +114,7 @@ ia64_linux_write_pc (CORE_ADDR pc, ptid_t ptid)
 
      The clearing of r10 is safe as long as ia64_write_pc() is only
      called as part of setting up an inferior call.  */
-  write_register_pid (IA64_GR10_REGNUM, 0, ptid);
+  regcache_cooked_write_unsigned (regcache, IA64_GR10_REGNUM, 0);
 }
 
 static void
@@ -124,13 +126,24 @@ ia64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
      registers are saved.  */
   tdep->sigcontext_register_address = ia64_linux_sigcontext_register_address;
 
+  /* Set the pc_in_sigtramp method.  */
+  tdep->pc_in_sigtramp = ia64_linux_pc_in_sigtramp;
+
   set_gdbarch_write_pc (gdbarch, ia64_linux_write_pc);
 
+  set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
+
+  set_solib_svr4_fetch_link_map_offsets
+    (gdbarch, svr4_lp64_fetch_link_map_offsets);
+
   /* Enable TLS support.  */
   set_gdbarch_fetch_tls_load_module_address (gdbarch,
                                              svr4_fetch_objfile_link_map);
 }
 
+/* Provide a prototype to silence -Wmissing-prototypes.  */
+extern initialize_file_ftype _initialize_ia64_linux_tdep;
+
 void
 _initialize_ia64_linux_tdep (void)
 {
This page took 0.026111 seconds and 4 git commands to generate.