void mi_cmd_symbol_list_lines (char *command, char **argv, int argc) { struct gdbarch *gdbarch; char *filename; struct symtab *s; int i; struct cleanup *cleanup_stack, *cleanup_tuple; struct ui_out *uiout = current_uiout; if (argc != 1) error (_("-symbol-list-lines: Usage: SOURCE_FILENAME")); filename = argv[0]; s = lookup_symtab (filename); if (s == NULL) error (_("-symbol-list-lines: Unknown source file name.")); /* Now, dump the associated line table. The pc addresses are already sorted by increasing values in the symbol table, so no need to perform any other sorting. */ gdbarch = get_objfile_arch (s->objfile); cleanup_stack = make_cleanup_ui_out_list_begin_end (uiout, "lines"); if (LINETABLE (s) != NULL && LINETABLE (s)->nitems > 0) for (i = 0; i < LINETABLE (s)->nitems; i++) { cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL); ui_out_field_core_addr (uiout, "pc", gdbarch, LINETABLE (s)->item[i].pc); ui_out_field_int (uiout, "line", LINETABLE (s)->item[i].line); do_cleanups (cleanup_tuple); } do_cleanups (cleanup_stack); }
void free_symtab (struct symtab *s) { int i, n; struct blockvector *bv; switch (s->free_code) { case free_nothing: /* All the contents are part of a big block of memory (an obstack), and some other symtab is in charge of freeing that block. Therefore, do nothing. */ break; case free_linetable: /* Everything will be freed either by our `free_func' or by some other symtab, except for our linetable. Free that now. */ if (LINETABLE (s)) xfree (LINETABLE (s)); break; } /* If there is a single block of memory to free, free it. */ if (s->free_func != NULL) s->free_func (s); /* Free source-related stuff */ if (s->line_charpos != NULL) xfree (s->line_charpos); if (s->fullname != NULL) xfree (s->fullname); if (s->debugformat != NULL) xfree (s->debugformat); xfree (s); }