Fix GDB build when using --disable-gdbmi
authorSimon Marchi <simon.marchi@efficios.com>
Fri, 10 May 2019 21:22:09 +0000 (17:22 -0400)
committerSimon Marchi <simon.marchi@efficios.com>
Fri, 10 May 2019 21:22:09 +0000 (17:22 -0400)
Since commit

    b4be1b064860 ("Fix MI output for multi-location breakpoints")

we get this error when building with --disable-gdbmi:

      CXXLD  gdb
    /home/smarchi/src/binutils-gdb/gdb/breakpoint.c:6358: error: undefined reference to 'mi_multi_location_breakpoint_output_fixed(ui_out*)'

This is due to breakpoint.c using a function defined in mi/mi-main.c, even
though mi/mi-main.c isn't included in the build.

To fix it, use the flags feature of ui_out.  mi_ui_out has the new
fix_multi_location_breakpoint_output flag set for versions >= 3.  Also,
move the global variable fix_multi_location_breakpoint_output to
breakpoint.c, so it can be read there even when we build without MI.  I
renamed it to fix_multi_location_breakpoint_output_globally so it
doesn't clash with the new enumerator.

gdb/ChangeLog:

* breakpoint.h (fix_multi_location_breakpoint_output_globally):
New variable declaration.
* breakpoint.c (fix_multi_location_breakpoint_output_globally):
New variable.
(print_one_breakpoint): Use ui_out::test_flags and new global
variable to compute use_fixed_output.
* mi/mi-main.h (mi_multi_location_breakpoint_output_fixed):
Remove.
* mi/mi-main.c (fix_multi_location_breakpoint_output): Remove.
(mi_multi_location_breakpoint_output_fixed): Remove.
(mi_cmd_fix_multi_location_breakpoint_output): Adjust to set the
new variable.
* mi/mi-out.c (mi_ui_out::mi_ui_out): Set
fix_multi_location_breakpoint_output flag if version >= 3.
* ui-out.h (enum ui_out_flag)
<fix_multi_location_breakpoint_output>: New enumerator.

gdb/ChangeLog
gdb/breakpoint.c
gdb/breakpoint.h
gdb/mi/mi-main.c
gdb/mi/mi-main.h
gdb/mi/mi-out.c
gdb/ui-out.h

index 4da409633a9733b63bc746d7add7ac7bf1a73498..9492412efb9e9f93a78d2e5a120fb285ac8311af 100644 (file)
@@ -1,3 +1,22 @@
+2019-05-10  Simon Marchi  <simon.marchi@efficios.com>
+
+       * breakpoint.h (fix_multi_location_breakpoint_output_globally):
+       New variable declaration.
+       * breakpoint.c (fix_multi_location_breakpoint_output_globally):
+       New variable.
+       (print_one_breakpoint): Use ui_out::test_flags and new global
+       variable to compute use_fixed_output.
+       * mi/mi-main.h (mi_multi_location_breakpoint_output_fixed):
+       Remove.
+       * mi/mi-main.c (fix_multi_location_breakpoint_output): Remove.
+       (mi_multi_location_breakpoint_output_fixed): Remove.
+       (mi_cmd_fix_multi_location_breakpoint_output): Adjust to set the
+       new variable.
+       * mi/mi-out.c (mi_ui_out::mi_ui_out): Set
+       fix_multi_location_breakpoint_output flag if version >= 3.
+       * ui-out.h (enum ui_out_flag)
+       <fix_multi_location_breakpoint_output>: New enumerator.
+
 2019-05-10  Simon Marchi  <simon.marchi@efficios.com>
 
        * contrib/cc-with-tweaks.sh: Validate dwz's work.
index 35da97bd041b93dab4b52e589281d65e6e43b71d..054bb1b13da485a5ca89cacdc4fd2a51e68d1101 100644 (file)
@@ -6337,13 +6337,19 @@ print_one_breakpoint_location (struct breakpoint *b,
     }
 }
 
