Add support for Irix 6.2 native O32 and N32 ABI.

* config.in, configure.in, configure:  Check for <objlist.h>.
	* configure.tgt:  Handle mips*-sgi-irix6* like irix5 for now.

	* cp-valprint.c (cp_print_value_fields):  Use SYMBOL_VALUE_ADDRESS
	instead of SYMBOL_BLOCK_VALUE to get the address of a static member.

	* dwarf2read.c:  Turn warnings and recoverable errors into complaints,
	add new complaints where appropriate.
	gcc -Wall cleanup.
	(struct line_head):  Change line_base from char to int to avoid
	problems with compilers whose plain char is represented by an
	unsigned char.
	(struct partial_die_info):  Add is_declaration field.
	(dwarf2_tmp_obstack):  New obstack for allocating temporary storage
	used during symbol reading.
	(cu_header_offset):  New variable for resolving relative reference
	dies.
	(optimized_out, basereg, islocal, frame_base_reg, frame_base_offset):
	New interface variables for decode_locdesc.
	(struct dwarf2_pinfo):  New structure for communication between
	psymtab and symtab reading, passed via pst->read_symtab_private.
	(dwarf2_has_info, dwarf2_build_psymtabs):  Accept objects files
	without line number sections.
	(dwarf2_build_psymtabs_hard):  Initialize temporary obstack
	for symbol reading.
	Allocate and initialize pst->read_symtab_private.
	Relocate pst->textlow and pst->texthigh with baseaddr.
	(scan_partial_symbols):  Do not add DW_AT_declaration symbols
	to the partial symbol table.
	Add file scope enumerator symbols to the partial symbol table.
	Fix typo in highpc computation.
	If we didn't find a lowpc, set it to highpc to avoid complaints
	from `maint check.
	(add_partial_symbol):  Relocate symbol values with baseaddr.
	Add static DW_TAG_subprogram and DW_TAG_variable symbols to the
	minimal symbol table.
        Obtain symbol values for DW_TAG_variable symbols from the location
	descriptor, skip symbols with missing location desciptors.
	Skip symbols for aggregate types without children.
	Handle enumerator symbols.
	(dwarf2_psymtab_to_symtab):  Issue symbol reading message if verbose.
	(psymtab_to_symtab_1):  Set local variables from
	pst->read_symtab_private, set cu_header_offset and baseaddr.
	Initialize temporary obstack for symbol reading, initialize
	buildsym and add a cleanup to really_free_pendings.
	Relocate highpc with baseaddr when calling end_symtab.
	If the compilation is from a C file generated by language
	preprocessors, do not set the symtab language if it was already
	deduced by start_subfile.
	Removed verbose sorting symbol table message.
	(process_die):  Handle DW_TAG_ptr_to_member_type and
	DW_TAG_reference_type.
	Use read_subroutine_type to get the function type for
	DW_TAG_subprogram before calling read_func_scope.
	(read_file_scope):  Initialize file name to <unknown>, start_subfile
	expects a non-NULL name.
	If we didn't find a lowpc, set it to highpc to avoid complaints
	from finish_symbol.
	Relocate lowpc and highpc with baseaddr.
	Get rid of Irix6.2 native cc compile machine prefix in comp_dir.
	Zero out ftypes for each new compilation unit (may be different
	language or different objfile).
	Accept compilation units without line number information, pass
	comp_dir to decode_lines.
	(read_func_scope):  Initialize function name to <unknown> to avoid
	core dumps when DW_AT_name is missing.
	Relocate lowpc and highpc with baseaddr.
	Handle DW_AT_frame_base, keep result for DW_OP_fbreg operations.
	Pass function type to new_symbol.
	(read_lexical_block_scope):  Relocate lowpc and highpc with baseaddr.
	(read_structure_scope):  Set TYPE_TAG_NAME, not TYPE_NAME.
	Handle DW_TAG_class_type.
	Copy fields to type_obstack, release temporary storage for fields.
	Don't add symbol if die is a stub die and has no children.
	Handle C++ static member fields.
	(read_enumeration):  Set TYPE_TAG_NAME, not TYPE_NAME.
	Copy fields to type_obstack, release temporary storage for fields.
	Let new_symbol handle the symbol creation for enumerators
	instead of handcrafting a symbol.
	Determine signedness of enum type from enumerators.
	(dwarf_read_array_type):  Handle variable length arrays.
	Use lookup_pointer_type instead of handcrafting a type.
	Create array type only if a DW_TAG_subrange_type was found.
	(read_tag_pointer_type, read_tag_reference_type):
	Use lookup_pointer_type and lookup_reference_type instead
	of handcrafting a type.
	(read_tag_ptr_to_member_type):  New function to handle
	DW_TAG_ptr_to_member_type.
	(read_subroutine_type):  Handle parameter dies.
	Use lookup_function_type instead of handcrafting a type.
	(read_typedef):  Allocate a TYPE_CODE_TYPEDEF type for the typedef.
	(read_base_type):  If the type has a name, use init_type to create
	a new type instead of second guessing a fundamental type.
	(read_comp_unit):  Reset die reference table before building
	a new one.
	(dwarf2_read_section):  Read section contents into psymbol_obstack.
	(dwarf2_read_abbrevs):  Handle unterminated abbreviations
	for a compile unit gracefully.
	(read_partial_die):  Zero partial die before reading its info.
	Handle DW_AT_declaration.
	Fix typo in handling of DW_FORM_block4.
	(read_full_die):  Fix typo in handling of DW_FORM_block4.
	(read_1_signed_byte, read_2_signed_bytes, read_4_signed_bytes):
	New routines to get signed values from a buffer.
	(read_n_bytes, read_string):  Allocate storage from the temporary
	obstack. If the host char size permits it, return pointer
	to buffer instead of allocating storage.
	(set_cu_language):  Handle DW_LANG_Mips_Assembler.
	(dwarf_attr):  Return NULL if reference die for DW_AT_specification
	or DW_AT_abstract_origin die is not found.
	(record_minimal_symbol):  Removed, replaced with a direct call to
	prim_record_minimal_symbol, it now handles saving the string itself.
	(convert_locdesc):  Removed, partial symtab reading now uses
	decode_locdesc.
	(dwarf_attr):  Use dwarf2_get_ref_die_offset to get the absolute
	offset for the die reference.
	(dwarf_decode_lines):  Complain if the line section info is missing.
	Use read_1_signed_byte to extract lh.line_base to avoid
        problems with compilers whose plain char is represented by an
        unsigned char.
	Add cleanups for allocated temporary storage.
	Start a subfile for the first file in the state machine.
	Fix off by one problem with dirs.dirs access.
	Use comp_dir when directory index is 0.
	Support multiple sequences (from Jason Merrill <jason@cygnus.com>).
	(dwarf2_start_subfile):  Try to keep line numbers from identical
	absolute and relative file names in a common subfile.
	(new_symbol):  Allocate symbol and symbol name on the symbol_obstack.
	Set SYMBOL_LINE from DW_AT_decl_line if present.
	Set SYMBOL_TYPE from passed type if not NULL.
	Change DW_TAG_variable symbol types with missing type entries
	to a sensible type.
	Handle optimized_out, offreg and islocal storage classes.
	Add external symbols with type information whose address isn't
	known as LOC_UNRESOLVED symbols.
	Synthesize typedefs for C++ classes, structs, unions and enumerations.
	Handle DW_TAG_enumerator symbols, complain for unrecognized
	symbol tags.
	(die_type):  A missing DW_AT_type represents a void type.
	Use dwarf2_get_ref_die_offset to get the absolute offset for
	the die reference.
	(die_containing_type):  New function to build type from
	DW_AT_containing_type attribut.
	(read_type_die):  Handle DW_TAG_ptr_to_member_type.
	Treat DW_TAG_subprogram like DW_TAG_subroutine_type.
	(dwarf_base_type):  Fix typo with creation of FT_UNSIGNED_SHORT
	fundamental type.
	(create_name):  Removed, symbol name allocation is now done
	in new_symbol.
	(dump_die):  Use print_address_numeric to print a CORE_ADDR.
	(dwarf2_empty_die_ref_table):  New function to clear the die
	reference table.
	(dwarf2_get_ref_die_offset):  New function to get the absolute
	die offset from a die reference attribute.
	(decode_locdesc):  Complete rewrite using a stack, code mostly
	borrowed from dwarfread.c:locval.
	(dwarf_alloc_type):  Removed, replaced by direct calls to alloc_type.
	(dwarf_alloc_block):  Allocate block on temporary obstack.

	* elfread.c (elf_symtab_read):  When handling Irix dynamic symbols,
	skip section name symbols and relocate all others.
	(elf_symfile_read):  Build dwarf2 psymtab even if offset is non-zero.

	* irix5-nat.c (fetch_core_registers):  Handle core_reg_sect
	from N32 executables. Call registers_fetched after extracting
	the registers.
	(obj_list_variant, struct link_map, LM_OFFSET, LM_ADDR):  New
	definitions to enable support of O32 and N32 format objlists.
	(struct so_list):  New members offset, so_name and lmstart to
	eliminate dependencies from the objlist format used.
	(solib_map_sections, symbol_add_stub, solib_add,
	info_sharedlibrary_command, solib_address, clear_solib):  Use
	so_name and LM_OFFSET.
	(first_link_map_member):  Rewrite to enable support of O32 and N32
	format objlists.
	(next_link_map_member, xfer_link_map_member):  New functions to
	support O32 and N32 format objlists.
	(find_solib):  Use first_link_map_member, next_link_map_member and
	xfer_link_map_member.
	(solib_create_inferior_hook):  Use TARGET_SIGNAL_* instead of
	host signal numbers.

	* mdebugread.c (parse_partial_symbols, handle_psymbol_enumerators):
	Pass CORE_ADDR variant to add_psymbol_to_list.

	* mips-tdep.c (heuristic_proc_desc):  Stop examining the prologue
	if we encounter a positive stack adjustment. Handle `move $30,$sp'.
	Handle `sd reg,offset($sp)' for 32 bit ABIs.

	* symmisc.c (dump_msymbols, print_partial_symbols):  Use
	print_address_numeric to print a SYMBOL_VALUE_ADDRESS.
	(dump_symtab):  Print compilation directory if it is not NULL.

	* valops.c (search_struct_field, value_struct_elt_for_reference):
	Use SYMBOL_VALUE_ADDRESS instead of SYMBOL_BLOCK_VALUE to get the
	address of a static member.
This commit is contained in:
Peter Schauer 1996-12-01 08:33:39 +00:00
parent 0e0f410619
commit 0db3fe94c3
10 changed files with 1797 additions and 749 deletions

View File

@ -1,3 +1,204 @@
Sun Dec 1 00:18:59 1996 Peter Schauer (pes@regent.e-technik.tu-muenchen.de)
Add support for Irix 6.2 native O32 and N32 ABI.
* config.in, configure.in, configure: Check for <objlist.h>.
* configure.tgt: Handle mips*-sgi-irix6* like irix5 for now.
* cp-valprint.c (cp_print_value_fields): Use SYMBOL_VALUE_ADDRESS
instead of SYMBOL_BLOCK_VALUE to get the address of a static member.
* dwarf2read.c: Turn warnings and recoverable errors into complaints,
add new complaints where appropriate.
gcc -Wall cleanup.
(struct line_head): Change line_base from char to int to avoid
problems with compilers whose plain char is represented by an
unsigned char.
(struct partial_die_info): Add is_declaration field.
(dwarf2_tmp_obstack): New obstack for allocating temporary storage
used during symbol reading.
(cu_header_offset): New variable for resolving relative reference
dies.
(optimized_out, basereg, islocal, frame_base_reg, frame_base_offset):
New interface variables for decode_locdesc.
(struct dwarf2_pinfo): New structure for communication between
psymtab and symtab reading, passed via pst->read_symtab_private.
(dwarf2_has_info, dwarf2_build_psymtabs): Accept objects files
without line number sections.
(dwarf2_build_psymtabs_hard): Initialize temporary obstack
for symbol reading.
Allocate and initialize pst->read_symtab_private.
Relocate pst->textlow and pst->texthigh with baseaddr.
(scan_partial_symbols): Do not add DW_AT_declaration symbols
to the partial symbol table.
Add file scope enumerator symbols to the partial symbol table.
Fix typo in highpc computation.
If we didn't find a lowpc, set it to highpc to avoid complaints
from `maint check.
(add_partial_symbol): Relocate symbol values with baseaddr.
Add static DW_TAG_subprogram and DW_TAG_variable symbols to the
minimal symbol table.
Obtain symbol values for DW_TAG_variable symbols from the location
descriptor, skip symbols with missing location desciptors.
Skip symbols for aggregate types without children.
Handle enumerator symbols.
(dwarf2_psymtab_to_symtab): Issue symbol reading message if verbose.
(psymtab_to_symtab_1): Set local variables from
pst->read_symtab_private, set cu_header_offset and baseaddr.
Initialize temporary obstack for symbol reading, initialize
buildsym and add a cleanup to really_free_pendings.
Relocate highpc with baseaddr when calling end_symtab.
If the compilation is from a C file generated by language
preprocessors, do not set the symtab language if it was already
deduced by start_subfile.
Removed verbose sorting symbol table message.
(process_die): Handle DW_TAG_ptr_to_member_type and
DW_TAG_reference_type.
Use read_subroutine_type to get the function type for
DW_TAG_subprogram before calling read_func_scope.
(read_file_scope): Initialize file name to <unknown>, start_subfile
expects a non-NULL name.
If we didn't find a lowpc, set it to highpc to avoid complaints
from finish_symbol.
Relocate lowpc and highpc with baseaddr.
Get rid of Irix6.2 native cc compile machine prefix in comp_dir.
Zero out ftypes for each new compilation unit (may be different
language or different objfile).
Accept compilation units without line number information, pass
comp_dir to decode_lines.
(read_func_scope): Initialize function name to <unknown> to avoid
core dumps when DW_AT_name is missing.
Relocate lowpc and highpc with baseaddr.
Handle DW_AT_frame_base, keep result for DW_OP_fbreg operations.
Pass function type to new_symbol.
(read_lexical_block_scope): Relocate lowpc and highpc with baseaddr.
(read_structure_scope): Set TYPE_TAG_NAME, not TYPE_NAME.
Handle DW_TAG_class_type.
Copy fields to type_obstack, release temporary storage for fields.
Don't add symbol if die is a stub die and has no children.
Handle C++ static member fields.
(read_enumeration): Set TYPE_TAG_NAME, not TYPE_NAME.
Copy fields to type_obstack, release temporary storage for fields.
Let new_symbol handle the symbol creation for enumerators
instead of handcrafting a symbol.
Determine signedness of enum type from enumerators.
(dwarf_read_array_type): Handle variable length arrays.
Use lookup_pointer_type instead of handcrafting a type.
Create array type only if a DW_TAG_subrange_type was found.
(read_tag_pointer_type, read_tag_reference_type):
Use lookup_pointer_type and lookup_reference_type instead
of handcrafting a type.
(read_tag_ptr_to_member_type): New function to handle
DW_TAG_ptr_to_member_type.
(read_subroutine_type): Handle parameter dies.
Use lookup_function_type instead of handcrafting a type.
(read_typedef): Allocate a TYPE_CODE_TYPEDEF type for the typedef.
(read_base_type): If the type has a name, use init_type to create
a new type instead of second guessing a fundamental type.
(read_comp_unit): Reset die reference table before building
a new one.
(dwarf2_read_section): Read section contents into psymbol_obstack.
(dwarf2_read_abbrevs): Handle unterminated abbreviations
for a compile unit gracefully.
(read_partial_die): Zero partial die before reading its info.
Handle DW_AT_declaration.
Fix typo in handling of DW_FORM_block4.
(read_full_die): Fix typo in handling of DW_FORM_block4.
(read_1_signed_byte, read_2_signed_bytes, read_4_signed_bytes):
New routines to get signed values from a buffer.
(read_n_bytes, read_string): Allocate storage from the temporary
obstack. If the host char size permits it, return pointer
to buffer instead of allocating storage.
(set_cu_language): Handle DW_LANG_Mips_Assembler.
(dwarf_attr): Return NULL if reference die for DW_AT_specification
or DW_AT_abstract_origin die is not found.
(record_minimal_symbol): Removed, replaced with a direct call to
prim_record_minimal_symbol, it now handles saving the string itself.
(convert_locdesc): Removed, partial symtab reading now uses
decode_locdesc.
(dwarf_attr): Use dwarf2_get_ref_die_offset to get the absolute
offset for the die reference.
(dwarf_decode_lines): Complain if the line section info is missing.
Use read_1_signed_byte to extract lh.line_base to avoid
problems with compilers whose plain char is represented by an
unsigned char.
Add cleanups for allocated temporary storage.
Start a subfile for the first file in the state machine.
Fix off by one problem with dirs.dirs access.
Use comp_dir when directory index is 0.
Support multiple sequences (from Jason Merrill <jason@cygnus.com>).
(dwarf2_start_subfile): Try to keep line numbers from identical
absolute and relative file names in a common subfile.
(new_symbol): Allocate symbol and symbol name on the symbol_obstack.
Set SYMBOL_LINE from DW_AT_decl_line if present.
Set SYMBOL_TYPE from passed type if not NULL.
Change DW_TAG_variable symbol types with missing type entries
to a sensible type.
Handle optimized_out, offreg and islocal storage classes.
Add external symbols with type information whose address isn't
known as LOC_UNRESOLVED symbols.
Synthesize typedefs for C++ classes, structs, unions and enumerations.
Handle DW_TAG_enumerator symbols, complain for unrecognized
symbol tags.
(die_type): A missing DW_AT_type represents a void type.
Use dwarf2_get_ref_die_offset to get the absolute offset for
the die reference.
(die_containing_type): New function to build type from
DW_AT_containing_type attribut.
(read_type_die): Handle DW_TAG_ptr_to_member_type.
Treat DW_TAG_subprogram like DW_TAG_subroutine_type.
(dwarf_base_type): Fix typo with creation of FT_UNSIGNED_SHORT
fundamental type.
(create_name): Removed, symbol name allocation is now done
in new_symbol.
(dump_die): Use print_address_numeric to print a CORE_ADDR.
(dwarf2_empty_die_ref_table): New function to clear the die
reference table.
(dwarf2_get_ref_die_offset): New function to get the absolute
die offset from a die reference attribute.
(decode_locdesc): Complete rewrite using a stack, code mostly
borrowed from dwarfread.c:locval.
(dwarf_alloc_type): Removed, replaced by direct calls to alloc_type.
(dwarf_alloc_block): Allocate block on temporary obstack.
* elfread.c (elf_symtab_read): When handling Irix dynamic symbols,
skip section name symbols and relocate all others.
(elf_symfile_read): Build dwarf2 psymtab even if offset is non-zero.
* irix5-nat.c (fetch_core_registers): Handle core_reg_sect
from N32 executables. Call registers_fetched after extracting
the registers.
(obj_list_variant, struct link_map, LM_OFFSET, LM_ADDR): New
definitions to enable support of O32 and N32 format objlists.
(struct so_list): New members offset, so_name and lmstart to
eliminate dependencies from the objlist format used.
(solib_map_sections, symbol_add_stub, solib_add,
info_sharedlibrary_command, solib_address, clear_solib): Use
so_name and LM_OFFSET.
(first_link_map_member): Rewrite to enable support of O32 and N32
format objlists.
(next_link_map_member, xfer_link_map_member): New functions to
support O32 and N32 format objlists.
(find_solib): Use first_link_map_member, next_link_map_member and
xfer_link_map_member.
(solib_create_inferior_hook): Use TARGET_SIGNAL_* instead of
host signal numbers.
* mdebugread.c (parse_partial_symbols, handle_psymbol_enumerators):
Pass CORE_ADDR variant to add_psymbol_to_list.
* mips-tdep.c (heuristic_proc_desc): Stop examining the prologue
if we encounter a positive stack adjustment. Handle `move $30,$sp'.
Handle `sd reg,offset($sp)' for 32 bit ABIs.
* symmisc.c (dump_msymbols, print_partial_symbols): Use
print_address_numeric to print a SYMBOL_VALUE_ADDRESS.
(dump_symtab): Print compilation directory if it is not NULL.
* valops.c (search_struct_field, value_struct_elt_for_reference):
Use SYMBOL_VALUE_ADDRESS instead of SYMBOL_BLOCK_VALUE to get the
address of a static member.
Thu Nov 28 00:46:24 1996 Peter Schauer (pes@regent.e-technik.tu-muenchen.de)
* vax-tdep.c (vax_print_insn): Made static, modified to take

