summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2017-10-12 15:07:35 -0600
committerTom Tromey <tom@tromey.com>2017-10-17 06:43:33 -0600
commit30f0b1015897466fb88ed26c56a0b4f42808edbc (patch)
treef11194531fbe8cd3ad3dee208df1306989c9a897
parent57e12da97f8dbe2ad5b4f59bf89c709c4d66600d (diff)
downloadbinutils-gdb-30f0b1015897466fb88ed26c56a0b4f42808edbc.tar.gz
Remove cleanups from disasm.c
This changes the remaining spots in disasm.c to use the RAII ui-out emitters, removing a few cleanups. This also fixes a regression that Simon pointed out. 2017-10-17 Tom Tromey <tom@tromey.com> * disasm.c (do_mixed_source_and_assembly_deprecated): Use gdb::optional, ui_out_emit_list, ui_out_emit_tuple. (do_mixed_source_and_assembly): Likewise.
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/disasm.c82
2 files changed, 35 insertions, 53 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 0487dab28f3..e16b04871e4 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,11 @@
2017-10-17 Tom Tromey <tom@tromey.com>
+ * disasm.c (do_mixed_source_and_assembly_deprecated): Use
+ gdb::optional, ui_out_emit_list, ui_out_emit_tuple.
+ (do_mixed_source_and_assembly): Likewise.
+
+2017-10-17 Tom Tromey <tom@tromey.com>
+
* regcache.c (regcache::xfer_part): Remove assertion.
2017-10-17 Pedro Alves <palves@redhat.com>
diff --git a/gdb/disasm.c b/gdb/disasm.c
index cdab1814842..ab23384438b 100644
--- a/gdb/disasm.c
+++ b/gdb/disasm.c
@@ -29,6 +29,7 @@
#include "source.h"
#include "safe-ctype.h"
#include <algorithm>
+#include "common/gdb_optional.h"
/* Disassemble functions.
FIXME: We should get rid of all the duplicate code in gdb that does
@@ -350,9 +351,6 @@ do_mixed_source_and_assembly_deprecated
int next_line = 0;
int num_displayed = 0;
print_source_lines_flags psl_flags = 0;
- struct cleanup *ui_out_chain;
- struct cleanup *ui_out_tuple_chain = make_cleanup (null_cleanup, 0);
- struct cleanup *ui_out_list_chain = make_cleanup (null_cleanup, 0);
gdb_assert (symtab != NULL && SYMTAB_LINETABLE (symtab) != NULL);
@@ -414,7 +412,10 @@ do_mixed_source_and_assembly_deprecated
they have been emitted before), followed by the assembly code
for that line. */
- ui_out_chain = make_cleanup_ui_out_list_begin_end (uiout, "asm_insns");
+ ui_out_emit_list asm_insns_list (uiout, "asm_insns");
+
+ gdb::optional<ui_out_emit_tuple> outer_tuple_emitter;
+ gdb::optional<ui_out_emit_list> inner_list_emitter;
for (i = 0; i < newlines; i++)
{
@@ -426,9 +427,7 @@ do_mixed_source_and_assembly_deprecated
/* Just one line to print. */
if (next_line == mle[i].line)
{
- ui_out_tuple_chain
- = make_cleanup_ui_out_tuple_begin_end (uiout,
- "src_and_asm_line");
+ outer_tuple_emitter.emplace (uiout, "src_and_asm_line");
print_source_lines (symtab, next_line, mle[i].line + 1, psl_flags);
}
else
@@ -436,36 +435,27 @@ do_mixed_source_and_assembly_deprecated
/* Several source lines w/o asm instructions associated. */
for (; next_line < mle[i].line; next_line++)
{
- struct cleanup *ui_out_list_chain_line;
-
ui_out_emit_tuple tuple_emitter (uiout,
"src_and_asm_line");
print_source_lines (symtab, next_line, next_line + 1,
psl_flags);
- ui_out_list_chain_line
- = make_cleanup_ui_out_list_begin_end (uiout,
- "line_asm_insn");
- do_cleanups (ui_out_list_chain_line);
+ ui_out_emit_list inner_list_emitter (uiout,
+ "line_asm_insn");
}
/* Print the last line and leave list open for
asm instructions to be added. */
- ui_out_tuple_chain
- = make_cleanup_ui_out_tuple_begin_end (uiout,
- "src_and_asm_line");
+ outer_tuple_emitter.emplace (uiout, "src_and_asm_line");
print_source_lines (symtab, next_line, mle[i].line + 1, psl_flags);
}
}
else
{
- ui_out_tuple_chain
- = make_cleanup_ui_out_tuple_begin_end (uiout,
- "src_and_asm_line");
+ outer_tuple_emitter.emplace (uiout, "src_and_asm_line");
print_source_lines (symtab, mle[i].line, mle[i].line + 1, psl_flags);
}
next_line = mle[i].line + 1;
- ui_out_list_chain
- = make_cleanup_ui_out_list_begin_end (uiout, "line_asm_insn");
+ inner_list_emitter.emplace (uiout, "line_asm_insn");
}
num_displayed += dump_insns (gdbarch, uiout,
@@ -476,16 +466,13 @@ do_mixed_source_and_assembly_deprecated
assembly range for this source line, close out the list/tuple. */
if (i == (newlines - 1) || mle[i + 1].line > mle[i].line)
{
- do_cleanups (ui_out_list_chain);
- do_cleanups (ui_out_tuple_chain);
- ui_out_tuple_chain = make_cleanup (null_cleanup, 0);
- ui_out_list_chain = make_cleanup (null_cleanup, 0);
+ inner_list_emitter.reset ();
+ outer_tuple_emitter.reset ();
uiout->text ("\n");
}
if (how_many >= 0 && num_displayed >= how_many)
break;
}
- do_cleanups (ui_out_chain);
}
/* The idea here is to present a source-O-centric view of a
@@ -504,9 +491,6 @@ do_mixed_source_and_assembly (struct gdbarch *gdbarch,
int i, nlines;
int num_displayed = 0;
print_source_lines_flags psl_flags = 0;
- struct cleanup *ui_out_chain;
- struct cleanup *ui_out_tuple_chain;
- struct cleanup *ui_out_list_chain;
CORE_ADDR pc;
struct symtab *last_symtab;
int last_line;
@@ -567,21 +551,21 @@ do_mixed_source_and_assembly (struct gdbarch *gdbarch,
CLI output works on top of this because MI ignores ui_out_text output,
which is where we put file name and source line contents output.
- Cleanup usage:
- ui_out_chain
+ Emitter usage:
+ asm_insns_emitter
Handles the outer "asm_insns" list.
- ui_out_tuple_chain
+ tuple_emitter
The tuples for each group of consecutive disassemblies.
- ui_out_list_chain
+ list_emitter
List of consecutive source lines or disassembled insns. */
if (flags & DISASSEMBLY_FILENAME)
psl_flags |= PRINT_SOURCE_LINES_FILENAME;
- ui_out_chain = make_cleanup_ui_out_list_begin_end (uiout, "asm_insns");
+ ui_out_emit_list asm_insns_emitter (uiout, "asm_insns");
- ui_out_tuple_chain = NULL;
- ui_out_list_chain = NULL;
+ gdb::optional<ui_out_emit_tuple> tuple_emitter;
+ gdb::optional<ui_out_emit_list> list_emitter;
last_symtab = NULL;
last_line = 0;
@@ -650,11 +634,11 @@ do_mixed_source_and_assembly (struct gdbarch *gdbarch,
/* Skip the newline if this is the first instruction. */
if (pc > low)
uiout->text ("\n");
- if (ui_out_tuple_chain != NULL)
+ if (tuple_emitter.has_value ())
{
- gdb_assert (ui_out_list_chain != NULL);
- do_cleanups (ui_out_list_chain);
- do_cleanups (ui_out_tuple_chain);
+ gdb_assert (list_emitter.has_value ());
+ list_emitter.reset ();
+ tuple_emitter.reset ();
}
if (sal.symtab != last_symtab
&& !(flags & DISASSEMBLY_FILENAME))
@@ -676,7 +660,6 @@ do_mixed_source_and_assembly (struct gdbarch *gdbarch,
We need to preserve the structure of the output, so output
a bunch of line tuples with no asm entries. */
int l;
- struct cleanup *ui_out_list_chain_line;
gdb_assert (sal.symtab != NULL);
for (l = start_preceding_line_to_display;
@@ -685,28 +668,23 @@ do_mixed_source_and_assembly (struct gdbarch *gdbarch,
{
ui_out_emit_tuple tuple_emitter (uiout, "src_and_asm_line");
print_source_lines (sal.symtab, l, l + 1, psl_flags);
- ui_out_list_chain_line
- = make_cleanup_ui_out_list_begin_end (uiout,
- "line_asm_insn");
- do_cleanups (ui_out_list_chain_line);
+ ui_out_emit_list chain_line_emitter (uiout, "line_asm_insn");
}
}
- ui_out_tuple_chain
- = make_cleanup_ui_out_tuple_begin_end (uiout, "src_and_asm_line");
+ tuple_emitter.emplace (uiout, "src_and_asm_line");
if (sal.symtab != NULL)
print_source_lines (sal.symtab, sal.line, sal.line + 1, psl_flags);
else
uiout->text (_("--- no source info for this pc ---\n"));
- ui_out_list_chain
- = make_cleanup_ui_out_list_begin_end (uiout, "line_asm_insn");
+ list_emitter.emplace (uiout, "line_asm_insn");
}
else
{
/* Here we're appending instructions to an existing line.
By construction the very first insn will have a symtab
and follow the new_source_line path above. */
- gdb_assert (ui_out_tuple_chain != NULL);
- gdb_assert (ui_out_list_chain != NULL);
+ gdb_assert (tuple_emitter.has_value ());
+ gdb_assert (list_emitter.has_value ());
}
if (sal.end != 0)
@@ -723,8 +701,6 @@ do_mixed_source_and_assembly (struct gdbarch *gdbarch,
last_symtab = sal.symtab;
last_line = sal.line;
}
-
- do_cleanups (ui_out_chain);
}
static void