Remove INVALID_ENTRY_POINT.
	* frame.c (inside_entry_func): New variable entry_point.  Return 0 if
	the entry point is not known.
	* solib-irix.c (enable_break): Likewise.
	* objfiles.c (init_entry_point_info): Stop using INVALID_ENTRY_POINT.
	Initialize EI.ENTRY_POINT_P.
	(entry_point_address): Rename to ...
	(entry_point_address_query): ... a new function.  Use EI.ENTRY_POINT_P.
	(entry_point_address): New function.
	(objfile_relocate): Use EI.ENTRY_POINT_P.
	* objfiles.h (struct entry_info): Simplify entry_point comment.  New
	field entry_point_p.
	(INVALID_ENTRY_POINT): Remove.
	(entry_point_address_query): New prototype.
	* solib-frv.c (enable_break): Check for NULL SYMFILE_OBJFILE and its
	EI.ENTRY_POINT_P.  Return 0 if ".interp" is not found.
This commit is contained in:
Jan Kratochvil 2009-11-02 14:50:29 +00:00
parent 62f3b8c867
commit abd0a5fa91
6 changed files with 93 additions and 37 deletions

View file

@ -1,3 +1,22 @@
2009-11-02 Jan Kratochvil <jan.kratochvil@redhat.com>
Remove INVALID_ENTRY_POINT.
* frame.c (inside_entry_func): New variable entry_point. Return 0 if
the entry point is not known.
* solib-irix.c (enable_break): Likewise.
* objfiles.c (init_entry_point_info): Stop using INVALID_ENTRY_POINT.
Initialize EI.ENTRY_POINT_P.
(entry_point_address): Rename to ...
(entry_point_address_query): ... a new function. Use EI.ENTRY_POINT_P.
(entry_point_address): New function.
(objfile_relocate): Use EI.ENTRY_POINT_P.
* objfiles.h (struct entry_info): Simplify entry_point comment. New
field entry_point_p.
(INVALID_ENTRY_POINT): Remove.
(entry_point_address_query): New prototype.
* solib-frv.c (enable_break): Check for NULL SYMFILE_OBJFILE and its
EI.ENTRY_POINT_P. Return 0 if ".interp" is not found.
2009-11-01 Michael Snyder <msnyder@vmware.com> 2009-11-01 Michael Snyder <msnyder@vmware.com>
* NEWS (New Commands): Mention record save/restore. * NEWS (New Commands): Mention record save/restore.

View file

