* dbxread.c (process_one_symbol): Handle stabs-in-som just like

stabs-in-elf.
        (pastab_build_psymtabs): Likewise.

        * hppa-tdep.c: Change all comments to reference %r3 or frame pointer
        rather than %r4.
        (frame_chain, skip_prologue, dig_rp_from_stack): Handle %r3 as the
        frame pointer.

        * config/pa/tm-hppa.h (FP_REGNUM): Define as %r3.
        (FIND_FRAME_SAVED_REGS): Handle %r3 as frame pointer.
        (CALL_DUMMY): Likewise.
This commit is contained in:
Jeff Law 1993-12-27 04:46:05 +00:00
parent b02fd8caa2
commit 2f8c3639fa
3 changed files with 62 additions and 38 deletions

View File

@ -1,3 +1,18 @@
Sun Dec 26 20:44:02 1993 Jeffrey A. Law (law@snake.cs.utah.edu)
* dbxread.c (process_one_symbol): Handle stabs-in-som just like
stabs-in-elf.
(pastab_build_psymtabs): Likewise.
* hppa-tdep.c: Change all comments to reference %r3 or frame
pointer rather than %r4.
(frame_chain, skip_prologue, dig_rp_from_stack): Handle %r3 as the
frame pointer.
* config/pa/tm-hppa.h (FP_REGNUM): Define as %r3.
(FIND_FRAME_SAVED_REGS): Handle %r3 as frame pointer.
(CALL_DUMMY): Likewise.
Sun Dec 26 16:59:39 1993 Jim Kingdon (kingdon@lioth.cygnus.com)
* exec.c (exec_file_command): If error occurs after we have opened

View File

@ -1545,7 +1545,8 @@ process_one_symbol (type, desc, valu, name, section_offsets, objfile)
since it would be silly to do things differently from Solaris), and
false for SunOS4 and other a.out file formats. */
block_address_function_relative =
0 == strncmp (bfd_get_target (objfile->obfd), "elf", 3);
(0 == strncmp (bfd_get_target (objfile->obfd), "elf", 3))
|| (0 == strncmp (bfd_get_target (objfile->obfd), "som", 3));
if (!block_address_function_relative)
/* N_LBRAC, N_RBRAC and N_SLINE entries are not relative to the
@ -1634,33 +1635,38 @@ process_one_symbol (type, desc, valu, name, section_offsets, objfile)
if (!VARIABLES_INSIDE_BLOCK(desc, processing_gcc_compilation))
local_symbols = new->locals;
/* If this is not the outermost LBRAC...RBRAC pair in the
function, its local symbols preceded it, and are the ones
just recovered from the context stack. Defined the block for them.
If this is the outermost LBRAC...RBRAC pair, there is no
need to do anything; leave the symbols that preceded it
to be attached to the function's own block. However, if
it is so, we need to indicate that we just moved outside
of the function. */
if (local_symbols
&& (context_stack_depth
> !VARIABLES_INSIDE_BLOCK(desc, processing_gcc_compilation)))
if (context_stack_depth
> !VARIABLES_INSIDE_BLOCK(desc, processing_gcc_compilation))
{
/* FIXME Muzzle a compiler bug that makes end < start. */
if (new->start_addr > valu)
/* This is not the outermost LBRAC...RBRAC pair in the function,
its local symbols preceded it, and are the ones just recovered
from the context stack. Define the block for them (but don't
bother if the block contains no symbols. Should we complain
on blocks without symbols? I can't think of any useful purpose
for them). */
if (local_symbols != NULL)
{
complain (&lbrac_rbrac_complaint);
new->start_addr = valu;
/* Muzzle a compiler bug that makes end < start. (which
compilers? Is this ever harmful?). */
if (new->start_addr > valu)
{
complain (&lbrac_rbrac_complaint);
new->start_addr = valu;
}
/* Make a block for the local symbols within. */
finish_block (0, &local_symbols, new->old_blocks,
new->start_addr, valu, objfile);
}
/* Make a block for the local symbols within. */
finish_block (0, &local_symbols, new->old_blocks,
new->start_addr, valu, objfile);
}
else
{
/* This is the outermost LBRAC...RBRAC pair. There is no
need to do anything; leave the symbols that preceded it
to be attached to the function's own block. We need to
indicate that we just moved outside of the function. */
within_function = 0;
}
if (VARIABLES_INSIDE_BLOCK(desc, processing_gcc_compilation))
/* Now pop locals of block just finished. */
local_symbols = new->locals;
@ -2157,6 +2163,9 @@ pastab_build_psymtabs (objfile, section_offsets, mainline)
free_header_files ();
init_header_files ();
/* This is needed to debug objects assembled with gas2. */
processing_acc_compilation = 1;
/* In a PA file, we've already installed the minimal symbols that came
from the PA (non-stab) symbol table, so always act like an
incremental load here. */

