* breakpoint.h (struct bp_location): Change type of section

member to "struct obj_section *".
	* tracepoint.h (struct tracepoint): Likewise.
	* symtab.h (struct general_symbol_info): Replace bfd_section
	member with obj_section.
	(struct symtab_and_line): Change type of section member to
	"struct obj_section *".
	(SYMBOL_BFD_SECTION): Remove macro, replace by ...
	(SYMBOL_OBJ_SECTION): ... this.

	* minsym.c (prim_record_minimal_symbol_and_info): Record symbol
	section as obj_section instead of bfd_section.

	* ada-lang.c (ada_decode_symbol): Use gsymbol->obj_section
	directly instead of looking of obj_section from bfd_section.

	* objfiles.h (find_pc_sect_section): Remove.
	* objfiles.c (find_pc_sect_section): Remove.
	(find_pc_section): Inline find_pc_sect_section code.

	* symfile.h (find_pc_overlay): Return struct obj_section *.
	(find_pc_mapped_section): Likewise.
	(section_is_overlay, section_is_mapped): Change type of section
	argument to struct obj_section *.
	(pc_in_mapped_range, pc_in_unmapped_range): Likewise.
	(overlay_mapped_address, overlay_unmapped_address): Likewise.
	(symbol_overlayed_address): Likewise.
	* symtab.h (symbol_overlayed_address): Likewise.
	* symfile.c (overlay_is_mapped): Remove.
	(section_is_mapped): Inline overlay_is_mapped code.  Update.
	(overlay_invalidate_all): Update.
	(section_is_overlay): Change section argument to type
	"struct obj_section *".  Use bfd_ methods.
	(pc_in_unmapped_range): Likewise.  Handle relocated sections.
	(pc_in_mapped_range): Likewise.  Handle relocated sections.
	(sections_overlap): Likewise.
	(overlay_unmapped_address): Likewise.
	(overlay_mapped_address): Likewise.
	(symbol_overlayed_address): Likewise.
	(find_pc_overlay): Return struct obj_section *.
	(find_pc_mapped_section): Likewise.
	(list_overlays_command): Update.
	(map_overlay_command, unmap_overlay_command): Update.
	(simple_overlay_update): Update.

	* block.h (blockvector_for_pc_sect): Change section argument
	to type "struct obj_section *".
	(block_for_pc_sect): Likewise.
	* block.c (blockvector_for_pc_sect): Change section argument
	to type "struct obj_section *".
	(block_for_pc_sect): Likewise.
	* symtab.h (find_pc_sect_function, find_pc_sect_psymtab,
	find_pc_sect_symtab, find_pc_sect_psymbol, find_pc_sect_line,
	lookup_minimal_symbol_by_pc_section, find_function_start_pc): Likewise.
	(matching_bfd_sections): Rename to ...
	(matching_obj_sections): ... this.  Update argument types.
	* blockframe.c (find_pc_sect_function): Likewise.
	* breakpoint.c (describe_other_breakpoints): Likewise.
	(breakpoint_has_pc, check_duplicates_for): Likewise.
	* minsyms.c (lookup_minimal_symbol_by_pc_section_1): Likewise.
	(lookup_minimal_symbol_by_pc_section): Likewise.
	* symtab.c (find_pc_sect_psymtab_closer): Likewise.
	(find_pc_sect_psymtab, find_pc_sect_psymbol, find_pc_sect_symtab,
	find_pc_sect_line, find_function_start_pc): Likewise.
	(matching_bfd_sections): Rename to ...
	(matching_obj_sections): ... this.  Update argument types.

	* blockframe.c (find_pc_partial_function): Update to section
	type changes.  No longer call find_pc_sect_section.
	(cache_pc_function_section): Change to type "struct obj_section *".
	* breakpoint.c (resolve_sal_pc): Update to section type changes.
	* exec.c (xfer_memory): Likewise.
	* findvar.c (read_var_value): Likewise.
	* infcmd.c (jump_command): Likewise.
	* linespec.c (minsym_found): Likewise.
	* maint.c (maintenance_translate_address): Likewise.
	* minsyms.c (lookup_minimal_symbol_by_pc_section_1): Likewise.
	(lookup_solib_trampoline_symbol_by_pc): Likewise.
	* parse.c (write_exp_msymbol): Likewise.
	* printcmd.c (build_address_symbolic): Likewise.
	(address_info, sym_info): Likewise.
	* symmisc.c (dump_msymbols, print_symbol): Likewise.
	* symtab.c (fixup_section): Likewise.
	(fixup_symbol_section, fixup_psymbol_section): Likewise.
	(find_pc_line, find_function_start_sal): Likewise.
	* target.c (memory_xfer_partial): Likewise.
	* hppa-hpux-tdep.c (hppa64_hpux_in_solib_call_trampoline): Likewise.
	* spu-tdep.c (spu_overlay_update): Likewise.
