gdb: get_frame_language now takes a frame parameter.
authorAndrew Burgess <andrew.burgess@embecosm.com>
Tue, 14 Jul 2015 14:07:35 +0000 (15:07 +0100)
committerAndrew Burgess <andrew.burgess@embecosm.com>
Fri, 7 Aug 2015 09:54:59 +0000 (11:54 +0200)
As part of a drive to remove deprecated_safe_get_selected_frame, make
the get_frame_language function take a frame parameter.  Given the name
of the function this actually seems to make a lot of sense.

The task of fetching a suitable frame is then passed to the calling
functions.  For get_frame_language there are not many callers, these are
updated to get the selected frame in a suitable way.

gdb/ChangeLog:

* language.c (show_language_command): Find selected frame before
asking for the language of that frame.
(set_language_command): Likewise.
* language.h (get_frame_language): Add frame parameter.
* stack.c (get_frame_language): Add frame parameter, assert
parameter is not NULL, update comment and reindent.
* top.c (check_frame_language_change): Pass the selected frame
into get_frame_language.

gdb/ChangeLog
gdb/language.c
gdb/language.h
gdb/stack.c
gdb/top.c

index e9ba281..14f3638 100644 (file)
@@ -1,3 +1,14 @@
+2015-08-07  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+       * language.c (show_language_command): Find selected frame before
+       asking for the language of that frame.
+       (set_language_command): Likewise.
+       * language.h (get_frame_language): Add frame parameter.
+       * stack.c (get_frame_language): Add frame parameter, assert
+       parameter is not NULL, update comment and reindent.
+       * top.c (check_frame_language_change): Pass the selected frame
+       into get_frame_language.
+
 2015-08-07  Markus Metzger  <markus.t.metzger@intel.com>
 
        * btrace.c (btrace_compute_ftrace_bts): Clear insn flags.
index a8b432e..ab767c3 100644 (file)
@@ -118,7 +118,7 @@ static void
 show_language_command (struct ui_file *file, int from_tty,
                       struct cmd_list_element *c, const char *value)
 {
-  enum language flang;         /* The language of the current frame.  */
+  enum language flang;         /* The language of the frame.  */
 
   if (language_mode == language_mode_auto)
     fprintf_filtered (gdb_stdout,
@@ -130,11 +130,17 @@ show_language_command (struct ui_file *file, int from_tty,
                      _("The current source language is \"%s\".\n"),
                      current_language->la_name);
 
-  flang = get_frame_language ();
-  if (flang != language_unknown &&
-      language_mode == language_mode_manual &&
-      current_language->la_language != flang)
-    printf_filtered ("%s\n", lang_frame_mismatch_warn);
+  if (has_stack_frames ())
+    {
+      struct frame_info *frame;
+
+      frame = get_selected_frame (NULL);
+      flang = get_frame_language (frame);
+      if (flang != language_unknown
+         && language_mode == language_mode_manual
+         && current_language->la_language != flang)
+       printf_filtered ("%s\n", lang_frame_mismatch_warn);
+    }
 }
 
 /* Set command.  Change the current working language.  */
@@ -142,7 +148,7 @@ static void
 set_language_command (char *ignore, int from_tty, struct cmd_list_element *c)
 {
   int i;
-  enum language flang;
+  enum language flang = language_unknown;
 
   /* Search the list of languages for a match.  */
   for (i = 0; i < languages_size; i++)
@@ -155,7 +161,19 @@ set_language_command (char *ignore, int from_tty, struct cmd_list_element *c)
              /* Enter auto mode.  Set to the current frame's language, if
                  known, or fallback to the initial language.  */
              language_mode = language_mode_auto;
-             flang = get_frame_language ();
+             TRY
+               {
+                 struct frame_info *frame;
+
+                 frame = get_selected_frame (NULL);
+                 flang = get_frame_language (frame);
+               }
+             CATCH (ex, RETURN_MASK_ERROR)
+               {
+                 flang = language_unknown;
+               }
+             END_CATCH
+
              if (flang != language_unknown)
                set_language (flang);
              else
index 4ecb103..8782ef0 100644 (file)
@@ -544,7 +544,7 @@ extern const char *language_str (enum language);
 
 extern void add_language (const struct language_defn *);
 
-extern enum language get_frame_language (void);        /* In stack.c */
+extern enum language get_frame_language (struct frame_info *frame);    /* In stack.c */
 
 /* Check for a language-specific trampoline.  */
 
index b4cfdbd..31a723d 100644 (file)
@@ -2560,46 +2560,43 @@ func_command (char *arg, int from_tty)
     select_and_print_frame (frame);
 }
 
-/* Gets the language of the current frame.  */
+/* Gets the language of FRAME.  */
 
 enum language
-get_frame_language (void)
+get_frame_language (struct frame_info *frame)
 {
-  struct frame_info *frame = deprecated_safe_get_selected_frame ();
+  CORE_ADDR pc = 0;
+  int pc_p = 0;
 
-  if (frame)
-    {
-      CORE_ADDR pc = 0;
-      int pc_p = 0;
+  gdb_assert (frame!= NULL);
 
-      /* We determine the current frame language by looking up its
-         associated symtab.  To retrieve this symtab, we use the frame
-         PC.  However we cannot use the frame PC as is, because it
-         usually points to the instruction following the "call", which
-         is sometimes the first instruction of another function.  So
-         we rely on get_frame_address_in_block(), it provides us with
-         a PC that is guaranteed to be inside the frame's code
-         block.  */
+    /* We determine the current frame language by looking up its
+       associated symtab.  To retrieve this symtab, we use the frame
+       PC.  However we cannot use the frame PC as is, because it
+       usually points to the instruction following the "call", which
+       is sometimes the first instruction of another function.  So
+       we rely on get_frame_address_in_block(), it provides us with
+       a PC that is guaranteed to be inside the frame's code
+       block.  */
 
-      TRY
-       {
-         pc = get_frame_address_in_block (frame);
-         pc_p = 1;
-       }
-      CATCH (ex, RETURN_MASK_ERROR)
-       {
-         if (ex.error != NOT_AVAILABLE_ERROR)
-           throw_exception (ex);
-       }
-      END_CATCH
+  TRY
+    {
+      pc = get_frame_address_in_block (frame);
+      pc_p = 1;
+    }
+  CATCH (ex, RETURN_MASK_ERROR)
+    {
+      if (ex.error != NOT_AVAILABLE_ERROR)
+       throw_exception (ex);
+    }
+  END_CATCH
 
-      if (pc_p)
-       {
-         struct compunit_symtab *cust = find_pc_compunit_symtab (pc);
+  if (pc_p)
+    {
+      struct compunit_symtab *cust = find_pc_compunit_symtab (pc);
 
-         if (cust != NULL)
-           return compunit_language (cust);
-       }
+      if (cust != NULL)
+       return compunit_language (cust);
     }
 
   return language_unknown;
index 3e88ac6..0130acf 100644 (file)
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -329,10 +329,11 @@ void
 check_frame_language_change (void)
 {
   static int warned = 0;
+  struct frame_info *frame;
 
   /* First make sure that a new frame has been selected, in case the
      command or the hooks changed the program state.  */
-  deprecated_safe_get_selected_frame ();
+  frame = deprecated_safe_get_selected_frame ();
   if (current_language != expected_language)
     {
       if (language_mode == language_mode_auto && info_verbose)
@@ -352,7 +353,7 @@ check_frame_language_change (void)
     {
       enum language flang;
 
-      flang = get_frame_language ();
+      flang = get_frame_language (frame);
       if (!warned
          && flang != language_unknown
          && flang != current_language->la_language)