+ stdio_file arg_outfile;
+
+ if (argv != NULL && argv[outfile_idx] != NULL)
+ {
+ char *outfile_name;
+
+ if (argv[outfile_idx + 1] != NULL)
+ error (_("Junk at end of command"));
+ outfile_name = tilde_expand (argv[outfile_idx]);
+ make_cleanup (xfree, outfile_name);
+ if (!arg_outfile.open (outfile_name, FOPEN_WT))
+ perror_with_name (outfile_name);
+ outfile = &arg_outfile;
+ }
+
+ if (address_arg != NULL)
+ {
+ pc = parse_and_eval_address (address_arg);
+ /* If we fail to find a section, that's ok, try the lookup anyway. */
+ section = find_pc_section (pc);
+ }
+
+ found = 0;
+ ALL_OBJFILES (objfile)
+ {
+ int printed_objfile_header = 0;
+ int print_for_objfile = 1;
+
+ QUIT;
+ if (objfile_arg != NULL)
+ print_for_objfile
+ = compare_filenames_for_search (objfile_name (objfile),
+ objfile_arg);
+ if (!print_for_objfile)
+ continue;
+
+ if (address_arg != NULL)
+ {
+ struct bound_minimal_symbol msymbol = { NULL, NULL };
+
+ /* We don't assume each pc has a unique objfile (this is for
+ debugging). */
+ ps = find_pc_sect_psymtab (objfile, pc, section, msymbol);
+ if (ps != NULL)
+ {
+ if (!printed_objfile_header)
+ {
+ outfile->printf ("\nPartial symtabs for objfile %s\n",
+ objfile_name (objfile));
+ printed_objfile_header = 1;
+ }
+ dump_psymtab (objfile, ps, outfile);
+ dump_psymtab_addrmap (objfile, ps, outfile);
+ found = 1;
+ }
+ }
+ else
+ {
+ ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps)
+ {
+ int print_for_source = 0;
+
+ QUIT;
+ if (source_arg != NULL)
+ {
+ print_for_source
+ = compare_filenames_for_search (ps->filename, source_arg);
+ found = 1;
+ }
+ if (source_arg == NULL
+ || print_for_source)
+ {
+ if (!printed_objfile_header)
+ {
+ outfile->printf ("\nPartial symtabs for objfile %s\n",
+ objfile_name (objfile));
+ printed_objfile_header = 1;
+ }
+ dump_psymtab (objfile, ps, outfile);
+ dump_psymtab_addrmap (objfile, ps, outfile);
+ }
+ }
+ }
+
+ /* If we're printing all the objfile's symbols dump the full addrmap. */
+
+ if (address_arg == NULL
+ && source_arg == NULL
+ && objfile->psymtabs_addrmap != NULL)
+ {
+ outfile->puts ("\n");
+ dump_psymtab_addrmap (objfile, NULL, outfile);
+ }
+ }
+
+ if (!found)
+ {
+ if (address_arg != NULL)
+ error (_("No partial symtab for address: %s"), address_arg);
+ if (source_arg != NULL)
+ error (_("No partial symtab for source file: %s"), source_arg);
+ }