]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/disasm.c
Change tui_data_item_window::content to be a unique_xmalloc_ptr
[thirdparty/binutils-gdb.git] / gdb / disasm.c
CommitLineData
92df71f0 1/* Disassemble support for GDB.
1bac305b 2
42a4f53d 3 Copyright (C) 2000-2019 Free Software Foundation, Inc.
92df71f0
FN
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
92df71f0
FN
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
92df71f0
FN
19
20#include "defs.h"
65b48a81 21#include "arch-utils.h"
4de283e4
TT
22#include "target.h"
23#include "value.h"
24#include "ui-out.h"
92df71f0 25#include "disasm.h"
d55e5aa6 26#include "gdbcore.h"
4de283e4
TT
27#include "gdbcmd.h"
28#include "dis-asm.h"
d55e5aa6 29#include "source.h"
4de283e4
TT
30#include "safe-ctype.h"
31#include <algorithm>
268a13a5 32#include "gdbsupport/gdb_optional.h"
c7110220 33#include "valprint.h"
92df71f0
FN
34
35/* Disassemble functions.
36 FIXME: We should get rid of all the duplicate code in gdb that does
0963b4bd 37 the same thing: disassemble_command() and the gdbtk variation. */
92df71f0 38
65b48a81
PB
39/* This variable is used to hold the prospective disassembler_options value
40 which is set by the "set disassembler_options" command. */
41static char *prospective_options = NULL;
42
6ff0ba5f
DE
43/* This structure is used to store line number information for the
44 deprecated /m option.
92df71f0
FN
45 We need a different sort of line table from the normal one cuz we can't
46 depend upon implicit line-end pc's for lines to do the
47 reordering in this function. */
48
6ff0ba5f 49struct deprecated_dis_line_entry
92df71f0
FN
50{
51 int line;
52 CORE_ADDR start_pc;
53 CORE_ADDR end_pc;
54};
55
6ff0ba5f
DE
56/* This Structure is used to store line number information.
57 We need a different sort of line table from the normal one cuz we can't
58 depend upon implicit line-end pc's for lines to do the
59 reordering in this function. */
60
61struct dis_line_entry
62{
63 struct symtab *symtab;
64 int line;
65};
66
67/* Hash function for dis_line_entry. */
68
69static hashval_t
70hash_dis_line_entry (const void *item)
71{
9a3c8263 72 const struct dis_line_entry *dle = (const struct dis_line_entry *) item;
6ff0ba5f
DE
73
74 return htab_hash_pointer (dle->symtab) + dle->line;
75}
76
77/* Equal function for dis_line_entry. */
78
79static int
80eq_dis_line_entry (const void *item_lhs, const void *item_rhs)
81{
9a3c8263
SM
82 const struct dis_line_entry *lhs = (const struct dis_line_entry *) item_lhs;
83 const struct dis_line_entry *rhs = (const struct dis_line_entry *) item_rhs;
6ff0ba5f
DE
84
85 return (lhs->symtab == rhs->symtab
86 && lhs->line == rhs->line);
87}
88
89/* Create the table to manage lines for mixed source/disassembly. */
90
91static htab_t
92allocate_dis_line_table (void)
93{
94 return htab_create_alloc (41,
95 hash_dis_line_entry, eq_dis_line_entry,
96 xfree, xcalloc, xfree);
97}
98
4a099de2 99/* Add a new dis_line_entry containing SYMTAB and LINE to TABLE. */
6ff0ba5f
DE
100
101static void
4a099de2 102add_dis_line_entry (htab_t table, struct symtab *symtab, int line)
6ff0ba5f
DE
103{
104 void **slot;
105 struct dis_line_entry dle, *dlep;
106
107 dle.symtab = symtab;
108 dle.line = line;
109 slot = htab_find_slot (table, &dle, INSERT);
110 if (*slot == NULL)
111 {
112 dlep = XNEW (struct dis_line_entry);
113 dlep->symtab = symtab;
114 dlep->line = line;
115 *slot = dlep;
116 }
117}
118
119/* Return non-zero if SYMTAB, LINE are in TABLE. */
120
121static int
122line_has_code_p (htab_t table, struct symtab *symtab, int line)
123{
124 struct dis_line_entry dle;
125
126 dle.symtab = symtab;
127 dle.line = line;
128 return htab_find (table, &dle) != NULL;
129}
130
e47ad6c0
YQ
131/* Wrapper of target_read_code. */
132
133int
134gdb_disassembler::dis_asm_read_memory (bfd_vma memaddr, gdb_byte *myaddr,
135 unsigned int len,
136 struct disassemble_info *info)
810ecf9f 137{
283f7163 138 return target_read_code (memaddr, myaddr, len);
810ecf9f
AC
139}
140
e47ad6c0
YQ
141/* Wrapper of memory_error. */
142
143void
144gdb_disassembler::dis_asm_memory_error (int err, bfd_vma memaddr,
145 struct disassemble_info *info)
810ecf9f 146{
d8b49cf0
YQ
147 gdb_disassembler *self
148 = static_cast<gdb_disassembler *>(info->application_data);
149
150 self->m_err_memaddr = memaddr;
810ecf9f
AC
151}
152
e47ad6c0
YQ
153/* Wrapper of print_address. */
154
155void
156gdb_disassembler::dis_asm_print_address (bfd_vma addr,
157 struct disassemble_info *info)
810ecf9f 158{
e47ad6c0
YQ
159 gdb_disassembler *self
160 = static_cast<gdb_disassembler *>(info->application_data);
9a619af0 161
e47ad6c0 162 print_address (self->arch (), addr, self->stream ());
810ecf9f
AC
163}
164
92df71f0 165static int
bde58177 166compare_lines (const void *mle1p, const void *mle2p)
92df71f0 167{
6ff0ba5f 168 struct deprecated_dis_line_entry *mle1, *mle2;
92df71f0
FN
169 int val;
170
6ff0ba5f
DE
171 mle1 = (struct deprecated_dis_line_entry *) mle1p;
172 mle2 = (struct deprecated_dis_line_entry *) mle2p;
92df71f0 173
9011945e
AB
174 /* End of sequence markers have a line number of 0 but don't want to
175 be sorted to the head of the list, instead sort by PC. */
176 if (mle1->line == 0 || mle2->line == 0)
177 {
178 val = mle1->start_pc - mle2->start_pc;
179 if (val == 0)
180 val = mle1->line - mle2->line;
181 }
182 else
183 {
184 val = mle1->line - mle2->line;
185 if (val == 0)
186 val = mle1->start_pc - mle2->start_pc;
187 }
188 return val;
92df71f0
FN
189}
190
a50a4026 191/* See disasm.h. */
af70908d 192
a50a4026 193int
046bebe1 194gdb_pretty_print_disassembler::pretty_print_insn (const struct disasm_insn *insn,
9a24775b 195 gdb_disassembly_flags flags)
92df71f0 196{
92df71f0
FN
197 /* parts of the symbolic representation of the address */
198 int unmapped;
92df71f0
FN
199 int offset;
200 int line;
af70908d 201 int size;
a50a4026 202 CORE_ADDR pc;
8b172ce7 203 struct gdbarch *gdbarch = arch ();
af70908d 204
393702cd 205 {
046bebe1 206 ui_out_emit_tuple tuple_emitter (m_uiout, NULL);
393702cd
TT
207 pc = insn->addr;
208
209 if (insn->number != 0)
210 {
046bebe1
TT
211 m_uiout->field_unsigned ("insn-number", insn->number);
212 m_uiout->text ("\t");
393702cd
TT
213 }
214
215 if ((flags & DISASSEMBLY_SPECULATIVE) != 0)
216 {
217 if (insn->is_speculative)
218 {
046bebe1 219 m_uiout->field_string ("is-speculative", "?");
393702cd
TT
220
221 /* The speculative execution indication overwrites the first
222 character of the PC prefix.
223 We assume a PC prefix length of 3 characters. */
224 if ((flags & DISASSEMBLY_OMIT_PC) == 0)
046bebe1 225 m_uiout->text (pc_prefix (pc) + 1);
393702cd 226 else
046bebe1 227 m_uiout->text (" ");
393702cd
TT
228 }
229 else if ((flags & DISASSEMBLY_OMIT_PC) == 0)
046bebe1 230 m_uiout->text (pc_prefix (pc));
393702cd 231 else
046bebe1 232 m_uiout->text (" ");
393702cd
TT
233 }
234 else if ((flags & DISASSEMBLY_OMIT_PC) == 0)
046bebe1
TT
235 m_uiout->text (pc_prefix (pc));
236 m_uiout->field_core_addr ("address", gdbarch, pc);
393702cd 237
c7110220 238 std::string name, filename;
2dc80cf8
KB
239 bool omit_fname = ((flags & DISASSEMBLY_OMIT_FNAME) != 0);
240 if (!build_address_symbolic (gdbarch, pc, false, omit_fname, &name,
241 &offset, &filename, &line, &unmapped))
393702cd
TT
242 {
243 /* We don't care now about line, filename and unmapped. But we might in
244 the future. */
046bebe1 245 m_uiout->text (" <");
2dc80cf8 246 if (!omit_fname)
046bebe1
TT
247 m_uiout->field_string ("func-name", name.c_str (),
248 ui_out_style_kind::FUNCTION);
2dc80cf8
KB
249 /* For negative offsets, avoid displaying them as +-N; the sign of
250 the offset takes the place of the "+" here. */
251 if (offset >= 0)
046bebe1
TT
252 m_uiout->text ("+");
253 m_uiout->field_signed ("offset", offset);
254 m_uiout->text (">:\t");
393702cd
TT
255 }
256 else
046bebe1 257 m_uiout->text (":\t");
393702cd 258
393702cd
TT
259 m_insn_stb.clear ();
260
261 if (flags & DISASSEMBLY_RAW_INSN)
262 {
263 CORE_ADDR end_pc;
264 bfd_byte data;
393702cd
TT
265 const char *spacer = "";
266
267 /* Build the opcodes using a temporary stream so we can
268 write them out in a single go for the MI. */
269 m_opcode_stb.clear ();
270
271 size = m_di.print_insn (pc);
272 end_pc = pc + size;
273
274 for (;pc < end_pc; ++pc)
275 {
276 read_code (pc, &data, 1);
277 m_opcode_stb.printf ("%s%02x", spacer, (unsigned) data);
278 spacer = " ";
279 }
280
046bebe1
TT
281 m_uiout->field_stream ("opcodes", m_opcode_stb);
282 m_uiout->text ("\t");
393702cd
TT
283 }
284 else
8b172ce7 285 size = m_di.print_insn (pc);
af70908d 286
046bebe1 287 m_uiout->field_stream ("inst", m_insn_stb);
393702cd 288 }
046bebe1 289 m_uiout->text ("\n");
af70908d
MM
290
291 return size;
292}
293
294static int
187808b0
PA
295dump_insns (struct gdbarch *gdbarch,
296 struct ui_out *uiout, CORE_ADDR low, CORE_ADDR high,
9a24775b 297 int how_many, gdb_disassembly_flags flags, CORE_ADDR *end_pc)
af70908d 298{
a50a4026 299 struct disasm_insn insn;
af70908d
MM
300 int num_displayed = 0;
301
a50a4026
MM
302 memset (&insn, 0, sizeof (insn));
303 insn.addr = low;
304
046bebe1 305 gdb_pretty_print_disassembler disasm (gdbarch, uiout);
8b172ce7 306
a50a4026 307 while (insn.addr < high && (how_many < 0 || num_displayed < how_many))
af70908d
MM
308 {
309 int size;
310
046bebe1 311 size = disasm.pretty_print_insn (&insn, flags);
af70908d
MM
312 if (size <= 0)
313 break;
314
315 ++num_displayed;
a50a4026 316 insn.addr += size;
af70908d
MM
317
318 /* Allow user to bail out with ^C. */
319 QUIT;
92df71f0 320 }
6ff0ba5f
DE
321
322 if (end_pc != NULL)
a50a4026 323 *end_pc = insn.addr;
af70908d 324
92df71f0
FN
325 return num_displayed;
326}
327
328/* The idea here is to present a source-O-centric view of a
329 function to the user. This means that things are presented
330 in source order, with (possibly) out of order assembly
6ff0ba5f
DE
331 immediately following.
332
333 N.B. This view is deprecated. */
0963b4bd 334
92df71f0 335static void
6ff0ba5f 336do_mixed_source_and_assembly_deprecated
187808b0
PA
337 (struct gdbarch *gdbarch, struct ui_out *uiout,
338 struct symtab *symtab,
6ff0ba5f 339 CORE_ADDR low, CORE_ADDR high,
9a24775b 340 int how_many, gdb_disassembly_flags flags)
92df71f0
FN
341{
342 int newlines = 0;
6ff0ba5f
DE
343 int nlines;
344 struct linetable_entry *le;
345 struct deprecated_dis_line_entry *mle;
92df71f0
FN
346 struct symtab_and_line sal;
347 int i;
348 int out_of_order = 0;
349 int next_line = 0;
92df71f0 350 int num_displayed = 0;
8d297bbf 351 print_source_lines_flags psl_flags = 0;
92df71f0 352
6ff0ba5f
DE
353 gdb_assert (symtab != NULL && SYMTAB_LINETABLE (symtab) != NULL);
354
355 nlines = SYMTAB_LINETABLE (symtab)->nitems;
356 le = SYMTAB_LINETABLE (symtab)->item;
357
4cd29721
MM
358 if (flags & DISASSEMBLY_FILENAME)
359 psl_flags |= PRINT_SOURCE_LINES_FILENAME;
360
6ff0ba5f
DE
361 mle = (struct deprecated_dis_line_entry *)
362 alloca (nlines * sizeof (struct deprecated_dis_line_entry));
92df71f0
FN
363
364 /* Copy linetable entries for this function into our data
365 structure, creating end_pc's and setting out_of_order as
366 appropriate. */
367
368 /* First, skip all the preceding functions. */
369
370 for (i = 0; i < nlines - 1 && le[i].pc < low; i++);
371
372 /* Now, copy all entries before the end of this function. */
373
374 for (; i < nlines - 1 && le[i].pc < high; i++)
375 {
376 if (le[i].line == le[i + 1].line && le[i].pc == le[i + 1].pc)
0963b4bd 377 continue; /* Ignore duplicates. */
92df71f0
FN
378
379 /* Skip any end-of-function markers. */
380 if (le[i].line == 0)
381 continue;
382
383 mle[newlines].line = le[i].line;
384 if (le[i].line > le[i + 1].line)
385 out_of_order = 1;
386 mle[newlines].start_pc = le[i].pc;
387 mle[newlines].end_pc = le[i + 1].pc;
388 newlines++;
389 }
390
391 /* If we're on the last line, and it's part of the function,
392 then we need to get the end pc in a special way. */
393
394 if (i == nlines - 1 && le[i].pc < high)
395 {
396 mle[newlines].line = le[i].line;
397 mle[newlines].start_pc = le[i].pc;
398 sal = find_pc_line (le[i].pc, 0);
399 mle[newlines].end_pc = sal.end;
400 newlines++;
401 }
402
6ff0ba5f 403 /* Now, sort mle by line #s (and, then by addresses within lines). */
92df71f0
FN
404
405 if (out_of_order)
6ff0ba5f
DE
406 qsort (mle, newlines, sizeof (struct deprecated_dis_line_entry),
407 compare_lines);
92df71f0
FN
408
409 /* Now, for each line entry, emit the specified lines (unless
410 they have been emitted before), followed by the assembly code
411 for that line. */
412
30f0b101
TT
413 ui_out_emit_list asm_insns_list (uiout, "asm_insns");
414
415 gdb::optional<ui_out_emit_tuple> outer_tuple_emitter;
416 gdb::optional<ui_out_emit_list> inner_list_emitter;
92df71f0
FN
417
418 for (i = 0; i < newlines; i++)
419 {
92df71f0
FN
420 /* Print out everything from next_line to the current line. */
421 if (mle[i].line >= next_line)
422 {
423 if (next_line != 0)
424 {
0963b4bd 425 /* Just one line to print. */
92df71f0
FN
426 if (next_line == mle[i].line)
427 {
30f0b101 428 outer_tuple_emitter.emplace (uiout, "src_and_asm_line");
4cd29721 429 print_source_lines (symtab, next_line, mle[i].line + 1, psl_flags);
92df71f0
FN
430 }
431 else
432 {
0963b4bd 433 /* Several source lines w/o asm instructions associated. */
92df71f0
FN
434 for (; next_line < mle[i].line; next_line++)
435 {
2e783024
TT
436 ui_out_emit_tuple tuple_emitter (uiout,
437 "src_and_asm_line");
92df71f0 438 print_source_lines (symtab, next_line, next_line + 1,
4cd29721 439 psl_flags);
b926417a
TT
440 ui_out_emit_list temp_list_emitter (uiout,
441 "line_asm_insn");
92df71f0
FN
442 }
443 /* Print the last line and leave list open for
0963b4bd 444 asm instructions to be added. */
30f0b101 445 outer_tuple_emitter.emplace (uiout, "src_and_asm_line");
4cd29721 446 print_source_lines (symtab, next_line, mle[i].line + 1, psl_flags);
92df71f0
FN
447 }
448 }
449 else
450 {
30f0b101 451 outer_tuple_emitter.emplace (uiout, "src_and_asm_line");
4cd29721 452 print_source_lines (symtab, mle[i].line, mle[i].line + 1, psl_flags);
92df71f0
FN
453 }
454
455 next_line = mle[i].line + 1;
30f0b101 456 inner_list_emitter.emplace (uiout, "line_asm_insn");
92df71f0
FN
457 }
458
187808b0 459 num_displayed += dump_insns (gdbarch, uiout,
13274fc3 460 mle[i].start_pc, mle[i].end_pc,
e47ad6c0 461 how_many, flags, NULL);
0127c0d3
JJ
462
463 /* When we've reached the end of the mle array, or we've seen the last
464 assembly range for this source line, close out the list/tuple. */
465 if (i == (newlines - 1) || mle[i + 1].line > mle[i].line)
92df71f0 466 {
30f0b101
TT
467 inner_list_emitter.reset ();
468 outer_tuple_emitter.reset ();
112e8700 469 uiout->text ("\n");
92df71f0 470 }
0127c0d3
JJ
471 if (how_many >= 0 && num_displayed >= how_many)
472 break;
92df71f0 473 }
92df71f0
FN
474}
475
6ff0ba5f
DE
476/* The idea here is to present a source-O-centric view of a
477 function to the user. This means that things are presented
478 in source order, with (possibly) out of order assembly
479 immediately following. */
480
481static void
e47ad6c0
YQ
482do_mixed_source_and_assembly (struct gdbarch *gdbarch,
483 struct ui_out *uiout,
6ff0ba5f
DE
484 struct symtab *main_symtab,
485 CORE_ADDR low, CORE_ADDR high,
9a24775b 486 int how_many, gdb_disassembly_flags flags)
6ff0ba5f 487{
6ff0ba5f 488 const struct linetable_entry *le, *first_le;
6ff0ba5f 489 int i, nlines;
6ff0ba5f 490 int num_displayed = 0;
8d297bbf 491 print_source_lines_flags psl_flags = 0;
6ff0ba5f
DE
492 CORE_ADDR pc;
493 struct symtab *last_symtab;
494 int last_line;
6ff0ba5f
DE
495
496 gdb_assert (main_symtab != NULL && SYMTAB_LINETABLE (main_symtab) != NULL);
497
498 /* First pass: collect the list of all source files and lines.
499 We do this so that we can only print lines containing code once.
500 We try to print the source text leading up to the next instruction,
501 but if that text is for code that will be disassembled later, then
502 we'll want to defer printing it until later with its associated code. */
503
fc4007c9 504 htab_up dis_line_table (allocate_dis_line_table ());
6ff0ba5f
DE
505
506 pc = low;
507
508 /* The prologue may be empty, but there may still be a line number entry
509 for the opening brace which is distinct from the first line of code.
510 If the prologue has been eliminated find_pc_line may return the source
511 line after the opening brace. We still want to print this opening brace.
512 first_le is used to implement this. */
513
514 nlines = SYMTAB_LINETABLE (main_symtab)->nitems;
515 le = SYMTAB_LINETABLE (main_symtab)->item;
516 first_le = NULL;
517
518 /* Skip all the preceding functions. */
519 for (i = 0; i < nlines && le[i].pc < low; i++)
520 continue;
521
522 if (i < nlines && le[i].pc < high)
523 first_le = &le[i];
524
525 /* Add lines for every pc value. */
526 while (pc < high)
527 {
528 struct symtab_and_line sal;
529 int length;
530
531 sal = find_pc_line (pc, 0);
532 length = gdb_insn_length (gdbarch, pc);
533 pc += length;
534
535 if (sal.symtab != NULL)
fc4007c9 536 add_dis_line_entry (dis_line_table.get (), sal.symtab, sal.line);
6ff0ba5f
DE
537 }
538
539 /* Second pass: print the disassembly.
540
541 Output format, from an MI perspective:
542 The result is a ui_out list, field name "asm_insns", where elements have
543 name "src_and_asm_line".
544 Each element is a tuple of source line specs (field names line, file,
545 fullname), and field "line_asm_insn" which contains the disassembly.
546 Field "line_asm_insn" is a list of tuples: address, func-name, offset,
547 opcodes, inst.
548
549 CLI output works on top of this because MI ignores ui_out_text output,
550 which is where we put file name and source line contents output.
551
30f0b101
TT
552 Emitter usage:
553 asm_insns_emitter
6ff0ba5f 554 Handles the outer "asm_insns" list.
30f0b101 555 tuple_emitter
6ff0ba5f 556 The tuples for each group of consecutive disassemblies.
30f0b101 557 list_emitter
6ff0ba5f
DE
558 List of consecutive source lines or disassembled insns. */
559
560 if (flags & DISASSEMBLY_FILENAME)
561 psl_flags |= PRINT_SOURCE_LINES_FILENAME;
562
30f0b101 563 ui_out_emit_list asm_insns_emitter (uiout, "asm_insns");
6ff0ba5f 564
30f0b101
TT
565 gdb::optional<ui_out_emit_tuple> tuple_emitter;
566 gdb::optional<ui_out_emit_list> list_emitter;
6ff0ba5f
DE
567
568 last_symtab = NULL;
569 last_line = 0;
570 pc = low;
571
572 while (pc < high)
573 {
6ff0ba5f
DE
574 struct symtab_and_line sal;
575 CORE_ADDR end_pc;
576 int start_preceding_line_to_display = 0;
577 int end_preceding_line_to_display = 0;
578 int new_source_line = 0;
579
580 sal = find_pc_line (pc, 0);
581
582 if (sal.symtab != last_symtab)
583 {
584 /* New source file. */
585 new_source_line = 1;
586
587 /* If this is the first line of output, check for any preceding
588 lines. */
589 if (last_line == 0
590 && first_le != NULL
591 && first_le->line < sal.line)
592 {
593 start_preceding_line_to_display = first_le->line;
594 end_preceding_line_to_display = sal.line;
595 }
596 }
597 else
598 {
599 /* Same source file as last time. */
600 if (sal.symtab != NULL)
601 {
602 if (sal.line > last_line + 1 && last_line != 0)
603 {
604 int l;
605
606 /* Several preceding source lines. Print the trailing ones
607 not associated with code that we'll print later. */
608 for (l = sal.line - 1; l > last_line; --l)
609 {
fc4007c9
TT
610 if (line_has_code_p (dis_line_table.get (),
611 sal.symtab, l))
6ff0ba5f
DE
612 break;
613 }
614 if (l < sal.line - 1)
615 {
616 start_preceding_line_to_display = l + 1;
617 end_preceding_line_to_display = sal.line;
618 }
619 }
620 if (sal.line != last_line)
621 new_source_line = 1;
622 else
623 {
624 /* Same source line as last time. This can happen, depending
625 on the debug info. */
626 }
627 }
628 }
629
630 if (new_source_line)
631 {
632 /* Skip the newline if this is the first instruction. */
633 if (pc > low)
112e8700 634 uiout->text ("\n");
30f0b101 635 if (tuple_emitter.has_value ())
6ff0ba5f 636 {
30f0b101
TT
637 gdb_assert (list_emitter.has_value ());
638 list_emitter.reset ();
639 tuple_emitter.reset ();
6ff0ba5f
DE
640 }
641 if (sal.symtab != last_symtab
642 && !(flags & DISASSEMBLY_FILENAME))
643 {
644 /* Remember MI ignores ui_out_text.
645 We don't have to do anything here for MI because MI
646 output includes the source specs for each line. */
647 if (sal.symtab != NULL)
648 {
112e8700 649 uiout->text (symtab_to_filename_for_display (sal.symtab));
6ff0ba5f
DE
650 }
651 else
112e8700
SM
652 uiout->text ("unknown");
653 uiout->text (":\n");
6ff0ba5f
DE
654 }
655 if (start_preceding_line_to_display > 0)
656 {
657 /* Several source lines w/o asm instructions associated.
658 We need to preserve the structure of the output, so output
659 a bunch of line tuples with no asm entries. */
660 int l;
6ff0ba5f
DE
661
662 gdb_assert (sal.symtab != NULL);
663 for (l = start_preceding_line_to_display;
664 l < end_preceding_line_to_display;
665 ++l)
666 {
b926417a
TT
667 ui_out_emit_tuple line_tuple_emitter (uiout,
668 "src_and_asm_line");
6ff0ba5f 669 print_source_lines (sal.symtab, l, l + 1, psl_flags);
30f0b101 670 ui_out_emit_list chain_line_emitter (uiout, "line_asm_insn");
6ff0ba5f
DE
671 }
672 }
30f0b101 673 tuple_emitter.emplace (uiout, "src_and_asm_line");
6ff0ba5f
DE
674 if (sal.symtab != NULL)
675 print_source_lines (sal.symtab, sal.line, sal.line + 1, psl_flags);
676 else
112e8700 677 uiout->text (_("--- no source info for this pc ---\n"));
30f0b101 678 list_emitter.emplace (uiout, "line_asm_insn");
6ff0ba5f
DE
679 }
680 else
681 {
682 /* Here we're appending instructions to an existing line.
683 By construction the very first insn will have a symtab
684 and follow the new_source_line path above. */
30f0b101
TT
685 gdb_assert (tuple_emitter.has_value ());
686 gdb_assert (list_emitter.has_value ());
6ff0ba5f
DE
687 }
688
689 if (sal.end != 0)
325fac50 690 end_pc = std::min (sal.end, high);
6ff0ba5f
DE
691 else
692 end_pc = pc + 1;
187808b0 693 num_displayed += dump_insns (gdbarch, uiout, pc, end_pc,
e47ad6c0 694 how_many, flags, &end_pc);
6ff0ba5f
DE
695 pc = end_pc;
696
697 if (how_many >= 0 && num_displayed >= how_many)
698 break;
699
700 last_symtab = sal.symtab;
701 last_line = sal.line;
702 }
6ff0ba5f 703}
92df71f0
FN
704
705static void
187808b0 706do_assembly_only (struct gdbarch *gdbarch, struct ui_out *uiout,
92df71f0 707 CORE_ADDR low, CORE_ADDR high,
9a24775b 708 int how_many, gdb_disassembly_flags flags)
92df71f0 709{
10f489e5 710 ui_out_emit_list list_emitter (uiout, "asm_insns");
92df71f0 711
187808b0 712 dump_insns (gdbarch, uiout, low, high, how_many, flags, NULL);
92df71f0
FN
713}
714
92bf2b80
AC
715/* Initialize the disassemble info struct ready for the specified
716 stream. */
717
a0b31db1 718static int ATTRIBUTE_PRINTF (2, 3)
242e8be5
AC
719fprintf_disasm (void *stream, const char *format, ...)
720{
721 va_list args;
9a619af0 722
242e8be5 723 va_start (args, format);
9a3c8263 724 vfprintf_filtered ((struct ui_file *) stream, format, args);
242e8be5
AC
725 va_end (args);
726 /* Something non -ve. */
727 return 0;
728}
729
471b9d15
MR
730/* Combine implicit and user disassembler options and return them
731 in a newly-created string. */
732
733static std::string
734get_all_disassembler_options (struct gdbarch *gdbarch)
735{
736 const char *implicit = gdbarch_disassembler_options_implicit (gdbarch);
737 const char *options = get_disassembler_options (gdbarch);
738 const char *comma = ",";
739
740 if (implicit == nullptr)
741 {
742 implicit = "";
743 comma = "";
744 }
745
746 if (options == nullptr)
747 {
748 options = "";
749 comma = "";
750 }
751
752 return string_printf ("%s%s%s", implicit, comma, options);
753}
754
e47ad6c0
YQ
755gdb_disassembler::gdb_disassembler (struct gdbarch *gdbarch,
756 struct ui_file *file,
757 di_read_memory_ftype read_memory_func)
d8b49cf0
YQ
758 : m_gdbarch (gdbarch),
759 m_err_memaddr (0)
92df71f0 760{
e47ad6c0
YQ
761 init_disassemble_info (&m_di, file, fprintf_disasm);
762 m_di.flavour = bfd_target_unknown_flavour;
763 m_di.memory_error_func = dis_asm_memory_error;
764 m_di.print_address_func = dis_asm_print_address;
2b6fd0d8
AC
765 /* NOTE: cagney/2003-04-28: The original code, from the old Insight
766 disassembler had a local optomization here. By default it would
767 access the executable file, instead of the target memory (there
ce2826aa 768 was a growing list of exceptions though). Unfortunately, the
2b6fd0d8
AC
769 heuristic was flawed. Commands like "disassemble &variable"
770 didn't work as they relied on the access going to the target.
771 Further, it has been supperseeded by trust-read-only-sections
772 (although that should be superseeded by target_trust..._p()). */
e47ad6c0
YQ
773 m_di.read_memory_func = read_memory_func;
774 m_di.arch = gdbarch_bfd_arch_info (gdbarch)->arch;
775 m_di.mach = gdbarch_bfd_arch_info (gdbarch)->mach;
776 m_di.endian = gdbarch_byte_order (gdbarch);
777 m_di.endian_code = gdbarch_byte_order_for_code (gdbarch);
778 m_di.application_data = this;
471b9d15
MR
779 m_disassembler_options_holder = get_all_disassembler_options (gdbarch);
780 if (!m_disassembler_options_holder.empty ())
781 m_di.disassembler_options = m_disassembler_options_holder.c_str ();
e47ad6c0
YQ
782 disassemble_init_for_target (&m_di);
783}
784
785int
786gdb_disassembler::print_insn (CORE_ADDR memaddr,
787 int *branch_delay_insns)
788{
d8b49cf0
YQ
789 m_err_memaddr = 0;
790
e47ad6c0
YQ
791 int length = gdbarch_print_insn (arch (), memaddr, &m_di);
792
d8b49cf0
YQ
793 if (length < 0)
794 memory_error (TARGET_XFER_E_IO, m_err_memaddr);
795
e47ad6c0
YQ
796 if (branch_delay_insns != NULL)
797 {
798 if (m_di.insn_info_valid)
799 *branch_delay_insns = m_di.branch_delay_insns;
800 else
801 *branch_delay_insns = 0;
802 }
803 return length;
92bf2b80
AC
804}
805
806void
13274fc3 807gdb_disassembly (struct gdbarch *gdbarch, struct ui_out *uiout,
9a24775b 808 gdb_disassembly_flags flags, int how_many,
9c419145 809 CORE_ADDR low, CORE_ADDR high)
92bf2b80 810{
34248c3a 811 struct symtab *symtab;
92bf2b80 812 int nlines = -1;
92df71f0 813
0963b4bd 814 /* Assume symtab is valid for whole PC range. */
34248c3a 815 symtab = find_pc_line_symtab (low);
92df71f0 816
8435453b 817 if (symtab != NULL && SYMTAB_LINETABLE (symtab) != NULL)
6ff0ba5f 818 nlines = SYMTAB_LINETABLE (symtab)->nitems;
92df71f0 819
6ff0ba5f
DE
820 if (!(flags & (DISASSEMBLY_SOURCE_DEPRECATED | DISASSEMBLY_SOURCE))
821 || nlines <= 0)
187808b0 822 do_assembly_only (gdbarch, uiout, low, high, how_many, flags);
92df71f0 823
e6158f16 824 else if (flags & DISASSEMBLY_SOURCE)
187808b0 825 do_mixed_source_and_assembly (gdbarch, uiout, symtab, low, high,
e47ad6c0 826 how_many, flags);
6ff0ba5f
DE
827
828 else if (flags & DISASSEMBLY_SOURCE_DEPRECATED)
187808b0 829 do_mixed_source_and_assembly_deprecated (gdbarch, uiout, symtab,
e47ad6c0 830 low, high, how_many, flags);
92df71f0
FN
831
832 gdb_flush (gdb_stdout);
833}
810ecf9f 834
92bf2b80 835/* Print the instruction at address MEMADDR in debugged memory,
a4642986
MR
836 on STREAM. Returns the length of the instruction, in bytes,
837 and, if requested, the number of branch delay slot instructions. */
92bf2b80
AC
838
839int
13274fc3
UW
840gdb_print_insn (struct gdbarch *gdbarch, CORE_ADDR memaddr,
841 struct ui_file *stream, int *branch_delay_insns)
92bf2b80 842{
a4642986 843
e47ad6c0
YQ
844 gdb_disassembler di (gdbarch, stream);
845
846 return di.print_insn (memaddr, branch_delay_insns);
92bf2b80 847}
eda5a4d7 848
eda5a4d7
PA
849/* Return the length in bytes of the instruction at address MEMADDR in
850 debugged memory. */
851
852int
853gdb_insn_length (struct gdbarch *gdbarch, CORE_ADDR addr)
854{
d7e74731 855 return gdb_print_insn (gdbarch, addr, &null_stream, NULL);
eda5a4d7
PA
856}
857
858/* fprintf-function for gdb_buffered_insn_length. This function is a
859 nop, we don't want to print anything, we just want to compute the
860 length of the insn. */
861
862static int ATTRIBUTE_PRINTF (2, 3)
863gdb_buffered_insn_length_fprintf (void *stream, const char *format, ...)
864{
865 return 0;
866}
867
471b9d15
MR
868/* Initialize a struct disassemble_info for gdb_buffered_insn_length.
869 Upon return, *DISASSEMBLER_OPTIONS_HOLDER owns the string pointed
870 to by DI.DISASSEMBLER_OPTIONS. */
eda5a4d7
PA
871
872static void
873gdb_buffered_insn_length_init_dis (struct gdbarch *gdbarch,
874 struct disassemble_info *di,
875 const gdb_byte *insn, int max_len,
471b9d15
MR
876 CORE_ADDR addr,
877 std::string *disassembler_options_holder)
eda5a4d7
PA
878{
879 init_disassemble_info (di, NULL, gdb_buffered_insn_length_fprintf);
880
881 /* init_disassemble_info installs buffer_read_memory, etc.
882 so we don't need to do that here.
883 The cast is necessary until disassemble_info is const-ified. */
884 di->buffer = (gdb_byte *) insn;
885 di->buffer_length = max_len;
886 di->buffer_vma = addr;
887
888 di->arch = gdbarch_bfd_arch_info (gdbarch)->arch;
889 di->mach = gdbarch_bfd_arch_info (gdbarch)->mach;
890 di->endian = gdbarch_byte_order (gdbarch);
891 di->endian_code = gdbarch_byte_order_for_code (gdbarch);
892
471b9d15
MR
893 *disassembler_options_holder = get_all_disassembler_options (gdbarch);
894 if (!disassembler_options_holder->empty ())
895 di->disassembler_options = disassembler_options_holder->c_str ();
eda5a4d7
PA
896 disassemble_init_for_target (di);
897}
898
899/* Return the length in bytes of INSN. MAX_LEN is the size of the
900 buffer containing INSN. */
901
902int
903gdb_buffered_insn_length (struct gdbarch *gdbarch,
904 const gdb_byte *insn, int max_len, CORE_ADDR addr)
905{
906 struct disassemble_info di;
471b9d15 907 std::string disassembler_options_holder;
eda5a4d7 908
471b9d15
MR
909 gdb_buffered_insn_length_init_dis (gdbarch, &di, insn, max_len, addr,
910 &disassembler_options_holder);
eda5a4d7
PA
911
912 return gdbarch_print_insn (gdbarch, addr, &di);
913}
65b48a81
PB
914
915char *
916get_disassembler_options (struct gdbarch *gdbarch)
917{
918 char **disassembler_options = gdbarch_disassembler_options (gdbarch);
919 if (disassembler_options == NULL)
920 return NULL;
921 return *disassembler_options;
922}
923
924void
925set_disassembler_options (char *prospective_options)
926{
927 struct gdbarch *gdbarch = get_current_arch ();
928 char **disassembler_options = gdbarch_disassembler_options (gdbarch);
471b9d15 929 const disasm_options_and_args_t *valid_options_and_args;
65b48a81
PB
930 const disasm_options_t *valid_options;
931 char *options = remove_whitespace_and_extra_commas (prospective_options);
f995bbe8 932 const char *opt;
65b48a81
PB
933
934 /* Allow all architectures, even ones that do not support 'set disassembler',
935 to reset their disassembler options to NULL. */
936 if (options == NULL)
937 {
938 if (disassembler_options != NULL)
939 {
940 free (*disassembler_options);
941 *disassembler_options = NULL;
942 }
943 return;
944 }
945
471b9d15
MR
946 valid_options_and_args = gdbarch_valid_disassembler_options (gdbarch);
947 if (valid_options_and_args == NULL)
65b48a81 948 {
81f47ac2 949 fprintf_filtered (gdb_stderr, _("\
65b48a81
PB
950'set disassembler-options ...' is not supported on this architecture.\n"));
951 return;
952 }
953
471b9d15
MR
954 valid_options = &valid_options_and_args->options;
955
65b48a81
PB
956 /* Verify we have valid disassembler options. */
957 FOR_EACH_DISASSEMBLER_OPTION (opt, options)
958 {
959 size_t i;
960 for (i = 0; valid_options->name[i] != NULL; i++)
471b9d15
MR
961 if (valid_options->arg != NULL && valid_options->arg[i] != NULL)
962 {
963 size_t len = strlen (valid_options->name[i]);
964 bool found = false;
965 const char *arg;
966 size_t j;
967
968 if (memcmp (opt, valid_options->name[i], len) != 0)
969 continue;
970 arg = opt + len;
971 for (j = 0; valid_options->arg[i]->values[j] != NULL; j++)
972 if (disassembler_options_cmp
973 (arg, valid_options->arg[i]->values[j]) == 0)
974 {
975 found = true;
976 break;
977 }
978 if (found)
979 break;
980 }
981 else if (disassembler_options_cmp (opt, valid_options->name[i]) == 0)
65b48a81
PB
982 break;
983 if (valid_options->name[i] == NULL)
984 {
81f47ac2 985 fprintf_filtered (gdb_stderr,
65b48a81
PB
986 _("Invalid disassembler option value: '%s'.\n"),
987 opt);
988 return;
989 }
990 }
991
992 free (*disassembler_options);
993 *disassembler_options = xstrdup (options);
994}
995
996static void
eb4c3f4a 997set_disassembler_options_sfunc (const char *args, int from_tty,
65b48a81
PB
998 struct cmd_list_element *c)
999{
1000 set_disassembler_options (prospective_options);
1001}
1002
1003static void
1004show_disassembler_options_sfunc (struct ui_file *file, int from_tty,
1005 struct cmd_list_element *c, const char *value)
1006{
1007 struct gdbarch *gdbarch = get_current_arch ();
471b9d15
MR
1008 const disasm_options_and_args_t *valid_options_and_args;
1009 const disasm_option_arg_t *valid_args;
65b48a81
PB
1010 const disasm_options_t *valid_options;
1011
1012 const char *options = get_disassembler_options (gdbarch);
1013 if (options == NULL)
1014 options = "";
1015
f4bab6ff 1016 fprintf_filtered (file, _("The current disassembler options are '%s'\n\n"),
65b48a81
PB
1017 options);
1018
471b9d15 1019 valid_options_and_args = gdbarch_valid_disassembler_options (gdbarch);
65b48a81 1020
471b9d15 1021 if (valid_options_and_args == NULL)
f4bab6ff
TT
1022 {
1023 fputs_filtered (_("There are no disassembler options available "
1024 "for this architecture.\n"),
1025 file);
1026 return;
1027 }
65b48a81 1028
471b9d15
MR
1029 valid_options = &valid_options_and_args->options;
1030
f4bab6ff 1031 fprintf_filtered (file, _("\
65b48a81 1032The following disassembler options are supported for use with the\n\
f4bab6ff 1033'set disassembler-options OPTION [,OPTION]...' command:\n"));
65b48a81
PB
1034
1035 if (valid_options->description != NULL)
1036 {
1037 size_t i, max_len = 0;
1038
471b9d15
MR
1039 fprintf_filtered (file, "\n");
1040
65b48a81
PB
1041 /* Compute the length of the longest option name. */
1042 for (i = 0; valid_options->name[i] != NULL; i++)
1043 {
1044 size_t len = strlen (valid_options->name[i]);
471b9d15
MR
1045
1046 if (valid_options->arg != NULL && valid_options->arg[i] != NULL)
1047 len += strlen (valid_options->arg[i]->name);
65b48a81
PB
1048 if (max_len < len)
1049 max_len = len;
1050 }
1051
1052 for (i = 0, max_len++; valid_options->name[i] != NULL; i++)
1053 {
1054 fprintf_filtered (file, " %s", valid_options->name[i]);
471b9d15
MR
1055 if (valid_options->arg != NULL && valid_options->arg[i] != NULL)
1056 fprintf_filtered (file, "%s", valid_options->arg[i]->name);
65b48a81 1057 if (valid_options->description[i] != NULL)
471b9d15
MR
1058 {
1059 size_t len = strlen (valid_options->name[i]);
1060
1061 if (valid_options->arg != NULL && valid_options->arg[i] != NULL)
1062 len += strlen (valid_options->arg[i]->name);
1063 fprintf_filtered (file, "%*c %s", (int) (max_len - len), ' ',
1064 valid_options->description[i]);
1065 }
65b48a81
PB
1066 fprintf_filtered (file, "\n");
1067 }
1068 }
1069 else
1070 {
1071 size_t i;
1072 fprintf_filtered (file, " ");
1073 for (i = 0; valid_options->name[i] != NULL; i++)
1074 {
1075 fprintf_filtered (file, "%s", valid_options->name[i]);
471b9d15
MR
1076 if (valid_options->arg != NULL && valid_options->arg[i] != NULL)
1077 fprintf_filtered (file, "%s", valid_options->arg[i]->name);
65b48a81
PB
1078 if (valid_options->name[i + 1] != NULL)
1079 fprintf_filtered (file, ", ");
1080 wrap_here (" ");
1081 }
1082 fprintf_filtered (file, "\n");
1083 }
471b9d15
MR
1084
1085 valid_args = valid_options_and_args->args;
1086 if (valid_args != NULL)
1087 {
1088 size_t i, j;
1089
1090 for (i = 0; valid_args[i].name != NULL; i++)
1091 {
1092 fprintf_filtered (file, _("\n\
1093 For the options above, the following values are supported for \"%s\":\n "),
1094 valid_args[i].name);
1095 for (j = 0; valid_args[i].values[j] != NULL; j++)
1096 {
1097 fprintf_filtered (file, " %s", valid_args[i].values[j]);
1098 wrap_here (" ");
1099 }
1100 fprintf_filtered (file, "\n");
1101 }
1102 }
65b48a81
PB
1103}
1104
1105/* A completion function for "set disassembler". */
1106
eb3ff9a5 1107static void
65b48a81 1108disassembler_options_completer (struct cmd_list_element *ignore,
eb3ff9a5 1109 completion_tracker &tracker,
65b48a81
PB
1110 const char *text, const char *word)
1111{
1112 struct gdbarch *gdbarch = get_current_arch ();
471b9d15
MR
1113 const disasm_options_and_args_t *opts_and_args
1114 = gdbarch_valid_disassembler_options (gdbarch);
65b48a81 1115
471b9d15 1116 if (opts_and_args != NULL)
65b48a81 1117 {
471b9d15
MR
1118 const disasm_options_t *opts = &opts_and_args->options;
1119
65b48a81
PB
1120 /* Only attempt to complete on the last option text. */
1121 const char *separator = strrchr (text, ',');
1122 if (separator != NULL)
1123 text = separator + 1;
f1735a53 1124 text = skip_spaces (text);
eb3ff9a5 1125 complete_on_enum (tracker, opts->name, text, word);
65b48a81 1126 }
65b48a81
PB
1127}
1128
1129
1130/* Initialization code. */
1131
65b48a81
PB
1132void
1133_initialize_disasm (void)
1134{
1135 struct cmd_list_element *cmd;
1136
1137 /* Add the command that controls the disassembler options. */
1138 cmd = add_setshow_string_noescape_cmd ("disassembler-options", no_class,
1139 &prospective_options, _("\
1140Set the disassembler options.\n\
7c9ee61b 1141Usage: set disassembler-options OPTION [,OPTION]...\n\n\
89549d7f 1142See: 'show disassembler-options' for valid option values."), _("\
65b48a81
PB
1143Show the disassembler options."), NULL,
1144 set_disassembler_options_sfunc,
1145 show_disassembler_options_sfunc,
1146 &setlist, &showlist);
1147 set_cmd_completer (cmd, disassembler_options_completer);
1148}