* arm-tdep.c: Include "remote.h" and "features/arm-with-m-fpa-layout.c".
authorJonathan Larmour <jifl@eCosCentric.com>
Thu, 15 Mar 2012 18:53:43 +0000 (18:53 +0000)
committerJonathan Larmour <jifl@eCosCentric.com>
Thu, 15 Mar 2012 18:53:43 +0000 (18:53 +0000)
(arm_register_g_packet_guesses): New function.
(arm_gdbarch_init): Don't force a target description with
registers when the executable is detected as M-profile.  Instead
set gdbarch->tdep->is_m.  Register `g' packet guesses.
(_initialize_arm_tdep): Initialize the new target description.
* features/arm-with-m-fpa-layout.xml: New description.
* features/arm-with-m-fpa-layout.c: New, generated.

gdb/ChangeLog
gdb/arm-tdep.c
gdb/features/arm-with-m-fpa-layout.c [new file with mode: 0644]
gdb/features/arm-with-m-fpa-layout.xml [new file with mode: 0644]

index 875d675..4764315 100644 (file)
@@ -1,3 +1,15 @@
+2012-03-15  Jonathan Larmour  <jifl@eCosCentric.com>
+           Pedro Alves  <pedro@codesourcery.com>
+
+       * arm-tdep.c: Include "remote.h" and "features/arm-with-m-fpa-layout.c".
+       (arm_register_g_packet_guesses): New function.
+       (arm_gdbarch_init): Don't force a target description with
+       registers when the executable is detected as M-profile.  Instead
+       set gdbarch->tdep->is_m.  Register `g' packet guesses.
+       (_initialize_arm_tdep): Initialize the new target description.
+       * features/arm-with-m-fpa-layout.xml: New description.
+       * features/arm-with-m-fpa-layout.c: New, generated.
+
 2012-03-15  Joel Brobecker  <brobecker@adacore.com>
 
        * breakpoint.c (breakpoint_xfer_memory): Add assertion.
index b4da01d..a3cdc7c 100644 (file)
@@ -40,6 +40,7 @@
 #include "dwarf2-frame.h"
 #include "gdbtypes.h"
 #include "prologue-value.h"
+#include "remote.h"
 #include "target-descriptions.h"
 #include "user-regs.h"
 #include "observer.h"
@@ -55,6 +56,7 @@
 #include "vec.h"
 
 #include "features/arm-with-m.c"
+#include "features/arm-with-m-fpa-layout.c"
 #include "features/arm-with-iwmmxt.c"
 #include "features/arm-with-vfpv2.c"
 #include "features/arm-with-vfpv3.c"
@@ -9665,6 +9667,41 @@ arm_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
 }
 
 \f