@ -1650,7 +1650,12 @@ inside_main_func (struct frame_info *this_frame)
static int static int
inside_entry_func (struct frame_info *this_frame) inside_entry_func (struct frame_info *this_frame)
{ {
return (get_frame_func (this_frame) == entry_point_address ()); CORE_ADDR entry_point;
if (!entry_point_address_query (&entry_point))
return 0;
return get_frame_func (this_frame) == entry_point;
} }
/* Return a structure containing various interesting information about /* Return a structure containing various interesting information about

View file

@ -294,29 +294,34 @@ init_entry_point_info (struct objfile *objfile)
/* Executable file -- record its entry point so we'll recognize /* Executable file -- record its entry point so we'll recognize
the startup file because it contains the entry point. */ the startup file because it contains the entry point. */
objfile->ei.entry_point = bfd_get_start_address (objfile->obfd); objfile->ei.entry_point = bfd_get_start_address (objfile->obfd);
objfile->ei.entry_point_p = 1;
} }
else if (bfd_get_file_flags (objfile->obfd) & DYNAMIC else if (bfd_get_file_flags (objfile->obfd) & DYNAMIC
&& bfd_get_start_address (objfile->obfd) != 0) && bfd_get_start_address (objfile->obfd) != 0)
/* Some shared libraries may have entry points set and be {
runnable. There's no clear way to indicate this, so just check /* Some shared libraries may have entry points set and be
for values other than zero. */ runnable. There's no clear way to indicate this, so just check
objfile->ei.entry_point = bfd_get_start_address (objfile->obfd); for values other than zero. */
objfile->ei.entry_point = bfd_get_start_address (objfile->obfd);
objfile->ei.entry_point_p = 1;
}
else else
{ {
/* Examination of non-executable.o files. Short-circuit this stuff. */ /* Examination of non-executable.o files. Short-circuit this stuff. */
objfile->ei.entry_point = INVALID_ENTRY_POINT; objfile->ei.entry_point_p = 0;
} }
} }
/* Get current entry point address. */ /* If there is a valid and known entry point, function fills *ENTRY_P with it
and returns non-zero; otherwise it returns zero. */
CORE_ADDR int
entry_point_address (void) entry_point_address_query (CORE_ADDR *entry_p)
{ {
struct gdbarch *gdbarch; struct gdbarch *gdbarch;
CORE_ADDR entry_point; CORE_ADDR entry_point;
if (symfile_objfile == NULL) if (symfile_objfile == NULL || !symfile_objfile->ei.entry_point_p)
return 0; return 0;
gdbarch = get_objfile_arch (symfile_objfile); gdbarch = get_objfile_arch (symfile_objfile);
@ -332,7 +337,21 @@ entry_point_address (void)
symbol table. */ symbol table. */
entry_point = gdbarch_addr_bits_remove (gdbarch, entry_point); entry_point = gdbarch_addr_bits_remove (gdbarch, entry_point);
return entry_point; *entry_p = entry_point;
return 1;
}
/* Get current entry point address. Call error if it is not known. */
CORE_ADDR
entry_point_address (void)
{
CORE_ADDR retval;
if (!entry_point_address_query (&retval))
error (_("Entry point address is not known."));
return retval;
} }
/* Create the terminating entry of OBJFILE's minimal symbol table. /* Create the terminating entry of OBJFILE's minimal symbol table.
@ -702,7 +721,7 @@ objfile_relocate (struct objfile *objfile, struct section_offsets *new_offsets)
to be out of order. */ to be out of order. */
msymbols_sort (objfile); msymbols_sort (objfile);
if (objfile->ei.entry_point != ~(CORE_ADDR) 0) if (objfile->ei.entry_point_p)
{ {
/* Relocate ei.entry_point with its section offset, use SECT_OFF_TEXT /* Relocate ei.entry_point with its section offset, use SECT_OFF_TEXT
only as a fallback. */ only as a fallback. */

View file

@ -100,15 +100,11 @@ struct objfile_data;
struct entry_info struct entry_info
{ {
/* The relocated value we should use for this objfile entry point. */
/* The value we should use for this objects entry point.
The illegal/unknown value needs to be something other than 0, ~0
for instance, which is much less likely than 0. */
CORE_ADDR entry_point; CORE_ADDR entry_point;
#define INVALID_ENTRY_POINT (~0) /* ~0 will not be in any file, we hope. */ /* Set to 1 iff ENTRY_POINT contains a valid value. */
unsigned entry_point_p : 1;
}; };
/* Sections in an objfile. The section offsets are stored in the /* Sections in an objfile. The section offsets are stored in the
@ -447,6 +443,8 @@ extern struct gdbarch *get_objfile_arch (struct objfile *);
extern void init_entry_point_info (struct objfile *); extern void init_entry_point_info (struct objfile *);
extern int entry_point_address_query (CORE_ADDR *entry_p);
extern CORE_ADDR entry_point_address (void); extern CORE_ADDR entry_point_address (void);
extern int build_objfile_section_table (struct objfile *); extern int build_objfile_section_table (struct objfile *);

View file

@ -822,30 +822,43 @@ enable_break (void)
may have changed since the last time we ran the program. */ may have changed since the last time we ran the program. */
remove_solib_event_breakpoints (); remove_solib_event_breakpoints ();
if (symfile_objfile == NULL)
{
if (solib_frv_debug)
fprintf_unfiltered (gdb_stdlog,
"enable_break: No symbol file found.\n");
return 0;
}
if (!symfile_objfile->ei.entry_point_p)
{
if (solib_frv_debug)
fprintf_unfiltered (gdb_stdlog,
"enable_break: Symbol file has no entry point.\n");
return 0;
}
/* Check for the presence of a .interp section. If there is no /* Check for the presence of a .interp section. If there is no
such section, the executable is statically linked. */ such section, the executable is statically linked. */
interp_sect = bfd_get_section_by_name (exec_bfd, ".interp"); interp_sect = bfd_get_section_by_name (exec_bfd, ".interp");
if (interp_sect) if (interp_sect == NULL)
{
enable_break1_done = 1;
create_solib_event_breakpoint (target_gdbarch,
symfile_objfile->ei.entry_point);
if (solib_frv_debug)
fprintf_unfiltered (gdb_stdlog,
"enable_break: solib event breakpoint placed at entry point: %s\n",
hex_string_custom
(symfile_objfile->ei.entry_point, 8));
}
else
{ {
if (solib_frv_debug) if (solib_frv_debug)
fprintf_unfiltered (gdb_stdlog, fprintf_unfiltered (gdb_stdlog,
"enable_break: No .interp section found.\n"); "enable_break: No .interp section found.\n");
return 0;
} }
enable_break1_done = 1;
create_solib_event_breakpoint (target_gdbarch,
symfile_objfile->ei.entry_point);
if (solib_frv_debug)
fprintf_unfiltered (gdb_stdlog,
"enable_break: solib event breakpoint placed at entry point: %s\n",
hex_string_custom (symfile_objfile->ei.entry_point, 8));
return 1; return 1;
} }

View file

@ -369,11 +369,13 @@ enable_break (void)
{ {
struct frame_info *frame = get_current_frame (); struct frame_info *frame = get_current_frame ();
struct address_space *aspace = get_frame_address_space (frame); struct address_space *aspace = get_frame_address_space (frame);
CORE_ADDR entry_point;
base_breakpoint if (!entry_point_address_query (&entry_point))
= deprecated_insert_raw_breakpoint (target_gdbarch, return 0;
aspace,
entry_point_address ()); base_breakpoint = deprecated_insert_raw_breakpoint (target_gdbarch,
aspace, entry_point);
if (base_breakpoint != NULL) if (base_breakpoint != NULL)
return 1; return 1;