This commit is contained in:
Ulrich Weigand
2008-09-05 11:37:18 +00:00
parent f91609ee70
commit 714835d5a6
26 changed files with 340 additions and 280 deletions

View File

@@ -111,8 +111,6 @@ static void decrement_reading_symtab (void *);
static void overlay_invalidate_all (void);
static int overlay_is_mapped (struct obj_section *);
void list_overlays_command (char *, int);
void map_overlay_command (char *, int);
@@ -3253,7 +3251,7 @@ init_psymbol_list (struct objfile *objfile, int total_symbols)
section, return that section.
find_pc_overlay(pc): find any overlay section that contains
the pc, either in its VMA or its LMA
overlay_is_mapped(sect): true if overlay is marked as mapped
section_is_mapped(sect): true if overlay is marked as mapped
section_is_overlay(sect): true if section's VMA != LMA
pc_in_mapped_range(pc,sec): true if pc belongs to section's VMA
pc_in_unmapped_range(...): true if pc belongs to section's LMA
@@ -3275,14 +3273,18 @@ int overlay_cache_invalid = 0; /* True if need to refresh mapped state */
SECTION is loaded at an address different from where it will "run". */
int
section_is_overlay (asection *section)
section_is_overlay (struct obj_section *section)
{
/* FIXME: need bfd *, so we can use bfd_section_lma methods. */
if (overlay_debugging)
if (section && section->lma != 0 &&
section->vma != section->lma)
return 1;
if (overlay_debugging && section)
{
bfd *abfd = section->objfile->obfd;
asection *bfd_section = section->the_bfd_section;
if (bfd_section_lma (abfd, bfd_section) != 0
&& bfd_section_lma (abfd, bfd_section)
!= bfd_section_vma (abfd, bfd_section))
return 1;
}
return 0;
}
@@ -3297,13 +3299,12 @@ overlay_invalidate_all (void)
struct obj_section *sect;
ALL_OBJSECTIONS (objfile, sect)
if (section_is_overlay (sect->the_bfd_section))
sect->ovly_mapped = -1;
if (section_is_overlay (sect))
sect->ovly_mapped = -1;
}
/* Function: overlay_is_mapped (SECTION)
/* Function: section_is_mapped (SECTION)
Returns true if section is an overlay, and is currently mapped.
Private: public access is thru function section_is_mapped.
Access to the ovly_mapped flag is restricted to this function, so
that we can do automatic update. If the global flag
@@ -3311,10 +3312,10 @@ overlay_invalidate_all (void)
overlay_invalidate_all. If the mapped state of the particular
section is stale, then call TARGET_OVERLAY_UPDATE to refresh it. */
static int
overlay_is_mapped (struct obj_section *osect)
int
section_is_mapped (struct obj_section *osect)
{
if (osect == 0 || !section_is_overlay (osect->the_bfd_section))
if (osect == 0 || !section_is_overlay (osect))
return 0;
switch (overlay_debugging)
@@ -3341,41 +3342,26 @@ overlay_is_mapped (struct obj_section *osect)
}
}
/* Function: section_is_mapped
Returns true if section is an overlay, and is currently mapped. */
int
section_is_mapped (asection *section)
{
struct objfile *objfile;
struct obj_section *osect;
if (overlay_debugging)
if (section && section_is_overlay (section))
ALL_OBJSECTIONS (objfile, osect)
if (osect->the_bfd_section == section)
return overlay_is_mapped (osect);
return 0;
}
/* Function: pc_in_unmapped_range
If PC falls into the lma range of SECTION, return true, else false. */
CORE_ADDR
pc_in_unmapped_range (CORE_ADDR pc, asection *section)
pc_in_unmapped_range (CORE_ADDR pc, struct obj_section *section)
{
/* FIXME: need bfd *, so we can use bfd_section_lma methods. */
if (section_is_overlay (section))
{
bfd *abfd = section->objfile->obfd;
asection *bfd_section = section->the_bfd_section;
int size;
/* We assume the LMA is relocated by the same offset as the VMA. */
bfd_vma size = bfd_get_section_size (bfd_section);
CORE_ADDR offset = obj_section_offset (section);
if (bfd_get_section_lma (abfd, bfd_section) + offset <= pc
&& pc < bfd_get_section_lma (abfd, bfd_section) + offset + size)
return 1;
}
if (overlay_debugging)
if (section && section_is_overlay (section))
{
size = bfd_get_section_size (section);
if (section->lma <= pc && pc < section->lma + size)
return 1;
}
return 0;
}
@@ -3383,19 +3369,15 @@ pc_in_unmapped_range (CORE_ADDR pc, asection *section)
If PC falls into the vma range of SECTION, return true, else false. */
CORE_ADDR
pc_in_mapped_range (CORE_ADDR pc, asection *section)
pc_in_mapped_range (CORE_ADDR pc, struct obj_section *section)
{
/* FIXME: need bfd *, so we can use bfd_section_vma methods. */
if (section_is_overlay (section))
{
if (obj_section_addr (section) <= pc
&& pc < obj_section_endaddr (section))
return 1;
}
int size;
if (overlay_debugging)
if (section && section_is_overlay (section))
{
size = bfd_get_section_size (section);
if (section->vma <= pc && pc < section->vma + size)
return 1;
}
return 0;
}
@@ -3403,14 +3385,12 @@ pc_in_mapped_range (CORE_ADDR pc, asection *section)
/* Return true if the mapped ranges of sections A and B overlap, false
otherwise. */
static int
sections_overlap (asection *a, asection *b)
sections_overlap (struct obj_section *a, struct obj_section *b)
{
/* FIXME: need bfd *, so we can use bfd_section_vma methods. */
CORE_ADDR a_start = a->vma;
CORE_ADDR a_end = a->vma + bfd_get_section_size (a);
CORE_ADDR b_start = b->vma;
CORE_ADDR b_end = b->vma + bfd_get_section_size (b);
CORE_ADDR a_start = obj_section_addr (a);
CORE_ADDR a_end = obj_section_endaddr (a);
CORE_ADDR b_start = obj_section_addr (b);
CORE_ADDR b_end = obj_section_endaddr (b);
return (a_start < b_end && b_start < a_end);
}
@@ -3420,14 +3400,16 @@ sections_overlap (asection *a, asection *b)
May be the same as PC. */
CORE_ADDR
overlay_unmapped_address (CORE_ADDR pc, asection *section)
overlay_unmapped_address (CORE_ADDR pc, struct obj_section *section)
{
/* FIXME: need bfd *, so we can use bfd_section_lma methods. */
if (section_is_overlay (section) && pc_in_mapped_range (pc, section))
{
bfd *abfd = section->objfile->obfd;
asection *bfd_section = section->the_bfd_section;
if (overlay_debugging)
if (section && section_is_overlay (section) &&
pc_in_mapped_range (pc, section))
return pc + section->lma - section->vma;
return pc + bfd_section_lma (abfd, bfd_section)
- bfd_section_vma (abfd, bfd_section);
}
return pc;
}
@@ -3437,14 +3419,16 @@ overlay_unmapped_address (CORE_ADDR pc, asection *section)
May be the same as PC. */
CORE_ADDR
overlay_mapped_address (CORE_ADDR pc, asection *section)
overlay_mapped_address (CORE_ADDR pc, struct obj_section *section)
{
/* FIXME: need bfd *, so we can use bfd_section_vma methods. */
if (section_is_overlay (section) && pc_in_unmapped_range (pc, section))
{
bfd *abfd = section->objfile->obfd;
asection *bfd_section = section->the_bfd_section;
if (overlay_debugging)
if (section && section_is_overlay (section) &&
pc_in_unmapped_range (pc, section))
return pc + section->vma - section->lma;
return pc + bfd_section_vma (abfd, bfd_section)
- bfd_section_lma (abfd, bfd_section);
}
return pc;
}
@@ -3455,7 +3439,7 @@ overlay_mapped_address (CORE_ADDR pc, asection *section)
depending on whether the section is mapped or not. */
CORE_ADDR
symbol_overlayed_address (CORE_ADDR address, asection *section)
symbol_overlayed_address (CORE_ADDR address, struct obj_section *section)
{
if (overlay_debugging)
{
@@ -3483,7 +3467,7 @@ symbol_overlayed_address (CORE_ADDR address, asection *section)
Else if PC matches an unmapped section's VMA, return that section.
Else if PC matches an unmapped section's LMA, return that section. */
asection *
struct obj_section *
find_pc_overlay (CORE_ADDR pc)
{
struct objfile *objfile;
@@ -3491,26 +3475,26 @@ find_pc_overlay (CORE_ADDR pc)
if (overlay_debugging)
ALL_OBJSECTIONS (objfile, osect)
if (section_is_overlay (osect->the_bfd_section))
if (section_is_overlay (osect))
{
if (pc_in_mapped_range (pc, osect->the_bfd_section))
if (pc_in_mapped_range (pc, osect))
{
if (overlay_is_mapped (osect))
return osect->the_bfd_section;
if (section_is_mapped (osect))
return osect;
else
best_match = osect;
}
else if (pc_in_unmapped_range (pc, osect->the_bfd_section))
else if (pc_in_unmapped_range (pc, osect))
best_match = osect;
}
return best_match ? best_match->the_bfd_section : NULL;
return best_match;
}
/* Function: find_pc_mapped_section (PC)
If PC falls into the VMA address range of an overlay section that is
currently marked as MAPPED, return that section. Else return NULL. */
asection *
struct obj_section *
find_pc_mapped_section (CORE_ADDR pc)
{
struct objfile *objfile;
@@ -3518,9 +3502,8 @@ find_pc_mapped_section (CORE_ADDR pc)
if (overlay_debugging)
ALL_OBJSECTIONS (objfile, osect)
if (pc_in_mapped_range (pc, osect->the_bfd_section) &&
overlay_is_mapped (osect))
return osect->the_bfd_section;
if (pc_in_mapped_range (pc, osect) && section_is_mapped (osect))
return osect;
return NULL;
}
@@ -3537,7 +3520,7 @@ list_overlays_command (char *args, int from_tty)
if (overlay_debugging)
ALL_OBJSECTIONS (objfile, osect)
if (overlay_is_mapped (osect))
if (section_is_mapped (osect))
{
const char *name;
bfd_vma lma, vma;
@@ -3572,7 +3555,6 @@ map_overlay_command (char *args, int from_tty)
{
struct objfile *objfile, *objfile2;
struct obj_section *sec, *sec2;
asection *bfdsec;
if (!overlay_debugging)
error (_("\
@@ -3587,8 +3569,7 @@ the 'overlay manual' command."));
if (!strcmp (bfd_section_name (objfile->obfd, sec->the_bfd_section), args))
{
/* Now, check to see if the section is an overlay. */
bfdsec = sec->the_bfd_section;
if (!section_is_overlay (bfdsec))
if (!section_is_overlay (sec))
continue; /* not an overlay section */
/* Mark the overlay as "mapped" */
@@ -3597,11 +3578,7 @@ the 'overlay manual' command."));
/* Next, make a pass and unmap any sections that are
overlapped by this new section: */
ALL_OBJSECTIONS (objfile2, sec2)
if (sec2->ovly_mapped
&& sec != sec2
&& sec->the_bfd_section != sec2->the_bfd_section
&& sections_overlap (sec->the_bfd_section,
sec2->the_bfd_section))
if (sec2->ovly_mapped && sec != sec2 && sections_overlap (sec, sec2))
{
if (info_verbose)
printf_unfiltered (_("Note: section %s unmapped by overlap\n"),
@@ -3941,7 +3918,7 @@ simple_overlay_update (struct obj_section *osect)
/* Now may as well update all sections, even if only one was requested. */
ALL_OBJSECTIONS (objfile, osect)
if (section_is_overlay (osect->the_bfd_section))
if (section_is_overlay (osect))
{
int i, size;
bfd *obfd = osect->objfile->obfd;