View File

@ -580,12 +580,12 @@ frame_chain (frame)
several areas on the stack.
Walk from the current frame to the innermost frame examining
unwind descriptors to determine if %r4 ever gets saved into the
unwind descriptors to determine if %r3 ever gets saved into the
stack. If so return whatever value got saved into the stack.
If it was never saved in the stack, then the value in %r4 is still
If it was never saved in the stack, then the value in %r3 is still
valid, so use it.
We use information from unwind descriptors to determine if %r4
We use information from unwind descriptors to determine if %r3
is saved into the stack (Entry_GR field has this information). */
while (frame)
@ -603,8 +603,8 @@ frame_chain (frame)
}
/* Entry_GR specifies the number of callee-saved general registers
saved in the stack. It starts at %r3, so %r4 would be 2. */
if (u->Entry_GR >= 2 || u->Save_SP)
saved in the stack. It starts at %r3, so %r3 would be 1. */
if (u->Entry_GR >= 1 || u->Save_SP)
break;
else
frame = frame->next;
@ -616,15 +616,15 @@ frame_chain (frame)
pointer. */
if (u->Save_SP)
return read_memory_integer (frame->frame, 4);
/* %r4 was saved somewhere in the stack. Dig it out. */
/* %r3 was saved somewhere in the stack. Dig it out. */
else
return dig_fp_from_stack (frame, u);
}
else
{
/* The value in %r4 was never saved into the stack (thus %r4 still
/* The value in %r3 was never saved into the stack (thus %r3 still
holds the value of the previous frame pointer). */
return read_register (4);
return read_register (FP_REGNUM);
}
}
@ -639,14 +639,14 @@ dig_fp_from_stack (frame, u)
{
CORE_ADDR pc = u->region_start;
/* Search the function for the save of %r4. */
/* Search the function for the save of %r3. */
while (pc != u->region_end)
{
char buf[4];
unsigned long inst;
int status;
/* We need only look for the standard stw %r4,X(%sp) instruction,
/* We need only look for the standard stw %r3,X(%sp) instruction,
the other variants (eg stwm) are only used on the first register
save (eg %r3). */
status = target_read_memory (pc, buf, 4);
@ -655,10 +655,10 @@ dig_fp_from_stack (frame, u)
if (status != 0)
memory_error (status, pc);
/* Check for stw %r4,X(%sp). */
if ((inst & 0xffffc000) == 0x6bc40000)
/* Check for stw %r3,X(%sp). */
if ((inst & 0xffffc000) == 0x6bc30000)
{
/* Found the instruction which saves %r4. The offset (relative
/* Found the instruction which saves %r3. The offset (relative
to this frame) is framesize + immed14 (derived from the
store instruction). */
int offset = (u->Total_frame_size << 3) + extract_14 (inst);
@ -670,7 +670,7 @@ dig_fp_from_stack (frame, u)
pc += 4;
}
warning ("Unable to find %%r4 in stack.\n");
warning ("Unable to find %%r3 in stack.\n");
return 0;
}
@ -1223,14 +1223,14 @@ skip_prologue(pc)
if (inst == 0x6BC23FD9) /* stw rp,-20(sp) */
{
if (read_memory_integer (pc + 4, 4) == 0x8040241) /* copy r4,r1 */
if (read_memory_integer (pc + 4, 4) == 0x8030241) /* copy r3,r1 */
pc += 16;
else if ((read_memory_integer (pc + 4, 4) & ~MASK_14) == 0x68810000) /* stw r1,(r4) */
else if ((read_memory_integer (pc + 4, 4) & ~MASK_14) == 0x68710000) /* stw r1,(r3) */
pc += 8;
}
else if (read_memory_integer (pc, 4) == 0x8040241) /* copy r4,r1 */
else if (read_memory_integer (pc, 4) == 0x8030241) /* copy r3,r1 */
pc += 12;
else if ((read_memory_integer (pc, 4) & ~MASK_14) == 0x68810000) /* stw r1,(r4) */
else if ((read_memory_integer (pc, 4) & ~MASK_14) == 0x68710000) /* stw r1,(r3) */
pc += 4;
return pc;