1 /* MI Command Set - file commands. 2 Copyright (C) 2000-2020 Free Software Foundation, Inc. 3 Contributed by Cygnus Solutions (a Red Hat company). 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 "mi-cmds.h" 22 #include "mi-getopt.h" 23 #include "mi-interp.h" 24 #include "ui-out.h" 25 #include "symtab.h" 26 #include "source.h" 27 #include "objfiles.h" 28 #include "psymtab.h" 29 #include "solib.h" 30 #include "solist.h" 31 #include "gdb_regex.h" 32 33 /* Return to the client the absolute path and line number of the 34 current file being executed. */ 35 36 void 37 mi_cmd_file_list_exec_source_file (const char *command, char **argv, int argc) 38 { 39 struct symtab_and_line st; 40 struct ui_out *uiout = current_uiout; 41 42 if (!mi_valid_noargs ("-file-list-exec-source-file", argc, argv)) 43 error (_("-file-list-exec-source-file: Usage: No args")); 44 45 /* Set the default file and line, also get them. */ 46 set_default_source_symtab_and_line (); 47 st = get_current_source_symtab_and_line (); 48 49 /* We should always get a symtab. Apparently, filename does not 50 need to be tested for NULL. The documentation in symtab.h 51 suggests it will always be correct. */ 52 if (!st.symtab) 53 error (_("-file-list-exec-source-file: No symtab")); 54 55 /* Print to the user the line, filename and fullname. */ 56 uiout->field_signed ("line", st.line); 57 uiout->field_string ("file", symtab_to_filename_for_display (st.symtab)); 58 59 uiout->field_string ("fullname", symtab_to_fullname (st.symtab)); 60 61 uiout->field_signed ("macro-info", 62 COMPUNIT_MACRO_TABLE (SYMTAB_COMPUNIT (st.symtab)) != NULL); 63 } 64 65 /* A callback for map_partial_symbol_filenames. */ 66 67 static void 68 print_partial_file_name (const char *filename, const char *fullname, 69 void *ignore) 70 { 71 struct ui_out *uiout = current_uiout; 72 73 uiout->begin (ui_out_type_tuple, NULL); 74 75 uiout->field_string ("file", filename); 76 77 if (fullname) 78 uiout->field_string ("fullname", fullname); 79 80 uiout->end (ui_out_type_tuple); 81 } 82 83 void 84 mi_cmd_file_list_exec_source_files (const char *command, char **argv, int argc) 85 { 86 struct ui_out *uiout = current_uiout; 87 88 if (!mi_valid_noargs ("-file-list-exec-source-files", argc, argv)) 89 error (_("-file-list-exec-source-files: Usage: No args")); 90 91 /* Print the table header. */ 92 uiout->begin (ui_out_type_list, "files"); 93 94 /* Look at all of the file symtabs. */ 95 for (objfile *objfile : current_program_space->objfiles ()) 96 { 97 for (compunit_symtab *cu : objfile->compunits ()) 98 { 99 for (symtab *s : compunit_filetabs (cu)) 100 { 101 uiout->begin (ui_out_type_tuple, NULL); 102 103 uiout->field_string ("file", symtab_to_filename_for_display (s)); 104 uiout->field_string ("fullname", symtab_to_fullname (s)); 105 106 uiout->end (ui_out_type_tuple); 107 } 108 } 109 } 110 111 map_symbol_filenames (print_partial_file_name, NULL, 112 1 /*need_fullname*/); 113 114 uiout->end (ui_out_type_list); 115 } 116 117 /* See mi-cmds.h. */ 118 119 void 120 mi_cmd_file_list_shared_libraries (const char *command, char **argv, int argc) 121 { 122 struct ui_out *uiout = current_uiout; 123 const char *pattern; 124 125 switch (argc) 126 { 127 case 0: 128 pattern = NULL; 129 break; 130 case 1: 131 pattern = argv[0]; 132 break; 133 default: 134 error (_("Usage: -file-list-shared-libraries [REGEXP]")); 135 } 136 137 if (pattern != NULL) 138 { 139 const char *re_err = re_comp (pattern); 140 141 if (re_err != NULL) 142 error (_("Invalid regexp: %s"), re_err); 143 } 144 145 update_solib_list (1); 146 147 /* Print the table header. */ 148 ui_out_emit_list list_emitter (uiout, "shared-libraries"); 149 150 for (struct so_list *so : current_program_space->solibs ()) 151 { 152 if (so->so_name[0] == '\0') 153 continue; 154 if (pattern != NULL && !re_exec (so->so_name)) 155 continue; 156 157 ui_out_emit_tuple tuple_emitter (uiout, NULL); 158 mi_output_solib_attribs (uiout, so); 159 } 160 } 161