+/* See breakpoint.h. */
+
+bool fix_multi_location_breakpoint_output_globally = false;
+
 static void
 print_one_breakpoint (struct breakpoint *b,
                      struct bp_location **last_loc, 
                      int allflag)
 {
   struct ui_out *uiout = current_uiout;
-  bool use_fixed_output = mi_multi_location_breakpoint_output_fixed (uiout);
+  bool use_fixed_output
+    = (uiout->test_flags (fix_multi_location_breakpoint_output)
+       || fix_multi_location_breakpoint_output_globally);
 
   gdb::optional<ui_out_emit_tuple> bkpt_tuple_emitter (gdb::in_place, uiout, "bkpt");
   print_one_breakpoint_location (b, NULL, 0, last_loc, allflag);
index a91e3e334cfd47f7faefb0f59fb486822c0f2eb6..3646ea63cb81662391c76f5d2cc931c6759032ec 100644 (file)
@@ -1670,4 +1670,9 @@ extern void print_breakpoint (breakpoint *bp);
 /* Command element for the 'commands' command.  */
 extern cmd_list_element *commands_cmd_element;
 
+/* Whether to use the fixed output when printing information about a
+   multi-location breakpoint (see PR 9659).  */
+
+extern bool fix_multi_location_breakpoint_output_globally;
+
 #endif /* !defined (BREAKPOINT_H) */
index 2b9883cb99f4df237d69e7f0edbe2ef4452edd7c..01786c3c1e84602293f0ecb35621d7231babe6a1 100644 (file)
@@ -2699,31 +2699,13 @@ mi_cmd_trace_frame_collected (const char *command, char **argv, int argc)
   }
 }
 
-/* Whether to use the fixed output when printing information about a
-   multi-location breakpoint (see PR 9659).  */
-
-static bool fix_multi_location_breakpoint_output = false;
-
 /* See mi/mi-main.h.  */
 
 void
 mi_cmd_fix_multi_location_breakpoint_output (const char *command, char **argv,
                                             int argc)
 {
-  fix_multi_location_breakpoint_output = true;
-}
-
-/* See mi/mi-main.h.  */
-
-bool
-mi_multi_location_breakpoint_output_fixed (ui_out *uiout)
-{
-  mi_ui_out *mi_uiout = dynamic_cast<mi_ui_out *> (uiout);
-
-  if (mi_uiout == nullptr)
-    return false;
-
-  return mi_uiout->version () >= 3 || fix_multi_location_breakpoint_output;
+  fix_multi_location_breakpoint_output_globally = true;
 }
 
 void
index 72c4e594287aad7f7ff59bb13253f204a3267044..1986228d22bd8211b8235b024d4febc089158403 100644 (file)
@@ -59,12 +59,4 @@ extern struct mi_suppress_notification mi_suppress_notification;
 extern void mi_cmd_fix_multi_location_breakpoint_output (const char *command,
                                                         char **argv, int argc);
 
-/* Return whether -break-list, -break-insert, =breakpoint-created and
-   =breakpoint-modified should use the "fixed" output format (see PR
-   9659).
-
-   Return false if UIOUT is not an MI UI.  */
-
-extern bool mi_multi_location_breakpoint_output_fixed (ui_out *uiout);
-
 #endif /* MI_MI_MAIN_H */
index e485beef69cd7c3bd34882a47a564bd3f25b1fbe..d8bee0f39279b8f5a90dba55a04f92d334ac3735 100644 (file)
@@ -280,7 +280,9 @@ mi_ui_out::version ()
 /* Constructor for an `mi_out_data' object.  */
 
 mi_ui_out::mi_ui_out (int mi_version)
-: m_suppress_field_separator (false),
+: ui_out (mi_version >= 3
+         ? fix_multi_location_breakpoint_output : (ui_out_flag) 0),
+  m_suppress_field_separator (false),
   m_suppress_output (false),
   m_mi_version (mi_version)
 {
index 8d183060b533654cc91756d1dfa5aa637e360cdf..9eba70eedac646911e137348298fbc27d41ec048 100644 (file)
@@ -49,9 +49,10 @@ enum ui_align
 
 /* flags enum */
 enum ui_out_flag
-  {
-    ui_source_list = (1 << 0),
-  };
+{
+  ui_source_list = (1 << 0),
+  fix_multi_location_breakpoint_output = (1 << 1),
+};
 
 DEF_ENUM_FLAGS_TYPE (ui_out_flag, ui_out_flags);