+/* For backward-compatibility we allow two 'g' packet lengths with
+   the remote protocol depending on whether FPA registers are
+   supplied.  M-profile targets do not have FPA registers, but some
+   stubs already exist in the wild which use a 'g' packet which
+   supplies them albeit with dummy values.  The packet format which
+   includes FPA registers should be considered deprecated for
+   M-profile targets.  */
+
+static void
+arm_register_g_packet_guesses (struct gdbarch *gdbarch)
+{
+  if (gdbarch_tdep (gdbarch)->is_m)
+    {
+      /* If we know from the executable this is an M-profile target,
+        cater for remote targets whose register set layout is the
+        same as the FPA layout.  */
+      register_remote_g_packet_guess (gdbarch,
+                                     /* r0-r12,sp,lr,pc; f0-f7; fps,cpsr */
+                                     (16 * INT_REGISTER_SIZE)
+                                     + (8 * FP_REGISTER_SIZE)
+                                     + (2 * INT_REGISTER_SIZE),
+                                     tdesc_arm_with_m_fpa_layout);
+
+      /* The regular M-profile layout.  */
+      register_remote_g_packet_guess (gdbarch,
+                                     /* r0-r12,sp,lr,pc; xpsr */
+                                     (16 * INT_REGISTER_SIZE)
+                                     + INT_REGISTER_SIZE,
+                                     tdesc_arm_with_m);
+    }
+
+  /* Otherwise we don't have a useful guess.  */
+}
+
+\f
 /* 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.
@@ -9798,7 +9835,7 @@ arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
                  && (attr_arch == TAG_CPU_ARCH_V6_M
                      || attr_arch == TAG_CPU_ARCH_V6S_M
                      || attr_profile == 'M'))
-               tdesc = tdesc_arm_with_m;
+               is_m = 1;
 #endif
            }
 
@@ -10055,6 +10092,8 @@ arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   tdep->have_neon_pseudos = have_neon_pseudos;
   tdep->have_neon = have_neon;
 
+  arm_register_g_packet_guesses (gdbarch);
+
   /* Breakpoints.  */
   switch (info.byte_order_for_code)
     {
@@ -10291,6 +10330,7 @@ _initialize_arm_tdep (void)
 
   /* Initialize the standard target descriptions.  */
   initialize_tdesc_arm_with_m ();
+  initialize_tdesc_arm_with_m_fpa_layout ();
   initialize_tdesc_arm_with_iwmmxt ();
   initialize_tdesc_arm_with_vfpv2 ();
   initialize_tdesc_arm_with_vfpv3 ();
diff --git a/gdb/features/arm-with-m-fpa-layout.c b/gdb/features/arm-with-m-fpa-layout.c
new file mode 100644 (file)
index 0000000..ad9b75d
--- /dev/null
@@ -0,0 +1,44 @@
+/* THIS FILE IS GENERATED.  Original: arm-with-m-fpa-layout.xml */
+
+#include "defs.h"
+#include "osabi.h"
+#include "target-descriptions.h"
+
+struct target_desc *tdesc_arm_with_m_fpa_layout;
+static void
+initialize_tdesc_arm_with_m_fpa_layout (void)
+{
+  struct target_desc *result = allocate_target_description ();
+  struct tdesc_feature *feature;
+  struct tdesc_type *field_type, *type;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.arm.m-profile");
+  tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r3", 3, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r4", 4, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r5", 5, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r6", 6, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r7", 7, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r8", 8, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r9", 9, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r10", 10, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r11", 11, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "r12", 12, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "sp", 13, 1, NULL, 32, "data_ptr");
+  tdesc_create_reg (feature, "lr", 14, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "pc", 15, 1, NULL, 32, "code_ptr");
+  tdesc_create_reg (feature, "", 16, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "", 17, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "", 18, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "", 19, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "", 20, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "", 21, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "", 22, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "", 23, 1, NULL, 96, "arm_fpa_ext");
+  tdesc_create_reg (feature, "", 24, 1, NULL, 32, "int");
+  tdesc_create_reg (feature, "xpsr", 25, 1, NULL, 32, "int");
+
+  tdesc_arm_with_m_fpa_layout = result;
+}
diff --git a/gdb/features/arm-with-m-fpa-layout.xml b/gdb/features/arm-with-m-fpa-layout.xml
new file mode 100644 (file)
index 0000000..e3a1149
--- /dev/null
@@ -0,0 +1,45 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!-- A target description for an M-profile device, for stubs that
+     transfer registers using the historical fpa layout.  -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<target>
+<feature name="org.gnu.gdb.arm.m-profile">
+  <reg name="r0" bitsize="32"/>
+  <reg name="r1" bitsize="32"/>
+  <reg name="r2" bitsize="32"/>
+  <reg name="r3" bitsize="32"/>
+  <reg name="r4" bitsize="32"/>
+  <reg name="r5" bitsize="32"/>
+  <reg name="r6" bitsize="32"/>
+  <reg name="r7" bitsize="32"/>
+  <reg name="r8" bitsize="32"/>
+  <reg name="r9" bitsize="32"/>
+  <reg name="r10" bitsize="32"/>
+  <reg name="r11" bitsize="32"/>
+  <reg name="r12" bitsize="32"/>
+  <reg name="sp" bitsize="32" type="data_ptr"/>
+  <reg name="lr" bitsize="32"/>
+  <reg name="pc" bitsize="32" type="code_ptr"/>
+
+  <!-- Slack for unused FPA registers (f0-f7 + fps).
+       See arm-fpa.xml.  -->
+  <reg name="" bitsize="96" type="arm_fpa_ext" regnum="16"/>
+  <reg name="" bitsize="96" type="arm_fpa_ext"/>
+  <reg name="" bitsize="96" type="arm_fpa_ext"/>
+  <reg name="" bitsize="96" type="arm_fpa_ext"/>
+  <reg name="" bitsize="96" type="arm_fpa_ext"/>
+  <reg name="" bitsize="96" type="arm_fpa_ext"/>
+  <reg name="" bitsize="96" type="arm_fpa_ext"/>
+  <reg name="" bitsize="96" type="arm_fpa_ext"/>
+  <reg name="" bitsize="32"/>
+
+  <reg name="xpsr" bitsize="32" regnum="25"/>
+</feature>
+</target>