From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28061 invoked by alias); 6 Jan 2014 20:30:56 -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 27989 invoked by uid 89); 6 Jan 2014 20:30:56 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-3.2 required=5.0 tests=AWL,BAYES_00,RP_MATCHES_RCVD,SPF_HELO_PASS,SPF_PASS autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com 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; Mon, 06 Jan 2014 20:30:54 +0000 Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s06KUrwS012011 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 6 Jan 2014 15:30:53 -0500 Received: from barimba.redhat.com (ovpn-113-85.phx2.redhat.com [10.3.113.85]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s06KUp2d004766; Mon, 6 Jan 2014 15:30:52 -0500 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH 3/3] move the entry point info into the per-bfd object Date: Mon, 06 Jan 2014 20:30:00 -0000 Message-Id: <1389040247-2620-4-git-send-email-tromey@redhat.com> In-Reply-To: <1389040247-2620-1-git-send-email-tromey@redhat.com> References: <1389040247-2620-1-git-send-email-tromey@redhat.com> X-SW-Source: 2014-01/txt/msg00095.txt.bz2 This moves the entry point information into the per-BFD object and arranges not to recompute it when it has already been computed. 2014-01-06 Tom Tromey * symfile.c (init_entry_point_info): Use new "initialized" field. Update. * objfiles.h (struct entry_point) : New field. (struct objfile_per_bfd_storage) : New field, moved from... (struct objfile) : ...here. Remove. * objfiles.c (entry_point_address_query): Update. --- gdb/ChangeLog | 9 +++++++++ gdb/objfiles.c | 6 +++--- gdb/objfiles.h | 13 ++++++++----- gdb/symfile.c | 24 ++++++++++++++---------- 4 files changed, 34 insertions(+), 18 deletions(-) diff --git a/gdb/objfiles.c b/gdb/objfiles.c index 2604ae4..c2238d1 100644 --- a/gdb/objfiles.c +++ b/gdb/objfiles.c @@ -364,12 +364,12 @@ get_objfile_arch (struct objfile *objfile) int entry_point_address_query (CORE_ADDR *entry_p) { - if (symfile_objfile == NULL || !symfile_objfile->ei.entry_point_p) + if (symfile_objfile == NULL || !symfile_objfile->per_bfd->ei.entry_point_p) return 0; - *entry_p = (symfile_objfile->ei.entry_point + *entry_p = (symfile_objfile->per_bfd->ei.entry_point + ANOFFSET (symfile_objfile->section_offsets, - symfile_objfile->ei.the_bfd_section_index)); + symfile_objfile->per_bfd->ei.the_bfd_section_index)); return 1; } diff --git a/gdb/objfiles.h b/gdb/objfiles.h index 620d7e8..d448c9e 100644 --- a/gdb/objfiles.h +++ b/gdb/objfiles.h @@ -109,6 +109,9 @@ struct entry_info /* Set to 1 iff ENTRY_POINT contains a valid value. */ unsigned entry_point_p : 1; + + /* Set to 1 iff this object was initialized. */ + unsigned initialized : 1; }; /* Sections in an objfile. The section offsets are stored in the @@ -195,6 +198,11 @@ struct objfile_per_bfd_storage name, and the second is the demangled name or just a zero byte if the name doesn't demangle. */ struct htab *demangled_names_hash; + + /* The per-objfile information about the entry point, the scope (file/func) + containing the entry point, and the scope of the user's main() func. */ + + struct entry_info ei; }; /* Master structure for keeping track of each file from which @@ -318,11 +326,6 @@ struct objfile const struct sym_fns *sf; - /* The per-objfile information about the entry point, the scope (file/func) - containing the entry point, and the scope of the user's main() func. */ - - struct entry_info ei; - /* Per objfile data-pointers required by other GDB modules. */ REGISTRY_FIELDS; diff --git a/gdb/symfile.c b/gdb/symfile.c index a0ff9db..2a49379 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -868,6 +868,10 @@ read_symbols (struct objfile *objfile, int add_flags) static void init_entry_point_info (struct objfile *objfile) { + if (objfile->per_bfd->ei.initialized) + return; + objfile->per_bfd->ei.initialized = 1; + /* Save startup file's range of PC addresses to help blockframe.c decide where the bottom of the stack is. */ @@ -875,8 +879,8 @@ init_entry_point_info (struct objfile *objfile) { /* Executable file -- record its entry point so we'll recognize the startup file because it contains the entry point. */ - objfile->ei.entry_point = bfd_get_start_address (objfile->obfd); - objfile->ei.entry_point_p = 1; + objfile->per_bfd->ei.entry_point = bfd_get_start_address (objfile->obfd); + objfile->per_bfd->ei.entry_point_p = 1; } else if (bfd_get_file_flags (objfile->obfd) & DYNAMIC && bfd_get_start_address (objfile->obfd) != 0) @@ -884,19 +888,19 @@ init_entry_point_info (struct objfile *objfile) /* Some shared libraries may have entry points set and be runnable. There's no clear way to indicate this, so just check for values other than zero. */ - objfile->ei.entry_point = bfd_get_start_address (objfile->obfd); - objfile->ei.entry_point_p = 1; + objfile->per_bfd->ei.entry_point = bfd_get_start_address (objfile->obfd); + objfile->per_bfd->ei.entry_point_p = 1; } else { /* Examination of non-executable.o files. Short-circuit this stuff. */ - objfile->ei.entry_point_p = 0; + objfile->per_bfd->ei.entry_point_p = 0; } - if (objfile->ei.entry_point_p) + if (objfile->per_bfd->ei.entry_point_p) { struct obj_section *osect; - CORE_ADDR entry_point = objfile->ei.entry_point; + CORE_ADDR entry_point = objfile->per_bfd->ei.entry_point; /* Make certain that the address points at real code, and not a function descriptor. */ @@ -907,7 +911,7 @@ init_entry_point_info (struct objfile *objfile) /* Remove any ISA markers, so that this matches entries in the symbol table. */ - objfile->ei.entry_point + objfile->per_bfd->ei.entry_point = gdbarch_addr_bits_remove (get_objfile_arch (objfile), entry_point); ALL_OBJFILE_OSECTIONS (objfile, osect) @@ -918,14 +922,14 @@ init_entry_point_info (struct objfile *objfile) && entry_point < (bfd_get_section_vma (objfile->obfd, sect) + bfd_get_section_size (sect))) { - objfile->ei.the_bfd_section_index + objfile->per_bfd->ei.the_bfd_section_index = gdb_bfd_section_index (objfile->obfd, sect); break; } } if (osect == NULL) - objfile->ei.the_bfd_section_index = SECT_OFF_TEXT (objfile); + objfile->per_bfd->ei.the_bfd_section_index = SECT_OFF_TEXT (objfile); } } -- 1.8.1.4