From 2f8c3639faaa9af96a31364ef2600c5027a35ed2 Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Mon, 27 Dec 1993 04:46:05 +0000 Subject: [PATCH] * 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. --- gdb/ChangeLog | 15 +++++++++++++++ gdb/dbxread.c | 49 +++++++++++++++++++++++++++++-------------------- gdb/hppa-tdep.c | 36 ++++++++++++++++++------------------ 3 files changed, 62 insertions(+), 38 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b28c0065483..a09d52454bb 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -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 diff --git a/gdb/dbxread.c b/gdb/dbxread.c index 073e993ee85..e6623b27c7e 100644 --- a/gdb/dbxread.c +++ b/gdb/dbxread.c @@ -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. */ diff --git a/gdb/hppa-tdep.c b/gdb/hppa-tdep.c index 93509b6323d..e8e01e1bd57 100644 --- a/gdb/hppa-tdep.c +++ b/gdb/hppa-tdep.c @@ -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; -- 2.30.2