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