From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 22629 invoked by alias); 19 Sep 2013 14:20:02 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 22614 invoked by uid 89); 19 Sep 2013 14:20:01 -0000 Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 19 Sep 2013 14:20:01 +0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.1 required=5.0 tests=AWL,BAYES_00,KAM_STOCKGEN,RP_MATCHES_RCVD autolearn=no version=3.3.2 X-HELO: mx1.redhat.com Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r8JEJuUt004430 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 19 Sep 2013 10:19:59 -0400 Received: from host2.jankratochvil.net (ovpn-116-51.ams2.redhat.com [10.36.116.51]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r8JDuW9M028282 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=NO) for ; Thu, 19 Sep 2013 09:56:34 -0400 Date: Thu, 19 Sep 2013 14:20:00 -0000 From: Jan Kratochvil To: gdb-patches@sourceware.org Subject: [patchv4 4/5] Keep objfile original filename Message-ID: <20130919135631.GD16978@host2.jankratochvil.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-IsSubscribed: yes X-SW-Source: 2013-09/txt/msg00683.txt.bz2 Hi, formerly: [patchv3 4/5] Keep objfile original filename https://sourceware.org/ml/gdb-patches/2013-09/msg00424.html also in archer.git jankratochvil/dwp It is now storing objfile->original_name in objfile_obstack. Plus new comment in read_symbols. Jan gdb/ 2013-09-15 Jan Kratochvil Pass down original filename for objfile. * coffread.c (coff_symfile_read): Update symbol_file_add_separate call. * elfread.c (elf_symfile_read): Likewise. * jit.c (jit_object_close_impl): Update allocate_objfile call, no longer set ORIGINAL_NAME. (jit_bfd_try_read_symtab): Update symbol_file_add_from_bfd call. * jv-lang.c (get_dynamics_objfile): Update allocate_objfile call. * machoread.c (macho_add_oso_symfile): Add parameter name. Update symbol_file_add_from_bfd call. (macho_symfile_read_all_oso): Update two macho_add_oso_symfile calls. (macho_check_dsym): Add parameter filenamep. Change function comment. Set *filenamep. (macho_symfile_read): New variable dsym_filename. Update macho_check_dsym call. Use it for symbol_file_add_separate. * objfiles.c (allocate_objfile): Add parameter name. New comment for it. Use it for objfile->original_name. (objfile_name): Return OBFD's filename, if available. * objfiles.h (allocate_objfile): Add new parameter name. * solib-sunos.c (allocate_rt_common_objfile): Remove variable name. Update allocate_objfile call. Remove obstack_copy0 call. * solib.c (solib_read_symbols): Update symbol_file_add_from_bfd call. * symfile-mem.c (symbol_file_add_from_memory): Update symbol_file_add_from_bfd call. * symfile.c (read_symbols): Update symbol_file_add_separate call, new comment for it. (symbol_file_add_with_addrs): New parameter name, add function comment for it. Remove variable name. Update allocate_objfile call. (symbol_file_add_separate): New parameter name, add function comment for it. Update symbol_file_add_with_addrs call. (symbol_file_add_from_bfd): New parameter name. Update symbol_file_add_with_addrs call. (symbol_file_add): Update symbol_file_add_from_bfd call. (reread_symbols): New variable original_name. Save objfile->original_name by it. * symfile.h (symbol_file_add_from_bfd, symbol_file_add_separate): Add second parameter. --- a/gdb/coffread.c +++ b/gdb/coffread.c @@ -738,7 +738,7 @@ coff_symfile_read (struct objfile *objfile, int symfile_flags) bfd *abfd = symfile_bfd_open (debugfile); make_cleanup_bfd_unref (abfd); - symbol_file_add_separate (abfd, symfile_flags, objfile); + symbol_file_add_separate (abfd, debugfile, symfile_flags, objfile); } } --- a/gdb/elfread.c +++ b/gdb/elfread.c @@ -1458,7 +1458,7 @@ elf_symfile_read (struct objfile *objfile, int symfile_flags) bfd *abfd = symfile_bfd_open (debugfile); make_cleanup_bfd_unref (abfd); - symbol_file_add_separate (abfd, symfile_flags, objfile); + symbol_file_add_separate (abfd, debugfile, symfile_flags, objfile); do_cleanups (cleanup); } } --- a/gdb/jit.c +++ b/gdb/jit.c @@ -785,13 +785,11 @@ jit_object_close_impl (struct gdb_symbol_callbacks *cb, priv_data = cb->priv_data; - objfile = allocate_objfile (NULL, 0); + objfile = allocate_objfile (NULL, "<< JIT compiled code >>", 0); objfile->per_bfd->gdbarch = target_gdbarch (); terminate_minimal_symbol_table (objfile); - objfile->original_name = "<< JIT compiled code >>"; - j = NULL; for (i = obj->symtabs; i; i = j) { @@ -927,7 +925,8 @@ JITed symbol file is not an object file, ignoring it.\n")); /* This call does not take ownership of SAI. */ make_cleanup_bfd_unref (nbfd); - objfile = symbol_file_add_from_bfd (nbfd, 0, sai, OBJF_SHARED, NULL); + objfile = symbol_file_add_from_bfd (nbfd, bfd_get_filename (nbfd), 0, sai, + OBJF_SHARED, NULL); do_cleanups (old_cleanups); add_objfile_entry (objfile, entry_addr); --- a/gdb/jv-lang.c +++ b/gdb/jv-lang.c @@ -118,7 +118,7 @@ get_dynamics_objfile (struct gdbarch *gdbarch) /* Mark it as shared so that it is cleared when the inferior is re-run. */ - dynamics_objfile = allocate_objfile (NULL, OBJF_SHARED); + dynamics_objfile = allocate_objfile (NULL, NULL, OBJF_SHARED); dynamics_objfile->per_bfd->gdbarch = gdbarch; data = XCNEW (struct jv_per_objfile_data); --- a/gdb/machoread.c +++ b/gdb/machoread.c @@ -447,7 +447,7 @@ macho_resolve_oso_sym_with_minsym (struct objfile *main_objfile, asymbol *sym) /* Add oso file OSO/ABFD as a symbol file. */ static void -macho_add_oso_symfile (oso_el *oso, bfd *abfd, +macho_add_oso_symfile (oso_el *oso, bfd *abfd, const char *name, struct objfile *main_objfile, int symfile_flags) { int storage; @@ -636,7 +636,7 @@ macho_add_oso_symfile (oso_el *oso, bfd *abfd, from symfile.c:symbol_file_add_with_addrs_or_offsets. */ cleanup = make_cleanup_bfd_unref (abfd); symbol_file_add_from_bfd - (abfd, symfile_flags & ~(SYMFILE_MAINLINE | SYMFILE_VERBOSE), NULL, + (abfd, name, symfile_flags & ~(SYMFILE_MAINLINE | SYMFILE_VERBOSE), NULL, main_objfile->flags & (OBJF_REORDERED | OBJF_SHARED | OBJF_READNOW | OBJF_USERLOADED), main_objfile); @@ -736,6 +736,7 @@ macho_symfile_read_all_oso (VEC (oso_el) **oso_vector_ptr, member_len)) { macho_add_oso_symfile (oso2, member_bfd, + bfd_get_filename (member_bfd), main_objfile, symfile_flags); oso2->name = NULL; break; @@ -769,7 +770,8 @@ macho_symfile_read_all_oso (VEC (oso_el) **oso_vector_ptr, warning (_("`%s': can't open to read symbols: %s."), oso->name, bfd_errmsg (bfd_get_error ())); else - macho_add_oso_symfile (oso, abfd, main_objfile, symfile_flags); + macho_add_oso_symfile (oso, abfd, oso->name, main_objfile, + symfile_flags); ix++; } @@ -785,11 +787,13 @@ macho_symfile_read_all_oso (VEC (oso_el) **oso_vector_ptr, executable name and the executable base name to get the DSYM file name. */ #define DSYM_SUFFIX ".dSYM/Contents/Resources/DWARF/" -/* Check if a dsym file exists for OBJFILE. If so, returns a bfd for it. - Return NULL if no valid dsym file is found. */ +/* Check if a dsym file exists for OBJFILE. If so, returns a bfd for it + and return *FILENAMEP with its original xmalloc-ated filename. + Return NULL if no valid dsym file is found (FILENAMEP is not used in + such case). */ static bfd * -macho_check_dsym (struct objfile *objfile) +macho_check_dsym (struct objfile *objfile, char **filenamep) { size_t name_len = strlen (objfile_name (objfile)); size_t dsym_len = strlen (DSYM_SUFFIX); @@ -842,6 +846,7 @@ macho_check_dsym (struct objfile *objfile) gdb_bfd_unref (dsym_bfd); return NULL; } + *filenamep = xstrdup (dsym_filename); return dsym_bfd; } @@ -860,6 +865,8 @@ macho_symfile_read (struct objfile *objfile, int symfile_flags) be in the executable. */ if (bfd_get_file_flags (abfd) & (EXEC_P | DYNAMIC)) { + char *dsym_filename; + /* Process the normal symbol table first. */ storage_needed = bfd_get_symtab_upper_bound (objfile->obfd); if (storage_needed < 0) @@ -897,13 +904,15 @@ macho_symfile_read (struct objfile *objfile, int symfile_flags) dwarf2_build_frame_info (objfile); /* Check for DSYM file. */ - dsym_bfd = macho_check_dsym (objfile); + dsym_bfd = macho_check_dsym (objfile, &dsym_filename); if (dsym_bfd != NULL) { int ix; oso_el *oso; struct bfd_section *asect, *dsect; + make_cleanup (xfree, dsym_filename); + if (mach_o_debug_level > 0) printf_unfiltered (_("dsym file found\n")); @@ -920,7 +929,8 @@ macho_symfile_read (struct objfile *objfile, int symfile_flags) /* Add the dsym file as a separate file. */ make_cleanup_bfd_unref (dsym_bfd); - symbol_file_add_separate (dsym_bfd, symfile_flags, objfile); + symbol_file_add_separate (dsym_bfd, dsym_filename, symfile_flags, + objfile); /* Don't try to read dwarf2 from main file or shared libraries. */ do_cleanups (old_chain); --- a/gdb/objfiles.c +++ b/gdb/objfiles.c @@ -250,6 +250,11 @@ build_objfile_section_table (struct objfile *objfile) into the list of all known objfiles, and return a pointer to the new objfile struct. + NAME should contain original non-canonicalized filename or other + identifier as entered by user. If there is no better source use + bfd_get_filename (ABFD). NAME may be NULL only if ABFD is NULL. + NAME content is copied into returned objfile. + The FLAGS word contains various bits (OBJF_*) that can be taken as requests for specific operations. Other bits like OBJF_SHARED are simply copied through to the new objfile flags member. */ @@ -264,7 +269,7 @@ build_objfile_section_table (struct objfile *objfile) things in a consistent state even if abfd is NULL. */ struct objfile * -allocate_objfile (bfd *abfd, int flags) +allocate_objfile (bfd *abfd, const char *name, int flags) { struct objfile *objfile; @@ -281,20 +286,23 @@ allocate_objfile (bfd *abfd, int flags) that any data that is reference is saved in the per-objfile data region. */ + if (name == NULL) + { + gdb_assert (abfd == NULL); + name = "<>"; + } + objfile->original_name = obstack_copy0 (&objfile->objfile_obstack, name, + strlen (name)); + objfile->obfd = abfd; gdb_bfd_ref (abfd); if (abfd != NULL) { - objfile->original_name = bfd_get_filename (abfd); objfile->mtime = bfd_get_mtime (abfd); /* Build section table. */ build_objfile_section_table (objfile); } - else - { - objfile->original_name = "<>"; - } objfile->per_bfd = get_objfile_bfd_data (objfile, abfd); objfile->pspace = current_program_space; @@ -1491,6 +1499,9 @@ default_iterate_over_objfiles_in_search_order const char * objfile_name (const struct objfile *objfile) { + if (objfile->obfd != NULL) + return bfd_get_filename (objfile->obfd); + return objfile->original_name; } --- a/gdb/objfiles.h +++ b/gdb/objfiles.h @@ -436,7 +436,7 @@ extern struct objfile *rt_common_objfile; /* Declarations for functions defined in objfiles.c */ -extern struct objfile *allocate_objfile (bfd *, int); +extern struct objfile *allocate_objfile (bfd *, const char *name, int); extern struct gdbarch *get_objfile_arch (struct objfile *); --- a/gdb/solib-sunos.c +++ b/gdb/solib-sunos.c @@ -182,11 +182,7 @@ static int match_main (char *); static void allocate_rt_common_objfile (void) { - const char name[] = "rt_common"; - - rt_common_objfile = allocate_objfile (NULL, 0); - rt_common_objfile->name = obstack_copy0 (&rt_common_objfile->objfile_obstack, - name, strlen (name)); + rt_common_objfile = allocate_objfile (NULL, "rt_common", 0); } /* Read all dynamically loaded common symbol definitions from the inferior --- a/gdb/solib.c +++ b/gdb/solib.c @@ -610,7 +610,7 @@ solib_read_symbols (struct so_list *so, int flags) sap = build_section_addr_info_from_section_table (so->sections, so->sections_end); - so->objfile = symbol_file_add_from_bfd (so->abfd, + so->objfile = symbol_file_add_from_bfd (so->abfd, so->so_name, flags, sap, OBJF_SHARED, NULL); so->objfile->addr_low = so->addr_low; --- a/gdb/symfile-mem.c +++ b/gdb/symfile-mem.c @@ -129,7 +129,8 @@ symbol_file_add_from_memory (struct bfd *templ, CORE_ADDR addr, char *name, } sai->num_sections = i; - objf = symbol_file_add_from_bfd (nbfd, from_tty ? SYMFILE_VERBOSE : 0, + objf = symbol_file_add_from_bfd (nbfd, bfd_get_filename (nbfd), + from_tty ? SYMFILE_VERBOSE : 0, sai, OBJF_SHARED, NULL); /* This might change our ideas about frames already looked at. */ --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -839,7 +839,14 @@ read_symbols (struct objfile *objfile, int add_flags) struct cleanup *cleanup = make_cleanup_bfd_unref (abfd); if (abfd != NULL) - symbol_file_add_separate (abfd, add_flags, objfile); + { + /* find_separate_debug_file_in_section uses the same filename for the + virtual section-as-bfd like the bfd filename containing the + section. Therefore use also non-canonical name form for the same + file containing the section. */ + symbol_file_add_separate (abfd, objfile->original_name, add_flags, + objfile); + } do_cleanups (cleanup); } @@ -1047,6 +1054,8 @@ new_symfile_objfile (struct objfile *objfile, int add_flags) ABFD is a BFD already open on the file, as from symfile_bfd_open. A new reference is acquired by this function. + For NAME description see allocate_objfile's definition. + ADD_FLAGS encodes verbosity, whether this is main symbol file or extra, such as dynamically loaded code, and what to do with breakpoins. @@ -1060,12 +1069,11 @@ new_symfile_objfile (struct objfile *objfile, int add_flags) Upon failure, jumps back to command level (never returns). */ static struct objfile * -symbol_file_add_with_addrs (bfd *abfd, int add_flags, +symbol_file_add_with_addrs (bfd *abfd, const char *name, int add_flags, struct section_addr_info *addrs, int flags, struct objfile *parent) { struct objfile *objfile; - const char *name = bfd_get_filename (abfd); const int from_tty = add_flags & SYMFILE_VERBOSE; const int mainline = add_flags & SYMFILE_MAINLINE; const int should_print = ((from_tty || info_verbose) @@ -1087,7 +1095,8 @@ symbol_file_add_with_addrs (bfd *abfd, int add_flags, && !query (_("Load new symbol table from \"%s\"? "), name)) error (_("Not confirmed.")); - objfile = allocate_objfile (abfd, flags | (mainline ? OBJF_MAINLINE : 0)); + objfile = allocate_objfile (abfd, name, + flags | (mainline ? OBJF_MAINLINE : 0)); if (parent) add_separate_debug_objfile (objfile, parent); @@ -1160,10 +1169,12 @@ symbol_file_add_with_addrs (bfd *abfd, int add_flags, return (objfile); } -/* Add BFD as a separate debug file for OBJFILE. */ +/* Add BFD as a separate debug file for OBJFILE. For NAME description + see allocate_objfile's definition. */ void -symbol_file_add_separate (bfd *bfd, int symfile_flags, struct objfile *objfile) +symbol_file_add_separate (bfd *bfd, const char *name, int symfile_flags, + struct objfile *objfile) { struct objfile *new_objfile; struct section_addr_info *sap; @@ -1176,7 +1187,7 @@ symbol_file_add_separate (bfd *bfd, int symfile_flags, struct objfile *objfile) my_cleanup = make_cleanup_free_section_addr_info (sap); new_objfile = symbol_file_add_with_addrs - (bfd, symfile_flags, sap, + (bfd, name, symfile_flags, sap, objfile->flags & (OBJF_REORDERED | OBJF_SHARED | OBJF_READNOW | OBJF_USERLOADED), objfile); @@ -1189,11 +1200,12 @@ symbol_file_add_separate (bfd *bfd, int symfile_flags, struct objfile *objfile) See symbol_file_add_with_addrs's comments for details. */ struct objfile * -symbol_file_add_from_bfd (bfd *abfd, int add_flags, +symbol_file_add_from_bfd (bfd *abfd, const char *name, int add_flags, struct section_addr_info *addrs, int flags, struct objfile *parent) { - return symbol_file_add_with_addrs (abfd, add_flags, addrs, flags, parent); + return symbol_file_add_with_addrs (abfd, name, add_flags, addrs, flags, + parent); } /* Process a symbol file, as either the main file or as a dynamically @@ -1207,7 +1219,7 @@ symbol_file_add (const char *name, int add_flags, struct cleanup *cleanup = make_cleanup_bfd_unref (bfd); struct objfile *objf; - objf = symbol_file_add_from_bfd (bfd, add_flags, addrs, flags, NULL); + objf = symbol_file_add_from_bfd (bfd, name, add_flags, addrs, flags, NULL); do_cleanups (cleanup); return objf; } @@ -2373,6 +2385,7 @@ reread_symbols (void) struct cleanup *old_cleanups; struct section_offsets *offsets; int num_offsets; + char *original_name; printf_unfiltered (_("`%s' has changed; re-reading symbols.\n"), objfile_name (objfile)); @@ -2443,7 +2456,9 @@ reread_symbols (void) gdb_bfd_unref (obfd); } - objfile->original_name = bfd_get_filename (objfile->obfd); + original_name = xstrdup (objfile->original_name); + make_cleanup (xfree, original_name); + /* bfd_openr sets cacheable to true, which is what we want. */ if (!bfd_check_format (objfile->obfd, bfd_object)) error (_("Can't read symbols from %s: %s."), objfile_name (objfile), @@ -2497,6 +2512,10 @@ reread_symbols (void) gdb_obstack.h specifies the alloc/dealloc functions. */ obstack_init (&objfile->objfile_obstack); + objfile->original_name = obstack_copy0 (&objfile->objfile_obstack, + original_name, + strlen (original_name)); + /* Reset the sym_fns pointer. The ELF reader can change it based on whether .gdb_index is present, and we need it to start over. PR symtab/15885 */ --- a/gdb/symfile.h +++ b/gdb/symfile.h @@ -480,11 +480,12 @@ extern void new_symfile_objfile (struct objfile *, int); extern struct objfile *symbol_file_add (const char *, int, struct section_addr_info *, int); -extern struct objfile *symbol_file_add_from_bfd (bfd *, int, +extern struct objfile *symbol_file_add_from_bfd (bfd *, const char *, int, struct section_addr_info *, int, struct objfile *parent); -extern void symbol_file_add_separate (bfd *, int, struct objfile *); +extern void symbol_file_add_separate (bfd *, const char *, int, + struct objfile *); extern char *find_separate_debug_file_by_debuglink (struct objfile *);