View File

@ -110,6 +110,9 @@
/* Define if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H
/* Define if you have the <objlist.h> header file. */
#undef HAVE_OBJLIST_H
/* Define if you have the select function. */
#undef HAVE_SELECT

2
gdb/configure vendored
View File

@ -1346,7 +1346,7 @@ EOF
fi
for ac_hdr in limits.h memory.h string.h strings.h unistd.h termios.h termio.h sgtty.h stddef.h stdlib.h sys/procfs.h link.h endian.h
for ac_hdr in limits.h memory.h string.h strings.h unistd.h termios.h termio.h sgtty.h stddef.h stdlib.h sys/procfs.h link.h endian.h objlist.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6

View File

@ -40,7 +40,7 @@ AC_CONFIG_AUX_DIR(`cd $srcdir;pwd`/..)
AC_ARG_PROGRAM
AC_HEADER_STDC
AC_CHECK_HEADERS(limits.h memory.h string.h strings.h unistd.h termios.h termio.h sgtty.h stddef.h stdlib.h sys/procfs.h link.h endian.h)
AC_CHECK_HEADERS(limits.h memory.h string.h strings.h unistd.h termios.h termio.h sgtty.h stddef.h stdlib.h sys/procfs.h link.h endian.h objlist.h)
AC_HEADER_STAT
AC_C_CONST

