* arm-tdep.c (arm_mode_strings, arm_fallback_mode_string)
authorDaniel Jacobowitz <drow@false.org>
Fri, 2 May 2008 16:00:36 +0000 (16:00 +0000)
committerDaniel Jacobowitz <drow@false.org>
Fri, 2 May 2008 16:00:36 +0000 (16:00 +0000)
(arm_force_mode_string, arm_show_fallback_mode)
(arm_show_force_mode): New.
(arm_pc_is_thumb): Honor fallback-mode and force-mode.  Use
arm_frame_is_thumb.
(_initialize_arm_tdep): Add "set arm fallback-mode"
and "set arm force-mode".
* NEWS: Document new commands.

* gdb.texinfo (ARM): Document set/show arm fallback-mode
and set/show arm force-mode.

gdb/ChangeLog
gdb/NEWS
gdb/arm-tdep.c
gdb/doc/ChangeLog
gdb/doc/gdb.texinfo

index 753d35041c2910d8c79fddf4b4160b041b56eb8e..9c6f60027be3b8076b2553ece3c63dcc5fa9ad8a 100644 (file)
@@ -1,3 +1,14 @@
+2008-05-02  Daniel Jacobowitz  <dan@codesourcery.com>
+
+       * arm-tdep.c (arm_mode_strings, arm_fallback_mode_string)
+       (arm_force_mode_string, arm_show_fallback_mode)
+       (arm_show_force_mode): New.
+       (arm_pc_is_thumb): Honor fallback-mode and force-mode.  Use
+       arm_frame_is_thumb.
+       (_initialize_arm_tdep): Add "set arm fallback-mode"
+       and "set arm force-mode".
+       * NEWS: Document new commands.
+
 2008-05-02  Andrew Stubbs  <andrew.stubbs@st.com>
 
        * main.h (batch_silent): Declare.
index 4602ffdc8ab008b45b19ffcd62c437079093f159..ecee8685e5abbdf09cc8c71945b2c0713d72223e 100644 (file)
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -53,6 +53,15 @@ show breakpoint always-inserted
   them when resuming the target, and removing them when the target stops.
   This option can improve debugger performance on slow remote targets.
 
+set arm fallback-mode (arm|thumb|auto)
+show arm fallback-mode
+set arm force-mode (arm|thumb|auto)
+show arm force-mode
+  These commands control how ARM GDB determines whether instructions
+  are ARM or Thumb.  The default for both settings is auto, which uses
+  the current CPSR value for instructions without symbols; previous
+  versions of GDB behaved as if "set arm fallback-mode arm".
+
 *** Changes in GDB 6.8
 
 * New native configurations
index 50767fe5770311bb5c01ea3853130be6031ffe55..0380dcd29f87cf3015b80a67b2f7472fb3304062 100644 (file)
@@ -101,6 +101,17 @@ static const char *arm_abi_strings[] =
 static enum arm_abi_kind arm_abi_global = ARM_ABI_AUTO;
 static const char *arm_abi_string = "auto";
 
+/* The execution mode to assume.  */
+static const char *arm_mode_strings[] =
+  {
+    "auto",
+    "arm",
+    "thumb"
+  };
+
+static const char *arm_fallback_mode_string = "auto";
+static const char *arm_force_mode_string = "auto";
+
 /* Number of different reg name sets (options).  */
 static int num_disassembly_options;
 
@@ -240,16 +251,33 @@ arm_pc_is_thumb (CORE_ADDR memaddr)
   if (IS_THUMB_ADDR (memaddr))
     return 1;
 
+  /* If the user wants to override the symbol table, let him.  */
+  if (strcmp (arm_force_mode_string, "arm") == 0)
+    return 0;
+  if (strcmp (arm_force_mode_string, "thumb") == 0)
+    return 1;
+
   /* Thumb functions have a "special" bit set in minimal symbols.  */
   sym = lookup_minimal_symbol_by_pc (memaddr);
   if (sym)
