Constify 'la_name' in struct language_defn
[deliverable/binutils-gdb.git] / gdb / ia64-linux-tdep.c
index 3a86c96f74430768630b62959a5874b61ffe0b58..d1eb529cd4f239d4b2255889db9bb8356ce53850 100644 (file)
@@ -1,7 +1,6 @@
 /* Target-dependent code for the IA-64 for GDB, the GNU debugger.
 
-   Copyright (C) 2000, 2004, 2005, 2007, 2008, 2009
-   Free Software Foundation, Inc.
+   Copyright (C) 2000-2013 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 #include "osabi.h"
 #include "solib-svr4.h"
 #include "symtab.h"
+#include "linux-tdep.h"
+
+#include <ctype.h>
 
 /* The sigtramp code is in a non-readable (executable-only) region
    of memory called the ``gate page''.  The addresses in question
    were determined by examining the system headers.  They are
-   overly generous to allow for different pages sizes. */
+   overly generous to allow for different pages sizes.  */
 
 #define GATE_AREA_START 0xa000000000000100LL
 #define GATE_AREA_END   0xa000000000020000LL
 
-/* Offset to sigcontext structure from frame of handler */
+/* Offset to sigcontext structure from frame of handler */
 #define IA64_LINUX_SIGCONTEXT_OFFSET 192
 
 static int
@@ -46,18 +48,21 @@ ia64_linux_pc_in_sigtramp (CORE_ADDR pc)
 
 /* IA-64 GNU/Linux specific function which, given a frame address and
    a register number, returns the address at which that register may be
-   found.  0 is returned for registers which aren't stored in the the
-   sigcontext structure. */
+   found.  0 is returned for registers which aren't stored in the
+   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)
 {
-  char buf[8];
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
+  gdb_byte buf[8];
   CORE_ADDR sigcontext_addr = 0;
 
-  /* The address of the sigcontext area is found at offset 16 in the sigframe.  */
+  /* 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);
@@ -76,7 +81,7 @@ ia64_linux_sigcontext_register_address (CORE_ADDR sp, int regno)
        return sigcontext_addr + 56;            /* user mask only */
       /* sc_ar_rsc is provided, from which we could compute bspstore, but
         I don't think it's worth it.  Anyway, if we want it, it's at offset
-        64 */
+        64 */
       case IA64_BSP_REGNUM :
        return sigcontext_addr + 72;
       case IA64_RNAT_REGNUM :
@@ -115,11 +120,24 @@ ia64_linux_write_pc (struct regcache *regcache, CORE_ADDR pc)
   regcache_cooked_write_unsigned (regcache, IA64_GR10_REGNUM, 0);
 }
 
+/* Implementation of `gdbarch_stap_is_single_operand', as defined in
+   gdbarch.h.  */
+
+static int
+ia64_linux_stap_is_single_operand (struct gdbarch *gdbarch, const char *s)
+{
+  return ((isdigit (*s) && s[1] == '[' && s[2] == 'r') /* Displacement.  */
+         || *s == 'r' /* Register value.  */
+         || isdigit (*s));  /* Literal number.  */
+}
+
 static void
 ia64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
 
+  linux_init_abi (info, gdbarch);
+
   /* Set the method of obtaining the sigcontext addresses at which
      registers are saved.  */
   tdep->sigcontext_register_address = ia64_linux_sigcontext_register_address;
@@ -137,6 +155,14 @@ ia64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
   /* Enable TLS support.  */
   set_gdbarch_fetch_tls_load_module_address (gdbarch,
                                              svr4_fetch_objfile_link_map);
+
+  /* SystemTap related.  */
+  set_gdbarch_stap_register_prefix (gdbarch, "r");
+  set_gdbarch_stap_register_indirection_prefix (gdbarch, "[");
+  set_gdbarch_stap_register_indirection_suffix (gdbarch, "]");
+  set_gdbarch_stap_gdb_register_prefix (gdbarch, "r");
+  set_gdbarch_stap_is_single_operand (gdbarch,
+                                     ia64_linux_stap_is_single_operand);
 }
 
 /* Provide a prototype to silence -Wmissing-prototypes.  */
This page took 0.025643 seconds and 4 git commands to generate.