View File

@ -175,6 +175,7 @@ mips*el-*-elf*) gdb_target=embedl ;;
mips*-*-elf*) gdb_target=embed ;;
mips*-little-*) gdb_target=littlemips ;;
mips*-sgi-irix5*) gdb_target=irix5 ;;
mips*-sgi-irix6*) gdb_target=irix5 ;;
mips*-sgi-*) gdb_target=irix3 ;;
mips*-sony-*) gdb_target=bigmips ;;
mips*-*-mach3*) gdb_target=mach3 ;;

View File

@ -342,7 +342,7 @@ cp_print_value_fields (type, valaddr, address, stream, format, recurse, pretty,
else
{
v = value_at (TYPE_FIELD_TYPE (type, i),
(CORE_ADDR)SYMBOL_BLOCK_VALUE (sym));
SYMBOL_VALUE_ADDRESS (sym));
cp_print_static_field (TYPE_FIELD_TYPE (type, i), v,
stream, format, recurse + 1,
pretty);

File diff suppressed because it is too large Load Diff

View File

@ -389,6 +389,15 @@ elf_symtab_read (abfd, addr, objfile, dynamic)
default:
ms_type = mst_abs;
}
/* If it is an Irix dynamic symbol, skip section name
symbols, relocate all others. */
if (ms_type != mst_abs)
{
if (sym->name[0] == '.')
continue;
symaddr += addr;
}
}
else if (sym -> section -> flags & SEC_CODE)
{
@ -603,7 +612,7 @@ elf_symfile_read (objfile, section_offsets, mainline)
special ELF sections. We first have to find them... */
bfd_map_over_sections (abfd, elf_locate_sections, (PTR) &ei);
if (dwarf2_has_info (abfd) && !offset)
if (dwarf2_has_info (abfd))
{
/* DWARF 2 sections */
dwarf2_build_psymtabs (objfile, section_offsets, mainline);

View File

@ -169,17 +169,53 @@ fetch_core_registers (core_reg_sect, core_reg_size, which, reg_addr)
int which; /* Unused */
CORE_ADDR reg_addr; /* Unused */
{
if (core_reg_size != REGISTER_BYTES)
if (core_reg_size == REGISTER_BYTES)
{
memcpy ((char *)registers, core_reg_sect, core_reg_size);
}
else if (core_reg_size == (2 * REGISTER_BYTES) && MIPS_REGSIZE == 4)
{
/* This is a core file from a N32 executable, 64 bits are saved
for all registers. */
char *srcp = core_reg_sect;
char *dstp = registers;
int regno;
for (regno = 0; regno < NUM_REGS; regno++)
{
if (regno >= FP0_REGNUM && regno < (FP0_REGNUM + 32))
{
/* FIXME, this is wrong, N32 has 64 bit FP regs, but GDB
currently assumes that they are 32 bit. */
*dstp++ = *srcp++;
*dstp++ = *srcp++;
*dstp++ = *srcp++;
*dstp++ = *srcp++;
srcp += 4;
}
else
{
srcp += 4;
*dstp++ = *srcp++;
*dstp++ = *srcp++;
*dstp++ = *srcp++;
*dstp++ = *srcp++;
}
}
}
else
{
warning ("wrong size gregset struct in core file");
return;
}
memcpy ((char *)registers, core_reg_sect, core_reg_size);
registers_fetched ();
}
/* Irix 5 uses what appears to be a unique form of shared library
support. This is a copy of solib.c modified for Irix 5. */
/* FIXME: Most of this code could be merged with osfsolib.c and solib.c
by using next_link_map_member and xfer_link_map_member in solib.c. */
#include <sys/types.h>
#include <signal.h>
@ -192,6 +228,13 @@ fetch_core_registers (core_reg_sect, core_reg_size, which, reg_addr)
#define __SYM_H__
#define __SYMCONST_H__
#include <obj.h>
#ifdef HAVE_OBJLIST_H
#include <objlist.h>
#endif
#ifdef NEW_OBJ_INFO_MAGIC
#define HANDLE_NEW_OBJ_LIST
#endif
#include "symtab.h"
#include "bfd.h"
@ -207,16 +250,43 @@ fetch_core_registers (core_reg_sect, core_reg_size, which, reg_addr)
/* The symbol which starts off the list of shared libraries. */
#define DEBUG_BASE "__rld_obj_head"
/* How to get the loaded address of a shared library. */
#define LM_ADDR(so) ((so)->lm.o_praw)
/* Irix 6.x introduces a new variant of object lists.
To be able to debug O32 executables under Irix 6, we have to handle both
variants. */
typedef enum
{
OBJ_LIST_OLD, /* Pre Irix 6.x object list. */
OBJ_LIST_32, /* 32 Bit Elf32_Obj_Info. */
OBJ_LIST_64 /* 64 Bit Elf64_Obj_Info, FIXME not yet implemented. */
} obj_list_variant;
/* Define our own link_map structure.
This will help to share code with osfsolib.c and solib.c. */
struct link_map {
obj_list_variant l_variant; /* which variant of object list */
CORE_ADDR l_lladdr; /* addr in inferior list was read from */
CORE_ADDR l_next; /* address of next object list entry */
};
/* Irix 5 shared objects are pre-linked to particular addresses
although the dynamic linker may have to relocate them if the
address ranges of the libraries used by the main program clash.
The offset is the difference between the address where the object
is mapped and the binding address of the shared library. */
#define LM_OFFSET(so) ((so) -> offset)
/* Loaded address of shared library. */
#define LM_ADDR(so) ((so) -> lmstart)
char shadow_contents[BREAKPOINT_MAX]; /* Stash old bkpt addr contents */
struct so_list {
struct so_list *next; /* next structure in linked list */
struct obj_list ll;
struct obj lm; /* copy of link map from inferior */
struct obj_list *lladdr; /* addr in inferior lm was read from */
struct link_map lm;
CORE_ADDR offset; /* prelink to load address offset */
char *so_name; /* shared object lib name */
CORE_ADDR lmstart; /* lower addr bound of mapped object */
CORE_ADDR lmend; /* upper addr bound of mapped object */
char symbols_loaded; /* flag: symbols read in yet? */
char from_tty; /* flag: print msgs? */
@ -251,9 +321,15 @@ symbol_add_stub PARAMS ((char *));
static struct so_list *
find_solib PARAMS ((struct so_list *));
static struct obj_list *
static struct link_map *
first_link_map_member PARAMS ((void));
static struct link_map *
next_link_map_member PARAMS ((struct so_list *));
static void
xfer_link_map_member PARAMS ((struct so_list *, struct link_map *));
static CORE_ADDR
locate_base PARAMS ((void));
@ -297,9 +373,8 @@ solib_map_sections (so)
struct section_table *p;
struct cleanup *old_chain;
bfd *abfd;
CORE_ADDR offset;
filename = tilde_expand (so -> lm.o_path);
filename = tilde_expand (so -> so_name);
old_chain = make_cleanup (free, filename);
scratch_chan = openp (getenv ("PATH"), 1, filename, O_RDONLY, 0,
@ -337,20 +412,13 @@ solib_map_sections (so)
bfd_get_filename (exec_bfd), bfd_errmsg (bfd_get_error ()));
}
/* Irix 5 shared objects are pre-linked to particular addresses
although the dynamic linker may have to relocate them if the
address ranges of the libraries used by the main program clash.
The offset is the difference between the address where the object
is mapped and the binding address of the shared library. */
offset = (CORE_ADDR) LM_ADDR (so) - so -> lm.o_base_address;
for (p = so -> sections; p < so -> sections_end; p++)
{
/* Relocate the section binding addresses as recorded in the shared
object's file by the offset to get the address to which the
object was actually mapped. */
p -> addr += offset;
p -> endaddr += offset;
p -> addr += LM_OFFSET (so);
p -> endaddr += LM_OFFSET (so);
so -> lmend = (CORE_ADDR) max (p -> endaddr, so -> lmend);
if (STREQ (p -> the_bfd_section -> name, ".text"))
{
@ -437,27 +505,196 @@ DESCRIPTION
Read in a copy of the first member in the inferior's dynamic
link map from the inferior's dynamic linker structures, and return
a pointer to the copy in our address space.
a pointer to the link map descriptor.
*/
static struct obj_list *
static struct link_map *
first_link_map_member ()
{
struct obj_list *lm;
struct obj_list s;
struct obj_list *listp;
struct obj_list list_old;
struct link_map *lm;
static struct link_map first_lm;
CORE_ADDR lladdr;
CORE_ADDR next_lladdr;
read_memory (debug_base, (char *) &lm, sizeof (struct obj_list *));
if (lm == NULL)
/* We have not already read in the dynamic linking structures
from the inferior, lookup the address of the base structure. */
debug_base = locate_base ();
if (debug_base == 0)
return NULL;
/* Get address of first list entry. */
read_memory (debug_base, (char *) &listp, sizeof (struct obj_list *));
if (listp == NULL)
return NULL;
/* Get first list entry. */
lladdr = (CORE_ADDR) listp;
read_memory (lladdr, (char *) &list_old, sizeof (struct obj_list));
/* The first entry in the list is the object file we are debugging,
so skip it. */
read_memory ((CORE_ADDR) lm, (char *) &s, sizeof (struct obj_list));
next_lladdr = (CORE_ADDR) list_old.next;
return s.next;
#ifdef HANDLE_NEW_OBJ_LIST
if (list_old.data == NEW_OBJ_INFO_MAGIC)
{
Elf32_Obj_Info list_32;
read_memory (lladdr, (char *) &list_32, sizeof (Elf32_Obj_Info));
if (list_32.oi_size != sizeof (Elf32_Obj_Info))
return NULL;
next_lladdr = (CORE_ADDR) list_32.oi_next;
}
#endif
if (next_lladdr == 0)
return NULL;
first_lm.l_lladdr = next_lladdr;
lm = &first_lm;
return lm;
}
/*
LOCAL FUNCTION
next_link_map_member -- locate next member in dynamic linker's map
SYNOPSIS
static struct link_map *next_link_map_member (so_list_ptr)
DESCRIPTION
Read in a copy of the next member in the inferior's dynamic
link map from the inferior's dynamic linker structures, and return
a pointer to the link map descriptor.
*/
static struct link_map *
next_link_map_member (so_list_ptr)
struct so_list *so_list_ptr;
{
struct link_map *lm = &so_list_ptr -> lm;
CORE_ADDR next_lladdr = lm -> l_next;
static struct link_map next_lm;
if (next_lladdr == 0)
{
/* We have hit the end of the list, so check to see if any were
added, but be quiet if we can't read from the target any more. */
int status = 0;
if (lm -> l_variant == OBJ_LIST_OLD)
{
struct obj_list list_old;
status = target_read_memory (lm -> l_lladdr,
(char *) &list_old,
sizeof (struct obj_list));
next_lladdr = (CORE_ADDR) list_old.next;
}
#ifdef HANDLE_NEW_OBJ_LIST
else if (lm -> l_variant == OBJ_LIST_32)
{
Elf32_Obj_Info list_32;
status = target_read_memory (lm -> l_lladdr,
(char *) &list_32,
sizeof (Elf32_Obj_Info));
next_lladdr = (CORE_ADDR) list_32.oi_next;
}
#endif
if (status != 0 || next_lladdr == 0)
return NULL;
}
next_lm.l_lladdr = next_lladdr;
lm = &next_lm;
return lm;
}
/*
LOCAL FUNCTION
xfer_link_map_member -- set local variables from dynamic linker's map
SYNOPSIS
static void xfer_link_map_member (so_list_ptr, lm)
DESCRIPTION
Read in a copy of the requested member in the inferior's dynamic
link map from the inferior's dynamic linker structures, and fill
in the necessary so_list_ptr elements.
*/
static void
xfer_link_map_member (so_list_ptr, lm)
struct so_list *so_list_ptr;
struct link_map *lm;
{
struct obj_list list_old;
CORE_ADDR lladdr = lm -> l_lladdr;
struct link_map *new_lm = &so_list_ptr -> lm;
int errcode;
read_memory (lladdr, (char *) &list_old, sizeof (struct obj_list));
new_lm -> l_variant = OBJ_LIST_OLD;
new_lm -> l_lladdr = lladdr;
new_lm -> l_next = (CORE_ADDR) list_old.next;
#ifdef HANDLE_NEW_OBJ_LIST
if (list_old.data == NEW_OBJ_INFO_MAGIC)
{
Elf32_Obj_Info list_32;
read_memory (lladdr, (char *) &list_32, sizeof (Elf32_Obj_Info));
if (list_32.oi_size != sizeof (Elf32_Obj_Info))
return;
new_lm -> l_variant = OBJ_LIST_32;
new_lm -> l_next = (CORE_ADDR) list_32.oi_next;
target_read_string ((CORE_ADDR) list_32.oi_pathname,
&so_list_ptr -> so_name,
list_32.oi_pathname_len + 1, &errcode);
if (errcode != 0)
memory_error (errcode, (CORE_ADDR) list_32.oi_pathname);
LM_ADDR (so_list_ptr) = (CORE_ADDR) list_32.oi_ehdr;
LM_OFFSET (so_list_ptr)
= (CORE_ADDR) list_32.oi_ehdr - (CORE_ADDR) list_32.oi_orig_ehdr;
}
else
#endif
{
struct obj obj_old;
read_memory ((CORE_ADDR) list_old.data, (char *) &obj_old,
sizeof (struct obj));
target_read_string ((CORE_ADDR) obj_old.o_path,
&so_list_ptr -> so_name,
INT_MAX, &errcode);
if (errcode != 0)
memory_error (errcode, (CORE_ADDR) obj_old.o_path);
LM_ADDR (so_list_ptr) = (CORE_ADDR) obj_old.o_praw;
LM_OFFSET (so_list_ptr)
= (CORE_ADDR) obj_old.o_praw - obj_old.o_base_address;
}
solib_map_sections (so_list_ptr);
}
/*
LOCAL FUNCTION
@ -483,7 +720,7 @@ find_solib (so_list_ptr)
struct so_list *so_list_ptr; /* Last lm or NULL for first one */
{
struct so_list *so_list_next = NULL;
struct obj_list *lm = NULL;
struct link_map *lm = NULL;
struct so_list *new;
if (so_list_ptr == NULL)
@ -491,49 +728,21 @@ find_solib (so_list_ptr)
/* We are setting up for a new scan through the loaded images. */
if ((so_list_next = so_list_head) == NULL)
{
/* We have not already read in the dynamic linking structures
from the inferior, lookup the address of the base structure. */
debug_base = locate_base ();
if (debug_base != 0)
{
/* Read the base structure in and find the address of the first
link map list member. */
lm = first_link_map_member ();
}
/* Find the first link map list member. */
lm = first_link_map_member ();
}
}
else
{
/* We have been called before, and are in the process of walking
the shared library list. Advance to the next shared object. */
if ((lm = so_list_ptr->ll.next) == NULL)
{
/* We have hit the end of the list, so check to see if any were
added, but be quiet if we can't read from the target any more. */
int status = target_read_memory ((CORE_ADDR) so_list_ptr -> lladdr,
(char *) &(so_list_ptr -> ll),
sizeof (struct obj_list));
if (status == 0)
{
lm = so_list_ptr->ll.next;
}
else
{
lm = NULL;
}
}
lm = next_link_map_member (so_list_ptr);
so_list_next = so_list_ptr -> next;
}
if ((so_list_next == NULL) && (lm != NULL))
{
int errcode;
char *buffer;
/* Get next link map structure from inferior image and build a local
abbreviated load_map structure */
new = (struct so_list *) xmalloc (sizeof (struct so_list));
memset ((char *) new, 0, sizeof (struct so_list));
new -> lladdr = lm;
/* Add the new node as the next node in the list, or as the root
node if this is the first one. */
if (so_list_ptr != NULL)
@ -545,16 +754,7 @@ find_solib (so_list_ptr)
so_list_head = new;
}
so_list_next = new;
read_memory ((CORE_ADDR) lm, (char *) &(new -> ll),
sizeof (struct obj_list));
read_memory ((CORE_ADDR) new->ll.data, (char *) &(new -> lm),
sizeof (struct obj));
target_read_string ((CORE_ADDR)new->lm.o_path, &buffer,
INT_MAX, &errcode);
if (errcode != 0)
memory_error (errcode, (CORE_ADDR)new->lm.o_path);
new->lm.o_path = buffer;
solib_map_sections (new);
xfer_link_map_member (new, lm);
}
return (so_list_next);
}
@ -582,11 +782,10 @@ symbol_add_stub (arg)
bfd_map_over_sections (so -> abfd, find_lowest_section,
(PTR) &lowest_sect);
if (lowest_sect)
text_addr = bfd_section_vma (so -> abfd, lowest_sect)
+ (CORE_ADDR) LM_ADDR (so) - so -> lm.o_base_address;
text_addr = bfd_section_vma (so -> abfd, lowest_sect) + LM_OFFSET (so);
}
so -> objfile = symbol_file_add (so -> lm.o_path, so -> from_tty,
so -> objfile = symbol_file_add (so -> so_name, so -> from_tty,
text_addr,
0, 0, 0);
return (1);
@ -636,7 +835,7 @@ solib_add (arg_string, from_tty, target)
count = 0;
while ((so = find_solib (so)) != NULL)
{
if (so -> lm.o_path[0])
if (so -> so_name[0])
{
count += so -> sections_end - so -> sections;
}
@ -678,7 +877,7 @@ solib_add (arg_string, from_tty, target)
/* Add these section table entries to the target's table. */
while ((so = find_solib (so)) != NULL)
{
if (so -> lm.o_path[0])
if (so -> so_name[0])
{
count = so -> sections_end - so -> sections;
memcpy ((char *) (target -> to_sections + old),
@ -693,14 +892,14 @@ solib_add (arg_string, from_tty, target)
/* Now add the symbol files. */
while ((so = find_solib (so)) != NULL)
{
if (so -> lm.o_path[0] && re_exec (so -> lm.o_path))
if (so -> so_name[0] && re_exec (so -> so_name))
{
so -> from_tty = from_tty;
if (so -> symbols_loaded)
{
if (from_tty)
{
printf_unfiltered ("Symbols already loaded for %s\n", so -> lm.o_path);
printf_unfiltered ("Symbols already loaded for %s\n", so -> so_name);
}
}
else if (catch_errors
@ -751,7 +950,7 @@ info_sharedlibrary_command (ignore, from_tty)
}
while ((so = find_solib (so)) != NULL)
{
if (so -> lm.o_path[0])
if (so -> so_name[0])
{
if (!header_done)
{
@ -766,7 +965,7 @@ info_sharedlibrary_command (ignore, from_tty)
local_hex_string_custom ((unsigned long) so -> lmend,
"08l"));
printf_unfiltered ("%-12s", so -> symbols_loaded ? "Yes" : "No");
printf_unfiltered ("%s\n", so -> lm.o_path);
printf_unfiltered ("%s\n", so -> so_name);
}
}
if (so_list_head == NULL)
@ -807,11 +1006,11 @@ solib_address (address)
while ((so = find_solib (so)) != NULL)
{
if (so -> lm.o_path[0])
if (so -> so_name[0])
{
if ((address >= (CORE_ADDR) LM_ADDR (so)) &&
(address < (CORE_ADDR) so -> lmend))
return (so->lm.o_path);
return (so->so_name);
}
}
return (0);
@ -845,7 +1044,7 @@ clear_solib()
next = so_list_head -> next;
if (bfd_filename)
free ((PTR)bfd_filename);
free (so_list_head->lm.o_path);
free (so_list_head->so_name);
free ((PTR)so_list_head);
so_list_head = next;
}
@ -993,13 +1192,13 @@ solib_create_inferior_hook()
clear_proceed_status ();
stop_soon_quietly = 1;
stop_signal = 0;
stop_signal = TARGET_SIGNAL_0;
do
{
target_resume (-1, 0, stop_signal);
wait_for_inferior ();
}
while (stop_signal != SIGTRAP);
while (stop_signal != TARGET_SIGNAL_TRAP);
/* We are now either at the "mapping complete" breakpoint (or somewhere
else, a condition we aren't prepared to deal with anyway), so adjust

View File

@ -254,8 +254,8 @@ static int cur_sdx;
/* Note how much "debuggable" this image is. We would like
to see at least one FDR with full symbols */
static max_gdbinfo;
static max_glevel;
static int max_gdbinfo;
static int max_glevel;
/* When examining .o files, report on undefined symbols */
@ -2745,12 +2745,12 @@ parse_partial_symbols (objfile, section_offsets)
add_psymbol_to_list (name, strlen (name),
VAR_NAMESPACE, LOC_BLOCK,
&objfile->global_psymbols,
sh.value, 0, psymtab_language, objfile);
0, sh.value, psymtab_language, objfile);
else
add_psymbol_to_list (name, strlen (name),
VAR_NAMESPACE, LOC_BLOCK,
&objfile->static_psymbols,
sh.value, 0, psymtab_language, objfile);
0, sh.value, psymtab_language, objfile);
/* Skip over procedure to next one. */
if (sh.index >= hdr->iauxMax)
@ -2841,7 +2841,7 @@ parse_partial_symbols (objfile, section_offsets)
add_psymbol_to_list (name, strlen (name),
STRUCT_NAMESPACE, LOC_TYPEDEF,
&objfile->static_psymbols,
sh.value, 0,
0, (CORE_ADDR) 0,
psymtab_language, objfile);
}
handle_psymbol_enumerators (objfile, fh, sh.st, sh.value);
@ -2879,8 +2879,8 @@ parse_partial_symbols (objfile, section_offsets)
/* Use this gdb symbol */
add_psymbol_to_list (name, strlen (name),
VAR_NAMESPACE, class,
&objfile->static_psymbols, sh.value,
0, psymtab_language, objfile);
&objfile->static_psymbols,
0, sh.value, psymtab_language, objfile);
skip:
cur_sdx++; /* Go to next file symbol */
}
@ -3127,7 +3127,7 @@ handle_psymbol_enumerators (objfile, fh, stype, svalue)
add_psymbol_to_list (name, strlen (name),
VAR_NAMESPACE, LOC_CONST,
&objfile->static_psymbols, 0,
0, psymtab_language, objfile);
(CORE_ADDR) 0, psymtab_language, objfile);
ext_sym += external_sym_size;
}
}