-    {
-      return (MSYMBOL_IS_SPECIAL (sym));
-    }
-  else
-    {
-      return 0;
-    }
+    return (MSYMBOL_IS_SPECIAL (sym));
+
+  /* If the user wants to override the fallback mode, let them.  */
+  if (strcmp (arm_fallback_mode_string, "arm") == 0)
+    return 0;
+  if (strcmp (arm_fallback_mode_string, "thumb") == 0)
+    return 1;
+
+  /* If we couldn't find any symbol, but we're talking to a running
+     target, then trust the current value of $cpsr.  This lets
+     "display/i $pc" always show the correct mode (though if there is
+     a symbol table we will not reach here, so it still may not be
+     displayed in the mode it will be executed).  */
+  if (target_has_registers)
+    return arm_frame_is_thumb (get_current_frame ());
+
+  /* Otherwise we're out of luck; we assume ARM.  */
+  return 0;
 }
 
 /* Remove useless bits from addresses in a running program.  */
@@ -2661,6 +2689,28 @@ The current ARM ABI is \"auto\" (currently \"%s\").\n"),
                      arm_abi_string);
 }
 
+static void
+arm_show_fallback_mode (struct ui_file *file, int from_tty,
+                       struct cmd_list_element *c, const char *value)
+{
+  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
+
+  fprintf_filtered (file, _("\
+The current execution mode assumed (when symbols are unavailable) is \"%s\".\n"),
+                   arm_fallback_mode_string);
+}
+
+static void
+arm_show_force_mode (struct ui_file *file, int from_tty,
+                    struct cmd_list_element *c, const char *value)
+{
+  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
+
+  fprintf_filtered (file, _("\
+The current execution mode assumed (even when symbols are available) is \"%s\".\n"),
+                   arm_force_mode_string);
+}
+
 /* If the user changes the register disassembly style used for info
    register and other commands, we have to also switch the style used
    in opcodes for disassembly output.  This function is run in the "set
@@ -3284,6 +3334,21 @@ vfp - VFP co-processor."),
                        NULL, arm_set_abi, arm_show_abi,
                        &setarmcmdlist, &showarmcmdlist);
 
+  /* Add two commands to allow the user to force the assumed
+     execution mode.  */
+  add_setshow_enum_cmd ("fallback-mode", class_support,
+                       arm_mode_strings, &arm_fallback_mode_string,
+                       _("Set the mode assumed when symbols are unavailable."),
+                       _("Show the mode assumed when symbols are unavailable."),
+                       NULL, NULL, arm_show_fallback_mode,
+                       &setarmcmdlist, &showarmcmdlist);
+  add_setshow_enum_cmd ("force-mode", class_support,
+                       arm_mode_strings, &arm_force_mode_string,
+                       _("Set the mode assumed even when symbols are available."),
+                       _("Show the mode assumed even when symbols are available."),
+                       NULL, NULL, arm_show_force_mode,
+                       &setarmcmdlist, &showarmcmdlist);
+
   /* Debugging flag.  */
   add_setshow_boolean_cmd ("arm", class_maintenance, &arm_debug,
                           _("Set ARM debugging."),
index 2b5b662ed1c9ea6750026989ba80f89818d90f6d..15d51f4468c2a7079703b900fde00e55edcc9534 100644 (file)
@@ -1,3 +1,8 @@
+2008-05-02  Daniel Jacobowitz  <dan@codesourcery.com>
+
+       * gdb.texinfo (ARM): Document set/show arm fallback-mode
+       and set/show arm force-mode.
+
 2008-05-02  Andreas Schwab  <schwab@suse.de>
 
        * gdbint.texinfo (Algorithms): Describe
index 46d5904ad7752388b5f91d020d255d1cf0863010..17c5b11ba9b01c94b62c6dc77e5be0c65a335717 100644 (file)
@@ -14894,6 +14894,26 @@ This command forces @value{GDBN} to use the specified ABI.
 @item show arm abi
 Show the currently used ABI.
 
+@item set arm fallback-mode (arm|thumb|auto)
+@value{GDBN} uses the symbol table, when available, to determine
+whether instructions are ARM or Thumb.  This command controls
+@value{GDBN}'s default behavior when the symbol table is not
+available.  The default is @samp{auto}, which causes @value{GDBN} to
+use the current execution mode (from the @code{T} bit in the @code{CPSR}
+register).
+
+@item show arm fallback-mode
+Show the current fallback instruction mode.
+
+@item set arm force-mode (arm|thumb|auto)
+This command overrides use of the symbol table to determine whether
+instructions are ARM or Thumb.  The default is @samp{auto}, which
+causes @value{GDBN} to use the symbol table and then the setting
+of @samp{set arm fallback-mode}.
+
+@item show arm force-mode
+Show the current forced instruction mode.
+
 @item set debug arm
 Toggle whether to display ARM-specific debugging messages from the ARM
 target support subsystem.